@kedem/okdb 1.0.1 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/okdb.js +1 -1
- package/keys/public.pem +3 -0
- package/okdb.js +1 -1
- package/package.json +2 -2
- package/public/admin-app.js +1 -1
- package/public/components/admin-route-host.ok.js +1 -1
- package/public/components/env-picker.ok.js +1 -1
- package/public/components/field-path-input.ok.js +1 -1
- package/public/components/field.html +154 -2
- package/public/components/geo-map.ok.js +1 -1
- package/public/components/ok-cron-input.ok.js +1 -1
- package/public/components/ok-dropzone.ok.js +1 -1
- package/public/components/ok-js-input.ok.js +1 -1
- package/public/components/ok-json-input.ok.js +1 -1
- package/public/components/ok-text-monaco-input.ok.js +1 -1
- package/public/components/theme-toggle.ok.js +1 -1
- package/public/index.html +29 -2
- package/public/layouts/_default.ok.html +1 -1
- package/public/layouts/okdb-cube.ok.html +1 -1
- package/public/login-app.js +1 -1
- package/public/login.html +205 -1
- package/public/modules/ok.js +1 -1
- package/public/sections/api/index.ok.html +1 -1
- package/public/sections/api/parts/api-endpoint.ok.js +1 -1
- package/public/sections/auth/index.ok.html +1 -1
- package/public/sections/auth/modals/create-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/edit-token-modal.ok.js +1 -1
- package/public/sections/auth/modals/perm-info-popover.ok.js +1 -1
- package/public/sections/auth/parts/token-detail.ok.js +1 -1
- package/public/sections/auth/parts/token-list.ok.js +1 -1
- package/public/sections/db/index.ok.html +1 -1
- package/public/sections/db/modals/add-item-modal.ok.js +1 -1
- package/public/sections/db/modals/create-env-modal.ok.js +1 -1
- package/public/sections/db/modals/create-fts-modal.ok.js +1 -1
- package/public/sections/db/modals/create-index-modal.ok.js +1 -1
- package/public/sections/db/modals/create-pipeline-modal.ok.js +1 -1
- package/public/sections/db/modals/demo-env-modal.ok.js +1 -1
- package/public/sections/db/modals/remove-env-modal.ok.js +1 -1
- package/public/sections/db/modals/schema-edit-modal.ok.js +1 -1
- package/public/sections/db/parts/db-overview.ok.js +1 -1
- package/public/sections/db/parts/db-pipelines-panel.ok.js +1 -1
- package/public/sections/db/parts/edit-row.ok.js +1 -1
- package/public/sections/db/parts/tm-timeline.ok.js +1 -1
- package/public/sections/db/parts/type-changelog.ok.js +1 -1
- package/public/sections/db/parts/type-list.ok.js +1 -1
- package/public/sections/db/parts/type-pipelines-tab.ok.js +1 -1
- package/public/sections/db/parts/type-schema-tab.ok.js +1 -1
- package/public/sections/db/parts/type-viewer.ok.js +1 -1
- package/public/sections/db/parts/type-violations-tab.ok.js +1 -1
- package/public/sections/docs/index.ok.html +1 -1
- package/public/sections/embeddings/index.ok.html +1 -1
- package/public/sections/embeddings/modals/register-model-modal.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-create-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-embedder-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-declaration-editor.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-engine-list.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-indexer-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-lifecycle-bar.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-model-catalog.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-search-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embed-worker-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/embeddings-engine-panel.ok.js +1 -1
- package/public/sections/embeddings/parts/engines-overview.ok.js +1 -1
- package/public/sections/embeddings/parts/pipeline-create-panel.ok.js +1 -1
- package/public/sections/engines/engine-panel-shared-style.js +1 -1
- package/public/sections/engines/engine-ui-utils.js +1 -1
- package/public/sections/engines/index.ok.html +1 -1
- package/public/sections/engines/modals/engine-modal.ok.js +1 -1
- package/public/sections/engines/parts/engine-declaration-editor.ok.js +1 -1
- package/public/sections/engines/parts/engine-lifecycle-actions.ok.js +1 -1
- package/public/sections/engines/parts/engine-panel-shell.ok.js +1 -1
- package/public/sections/engines/parts/engine-resource-card.ok.js +1 -1
- package/public/sections/engines/parts/engine-row-item.ok.js +1 -1
- package/public/sections/engines/parts/generic-engine-panel.ok.js +1 -1
- package/public/sections/files/index.ok.html +1 -1
- package/public/sections/files/parts/files-blob-status.ok.js +1 -1
- package/public/sections/files/parts/files-collection-list.ok.js +1 -1
- package/public/sections/files/parts/files-collection-panel.ok.js +1 -1
- package/public/sections/files/parts/files-file-list.ok.js +1 -1
- package/public/sections/files/parts/files-overview.ok.js +1 -1
- package/public/sections/files/parts/files-path-browser.ok.js +1 -1
- package/public/sections/files/parts/files-upload-panel.ok.js +1 -1
- package/public/sections/functions/index.ok.html +1 -1
- package/public/sections/functions/modals/function-modal.ok.js +1 -1
- package/public/sections/functions/parts/function-detail.ok.js +1 -1
- package/public/sections/functions/parts/function-logs.ok.js +1 -1
- package/public/sections/functions/parts/function-runner.ok.js +1 -1
- package/public/sections/functions/parts/functions-list.ok.js +1 -1
- package/public/sections/license/index.ok.html +1 -1
- package/public/sections/license/parts/license-panel.ok.js +1 -1
- package/public/sections/processors/index.ok.html +1 -1
- package/public/sections/queue/index.ok.html +1 -1
- package/public/sections/queue/modals/create-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-bucket-modal.ok.js +1 -1
- package/public/sections/queue/modals/edit-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/enqueue-job-modal.ok.js +1 -1
- package/public/sections/queue/modals/job-type-modal.ok.js +1 -1
- package/public/sections/queue/parts/ok-job-form.ok.js +1 -1
- package/public/sections/queue/parts/queue-buckets.ok.js +1 -1
- package/public/sections/queue/parts/queue-job-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-jobs.ok.js +1 -1
- package/public/sections/queue/parts/queue-types.ok.js +1 -1
- package/public/sections/queue/parts/queue-workers.ok.js +1 -1
- package/public/sections/sync/index.ok.html +1 -1
- package/public/sections/sync/parts/sync-node-detail.ok.js +1 -1
- package/public/sections/sync/parts/sync-retention.ok.js +1 -1
- package/public/sections/sync/parts/sync-topology.ok.js +1 -1
- package/public/sections/system/index.ok.html +1 -1
- package/public/sections/system/modals/data-ops-modal.ok.js +1 -1
- package/public/sections/system/parts/system-api-panel.ok.js +1 -1
- package/public/sections/system/parts/system-auth-panel.ok.js +1 -1
- package/public/sections/system/parts/system-log-history.ok.js +1 -1
- package/public/sections/system/parts/system-log.ok.js +1 -1
- package/public/sections/system/parts/system-status.ok.js +1 -1
- package/public/sections/system/parts/system-sync-panel.ok.js +1 -1
- package/public/sections/views/index.ok.html +1 -1
- package/public/sections/views/modals/create-view-modal.ok.js +1 -1
- package/public/sections/views/parts/view-detail.ok.js +1 -1
- package/public/sections/views/parts/views-list.ok.js +1 -1
- package/public/sections/views/parts/views-overview.ok.js +1 -1
- package/public/setup-app.js +1 -1
- package/public/setup.html +189 -1
- package/public/stores/auth-store.js +1 -1
- package/public/stores/events-store.js +1 -1
- package/public/stores/functions-store.js +1 -1
- package/public/stores/okdb-store.js +1 -1
- package/public/stores/theme-store.js +1 -1
- package/public/test-cron-input.html +53 -3
- package/public/test-json-input.html +182 -3
- package/public/util/permissions.js +1 -1
- package/public/util/sift-schema.js +1 -1
- package/public/vendor/okjs/ok.esm.min.js +1 -2
- package/public/view-models/type-query-vm.js +1 -1
- package/okdb-data/default/data.mdb +0 -0
- package/okdb-data/default/lock.mdb +0 -0
- package/okdb-data/~log/data.mdb +0 -0
- package/okdb-data/~log/lock.mdb +0 -0
- package/okdb-data/~system/data.mdb +0 -0
- package/okdb-data/~system/lock.mdb +0 -0
- package/public/images/logo.png +0 -0
- package/public/images/logo.svg +0 -333
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x14a550=_0x4b93;function _0x4b93(_0x116a88,_0x3b1d03){_0x116a88=_0x116a88-0x91;const _0x7cc5fb=_0x7cc5();let _0x4b9352=_0x7cc5fb[_0x116a88];return _0x4b9352;}(function(_0x39ae24,_0x4749fa){const _0x2e1f10=_0x4b93,_0x59a9d2=_0x39ae24();while(!![]){try{const _0x2f8535=-parseInt(_0x2e1f10(0x1e5))/0x1+parseInt(_0x2e1f10(0x1c9))/0x2*(parseInt(_0x2e1f10(0x1eb))/0x3)+parseInt(_0x2e1f10(0x2d5))/0x4*(-parseInt(_0x2e1f10(0x11b))/0x5)+parseInt(_0x2e1f10(0x2a2))/0x6*(-parseInt(_0x2e1f10(0x1ac))/0x7)+parseInt(_0x2e1f10(0x29a))/0x8*(-parseInt(_0x2e1f10(0x95))/0x9)+parseInt(_0x2e1f10(0x2cb))/0xa+parseInt(_0x2e1f10(0x20d))/0xb;if(_0x2f8535===_0x4749fa)break;else _0x59a9d2['push'](_0x59a9d2['shift']());}catch(_0xb75786){_0x59a9d2['push'](_0x59a9d2['shift']());}}}(_0x7cc5,0x22a75));function makePRNG(_0x81508c){let _0x436c8c=(0x9e3779b9^_0x81508c)>>>0x0||0x1;return()=>(_0x436c8c^=_0x436c8c<<0xd,_0x436c8c^=_0x436c8c>>>0x11,_0x436c8c^=_0x436c8c<<0x5,(_0x436c8c>>>0x0)/0x100000000);}const pick=(_0x1bff52,_0x14a036)=>_0x1bff52[Math[_0x14a550(0xd4)](_0x14a036()*_0x1bff52['length'])],rng=(_0x393d6b,_0x19cfe5,_0x1c3f79)=>Math[_0x14a550(0xd4)](_0x1c3f79()*(_0x19cfe5-_0x393d6b+0x1))+_0x393d6b,uid=(_0x5281f0,_0x5e21bc)=>_0x5281f0+'-'+String(_0x5e21bc)[_0x14a550(0xca)](0x4,'0'),email=(_0x345cd5,_0x3063ea,_0x2874a9)=>_0x345cd5[_0x14a550(0x259)]()+'.'+_0x3063ea[_0x14a550(0x259)]()+rng(0x1,0x63,_0x2874a9)+'@'+pick(['gmail.com',_0x14a550(0x28d),_0x14a550(0x2e0),_0x14a550(0x138),_0x14a550(0x221)],_0x2874a9),dateAgo=(_0x537fb6,_0x219b1c)=>new Date(Date[_0x14a550(0x1d1)]()-0x5265c00*rng(0x0,_0x537fb6,_0x219b1c))[_0x14a550(0x208)]()[_0x14a550(0x1af)]('T')[0x0],dateFwd=(_0x13d672,_0x1538f8)=>new Date(Date['now']()+0x5265c00*rng(0x1,_0x13d672,_0x1538f8))[_0x14a550(0x208)]()[_0x14a550(0x1af)]('T')[0x0],FIRST=['Alice',_0x14a550(0x269),_0x14a550(0x237),_0x14a550(0x262),'Emma','Frank','Grace',_0x14a550(0x14d),_0x14a550(0x10d),_0x14a550(0x16d),_0x14a550(0xa8),_0x14a550(0x10c),_0x14a550(0x12a),'Noah',_0x14a550(0x229),_0x14a550(0x131),_0x14a550(0x1a9),'Rachel',_0x14a550(0xe9),_0x14a550(0x159),'Uma',_0x14a550(0x212),'Wendy',_0x14a550(0x16c),'Zoe'],LAST=['Anderson',_0x14a550(0x1a1),_0x14a550(0x1b5),_0x14a550(0x2e1),_0x14a550(0x189),_0x14a550(0x1cd),_0x14a550(0x28c),_0x14a550(0x96),_0x14a550(0x91),'Jones','King',_0x14a550(0x103),'Martinez',_0x14a550(0x2d6),_0x14a550(0x183),'Parker',_0x14a550(0x1a9),_0x14a550(0x2ac),_0x14a550(0xd0),_0x14a550(0x11d),_0x14a550(0x15c),_0x14a550(0xd8),_0x14a550(0xf7),_0x14a550(0x122)],CITIES=[_0x14a550(0x144),_0x14a550(0xd1),'Berlin',_0x14a550(0x1aa),_0x14a550(0x27a),_0x14a550(0x167),_0x14a550(0xee),_0x14a550(0x140),_0x14a550(0x9c),_0x14a550(0x200),_0x14a550(0x2cf),'São\x20Paulo',_0x14a550(0x21e),_0x14a550(0x197),_0x14a550(0x1a4)],COUNTRIES=['US','GB','DE','FR','JP','AU','CA','BR','IN','SG','NL','SE','ES','IT','MX'],DEVICES=[_0x14a550(0xb3),_0x14a550(0x22d),'tablet'],PAGES=['/','/products',_0x14a550(0x25e),_0x14a550(0x191),_0x14a550(0xc2),_0x14a550(0x1f4),_0x14a550(0x2c2),_0x14a550(0x19d),_0x14a550(0x12c),_0x14a550(0x1f5),_0x14a550(0x292)],PROD_ADJ=[_0x14a550(0x22e),_0x14a550(0x17e),_0x14a550(0x296),_0x14a550(0x253),_0x14a550(0x2c6),_0x14a550(0x1c6),_0x14a550(0x2da),'Premium',_0x14a550(0x1e2),_0x14a550(0x1b0),'Swift',_0x14a550(0x27f)],PROD_NOUN=[_0x14a550(0x1ff),'Keyboard',_0x14a550(0x23a),'Backpack','Chair',_0x14a550(0xf4),_0x14a550(0x236),_0x14a550(0x160),_0x14a550(0x2db),'Tablet','Watch',_0x14a550(0x234),_0x14a550(0x284),_0x14a550(0x102),_0x14a550(0xfe),'Pod',_0x14a550(0x1d3),_0x14a550(0x1fb)],PROD_CAT=[_0x14a550(0x21b),_0x14a550(0xff),'Clothing',_0x14a550(0x11a),_0x14a550(0x188),_0x14a550(0x13a),_0x14a550(0x99),_0x14a550(0x11f),_0x14a550(0x1bf),_0x14a550(0xb0)],ORDER_STATUS=['pending',_0x14a550(0x256),_0x14a550(0x14a),_0x14a550(0xe6),_0x14a550(0x299)],DOMAINS=['gmail.com','yahoo.com',_0x14a550(0x2e0)],CITY_CENTERS=[{'name':_0x14a550(0xd1),'country':'GB','lat':51.5074,'lon':-0.1278},{'name':_0x14a550(0xee),'country':'FR','lat':48.8566,'lon':2.3522},{'name':_0x14a550(0x144),'country':'US','lat':40.7128,'lon':-74.006},{'name':_0x14a550(0x1aa),'country':'JP','lat':35.6762,'lon':139.6503},{'name':_0x14a550(0x27a),'country':'AU','lat':-33.8688,'lon':151.2093},{'name':_0x14a550(0x22f),'country':'DE','lat':52.52,'lon':13.405},{'name':_0x14a550(0x2bb),'country':'US','lat':37.7749,'lon':-122.4194},{'name':_0x14a550(0x140),'country':'NL','lat':52.3676,'lon':4.9041},{'name':_0x14a550(0x9c),'country':'SG','lat':1.3521,'lon':103.8198},{'name':_0x14a550(0x257),'country':'ES','lat':41.3851,'lon':2.1734},{'name':_0x14a550(0x200),'country':'AE','lat':25.2048,'lon':55.2708},{'name':_0x14a550(0x167),'country':'CA','lat':43.6532,'lon':-79.3832},{'name':_0x14a550(0x132),'country':'IT','lat':41.9028,'lon':12.4964},{'name':_0x14a550(0x154),'country':'AU','lat':-37.8136,'lon':144.9631},{'name':_0x14a550(0x2cf),'country':'KR','lat':37.5665,'lon':126.978}],PLACE_CATS=[_0x14a550(0xc9),_0x14a550(0x1e9),_0x14a550(0x13d),_0x14a550(0x2ad),_0x14a550(0x278),_0x14a550(0x171),_0x14a550(0x268),_0x14a550(0x238)],PLACE_ADJ=[_0x14a550(0x137),_0x14a550(0x198),_0x14a550(0x241),_0x14a550(0x2a9),_0x14a550(0x1cb),'Garden','Harbor','Urban',_0x14a550(0x1d9),'Wild',_0x14a550(0x1e7),'Velvet','Cozy',_0x14a550(0x17c),_0x14a550(0x267),_0x14a550(0x134),_0x14a550(0x93),_0x14a550(0x25f),'Green',_0x14a550(0x223)],PLACE_NOUN=['Kitchen','Bistro',_0x14a550(0x148),'Grove','Terrace',_0x14a550(0x280),'Nook',_0x14a550(0xae),_0x14a550(0x119),_0x14a550(0xd9),'Quarter',_0x14a550(0x1a5),_0x14a550(0x1bc),'Square',_0x14a550(0x114),_0x14a550(0xd9)],BAR_ADJ=[_0x14a550(0x1b3),_0x14a550(0x213),_0x14a550(0x1ba),_0x14a550(0x27e),_0x14a550(0x248),_0x14a550(0x261),'Old','Rusty',_0x14a550(0x105),_0x14a550(0x241),_0x14a550(0x16f),_0x14a550(0x255)],BAR_ANIMAL=['Fox',_0x14a550(0x145),_0x14a550(0x297),_0x14a550(0x19c),_0x14a550(0x216),'Wolf',_0x14a550(0x282),_0x14a550(0x173),_0x14a550(0x1f8),'Crow',_0x14a550(0xef),'Stag'],CAFE_PRE=[_0x14a550(0x1c3),'Daily',_0x14a550(0xa7),_0x14a550(0x1d9),_0x14a550(0x1dd),_0x14a550(0x1e7),_0x14a550(0xc6),'Ground',_0x14a550(0x263),_0x14a550(0x20e),_0x14a550(0x25f),'Slow'],CAFE_SFX=[_0x14a550(0x1c2),_0x14a550(0x2a8),_0x14a550(0x1da),_0x14a550(0xcf),_0x14a550(0x195),'Grind',_0x14a550(0x1d5),_0x14a550(0x162),_0x14a550(0xea),_0x14a550(0x2c1)],MUSEUM_SUB=[_0x14a550(0xf9),_0x14a550(0x130),_0x14a550(0x231),'Science\x20&\x20Technology',_0x14a550(0xc5),_0x14a550(0x156),'Architecture\x20&\x20Design',_0x14a550(0x272),'Living\x20Culture'],PARK_ADJ_P=['Central',_0x14a550(0xdf),'Riverside',_0x14a550(0x1d2),_0x14a550(0x134),'Memorial',_0x14a550(0x2d0),'Green',_0x14a550(0x146),_0x14a550(0x23e),_0x14a550(0x286),_0x14a550(0x252)],HOTEL_ADJ_H=[_0x14a550(0x93),'Royal',_0x14a550(0x141),_0x14a550(0x99),_0x14a550(0x1bd),_0x14a550(0x146),'Skyline',_0x14a550(0xda),_0x14a550(0xe3),'Maison',_0x14a550(0x23c)],HOTEL_NOUN_H=[_0x14a550(0x18a),_0x14a550(0x193),_0x14a550(0xb4),'Residence',_0x14a550(0x127),'Place',_0x14a550(0x119),'Retreat',_0x14a550(0x2c0)],GYM_PRE=[_0x14a550(0xeb),_0x14a550(0x1ec),_0x14a550(0x24d),_0x14a550(0x24c),_0x14a550(0x277),_0x14a550(0x226),_0x14a550(0xb7),'Pulse',_0x14a550(0x23d),'Prime'],GYM_SFX=[_0x14a550(0x92),_0x14a550(0x290),_0x14a550(0xbe),_0x14a550(0x1d3),_0x14a550(0x158),_0x14a550(0x112),_0x14a550(0x14e),_0x14a550(0x1db),'Performance'],SHOP_ADJ=[_0x14a550(0x1b1),_0x14a550(0x1e7),_0x14a550(0x280),_0x14a550(0x149),_0x14a550(0xa7),'Artisan',_0x14a550(0x18e),_0x14a550(0x1b9),_0x14a550(0x117)],SHOP_NOUN=[_0x14a550(0x172),_0x14a550(0x1d0),_0x14a550(0x1bc),_0x14a550(0x22b),_0x14a550(0xce),_0x14a550(0xc1),_0x14a550(0xa6),'Emporium',_0x14a550(0x1a8)],PLACE_DESCS=[_0x14a550(0x240),_0x14a550(0x135),_0x14a550(0x1f0),_0x14a550(0x28a),_0x14a550(0x10b),_0x14a550(0x24e),_0x14a550(0x28b),_0x14a550(0xe8),_0x14a550(0xe2),'Intimate\x20and\x20unpretentious\x20—\x20the\x20kind\x20of\x20place\x20that\x20instantly\x20feels\x20like\x20home.',_0x14a550(0xfb),_0x14a550(0x2b9)],PERSON_BIOS=['Passionate\x20foodie\x20and\x20amateur\x20photographer\x20exploring\x20the\x20city\x20one\x20café\x20at\x20a\x20time.',_0x14a550(0x1e8),'Architecture\x20enthusiast\x20and\x20frequent\x20museum-goer\x20with\x20a\x20love\x20for\x20strong\x20espresso.',_0x14a550(0x21f),'Fitness\x20fanatic,\x20craft\x20beer\x20lover\x20and\x20weekend\x20market\x20explorer.',_0x14a550(0x1f3),_0x14a550(0x25d),'Museum\x20member,\x20park\x20runner\x20and\x20enthusiastic\x20brunch-seeker\x20on\x20weekends.','Lifelong\x20traveller\x20collecting\x20experiences,\x20flavours\x20and\x20stories\x20from\x20around\x20the\x20globe.',_0x14a550(0x136)],CHECKIN_NOTES=['Amazing\x20experience,\x20will\x20definitely\x20be\x20back!',_0x14a550(0x250),_0x14a550(0x9f),_0x14a550(0x1e1),_0x14a550(0x2e2),_0x14a550(0x224),'Exactly\x20what\x20I\x20needed\x20today\x20—\x20no\x20complaints.',_0x14a550(0x251),_0x14a550(0x1ef),'Exceptional\x20quality\x20—\x20genuinely\x20exceeded\x20expectations.',_0x14a550(0x266),_0x14a550(0xc3),null,null,null];function _scatter(_0x1cb95b,_0x589161,_0x37e5ea){const _0x50ee35=_0x14a550;return{'lat':Math[_0x50ee35(0x2c9)](0xf4240*(_0x1cb95b[_0x50ee35(0x260)]+0x2*(_0x37e5ea()-0.5)*_0x589161))/0xf4240,'lon':Math['round'](0xf4240*(_0x1cb95b[_0x50ee35(0x1a7)]+0x2*(_0x37e5ea()-0.5)*_0x589161))/0xf4240};}function _placeName(_0x3aa391,_0x16b24b){const _0x343e85=_0x14a550;switch(_0x3aa391){case'restaurant':return _0x343e85(0xa4)+pick(PLACE_ADJ,_0x16b24b)+'\x20'+pick(PLACE_NOUN,_0x16b24b);case _0x343e85(0x1e9):return _0x343e85(0xa4)+pick(BAR_ADJ,_0x16b24b)+'\x20'+pick(BAR_ANIMAL,_0x16b24b);case'cafe':return pick(CAFE_PRE,_0x16b24b)+'\x20'+pick(CAFE_SFX,_0x16b24b);case'museum':return _0x343e85(0x2c8)+pick(MUSEUM_SUB,_0x16b24b);case _0x343e85(0x278):return pick(PARK_ADJ_P,_0x16b24b)+_0x343e85(0x265);case'hotel':return _0x343e85(0xa4)+pick(HOTEL_ADJ_H,_0x16b24b)+'\x20'+pick(HOTEL_NOUN_H,_0x16b24b);case _0x343e85(0x268):return pick(GYM_PRE,_0x16b24b)+'\x20'+pick(GYM_SFX,_0x16b24b);case'shop':return _0x343e85(0xa4)+pick(SHOP_ADJ,_0x16b24b)+'\x20'+pick(SHOP_NOUN,_0x16b24b);default:return pick(PLACE_ADJ,_0x16b24b)+_0x343e85(0x1e0);}}function generateCityExplorer(_0x1a0c44,_0x43b15c){const _0x274cbe=_0x14a550,_0x5ea8a8={};return _0x5ea8a8[_0x274cbe(0x1fa)]=Array['from']({'length':_0x1a0c44['places']},(_0xa44a62,_0x1d7577)=>{const _0x3d6d5e=_0x274cbe,_0x55a824=pick(CITY_CENTERS,_0x43b15c),_0x309dcd=pick(PLACE_CATS,_0x43b15c);return{'key':uid(_0x3d6d5e(0x1ee),_0x1d7577+0x1),'value':{'name':_placeName(_0x309dcd,_0x43b15c),'category':_0x309dcd,'city':_0x55a824['name'],'country':_0x55a824[_0x3d6d5e(0x18d)],'location':_scatter(_0x55a824,0.035,_0x43b15c),'rating':Math[_0x3d6d5e(0x2c9)](rng(0x1c,0x32,_0x43b15c))/0xa,'reviewCount':rng(0x5,0xbb8,_0x43b15c),'priceLevel':rng(0x1,0x4,_0x43b15c),'description':pick(PLACE_DESCS,_0x43b15c),'phone':'+'+rng(0x1,0x63,_0x43b15c)+'\x20'+rng(0x64,0x3e7,_0x43b15c)+'-'+rng(0x3e8,0x270f,_0x43b15c),'openNow':_0x43b15c()>0.3,'verified':_0x43b15c()>0.25,'createdAt':dateAgo(0x2da,_0x43b15c)}};}),_0x5ea8a8['people']=Array[_0x274cbe(0x133)]({'length':_0x1a0c44['people']},(_0x2f145c,_0x5eedcc)=>{const _0xb294f3=_0x274cbe,_0xf8e204=pick(CITY_CENTERS,_0x43b15c),_0x2e4362=pick(FIRST,_0x43b15c),_0x27a7e7=pick(LAST,_0x43b15c);return{'key':uid(_0xb294f3(0x2d1),_0x5eedcc+0x1),'value':{'name':_0x2e4362+'\x20'+_0x27a7e7,'email':email(_0x2e4362,_0x27a7e7,_0x43b15c),'city':_0xf8e204[_0xb294f3(0x121)],'country':_0xf8e204[_0xb294f3(0x18d)],'home':_scatter(_0xf8e204,0.055,_0x43b15c),'bio':pick(PERSON_BIOS,_0x43b15c),'interests':[...new Set([pick(PLACE_CATS,_0x43b15c),pick(PLACE_CATS,_0x43b15c),pick(PLACE_CATS,_0x43b15c)])],'memberSince':dateAgo(0x447,_0x43b15c),'checkinsCount':rng(0x0,0x5a,_0x43b15c)}};}),_0x5ea8a8['checkins']=Array['from']({'length':_0x1a0c44[_0x274cbe(0x1e6)]},(_0x2ef4bb,_0x4f40ee)=>({'key':uid('ci',_0x4f40ee+0x1),'value':{'personId':uid('person',rng(0x1,_0x1a0c44[_0x274cbe(0x220)],_0x43b15c)),'placeId':uid(_0x274cbe(0x1ee),rng(0x1,_0x1a0c44['places'],_0x43b15c)),'rating':rng(0x1,0x5,_0x43b15c),'note':pick(CHECKIN_NOTES,_0x43b15c),'hasPhoto':_0x43b15c()>0.58,'timestamp':new Date(Date[_0x274cbe(0x1d1)]()-rng(0x0,0x757b12c00,_0x43b15c))['toISOString']()}})),_0x5ea8a8;}const POST_TITLES=[_0x14a550(0x196),_0x14a550(0x126),_0x14a550(0x13e),_0x14a550(0x2de),_0x14a550(0x20b),_0x14a550(0x222),_0x14a550(0x129),_0x14a550(0x101),_0x14a550(0xf3),_0x14a550(0x26d),_0x14a550(0x2b3),_0x14a550(0x281),'GraphQL\x20Best\x20Practices\x20for\x20Production',_0x14a550(0x139),'Observability\x20and\x20Monitoring\x20at\x20Scale',_0x14a550(0x2ce),_0x14a550(0x98),_0x14a550(0x174),'AI-Assisted\x20Development\x20Workflows',_0x14a550(0x16b)],TAG_NAMES=['javascript',_0x14a550(0x1f9),_0x14a550(0x1b6),_0x14a550(0x2cd),_0x14a550(0x192),_0x14a550(0x107),_0x14a550(0x1c0),_0x14a550(0x25a),_0x14a550(0xe4),'ux','design',_0x14a550(0x204),_0x14a550(0x225),'mobile',_0x14a550(0x2b1),_0x14a550(0xbc),_0x14a550(0x2d4),_0x14a550(0x2b8),'accessibility',_0x14a550(0x2d3),_0x14a550(0x2ba),_0x14a550(0xfd),_0x14a550(0x273),_0x14a550(0x25c),_0x14a550(0x27c),_0x14a550(0x19e),'beginner','advanced'],POST_CATS=[_0x14a550(0xa2),_0x14a550(0x157),_0x14a550(0x210),_0x14a550(0x1f7),_0x14a550(0x245),_0x14a550(0x15e),_0x14a550(0x15d)],COMMENT_BODIES=[_0x14a550(0x14c),_0x14a550(0x185),_0x14a550(0x246),_0x14a550(0x283),_0x14a550(0x100),_0x14a550(0x287),'I\x20disagree\x20with\x20some\x20points\x20but\x20overall\x20great\x20read.',_0x14a550(0x17f),_0x14a550(0x217),'Saved\x20me\x20hours\x20of\x20debugging.\x20Thank\x20you!'],EVT_TYPES=[_0x14a550(0xfa),'click',_0x14a550(0x294),_0x14a550(0x9a),'purchase',_0x14a550(0x11e),_0x14a550(0x190),_0x14a550(0x2d7),_0x14a550(0xac),_0x14a550(0x11c),'video_play',_0x14a550(0x163)],REFERRERS=[_0x14a550(0x1d4),_0x14a550(0x274),'github.com',_0x14a550(0x243),_0x14a550(0x18f),_0x14a550(0xab),'linkedin.com'],ROLES=[_0x14a550(0x2c4),_0x14a550(0x19f),_0x14a550(0x2df),_0x14a550(0x165),_0x14a550(0x169),_0x14a550(0x22a),_0x14a550(0x143),_0x14a550(0x2b2),_0x14a550(0x184),_0x14a550(0x1df)],DEPTS=['Engineering',_0x14a550(0x157),_0x14a550(0x104),'Marketing',_0x14a550(0x2a0),'Operations','HR','Finance'],LEVELS=[_0x14a550(0x279),_0x14a550(0x116),_0x14a550(0x178),_0x14a550(0x24b),_0x14a550(0x26e),_0x14a550(0x206)],SKILLS=[_0x14a550(0x2c5),_0x14a550(0x244),'React',_0x14a550(0x211),_0x14a550(0x28e),'Docker','AWS',_0x14a550(0x298),'GraphQL',_0x14a550(0x152),_0x14a550(0x106),_0x14a550(0xe5),_0x14a550(0x1ca),_0x14a550(0xd7),_0x14a550(0x29c),'Go',_0x14a550(0xde),'Kotlin'],PROJ_NAMES=[_0x14a550(0xad),'Mobile\x20App\x20v2',_0x14a550(0x9b),_0x14a550(0x20f),_0x14a550(0x207),'Analytics\x20Dashboard',_0x14a550(0x12f),_0x14a550(0x23b),'Search\x20Engine',_0x14a550(0x209),_0x14a550(0x120),_0x14a550(0x1d8),_0x14a550(0x164),_0x14a550(0x125),_0x14a550(0xb9),_0x14a550(0xcc),_0x14a550(0x2ca),_0x14a550(0x9e),_0x14a550(0x12b),'Onboarding\x20Flow','A/B\x20Testing\x20Framework',_0x14a550(0x1be),_0x14a550(0x110),_0x14a550(0x1f2),'Data\x20Warehouse'],PROJ_STATUS=['planning','in-progress','review',_0x14a550(0x182),_0x14a550(0x179)];function generateEcommerce(_0x19b66a,_0x151947){const _0x2ca4e7=_0x14a550,_0x1146c7={};return _0x1146c7['products']=Array[_0x2ca4e7(0x133)]({'length':_0x19b66a['products']},(_0x380709,_0x2c6765)=>{const _0x5b02ce=_0x2ca4e7,_0x1991e6=pick(PROD_ADJ,_0x151947),_0x283f3b=pick(PROD_NOUN,_0x151947);return{'key':uid(_0x5b02ce(0x1b7),_0x2c6765+0x1),'value':{'name':_0x1991e6+'\x20'+_0x283f3b,'category':pick(PROD_CAT,_0x151947),'price':Math[_0x5b02ce(0x2c9)](0x64*(rng(0x5,0x3e7,_0x151947)+0.99*_0x151947()))/0x64,'stock':rng(0x0,0x1f4,_0x151947),'rating':Math[_0x5b02ce(0x2c9)](rng(0x19,0x32,_0x151947))/0xa,'reviewCount':rng(0x0,0x4b0,_0x151947),'description':_0x5b02ce(0xa4)+_0x1991e6+'\x20'+_0x283f3b+_0x5b02ce(0x16e),'sku':_0x5b02ce(0x18b)+rng(0x2710,0x1869f,_0x151947),'brand':pick(['TechCore',_0x5b02ce(0x22c),'Nomad',_0x5b02ce(0x1c7),_0x5b02ce(0x199)],_0x151947),'createdAt':dateAgo(0x16d,_0x151947)}};}),_0x1146c7[_0x2ca4e7(0x1e4)]=Array[_0x2ca4e7(0x133)]({'length':_0x19b66a[_0x2ca4e7(0x1e4)]},(_0x1e0460,_0x3c6f95)=>{const _0x3918f5=_0x2ca4e7,_0xc963c3=pick(FIRST,_0x151947),_0x403cbf=pick(LAST,_0x151947);return{'key':uid('cust',_0x3c6f95+0x1),'value':{'name':_0xc963c3+'\x20'+_0x403cbf,'email':email(_0xc963c3,_0x403cbf,_0x151947),'city':pick(CITIES,_0x151947),'country':pick(COUNTRIES,_0x151947),'tier':pick(['bronze','silver',_0x3918f5(0x21d),_0x3918f5(0x271)],_0x151947),'totalOrders':rng(0x0,0x32,_0x151947),'totalSpent':Math[_0x3918f5(0x2c9)](0x64*rng(0x0,0x3a98,_0x151947))/0x64,'joinDate':dateAgo(0x2da,_0x151947),'newsletter':_0x151947()>0.4}};}),_0x1146c7[_0x2ca4e7(0x205)]=Array[_0x2ca4e7(0x133)]({'length':_0x19b66a['orders']},(_0x1f6c4b,_0x24b509)=>{const _0x405d33=_0x2ca4e7,_0x2cfa77=rng(0x1,0x5,_0x151947),_0x1f69da=Array['from']({'length':_0x2cfa77},()=>{const _0x3a9188=_0x4b93,_0x3baba6=Math[_0x3a9188(0x2c9)](0x64*rng(0x5,0x1f3,_0x151947))/0x64,_0x4d3ba4=rng(0x1,0x4,_0x151947);return{'productId':uid(_0x3a9188(0x1b7),rng(0x1,_0x19b66a[_0x3a9188(0x215)],_0x151947)),'qty':_0x4d3ba4,'price':_0x3baba6,'total':Math[_0x3a9188(0x2c9)](_0x3baba6*_0x4d3ba4*0x64)/0x64};});return{'key':uid(_0x405d33(0x27d),_0x24b509+0x1),'value':{'customerId':uid(_0x405d33(0x2be),rng(0x1,_0x19b66a['customers'],_0x151947)),'status':pick(ORDER_STATUS,_0x151947),'items':_0x1f69da,'subtotal':_0x1f69da[_0x405d33(0xbd)]((_0x28de3d,_0x301640)=>_0x28de3d+_0x301640[_0x405d33(0xf0)],0x0),'shipping':Math[_0x405d33(0x2c9)](0x64*rng(0x0,0x14,_0x151947))/0x64,'total':_0x1f69da[_0x405d33(0xbd)]((_0x2dc07a,_0x44e004)=>_0x2dc07a+_0x44e004[_0x405d33(0xf0)],0x0)+Math[_0x405d33(0x2c9)](0x64*rng(0x0,0x14,_0x151947))/0x64,'createdAt':dateAgo(0xb4,_0x151947),'shippedAt':_0x151947()>0.3?dateAgo(0x3c,_0x151947):null,'address':{'city':pick(CITIES,_0x151947),'country':pick(COUNTRIES,_0x151947)}}};}),_0x1146c7[_0x2ca4e7(0x1f6)]=Array[_0x2ca4e7(0x133)]({'length':_0x19b66a['reviews']},(_0x559edd,_0x39b734)=>{const _0x277911=_0x2ca4e7,_0x45e708=rng(0x1,0x5,_0x151947);return{'key':uid(_0x277911(0x295),_0x39b734+0x1),'value':{'productId':uid(_0x277911(0x1b7),rng(0x1,_0x19b66a[_0x277911(0x215)],_0x151947)),'customerId':uid(_0x277911(0x2be),rng(0x1,_0x19b66a[_0x277911(0x1e4)],_0x151947)),'stars':_0x45e708,'title':pick(_0x45e708>=0x4?['Love\x20it!',_0x277911(0x1d7),'Exactly\x20as\x20described','Highly\x20recommend',_0x277911(0x1f1)]:[_0x277911(0x275),_0x277911(0xbb),'Expected\x20more',_0x277911(0xba)],_0x151947),'body':(_0x45e708>=0x4?'Really\x20happy\x20with\x20this\x20purchase.':_0x277911(0xf8))+'\x20'+pick([_0x277911(0x1b2),_0x277911(0xa5),'Still\x20testing\x20it\x20out.',_0x277911(0x1fc),_0x277911(0x1b8)],_0x151947),'verified':_0x151947()>0.2,'helpful':rng(0x0,0xc8,_0x151947),'createdAt':dateAgo(0x16d,_0x151947)}};}),_0x1146c7;}function generateAnalytics(_0xd26d4d,_0x3f933e){const _0x57c166=_0x14a550,_0x2ac997={};return _0x2ac997[_0x57c166(0x10e)]=Array[_0x57c166(0x133)]({'length':_0xd26d4d['sessions']},(_0x300a9c,_0x2c973e)=>({'key':uid(_0x57c166(0x24f),_0x2c973e+0x1),'value':{'userId':_0x3f933e()>0.35?uid(_0x57c166(0x1dc),rng(0x1,0x1f4,_0x3f933e)):null,'device':pick(DEVICES,_0x3f933e),'country':pick(COUNTRIES,_0x3f933e),'city':pick(CITIES,_0x3f933e),'duration':rng(0x5,0xe10,_0x3f933e),'pageCount':rng(0x1,0x1e,_0x3f933e),'bounced':_0x3f933e()<0.38,'browser':pick(['Chrome','Firefox',_0x57c166(0x18c),_0x57c166(0x161),'Arc'],_0x3f933e),'startedAt':new Date(Date['now']()-rng(0x0,0x9a7ec800,_0x3f933e))[_0x57c166(0x208)]()}})),_0x2ac997['events']=Array[_0x57c166(0x133)]({'length':_0xd26d4d['events']},(_0x396afc,_0x244c1a)=>({'key':uid(_0x57c166(0x2c7),_0x244c1a+0x1),'value':{'type':pick(EVT_TYPES,_0x3f933e),'sessionId':uid('sess',rng(0x1,_0xd26d4d[_0x57c166(0x10e)],_0x3f933e)),'userId':_0x3f933e()>0.35?uid('user',rng(0x1,0x1f4,_0x3f933e)):null,'page':pick(PAGES,_0x3f933e),'device':pick(DEVICES,_0x3f933e),'country':pick(COUNTRIES,_0x3f933e),'timestamp':new Date(Date['now']()-rng(0x0,0x9a7ec800,_0x3f933e))[_0x57c166(0x208)](),'value':_0x3f933e()>0.7?Math[_0x57c166(0x2c9)](0x64*rng(0x1,0x2710,_0x3f933e))/0x64:null}})),_0x2ac997[_0x57c166(0x115)]=Array[_0x57c166(0x133)]({'length':_0xd26d4d[_0x57c166(0x115)]},(_0x32fcdb,_0x568e41)=>({'key':uid('pv',_0x568e41+0x1),'value':{'page':pick(PAGES,_0x3f933e),'sessionId':uid(_0x57c166(0x24f),rng(0x1,_0xd26d4d['sessions'],_0x3f933e)),'referrer':pick(REFERRERS,_0x3f933e),'timeOnPage':rng(0x0,0x258,_0x3f933e),'exitPage':_0x3f933e()>0.7,'timestamp':new Date(Date['now']()-rng(0x0,0x9a7ec800,_0x3f933e))['toISOString']()}})),_0x2ac997;}function generateBlog(_0x1dc4aa,_0x5d2bc9){const _0x1cbc32=_0x14a550,_0x139349={};_0x139349[_0x1cbc32(0xa1)]=Array[_0x1cbc32(0x133)]({'length':_0x1dc4aa[_0x1cbc32(0xa1)]},(_0x3aa5b7,_0x27262e)=>{const _0x3f0c34=_0x1cbc32,_0x3445de=pick(FIRST,_0x5d2bc9),_0x27051f=pick(LAST,_0x5d2bc9),_0xf9ed48=pick([_0x3f0c34(0x2ae),_0x3f0c34(0x1c8),_0x3f0c34(0x2b6),_0x3f0c34(0x157),_0x3f0c34(0x1cc),_0x3f0c34(0x214),_0x3f0c34(0x230),_0x3f0c34(0x258)],_0x5d2bc9);return{'key':uid('auth',_0x27262e+0x1),'value':{'name':_0x3445de+'\x20'+_0x27051f,'email':email(_0x3445de,_0x27051f,_0x5d2bc9),'bio':_0x3445de+'\x20is\x20a\x20'+_0xf9ed48+_0x3f0c34(0x17b)+rng(0x2,0x12,_0x5d2bc9)+'\x20years\x20of\x20experience\x20building\x20production\x20systems.','specialty':_0xf9ed48,'location':pick(CITIES,_0x5d2bc9),'twitter':'@'+_0x3445de['toLowerCase']()+_0x27051f['toLowerCase'](),'postCount':0x0}};});const _0xa06a02=Math[_0x1cbc32(0x2b7)](_0x1dc4aa[_0x1cbc32(0xaf)],TAG_NAMES[_0x1cbc32(0x29d)]);return _0x139349['tags']=Array[_0x1cbc32(0x133)]({'length':_0xa06a02},(_0x3cd7fb,_0x34ad04)=>({'key':uid(_0x1cbc32(0x2a1),_0x34ad04+0x1),'value':{'name':TAG_NAMES[_0x34ad04],'count':rng(0x5,0x78,_0x5d2bc9),'color':pick([_0x1cbc32(0x19b),_0x1cbc32(0xf1),_0x1cbc32(0x15f),_0x1cbc32(0x109),'var(--okdb-danger)'],_0x5d2bc9)}})),_0x139349[_0x1cbc32(0x2bd)]=Array['from']({'length':_0x1dc4aa[_0x1cbc32(0x2bd)]},(_0x1617ab,_0xa07d9)=>{const _0x1350ef=_0x1cbc32,_0x10f1dc=POST_TITLES[_0xa07d9%POST_TITLES[_0x1350ef(0x29d)]],_0x2557b9=pick(['','','',_0x1350ef(0xec),_0x1350ef(0x2a7),_0x1350ef(0x1a2),_0x1350ef(0xfc)],_0x5d2bc9),_0x594e23=_0x2557b9?''+_0x2557b9+_0x10f1dc:_0x10f1dc,_0x3a8ea7=_0x5d2bc9()>0.25?_0x1350ef(0xdb):pick(['draft','archived'],_0x5d2bc9);return{'key':uid('post',_0xa07d9+0x1),'value':{'title':_0x594e23,'slug':_0x594e23[_0x1350ef(0x259)]()['replace'](/[^a-z0-9]+/g,'-')['replace'](/^-|-$/g,''),'authorId':uid(_0x1350ef(0x14f),rng(0x1,_0x1dc4aa[_0x1350ef(0xa1)],_0x5d2bc9)),'category':pick(POST_CATS,_0x5d2bc9),'status':_0x3a8ea7,'tags':[...new Set([uid(_0x1350ef(0x2a1),rng(0x1,_0xa06a02,_0x5d2bc9)),uid(_0x1350ef(0x2a1),rng(0x1,_0xa06a02,_0x5d2bc9))])],'content':'This\x20article\x20covers\x20the\x20essentials\x20you\x20need\x20to\x20know.\x20We\x20explore\x20key\x20concepts,\x20practical\x20examples,\x20and\x20real-world\x20applications\x20that\x20you\x20can\x20apply\x20immediately.\x20Whether\x20you\x27re\x20a\x20beginner\x20or\x20an\x20experienced\x20professional,\x20you\x27ll\x20find\x20actionable\x20insights\x20here.','excerpt':'A\x20comprehensive\x20guide\x20to\x20understanding\x20'+_0x10f1dc[_0x1350ef(0x259)]()+_0x1350ef(0x285),'readTime':rng(0x2,0x16,_0x5d2bc9),'views':rng(0x32,0x13880,_0x5d2bc9),'likes':rng(0x5,0xbb8,_0x5d2bc9),'featured':_0x5d2bc9()>0.85,'publishedAt':_0x1350ef(0xdb)===_0x3a8ea7?dateAgo(0x190,_0x5d2bc9):null,'createdAt':dateAgo(0x1c2,_0x5d2bc9)}};}),_0x139349[_0x1cbc32(0xaa)]=Array[_0x1cbc32(0x133)]({'length':_0x1dc4aa[_0x1cbc32(0xaa)]},(_0x5871b6,_0x4fdca8)=>({'key':uid('cmt',_0x4fdca8+0x1),'value':{'postId':uid('post',rng(0x1,_0x1dc4aa['posts'],_0x5d2bc9)),'authorName':pick(FIRST,_0x5d2bc9)+'\x20'+pick(LAST,_0x5d2bc9),'email':_0x1cbc32(0x1dc)+rng(0x1,0x270f,_0x5d2bc9)+'@'+pick(DOMAINS,_0x5d2bc9),'body':pick(COMMENT_BODIES,_0x5d2bc9),'likes':rng(0x0,0x96,_0x5d2bc9),'approved':_0x5d2bc9()>0.1,'createdAt':dateAgo(0x16d,_0x5d2bc9)}})),_0x139349;}function generateTeam(_0x2e049b,_0x2230e0){const _0xc4de22=_0x14a550,_0x320bf2={},_0xd5bbd8=Array[_0xc4de22(0x133)]({'length':_0x2e049b['departments']},(_0x4778e9,_0x4a3e09)=>uid(_0xc4de22(0x2cc),_0x4a3e09+0x1));return _0x320bf2[_0xc4de22(0xb2)]=_0xd5bbd8[_0xc4de22(0x2e3)]((_0x3c7faf,_0x2b2f67)=>({'key':_0x3c7faf,'value':{'name':DEPTS[_0x2b2f67%DEPTS[_0xc4de22(0x29d)]],'head':'','headcount':rng(0x4,0x23,_0x2230e0),'budget':rng(0x186a0,0x2dc6c0,_0x2230e0),'location':pick(CITIES,_0x2230e0),'description':_0xc4de22(0xa4)+DEPTS[_0x2b2f67%DEPTS['length']]+_0xc4de22(0xa3)+pick([_0xc4de22(0x270),_0xc4de22(0x27b),'efficiency',_0xc4de22(0x288)],_0x2230e0)+_0xc4de22(0xf6)}})),_0x320bf2[_0xc4de22(0x12d)]=Array[_0xc4de22(0x133)]({'length':_0x2e049b[_0xc4de22(0x12d)]},(_0x52383d,_0x1e349e)=>{const _0x3dad09=_0xc4de22,_0x28f462=pick(FIRST,_0x2230e0),_0x5e94f2=pick(LAST,_0x2230e0);return{'key':uid(_0x3dad09(0xcd),_0x1e349e+0x1),'value':{'name':_0x28f462+'\x20'+_0x5e94f2,'email':email(_0x28f462,_0x5e94f2,_0x2230e0),'role':pick(ROLES,_0x2230e0),'department':pick(_0xd5bbd8,_0x2230e0),'level':pick(LEVELS,_0x2230e0),'skills':[...new Set([pick(SKILLS,_0x2230e0),pick(SKILLS,_0x2230e0),pick(SKILLS,_0x2230e0)])],'salary':rng(0xbb80,0x445c0,_0x2230e0),'hireDate':dateAgo(0x721,_0x2230e0),'manager':_0x1e349e>0x0?uid(_0x3dad09(0xcd),rng(0x1,Math[_0x3dad09(0x14b)](0x1,_0x1e349e),_0x2230e0)):null,'location':pick(CITIES,_0x2230e0),'remote':_0x2230e0()>0.45}};}),_0x320bf2['projects']=Array[_0xc4de22(0x133)]({'length':_0x2e049b['projects']},(_0x3cae9f,_0x3c7b2e)=>{const _0x453aa5=_0xc4de22,_0x4fbe8a=rng(0x2,0x8,_0x2230e0);return{'key':uid(_0x453aa5(0x254),_0x3c7b2e+0x1),'value':{'name':PROJ_NAMES[_0x3c7b2e%PROJ_NAMES[_0x453aa5(0x29d)]],'department':pick(_0xd5bbd8,_0x2230e0),'status':pick(PROJ_STATUS,_0x2230e0),'lead':uid(_0x453aa5(0xcd),rng(0x1,_0x2e049b[_0x453aa5(0x12d)],_0x2230e0)),'team':[...new Set(Array[_0x453aa5(0x133)]({'length':_0x4fbe8a},()=>uid(_0x453aa5(0xcd),rng(0x1,_0x2e049b[_0x453aa5(0x12d)],_0x2230e0))))],'budget':rng(0x2710,0x927c0,_0x2230e0),'startDate':dateAgo(0x16d,_0x2230e0),'deadline':dateFwd(0xb4,_0x2230e0),'progress':rng(0x0,0x64,_0x2230e0),'priority':pick([_0x453aa5(0x187),_0x453aa5(0x150),'high',_0x453aa5(0x1a6)],_0x2230e0),'description':PROJ_NAMES[_0x3c7b2e%PROJ_NAMES[_0x453aa5(0x29d)]]+_0x453aa5(0xb6)+pick([_0x453aa5(0x203),_0x453aa5(0x2b8),'user\x20experience',_0x453aa5(0x2a4),_0x453aa5(0x225)],_0x2230e0)+'.'}};}),_0x320bf2;}const PRESETS=[{'id':_0x14a550(0x289),'icon':'🛒','name':_0x14a550(0x29f),'tagline':_0x14a550(0x293),'color':_0x14a550(0x15f),'glow':_0x14a550(0x2a5),'defaultEnv':'demo-shop','types':[{'key':'products','label':_0x14a550(0x2b5),'defaultCount':0xfa},{'key':_0x14a550(0x1e4),'label':'Customers','defaultCount':0x64},{'key':'orders','label':'Orders','defaultCount':0x1f4},{'key':_0x14a550(0x1f6),'label':'Reviews','defaultCount':0x12c}],'indexes':[[_0x14a550(0x215),_0x14a550(0x2aa)],[_0x14a550(0x215),_0x14a550(0x153)],['customers',_0x14a550(0xcb)],['customers',_0x14a550(0x20a)],[_0x14a550(0x205),_0x14a550(0x108)],[_0x14a550(0x205),_0x14a550(0xe7)]],'fts':[{'type':_0x14a550(0x215),'name':'search','fields':[_0x14a550(0x121),_0x14a550(0x186)]}],'generate':generateEcommerce},{'id':_0x14a550(0x2ba),'icon':'📊','name':_0x14a550(0xe5),'tagline':_0x14a550(0x242),'color':'var(--okdb-accent)','glow':_0x14a550(0x15b),'defaultEnv':'demo-analytics','types':[{'key':_0x14a550(0x227),'label':_0x14a550(0x9d),'defaultCount':0x3e8},{'key':'sessions','label':'Sessions','defaultCount':0xc8},{'key':'pageviews','label':_0x14a550(0x1ad),'defaultCount':0x7d0}],'indexes':[['events',_0x14a550(0xf2)],[_0x14a550(0x227),_0x14a550(0x18d)],[_0x14a550(0x10e),'userId'],[_0x14a550(0x10e),_0x14a550(0x1bb)],[_0x14a550(0x115),_0x14a550(0x29e)],['pageviews',_0x14a550(0xed)]],'fts':[],'generate':generateAnalytics},{'id':_0x14a550(0x151),'icon':'📝','name':_0x14a550(0x2bc),'tagline':_0x14a550(0x181),'color':'var(--okdb-purple)','glow':'color-mix(in\x20srgb,\x20var(--okdb-purple)\x2020%,\x20transparent)','defaultEnv':_0x14a550(0x233),'types':[{'key':'posts','label':_0x14a550(0x2a6),'defaultCount':0x96},{'key':_0x14a550(0xa1),'label':'Authors','defaultCount':0x14},{'key':'tags','label':_0x14a550(0x166),'defaultCount':0x1c},{'key':_0x14a550(0xaa),'label':_0x14a550(0x25b),'defaultCount':0x190}],'indexes':[['posts',_0x14a550(0x2aa)],[_0x14a550(0x2bd),_0x14a550(0x19a)],[_0x14a550(0x2bd),_0x14a550(0x108)],['comments','postId'],[_0x14a550(0xaf),'count']],'fts':[{'type':_0x14a550(0x2bd),'name':_0x14a550(0xac),'fields':[_0x14a550(0x118),_0x14a550(0x1e3)]}],'generate':generateBlog},{'id':_0x14a550(0x2b0),'icon':'👥','name':'Team\x20Directory','tagline':_0x14a550(0x10f),'color':'var(--okdb-warning)','glow':'color-mix(in\x20srgb,\x20var(--okdb-warning)\x2020%,\x20transparent)','defaultEnv':'demo-team','types':[{'key':_0x14a550(0x12d),'label':_0x14a550(0xc8),'defaultCount':0x50},{'key':_0x14a550(0xb2),'label':_0x14a550(0x21a),'defaultCount':0x8},{'key':'projects','label':_0x14a550(0x2dd),'defaultCount':0x1e}],'indexes':[[_0x14a550(0x12d),_0x14a550(0x97)],[_0x14a550(0x12d),_0x14a550(0x2d2)],[_0x14a550(0x12d),_0x14a550(0x24a)],[_0x14a550(0x1b4),_0x14a550(0x108)],[_0x14a550(0x1b4),_0x14a550(0x97)]],'fts':[{'type':'employees','name':_0x14a550(0xac),'fields':[_0x14a550(0x121),_0x14a550(0x1a3),'skills']}],'generate':generateTeam},{'id':'cityexplorer','icon':_0x14a550(0x128),'name':_0x14a550(0x235),'tagline':'Geo-indexed\x20places\x20&\x20people','color':_0x14a550(0x10a),'glow':_0x14a550(0x20c),'defaultEnv':_0x14a550(0xf5),'badge':_0x14a550(0x147),'types':[{'key':_0x14a550(0x1fa),'label':_0x14a550(0x15a),'defaultCount':0xc8},{'key':_0x14a550(0x220),'label':'People','defaultCount':0x50},{'key':_0x14a550(0x1e6),'label':'Checkins','defaultCount':0x12c}],'indexes':[[_0x14a550(0x1fa),'location',{'type':_0x14a550(0x147),'precision':0x7}],['places',_0x14a550(0x2aa)],[_0x14a550(0x1fa),_0x14a550(0xcb)],[_0x14a550(0x1fa),_0x14a550(0x1c1)],[_0x14a550(0x220),_0x14a550(0xb5),{'type':_0x14a550(0x147),'precision':0x5}],[_0x14a550(0x220),'city'],[_0x14a550(0x1e6),_0x14a550(0x123)],['checkins',_0x14a550(0x232)]],'fts':[{'type':_0x14a550(0x1fa),'name':_0x14a550(0xac),'fields':[_0x14a550(0x121),_0x14a550(0x186)]}],'generate':generateCityExplorer}],SCALE_OPTIONS=[{'value':0.25,'label':'¼×','hint':_0x14a550(0x1fe)},{'value':0.5,'label':'½×','hint':_0x14a550(0xa9)},{'value':0x1,'label':'1×','hint':'Normal'},{'value':0x2,'label':'2×','hint':_0x14a550(0xbf)},{'value':0x4,'label':'4×','hint':_0x14a550(0x1ce)}],BATCH_SIZE=0x32;export default{'tag':_0x14a550(0x264),'attr':{'modal':{},'onDone':{}},'context':_0x52c621=>({'step':_0x14a550(0x2a3),'preset':null,'envName':'','scale':0x1,'enableFts':!0x0,'enableIndexes':!0x0,'typeCounts':{},'progress':[],'totalSteps':0x0,'completedSteps':0x0,'error':null,'resultStats':null,'PRESETS':PRESETS,'SCALE_OPTIONS':SCALE_OPTIONS,get 'effectiveCounts'(){const _0x3b4dde=_0x14a550,_0x2926df={};for(const _0xc7fae1 of this[_0x3b4dde(0x291)]?.[_0x3b4dde(0x170)]??[])_0x2926df[_0xc7fae1[_0x3b4dde(0x26b)]]=Math[_0x3b4dde(0x14b)](0x1,Math[_0x3b4dde(0x2c9)]((this[_0x3b4dde(0x1a0)][_0xc7fae1[_0x3b4dde(0x26b)]]??_0xc7fae1['defaultCount'])*this[_0x3b4dde(0x113)]));return _0x2926df;},get 'totalRecords'(){const _0x3ef93a=_0x14a550;return Object[_0x3ef93a(0x175)](this['effectiveCounts'])[_0x3ef93a(0xbd)]((_0x480190,_0x434258)=>_0x480190+_0x434258,0x0);},get 'progressPct'(){const _0x3c8cc6=_0x14a550;return this[_0x3c8cc6(0xa0)]?Math[_0x3c8cc6(0x2b7)](0x64,Math[_0x3c8cc6(0x2c9)](this[_0x3c8cc6(0x1ed)]/this[_0x3c8cc6(0xa0)]*0x64)):0x0;},'selectPreset'(_0x32f31c){const _0x518165=_0x14a550;this[_0x518165(0x291)]=_0x32f31c,this['envName']=_0x32f31c['defaultEnv'],this[_0x518165(0x1a0)]={};for(const _0xc2d19 of _0x32f31c[_0x518165(0x170)])this[_0x518165(0x1a0)][_0xc2d19[_0x518165(0x26b)]]=_0xc2d19[_0x518165(0x194)];this[_0x518165(0x1de)]='configure';},'back'(){const _0x58234a=_0x14a550;'configure'===this[_0x58234a(0x1de)]&&(this[_0x58234a(0x1de)]=_0x58234a(0x2a3));},'cancel'(){const _0x35f214=_0x14a550;_0x52c621['$attr'][_0x35f214(0x1c5)][_0x35f214(0x201)]();},'_addStep'(_0x30ac0d,_0x5fec54,_0x294ba1,_0x5e1e77){const _0x57f554=_0x14a550;this[_0x57f554(0x2d8)][_0x57f554(0x26c)]({'id':_0x30ac0d,'label':_0x5fec54,'done':0x0,'total':_0x294ba1,'icon':_0x5e1e77,'status':_0x57f554(0x26f)}),this['totalSteps']++;},'_start'(_0x5d57d2){const _0x19cc17=_0x14a550,_0x447f8a=this[_0x19cc17(0x2d8)][_0x19cc17(0x2dc)](_0x4f10aa=>_0x4f10aa['id']===_0x5d57d2);_0x447f8a&&(_0x447f8a[_0x19cc17(0x108)]=_0x19cc17(0xd3));},'_done'(_0x52a662){const _0x20905f=_0x14a550,_0x5b70af=this['progress'][_0x20905f(0x2dc)](_0xdefaef=>_0xdefaef['id']===_0x52a662);_0x5b70af&&(_0x5b70af[_0x20905f(0x108)]=_0x20905f(0x2ab),_0x5b70af['done']=_0x5b70af['total'],this[_0x20905f(0x1ed)]++);},'_error'(_0x1eefa8){const _0x49b558=_0x14a550,_0x2a35a9=this['progress'][_0x49b558(0x2dc)](_0x25eba8=>_0x25eba8['id']===_0x1eefa8);_0x2a35a9&&(_0x2a35a9[_0x49b558(0x108)]=_0x49b558(0x28f),this[_0x49b558(0x1ed)]++);},'_tick'(_0x41a965,_0x555d63){const _0x19a08c=_0x14a550,_0x4146cb=this[_0x19a08c(0x2d8)][_0x19a08c(0x2dc)](_0x45b935=>_0x45b935['id']===_0x41a965);_0x4146cb&&(_0x4146cb[_0x19a08c(0x2ab)]=_0x555d63);},async 'start'(){const _0x57466e=_0x14a550;if(_0x57466e(0x17a)===this[_0x57466e(0x1de)])return;const _0x3e694c=this[_0x57466e(0x2e4)][_0x57466e(0xe0)]();if(!_0x3e694c||!this[_0x57466e(0x291)])return;this[_0x57466e(0x1de)]=_0x57466e(0x17a),this[_0x57466e(0x2d8)]=[],this[_0x57466e(0xa0)]=0x0,this[_0x57466e(0x1ed)]=0x0,this['error']=null,this['resultStats']={'env':_0x3e694c,'types':{},'indexes':0x0,'fts':0x0,'totalRecords':0x0};const _0x31448d=this[_0x57466e(0x291)],_0x42c783=this['effectiveCounts'],_0x445d39=__ENV__[_0x57466e(0x239)],_0x5c4d1c=_0x445d39+_0x57466e(0x26a)+encodeURIComponent(_0x3e694c);this[_0x57466e(0xdc)](_0x57466e(0x1cf),_0x57466e(0x168)+_0x3e694c+'\x22',0x1,'🌐');for(const _0x4fe61a of _0x31448d[_0x57466e(0x170)])this['_addStep'](_0x57466e(0x1ea)+_0x4fe61a[_0x57466e(0x26b)],_0x57466e(0x218)+_0x4fe61a[_0x57466e(0x26b)],0x1,'⬡');for(const _0x507338 of _0x31448d[_0x57466e(0x170)])this['_addStep'](_0x57466e(0x2d9)+_0x507338[_0x57466e(0x26b)],_0x57466e(0xb1)+_0x42c783[_0x507338[_0x57466e(0x26b)]][_0x57466e(0x1c4)]()+'\x20'+_0x507338[_0x57466e(0x247)][_0x57466e(0x259)](),_0x42c783[_0x507338['key']],'⬢');if(this['enableIndexes'])for(const [_0x398b4d,_0x5f4b79,_0x263323]of _0x31448d['indexes']){const _0x2e0528=_0x57466e(0x147)===_0x263323?.['type'];this['_addStep']('idx:'+_0x398b4d+':'+_0x5f4b79,(_0x2e0528?_0x57466e(0x228):'Index')+'\x20'+_0x398b4d+'.'+_0x5f4b79,0x1,_0x2e0528?'📍':'⌖');}if(this[_0x57466e(0x12e)]&&_0x31448d['fts']['length']){for(const _0xae5d35 of _0x31448d[_0x57466e(0x13c)])this[_0x57466e(0xdc)]('fts:'+_0xae5d35[_0x57466e(0xf2)]+':'+_0xae5d35[_0x57466e(0x121)],_0x57466e(0x124)+_0xae5d35[_0x57466e(0x121)]+_0x57466e(0x1fd)+_0xae5d35[_0x57466e(0xf2)],0x1,'⌘');}try{this['_start'](_0x57466e(0x1cf));const _0x143ad2=await fetch(_0x445d39+'/envs',{'method':'POST','headers':{'Content-Type':_0x57466e(0x180)},'body':JSON['stringify']({'name':_0x3e694c,'sync':!0x0,'compression':!0x0})});if(!_0x143ad2['ok']&&0x199!==_0x143ad2[_0x57466e(0x108)]){const _0x48031d=await _0x143ad2['json']()[_0x57466e(0x177)](()=>({}));throw new Error(_0x48031d?.[_0x57466e(0x28f)]?.[_0x57466e(0xb8)]||'Create\x20env\x20failed\x20('+_0x143ad2[_0x57466e(0x108)]+')');}this[_0x57466e(0x2b4)](_0x57466e(0x1cf));for(const _0x80506f of _0x31448d[_0x57466e(0x170)]){this[_0x57466e(0x21c)](_0x57466e(0x1ea)+_0x80506f[_0x57466e(0x26b)]);const _0xe0c5f1=await fetch(_0x5c4d1c+'/type/'+encodeURIComponent(_0x80506f[_0x57466e(0x26b)]),{'method':_0x57466e(0xd2)});if(!_0xe0c5f1['ok']&&0x199!==_0xe0c5f1[_0x57466e(0x108)]){const _0x36529e=await _0xe0c5f1[_0x57466e(0xd5)]()[_0x57466e(0x177)](()=>({}));throw new Error(_0x36529e?.[_0x57466e(0x28f)]?.[_0x57466e(0xb8)]||_0x57466e(0x2af)+_0x80506f[_0x57466e(0x26b)]+_0x57466e(0x1d6));}this['_done'](_0x57466e(0x1ea)+_0x80506f[_0x57466e(0x26b)]);}const _0x3a8f1f=makePRNG(0x7fffffff&Date[_0x57466e(0x1d1)]()),_0x208d3d=_0x31448d['generate'](_0x42c783,_0x3a8f1f);for(const _0x4e47be of _0x31448d[_0x57466e(0x170)]){const _0x1db24d='data:'+_0x4e47be[_0x57466e(0x26b)],_0xd87cf8=_0x208d3d[_0x4e47be[_0x57466e(0x26b)]]??[];this[_0x57466e(0x21c)](_0x1db24d);let _0x3dcef1=0x0;for(let _0x223c8c=0x0;_0x223c8c<_0xd87cf8[_0x57466e(0x29d)];_0x223c8c+=0x32){const _0x580e55=_0xd87cf8[_0x57466e(0xdd)](_0x223c8c,_0x223c8c+0x32),_0x534bcb=_0x580e55[_0x57466e(0x2e3)](({key:_0xd42f4f,value:_0xdc2130})=>({'action':_0x57466e(0x249),'type':_0x4e47be['key'],'key':_0xd42f4f,'value':_0xdc2130})),_0x22b16c=await fetch(_0x5c4d1c+'/transaction',{'method':_0x57466e(0xd2),'headers':{'Content-Type':'application/json'},'body':JSON[_0x57466e(0x202)]({'operations':_0x534bcb})});if(!_0x22b16c['ok']){const _0x98f1d9=await _0x22b16c[_0x57466e(0xd5)]()[_0x57466e(0x177)](()=>({}));throw new Error(_0x98f1d9?.[_0x57466e(0x28f)]?.[_0x57466e(0xb8)]||_0x57466e(0x13b)+_0x4e47be[_0x57466e(0x26b)]+'\x22\x20failed');}_0x3dcef1+=_0x580e55[_0x57466e(0x29d)],this[_0x57466e(0x13f)](_0x1db24d,_0x3dcef1),await new Promise(_0x5737fa=>setTimeout(_0x5737fa,0x0));}this[_0x57466e(0x111)][_0x57466e(0x170)][_0x4e47be[_0x57466e(0x26b)]]=_0xd87cf8['length'],this[_0x57466e(0x111)][_0x57466e(0x1ae)]+=_0xd87cf8[_0x57466e(0x29d)],this[_0x57466e(0x2b4)](_0x1db24d);}if(this['enableIndexes'])for(const [_0x5790ce,_0x276c2c,_0x5ae6e0]of _0x31448d[_0x57466e(0x2c3)]){const _0x16b35b=_0x57466e(0x16a)+_0x5790ce+':'+_0x276c2c;this[_0x57466e(0x21c)](_0x16b35b);const _0x5538a7=await fetch(_0x5c4d1c+_0x57466e(0x94)+encodeURIComponent(_0x5790ce)+_0x57466e(0x176)+encodeURIComponent(_0x276c2c),{'method':'POST','headers':{'Content-Type':_0x57466e(0x180)},'body':JSON['stringify'](_0x5ae6e0||{})});if(!_0x5538a7['ok']){const _0x5618a5=await _0x5538a7[_0x57466e(0xd5)]()[_0x57466e(0x177)](()=>({}));throw new Error(_0x5618a5?.['error']?.[_0x57466e(0xb8)]||_0x57466e(0x17d)+_0x5790ce+'.'+_0x276c2c+_0x57466e(0xc4));}this['resultStats'][_0x57466e(0x2c3)]++,this[_0x57466e(0x2b4)](_0x16b35b);}if(this[_0x57466e(0x12e)])for(const _0x19333d of _0x31448d[_0x57466e(0x13c)]){const _0x1124bb='fts:'+_0x19333d['type']+':'+_0x19333d['name'];this['_start'](_0x1124bb),(await fetch(_0x5c4d1c+'/type/'+encodeURIComponent(_0x19333d['type'])+_0x57466e(0x276)+encodeURIComponent(_0x19333d[_0x57466e(0x121)]),{'method':'POST','headers':{'Content-Type':_0x57466e(0x180)},'body':JSON[_0x57466e(0x202)]({'fields':_0x19333d[_0x57466e(0xc7)]})}))['ok']?(this[_0x57466e(0x111)]['fts']++,this[_0x57466e(0x2b4)](_0x1124bb)):this[_0x57466e(0xe1)](_0x1124bb);}this['step']='done';}catch(_0x2a37f8){this['error']=_0x2a37f8?.['message']||_0x57466e(0x2bf);for(const _0x159e06 of this[_0x57466e(0x2d8)])_0x57466e(0xd3)===_0x159e06[_0x57466e(0x108)]&&this[_0x57466e(0xe1)](_0x159e06['id']);}},async 'openEnv'(){const _0x4fa1b7=_0x14a550,_0x33af51=this[_0x4fa1b7(0x2e4)][_0x4fa1b7(0xe0)]();_0x52c621[_0x4fa1b7(0x219)][_0x4fa1b7(0xc0)][_0x4fa1b7(0x155)][_0x4fa1b7(0x29b)](_0x33af51),await _0x52c621[_0x4fa1b7(0x219)]['stores'][_0x4fa1b7(0x155)][_0x4fa1b7(0xd6)](),await _0x52c621[_0x4fa1b7(0x1ab)]['modal'][_0x4fa1b7(0x201)](),await _0x52c621[_0x4fa1b7(0x1ab)][_0x4fa1b7(0x142)]?.(_0x33af51);}}),'template':_0x14a550(0x23f),'style':'\x0a/*\x20──\x20Root\x20────────────────────────────────────────────────────\x20*/\x0a.dm\x20{\x0a\x20\x20min-width:\x20560px;\x0a\x20\x20max-width:\x20660px;\x0a}\x0a\x0a/*\x20──\x20Hero\x20────────────────────────────────────────────────────\x20*/\x0a.dm-hero\x20{\x0a\x20\x20text-align:\x20center;\x0a\x20\x20padding:\x204px\x200\x2018px;\x0a}\x0a.dm-hero__sparkle\x20{\x0a\x20\x20font-size:\x2030px;\x0a\x20\x20margin-bottom:\x2010px;\x0a\x20\x20background:\x20linear-gradient(135deg,\x20var(--okdb-accent),\x20var(--okdb-purple)\x2040%,\x20var(--okdb-success)\x2075%,\x20var(--okdb-warning));\x0a\x20\x20-webkit-background-clip:\x20text;\x0a\x20\x20-webkit-text-fill-color:\x20transparent;\x0a\x20\x20background-clip:\x20text;\x0a\x20\x20animation:\x20dm-hue\x206s\x20linear\x20infinite;\x0a\x20\x20display:\x20inline-block;\x0a}\x0a.dm-hero__title\x20{\x0a\x20\x20font-size:\x2020px;\x0a\x20\x20font-weight:\x20700;\x0a\x20\x20margin-bottom:\x208px;\x0a\x20\x20background:\x20linear-gradient(135deg,\x20var(--okdb-app-fg),\x20#ffffff);\x0a\x20\x20-webkit-background-clip:\x20text;\x0a\x20\x20-webkit-text-fill-color:\x20transparent;\x0a\x20\x20background-clip:\x20text;\x0a}\x0a.dm-hero__sub\x20{\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20opacity:\x20.55;\x0a\x20\x20max-width:\x20400px;\x0a\x20\x20margin:\x200\x20auto;\x0a\x20\x20line-height:\x201.65;\x0a}\x0a\x0a/*\x20──\x20Preset\x20grid\x20─────────────────────────────────────────────\x20*/\x0a.dm-presets\x20{\x0a\x20\x20display:\x20grid;\x0a\x20\x20grid-template-columns:\x201fr\x201fr;\x0a\x20\x20gap:\x2010px;\x0a\x20\x20padding:\x204px\x200\x2018px;\x0a}\x0a.dm-preset\x20{\x0a\x20\x20position:\x20relative;\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20gap:\x205px;\x0a\x20\x20padding:\x2018px\x2018px\x2014px;\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20border-radius:\x2014px;\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20text-align:\x20left;\x0a\x20\x20overflow:\x20hidden;\x0a\x20\x20transition:\x20border-color\x20.2s,\x20transform\x20.2s,\x20box-shadow\x20.2s;\x0a}\x0a/*\x20City\x20Explorer:\x20spans\x20both\x20columns\x20with\x20a\x20horizontal\x20layout\x20*/\x0a.dm-preset--geo\x20{\x0a\x20\x20grid-column:\x201\x20/\x20-1;\x0a\x20\x20flex-direction:\x20row;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x2016px;\x0a\x20\x20padding:\x2016px\x2020px;\x0a}\x0a.dm-preset--geo\x20.dm-preset__icon\x20{\x0a\x20\x20font-size:\x2032px;\x0a\x20\x20flex-shrink:\x200;\x0a}\x0a.dm-preset--geo\x20.dm-preset__name,\x0a.dm-preset--geo\x20.dm-preset__tag,\x0a.dm-preset--geo\x20.dm-preset__chips\x20{\x20}\x0a.dm-preset--geo\x20.dm-preset__name\x20{\x20font-size:\x2016px;\x20}\x0a.dm-preset--geo\x20.dm-preset__arrow\x20{\x0a\x20\x20margin-left:\x20auto;\x0a\x20\x20position:\x20static;\x0a\x20\x20font-size:\x2016px;\x0a\x20\x20opacity:\x20.3;\x0a\x20\x20transition:\x20opacity\x20.2s,\x20transform\x20.2s;\x0a}\x0a.dm-preset--geo:hover\x20.dm-preset__arrow\x20{\x20opacity:\x20.9;\x20transform:\x20translateX(4px);\x20}\x0a/*\x20Geo\x20pulse\x20ring\x20on\x20the\x20icon\x20*/\x0a.dm-preset--geo\x20.dm-preset__icon::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20width:\x2048px;\x0a\x20\x20height:\x2048px;\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20border:\x201px\x20solid\x20var(--pc,\x20var(--okdb-orange));\x0a\x20\x20opacity:\x200;\x0a\x20\x20animation:\x20dm-geo-ring\x202.5s\x20ease-out\x20infinite;\x0a}\x0a.dm-preset__bg\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20inset:\x200;\x0a\x20\x20background:\x20radial-gradient(circle\x20at\x2025%\x2025%,\x20var(--pg,\x20transparent),\x20transparent\x2065%);\x0a\x20\x20opacity:\x200;\x0a\x20\x20transition:\x20opacity\x20.3s;\x0a\x20\x20pointer-events:\x20none;\x0a}\x0a.dm-preset:hover\x20{\x0a\x20\x20border-color:\x20var(--pc,\x20var(--okdb-accent));\x0a\x20\x20box-shadow:\x200\x200\x200\x201px\x20var(--pc,\x20var(--okdb-accent))33,\x200\x208px\x2028px\x20var(--pg,\x20transparent);\x0a\x20\x20transform:\x20translateY(-2px);\x0a}\x0a.dm-preset--geo:hover\x20{\x20transform:\x20translateY(-2px);\x20}\x0a.dm-preset:hover\x20.dm-preset__bg\x20{\x20opacity:\x201;\x20}\x0a.dm-preset__icon\x20{\x0a\x20\x20font-size:\x2026px;\x0a\x20\x20line-height:\x201;\x0a\x20\x20margin-bottom:\x204px;\x0a\x20\x20filter:\x20drop-shadow(0\x200\x208px\x20var(--pc,\x20#fff));\x0a\x20\x20position:\x20relative;\x0a}\x0a.dm-preset__name\x20{\x0a\x20\x20font-size:\x2015px;\x0a\x20\x20font-weight:\x20700;\x0a\x20\x20color:\x20var(--pc,\x20#fff);\x0a\x20\x20position:\x20relative;\x0a}\x0a.dm-preset__tag\x20{\x0a\x20\x20font-size:\x2012px;\x0a\x20\x20opacity:\x20.5;\x0a\x20\x20line-height:\x201.4;\x0a\x20\x20position:\x20relative;\x0a}\x0a.dm-preset__chips\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20gap:\x205px;\x0a\x20\x20font-size:\x2011px;\x0a\x20\x20opacity:\x20.45;\x0a\x20\x20margin-top:\x205px;\x0a\x20\x20position:\x20relative;\x0a\x20\x20flex-wrap:\x20wrap;\x0a\x20\x20align-items:\x20center;\x0a}\x0a.dm-chip-dot\x20{\x20opacity:\x20.5;\x20}\x0a.dm-preset__arrow\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20bottom:\x2014px;\x0a\x20\x20right:\x2016px;\x0a\x20\x20font-size:\x2014px;\x0a\x20\x20opacity:\x20.2;\x0a\x20\x20transition:\x20opacity\x20.2s,\x20transform\x20.2s;\x0a}\x0a.dm-preset:not(.dm-preset--geo):hover\x20.dm-preset__arrow\x20{\x20opacity:\x20.8;\x20transform:\x20translateX(3px);\x20}\x0a@keyframes\x20dm-geo-ring\x20{\x0a\x20\x200%\x20\x20\x20{\x20opacity:\x20.6;\x20transform:\x20scale(.6);\x20}\x0a\x20\x20100%\x20{\x20opacity:\x200;\x20\x20transform:\x20scale(2.2);\x20}\x0a}\x0a\x0a/*\x20──\x20Back\x20button\x20─────────────────────────────────────────────\x20*/\x0a.dm-back-btn\x20{\x0a\x20\x20font-size:\x2016px;\x0a\x20\x20padding:\x203px\x2010px;\x0a\x20\x20opacity:\x20.5;\x0a\x20\x20border-radius:\x206px;\x0a\x20\x20transition:\x20opacity\x20.15s;\x0a}\x0a.dm-back-btn:hover\x20{\x20opacity:\x201;\x20}\x0a\x0a/*\x20──\x20Preset\x20badge\x20(configure\x20step)\x20──────────────────────────\x20*/\x0a.dm-preset-badge\x20{\x0a\x20\x20font-size:\x2022px;\x0a\x20\x20display:\x20inline-flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20justify-content:\x20center;\x0a\x20\x20width:\x2036px;\x0a\x20\x20height:\x2036px;\x0a\x20\x20border-radius:\x2010px;\x0a\x20\x20background:\x20var(--pg,\x20var(--okdb-app-surface));\x0a\x20\x20border:\x201px\x20solid\x20var(--pc,\x20var(--okdb-app-border))33;\x0a\x20\x20filter:\x20drop-shadow(0\x200\x208px\x20var(--pc,\x20transparent));\x0a}\x0a\x0a/*\x20──\x20Scale\x20buttons\x20───────────────────────────────────────────\x20*/\x0a.dm-scale-btn\x20{\x0a\x20\x20padding:\x205px\x2012px;\x0a\x20\x20font-size:\x2012px;\x0a\x20\x20border-radius:\x207px;\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20transition:\x20all\x20.15s;\x0a}\x0a.dm-scale-btn--active\x20{\x0a\x20\x20background:\x20var(--pc,\x20var(--okdb-accent))22\x20!important;\x0a\x20\x20border-color:\x20var(--pc,\x20var(--okdb-accent))\x20!important;\x0a\x20\x20color:\x20var(--pc,\x20var(--okdb-accent))\x20!important;\x0a\x20\x20font-weight:\x20600;\x0a}\x0a\x0a/*\x20──\x20Type\x20count\x20table\x20────────────────────────────────────────\x20*/\x0a.dm-type-table\x20{\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-surface);\x0a\x20\x20border-radius:\x209px;\x0a\x20\x20overflow:\x20hidden;\x0a}\x0a.dm-type-row\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x2010px;\x0a\x20\x20padding:\x208px\x2014px;\x0a\x20\x20border-bottom:\x201px\x20solid\x20var(--okdb-app-border);\x0a}\x0a.dm-type-row:last-child\x20{\x20border-bottom:\x20none;\x20}\x0a.dm-type-row__name\x20{\x0a\x20\x20font-family:\x20monospace;\x0a\x20\x20font-size:\x2012px;\x0a\x20\x20width:\x2090px;\x0a\x20\x20flex-shrink:\x200;\x0a\x20\x20opacity:\x20.8;\x0a}\x0a.dm-type-row__bar-wrap\x20{\x0a\x20\x20flex:\x201;\x0a\x20\x20height:\x204px;\x0a\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20border-radius:\x202px;\x0a\x20\x20overflow:\x20hidden;\x0a}\x0a.dm-type-row__bar\x20{\x0a\x20\x20height:\x20100%;\x0a\x20\x20border-radius:\x202px;\x0a\x20\x20transition:\x20width\x20.25s\x20ease-out;\x0a\x20\x20min-width:\x204px;\x0a}\x0a.dm-type-row__count\x20{\x0a\x20\x20font-family:\x20monospace;\x0a\x20\x20font-size:\x2012px;\x0a\x20\x20font-weight:\x20600;\x0a\x20\x20width:\x2070px;\x0a\x20\x20text-align:\x20right;\x0a\x20\x20flex-shrink:\x200;\x0a}\x0a\x0a/*\x20──\x20Checkbox\x20labels\x20─────────────────────────────────────────\x20*/\x0a.dm-check-label\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x207px;\x0a\x20\x20cursor:\x20pointer;\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20user-select:\x20none;\x0a}\x0a\x0a/*\x20──\x20Summary\x20pill\x20────────────────────────────────────────────\x20*/\x0a.dm-summary\x20{\x0a\x20\x20padding:\x2010px\x2014px;\x0a\x20\x20border-radius:\x209px;\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-border);\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20gap:\x205px;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20flex-wrap:\x20wrap;\x0a\x20\x20line-height:\x201.6;\x0a}\x0a\x0a/*\x20──\x20Generate\x20button\x20─────────────────────────────────────────\x20*/\x0a.dm-gen-btn\x20{\x0a\x20\x20background:\x20var(--pg,\x20color-mix(in\x20srgb,\x20var(--okdb-accent)\x207%,\x20transparent))\x20!important;\x0a\x20\x20border:\x201px\x20solid\x20var(--pc,\x20var(--okdb-accent))\x20!important;\x0a\x20\x20color:\x20var(--pc,\x20var(--okdb-accent))\x20!important;\x0a\x20\x20font-weight:\x20700;\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20padding:\x207px\x2020px;\x0a\x20\x20border-radius:\x208px;\x0a\x20\x20transition:\x20all\x20.2s;\x0a\x20\x20letter-spacing:\x20.01em;\x0a}\x0a.dm-gen-btn:hover:not(:disabled)\x20{\x0a\x20\x20background:\x20var(--pc,\x20var(--okdb-accent))33\x20!important;\x0a\x20\x20box-shadow:\x200\x200\x2020px\x20var(--pc,\x20var(--okdb-accent))44;\x0a}\x0a.dm-gen-btn:disabled\x20{\x0a\x20\x20opacity:\x20.4;\x0a\x20\x20cursor:\x20not-allowed;\x0a}\x0a\x0a/*\x20──\x20Footer\x20row\x20──────────────────────────────────────────────\x20*/\x0a.dm-footer\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20gap:\x208px;\x0a\x20\x20justify-content:\x20flex-end;\x0a\x20\x20padding-top:\x2012px;\x0a\x20\x20border-top:\x201px\x20solid\x20var(--okdb-app-surface);\x0a}\x0a\x0a/*\x20──\x20Generation\x20header\x20───────────────────────────────────────\x20*/\x0a.dm-gen-header\x20{\x0a\x20\x20padding:\x2014px\x2016px;\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20border:\x201px\x20solid\x20var(--okdb-app-surface);\x0a\x20\x20border-radius:\x2010px;\x0a\x20\x20box-shadow:\x20inset\x200\x200\x2040px\x20var(--pg,\x20transparent);\x0a}\x0a.dm-pulsing-icon\x20{\x0a\x20\x20font-size:\x2020px;\x0a\x20\x20display:\x20inline-block;\x0a\x20\x20animation:\x20dm-pulse\x201.5s\x20ease-in-out\x20infinite;\x0a\x20\x20filter:\x20drop-shadow(0\x200\x206px\x20var(--pc,\x20transparent));\x0a}\x0a.dm-progress-track\x20{\x0a\x20\x20height:\x207px;\x0a\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20border-radius:\x204px;\x0a\x20\x20overflow:\x20hidden;\x0a}\x0a.dm-progress-fill\x20{\x0a\x20\x20height:\x20100%;\x0a\x20\x20border-radius:\x204px;\x0a\x20\x20transition:\x20width\x20.35s\x20ease-out;\x0a\x20\x20position:\x20relative;\x0a}\x0a.dm-progress-fill--shimmer::after\x20{\x0a\x20\x20content:\x20\x27\x27;\x0a\x20\x20position:\x20absolute;\x0a\x20\x20inset:\x200;\x0a\x20\x20background:\x20linear-gradient(90deg,\x20transparent,\x20rgba(255,255,255,.25),\x20transparent);\x0a\x20\x20animation:\x20dm-shimmer\x201.5s\x20linear\x20infinite;\x0a}\x0a\x0a/*\x20──\x20Step\x20rows\x20───────────────────────────────────────────────\x20*/\x0a.dm-steps\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20gap:\x202px;\x0a\x20\x20max-height:\x20320px;\x0a\x20\x20overflow-y:\x20auto;\x0a\x20\x20padding-right:\x204px;\x0a}\x0a.dm-step\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x209px;\x0a\x20\x20padding:\x207px\x2010px;\x0a\x20\x20border-radius:\x207px;\x0a\x20\x20font-size:\x2012px;\x0a\x20\x20transition:\x20background\x20.1s;\x0a}\x0a.dm-step--pending\x20\x20{\x20opacity:\x20.32;\x20}\x0a.dm-step--running\x20\x20{\x20background:\x20var(--okdb-app-surface);\x20opacity:\x201;\x20}\x0a.dm-step--done\x20\x20\x20\x20\x20{\x20opacity:\x20.6;\x20}\x0a.dm-step--error\x20\x20\x20\x20{\x20background:\x20var(--okdb-danger-deep-bg);\x20opacity:\x201;\x20}\x0a.dm-step__icon\x20{\x0a\x20\x20width:\x2018px;\x0a\x20\x20text-align:\x20center;\x0a\x20\x20flex-shrink:\x200;\x0a\x20\x20font-size:\x2012px;\x0a}\x0a.dm-step--done\x20.dm-step__icon\x20\x20{\x20color:\x20var(--okdb-success);\x20}\x0a.dm-step--running\x20.dm-step__icon\x20{\x20color:\x20var(--okdb-accent);\x20}\x0a.dm-step--error\x20.dm-step__icon\x20{\x20color:\x20var(--okdb-danger);\x20}\x0a.dm-step__label\x20{\x20flex:\x201;\x20}\x0a.dm-step__count\x20{\x0a\x20\x20font-size:\x2011px;\x0a\x20\x20font-family:\x20monospace;\x0a\x20\x20opacity:\x20.5;\x0a\x20\x20flex-shrink:\x200;\x0a}\x0a.dm-step__mini-bar\x20{\x0a\x20\x20width:\x2070px;\x0a\x20\x20height:\x203px;\x0a\x20\x20background:\x20var(--okdb-app-surface);\x0a\x20\x20border-radius:\x202px;\x0a\x20\x20overflow:\x20hidden;\x0a\x20\x20flex-shrink:\x200;\x0a}\x0a.dm-step__mini-fill\x20{\x0a\x20\x20height:\x20100%;\x0a\x20\x20background:\x20var(--okdb-accent);\x0a\x20\x20border-radius:\x202px;\x0a\x20\x20transition:\x20width\x20.2s\x20ease-out;\x0a}\x0a\x0a/*\x20──\x20Error\x20banner\x20────────────────────────────────────────────\x20*/\x0a.dm-error\x20{\x0a\x20\x20color:\x20var(--okdb-danger);\x0a\x20\x20font-size:\x2013px;\x0a\x20\x20padding:\x209px\x2013px;\x0a\x20\x20background:\x20var(--okdb-danger-deep-bg);\x0a\x20\x20border:\x201px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x0a\x20\x20border-radius:\x207px;\x0a}\x0a\x0a/*\x20──\x20Done\x20orb\x20────────────────────────────────────────────────\x20*/\x0a.dm-done-orb\x20{\x0a\x20\x20position:\x20relative;\x0a\x20\x20width:\x2096px;\x0a\x20\x20height:\x2096px;\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20justify-content:\x20center;\x0a}\x0a.dm-done-orb__icon\x20{\x0a\x20\x20font-size:\x2040px;\x0a\x20\x20position:\x20relative;\x0a\x20\x20z-index:\x202;\x0a\x20\x20filter:\x20drop-shadow(0\x200\x2016px\x20var(--pc,\x20var(--okdb-accent)));\x0a\x20\x20animation:\x20dm-pulse\x202.5s\x20ease-in-out\x20infinite;\x0a}\x0a.dm-done-orb__ring\x20{\x0a\x20\x20position:\x20absolute;\x0a\x20\x20inset:\x200;\x0a\x20\x20border-radius:\x2050%;\x0a\x20\x20border:\x201px\x20solid\x20var(--pc,\x20var(--okdb-accent));\x0a}\x0a.dm-done-orb__ring--1\x20{\x0a\x20\x20opacity:\x20.4;\x0a\x20\x20animation:\x20dm-ring-pulse\x202s\x20ease-in-out\x20infinite;\x0a}\x0a.dm-done-orb__ring--2\x20{\x0a\x20\x20opacity:\x20.2;\x0a\x20\x20animation:\x20dm-ring-pulse\x202s\x20ease-in-out\x20infinite\x20.7s;\x0a\x20\x20transform:\x20scale(1.3);\x0a}\x0a\x0a/*\x20──\x20Done\x20stats\x20──────────────────────────────────────────────\x20*/\x0a.dm-done-stats\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x2020px;\x0a\x20\x20padding:\x2016px\x2032px;\x0a\x20\x20background:\x20var(--okdb-app-bg-deep);\x0a\x20\x20border:\x201px\x20solid\x20var(--pc,\x20var(--okdb-accent))33;\x0a\x20\x20border-radius:\x2014px;\x0a\x20\x20box-shadow:\x200\x200\x2030px\x20var(--pg,\x20transparent);\x0a}\x0a.dm-stat\x20{\x0a\x20\x20display:\x20flex;\x0a\x20\x20flex-direction:\x20column;\x0a\x20\x20align-items:\x20center;\x0a\x20\x20gap:\x205px;\x0a}\x0a.dm-stat__val\x20{\x0a\x20\x20font-size:\x2028px;\x0a\x20\x20font-weight:\x20800;\x0a\x20\x20line-height:\x201;\x0a\x20\x20letter-spacing:\x20-.02em;\x0a}\x0a.dm-stat__lbl\x20{\x0a\x20\x20font-size:\x2010px;\x0a\x20\x20text-transform:\x20uppercase;\x0a\x20\x20letter-spacing:\x20.08em;\x0a\x20\x20opacity:\x20.45;\x0a}\x0a.dm-stat-divider\x20{\x0a\x20\x20width:\x201px;\x0a\x20\x20height:\x2036px;\x0a\x20\x20background:\x20var(--okdb-app-border);\x0a\x20\x20flex-shrink:\x200;\x0a}\x0a\x0a/*\x20──\x20Animations\x20──────────────────────────────────────────────\x20*/\x0a@keyframes\x20dm-hue\x20{\x0a\x20\x20from\x20{\x20filter:\x20hue-rotate(0deg);\x20}\x0a\x20\x20to\x20\x20\x20{\x20filter:\x20hue-rotate(360deg);\x20}\x0a}\x0a@keyframes\x20dm-pulse\x20{\x0a\x20\x200%,\x20100%\x20{\x20transform:\x20scale(1);\x20}\x0a\x20\x2050%\x20\x20\x20\x20\x20\x20\x20{\x20transform:\x20scale(1.12);\x20}\x0a}\x0a@keyframes\x20dm-ring-pulse\x20{\x0a\x20\x200%,\x20100%\x20{\x20opacity:\x20.3;\x20transform:\x20scale(1);\x20}\x0a\x20\x2050%\x20\x20\x20\x20\x20\x20\x20{\x20opacity:\x20.7;\x20transform:\x20scale(1.1);\x20}\x0a}\x0a@keyframes\x20dm-shimmer\x20{\x0a\x20\x20from\x20{\x20transform:\x20translateX(-100%);\x20}\x0a\x20\x20to\x20\x20\x20{\x20transform:\x20translateX(300%);\x20}\x0a}\x0a@keyframes\x20dm-spin\x20{\x0a\x20\x20from\x20{\x20transform:\x20rotate(0deg);\x20}\x0a\x20\x20to\x20\x20\x20{\x20transform:\x20rotate(360deg);\x20}\x0a}\x0a.dm-spin\x20{\x0a\x20\x20display:\x20inline-block;\x0a\x20\x20animation:\x20dm-spin\x201s\x20linear\x20infinite;\x0a}\x0a'};function _0x7cc5(){const _0x477334=['Kitchen','Insert\x20into\x20\x22','fts','cafe','Building\x20Scalable\x20APIs\x20with\x20Node.js','_tick','Amsterdam','Imperial','onDone','Coordinator','New\x20York','Dog','City','geo','Table','Village','shipped','max','Great\x20article!\x20Really\x20helped\x20me\x20understand\x20the\x20concept.','Henry','Works','auth','medium','blog','Kubernetes','price','Melbourne','okdb','Photography','Design','Lab','Tara','Places','color-mix(in\x20srgb,\x20var(--okdb-accent)\x2020%,\x20transparent)','Vega','Research','News','var(--okdb-success)','Camera','Edge','Espresso','share','Performance\x20Audit','Analyst','Tags','Toronto','Create\x20environment\x20\x22','Director','idx:','Database\x20Indexing\x20Deep\x20Dive','Yusuf','Jack','\x20is\x20engineered\x20for\x20peak\x20performance\x20and\x20everyday\x20reliability.\x20Features\x20premium\x20materials\x20and\x20an\x20intuitive\x20design.','Tipsy','types','hotel','Store','Lion','Green\x20Software\x20Engineering\x20Principles','values','/index/','catch','senior','on-hold','generating','\x20specialist\x20with\x20','Vintage','Index\x20','Pro','Would\x20love\x20to\x20see\x20a\x20follow-up\x20article\x20on\x20this\x20topic.','application/json','Posts,\x20authors\x20&\x20comments','completed','Owen','Architect','Thanks\x20for\x20sharing\x20this.\x20Very\x20insightful.','description','low','Books','Evans','Hotel','SKU-','Safari','country','Indie','reddit.com','login','/pricing','typescript','Suites','defaultCount','Bean','Getting\x20Started\x20with\x20Modern\x20Web\x20Development','Cape\x20Town','Golden','Lux','authorId','var(--okdb-accent)','Cat','/login','tutorial','Designer','typeCounts','Brown','A\x20Practical\x20Guide\x20to\x20','role','Vienna','Loft','critical','lon','Collective','Quinn','Tokyo','$attr','7BIztOF','Pageviews','totalRecords','split','Flex','General','Would\x20recommend\x20to\x20friends.','Lazy','projects','Carter','node','prod','Might\x20return\x20it.','Craft','Iron','device','Market','Harbor','Design\x20System','Health','docker','rating','Coffee','Morning','toLocaleString','modal','Nano','Apex','Backend','318322HxviTD','Leadership','Red','Data\x20Science','Foster','Huge','env','Shop','now','Botanical','Hub','google.com','Blend','\x22\x20failed','Great\x20quality','CI/CD\x20Overhaul','Artisan','Brew','Space','user','Fresh','step','Consultant','\x20Place','A\x20perfect\x20spot\x20for\x20a\x20relaxed\x20afternoon.','Turbo','content','customers','43213nRMUco','checkins','Local','Tech\x20worker\x20who\x20spends\x20weekends\x20hiking\x20and\x20discovering\x20hidden\x20restaurant\x20gems.','bar','type:','3vTwHLu','Peak','completedSteps','place','Nothing\x20groundbreaking\x20but\x20solid\x20and\x20reliable.','Hidden\x20gem\x20tucked\x20away\x20in\x20the\x20heart\x20of\x20the\x20city\x20—\x20loved\x20by\x20locals\x20and\x20visitors\x20alike.','Excellent\x20value','Partner\x20API','Remote\x20worker\x20building\x20a\x20list\x20of\x20the\x20world\x27s\x20best\x20coworking-friendly\x20cafes.','/contact','/settings','reviews','Tutorial','Eagle','react','places','Dock','Mixed\x20feelings\x20overall.','\x22\x20on\x20','Tiny','Headphones','Dubai','close','stringify','reliability','databases','orders','director','Customer\x20Portal','toISOString','Billing\x20Integration','tier','Top\x2010\x20UX\x20Patterns\x20for\x20Mobile\x20Apps','color-mix(in\x20srgb,\x20var(--okdb-orange)\x2020%,\x20transparent)','3142216wLTkjD','Open','Data\x20Pipeline','Business','Node.js','Victor','Black','Mobile','products','Bear','Just\x20implemented\x20this\x20—\x20worked\x20perfectly!','Register\x20type:\x20','$ok','Departments','Electronics','_start','gold','Mumbai','Local\x20guide\x20and\x20travel\x20blogger\x20sharing\x20the\x20best\x20spots\x20in\x20every\x20city\x20I\x20visit.','people','icloud.com','Deep\x20Dive\x20into\x20Machine\x20Learning\x20Basics','Stone','Nice\x20vibes\x20but\x20gets\x20a\x20bit\x20crowded\x20on\x20weekends.','security','Move','events','📍\x20Geo\x20index','Olivia','Lead','Deli','UrbanGear','mobile','Ultra','Berlin','Security','Contemporary\x20Art','placeId','demo-blog','Router','City\x20Explorer','Lamp','Carol','shop','API','Monitor','Notification\x20System','Palazzo','Force','Harbour','\x0a<div\x20class=\x22dm\x22>\x0a\x0a\x20\x20<!--\x20══\x20STEP:\x20Choose\x20preset\x20══════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22step\x20===\x20\x27choose\x27\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22dm-hero\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-hero__sparkle\x22>✦</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-hero__title\x22>Generate\x20Demo\x20Environment</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-hero__sub\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Choose\x20a\x20preset\x20to\x20instantly\x20fill\x20a\x20new\x20environment\x20with\x20realistic\x20data,\x0a\x20\x20\x20\x20\x20\x20\x20\x20indexes,\x20and\x20full-text\x20search\x20—\x20ready\x20to\x20explore\x20in\x20seconds.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22dm-presets\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20as=\x22repeat\x22\x20:of=\x22PRESETS\x22\x20let:item=\x22p\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dm-preset\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22p.badge\x20===\x20\x27geo\x27\x20?\x20\x27dm-preset--geo\x27\x20:\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22selectPreset(p)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22\x27--pc:\x27\x20+\x20p.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20p.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-preset__bg\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-preset__icon\x22>{{\x20p.icon\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-preset__name\x22>{{\x20p.name\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-preset__tag\x22>{{\x20p.tagline\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-preset__chips\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20p.types.length\x20}}\x20types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-chip-dot\x22>·</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>{{\x20p.types.reduce((s,t)=>s+t.defaultCount,0).toLocaleString()\x20}}+\x20records</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.fts.length\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-chip-dot\x22>·</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>FTS</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.badge\x20===\x20\x27geo\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-chip-dot\x22>·</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22color:var(--pc);\x20font-weight:600;\x22>📍\x20GEO</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-preset__arrow\x22>→</div>\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20<div\x20class=\x22dm-footer\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancel()\x22>Cancel</button>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20══\x20STEP:\x20Configure\x20══════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22step\x20===\x20\x27configure\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:18px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22back()\x22\x20class=\x22dm-back-btn\x22\x20title=\x22Back\x20to\x20presets\x22>←</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-preset-badge\x22\x20:style=\x22\x27--pc:\x27\x20+\x20preset.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20preset.icon\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:700;\x20font-size:15px;\x22>{{\x20preset.name\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x20font-size:12px;\x22>·\x20Configure</span>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Env\x20name\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:5px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22font-size:12px;\x20opacity:.55;\x20letter-spacing:.03em;\x22>Environment\x20name</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22text\x22\x20:value=\x22envName\x22\x20@input=\x22envName\x20=\x20$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-family:monospace;\x20font-size:13px;\x22\x20autofocus\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20placeholder=\x22e.g.\x20demo-shop\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Scale\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22font-size:12px;\x20opacity:.55;\x20letter-spacing:.03em;\x22>Dataset\x20scale</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:6px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<button\x20as=\x22repeat\x22\x20:of=\x22SCALE_OPTIONS\x22\x20let:item=\x22s\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22scale\x20=\x20s.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dm-scale-btn\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22scale\x20===\x20s.value\x20?\x20\x27dm-scale-btn--active\x27\x20:\x20\x27\x27\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22scale\x20===\x20s.value\x20?\x20\x27--pc:\x27\x20+\x20preset.color\x20:\x20\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20s.label\x20}} <span\x20style=\x22font-size:10px;\x20opacity:.55;\x22>{{\x20s.hint\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Type\x20counts\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:5px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22font-size:12px;\x20opacity:.55;\x20letter-spacing:.03em;\x22>Types\x20&\x20counts</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-type-table\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20as=\x22repeat\x22\x20:of=\x22preset.types\x22\x20let:item=\x22t\x22\x20class=\x22dm-type-row\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-type-row__name\x22>{{\x20t.key\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-type-row__bar-wrap\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-type-row__bar\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22\x27width:\x27\x20+\x20Math.min(100,\x20Math.round((typeCounts[t.key]\x20??\x20t.defaultCount)\x20*\x20scale\x20/\x20(t.defaultCount\x20*\x204)\x20*\x20100))\x20+\x20\x27%;\x20background:\x27\x20+\x20preset.color\x20+\x20\x2755;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-type-row__count\x22\x20:style=\x22\x27color:\x27\x20+\x20preset.color\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{{\x20Math.max(1,\x20Math.round((typeCounts[t.key]\x20??\x20t.defaultCount)\x20*\x20scale)).toLocaleString()\x20}}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Options\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:20px;\x20flex-wrap:wrap;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dm-check-label\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22enableIndexes\x22\x20@change=\x22enableIndexes\x20=\x20$el.checked\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Indexes\x20<span\x20style=\x22opacity:.4;\x20font-size:11px;\x22>({{\x20preset.indexes.length\x20}})</span></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<label\x20class=\x22dm-check-label\x22\x20:style=\x22!preset.fts.length\x20?\x20\x27opacity:.4;\x20pointer-events:none;\x27\x20:\x20\x27\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x20type=\x22checkbox\x22\x20:checked=\x22enableFts\x22\x20@change=\x22enableFts\x20=\x20$el.checked\x22\x20:disabled=\x22!preset.fts.length\x22\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span>Full-text\x20search\x20<span\x20style=\x22opacity:.4;\x20font-size:11px;\x22>({{\x20preset.fts.length\x20}})</span></span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Summary\x20pill\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-summary\x22\x20:style=\x22\x27border-color:\x27\x20+\x20preset.color\x20+\x20\x2733;\x20background:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.7;\x22>Will\x20create</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<b\x20:style=\x22\x27color:\x27\x20+\x20preset.color\x20+\x20\x27;\x27\x22>{{\x20totalRecords.toLocaleString()\x20}}</b>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.7;\x22>records\x20across</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<b>{{\x20preset.types.length\x20}}</b>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.7;\x22>types</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22enableIndexes\x20&&\x20preset.indexes.length\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x22>·</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<b\x20style=\x22color:var(--okdb-purple);\x22>{{\x20preset.indexes.length\x20}}</b>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.7;\x22>indexes</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22enableFts\x20&&\x20preset.fts.length\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x22>·</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<b\x20style=\x22color:var(--okdb-accent);\x22>FTS</b>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22opacity:.4;\x22>→</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<b\x20style=\x22font-family:monospace;\x20font-size:12px;\x22>{{\x20envName\x20||\x20\x27…\x27\x20}}</b>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-footer\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancel()\x22>Cancel</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22dm-gen-btn\x22\x20:disabled=\x22!envName.trim()\x22\x20@click=\x22start()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22\x27--pc:\x27\x20+\x20preset.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20✦\x20Generate\x20{{\x20totalRecords.toLocaleString()\x20}}\x20records\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20══\x20STEP:\x20Generating\x20═════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22step\x20===\x20\x27generating\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:14px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Header\x20/\x20overall\x20progress\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-gen-header\x22\x20:style=\x22\x27--pc:\x27\x20+\x20preset.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:10px;\x20margin-bottom:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-pulsing-icon\x22>{{\x20preset.icon\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-weight:600;\x20font-size:14px;\x22>Generating\x20{{\x20preset.name\x20}}\x20data…</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22margin-left:auto;\x20font-family:monospace;\x20font-size:13px;\x20opacity:.55;\x22>{{\x20progressPct\x20}}%</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-progress-track\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-progress-fill\x20dm-progress-fill--shimmer\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22\x27width:\x27\x20+\x20progressPct\x20+\x20\x27%;\x20background:\x27\x20+\x20preset.color\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<!--\x20Per-step\x20rows\x20-->\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-steps\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20as=\x22repeat\x22\x20:of=\x22progress\x22\x20let:item=\x22p\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20class=\x22dm-step\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:class=\x22\x27dm-step--\x27\x20+\x20p.status\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-step__icon\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.status\x20===\x20\x27running\x27\x22><span\x20class=\x22dm-spin\x22>◌</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.status\x20===\x20\x27done\x27\x22>✓</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.status\x20===\x20\x27error\x27\x22>✗</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.status\x20===\x20\x27pending\x27\x22>{{\x20p.icon\x20}}</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-step__label\x22>{{\x20p.label\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.total\x20>\x201\x20&&\x20p.status\x20!==\x20\x27pending\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-step__count\x22>{{\x20p.done.toLocaleString()\x20}}\x20/\x20{{\x20p.total.toLocaleString()\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22p.total\x20>\x201\x20&&\x20p.status\x20===\x20\x27running\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-step__mini-bar\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-step__mini-fill\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22\x27width:\x27\x20+\x20(p.total\x20?\x20Math.round(p.done/p.total*100)\x20:\x200)\x20+\x20\x27%;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-error\x22>✗\x20{{\x20error\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-footer\x22><button\x20@click=\x22cancel()\x22>Close</button></div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20══\x20STEP:\x20Done\x20═══════════════════════════════════════════════════════════\x20-->\x0a\x20\x20<if\x20:=\x22step\x20===\x20\x27done\x27\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20align-items:center;\x20gap:22px;\x20padding:12px\x200\x206px;\x22>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-done-orb\x22\x20:style=\x22\x27--pc:\x27\x20+\x20preset.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22dm-done-orb__icon\x22>{{\x20preset.icon\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-done-orb__ring\x20dm-done-orb__ring--1\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-done-orb__ring\x20dm-done-orb__ring--2\x22></div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22text-align:center;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:22px;\x20font-weight:700;\x20margin-bottom:8px;\x22>Environment\x20Ready!</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:13px;\x20font-family:monospace;\x20opacity:.5;\x20letter-spacing:.05em;\x22>{{\x20resultStats?.env\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-done-stats\x22\x20:style=\x22\x27--pc:\x27\x20+\x20preset.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__val\x22\x20style=\x22color:var(--okdb-success);\x22>{{\x20resultStats?.totalRecords?.toLocaleString()\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__lbl\x22>Records</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat-divider\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__val\x22\x20style=\x22color:var(--okdb-purple);\x22>{{\x20Object.keys(resultStats?.types\x20??\x20{}).length\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__lbl\x22>Types</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat-divider\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__val\x22\x20style=\x22color:var(--okdb-accent);\x22>{{\x20resultStats?.indexes\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__lbl\x22>Indexes</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22resultStats?.fts\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat-divider\x22></div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__val\x22\x20style=\x22color:var(--okdb-warning);\x22>{{\x20resultStats?.fts\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22dm-stat__lbl\x22>FTS</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20gap:10px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20@click=\x22cancel()\x22>Close</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20class=\x22dm-gen-btn\x22\x20@click=\x22openEnv()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22\x27--pc:\x27\x20+\x20preset.color\x20+\x20\x27;\x20--pg:\x27\x20+\x20preset.glow\x20+\x20\x27;\x27\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Open\x20Environment\x20→\x0a\x20\x20\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a</div>','Highly\x20rated\x20local\x20favourite\x20with\x20excellent\x20reviews\x20and\x20a\x20warm,\x20welcoming\x20atmosphere.','Silver','Events,\x20sessions\x20&\x20pageviews','direct','Python','Opinion','Could\x20you\x20elaborate\x20more\x20on\x20the\x20second\x20point?','label','Copper','put','location','lead','Power','Core','Award-winning\x20venue\x20celebrating\x20local\x20culture,\x20craft\x20and\x20genuine\x20creativity.','sess','Great\x20atmosphere\x20and\x20incredibly\x20friendly\x20staff.','Good\x20value\x20for\x20the\x20quality\x20of\x20the\x20experience.','West','Max','proj','Lucky','processing','Barcelona','Cloud','toLowerCase','aws','Comments','career','Night\x20owl\x20and\x20cocktail\x20connoisseur\x20—\x20on\x20a\x20mission\x20to\x20try\x20every\x20great\x20bar\x20in\x20town.','/about','Little','lat','Dark','David','Wake','demo-env-modal','\x20Park','Stumbled\x20in\x20by\x20chance\x20and\x20absolutely\x20loved\x20it.','Hidden','gym','Bob','/env/','key','push','Mastering\x20TypeScript\x20in\x202025','principal','pending','growth','platinum','Maritime\x20Heritage','open-source','twitter.com','Disappointed','/fts/','Active','park','junior','Sydney','quality','tools','ord','Brass','Vibe','Corner','Microservices\x20vs\x20Monolith:\x20When\x20to\x20Choose','Owl','This\x20is\x20exactly\x20what\x20I\x20was\x20looking\x20for!','Charger','\x20in\x20depth\x20—\x20with\x20practical\x20examples.','Highland','The\x20examples\x20were\x20very\x20clear.\x20Well\x20done!','culture','ecommerce','Modern\x20establishment\x20with\x20a\x20focus\x20on\x20quality\x20and\x20an\x20unforgettable\x20guest\x20experience.','Stylish\x20space\x20with\x20impeccable\x20service\x20and\x20an\x20Instagram-worthy\x20interior.','Green','yahoo.com','SQL','error','Club','preset','/docs','Products,\x20customers\x20&\x20orders','scroll','rev','Elite','Horse','TypeScript','cancelled','60664fKEJyH','selectEnv','Rust','length','page','E-Commerce','Sales','tag','1297554cCCSDH','choose','developer\x20productivity','color-mix(in\x20srgb,\x20var(--okdb-success)\x2020%,\x20transparent)','Posts','The\x20Ultimate\x20','Roast','Blue','category','done','Roberts','museum','Frontend','Register\x20type\x20\x22','team','devops','Specialist','Building\x20Real-time\x20Dashboards','_done','Products','DevOps','min','performance','Contemporary\x20space\x20blending\x20design,\x20sustainability\x20and\x20an\x20outstanding\x20experience.','analytics','San\x20Francisco','Content\x20Hub','posts','cust','Generation\x20failed','Apartments','Filter','/signup','indexes','Engineer','JavaScript','Smart','evt','Museum\x20of\x20','round','Database\x20Migration','725580MYwyaa','dept','css','Secure\x20by\x20Design:\x20API\x20Security\x20Patterns','Seoul','Sunset','person','level','seo','testing','4FEtFFf','Nelson','logout','progress','data:','Eco','Speaker','find','Projects','Understanding\x20Event-Driven\x20Architecture','Manager','outlook.com','Davis','One\x20of\x20my\x20absolute\x20favourites\x20in\x20the\x20city.','map','envName','Ibrahim','Studio','Grand','/type/','27MwJdEv','Hall','department','WebAssembly:\x20The\x20Next\x20Frontier','Garden','form_submit','API\x20Gateway','Singapore','Events','Load\x20Testing','Highly\x20recommend\x20to\x20anyone\x20visiting\x20the\x20area.','totalSteps','authors','Technology','\x20team\x20drives\x20innovation\x20and\x20','The\x20','Using\x20it\x20every\x20day.','Supply','Urban','Kate','Small','comments','hackernews.com','search','Platform\x20Rewrite','Den','tags','Office','Insert\x20','departments','desktop','Inn','home','\x20is\x20a\x20strategic\x20initiative\x20to\x20improve\x20','Lift','message','Developer\x20SDK','Decent\x20but\x20flawed','Not\x20worth\x20it','architecture','reduce','Zone','Large','stores','Goods','/blog','Great\x20first\x20visit,\x20already\x20planning\x20to\x20return.','\x20failed','City\x20History','Roasted','fields','Employees','restaurant','padStart','city','Internal\x20Tooling','emp','Co-op','Cup','Smith','London','POST','running','floor','json','reloadEnvs','Communication','Walsh','Yard','Heritage','published','_addStep','slice','Swift','Victoria','trim','_error','A\x20vibrant,\x20energetic\x20space\x20that\x20buzzes\x20with\x20life\x20from\x20morning\x20to\x20night.','Boutique','graphql','Analytics','delivered','customerId','Popular\x20spot\x20among\x20locals\x20for\x20its\x20relaxed\x20vibe\x20and\x20consistently\x20high\x20standards.','Sam','Press','Fit','Deep\x20Dive:\x20','sessionId','Paris','Rabbit','total','var(--okdb-purple)','type','The\x20Future\x20of\x20Distributed\x20Systems','Desk','demo-places','\x20across\x20the\x20organisation.','Young','Decent\x20but\x20has\x20some\x20issues.','Natural\x20History','pageview','Iconic\x20neighbourhood\x20institution\x20beloved\x20for\x20its\x20authenticity\x20and\x20character.','Why\x20','api','Stand','Furniture','Bookmarked.\x20Will\x20definitely\x20revisit\x20this\x20later.','Functional\x20Programming\x20in\x20JavaScript','Mouse','Lee','Product','Jolly','Figma','python','status','var(--okdb-warning)','var(--okdb-orange)','A\x20community\x20staple\x20for\x20years,\x20proudly\x20serving\x20residents\x20and\x20visitors\x20with\x20heart.','Liam','Iris','sessions','Employees,\x20departments\x20&\x20projects','Release\x20Automation','resultStats','Base','scale','Room','pageviews','mid','Makers','title','House','Sports','466065LkGMII','download','Taylor','signup','Toys','Admin\x20Console','name','Zhang','personId','FTS\x20\x22','Security\x20Hardening','The\x20Complete\x20Guide\x20to\x20Database\x20Optimization','Lodge','🗺️','Docker\x20and\x20Kubernetes:\x20A\x20Practical\x20Guide','Mia','Documentation\x20Site','/dashboard','employees','enableFts','Auth\x20Service','Modern\x20Art','Peter','Rome','from','Royal','A\x20must-visit\x20destination\x20known\x20for\x20quality,\x20character\x20and\x20outstanding\x20hospitality.','Urban\x20explorer\x20with\x20a\x20passion\x20for\x20hole-in-the-wall\x20spots\x20and\x20authentic\x20local\x20culture.','Rustic','proton.me','State\x20Management\x20in\x20Modern\x20Frontend'];_0x7cc5=function(){return _0x477334;};return _0x7cc5();}
|
|
1
|
+
function makePRNG(e){let n=(2654435769^e)>>>0||1;return()=>(n^=n<<13,n^=n>>>17,n^=n<<5,(n>>>0)/4294967296)}const pick=(e,n)=>e[Math.floor(n()*e.length)],rng=(e,n,t)=>Math.floor(t()*(n-e+1))+e,uid=(e,n)=>`${e}-${String(n).padStart(4,"0")}`,email=(e,n,t)=>`${e.toLowerCase()}.${n.toLowerCase()}${rng(1,99,t)}@${pick(["gmail.com","yahoo.com","outlook.com","proton.me","icloud.com"],t)}`,dateAgo=(e,n)=>new Date(Date.now()-864e5*rng(0,e,n)).toISOString().split("T")[0],dateFwd=(e,n)=>new Date(Date.now()+864e5*rng(1,e,n)).toISOString().split("T")[0],FIRST=["Alice","Bob","Carol","David","Emma","Frank","Grace","Henry","Iris","Jack","Kate","Liam","Mia","Noah","Olivia","Peter","Quinn","Rachel","Sam","Tara","Uma","Victor","Wendy","Yusuf","Zoe"],LAST=["Anderson","Brown","Carter","Davis","Evans","Foster","Green","Hall","Ibrahim","Jones","King","Lee","Martinez","Nelson","Owen","Parker","Quinn","Roberts","Smith","Taylor","Vega","Walsh","Young","Zhang"],CITIES=["New York","London","Berlin","Tokyo","Sydney","Toronto","Paris","Amsterdam","Singapore","Dubai","Seoul","São Paulo","Mumbai","Cape Town","Vienna"],COUNTRIES=["US","GB","DE","FR","JP","AU","CA","BR","IN","SG","NL","SE","ES","IT","MX"],DEVICES=["desktop","mobile","tablet"],PAGES=["/","/products","/about","/pricing","/blog","/contact","/signup","/login","/dashboard","/settings","/docs"],PROD_ADJ=["Ultra","Pro","Elite","Max","Smart","Nano","Eco","Premium","Turbo","Flex","Swift","Vibe"],PROD_NOUN=["Headphones","Keyboard","Monitor","Backpack","Chair","Desk","Lamp","Camera","Speaker","Tablet","Watch","Router","Charger","Mouse","Stand","Pod","Hub","Dock"],PROD_CAT=["Electronics","Furniture","Clothing","Sports","Books","Kitchen","Garden","Toys","Health","Office"],ORDER_STATUS=["pending","processing","shipped","delivered","cancelled"],DOMAINS=["gmail.com","yahoo.com","outlook.com"],CITY_CENTERS=[{name:"London",country:"GB",lat:51.5074,lon:-.1278},{name:"Paris",country:"FR",lat:48.8566,lon:2.3522},{name:"New York",country:"US",lat:40.7128,lon:-74.006},{name:"Tokyo",country:"JP",lat:35.6762,lon:139.6503},{name:"Sydney",country:"AU",lat:-33.8688,lon:151.2093},{name:"Berlin",country:"DE",lat:52.52,lon:13.405},{name:"San Francisco",country:"US",lat:37.7749,lon:-122.4194},{name:"Amsterdam",country:"NL",lat:52.3676,lon:4.9041},{name:"Singapore",country:"SG",lat:1.3521,lon:103.8198},{name:"Barcelona",country:"ES",lat:41.3851,lon:2.1734},{name:"Dubai",country:"AE",lat:25.2048,lon:55.2708},{name:"Toronto",country:"CA",lat:43.6532,lon:-79.3832},{name:"Rome",country:"IT",lat:41.9028,lon:12.4964},{name:"Melbourne",country:"AU",lat:-37.8136,lon:144.9631},{name:"Seoul",country:"KR",lat:37.5665,lon:126.978}],PLACE_CATS=["restaurant","bar","cafe","museum","park","hotel","gym","shop"],PLACE_ADJ=["Rustic","Golden","Silver","Blue","Red","Garden","Harbor","Urban","Artisan","Wild","Local","Velvet","Cozy","Vintage","Hidden","Royal","Grand","Little","Green","Stone"],PLACE_NOUN=["Kitchen","Bistro","Table","Grove","Terrace","Corner","Nook","Den","House","Yard","Quarter","Loft","Market","Square","Room","Yard"],BAR_ADJ=["Lazy","Black","Iron","Brass","Copper","Dark","Old","Rusty","Jolly","Silver","Tipsy","Lucky"],BAR_ANIMAL=["Fox","Dog","Horse","Cat","Bear","Wolf","Owl","Lion","Eagle","Crow","Rabbit","Stag"],CAFE_PRE=["Morning","Daily","Urban","Artisan","Fresh","Local","Roasted","Ground","Wake","Open","Little","Slow"],CAFE_SFX=["Coffee","Roast","Brew","Cup","Bean","Grind","Blend","Espresso","Press","Filter"],MUSEUM_SUB=["Natural History","Modern Art","Contemporary Art","Science & Technology","City History","Photography","Architecture & Design","Maritime Heritage","Living Culture"],PARK_ADJ_P=["Central","Victoria","Riverside","Botanical","Royal","Memorial","Sunset","Green","City","Harbour","Highland","West"],HOTEL_ADJ_H=["Grand","Royal","Imperial","Garden","Harbor","City","Skyline","Heritage","Boutique","Maison","Palazzo"],HOTEL_NOUN_H=["Hotel","Suites","Inn","Residence","Lodge","Place","House","Retreat","Apartments"],GYM_PRE=["Fit","Peak","Core","Power","Active","Move","Lift","Pulse","Force","Prime"],GYM_SFX=["Studio","Club","Zone","Hub","Lab","Base","Works","Space","Performance"],SHOP_ADJ=["General","Local","Corner","Village","Urban","Artisan","Indie","Craft","Makers"],SHOP_NOUN=["Store","Shop","Market","Deli","Co-op","Goods","Supply","Emporium","Collective"],PLACE_DESCS=["Highly rated local favourite with excellent reviews and a warm, welcoming atmosphere.","A must-visit destination known for quality, character and outstanding hospitality.","Hidden gem tucked away in the heart of the city — loved by locals and visitors alike.","Modern establishment with a focus on quality and an unforgettable guest experience.","A community staple for years, proudly serving residents and visitors with heart.","Award-winning venue celebrating local culture, craft and genuine creativity.","Stylish space with impeccable service and an Instagram-worthy interior.","Popular spot among locals for its relaxed vibe and consistently high standards.","A vibrant, energetic space that buzzes with life from morning to night.","Intimate and unpretentious — the kind of place that instantly feels like home.","Iconic neighbourhood institution beloved for its authenticity and character.","Contemporary space blending design, sustainability and an outstanding experience."],PERSON_BIOS=["Passionate foodie and amateur photographer exploring the city one café at a time.","Tech worker who spends weekends hiking and discovering hidden restaurant gems.","Architecture enthusiast and frequent museum-goer with a love for strong espresso.","Local guide and travel blogger sharing the best spots in every city I visit.","Fitness fanatic, craft beer lover and weekend market explorer.","Remote worker building a list of the world's best coworking-friendly cafes.","Night owl and cocktail connoisseur — on a mission to try every great bar in town.","Museum member, park runner and enthusiastic brunch-seeker on weekends.","Lifelong traveller collecting experiences, flavours and stories from around the globe.","Urban explorer with a passion for hole-in-the-wall spots and authentic local culture."],CHECKIN_NOTES=["Amazing experience, will definitely be back!","Great atmosphere and incredibly friendly staff.","Highly recommend to anyone visiting the area.","A perfect spot for a relaxed afternoon.","One of my absolute favourites in the city.","Nice vibes but gets a bit crowded on weekends.","Exactly what I needed today — no complaints.","Good value for the quality of the experience.","Nothing groundbreaking but solid and reliable.","Exceptional quality — genuinely exceeded expectations.","Stumbled in by chance and absolutely loved it.","Great first visit, already planning to return.",null,null,null];function _scatter(e,n,t){return{lat:Math.round(1e6*(e.lat+2*(t()-.5)*n))/1e6,lon:Math.round(1e6*(e.lon+2*(t()-.5)*n))/1e6}}function _placeName(e,n){switch(e){case"restaurant":return`The ${pick(PLACE_ADJ,n)} ${pick(PLACE_NOUN,n)}`;case"bar":return`The ${pick(BAR_ADJ,n)} ${pick(BAR_ANIMAL,n)}`;case"cafe":return`${pick(CAFE_PRE,n)} ${pick(CAFE_SFX,n)}`;case"museum":return`Museum of ${pick(MUSEUM_SUB,n)}`;case"park":return`${pick(PARK_ADJ_P,n)} Park`;case"hotel":return`The ${pick(HOTEL_ADJ_H,n)} ${pick(HOTEL_NOUN_H,n)}`;case"gym":return`${pick(GYM_PRE,n)} ${pick(GYM_SFX,n)}`;case"shop":return`The ${pick(SHOP_ADJ,n)} ${pick(SHOP_NOUN,n)}`;default:return`${pick(PLACE_ADJ,n)} Place`}}function generateCityExplorer(e,n){const t={};return t.places=Array.from({length:e.places},(e,t)=>{const a=pick(CITY_CENTERS,n),o=pick(PLACE_CATS,n);return{key:uid("place",t+1),value:{name:_placeName(o,n),category:o,city:a.name,country:a.country,location:_scatter(a,.035,n),rating:Math.round(rng(28,50,n))/10,reviewCount:rng(5,3e3,n),priceLevel:rng(1,4,n),description:pick(PLACE_DESCS,n),phone:`+${rng(1,99,n)} ${rng(100,999,n)}-${rng(1e3,9999,n)}`,openNow:n()>.3,verified:n()>.25,createdAt:dateAgo(730,n)}}}),t.people=Array.from({length:e.people},(e,t)=>{const a=pick(CITY_CENTERS,n),o=pick(FIRST,n),r=pick(LAST,n);return{key:uid("person",t+1),value:{name:`${o} ${r}`,email:email(o,r,n),city:a.name,country:a.country,home:_scatter(a,.055,n),bio:pick(PERSON_BIOS,n),interests:[...new Set([pick(PLACE_CATS,n),pick(PLACE_CATS,n),pick(PLACE_CATS,n)])],memberSince:dateAgo(1095,n),checkinsCount:rng(0,90,n)}}}),t.checkins=Array.from({length:e.checkins},(t,a)=>({key:uid("ci",a+1),value:{personId:uid("person",rng(1,e.people,n)),placeId:uid("place",rng(1,e.places,n)),rating:rng(1,5,n),note:pick(CHECKIN_NOTES,n),hasPhoto:n()>.58,timestamp:new Date(Date.now()-rng(0,31536e6,n)).toISOString()}})),t}const POST_TITLES=["Getting Started with Modern Web Development","The Complete Guide to Database Optimization","Building Scalable APIs with Node.js","Understanding Event-Driven Architecture","Top 10 UX Patterns for Mobile Apps","Deep Dive into Machine Learning Basics","Docker and Kubernetes: A Practical Guide","Functional Programming in JavaScript","The Future of Distributed Systems","Mastering TypeScript in 2025","Building Real-time Dashboards","Microservices vs Monolith: When to Choose","GraphQL Best Practices for Production","State Management in Modern Frontend","Observability and Monitoring at Scale","Secure by Design: API Security Patterns","WebAssembly: The Next Frontier","Green Software Engineering Principles","AI-Assisted Development Workflows","Database Indexing Deep Dive"],TAG_NAMES=["javascript","react","node","css","typescript","python","docker","aws","graphql","ux","design","databases","security","mobile","devops","architecture","testing","performance","accessibility","seo","analytics","api","open-source","career","tools","tutorial","beginner","advanced"],POST_CATS=["Technology","Design","Business","Tutorial","Opinion","News","Research"],COMMENT_BODIES=["Great article! Really helped me understand the concept.","Thanks for sharing this. Very insightful.","Could you elaborate more on the second point?","This is exactly what I was looking for!","Bookmarked. Will definitely revisit this later.","The examples were very clear. Well done!","I disagree with some points but overall great read.","Would love to see a follow-up article on this topic.","Just implemented this — worked perfectly!","Saved me hours of debugging. Thank you!"],EVT_TYPES=["pageview","click","scroll","form_submit","purchase","signup","login","logout","search","download","video_play","share"],REFERRERS=["google.com","twitter.com","github.com","direct","reddit.com","hackernews.com","linkedin.com"],ROLES=["Engineer","Designer","Manager","Analyst","Director","Lead","Coordinator","Specialist","Architect","Consultant"],DEPTS=["Engineering","Design","Product","Marketing","Sales","Operations","HR","Finance"],LEVELS=["junior","mid","senior","lead","principal","director"],SKILLS=["JavaScript","Python","React","Node.js","SQL","Docker","AWS","TypeScript","GraphQL","Kubernetes","Figma","Analytics","Leadership","Communication","Rust","Go","Swift","Kotlin"],PROJ_NAMES=["Platform Rewrite","Mobile App v2","API Gateway","Data Pipeline","Customer Portal","Analytics Dashboard","Auth Service","Notification System","Search Engine","Billing Integration","Admin Console","CI/CD Overhaul","Performance Audit","Security Hardening","Developer SDK","Internal Tooling","Database Migration","Load Testing","Documentation Site","Onboarding Flow","A/B Testing Framework","Design System","Release Automation","Partner API","Data Warehouse"],PROJ_STATUS=["planning","in-progress","review","completed","on-hold"];function generateEcommerce(e,n){const t={};return t.products=Array.from({length:e.products},(e,t)=>{const a=pick(PROD_ADJ,n),o=pick(PROD_NOUN,n);return{key:uid("prod",t+1),value:{name:`${a} ${o}`,category:pick(PROD_CAT,n),price:Math.round(100*(rng(5,999,n)+.99*n()))/100,stock:rng(0,500,n),rating:Math.round(rng(25,50,n))/10,reviewCount:rng(0,1200,n),description:`The ${a} ${o} is engineered for peak performance and everyday reliability. Features premium materials and an intuitive design.`,sku:`SKU-${rng(1e4,99999,n)}`,brand:pick(["TechCore","UrbanGear","Nomad","Apex","Lux"],n),createdAt:dateAgo(365,n)}}}),t.customers=Array.from({length:e.customers},(e,t)=>{const a=pick(FIRST,n),o=pick(LAST,n);return{key:uid("cust",t+1),value:{name:`${a} ${o}`,email:email(a,o,n),city:pick(CITIES,n),country:pick(COUNTRIES,n),tier:pick(["bronze","silver","gold","platinum"],n),totalOrders:rng(0,50,n),totalSpent:Math.round(100*rng(0,15e3,n))/100,joinDate:dateAgo(730,n),newsletter:n()>.4}}}),t.orders=Array.from({length:e.orders},(t,a)=>{const o=rng(1,5,n),r=Array.from({length:o},()=>{const t=Math.round(100*rng(5,499,n))/100,a=rng(1,4,n);return{productId:uid("prod",rng(1,e.products,n)),qty:a,price:t,total:Math.round(t*a*100)/100}});return{key:uid("ord",a+1),value:{customerId:uid("cust",rng(1,e.customers,n)),status:pick(ORDER_STATUS,n),items:r,subtotal:r.reduce((e,n)=>e+n.total,0),shipping:Math.round(100*rng(0,20,n))/100,total:r.reduce((e,n)=>e+n.total,0)+Math.round(100*rng(0,20,n))/100,createdAt:dateAgo(180,n),shippedAt:n()>.3?dateAgo(60,n):null,address:{city:pick(CITIES,n),country:pick(COUNTRIES,n)}}}}),t.reviews=Array.from({length:e.reviews},(t,a)=>{const o=rng(1,5,n);return{key:uid("rev",a+1),value:{productId:uid("prod",rng(1,e.products,n)),customerId:uid("cust",rng(1,e.customers,n)),stars:o,title:pick(o>=4?["Love it!","Great quality","Exactly as described","Highly recommend","Excellent value"]:["Disappointed","Not worth it","Expected more","Decent but flawed"],n),body:`${o>=4?"Really happy with this purchase.":"Decent but has some issues."} ${pick(["Would recommend to friends.","Using it every day.","Still testing it out.","Mixed feelings overall.","Might return it."],n)}`,verified:n()>.2,helpful:rng(0,200,n),createdAt:dateAgo(365,n)}}}),t}function generateAnalytics(e,n){const t={};return t.sessions=Array.from({length:e.sessions},(e,t)=>({key:uid("sess",t+1),value:{userId:n()>.35?uid("user",rng(1,500,n)):null,device:pick(DEVICES,n),country:pick(COUNTRIES,n),city:pick(CITIES,n),duration:rng(5,3600,n),pageCount:rng(1,30,n),bounced:n()<.38,browser:pick(["Chrome","Firefox","Safari","Edge","Arc"],n),startedAt:new Date(Date.now()-rng(0,2592e6,n)).toISOString()}})),t.events=Array.from({length:e.events},(t,a)=>({key:uid("evt",a+1),value:{type:pick(EVT_TYPES,n),sessionId:uid("sess",rng(1,e.sessions,n)),userId:n()>.35?uid("user",rng(1,500,n)):null,page:pick(PAGES,n),device:pick(DEVICES,n),country:pick(COUNTRIES,n),timestamp:new Date(Date.now()-rng(0,2592e6,n)).toISOString(),value:n()>.7?Math.round(100*rng(1,1e4,n))/100:null}})),t.pageviews=Array.from({length:e.pageviews},(t,a)=>({key:uid("pv",a+1),value:{page:pick(PAGES,n),sessionId:uid("sess",rng(1,e.sessions,n)),referrer:pick(REFERRERS,n),timeOnPage:rng(0,600,n),exitPage:n()>.7,timestamp:new Date(Date.now()-rng(0,2592e6,n)).toISOString()}})),t}function generateBlog(e,n){const t={};t.authors=Array.from({length:e.authors},(e,t)=>{const a=pick(FIRST,n),o=pick(LAST,n),r=pick(["Frontend","Backend","DevOps","Design","Data Science","Mobile","Security","Cloud"],n);return{key:uid("auth",t+1),value:{name:`${a} ${o}`,email:email(a,o,n),bio:`${a} is a ${r} specialist with ${rng(2,18,n)} years of experience building production systems.`,specialty:r,location:pick(CITIES,n),twitter:`@${a.toLowerCase()}${o.toLowerCase()}`,postCount:0}}});const a=Math.min(e.tags,TAG_NAMES.length);return t.tags=Array.from({length:a},(e,t)=>({key:uid("tag",t+1),value:{name:TAG_NAMES[t],count:rng(5,120,n),color:pick(["var(--okdb-accent)","var(--okdb-purple)","var(--okdb-success)","var(--okdb-warning)","var(--okdb-danger)"],n)}})),t.posts=Array.from({length:e.posts},(t,o)=>{const r=POST_TITLES[o%POST_TITLES.length],s=pick(["","","","Deep Dive: ","The Ultimate ","A Practical Guide to ","Why "],n),i=s?`${s}${r}`:r,l=n()>.25?"published":pick(["draft","archived"],n);return{key:uid("post",o+1),value:{title:i,slug:i.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),authorId:uid("auth",rng(1,e.authors,n)),category:pick(POST_CATS,n),status:l,tags:[...new Set([uid("tag",rng(1,a,n)),uid("tag",rng(1,a,n))])],content:"This article covers the essentials you need to know. We explore key concepts, practical examples, and real-world applications that you can apply immediately. Whether you're a beginner or an experienced professional, you'll find actionable insights here.",excerpt:`A comprehensive guide to understanding ${r.toLowerCase()} in depth — with practical examples.`,readTime:rng(2,22,n),views:rng(50,8e4,n),likes:rng(5,3e3,n),featured:n()>.85,publishedAt:"published"===l?dateAgo(400,n):null,createdAt:dateAgo(450,n)}}}),t.comments=Array.from({length:e.comments},(t,a)=>({key:uid("cmt",a+1),value:{postId:uid("post",rng(1,e.posts,n)),authorName:`${pick(FIRST,n)} ${pick(LAST,n)}`,email:`user${rng(1,9999,n)}@${pick(DOMAINS,n)}`,body:pick(COMMENT_BODIES,n),likes:rng(0,150,n),approved:n()>.1,createdAt:dateAgo(365,n)}})),t}function generateTeam(e,n){const t={},a=Array.from({length:e.departments},(e,n)=>uid("dept",n+1));return t.departments=a.map((e,t)=>({key:e,value:{name:DEPTS[t%DEPTS.length],head:"",headcount:rng(4,35,n),budget:rng(1e5,3e6,n),location:pick(CITIES,n),description:`The ${DEPTS[t%DEPTS.length]} team drives innovation and ${pick(["growth","quality","efficiency","culture"],n)} across the organisation.`}})),t.employees=Array.from({length:e.employees},(e,t)=>{const o=pick(FIRST,n),r=pick(LAST,n);return{key:uid("emp",t+1),value:{name:`${o} ${r}`,email:email(o,r,n),role:pick(ROLES,n),department:pick(a,n),level:pick(LEVELS,n),skills:[...new Set([pick(SKILLS,n),pick(SKILLS,n),pick(SKILLS,n)])],salary:rng(48e3,28e4,n),hireDate:dateAgo(1825,n),manager:t>0?uid("emp",rng(1,Math.max(1,t),n)):null,location:pick(CITIES,n),remote:n()>.45}}}),t.projects=Array.from({length:e.projects},(t,o)=>{const r=rng(2,8,n);return{key:uid("proj",o+1),value:{name:PROJ_NAMES[o%PROJ_NAMES.length],department:pick(a,n),status:pick(PROJ_STATUS,n),lead:uid("emp",rng(1,e.employees,n)),team:[...new Set(Array.from({length:r},()=>uid("emp",rng(1,e.employees,n))))],budget:rng(1e4,6e5,n),startDate:dateAgo(365,n),deadline:dateFwd(180,n),progress:rng(0,100,n),priority:pick(["low","medium","high","critical"],n),description:`${PROJ_NAMES[o%PROJ_NAMES.length]} is a strategic initiative to improve ${pick(["reliability","performance","user experience","developer productivity","security"],n)}.`}}}),t}const PRESETS=[{id:"ecommerce",icon:"🛒",name:"E-Commerce",tagline:"Products, customers & orders",color:"var(--okdb-success)",glow:"color-mix(in srgb, var(--okdb-success) 20%, transparent)",defaultEnv:"demo-shop",types:[{key:"products",label:"Products",defaultCount:250},{key:"customers",label:"Customers",defaultCount:100},{key:"orders",label:"Orders",defaultCount:500},{key:"reviews",label:"Reviews",defaultCount:300}],indexes:[["products","category"],["products","price"],["customers","city"],["customers","tier"],["orders","status"],["orders","customerId"]],fts:[{type:"products",name:"search",fields:["name","description"]}],generate:generateEcommerce},{id:"analytics",icon:"📊",name:"Analytics",tagline:"Events, sessions & pageviews",color:"var(--okdb-accent)",glow:"color-mix(in srgb, var(--okdb-accent) 20%, transparent)",defaultEnv:"demo-analytics",types:[{key:"events",label:"Events",defaultCount:1e3},{key:"sessions",label:"Sessions",defaultCount:200},{key:"pageviews",label:"Pageviews",defaultCount:2e3}],indexes:[["events","type"],["events","country"],["sessions","userId"],["sessions","device"],["pageviews","page"],["pageviews","sessionId"]],fts:[],generate:generateAnalytics},{id:"blog",icon:"📝",name:"Content Hub",tagline:"Posts, authors & comments",color:"var(--okdb-purple)",glow:"color-mix(in srgb, var(--okdb-purple) 20%, transparent)",defaultEnv:"demo-blog",types:[{key:"posts",label:"Posts",defaultCount:150},{key:"authors",label:"Authors",defaultCount:20},{key:"tags",label:"Tags",defaultCount:28},{key:"comments",label:"Comments",defaultCount:400}],indexes:[["posts","category"],["posts","authorId"],["posts","status"],["comments","postId"],["tags","count"]],fts:[{type:"posts",name:"search",fields:["title","content"]}],generate:generateBlog},{id:"team",icon:"👥",name:"Team Directory",tagline:"Employees, departments & projects",color:"var(--okdb-warning)",glow:"color-mix(in srgb, var(--okdb-warning) 20%, transparent)",defaultEnv:"demo-team",types:[{key:"employees",label:"Employees",defaultCount:80},{key:"departments",label:"Departments",defaultCount:8},{key:"projects",label:"Projects",defaultCount:30}],indexes:[["employees","department"],["employees","level"],["employees","location"],["projects","status"],["projects","department"]],fts:[{type:"employees",name:"search",fields:["name","role","skills"]}],generate:generateTeam},{id:"cityexplorer",icon:"🗺️",name:"City Explorer",tagline:"Geo-indexed places & people",color:"var(--okdb-orange)",glow:"color-mix(in srgb, var(--okdb-orange) 20%, transparent)",defaultEnv:"demo-places",badge:"geo",types:[{key:"places",label:"Places",defaultCount:200},{key:"people",label:"People",defaultCount:80},{key:"checkins",label:"Checkins",defaultCount:300}],indexes:[["places","location",{type:"geo",precision:7}],["places","category"],["places","city"],["places","rating"],["people","home",{type:"geo",precision:5}],["people","city"],["checkins","personId"],["checkins","placeId"]],fts:[{type:"places",name:"search",fields:["name","description"]}],generate:generateCityExplorer}],SCALE_OPTIONS=[{value:.25,label:"¼×",hint:"Tiny"},{value:.5,label:"½×",hint:"Small"},{value:1,label:"1×",hint:"Normal"},{value:2,label:"2×",hint:"Large"},{value:4,label:"4×",hint:"Huge"}],BATCH_SIZE=50;export default{tag:"demo-env-modal",attr:{modal:{},onDone:{}},context:e=>({step:"choose",preset:null,envName:"",scale:1,enableFts:!0,enableIndexes:!0,typeCounts:{},progress:[],totalSteps:0,completedSteps:0,error:null,resultStats:null,PRESETS:PRESETS,SCALE_OPTIONS:SCALE_OPTIONS,get effectiveCounts(){const e={};for(const n of this.preset?.types??[])e[n.key]=Math.max(1,Math.round((this.typeCounts[n.key]??n.defaultCount)*this.scale));return e},get totalRecords(){return Object.values(this.effectiveCounts).reduce((e,n)=>e+n,0)},get progressPct(){return this.totalSteps?Math.min(100,Math.round(this.completedSteps/this.totalSteps*100)):0},selectPreset(e){this.preset=e,this.envName=e.defaultEnv,this.typeCounts={};for(const n of e.types)this.typeCounts[n.key]=n.defaultCount;this.step="configure"},back(){"configure"===this.step&&(this.step="choose")},cancel(){e.$attr.modal.close()},_addStep(e,n,t,a){this.progress.push({id:e,label:n,done:0,total:t,icon:a,status:"pending"}),this.totalSteps++},_start(e){const n=this.progress.find(n=>n.id===e);n&&(n.status="running")},_done(e){const n=this.progress.find(n=>n.id===e);n&&(n.status="done",n.done=n.total,this.completedSteps++)},_error(e){const n=this.progress.find(n=>n.id===e);n&&(n.status="error",this.completedSteps++)},_tick(e,n){const t=this.progress.find(n=>n.id===e);t&&(t.done=n)},async start(){if("generating"===this.step)return;const e=this.envName.trim();if(!e||!this.preset)return;this.step="generating",this.progress=[],this.totalSteps=0,this.completedSteps=0,this.error=null,this.resultStats={env:e,types:{},indexes:0,fts:0,totalRecords:0};const n=this.preset,t=this.effectiveCounts,a=__ENV__.API,o=`${a}/env/${encodeURIComponent(e)}`;this._addStep("env",`Create environment "${e}"`,1,"🌐");for(const e of n.types)this._addStep(`type:${e.key}`,`Register type: ${e.key}`,1,"⬡");for(const e of n.types)this._addStep(`data:${e.key}`,`Insert ${t[e.key].toLocaleString()} ${e.label.toLowerCase()}`,t[e.key],"⬢");if(this.enableIndexes)for(const[e,t,a]of n.indexes){const n="geo"===a?.type;this._addStep(`idx:${e}:${t}`,`${n?"📍 Geo index":"Index"} ${e}.${t}`,1,n?"📍":"⌖")}if(this.enableFts&&n.fts.length)for(const e of n.fts)this._addStep(`fts:${e.type}:${e.name}`,`FTS "${e.name}" on ${e.type}`,1,"⌘");try{this._start("env");const r=await fetch(`${a}/envs`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:e,sync:!0,compression:!0})});if(!r.ok&&409!==r.status){const e=await r.json().catch(()=>({}));throw new Error(e?.error?.message||`Create env failed (${r.status})`)}this._done("env");for(const e of n.types){this._start(`type:${e.key}`);const n=await fetch(`${o}/type/${encodeURIComponent(e.key)}`,{method:"POST"});if(!n.ok&&409!==n.status){const t=await n.json().catch(()=>({}));throw new Error(t?.error?.message||`Register type "${e.key}" failed`)}this._done(`type:${e.key}`)}const s=makePRNG(2147483647&Date.now()),i=n.generate(t,s);for(const e of n.types){const n=`data:${e.key}`,t=i[e.key]??[];this._start(n);let a=0;for(let r=0;r<t.length;r+=50){const s=t.slice(r,r+50),i=s.map(({key:n,value:t})=>({action:"put",type:e.key,key:n,value:t})),l=await fetch(`${o}/transaction`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({operations:i})});if(!l.ok){const n=await l.json().catch(()=>({}));throw new Error(n?.error?.message||`Insert into "${e.key}" failed`)}a+=s.length,this._tick(n,a),await new Promise(e=>setTimeout(e,0))}this.resultStats.types[e.key]=t.length,this.resultStats.totalRecords+=t.length,this._done(n)}if(this.enableIndexes)for(const[e,t,a]of n.indexes){const n=`idx:${e}:${t}`;this._start(n);const r=await fetch(`${o}/type/${encodeURIComponent(e)}/index/${encodeURIComponent(t)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a||{})});if(!r.ok){const n=await r.json().catch(()=>({}));throw new Error(n?.error?.message||`Index ${e}.${t} failed`)}this.resultStats.indexes++,this._done(n)}if(this.enableFts)for(const e of n.fts){const n=`fts:${e.type}:${e.name}`;this._start(n),(await fetch(`${o}/type/${encodeURIComponent(e.type)}/fts/${encodeURIComponent(e.name)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({fields:e.fields})})).ok?(this.resultStats.fts++,this._done(n)):this._error(n)}this.step="done"}catch(e){this.error=e?.message||"Generation failed";for(const e of this.progress)"running"===e.status&&this._error(e.id)}},async openEnv(){const n=this.envName.trim();e.$ok.stores.okdb.selectEnv(n),await e.$ok.stores.okdb.reloadEnvs(),await e.$attr.modal.close(),await(e.$attr.onDone?.(n))}}),template:'\n<div class="dm">\n\n \x3c!-- ══ STEP: Choose preset ══════════════════════════════════════════════════ --\x3e\n <if :="step === \'choose\'">\n <div class="dm-hero">\n <div class="dm-hero__sparkle">✦</div>\n <div class="dm-hero__title">Generate Demo Environment</div>\n <div class="dm-hero__sub">\n Choose a preset to instantly fill a new environment with realistic data,\n indexes, and full-text search — ready to explore in seconds.\n </div>\n </div>\n\n <div class="dm-presets">\n <button as="repeat" :of="PRESETS" let:item="p"\n class="dm-preset"\n :class="p.badge === \'geo\' ? \'dm-preset--geo\' : \'\'"\n @click="selectPreset(p)"\n :style="\'--pc:\' + p.color + \'; --pg:\' + p.glow + \';\'">\n <div class="dm-preset__bg"></div>\n <div class="dm-preset__icon">{{ p.icon }}</div>\n <div class="dm-preset__name">{{ p.name }}</div>\n <div class="dm-preset__tag">{{ p.tagline }}</div>\n <div class="dm-preset__chips">\n <span>{{ p.types.length }} types</span>\n <span class="dm-chip-dot">·</span>\n <span>{{ p.types.reduce((s,t)=>s+t.defaultCount,0).toLocaleString() }}+ records</span>\n <if :="p.fts.length">\n <span class="dm-chip-dot">·</span>\n <span>FTS</span>\n </if>\n <if :="p.badge === \'geo\'">\n <span class="dm-chip-dot">·</span>\n <span style="color:var(--pc); font-weight:600;">📍 GEO</span>\n </if>\n </div>\n <div class="dm-preset__arrow">→</div>\n </button>\n </div>\n\n <div class="dm-footer">\n <button @click="cancel()">Cancel</button>\n </div>\n </if>\n\n \x3c!-- ══ STEP: Configure ══════════════════════════════════════════════════════ --\x3e\n <if :="step === \'configure\'">\n <div style="display:flex; flex-direction:column; gap:18px;">\n\n <div style="display:flex; align-items:center; gap:10px;">\n <button @click="back()" class="dm-back-btn" title="Back to presets">←</button>\n <span class="dm-preset-badge" :style="\'--pc:\' + preset.color + \'; --pg:\' + preset.glow + \';\'">\n {{ preset.icon }}\n </span>\n <span style="font-weight:700; font-size:15px;">{{ preset.name }}</span>\n <span style="opacity:.4; font-size:12px;">· Configure</span>\n </div>\n\n \x3c!-- Env name --\x3e\n <div style="display:flex; flex-direction:column; gap:5px;">\n <label style="font-size:12px; opacity:.55; letter-spacing:.03em;">Environment name</label>\n <input type="text" :value="envName" @input="envName = $el.value"\n style="font-family:monospace; font-size:13px;" autofocus\n placeholder="e.g. demo-shop" />\n </div>\n\n \x3c!-- Scale --\x3e\n <div style="display:flex; flex-direction:column; gap:8px;">\n <label style="font-size:12px; opacity:.55; letter-spacing:.03em;">Dataset scale</label>\n <div style="display:flex; gap:6px; flex-wrap:wrap;">\n <button as="repeat" :of="SCALE_OPTIONS" let:item="s"\n @click="scale = s.value"\n class="dm-scale-btn"\n :class="scale === s.value ? \'dm-scale-btn--active\' : \'\'"\n :style="scale === s.value ? \'--pc:\' + preset.color : \'\'">\n {{ s.label }} <span style="font-size:10px; opacity:.55;">{{ s.hint }}</span>\n </button>\n </div>\n </div>\n\n \x3c!-- Type counts --\x3e\n <div style="display:flex; flex-direction:column; gap:5px;">\n <label style="font-size:12px; opacity:.55; letter-spacing:.03em;">Types & counts</label>\n <div class="dm-type-table">\n <div as="repeat" :of="preset.types" let:item="t" class="dm-type-row">\n <span class="dm-type-row__name">{{ t.key }}</span>\n <div class="dm-type-row__bar-wrap">\n <div class="dm-type-row__bar"\n :style="\'width:\' + Math.min(100, Math.round((typeCounts[t.key] ?? t.defaultCount) * scale / (t.defaultCount * 4) * 100)) + \'%; background:\' + preset.color + \'55;\'">\n </div>\n </div>\n <span class="dm-type-row__count" :style="\'color:\' + preset.color + \';\'">\n {{ Math.max(1, Math.round((typeCounts[t.key] ?? t.defaultCount) * scale)).toLocaleString() }}\n </span>\n </div>\n </div>\n </div>\n\n \x3c!-- Options --\x3e\n <div style="display:flex; gap:20px; flex-wrap:wrap;">\n <label class="dm-check-label">\n <input type="checkbox" :checked="enableIndexes" @change="enableIndexes = $el.checked" />\n <span>Indexes <span style="opacity:.4; font-size:11px;">({{ preset.indexes.length }})</span></span>\n </label>\n <label class="dm-check-label" :style="!preset.fts.length ? \'opacity:.4; pointer-events:none;\' : \'\'">\n <input type="checkbox" :checked="enableFts" @change="enableFts = $el.checked" :disabled="!preset.fts.length" />\n <span>Full-text search <span style="opacity:.4; font-size:11px;">({{ preset.fts.length }})</span></span>\n </label>\n </div>\n\n \x3c!-- Summary pill --\x3e\n <div class="dm-summary" :style="\'border-color:\' + preset.color + \'33; background:\' + preset.glow + \';\'">\n <span style="opacity:.7;">Will create</span>\n <b :style="\'color:\' + preset.color + \';\'">{{ totalRecords.toLocaleString() }}</b>\n <span style="opacity:.7;">records across</span>\n <b>{{ preset.types.length }}</b>\n <span style="opacity:.7;">types</span>\n <if :="enableIndexes && preset.indexes.length">\n <span style="opacity:.4;">·</span>\n <b style="color:var(--okdb-purple);">{{ preset.indexes.length }}</b>\n <span style="opacity:.7;">indexes</span>\n </if>\n <if :="enableFts && preset.fts.length">\n <span style="opacity:.4;">·</span>\n <b style="color:var(--okdb-accent);">FTS</b>\n </if>\n <span style="opacity:.4;">→</span>\n <b style="font-family:monospace; font-size:12px;">{{ envName || \'…\' }}</b>\n </div>\n\n <div class="dm-footer">\n <button @click="cancel()">Cancel</button>\n <button class="dm-gen-btn" :disabled="!envName.trim()" @click="start()"\n :style="\'--pc:\' + preset.color + \'; --pg:\' + preset.glow + \';\'">\n ✦ Generate {{ totalRecords.toLocaleString() }} records\n </button>\n </div>\n </div>\n </if>\n\n \x3c!-- ══ STEP: Generating ═════════════════════════════════════════════════════ --\x3e\n <if :="step === \'generating\'">\n <div style="display:flex; flex-direction:column; gap:14px;">\n\n \x3c!-- Header / overall progress --\x3e\n <div class="dm-gen-header" :style="\'--pc:\' + preset.color + \'; --pg:\' + preset.glow + \';\'">\n <div style="display:flex; align-items:center; gap:10px; margin-bottom:12px;">\n <span class="dm-pulsing-icon">{{ preset.icon }}</span>\n <span style="font-weight:600; font-size:14px;">Generating {{ preset.name }} data…</span>\n <span style="margin-left:auto; font-family:monospace; font-size:13px; opacity:.55;">{{ progressPct }}%</span>\n </div>\n <div class="dm-progress-track">\n <div class="dm-progress-fill dm-progress-fill--shimmer"\n :style="\'width:\' + progressPct + \'%; background:\' + preset.color + \';\'">\n </div>\n </div>\n </div>\n\n \x3c!-- Per-step rows --\x3e\n <div class="dm-steps">\n <div as="repeat" :of="progress" let:item="p"\n class="dm-step"\n :class="\'dm-step--\' + p.status">\n <span class="dm-step__icon">\n <if :="p.status === \'running\'"><span class="dm-spin">◌</span></if>\n <if :="p.status === \'done\'">✓</if>\n <if :="p.status === \'error\'">✗</if>\n <if :="p.status === \'pending\'">{{ p.icon }}</if>\n </span>\n <span class="dm-step__label">{{ p.label }}</span>\n <if :="p.total > 1 && p.status !== \'pending\'">\n <span class="dm-step__count">{{ p.done.toLocaleString() }} / {{ p.total.toLocaleString() }}</span>\n </if>\n <if :="p.total > 1 && p.status === \'running\'">\n <div class="dm-step__mini-bar">\n <div class="dm-step__mini-fill"\n :style="\'width:\' + (p.total ? Math.round(p.done/p.total*100) : 0) + \'%;\'">\n </div>\n </div>\n </if>\n </div>\n </div>\n\n <if :="error">\n <div class="dm-error">✗ {{ error }}</div>\n <div class="dm-footer"><button @click="cancel()">Close</button></div>\n </if>\n\n </div>\n </if>\n\n \x3c!-- ══ STEP: Done ═══════════════════════════════════════════════════════════ --\x3e\n <if :="step === \'done\'">\n <div style="display:flex; flex-direction:column; align-items:center; gap:22px; padding:12px 0 6px;">\n\n <div class="dm-done-orb" :style="\'--pc:\' + preset.color + \'; --pg:\' + preset.glow + \';\'">\n <span class="dm-done-orb__icon">{{ preset.icon }}</span>\n <div class="dm-done-orb__ring dm-done-orb__ring--1"></div>\n <div class="dm-done-orb__ring dm-done-orb__ring--2"></div>\n </div>\n\n <div style="text-align:center;">\n <div style="font-size:22px; font-weight:700; margin-bottom:8px;">Environment Ready!</div>\n <div style="font-size:13px; font-family:monospace; opacity:.5; letter-spacing:.05em;">{{ resultStats?.env }}</div>\n </div>\n\n <div class="dm-done-stats" :style="\'--pc:\' + preset.color + \'; --pg:\' + preset.glow + \';\'">\n <div class="dm-stat">\n <div class="dm-stat__val" style="color:var(--okdb-success);">{{ resultStats?.totalRecords?.toLocaleString() }}</div>\n <div class="dm-stat__lbl">Records</div>\n </div>\n <div class="dm-stat-divider"></div>\n <div class="dm-stat">\n <div class="dm-stat__val" style="color:var(--okdb-purple);">{{ Object.keys(resultStats?.types ?? {}).length }}</div>\n <div class="dm-stat__lbl">Types</div>\n </div>\n <div class="dm-stat-divider"></div>\n <div class="dm-stat">\n <div class="dm-stat__val" style="color:var(--okdb-accent);">{{ resultStats?.indexes }}</div>\n <div class="dm-stat__lbl">Indexes</div>\n </div>\n <if :="resultStats?.fts > 0">\n <div class="dm-stat-divider"></div>\n <div class="dm-stat">\n <div class="dm-stat__val" style="color:var(--okdb-warning);">{{ resultStats?.fts }}</div>\n <div class="dm-stat__lbl">FTS</div>\n </div>\n </if>\n </div>\n\n <div style="display:flex; gap:10px;">\n <button @click="cancel()">Close</button>\n <button class="dm-gen-btn" @click="openEnv()"\n :style="\'--pc:\' + preset.color + \'; --pg:\' + preset.glow + \';\'">\n Open Environment →\n </button>\n </div>\n\n </div>\n </if>\n\n</div>',style:"\n/* ── Root ──────────────────────────────────────────────────── */\n.dm {\n min-width: 560px;\n max-width: 660px;\n}\n\n/* ── Hero ──────────────────────────────────────────────────── */\n.dm-hero {\n text-align: center;\n padding: 4px 0 18px;\n}\n.dm-hero__sparkle {\n font-size: 30px;\n margin-bottom: 10px;\n background: linear-gradient(135deg, var(--okdb-accent), var(--okdb-purple) 40%, var(--okdb-success) 75%, var(--okdb-warning));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n animation: dm-hue 6s linear infinite;\n display: inline-block;\n}\n.dm-hero__title {\n font-size: 20px;\n font-weight: 700;\n margin-bottom: 8px;\n background: linear-gradient(135deg, var(--okdb-app-fg), #ffffff);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n}\n.dm-hero__sub {\n font-size: 13px;\n opacity: .55;\n max-width: 400px;\n margin: 0 auto;\n line-height: 1.65;\n}\n\n/* ── Preset grid ───────────────────────────────────────────── */\n.dm-presets {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n padding: 4px 0 18px;\n}\n.dm-preset {\n position: relative;\n display: flex;\n flex-direction: column;\n gap: 5px;\n padding: 18px 18px 14px;\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-border);\n border-radius: 14px;\n cursor: pointer;\n text-align: left;\n overflow: hidden;\n transition: border-color .2s, transform .2s, box-shadow .2s;\n}\n/* City Explorer: spans both columns with a horizontal layout */\n.dm-preset--geo {\n grid-column: 1 / -1;\n flex-direction: row;\n align-items: center;\n gap: 16px;\n padding: 16px 20px;\n}\n.dm-preset--geo .dm-preset__icon {\n font-size: 32px;\n flex-shrink: 0;\n}\n.dm-preset--geo .dm-preset__name,\n.dm-preset--geo .dm-preset__tag,\n.dm-preset--geo .dm-preset__chips { }\n.dm-preset--geo .dm-preset__name { font-size: 16px; }\n.dm-preset--geo .dm-preset__arrow {\n margin-left: auto;\n position: static;\n font-size: 16px;\n opacity: .3;\n transition: opacity .2s, transform .2s;\n}\n.dm-preset--geo:hover .dm-preset__arrow { opacity: .9; transform: translateX(4px); }\n/* Geo pulse ring on the icon */\n.dm-preset--geo .dm-preset__icon::after {\n content: '';\n position: absolute;\n width: 48px;\n height: 48px;\n border-radius: 50%;\n border: 1px solid var(--pc, var(--okdb-orange));\n opacity: 0;\n animation: dm-geo-ring 2.5s ease-out infinite;\n}\n.dm-preset__bg {\n position: absolute;\n inset: 0;\n background: radial-gradient(circle at 25% 25%, var(--pg, transparent), transparent 65%);\n opacity: 0;\n transition: opacity .3s;\n pointer-events: none;\n}\n.dm-preset:hover {\n border-color: var(--pc, var(--okdb-accent));\n box-shadow: 0 0 0 1px var(--pc, var(--okdb-accent))33, 0 8px 28px var(--pg, transparent);\n transform: translateY(-2px);\n}\n.dm-preset--geo:hover { transform: translateY(-2px); }\n.dm-preset:hover .dm-preset__bg { opacity: 1; }\n.dm-preset__icon {\n font-size: 26px;\n line-height: 1;\n margin-bottom: 4px;\n filter: drop-shadow(0 0 8px var(--pc, #fff));\n position: relative;\n}\n.dm-preset__name {\n font-size: 15px;\n font-weight: 700;\n color: var(--pc, #fff);\n position: relative;\n}\n.dm-preset__tag {\n font-size: 12px;\n opacity: .5;\n line-height: 1.4;\n position: relative;\n}\n.dm-preset__chips {\n display: flex;\n gap: 5px;\n font-size: 11px;\n opacity: .45;\n margin-top: 5px;\n position: relative;\n flex-wrap: wrap;\n align-items: center;\n}\n.dm-chip-dot { opacity: .5; }\n.dm-preset__arrow {\n position: absolute;\n bottom: 14px;\n right: 16px;\n font-size: 14px;\n opacity: .2;\n transition: opacity .2s, transform .2s;\n}\n.dm-preset:not(.dm-preset--geo):hover .dm-preset__arrow { opacity: .8; transform: translateX(3px); }\n@keyframes dm-geo-ring {\n 0% { opacity: .6; transform: scale(.6); }\n 100% { opacity: 0; transform: scale(2.2); }\n}\n\n/* ── Back button ───────────────────────────────────────────── */\n.dm-back-btn {\n font-size: 16px;\n padding: 3px 10px;\n opacity: .5;\n border-radius: 6px;\n transition: opacity .15s;\n}\n.dm-back-btn:hover { opacity: 1; }\n\n/* ── Preset badge (configure step) ────────────────────────── */\n.dm-preset-badge {\n font-size: 22px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border-radius: 10px;\n background: var(--pg, var(--okdb-app-surface));\n border: 1px solid var(--pc, var(--okdb-app-border))33;\n filter: drop-shadow(0 0 8px var(--pc, transparent));\n}\n\n/* ── Scale buttons ─────────────────────────────────────────── */\n.dm-scale-btn {\n padding: 5px 12px;\n font-size: 12px;\n border-radius: 7px;\n border: 1px solid var(--okdb-app-border);\n transition: all .15s;\n}\n.dm-scale-btn--active {\n background: var(--pc, var(--okdb-accent))22 !important;\n border-color: var(--pc, var(--okdb-accent)) !important;\n color: var(--pc, var(--okdb-accent)) !important;\n font-weight: 600;\n}\n\n/* ── Type count table ──────────────────────────────────────── */\n.dm-type-table {\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-surface);\n border-radius: 9px;\n overflow: hidden;\n}\n.dm-type-row {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 14px;\n border-bottom: 1px solid var(--okdb-app-border);\n}\n.dm-type-row:last-child { border-bottom: none; }\n.dm-type-row__name {\n font-family: monospace;\n font-size: 12px;\n width: 90px;\n flex-shrink: 0;\n opacity: .8;\n}\n.dm-type-row__bar-wrap {\n flex: 1;\n height: 4px;\n background: var(--okdb-app-surface);\n border-radius: 2px;\n overflow: hidden;\n}\n.dm-type-row__bar {\n height: 100%;\n border-radius: 2px;\n transition: width .25s ease-out;\n min-width: 4px;\n}\n.dm-type-row__count {\n font-family: monospace;\n font-size: 12px;\n font-weight: 600;\n width: 70px;\n text-align: right;\n flex-shrink: 0;\n}\n\n/* ── Checkbox labels ───────────────────────────────────────── */\n.dm-check-label {\n display: flex;\n align-items: center;\n gap: 7px;\n cursor: pointer;\n font-size: 13px;\n user-select: none;\n}\n\n/* ── Summary pill ──────────────────────────────────────────── */\n.dm-summary {\n padding: 10px 14px;\n border-radius: 9px;\n border: 1px solid var(--okdb-app-border);\n font-size: 13px;\n display: flex;\n gap: 5px;\n align-items: center;\n flex-wrap: wrap;\n line-height: 1.6;\n}\n\n/* ── Generate button ───────────────────────────────────────── */\n.dm-gen-btn {\n background: var(--pg, color-mix(in srgb, var(--okdb-accent) 7%, transparent)) !important;\n border: 1px solid var(--pc, var(--okdb-accent)) !important;\n color: var(--pc, var(--okdb-accent)) !important;\n font-weight: 700;\n font-size: 13px;\n padding: 7px 20px;\n border-radius: 8px;\n transition: all .2s;\n letter-spacing: .01em;\n}\n.dm-gen-btn:hover:not(:disabled) {\n background: var(--pc, var(--okdb-accent))33 !important;\n box-shadow: 0 0 20px var(--pc, var(--okdb-accent))44;\n}\n.dm-gen-btn:disabled {\n opacity: .4;\n cursor: not-allowed;\n}\n\n/* ── Footer row ────────────────────────────────────────────── */\n.dm-footer {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n padding-top: 12px;\n border-top: 1px solid var(--okdb-app-surface);\n}\n\n/* ── Generation header ─────────────────────────────────────── */\n.dm-gen-header {\n padding: 14px 16px;\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--okdb-app-surface);\n border-radius: 10px;\n box-shadow: inset 0 0 40px var(--pg, transparent);\n}\n.dm-pulsing-icon {\n font-size: 20px;\n display: inline-block;\n animation: dm-pulse 1.5s ease-in-out infinite;\n filter: drop-shadow(0 0 6px var(--pc, transparent));\n}\n.dm-progress-track {\n height: 7px;\n background: var(--okdb-app-surface);\n border-radius: 4px;\n overflow: hidden;\n}\n.dm-progress-fill {\n height: 100%;\n border-radius: 4px;\n transition: width .35s ease-out;\n position: relative;\n}\n.dm-progress-fill--shimmer::after {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(90deg, transparent, rgba(255,255,255,.25), transparent);\n animation: dm-shimmer 1.5s linear infinite;\n}\n\n/* ── Step rows ─────────────────────────────────────────────── */\n.dm-steps {\n display: flex;\n flex-direction: column;\n gap: 2px;\n max-height: 320px;\n overflow-y: auto;\n padding-right: 4px;\n}\n.dm-step {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 7px 10px;\n border-radius: 7px;\n font-size: 12px;\n transition: background .1s;\n}\n.dm-step--pending { opacity: .32; }\n.dm-step--running { background: var(--okdb-app-surface); opacity: 1; }\n.dm-step--done { opacity: .6; }\n.dm-step--error { background: var(--okdb-danger-deep-bg); opacity: 1; }\n.dm-step__icon {\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n font-size: 12px;\n}\n.dm-step--done .dm-step__icon { color: var(--okdb-success); }\n.dm-step--running .dm-step__icon { color: var(--okdb-accent); }\n.dm-step--error .dm-step__icon { color: var(--okdb-danger); }\n.dm-step__label { flex: 1; }\n.dm-step__count {\n font-size: 11px;\n font-family: monospace;\n opacity: .5;\n flex-shrink: 0;\n}\n.dm-step__mini-bar {\n width: 70px;\n height: 3px;\n background: var(--okdb-app-surface);\n border-radius: 2px;\n overflow: hidden;\n flex-shrink: 0;\n}\n.dm-step__mini-fill {\n height: 100%;\n background: var(--okdb-accent);\n border-radius: 2px;\n transition: width .2s ease-out;\n}\n\n/* ── Error banner ──────────────────────────────────────────── */\n.dm-error {\n color: var(--okdb-danger);\n font-size: 13px;\n padding: 9px 13px;\n background: var(--okdb-danger-deep-bg);\n border: 1px solid color-mix(in srgb, var(--okdb-danger) 20%, transparent);\n border-radius: 7px;\n}\n\n/* ── Done orb ──────────────────────────────────────────────── */\n.dm-done-orb {\n position: relative;\n width: 96px;\n height: 96px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.dm-done-orb__icon {\n font-size: 40px;\n position: relative;\n z-index: 2;\n filter: drop-shadow(0 0 16px var(--pc, var(--okdb-accent)));\n animation: dm-pulse 2.5s ease-in-out infinite;\n}\n.dm-done-orb__ring {\n position: absolute;\n inset: 0;\n border-radius: 50%;\n border: 1px solid var(--pc, var(--okdb-accent));\n}\n.dm-done-orb__ring--1 {\n opacity: .4;\n animation: dm-ring-pulse 2s ease-in-out infinite;\n}\n.dm-done-orb__ring--2 {\n opacity: .2;\n animation: dm-ring-pulse 2s ease-in-out infinite .7s;\n transform: scale(1.3);\n}\n\n/* ── Done stats ────────────────────────────────────────────── */\n.dm-done-stats {\n display: flex;\n align-items: center;\n gap: 20px;\n padding: 16px 32px;\n background: var(--okdb-app-bg-deep);\n border: 1px solid var(--pc, var(--okdb-accent))33;\n border-radius: 14px;\n box-shadow: 0 0 30px var(--pg, transparent);\n}\n.dm-stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 5px;\n}\n.dm-stat__val {\n font-size: 28px;\n font-weight: 800;\n line-height: 1;\n letter-spacing: -.02em;\n}\n.dm-stat__lbl {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: .08em;\n opacity: .45;\n}\n.dm-stat-divider {\n width: 1px;\n height: 36px;\n background: var(--okdb-app-border);\n flex-shrink: 0;\n}\n\n/* ── Animations ────────────────────────────────────────────── */\n@keyframes dm-hue {\n from { filter: hue-rotate(0deg); }\n to { filter: hue-rotate(360deg); }\n}\n@keyframes dm-pulse {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.12); }\n}\n@keyframes dm-ring-pulse {\n 0%, 100% { opacity: .3; transform: scale(1); }\n 50% { opacity: .7; transform: scale(1.1); }\n}\n@keyframes dm-shimmer {\n from { transform: translateX(-100%); }\n to { transform: translateX(300%); }\n}\n@keyframes dm-spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n.dm-spin {\n display: inline-block;\n animation: dm-spin 1s linear infinite;\n}\n"};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x198f85=_0x1df0;(function(_0x3b65b4,_0xc67963){const _0x3be445=_0x1df0,_0x168fdf=_0x3b65b4();while(!![]){try{const _0x12e398=parseInt(_0x3be445(0xcb))/0x1+-parseInt(_0x3be445(0xbf))/0x2+-parseInt(_0x3be445(0xd4))/0x3*(-parseInt(_0x3be445(0xa7))/0x4)+-parseInt(_0x3be445(0xc5))/0x5+parseInt(_0x3be445(0xc7))/0x6+parseInt(_0x3be445(0xc2))/0x7*(parseInt(_0x3be445(0xd9))/0x8)+parseInt(_0x3be445(0xba))/0x9;if(_0x12e398===_0xc67963)break;else _0x168fdf['push'](_0x168fdf['shift']());}catch(_0x2a72d5){_0x168fdf['push'](_0x168fdf['shift']());}}}(_0xbec1,0x37d38));function _0x1df0(_0x5b052f,_0x11de99){_0x5b052f=_0x5b052f-0xa6;const _0xbec121=_0xbec1();let _0x1df0d4=_0xbec121[_0x5b052f];return _0x1df0d4;}export default{'tag':'remove-env-modal','attr':{'modal':{},'envName':{},'onDone':{}},'context':_0x1ee7d5=>({'busy':!0x1,'confirm':'','error':null,'warning':null,'envInfo':null,'infoLoading':!0x1,'keepSubEnvs':new Set(),get 'name'(){const _0x3e8a3d=_0x1df0;return _0x1ee7d5[_0x3e8a3d(0xab)][_0x3e8a3d(0xda)]||'';},get 'canRemove'(){const _0x9eb2df=_0x1df0;return this['confirm']===this[_0x9eb2df(0xc6)]&&!this[_0x9eb2df(0xb6)];},get 'subEnvs'(){const _0x11cfef=_0x1df0,_0xb0c4a9=_0x1ee7d5[_0x11cfef(0xb3)][_0x11cfef(0xa6)][_0x11cfef(0xc8)]['envs']||[],_0x27d08d=this['name'];return _0xb0c4a9[_0x11cfef(0xc0)](_0x406962=>_0x406962[_0x11cfef(0xc6)]!==_0x27d08d&&!_0x406962[_0x11cfef(0xad)]&&(_0x406962[_0x11cfef(0xd8)]===_0x27d08d||_0x406962[_0x11cfef(0xc6)][_0x11cfef(0xd2)]('~'+_0x27d08d+':')));},'isEmbEnv':_0x5271ea=>_0x5271ea['includes'](':emb:'),'subEnvLabel'(_0x4e677d){const _0x51f623=_0x1df0,_0x3a6a3d='~'+this[_0x51f623(0xc6)]+':';return _0x4e677d[_0x51f623(0xd2)](_0x3a6a3d)?_0x4e677d[_0x51f623(0xbe)](_0x3a6a3d['length']):_0x4e677d;},'toggleKeep'(_0x5b6bcc){const _0x15778e=_0x1df0,_0x2854af=new Set(this[_0x15778e(0xb0)]);_0x2854af[_0x15778e(0xb8)](_0x5b6bcc)?_0x2854af[_0x15778e(0xd7)](_0x5b6bcc):_0x2854af[_0x15778e(0xc4)](_0x5b6bcc),this[_0x15778e(0xb0)]=_0x2854af;},get 'typeCount'(){const _0x591344=_0x1df0;return Object[_0x591344(0xd3)](this[_0x591344(0xc1)]?.[_0x591344(0xbb)]??{})[_0x591344(0xd1)];},get 'recordCount'(){const _0x5b7fa7=_0x1df0;return Object[_0x5b7fa7(0xce)](this[_0x5b7fa7(0xc1)]?.[_0x5b7fa7(0xbb)]??{})[_0x5b7fa7(0xa9)]((_0x124b50,_0x5b8380)=>_0x124b50+(_0x5b8380[_0x5b7fa7(0xc3)]||0x0),0x0);},async 'loadInfo'(){const _0x541397=_0x1df0;this[_0x541397(0xb2)]=!0x0;try{const _0x3accc7=await fetch(__ENV__[_0x541397(0xb1)]+'/env/'+encodeURIComponent(this[_0x541397(0xc6)])+_0x541397(0xcc));_0x3accc7['ok']&&(this[_0x541397(0xc1)]=(await _0x3accc7['json']())[_0x541397(0xd0)]);}catch{}finally{this[_0x541397(0xb2)]=!0x1;}},async 'remove'(){const _0x444353=_0x1df0;if(this[_0x444353(0xac)]){this['busy']=!0x0,this[_0x444353(0xb7)]=null,this[_0x444353(0xbd)]=null;try{let _0x5ee7f0=__ENV__[_0x444353(0xb1)]+_0x444353(0xb9)+encodeURIComponent(this['name']);this[_0x444353(0xb0)][_0x444353(0xca)]>0x0&&(_0x5ee7f0+='?keepSubEnvs='+encodeURIComponent([...this[_0x444353(0xb0)]][_0x444353(0xd6)](',')));const _0x15b29e=await fetch(_0x5ee7f0,{'method':'DELETE'}),_0x5c644a=await _0x15b29e[_0x444353(0xb4)]()[_0x444353(0xa8)](()=>({}));if(!_0x15b29e['ok'])throw new Error(_0x5c644a?.[_0x444353(0xb7)]?.[_0x444353(0xdb)]||_0x15b29e[_0x444353(0xcd)]);const _0x4c67a0=_0x5c644a['data']??_0x5c644a;if(_0x4c67a0['warning']||_0x4c67a0[_0x444353(0xbc)]?.[_0x444353(0xd1)])return this[_0x444353(0xbd)]=_0x4c67a0[_0x444353(0xbd)]??_0x444353(0xcf)+_0x4c67a0[_0x444353(0xbc)]['join'](',\x20'),await _0x1ee7d5[_0x444353(0xab)]['onDone']?.(this[_0x444353(0xc6)],_0x4c67a0),void(this['busy']=!0x1);await _0x1ee7d5[_0x444353(0xab)][_0x444353(0xc9)]['close'](),await _0x1ee7d5[_0x444353(0xab)][_0x444353(0xd5)]?.(this[_0x444353(0xc6)],_0x4c67a0);}catch(_0x541166){this['error']=_0x541166?.['message']||_0x444353(0xae);}finally{this[_0x444353(0xb6)]=!0x1;}}},'cancel'(){const _0x1d0e48=_0x1df0;_0x1ee7d5['$attr'][_0x1d0e48(0xc9)][_0x1d0e48(0xb5)]();},'fmt':_0x5dec7a=>null==_0x5dec7a?'—':Number(_0x5dec7a)[_0x198f85(0xaa)]()}),'init'(){const _0x4ed0d1=_0x198f85;this[_0x4ed0d1(0xaf)]();},'template':'\x0a<div\x20style=\x22min-width:400px;\x20max-width:500px;\x20display:flex;\x20flex-direction:column;\x20gap:16px;\x22>\x0a\x0a\x20\x20<!--\x20──\x20Warning\x20banner\x20──\x20-->\x0a\x20\x20<div\x20style=\x22background:#1f1008;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-orange)\x2067%,\x20transparent);\x20border-radius:8px;\x20padding:12px\x2014px;\x20display:flex;\x20gap:10px;\x20align-items:flex-start;\x22>\x0a\x20\x20\x20\x20<span\x20style=\x22font-size:18px;\x20flex-shrink:0;\x20line-height:1.2;\x22>⚠️</span>\x0a\x20\x20\x20\x20<div\x20style=\x22font-size:13px;\x20line-height:1.6;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20color:var(--okdb-orange);\x20margin-bottom:3px;\x22>This\x20will\x20permanently\x20delete\x20the\x20environment.</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.75;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20The\x20LMDB\x20data\x20files\x20for\x20<b\x20style=\x22font-family:monospace;\x22>{{\x20name\x20}}</b>\x20will\x20be\x20removed\x20from\x20disk.\x0a\x20\x20\x20\x20\x20\x20\x20\x20This\x20cannot\x20be\x20undone.\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Env\x20stats\x20──\x20-->\x0a\x20\x20<div\x20style=\x22display:grid;\x20grid-template-columns:1fr\x201fr;\x20gap:8px;\x22>\x0a\x20\x20\x20\x20<div\x20class=\x22rem-stat\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22rem-stat__label\x22>Types</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22rem-stat__value\x22\x20style=\x22color:var(--okdb-purple);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22infoLoading\x22><span\x20style=\x22opacity:.4;\x22>…</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!infoLoading\x22>{{\x20fmt(typeCount)\x20}}</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20class=\x22rem-stat\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22rem-stat__label\x22>Total\x20Records</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20class=\x22rem-stat__value\x22\x20style=\x22color:var(--okdb-success);\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22infoLoading\x22><span\x20style=\x22opacity:.4;\x22>…</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!infoLoading\x22>{{\x20fmt(recordCount)\x20}}</if>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</div>\x0a\x0a\x20\x20<!--\x20──\x20Sub-envs\x20that\x20will\x20also\x20be\x20deleted\x20──\x20-->\x0a\x20\x20<if\x20:=\x22subEnvs.length\x20>\x200\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22background:#111820;\x20border:1px\x20solid\x20#1e3050;\x20border-radius:8px;\x20padding:10px\x2014px;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:11px;\x20text-transform:uppercase;\x20letter-spacing:.06em;\x20opacity:.45;\x20margin-bottom:8px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Related\x20databases\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<each\x20:of=\x22subEnvs\x22\x20let:item=\x22e\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20align-items:center;\x20gap:8px;\x20font-size:12px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<label\x20style=\x22display:flex;\x20align-items:center;\x20gap:6px;\x20cursor:pointer;\x20flex:1;\x20min-width:0;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20type=\x22checkbox\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20:checked=\x22!keepSubEnvs.has(e.name)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20@change=\x22toggleKeep(e.name)\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20style=\x22accent-color:var(--okdb-danger);\x20cursor:pointer;\x20flex-shrink:0;\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22font-family:monospace;\x20color:#7a9ab2;\x20overflow:hidden;\x20text-overflow:ellipsis;\x20white-space:nowrap;\x22>{{\x20subEnvLabel(e.name)\x20}}</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22isEmbEnv(e.name)\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex-shrink:0;\x20font-size:10px;\x20padding:1px\x205px;\x20border-radius:999px;\x20background:#4c1d95;\x20color:#c4b5fd;\x20border:1px\x20solid\x20#6d28d944;\x22>embeddings</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<span\x20style=\x22flex-shrink:0;\x20font-size:10px;\x20opacity:.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22keepSubEnvs.has(e.name)\x22>keep</if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<if\x20:=\x22!keepSubEnvs.has(e.name)\x22><span\x20style=\x22color:var(--okdb-danger);\x22>delete</span></if>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20</each>\x0a\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20<if\x20:=\x22keepSubEnvs.size\x20>\x200\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22margin-top:8px;\x20font-size:11px;\x20opacity:.5;\x20line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Kept\x20databases\x20will\x20become\x20orphaned\x20and\x20can\x20be\x20managed\x20or\x20dismissed\x20later.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20</if>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Locked\x20files\x20warning\x20(post-removal)\x20──\x20-->\x0a\x20\x20<if\x20:=\x22warning\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-warning);\x20font-size:12px;\x20padding:8px\x2012px;\x20background:#221c08;\x20border-radius:6px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-warning)\x2020%,\x20transparent);\x20line-height:1.5;\x22>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-weight:600;\x20margin-bottom:3px;\x22>⚠\x20Some\x20files\x20could\x20not\x20be\x20deleted</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.8;\x22>{{\x20warning\x20}}</div>\x0a\x20\x20\x20\x20\x20\x20<div\x20style=\x22opacity:.55;\x20margin-top:4px;\x20font-size:11px;\x22>These\x20files\x20may\x20be\x20locked\x20by\x20another\x20OKDB\x20process.\x20Stop\x20all\x20other\x20instances\x20and\x20delete\x20them\x20manually.</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Confirm\x20input\x20(hidden\x20after\x20warning\x20state)\x20──\x20-->\x0a\x20\x20<if\x20:=\x22!warning\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22display:flex;\x20flex-direction:column;\x20gap:6px;\x22>\x0a\x20\x20\x20\x20\x20\x20<label\x20style=\x22font-size:12px;\x20opacity:.6;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20Type\x20<code\x20style=\x22font-size:12px;\x20color:var(--okdb-orange);\x20background:#1f1008;\x20padding:1px\x205px;\x20border-radius:3px;\x22>{{\x20name\x20}}</code>\x20to\x20confirm\x0a\x20\x20\x20\x20\x20\x20</label>\x0a\x20\x20\x20\x20\x20\x20<input\x0a\x20\x20\x20\x20\x20\x20\x20\x20type=\x22text\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:placeholder=\x22name\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:value=\x22confirm\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20@input=\x22confirm\x20=\x20$el.value\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keydown.enter=\x22remove()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20autofocus\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22font-family:monospace;\x22\x0a\x20\x20\x20\x20\x20\x20/>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Error\x20──\x20-->\x0a\x20\x20<if\x20:=\x22error\x22>\x0a\x20\x20\x20\x20<div\x20style=\x22color:var(--okdb-danger);\x20font-size:13px;\x20padding:8px\x2012px;\x20background:var(--okdb-danger-deep-bg);\x20border-radius:6px;\x20border:1px\x20solid\x20color-mix(in\x20srgb,\x20var(--okdb-danger)\x2020%,\x20transparent);\x22>\x0a\x20\x20\x20\x20\x20\x20{{\x20error\x20}}\x0a\x20\x20\x20\x20</div>\x0a\x20\x20</if>\x0a\x0a\x20\x20<!--\x20──\x20Buttons\x20──\x20-->\x0a\x20\x20<div\x20style=\x22display:flex;\x20gap:8px;\x20justify-content:flex-end;\x20padding-top:4px;\x20border-top:1px\x20solid\x20var(--okdb-app-surface-2);\x22>\x0a\x20\x20\x20\x20<button\x20@click=\x22cancel()\x22\x20:disabled=\x22busy\x22>{{\x20warning\x20?\x20\x27Close\x27\x20:\x20\x27Cancel\x27\x20}}</button>\x0a\x20\x20\x20\x20<if\x20:=\x22!warning\x22>\x0a\x20\x20\x20\x20\x20\x20<button\x0a\x20\x20\x20\x20\x20\x20\x20\x20@click=\x22remove()\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:disabled=\x22!canRemove\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20style=\x22background:var(--okdb-danger-deep-border);\x20border-color:#991b1b;\x20color:var(--okdb-danger);\x22\x0a\x20\x20\x20\x20\x20\x20\x20\x20:style=\x22canRemove\x20?\x20\x27background:var(--okdb-danger-deep-border);\x20border-color:#b91c1c;\x20color:var(--okdb-danger);\x20cursor:pointer;\x27\x20:\x20\x27opacity:.4;\x20cursor:not-allowed;\x27\x22\x0a\x20\x20\x20\x20\x20\x20>\x0a\x20\x20\x20\x20\x20\x20\x20\x20{{\x20busy\x20?\x20\x27Removing…\x27\x20:\x20\x27🗑\x20Remove\x20Environment\x27\x20}}\x0a\x20\x20\x20\x20\x20\x20</button>\x0a\x20\x20\x20\x20</if>\x0a\x20\x20</div>\x0a\x0a</div>','style':'\x0a\x20\x20\x20\x20\x20\x20remove-env-modal\x20.rem-stat\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20background:\x20#13191f;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20#1e2d3c;\x0a\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2010px\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20flex-direction:\x20column;\x0a\x20\x20\x20\x20\x20\x20\x20\x20gap:\x204px;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20remove-env-modal\x20.rem-stat__label\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2010px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20text-transform:\x20uppercase;\x0a\x20\x20\x20\x20\x20\x20\x20\x20letter-spacing:\x20.06em;\x0a\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x20.45;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20remove-env-modal\x20.rem-stat__value\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2020px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20font-weight:\x20700;\x0a\x20\x20\x20\x20\x20\x20\x20\x20line-height:\x201;\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20'};function _0xbec1(){const _0x40cdc6=['Some\x20files\x20could\x20not\x20be\x20deleted\x20(may\x20be\x20locked):\x20','data','length','startsWith','keys','6QztMub','onDone','join','delete','parentEnv','272UQSvXh','envName','message','stores','413932TWYjTk','catch','reduce','toLocaleString','$attr','canRemove','orphaned','Failed\x20to\x20remove\x20environment','loadInfo','keepSubEnvs','API','infoLoading','$ok','json','close','busy','error','has','/env/','1160235JAjlHU','types','filesLocked','warning','slice','725692atYeiJ','filter','envInfo','40712LcWJnW','count','add','1309085NueiHT','name','706776klDMTn','okdb','modal','size','201906XoKsIx','/info','statusText','values'];_0xbec1=function(){return _0x40cdc6;};return _0xbec1();}
|
|
1
|
+
export default{tag:"remove-env-modal",attr:{modal:{},envName:{},onDone:{}},context:e=>({busy:!1,confirm:"",error:null,warning:null,envInfo:null,infoLoading:!1,keepSubEnvs:new Set,get name(){return e.$attr.envName||""},get canRemove(){return this.confirm===this.name&&!this.busy},get subEnvs(){const n=e.$ok.stores.okdb.envs||[],t=this.name;return n.filter(e=>e.name!==t&&!e.orphaned&&(e.parentEnv===t||e.name.startsWith("~"+t+":")))},isEmbEnv:e=>e.includes(":emb:"),subEnvLabel(e){const n="~"+this.name+":";return e.startsWith(n)?e.slice(n.length):e},toggleKeep(e){const n=new Set(this.keepSubEnvs);n.has(e)?n.delete(e):n.add(e),this.keepSubEnvs=n},get typeCount(){return Object.keys(this.envInfo?.types??{}).length},get recordCount(){return Object.values(this.envInfo?.types??{}).reduce((e,n)=>e+(n.count||0),0)},async loadInfo(){this.infoLoading=!0;try{const e=await fetch(`${__ENV__.API}/env/${encodeURIComponent(this.name)}/info`);e.ok&&(this.envInfo=(await e.json()).data)}catch{}finally{this.infoLoading=!1}},async remove(){if(this.canRemove){this.busy=!0,this.error=null,this.warning=null;try{let n=`${__ENV__.API}/env/${encodeURIComponent(this.name)}`;this.keepSubEnvs.size>0&&(n+="?keepSubEnvs="+encodeURIComponent([...this.keepSubEnvs].join(",")));const t=await fetch(n,{method:"DELETE"}),i=await t.json().catch(()=>({}));if(!t.ok)throw new Error(i?.error?.message||t.statusText);const o=i.data??i;if(o.warning||o.filesLocked?.length)return this.warning=o.warning??`Some files could not be deleted (may be locked): ${o.filesLocked.join(", ")}`,await(e.$attr.onDone?.(this.name,o)),void(this.busy=!1);await e.$attr.modal.close(),await(e.$attr.onDone?.(this.name,o))}catch(e){this.error=e?.message||"Failed to remove environment"}finally{this.busy=!1}}},cancel(){e.$attr.modal.close()},fmt:e=>null==e?"—":Number(e).toLocaleString()}),init(){this.loadInfo()},template:'\n<div style="min-width:400px; max-width:500px; display:flex; flex-direction:column; gap:16px;">\n\n \x3c!-- ── Warning banner ── --\x3e\n <div style="background:#1f1008; border:1px solid color-mix(in srgb, var(--okdb-orange) 67%, transparent); border-radius:8px; padding:12px 14px; display:flex; gap:10px; align-items:flex-start;">\n <span style="font-size:18px; flex-shrink:0; line-height:1.2;">⚠️</span>\n <div style="font-size:13px; line-height:1.6;">\n <div style="font-weight:600; color:var(--okdb-orange); margin-bottom:3px;">This will permanently delete the environment.</div>\n <div style="opacity:.75;">\n The LMDB data files for <b style="font-family:monospace;">{{ name }}</b> will be removed from disk.\n This cannot be undone.\n </div>\n </div>\n </div>\n\n \x3c!-- ── Env stats ── --\x3e\n <div style="display:grid; grid-template-columns:1fr 1fr; gap:8px;">\n <div class="rem-stat">\n <div class="rem-stat__label">Types</div>\n <div class="rem-stat__value" style="color:var(--okdb-purple);">\n <if :="infoLoading"><span style="opacity:.4;">…</span></if>\n <if :="!infoLoading">{{ fmt(typeCount) }}</if>\n </div>\n </div>\n <div class="rem-stat">\n <div class="rem-stat__label">Total Records</div>\n <div class="rem-stat__value" style="color:var(--okdb-success);">\n <if :="infoLoading"><span style="opacity:.4;">…</span></if>\n <if :="!infoLoading">{{ fmt(recordCount) }}</if>\n </div>\n </div>\n </div>\n\n \x3c!-- ── Sub-envs that will also be deleted ── --\x3e\n <if :="subEnvs.length > 0">\n <div style="background:#111820; border:1px solid #1e3050; border-radius:8px; padding:10px 14px;">\n <div style="font-size:11px; text-transform:uppercase; letter-spacing:.06em; opacity:.45; margin-bottom:8px;">\n Related databases\n </div>\n <div style="display:flex; flex-direction:column; gap:6px;">\n <each :of="subEnvs" let:item="e">\n <div style="display:flex; align-items:center; gap:8px; font-size:12px;">\n <label style="display:flex; align-items:center; gap:6px; cursor:pointer; flex:1; min-width:0;">\n <input\n type="checkbox"\n :checked="!keepSubEnvs.has(e.name)"\n @change="toggleKeep(e.name)"\n style="accent-color:var(--okdb-danger); cursor:pointer; flex-shrink:0;"\n />\n <span style="font-family:monospace; color:#7a9ab2; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;">{{ subEnvLabel(e.name) }}</span>\n <if :="isEmbEnv(e.name)">\n <span style="flex-shrink:0; font-size:10px; padding:1px 5px; border-radius:999px; background:#4c1d95; color:#c4b5fd; border:1px solid #6d28d944;">embeddings</span>\n </if>\n </label>\n <span style="flex-shrink:0; font-size:10px; opacity:.5;">\n <if :="keepSubEnvs.has(e.name)">keep</if>\n <if :="!keepSubEnvs.has(e.name)"><span style="color:var(--okdb-danger);">delete</span></if>\n </span>\n </div>\n </each>\n </div>\n <if :="keepSubEnvs.size > 0">\n <div style="margin-top:8px; font-size:11px; opacity:.5; line-height:1.5;">\n Kept databases will become orphaned and can be managed or dismissed later.\n </div>\n </if>\n </div>\n </if>\n\n \x3c!-- ── Locked files warning (post-removal) ── --\x3e\n <if :="warning">\n <div style="color:var(--okdb-warning); font-size:12px; padding:8px 12px; background:#221c08; border-radius:6px; border:1px solid color-mix(in srgb, var(--okdb-warning) 20%, transparent); line-height:1.5;">\n <div style="font-weight:600; margin-bottom:3px;">⚠ Some files could not be deleted</div>\n <div style="opacity:.8;">{{ warning }}</div>\n <div style="opacity:.55; margin-top:4px; font-size:11px;">These files may be locked by another OKDB process. Stop all other instances and delete them manually.</div>\n </div>\n </if>\n\n \x3c!-- ── Confirm input (hidden after warning state) ── --\x3e\n <if :="!warning">\n <div style="display:flex; flex-direction:column; gap:6px;">\n <label style="font-size:12px; opacity:.6;">\n Type <code style="font-size:12px; color:var(--okdb-orange); background:#1f1008; padding:1px 5px; border-radius:3px;">{{ name }}</code> to confirm\n </label>\n <input\n type="text"\n :placeholder="name"\n :value="confirm"\n @input="confirm = $el.value"\n @keydown.enter="remove()"\n autofocus\n style="font-family:monospace;"\n />\n </div>\n </if>\n\n \x3c!-- ── Error ── --\x3e\n <if :="error">\n <div style="color:var(--okdb-danger); font-size:13px; padding:8px 12px; background:var(--okdb-danger-deep-bg); border-radius:6px; border:1px solid color-mix(in srgb, var(--okdb-danger) 20%, transparent);">\n {{ error }}\n </div>\n </if>\n\n \x3c!-- ── Buttons ── --\x3e\n <div style="display:flex; gap:8px; justify-content:flex-end; padding-top:4px; border-top:1px solid var(--okdb-app-surface-2);">\n <button @click="cancel()" :disabled="busy">{{ warning ? \'Close\' : \'Cancel\' }}</button>\n <if :="!warning">\n <button\n @click="remove()"\n :disabled="!canRemove"\n style="background:var(--okdb-danger-deep-border); border-color:#991b1b; color:var(--okdb-danger);"\n :style="canRemove ? \'background:var(--okdb-danger-deep-border); border-color:#b91c1c; color:var(--okdb-danger); cursor:pointer;\' : \'opacity:.4; cursor:not-allowed;\'"\n >\n {{ busy ? \'Removing…\' : \'🗑 Remove Environment\' }}\n </button>\n </if>\n </div>\n\n</div>',style:"\n remove-env-modal .rem-stat {\n background: #13191f;\n border: 1px solid #1e2d3c;\n border-radius: 8px;\n padding: 10px 14px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n remove-env-modal .rem-stat__label {\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: .06em;\n opacity: .45;\n }\n remove-env-modal .rem-stat__value {\n font-size: 20px;\n font-weight: 700;\n line-height: 1;\n }\n "};
|