@kedem/okdb 1.0.0 → 1.0.1
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/README.md +1 -1
- package/bin/okdb.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/okdb.js +1 -1
- package/package.json +1 -1
- 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/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/login-app.js +1 -1
- package/public/modules/ok.js +1 -1
- package/public/sections/api/parts/api-endpoint.ok.js +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/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/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/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/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/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/parts/license-panel.ok.js +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/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/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/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/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/util/permissions.js +1 -1
- package/public/util/sift-schema.js +1 -1
- package/public/view-models/type-query-vm.js +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
const _0x4a43e5=_0x10b9;function _0x10b9(_0x1672db,_0x2e5d23){_0x1672db=_0x1672db-0x158;const _0x38cf6a=_0x38cf();let _0x10b9e0=_0x38cf6a[_0x1672db];return _0x10b9e0;}(function(_0x54531a,_0x34cfdc){const _0x5e457b=_0x10b9,_0x4ecd2d=_0x54531a();while(!![]){try{const _0x2a0304=-parseInt(_0x5e457b(0x213))/0x1+-parseInt(_0x5e457b(0x1d2))/0x2+parseInt(_0x5e457b(0x159))/0x3*(parseInt(_0x5e457b(0x1c3))/0x4)+-parseInt(_0x5e457b(0x1bd))/0x5*(parseInt(_0x5e457b(0x1d7))/0x6)+parseInt(_0x5e457b(0x18d))/0x7*(-parseInt(_0x5e457b(0x21e))/0x8)+-parseInt(_0x5e457b(0x216))/0x9*(-parseInt(_0x5e457b(0x191))/0xa)+parseInt(_0x5e457b(0x1bf))/0xb;if(_0x2a0304===_0x34cfdc)break;else _0x4ecd2d['push'](_0x4ecd2d['shift']());}catch(_0x585c35){_0x4ecd2d['push'](_0x4ecd2d['shift']());}}}(_0x38cf,0x4f0ca));export default{'tag':_0x4a43e5(0x1a9),'unwrap':!0x0,'context':_0x15953a=>({'w':0x384,'h':0x1f4,'layout':{'cx':0x0,'cy':0x0,'r':0x0,'pos':{}},'_ro':null,'_tick':null,'now':Date['now'](),'selectedNodeId':null,'selectedLinkKey':null,'hoveredLinkKey':null,'hoveredNodeId':null,'lastUpdatedAt':null,'autoRefresh':!0x0,'autoRefreshIntervalMs':0x1388,'_autoRefreshTimer':null,'loadingTopology':!0x1,'editingLink':null,'linkEditDir':_0x4a43e5(0x205),'linkEditEnvs':null,'linkEditEnabled':!0x0,'savingLink':!0x1,'panX':0x0,'panY':0x0,'zoom':0x1,'_drag':null,'_customPos':{},'_svgEl':null,'_groupEl':null,'_applyTransform'(){const _0x3466c7=_0x4a43e5;this[_0x3466c7(0x208)]||(this[_0x3466c7(0x208)]=this['_svgEl']?.[_0x3466c7(0x166)](_0x3466c7(0x1e7))),this[_0x3466c7(0x208)]&&this['_groupEl'][_0x3466c7(0x1b0)](_0x3466c7(0x1b9),_0x3466c7(0x20d)+this[_0x3466c7(0x1ab)]+','+this[_0x3466c7(0x20e)]+_0x3466c7(0x1e6)+this['zoom']+')');},'_px2vb'(){const _0x1f03f3=_0x4a43e5;if(!this[_0x1f03f3(0x221)])return{'sx':0x1,'sy':0x1};const _0x51937f=this[_0x1f03f3(0x221)][_0x1f03f3(0x1af)]();return{'sx':this['w']/(_0x51937f[_0x1f03f3(0x19f)]||0x1),'sy':this['h']/(_0x51937f[_0x1f03f3(0x211)]||0x1)};},'_onWheel'(_0x3f07af){const _0x512fd5=_0x4a43e5;if(!this[_0x512fd5(0x221)])return;const _0x3d9868=this['_svgEl']['getBoundingClientRect'](),{sx:_0x58671a,sy:_0xb7019d}=this[_0x512fd5(0x1fa)](),_0x179dda=(_0x3f07af[_0x512fd5(0x1d9)]-_0x3d9868[_0x512fd5(0x1c2)])*_0x58671a,_0x1c2b03=(_0x3f07af['clientY']-_0x3d9868[_0x512fd5(0x1ff)])*_0xb7019d,_0x3db30d=_0x3f07af[_0x512fd5(0x169)]<0x0?1.12:0x1/1.12,_0x300e7c=Math[_0x512fd5(0x180)](0.1,Math[_0x512fd5(0x176)](0x8,this['zoom']*_0x3db30d)),_0x4ca67f=_0x300e7c/this[_0x512fd5(0x158)];this[_0x512fd5(0x1ab)]=_0x179dda+(this[_0x512fd5(0x1ab)]-_0x179dda)*_0x4ca67f,this[_0x512fd5(0x20e)]=_0x1c2b03+(this[_0x512fd5(0x20e)]-_0x1c2b03)*_0x4ca67f,this['zoom']=_0x300e7c,this[_0x512fd5(0x15c)]();},'_onSvgMousedown'(_0x1faa02){const _0x1fec68=_0x4a43e5;if(0x0!==_0x1faa02[_0x1fec68(0x1ae)])return;_0x1faa02[_0x1fec68(0x1c9)]();let _0x55c6ea=null,_0x3730d0=_0x1faa02[_0x1fec68(0x1f4)];for(;_0x3730d0&&_0x3730d0!==this[_0x1fec68(0x221)];){if(_0x3730d0['id']&&_0x3730d0['id'][_0x1fec68(0x16a)]('nd-')){_0x55c6ea=_0x3730d0['id'][_0x1fec68(0x223)](0x3);break;}_0x3730d0=_0x3730d0[_0x1fec68(0x21d)];}if(_0x55c6ea){const _0x375192=this[_0x1fec68(0x221)][_0x1fec68(0x1af)](),{sx:_0x4437de,sy:_0x52866a}=this[_0x1fec68(0x1fa)](),_0x7466df=(_0x1faa02[_0x1fec68(0x1d9)]-_0x375192[_0x1fec68(0x1c2)])*_0x4437de,_0x5103ba=(_0x1faa02[_0x1fec68(0x17b)]-_0x375192[_0x1fec68(0x1ff)])*_0x52866a,_0x1c8bef=(_0x7466df-this[_0x1fec68(0x1ab)])/this[_0x1fec68(0x158)],_0x5d5f1e=(_0x5103ba-this[_0x1fec68(0x20e)])/this[_0x1fec68(0x158)],_0x2d88e6=this[_0x1fec68(0x183)](_0x55c6ea)||{'x':_0x1c8bef,'y':_0x5d5f1e};this[_0x1fec68(0x225)]={'type':_0x1fec68(0x217),'id':_0x55c6ea,'ox':_0x1c8bef-_0x2d88e6['x'],'oy':_0x5d5f1e-_0x2d88e6['y']};}else this['_drag']={'type':'pan','sx':_0x1faa02[_0x1fec68(0x1d9)],'sy':_0x1faa02['clientY'],'px':this[_0x1fec68(0x1ab)],'py':this[_0x1fec68(0x20e)]};this[_0x1fec68(0x221)]&&(this[_0x1fec68(0x221)][_0x1fec68(0x190)][_0x1fec68(0x17d)]='grabbing');},'_onMousemove'(_0x3ce3e9){const _0x2fd6b9=_0x4a43e5;if(!this[_0x2fd6b9(0x225)])return;const {sx:_0x3095b7,sy:_0x345f5c}=this[_0x2fd6b9(0x1fa)]();if(_0x2fd6b9(0x18b)===this[_0x2fd6b9(0x225)]['type'])this[_0x2fd6b9(0x1ab)]=this[_0x2fd6b9(0x225)]['px']+(_0x3ce3e9[_0x2fd6b9(0x1d9)]-this[_0x2fd6b9(0x225)]['sx'])*_0x3095b7,this[_0x2fd6b9(0x20e)]=this['_drag']['py']+(_0x3ce3e9[_0x2fd6b9(0x17b)]-this[_0x2fd6b9(0x225)]['sy'])*_0x345f5c,this[_0x2fd6b9(0x15c)]();else{const _0x364c45=this[_0x2fd6b9(0x221)][_0x2fd6b9(0x1af)](),_0x23001d=(_0x3ce3e9[_0x2fd6b9(0x1d9)]-_0x364c45[_0x2fd6b9(0x1c2)])*_0x3095b7,_0x3f62e6=(_0x3ce3e9[_0x2fd6b9(0x17b)]-_0x364c45['top'])*_0x345f5c,_0xb2db71=(_0x23001d-this['panX'])/this[_0x2fd6b9(0x158)],_0x4884f7=(_0x3f62e6-this[_0x2fd6b9(0x20e)])/this['zoom'];this[_0x2fd6b9(0x161)]={...this[_0x2fd6b9(0x161)],[this['_drag']['id']]:{'x':_0xb2db71-this[_0x2fd6b9(0x225)]['ox'],'y':_0x4884f7-this[_0x2fd6b9(0x225)]['oy']}},this[_0x2fd6b9(0x21a)]();}},'_onMouseup'(){const _0x29b065=_0x4a43e5;this[_0x29b065(0x225)]=null,this[_0x29b065(0x221)]&&(this[_0x29b065(0x221)][_0x29b065(0x190)][_0x29b065(0x17d)]='grab');},get 'externalSelectedNodeId'(){return _0x15953a['$attr']['selected_node_id']??null;},get 'selfId'(){return _0x15953a['$attr']['self_id'];},get 'topology'(){const _0x316d94=_0x4a43e5;return _0x15953a[_0x316d94(0x1f1)][_0x316d94(0x1db)]||{};},get 'availableEnvs'(){const _0x5baa7d=_0x4a43e5;return _0x15953a[_0x5baa7d(0x1f1)][_0x5baa7d(0x210)]||[];},get 'envButtons'(){const _0x4e725f=_0x4a43e5,_0x3fc3e6=this['linkEditEnvs'];return(_0x15953a[_0x4e725f(0x1f1)]['available_envs']||[])[_0x4e725f(0x1bc)](_0x2e1c8e=>({'name':_0x2e1c8e,'style':null===_0x3fc3e6||Array['isArray'](_0x3fc3e6)&&_0x3fc3e6[_0x4e725f(0x174)](_0x2e1c8e)?_0x4e725f(0x1f6):''}));},get 'dirButtons'(){const _0x5b5331=_0x4a43e5,_0x3a13ee=this[_0x5b5331(0x188)];if(!_0x3a13ee)return[];const _0x4f6e21=_0x3a13ee['lo']['slice'](0x0,0x6),_0x2fa57b=_0x3a13ee['hi']['slice'](0x0,0x6),_0x443ef7=this[_0x5b5331(0x195)];return[{'canon':_0x5b5331(0x205),'label':_0x4f6e21+_0x5b5331(0x21b)+_0x2fa57b},{'canon':'lo_to_hi','label':_0x4f6e21+_0x5b5331(0x18c)+_0x2fa57b},{'canon':'hi_to_lo','label':_0x2fa57b+'\x20→\x20'+_0x4f6e21}][_0x5b5331(0x1bc)](_0x106aa6=>({..._0x106aa6,'style':_0x106aa6[_0x5b5331(0x17c)]===_0x443ef7?'border-color:var(--accent);color:var(--accent)':''}));},get 'nodes'(){const _0xa0f622=_0x4a43e5;return Object[_0xa0f622(0x1d5)](this[_0xa0f622(0x1db)]||{})['filter'](_0x2fdf9b=>_0x2fdf9b&&null!=_0x2fdf9b['id'])[_0xa0f622(0x1d4)]((_0x4344bd,_0x193827)=>String(_0x4344bd['id'])[_0xa0f622(0x1cc)](String(_0x193827['id'])));},get 'nodeList'(){const _0x31685c=_0x4a43e5;return this[_0x31685c(0x200)][_0x31685c(0x1bc)](_0x434533=>{const _0x103552=this['_customPos'][_0x434533['id']]||this['layout']['pos']?.[_0x434533['id']]||{'x':this['w']/0x2,'y':this['h']/0x2};return{..._0x434533,'px':_0x103552['x'],'py':_0x103552['y']};});},get 'links'(){const _0xc7991e=_0x4a43e5,_0x242dfe=this['topology']||{},_0x4b41ef=_0x242dfe[this['selfId']]||Object[_0xc7991e(0x1d5)](_0x242dfe)[_0xc7991e(0x1f7)](_0x1b98d3=>null!=_0x1b98d3?.[_0xc7991e(0x18f)]),_0x1a608f=_0x4b41ef?.[_0xc7991e(0x18f)]||{},_0x163ca7=new Map(),_0x2d55a2=(_0x22f7fe,_0x5939a6)=>({'status':_0x22f7fe[_0xc7991e(0x165)]||_0xc7991e(0x1ad),'backlog':Math[_0xc7991e(0x180)](0x0,Number(_0x5939a6??0x0)-Number(_0x22f7fe[_0xc7991e(0x1b2)]??0x0)),'last_seen':_0x22f7fe['last_seen']??null,'last_error':_0x22f7fe[_0xc7991e(0x192)]??null});for(const _0x3ff9f in _0x242dfe){const _0xe05bb5=_0x242dfe[_0x3ff9f];if(_0xe05bb5?.[_0xc7991e(0x1ac)])for(const _0x1eee5f in _0xe05bb5[_0xc7991e(0x1ac)]){const _0x4d8148=_0x3ff9f<_0x1eee5f?_0x3ff9f:_0x1eee5f,_0x1d0466=_0x3ff9f<_0x1eee5f?_0x1eee5f:_0x3ff9f,_0x3a3780=_0x4d8148+':'+_0x1d0466;_0x163ca7['has'](_0x3a3780)||_0x163ca7['set'](_0x3a3780,{'lo':_0x4d8148,'hi':_0x1d0466,'lo_pull':null,'hi_pull':null});const _0x44d6aa=_0x163ca7[_0xc7991e(0x182)](_0x3a3780),_0x1ff56e=_0xe05bb5[_0xc7991e(0x1ac)][_0x1eee5f];_0x3ff9f===_0x4d8148?_0x44d6aa[_0xc7991e(0x1dd)]=_0x2d55a2(_0x1ff56e,_0x242dfe[_0x1eee5f]?.[_0xc7991e(0x1b2)]):_0x44d6aa['hi_pull']=_0x2d55a2(_0x1ff56e,_0x242dfe[_0x1eee5f]?.[_0xc7991e(0x1b2)]);}}for(const _0x174840 in _0x1a608f)if(_0x1a608f[_0x174840]&&!_0x163ca7[_0xc7991e(0x1c6)](_0x174840)){const _0x31cf82=_0x1a608f[_0x174840];_0x163ca7['set'](_0x174840,{'lo':_0x31cf82['node_lo'],'hi':_0x31cf82['node_hi'],'lo_pull':null,'hi_pull':null});}return[..._0x163ca7['entries']()][_0xc7991e(0x1bc)](([_0x2d8ca9,_0x1f2383])=>({'key':_0x2d8ca9,'lo':_0x1f2383['lo'],'hi':_0x1f2383['hi'],'link':_0x1a608f[_0x2d8ca9]||null,'lo_pull':_0x1f2383[_0xc7991e(0x1dd)],'hi_pull':_0x1f2383[_0xc7991e(0x1b1)]}));},'_linkConfig'(_0x6e99b){const _0x1222c2=_0x4a43e5,_0x1cff3f=(this[_0x1222c2(0x1db)]||{})[this[_0x1222c2(0x21f)]];return _0x1cff3f?.[_0x1222c2(0x18f)]?.[_0x6e99b]||null;},'_linkHealth'(_0x3e470c){const _0x7117a2=_0x4a43e5;if(_0x3e470c[_0x7117a2(0x207)]&&!_0x3e470c[_0x7117a2(0x207)]['enabled'])return _0x7117a2(0x178);const _0xdcac51=_0x3e470c[_0x7117a2(0x207)]?.[_0x7117a2(0x1fb)]??_0x7117a2(0x205),_0x3c5d6c=[];'both'!==_0xdcac51&&_0x7117a2(0x21c)!==_0xdcac51||_0x3c5d6c[_0x7117a2(0x16d)](_0x3e470c[_0x7117a2(0x1b1)]),'both'!==_0xdcac51&&'hi_to_lo'!==_0xdcac51||_0x3c5d6c[_0x7117a2(0x16d)](_0x3e470c[_0x7117a2(0x1dd)]);const _0x37a174=[_0x7117a2(0x19b),_0x7117a2(0x16f),_0x7117a2(0x202),'behind',_0x7117a2(0x218),'stale','ok'];let _0x4d02a5='stale';for(const _0x275045 of _0x3c5d6c){const _0x2baa9b=this[_0x7117a2(0x171)](_0x275045);_0x37a174[_0x7117a2(0x15f)](_0x2baa9b)<_0x37a174[_0x7117a2(0x15f)](_0x4d02a5)&&(_0x4d02a5=_0x2baa9b);}return _0x4d02a5;},'_pullHealth'(_0x28c6d7){const _0x1f711e=_0x4a43e5;if(!_0x28c6d7)return _0x1f711e(0x184);if(_0x1f711e(0x218)===_0x28c6d7['status'])return _0x1f711e(0x218);if(_0x28c6d7[_0x1f711e(0x1b5)]){const _0x2b439c=this['now']-Number(_0x28c6d7[_0x1f711e(0x1b5)]);return _0x28c6d7[_0x1f711e(0x1e9)]>0x32?_0x1f711e(0x16f):_0x28c6d7['backlog']>0x5?_0x1f711e(0x202):_0x28c6d7[_0x1f711e(0x1e9)]>0x0?'behind':_0x2b439c>0x7530?_0x1f711e(0x184):'ok';}return _0x28c6d7['last_error']?_0x1f711e(0x19b):'stale';},'_healthMarker':_0x221180=>'error'===_0x221180?'err':'reconciling'===_0x221180?_0x4a43e5(0x1f2):_0x4a43e5(0x16f)===_0x221180?_0x4a43e5(0x16f):'lag-med'===_0x221180||_0x4a43e5(0x15b)===_0x221180||_0x4a43e5(0x184)===_0x221180?'lag-med':'ok','_linkDirLabel'(_0x29a60f){const _0x535503=_0x4a43e5;if(!_0x29a60f['link'])return _0x29a60f['lo']['slice'](0x0,0x6)+'\x20⇄\x20'+_0x29a60f['hi']['slice'](0x0,0x6)+_0x535503(0x1f8);if(!_0x29a60f[_0x535503(0x207)][_0x535503(0x1d0)])return _0x535503(0x178);const _0xca40d0=_0x29a60f['lo']['slice'](0x0,0x6),_0x115997=_0x29a60f['hi'][_0x535503(0x223)](0x0,0x6);switch(_0x29a60f['link'][_0x535503(0x1fb)]){case _0x535503(0x205):return _0xca40d0+'\x20⇄\x20'+_0x115997;case _0x535503(0x21c):return _0xca40d0+_0x535503(0x18c)+_0x115997;case'hi_to_lo':return _0x115997+_0x535503(0x18c)+_0xca40d0;default:return _0x29a60f[_0x535503(0x207)][_0x535503(0x1fb)];}},get 'selection'(){const _0x291457=_0x4a43e5;if(this[_0x291457(0x20a)]){const _0x27cd4b=this[_0x291457(0x18f)][_0x291457(0x1f7)](_0x3d9439=>_0x3d9439[_0x291457(0x163)]===this['selectedLinkKey'])||null;if(_0x27cd4b)return{'type':_0x291457(0x207),'data':_0x27cd4b};}if(this[_0x291457(0x181)]){const _0x50c874=this[_0x291457(0x1db)][this['selectedNodeId']]||null;return _0x50c874?{'type':_0x291457(0x217),'id':this[_0x291457(0x181)],'data':_0x50c874}:null;}return null;},get 'freshnessLabel'(){const _0x7df670=_0x4a43e5;if(!this[_0x7df670(0x1ee)])return'never';const _0x135b2a=this[_0x7df670(0x222)]-this['lastUpdatedAt'];return _0x135b2a<0x5dc?_0x7df670(0x222):_0x135b2a<0x1388?_0x7df670(0x164):_0x135b2a<0x3a98?'recent':Math[_0x7df670(0x1d8)](_0x135b2a/0x3e8)+'s\x20ago';},get 'freshnessClass'(){const _0x1ee452=_0x4a43e5;if(!this[_0x1ee452(0x1ee)])return _0x1ee452(0x1ea);const _0x42f6db=this['now']-this[_0x1ee452(0x1ee)];return _0x42f6db<0x1388?_0x1ee452(0x1e0):_0x42f6db<0x3a98?'fresh-ok':_0x1ee452(0x1ea);},'_recomputeLayout'(){const _0x55e54f=_0x4a43e5,_0x2bdc44=this[_0x55e54f(0x200)],_0x1709c5=this['w']/0x2,_0x2fa0b3=this['h']/0x2,_0x5bf22f=Math['max'](0x50,Math[_0x55e54f(0x176)](_0x1709c5,_0x2fa0b3)-this['nodeRadius']()-0x3c),_0x5d4661={},_0x53c50b=_0x2bdc44[_0x55e54f(0x1da)]||0x1;_0x2bdc44[_0x55e54f(0x1e3)]((_0x263156,_0x3e417d)=>{const _0x104fa7=_0x55e54f;if(0x1===_0x53c50b)return void(_0x5d4661[_0x263156['id']]={'x':_0x1709c5,'y':_0x2fa0b3});const _0x3bfb2d=0x2===_0x53c50b?0x0===_0x3e417d?Math['PI']:0x0:_0x3e417d/_0x53c50b*Math['PI']*0x2-Math['PI']/0x2;_0x5d4661[_0x263156['id']]={'x':_0x1709c5+_0x5bf22f*Math[_0x104fa7(0x1d3)](_0x3bfb2d),'y':_0x2fa0b3+_0x5bf22f*Math[_0x104fa7(0x19a)](_0x3bfb2d)};}),this[_0x55e54f(0x1a6)]={'cx':_0x1709c5,'cy':_0x2fa0b3,'r':_0x5bf22f,'pos':_0x5d4661};},'_measure'(){const _0x4d60a1=_0x4a43e5,_0x259a37=(this[_0x4d60a1(0x221)]||_0x15953a['$el'])['getBoundingClientRect']();this['w']=Math[_0x4d60a1(0x180)](0x12c,_0x259a37[_0x4d60a1(0x19f)]||0x384),this['h']=Math['max'](0xc8,_0x259a37[_0x4d60a1(0x211)]||0x1f4),this['_recomputeLayout']();},'_effectivePos'(_0xf3dda){const _0x4662a2=_0x4a43e5;return this[_0x4662a2(0x161)][_0xf3dda]||this[_0x4662a2(0x1a6)]['pos']?.[_0xf3dda]||null;},'fitView'(){const _0x45ade7=_0x4a43e5;this['_measure']();const _0x11d823=this[_0x45ade7(0x200)];if(!_0x11d823[_0x45ade7(0x1da)])return;let _0x2287c2=0x1/0x0,_0x22cf34=0x1/0x0,_0x4dd328=-0x1/0x0,_0x2df4fd=-0x1/0x0;for(const _0x1f8884 of _0x11d823){const _0x39fe28=this['_effectivePos'](_0x1f8884['id']);_0x39fe28&&(_0x2287c2=Math[_0x45ade7(0x176)](_0x2287c2,_0x39fe28['x']),_0x22cf34=Math[_0x45ade7(0x176)](_0x22cf34,_0x39fe28['y']),_0x4dd328=Math[_0x45ade7(0x180)](_0x4dd328,_0x39fe28['x']),_0x2df4fd=Math[_0x45ade7(0x180)](_0x2df4fd,_0x39fe28['y']));}if(!isFinite(_0x2287c2))return;const _0x46c7d2=this[_0x45ade7(0x1c0)]()+0x3c;_0x2287c2-=_0x46c7d2,_0x22cf34-=_0x46c7d2,_0x4dd328+=_0x46c7d2,_0x2df4fd+=_0x46c7d2;const _0x29319b=_0x4dd328-_0x2287c2,_0x219148=_0x2df4fd-_0x22cf34,_0x5ba9d5=0.88*Math[_0x45ade7(0x176)](this['w']/_0x29319b,this['h']/_0x219148,0x3);this['zoom']=_0x5ba9d5,this[_0x45ade7(0x1ab)]=this['w']/0x2-(_0x2287c2+_0x29319b/0x2)*_0x5ba9d5,this['panY']=this['h']/0x2-(_0x22cf34+_0x219148/0x2)*_0x5ba9d5,this['_applyTransform']();},'resetLayout'(){const _0x3a7769=_0x4a43e5;this[_0x3a7769(0x161)]={};try{localStorage[_0x3a7769(0x1cb)]('okdb-topo-pos');}catch{}this[_0x3a7769(0x1b6)]();},'_savePositions'(){const _0x34c63b=_0x4a43e5;try{localStorage[_0x34c63b(0x1e1)](_0x34c63b(0x194),JSON[_0x34c63b(0x1e4)](this[_0x34c63b(0x161)]));}catch{}},'_loadPositions'(){const _0x2278bd=_0x4a43e5;try{const _0x52b477=localStorage['getItem'](_0x2278bd(0x194));_0x52b477&&(this[_0x2278bd(0x161)]=JSON['parse'](_0x52b477));}catch{}},'nodeRadius':()=>0x16,'linkPath'(_0x47857e){const _0x67a02c=_0x4a43e5,_0x372437=this[_0x67a02c(0x183)](_0x47857e['lo']),_0x533857=this[_0x67a02c(0x183)](_0x47857e['hi']);if(!_0x372437||!_0x533857)return'';const _0x1c8438=_0x533857['x']-_0x372437['x'],_0xc9f869=_0x533857['y']-_0x372437['y'],_0x2d092f=Math['sqrt'](_0x1c8438*_0x1c8438+_0xc9f869*_0xc9f869)||0x1,_0x1e8bc3=this[_0x67a02c(0x1c0)]();return'M\x20'+(_0x372437['x']+_0x1c8438/_0x2d092f*_0x1e8bc3)+'\x20'+(_0x372437['y']+_0xc9f869/_0x2d092f*_0x1e8bc3)+_0x67a02c(0x1f3)+(_0x533857['x']-_0x1c8438/_0x2d092f*_0x1e8bc3)+'\x20'+(_0x533857['y']-_0xc9f869/_0x2d092f*_0x1e8bc3);},'reconciling':!0x1,'reconcilingTarget':null,async 'refreshTopology'(){const _0x4b8daa=_0x4a43e5;if(!this[_0x4b8daa(0x20f)]){this[_0x4b8daa(0x20f)]=!0x0;try{const _0x375ca4=await fetch('/api/sync/topology'),_0x219362=await _0x375ca4['json'](),_0x293686=_0x219362[_0x4b8daa(0x17a)]??_0x219362;_0x15953a[_0x4b8daa(0x1f1)][_0x4b8daa(0x1db)]=_0x293686[_0x4b8daa(0x1db)]??_0x293686,_0x15953a[_0x4b8daa(0x1f1)][_0x4b8daa(0x210)]=_0x293686['availableEnvs']??[],this[_0x4b8daa(0x1ee)]=Date[_0x4b8daa(0x222)]();}catch(_0x156331){console['error']('refresh\x20failed',_0x156331);}finally{this[_0x4b8daa(0x20f)]=!0x1;}}},async 'reconcileAll'(){const _0x550684=_0x4a43e5;if(!this[_0x550684(0x218)]){this['reconciling']=!0x0,this[_0x550684(0x1ef)]=_0x550684(0x185);try{await fetch(_0x550684(0x1b8),{'method':_0x550684(0x1ec)}),await this[_0x550684(0x17f)]();}finally{this[_0x550684(0x218)]=!0x1,this['reconcilingTarget']=null;}}},async 'reconcileNode'(_0x201d35){const _0x5ee106=_0x4a43e5;if(!this[_0x5ee106(0x218)]){this[_0x5ee106(0x218)]=!0x0,this['reconcilingTarget']=_0x201d35;try{_0x201d35===this[_0x5ee106(0x21f)]?await fetch(_0x5ee106(0x206),{'method':'POST'}):await fetch(this[_0x5ee106(0x1db)][_0x201d35]?.[_0x5ee106(0x196)]+_0x5ee106(0x206),{'method':_0x5ee106(0x1ec)}),await this[_0x5ee106(0x17f)]();}finally{this[_0x5ee106(0x218)]=!0x1,this['reconcilingTarget']=null;}}},async 'reconcileLink'(_0x4e47de){const _0x1c4d96=_0x4a43e5;if(this[_0x1c4d96(0x218)])return;this['reconciling']=!0x0,this[_0x1c4d96(0x1ef)]=_0x4e47de[_0x1c4d96(0x163)];const _0x131567=_0x4e47de['lo']===this[_0x1c4d96(0x21f)]?_0x4e47de['hi']:_0x4e47de['lo'];try{await fetch('/api/sync/reconcile-peer',{'method':_0x1c4d96(0x1ec),'headers':{'Content-Type':_0x1c4d96(0x179)},'body':JSON[_0x1c4d96(0x1e4)]({'peer_id':_0x131567})}),await this[_0x1c4d96(0x17f)]();}finally{this['reconciling']=!0x1,this[_0x1c4d96(0x1ef)]=null;}},'openLinkEditor'(_0xa85a56){const _0x473af9=_0x4a43e5;this[_0x473af9(0x188)]=_0xa85a56,this[_0x473af9(0x195)]=_0xa85a56[_0x473af9(0x207)]?.[_0x473af9(0x1fb)]??_0x473af9(0x205),this[_0x473af9(0x1a4)]=_0xa85a56[_0x473af9(0x207)]?.[_0x473af9(0x1a5)]??null,this['linkEditEnabled']=!0x1!==_0xa85a56['link']?.['enabled'];},'closeLinkEditor'(){const _0x298aa9=_0x4a43e5;this[_0x298aa9(0x188)]=null;},'toggleLinkEnv'(_0x3309d){const _0x21748c=_0x4a43e5;if(null===this[_0x21748c(0x1a4)])this[_0x21748c(0x1a4)]=this['availableEnvs']['filter'](_0x4897f9=>_0x4897f9!==_0x3309d);else{const _0x3b9a10=new Set(this[_0x21748c(0x1a4)]);_0x3b9a10[_0x21748c(0x1c6)](_0x3309d)?_0x3b9a10['delete'](_0x3309d):_0x3b9a10[_0x21748c(0x19d)](_0x3309d);const _0x49584d=[..._0x3b9a10];this['linkEditEnvs']=_0x49584d['length']===this['availableEnvs'][_0x21748c(0x1da)]?null:_0x49584d;}},async 'saveLink'(){const _0x4bba0c=_0x4a43e5;if(!this[_0x4bba0c(0x188)]||this[_0x4bba0c(0x1a7)])return;this[_0x4bba0c(0x1a7)]=!0x0;const _0xec4a8d=this['editingLink'];try{const _0x50a35d=await fetch(_0x4bba0c(0x1c7)+_0xec4a8d['lo']+'/'+_0xec4a8d['hi'],{'method':_0x4bba0c(0x201),'headers':{'Content-Type':_0x4bba0c(0x179)},'body':JSON['stringify']({'direction':this[_0x4bba0c(0x195)],'envs':this[_0x4bba0c(0x1a4)],'enabled':this[_0x4bba0c(0x1a0)]})});if(!_0x50a35d['ok']){const _0x2af442=await _0x50a35d[_0x4bba0c(0x1f0)]();throw new Error(_0x2af442?.['error']?.[_0x4bba0c(0x18a)]||_0x4bba0c(0x19c));}this['closeLinkEditor'](),await this[_0x4bba0c(0x17f)]();}catch(_0x61fcbb){alert(_0x61fcbb[_0x4bba0c(0x18a)]);}finally{this[_0x4bba0c(0x1a7)]=!0x1;}},async 'deleteLink'(){const _0x3df017=_0x4a43e5;if(!this['editingLink']||this[_0x3df017(0x1a7)])return;if(!confirm(_0x3df017(0x16e)))return;this['savingLink']=!0x0;const _0x3bf2c8=this[_0x3df017(0x188)];try{await fetch('/api/sync/links/'+_0x3bf2c8['lo']+'/'+_0x3bf2c8['hi'],{'method':_0x3df017(0x199)}),this[_0x3df017(0x1eb)](),await this[_0x3df017(0x17f)]();}catch(_0x307b3e){alert(_0x307b3e[_0x3df017(0x18a)]);}finally{this[_0x3df017(0x1a7)]=!0x1;}},'deselect'(){const _0x8c205e=_0x4a43e5;this[_0x8c205e(0x181)]=null,this[_0x8c205e(0x20a)]=null,this[_0x8c205e(0x1b4)]=null,this['hoveredNodeId']=null,this['editingLink']=null,_0x15953a[_0x8c205e(0x1b3)]?.(_0x8c205e(0x172),null),_0x15953a[_0x8c205e(0x1b3)]?.('selectLink',null);},'pickNode'(_0x26c5e9){const _0x3bd40f=_0x4a43e5;this[_0x3bd40f(0x181)]=_0x26c5e9,this['selectedLinkKey']=null,this['editingLink']=null,_0x15953a[_0x3bd40f(0x1b3)]?.(_0x3bd40f(0x172),_0x26c5e9),_0x15953a['$dispatch']?.(_0x3bd40f(0x1f5),null);},'pickLink'(_0x3f144b){const _0x348adf=_0x4a43e5,_0x5337f6=this[_0x348adf(0x18f)][_0x348adf(0x1f7)](_0x294895=>_0x294895[_0x348adf(0x163)]===_0x3f144b)||null;if(_0x5337f6&&(!this[_0x348adf(0x181)]||_0x5337f6['lo']===this[_0x348adf(0x181)]||_0x5337f6['hi']===this[_0x348adf(0x181)])){if(this[_0x348adf(0x20a)]===_0x3f144b)return this[_0x348adf(0x20a)]=null,this[_0x348adf(0x188)]=null,void _0x15953a[_0x348adf(0x1b3)]?.(_0x348adf(0x1f5),null);this[_0x348adf(0x20a)]=_0x3f144b,this[_0x348adf(0x181)]||(this['selectedNodeId']=_0x5337f6['lo'],_0x15953a['$dispatch']?.(_0x348adf(0x172),this[_0x348adf(0x181)])),_0x15953a['$dispatch']?.(_0x348adf(0x1f5),_0x3f144b);}},async 'copy'(_0x2ba80f){const _0x58ee9c=_0x4a43e5;try{await navigator[_0x58ee9c(0x1dc)][_0x58ee9c(0x20b)](String(_0x2ba80f??''));}catch(_0xfb9f26){}},'_sPointerEventsFor'(_0x2baefa){const _0x5969a4=_0x4a43e5;return this[_0x5969a4(0x181)]&&_0x2baefa['lo']!==this[_0x5969a4(0x181)]&&_0x2baefa['hi']!==this[_0x5969a4(0x181)]?_0x5969a4(0x177):_0x5969a4(0x1fc);},'_sEnabledBadge':_0x3529dd=>_0x3529dd?'color:var(--ok)':_0x4a43e5(0x203),'_sEnabledBtn':_0x331a1c=>_0x331a1c?_0x4a43e5(0x1fd):_0x4a43e5(0x1a2),'nodeHealth'(_0x4da8e6){const _0x44829f=_0x4a43e5,_0x1aac57=this['links'][_0x44829f(0x1fe)](_0x5c90e3=>_0x5c90e3['lo']===_0x4da8e6||_0x5c90e3['hi']===_0x4da8e6);if(!_0x1aac57[_0x44829f(0x1da)])return'ok';const _0x5f19ff=_0x1aac57[_0x44829f(0x1bc)](_0x48a9c7=>this[_0x44829f(0x17e)](_0x48a9c7));return _0x5f19ff[_0x44829f(0x174)](_0x44829f(0x19b))?'error':_0x5f19ff[_0x44829f(0x174)](_0x44829f(0x16f))?_0x44829f(0x16b):_0x5f19ff[_0x44829f(0x174)]('lag-med')?'lagging':_0x5f19ff[_0x44829f(0x174)]('behind')?_0x44829f(0x15b):_0x5f19ff[_0x44829f(0x1cd)](_0x8bb64a=>_0x44829f(0x184)===_0x8bb64a||_0x44829f(0x178)===_0x8bb64a)?_0x44829f(0x184):'ok';},'isLinkInteractable'(_0x3e514f){const _0x221676=_0x4a43e5;return!this[_0x221676(0x181)]||_0x3e514f['lo']===this[_0x221676(0x181)]||_0x3e514f['hi']===this['selectedNodeId'];},'isActiveLink'(_0xd11bd1){const _0x1adccd=_0x4a43e5;return this[_0x1adccd(0x20a)]===_0xd11bd1[_0x1adccd(0x163)]||this[_0x1adccd(0x1b4)]===_0xd11bd1[_0x1adccd(0x163)]&&this['isLinkInteractable'](_0xd11bd1);},'nodeClass'(_0x4381dc){const _0x3b341a=_0x4a43e5;let _0x21e935='nd';const _0x4cf01f=this[_0x3b341a(0x181)],_0x1cdfea=this[_0x3b341a(0x1a1)];if(_0x4cf01f&&_0x4cf01f!==_0x4381dc['id']&&(_0x21e935+=_0x3b341a(0x219)),_0x4cf01f===_0x4381dc['id']&&(_0x21e935+=_0x3b341a(0x1b7)),this[_0x3b341a(0x20a)]){const _0x1408ff=this['links'][_0x3b341a(0x1f7)](_0x31d456=>_0x31d456[_0x3b341a(0x163)]===this[_0x3b341a(0x20a)]);!_0x1408ff||_0x1408ff['lo']!==_0x4381dc['id']&&_0x1408ff['hi']!==_0x4381dc['id']||_0x4cf01f===_0x4381dc['id']||(_0x21e935+=_0x3b341a(0x1df));}_0x4cf01f||_0x1cdfea!==_0x4381dc['id']||(_0x21e935+=_0x3b341a(0x20c));const _0x555744=this[_0x3b341a(0x175)](_0x4381dc['id']);return'error'===_0x555744?_0x21e935+=_0x3b341a(0x209):_0x3b341a(0x16b)===_0x555744?_0x21e935+=_0x3b341a(0x1cf):_0x3b341a(0x16c)===_0x555744?_0x21e935+=_0x3b341a(0x1aa):_0x3b341a(0x15b)===_0x555744?_0x21e935+=_0x3b341a(0x1a8):_0x3b341a(0x184)===_0x555744&&(_0x21e935+=_0x3b341a(0x189)),_0x21e935;},'linkClass'(_0x3b72a6){const _0xa2aa8d=_0x4a43e5;let _0x1e4120='ln';const _0x31ee1b=this[_0xa2aa8d(0x20a)]===_0x3b72a6[_0xa2aa8d(0x163)],_0x2b6135=this[_0xa2aa8d(0x1b4)]===_0x3b72a6['key']&&this[_0xa2aa8d(0x1ce)](_0x3b72a6);switch(this[_0xa2aa8d(0x1ce)](_0x3b72a6)||_0x31ee1b||(_0x1e4120+=_0xa2aa8d(0x15d)),_0x31ee1b?_0x1e4120+='\x20ln-selected':_0x2b6135&&(_0x1e4120+='\x20ln-hover'),this['_linkHealth'](_0x3b72a6)){case'disabled':_0x1e4120+=_0xa2aa8d(0x220);break;case'error':_0x1e4120+='\x20ln-err';break;case _0xa2aa8d(0x218):_0x1e4120+='\x20ln-rec';break;case'lag-high':_0x1e4120+=_0xa2aa8d(0x1a3);break;case _0xa2aa8d(0x202):_0x1e4120+=_0xa2aa8d(0x15a);break;case _0xa2aa8d(0x15b):_0x1e4120+=_0xa2aa8d(0x1c5);break;case _0xa2aa8d(0x184):_0x1e4120+=_0xa2aa8d(0x18e);break;default:_0x1e4120+=_0xa2aa8d(0x1bb);}return _0x1e4120;},'linkMarker'(_0x1cbdd6){const _0x3147d4=_0x4a43e5,_0x167e00=_0x1cbdd6[_0x3147d4(0x207)]?.['direction']??'both';return _0x3147d4(0x205)!==_0x167e00&&_0x3147d4(0x21c)!==_0x167e00?'':_0x1cbdd6['link']&&!_0x1cbdd6[_0x3147d4(0x207)][_0x3147d4(0x1d0)]?_0x3147d4(0x1c8):'url(#arrow-'+this[_0x3147d4(0x1de)](this[_0x3147d4(0x171)](_0x1cbdd6['hi_pull']))+')';},'linkStartMarker'(_0x5e0fe8){const _0x23983b=_0x4a43e5,_0x5dec82=_0x5e0fe8['link']?.[_0x23983b(0x1fb)]??_0x23983b(0x205);return _0x23983b(0x205)!==_0x5dec82&&_0x23983b(0x197)!==_0x5dec82?'':_0x5e0fe8[_0x23983b(0x207)]&&!_0x5e0fe8[_0x23983b(0x207)][_0x23983b(0x1d0)]?_0x23983b(0x1c4):'url(#arrow-rev-'+this[_0x23983b(0x1de)](this[_0x23983b(0x171)](_0x5e0fe8[_0x23983b(0x1dd)]))+')';}}),'mount'(_0x3e986c){const _0x29308c=_0x4a43e5;this[_0x29308c(0x221)]=_0x3e986c[_0x29308c(0x204)][_0x29308c(0x166)]('svg'),this[_0x29308c(0x208)]=this[_0x29308c(0x221)]?.[_0x29308c(0x166)](_0x29308c(0x1e7)),this[_0x29308c(0x221)]&&(this[_0x29308c(0x221)][_0x29308c(0x190)][_0x29308c(0x17d)]=_0x29308c(0x187)),this[_0x29308c(0x1e2)](),this[_0x29308c(0x1d6)](),this['_ro']=new ResizeObserver(()=>this[_0x29308c(0x1b6)]()),this[_0x29308c(0x168)]['observe'](_0x3e986c[_0x29308c(0x204)]),this[_0x29308c(0x1ca)]=setInterval(()=>{const _0x151586=_0x29308c;this[_0x151586(0x222)]=Date[_0x151586(0x222)]();},0x3e8),this[_0x29308c(0x17f)]()[_0x29308c(0x186)](()=>this[_0x29308c(0x1b6)]()),this[_0x29308c(0x167)]=_0x11198c=>{const _0x1f7f00=_0x29308c;_0x11198c[_0x1f7f00(0x1c9)](),this[_0x1f7f00(0x198)](_0x11198c);},this[_0x29308c(0x221)]&&this[_0x29308c(0x221)][_0x29308c(0x215)](_0x29308c(0x1e8),this[_0x29308c(0x167)],{'passive':!0x1}),this[_0x29308c(0x1be)]=_0x4ce6f0=>this['_onSvgMousedown'](_0x4ce6f0),this['_svgEl']&&this[_0x29308c(0x221)][_0x29308c(0x215)](_0x29308c(0x1ba),this[_0x29308c(0x1be)]),this[_0x29308c(0x160)]=_0x5c63a4=>this[_0x29308c(0x162)](_0x5c63a4),this['_mouseupCb']=()=>this[_0x29308c(0x170)](),window[_0x29308c(0x215)]('mousemove',this['_mousemoveCb']),window[_0x29308c(0x215)](_0x29308c(0x19e),this[_0x29308c(0x214)]),this[_0x29308c(0x1d1)]=()=>{const _0x493dcf=_0x29308c;document['hidden']||this[_0x493dcf(0x17f)]();},document[_0x29308c(0x215)](_0x29308c(0x1c1),this[_0x29308c(0x1d1)]),this[_0x29308c(0x173)]&&(this['_autoRefreshTimer']=setInterval(()=>this[_0x29308c(0x17f)](),this['autoRefreshIntervalMs'])),this[_0x29308c(0x181)]=this[_0x29308c(0x193)],_0x3e986c[_0x29308c(0x1e5)](()=>_0x3e986c['$attr'][_0x29308c(0x15e)],_0x32994d=>{const _0x597afd=_0x29308c;this[_0x597afd(0x181)]=_0x32994d??null,_0x32994d||(this[_0x597afd(0x20a)]=null);});},'unmount'(){const _0x35fab9=_0x4a43e5;this[_0x35fab9(0x168)]?.[_0x35fab9(0x1f9)](),clearInterval(this[_0x35fab9(0x1ca)]),clearInterval(this[_0x35fab9(0x212)]),this[_0x35fab9(0x221)]&&(this[_0x35fab9(0x221)][_0x35fab9(0x1ed)](_0x35fab9(0x1e8),this[_0x35fab9(0x167)]),this[_0x35fab9(0x221)][_0x35fab9(0x1ed)]('mousedown',this[_0x35fab9(0x1be)])),window[_0x35fab9(0x1ed)]('mousemove',this[_0x35fab9(0x160)]),window[_0x35fab9(0x1ed)]('mouseup',this[_0x35fab9(0x214)]),document[_0x35fab9(0x1ed)](_0x35fab9(0x1c1),this[_0x35fab9(0x1d1)]);},'template':_0x4a43e5(0x224)};function _0x38cf(){const _0xa9b2ff=['clientY','canon','cursor','_linkHealth','refreshTopology','max','selectedNodeId','get','_effectivePos','stale','all','then','grab','editingLink','\x20nd-stale','message','pan','\x20→\x20','413749XVCXkF','\x20ln-stale','links','style','202610BwJWPL','last_error','externalSelectedNodeId','okdb-topo-pos','linkEditDir','address','hi_to_lo','_onWheel','DELETE','sin','error','Save\x20failed','add','mouseup','width','linkEditEnabled','hoveredNodeId','border-color:var(--dis);color:var(--dis)','\x20ln-lag-high','linkEditEnvs','envs','layout','savingLink','\x20nd-behind','sync-topology','\x20nd-lag','panX','peers','idle','button','getBoundingClientRect','setAttribute','hi_pull','clock','$dispatch','hoveredLinkKey','last_seen','fitView','\x20nd-sel','/api/sync/reconcile-all','transform','mousedown','\x20ln-ok','map','5CDsYtV','_mousedownCb','9115887rawOJG','nodeRadius','visibilitychange','left','134672EqdNxI','url(#arrow-rev-disabled)','\x20ln-behind-light','has','/api/sync/links/','url(#arrow-disabled)','preventDefault','_tick','removeItem','localeCompare','every','isLinkInteractable','\x20nd-critical','enabled','_visibilityHandler','1273834ImusrS','cos','sort','values','_loadPositions','1999338HVQihs','floor','clientX','length','topology','clipboard','lo_pull','_healthMarker','\x20nd-sel2','fresh-now','setItem','_measure','forEach','stringify','$watch',')\x20scale(','.topo-g','wheel','backlog','fresh-stale','closeLinkEditor','POST','removeEventListener','lastUpdatedAt','reconcilingTarget','json','$attr','rec','\x20L\x20','target','selectLink','border-color:var(--accent);color:var(--accent);background:var(--bg)','find','\x20(mesh)','disconnect','_px2vb','direction','pointer-events:stroke;cursor:pointer','border-color:var(--ok);color:var(--ok)','filter','top','nodes','PUT','lag-med','color:var(--dis);opacity:0.7','$el','both','/api/sync/reconcile','link','_groupEl','\x20nd-err','selectedLinkKey','writeText','\x20nd-hover','translate(','panY','loadingTopology','available_envs','height','_autoRefreshTimer','211804DUUYFq','_mouseupCb','addEventListener','99HrUjnn','node','reconciling','\x20nd-dim','_savePositions','\x20⇄\x20','lo_to_hi','parentElement','16rhNUrH','selfId','\x20ln-disabled','_svgEl','now','slice','<div\x20style=\x22--bg:var(--okdb-app-bg-deep);\x20--panel:var(--okdb-app-surface);\x20--panel2:var(--okdb-app-bg-deep);\x20--border:var(--okdb-app-border);\x20--border2:var(--okdb-app-surface-2);\x0a\x20\x20--text:var(--okdb-app-fg);\x20--muted:var(--okdb-app-fg-muted);\x20--accent:var(--okdb-accent);\x20--ok:var(--okdb-success);\x20--rec:var(--okdb-accent);\x0a\x20\x20--warn:var(--okdb-warning);\x20--bad:var(--okdb-danger);\x20--err:var(--okdb-danger);\x20--dis:var(--okdb-app-fg-subtle);\x0a\x20\x20border:1px\x20solid\x20var(--border);\x20border-radius:12px;\x20background:var(--bg);\x20color:var(--text);\x0a\x20\x20display:flex;\x20flex-direction:column;\x20flex:1;\x20position:relative;\x20overflow:hidden;\x0a\x20\x20font-family:\x20ui-monospace,\x20monospace;\x22><div\x20style=\x22padding:12px\x2014px;display:flex;justify-content:space-between;border-bottom:1px\x20solid\x20var(--border2);background:var(--panel);align-items:center;\x22><div\x20style=\x22display:flex;align-items:center;gap:10px;\x22><div\x20style=\x22font-weight:700;letter-spacing:0.8px;color:var(--accent);\x22>NETWORK_TOPOLOGY</div><button\x20@click=\x22reconcileAll()\x22\x20:disabled=\x22reconciling\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--accent);cursor:pointer;\x22><span\x20style=\x22display:flex;align-items:center;gap:6px;\x22><span\x20:style=\x22reconcilingTarget===\x27all\x27?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20{{reconcilingTarget===\x27all\x27?\x27RECONCILING\x27:\x27RECONCILE\x20ALL\x27}}</span></button>\x20<button\x20@click=\x22refreshTopology()\x22\x20:disabled=\x22loadingTopology\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;\x22>REFRESH</button>\x20<button\x20@click=\x22fitView()\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;\x22\x20title=\x22Fit\x20all\x20nodes\x20into\x20view\x22>FIT</button>\x20<button\x20@click=\x22resetLayout()\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;\x22\x20title=\x22Reset\x20node\x20positions\x22>RESET</button>\x20<span\x20:style=\x22{opacity:loadingTopology?1:0}\x22\x20class=\x22spinner\x22/></div><div\x20style=\x22display:flex;align-items:center;gap:12px;font-size:11px;\x22><span\x20:class=\x22freshnessClass\x22>updated:\x20{{freshnessLabel}}</span>\x20<span\x20style=\x22opacity:0.75;\x22>{{nodes.length}}\x20NODES\x20//\x20{{links.length}}\x20LINKS</span></div></div><div\x20style=\x22flex:1;position:relative;\x22><svg\x20:viewBox=\x22\x270\x200\x20\x27+w+\x27\x20\x27+h\x22\x20style=\x22width:100%;height:100%;\x22><rect\x20:width=\x22w\x22\x20:height=\x22h\x22\x20fill=\x22transparent\x22\x20style=\x22pointer-events:all\x22\x20@click=\x22deselect()\x22/><defs><marker\x20id=\x22arrow-ok\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--ok)\x22/></marker><marker\x20id=\x22arrow-rec\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--rec)\x22/></marker><marker\x20id=\x22arrow-err\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--err)\x22/></marker><marker\x20id=\x22arrow-lag-med\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--warn)\x22/></marker><marker\x20id=\x22arrow-lag-high\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--bad)\x22/></marker><marker\x20id=\x22arrow-disabled\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--dis)\x22/></marker><marker\x20id=\x22arrow-rev-ok\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--ok)\x22/></marker><marker\x20id=\x22arrow-rev-rec\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--rec)\x22/></marker><marker\x20id=\x22arrow-rev-err\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--err)\x22/></marker><marker\x20id=\x22arrow-rev-lag-med\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--warn)\x22/></marker><marker\x20id=\x22arrow-rev-lag-high\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--bad)\x22/></marker><marker\x20id=\x22arrow-rev-disabled\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--dis)\x22/></marker></defs><style>.ln\x20{\x20fill:none;\x20stroke-width:1.9;\x20opacity:0.70;\x20transition:opacity\x200.14s,stroke-width\x200.14s,filter\x200.14s;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-ok\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--ok);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-behind-light\x20{\x20stroke:var(--okdb-info);\x20opacity:0.8;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-rec\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--rec);\x20stroke-dasharray:4\x203;\x20animation:dash\x201.1s\x20linear\x20infinite;\x20filter:drop-shadow(0\x200\x204px\x20rgba(77,163,255,0.5));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-lag-med\x20\x20\x20\x20\x20\x20{\x20stroke:var(--warn);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-lag-high\x20\x20\x20\x20\x20{\x20stroke:var(--bad);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-err\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--err);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-stale\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--okdb-app-fg-subtle);\x20opacity:0.5;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-disabled\x20\x20\x20\x20\x20{\x20stroke:var(--dis);\x20stroke-dasharray:6\x204;\x20opacity:0.45;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-dim\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20opacity:0.08;\x20filter:none\x20!important;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-hover\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke-width:3.0;\x20opacity:1;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-selected\x20\x20\x20\x20\x20{\x20stroke:var(--accent)\x20!important;\x20stroke-width:5.2\x20!important;\x20opacity:1\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20filter:drop-shadow(0\x200\x204px\x20rgba(77,163,255,0.9))\x20drop-shadow(0\x200\x2010px\x20rgba(77,163,255,0.35));\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd\x20circle\x20{\x20fill:var(--bg);\x20stroke:var(--border);\x20stroke-width:2;\x20transition:stroke\x200.14s,stroke-width\x200.14s,filter\x200.14s,opacity\x200.14s;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd\x20text\x20\x20\x20{\x20fill:var(--muted);\x20font-size:11px;\x20pointer-events:none;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-hover\x20\x20circle\x20{\x20stroke:rgba(77,163,255,0.8);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-sel\x20\x20\x20\x20circle\x20{\x20stroke:var(--accent);\x20stroke-width:3.4;\x20filter:drop-shadow(0\x200\x204px\x20rgba(77,163,255,0.75))\x20drop-shadow(0\x200\x2010px\x20rgba(77,163,255,0.25));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-sel2\x20\x20\x20circle\x20{\x20stroke:rgba(77,163,255,0.75);\x20stroke-width:3.0;\x20filter:drop-shadow(0\x200\x206px\x20rgba(77,163,255,0.25));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-dim\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20opacity:0.22;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-err\x20\x20\x20\x20circle\x20\x20{\x20stroke:var(--err);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-stale\x20\x20circle\x20\x20{\x20stroke:var(--okdb-app-fg-subtle);\x20stroke-width:2;\x20opacity:0.7;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-behind\x20circle\x20\x20{\x20stroke:var(--okdb-info);\x20stroke-width:2.5;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-lag\x20\x20\x20\x20circle\x20\x20{\x20stroke:var(--warn);\x20stroke-width:3;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-critical\x20circle\x20{\x20stroke:var(--bad);\x20stroke-width:3.5;\x20filter:drop-shadow(0\x200\x206px\x20rgba(255,77,77,0.5));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.fresh-now\x20\x20\x20{\x20color:var(--ok);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.fresh-ok\x20\x20\x20\x20{\x20color:var(--okdb-info);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.fresh-stale\x20{\x20color:var(--warn);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.spinner\x20{\x20display:inline-block;\x20width:12px;\x20height:12px;\x20border:2px\x20solid\x20rgba(77,163,255,0.2);\x20border-top:2px\x20solid\x20var(--accent);\x20border-radius:50%;\x20animation:spin\x200.8s\x20linear\x20infinite;\x20flex-shrink:0;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keyframes\x20dash\x20{\x20to\x20{\x20stroke-dashoffset:-14;\x20}\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keyframes\x20spin\x20\x20{\x20to\x20{\x20transform:rotate(360deg);\x20}\x20}</style><g\x20class=\x22topo-g\x22><for\x20:=\x22links\x22\x20let:l><if\x20:=\x22!isActiveLink(l)\x22><g><path\x20:d=\x22linkPath(l)\x22\x20stroke=\x22transparent\x22\x20stroke-width=\x2214\x22\x20fill=\x22none\x22\x20:style=\x22_sPointerEventsFor(l)\x22\x20@mouseenter=\x22isLinkInteractable(l)?(hoveredLinkKey=l.key):null\x22\x20@mouseleave=\x22hoveredLinkKey=null\x22\x20@click=\x22pickLink(l.key)\x22/><path\x20:d=\x22linkPath(l)\x22\x20:class=\x22linkClass(l)\x22\x20:marker-end=\x22linkMarker(l)\x22\x20:marker-start=\x22linkStartMarker(l)\x22><title>{{l.lo.slice(0,8)}}\x20↔\x20{{l.hi.slice(0,8)}}\x20direction:\x20{{l.link\x20?\x20l.link.direction\x20:\x20\x27mesh\x27}}\x20enabled:\x20{{l.link\x20?\x20l.link.enabled\x20:\x20true}}\x20envs:\x20{{l.link\x20&&\x20l.link.envs\x20?\x20l.link.envs.join(\x27,\x20\x27)\x20:\x20\x27all\x27}}</title></path></g></if></for><for\x20:=\x22nodeList\x22\x20let:n><g\x20:id=\x22\x27nd-\x27+n.id\x22\x20:transform=\x22\x27translate(\x27+n.px+\x27,\x27+n.py+\x27)\x27\x22\x20:class=\x22nodeClass(n)\x22\x20@mouseenter=\x22hoveredNodeId=n.id\x22\x20@mouseleave=\x22hoveredNodeId=null\x22\x20@click=\x22pickNode(n.id)\x22><circle\x20:r=\x22nodeRadius()\x22/><text\x20text-anchor=\x22middle\x22\x20dy=\x224\x22>{{n.id.slice(0,6)}}</text><title>{{n.id}}\x20clock:\x20{{n.clock\x20??\x20\x27--\x27}}\x20addr:\x20{{n.address\x20??\x20\x27—\x27}}</title></g></for><for\x20:=\x22links\x22\x20let:l><if\x20:=\x22isActiveLink(l)\x22><g><path\x20:d=\x22linkPath(l)\x22\x20stroke=\x22transparent\x22\x20stroke-width=\x2216\x22\x20fill=\x22none\x22\x20:style=\x22_sPointerEventsFor(l)\x22\x20@mouseenter=\x22isLinkInteractable(l)?(hoveredLinkKey=l.key):null\x22\x20@mouseleave=\x22hoveredLinkKey=null\x22\x20@click=\x22pickLink(l.key)\x22/><path\x20:d=\x22linkPath(l)\x22\x20:class=\x22linkClass(l)\x22\x20:marker-end=\x22linkMarker(l)\x22\x20:marker-start=\x22linkStartMarker(l)\x22/></g></if></for></g></svg><if\x20:=\x22selection\x20||\x20editingLink\x22><div\x20style=\x22position:absolute;top:18px;right:18px;width:320px;background:var(--panel);border:1px\x20solid\x20var(--border);border-radius:12px;padding:16px;box-shadow:0\x2016px\x2034px\x20rgba(0,0,0,0.45);border-left:4px\x20solid\x20var(--accent);\x22><div\x20style=\x22display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;\x22><span\x20style=\x22font-size:10px;background:var(--bg);padding:3px\x207px;border-radius:6px;color:var(--accent);letter-spacing:0.6px;\x22>{{editingLink\x20?\x20\x27LINK_CONFIG\x27\x20:\x20selection.type.toUpperCase()}}\x20</span><span\x20@click=\x22editingLink\x20?\x20closeLinkEditor()\x20:\x20deselect()\x22\x20style=\x22cursor:pointer;opacity:0.7;font-size:16px;line-height:12px;\x22>×</span></div><if\x20:=\x22!editingLink\x20&&\x20selection\x20&&\x20selection.type\x20===\x20\x27node\x27\x22><div\x20style=\x22font-size:13px;\x22><div\x20style=\x22display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;\x22><div\x20style=\x22color:var(--text);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>{{selection.id}}</div><button\x20@click=\x22copy(selection.id)\x22\x20style=\x22border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);font-size:11px;padding:4px\x208px;border-radius:8px;cursor:pointer;\x22>copy</button></div><div\x20style=\x22display:grid;grid-template-columns:92px\x201fr;row-gap:8px;column-gap:10px;\x22><div\x20style=\x22opacity:0.65;\x22>Clock</div><div>{{selection.data.clock??\x27--\x27}}</div><div\x20style=\x22opacity:0.65;\x22>Addr</div><div\x20style=\x22font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>{{selection.data.address||\x27N/A\x27}}</div><div\x20style=\x22opacity:0.65;\x22>Status</div><div\x20:style=\x22selection.data.error?\x27color:var(--err)\x27:\x27color:var(--ok)\x27\x22>{{selection.data.error?(\x27ERR:\x20\x27+selection.data.error):\x27OK\x27}}</div></div><div\x20style=\x22margin-top:12px;border-top:1px\x20solid\x20var(--border2);padding-top:10px;\x22><div\x20style=\x22font-size:11px;opacity:0.7;margin-bottom:6px;\x22>Tags</div><div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;\x22><if\x20:=\x22!(selection.data.tags\x20||\x20[]).length\x22><span\x20style=\x22font-size:11px;opacity:0.45;\x22>No\x20tags</span></if><for\x20:=\x22selection.data.tags\x20||\x20[]\x22\x20let:tag><span\x20style=\x22font-size:10px;padding:2px\x208px;border-radius:999px;border:1px\x20solid\x20var(--okdb-accent-soft-border);color:var(--okdb-accent);background:var(--okdb-accent-soft-bg);\x22>{{tag}}</span></for></div></div><div\x20style=\x22margin-top:12px;border-top:1px\x20solid\x20var(--border2);padding-top:10px;\x22><div\x20style=\x22font-size:11px;opacity:0.7;margin-bottom:6px;\x22>Available\x20envs</div><div\x20style=\x22font-size:11px;color:var(--muted);line-height:1.5;word-break:break-word;\x22>{{(selection.data.availableEnvs\x20||\x20[]).join(\x27,\x20\x27)\x20||\x20\x27—\x27}}</div></div><div\x20style=\x22margin-top:12px;border-top:1px\x20solid\x20var(--border2);padding-top:10px;\x22><div\x20style=\x22font-size:11px;opacity:0.7;margin-bottom:6px;\x22>Outbound\x20peers</div><div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;\x22><for\x20:=\x22Object.keys(selection.data.peers||{})\x22\x20let:pid><span\x20style=\x22font-size:11px;padding:3px\x207px;border:1px\x20solid\x20var(--border);background:var(--panel2);border-radius:999px;color:var(--muted);\x22>{{pid.slice(0,8)}}</span></for></div></div><div\x20style=\x22margin-top:14px;\x22><button\x20@click=\x22reconcileNode(selection.id)\x22\x20:disabled=\x22reconciling\x22\x20style=\x22width:100%;box-sizing:border-box;padding:6px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--accent);cursor:pointer;font-size:12px;\x22><span\x20style=\x22display:flex;align-items:center;justify-content:center;gap:6px;\x22><span\x20:style=\x22reconcilingTarget===selection.id?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20{{reconcilingTarget===selection.id?\x27RECONCILING\x27:\x27RECONCILE\x20NODE\x27}}</span></button></div></div></if><if\x20:=\x22!editingLink\x20&&\x20selection\x20&&\x20selection.type\x20===\x20\x27link\x27\x22><div\x20style=\x22font-size:13px;\x22><div\x20style=\x22margin-bottom:12px;\x22><div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:6px;\x22><span\x20style=\x22font-family:monospace;font-size:12px;font-weight:700;\x22>{{selection.data.lo.slice(0,8)}}</span>\x20<span\x20style=\x22font-size:16px;color:var(--accent);\x22>{{selection.data.link\x20?\x20(selection.data.link.direction\x20===\x20\x27lo_to_hi\x27\x20?\x20\x27→\x27\x20:\x20selection.data.link.direction\x20===\x20\x27hi_to_lo\x27\x20?\x20\x27←\x27\x20:\x20\x27⇄\x27)\x20:\x20\x27⇄\x27}}\x20</span><span\x20style=\x22font-family:monospace;font-size:12px;font-weight:700;\x22>{{selection.data.hi.slice(0,8)}}</span><if\x20:=\x22selection.data.link\x22><span\x20style=\x22font-size:11px;margin-left:4px;\x22\x20:style=\x22_sEnabledBadge(selection.data.link.enabled)\x22>{{selection.data.link.enabled\x20?\x20\x27●\x20on\x27\x20:\x20\x27○\x20off\x27}}</span></if></div><if\x20:=\x22selection.data.link\x20&&\x20selection.data.link.envs\x22><div\x20style=\x22font-size:11px;opacity:0.45;\x22>envs:\x20{{selection.data.link.envs.join(\x27,\x20\x27)}}</div></if><if\x20:=\x22!selection.data.link\x22><div\x20style=\x22font-size:11px;opacity:0.45;\x22>no\x20link\x20config\x20—\x20mesh\x20(legacy)</div></if></div><div\x20style=\x22border:1px\x20solid\x20var(--border2);border-radius:8px;overflow:hidden;margin-bottom:12px;font-size:11px;\x22><if\x20:=\x22!selection.data.link\x20||\x20selection.data.link.direction\x20===\x20\x27both\x27\x20||\x20selection.data.link.direction\x20===\x20\x27lo_to_hi\x27\x22><div\x20style=\x22padding:9px\x2011px;border-bottom:1px\x20solid\x20var(--bg);\x22><div\x20style=\x22display:flex;align-items:center;gap:6px;margin-bottom:6px;\x22><span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.lo.slice(0,6)}}</span>\x20<span\x20style=\x22color:var(--accent);\x22>→</span>\x20<span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.hi.slice(0,6)}}</span>\x20<span\x20style=\x22opacity:0.4;\x22>(hi\x20receives\x20from\x20lo)</span></div><div\x20style=\x22display:grid;grid-template-columns:70px\x201fr;row-gap:4px;gap:6px;opacity:0.85;\x22><span\x20style=\x22opacity:0.5;\x22>status</span>\x20<span>{{selection.data.hi_pull\x20?\x20selection.data.hi_pull.status\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>backlog</span>\x20<span>{{selection.data.hi_pull\x20?\x20selection.data.hi_pull.backlog\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>last\x20seen</span>\x20<span>{{selection.data.hi_pull\x20&&\x20selection.data.hi_pull.last_seen\x20?\x20(Math.round((now\x20-\x20selection.data.hi_pull.last_seen)/1000)\x20+\x20\x27s\x20ago\x27)\x20:\x20\x27—\x27}}</span><if\x20:=\x22selection.data.hi_pull\x20&&\x20selection.data.hi_pull.last_error\x22><span\x20style=\x22opacity:0.5;\x22>error</span>\x20<span\x20style=\x22color:var(--err);\x22>{{selection.data.hi_pull.last_error}}</span></if></div></div></if><if\x20:=\x22!selection.data.link\x20||\x20selection.data.link.direction\x20===\x20\x27both\x27\x20||\x20selection.data.link.direction\x20===\x20\x27hi_to_lo\x27\x22><div\x20style=\x22padding:9px\x2011px;\x22><div\x20style=\x22display:flex;align-items:center;gap:6px;margin-bottom:6px;\x22><span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.hi.slice(0,6)}}</span>\x20<span\x20style=\x22color:var(--accent);\x22>→</span>\x20<span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.lo.slice(0,6)}}</span>\x20<span\x20style=\x22opacity:0.4;\x22>(lo\x20receives\x20from\x20hi)</span></div><div\x20style=\x22display:grid;grid-template-columns:70px\x201fr;row-gap:4px;gap:6px;opacity:0.85;\x22><span\x20style=\x22opacity:0.5;\x22>status</span>\x20<span>{{selection.data.lo_pull\x20?\x20selection.data.lo_pull.status\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>backlog</span>\x20<span>{{selection.data.lo_pull\x20?\x20selection.data.lo_pull.backlog\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>last\x20seen</span>\x20<span>{{selection.data.lo_pull\x20&&\x20selection.data.lo_pull.last_seen\x20?\x20(Math.round((now\x20-\x20selection.data.lo_pull.last_seen)/1000)\x20+\x20\x27s\x20ago\x27)\x20:\x20\x27—\x27}}</span><if\x20:=\x22selection.data.lo_pull\x20&&\x20selection.data.lo_pull.last_error\x22><span\x20style=\x22opacity:0.5;\x22>error</span>\x20<span\x20style=\x22color:var(--err);\x22>{{selection.data.lo_pull.last_error}}</span></if></div></div></if></div><div\x20style=\x22display:flex;flex-direction:column;gap:7px;\x22><button\x20@click=\x22reconcileLink(selection.data)\x22\x20:disabled=\x22reconciling\x22\x20style=\x22width:100%;box-sizing:border-box;padding:7px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--accent);cursor:pointer;font-size:12px;\x22><span\x20style=\x22display:flex;align-items:center;justify-content:center;gap:6px;\x22><span\x20:style=\x22reconcilingTarget===selection.data.key?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20{{reconcilingTarget===selection.data.key\x20?\x20\x27Reconciling…\x27\x20:\x20\x27Reconcile\x27}}</span></button>\x20<button\x20@click=\x22openLinkEditor(selection.data)\x22\x20style=\x22width:100%;box-sizing:border-box;padding:7px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;font-size:12px;\x22>✎\x20Configure\x20Link</button></div></div></if><if\x20:=\x22editingLink\x22><div\x20style=\x22font-size:13px;\x22><div\x20style=\x22margin-bottom:14px;\x22><div\x20style=\x22font-family:monospace;font-size:11px;opacity:0.5;margin-bottom:2px;\x22>link\x20id</div><div\x20style=\x22font-family:monospace;font-size:11px;\x22>{{editingLink.key}}</div></div><div\x20style=\x22margin-bottom:14px;\x22><div\x20style=\x22font-size:11px;opacity:0.5;margin-bottom:7px;\x22>Direction</div><div\x20style=\x22display:flex;flex-direction:column;gap:5px;\x22><for\x20:=\x22dirButtons\x22\x20let:btn><button\x20@click=\x22linkEditDir\x20=\x20btn.canon\x22\x20:style=\x22btn.style\x22\x20style=\x22width:100%;box-sizing:border-box;padding:7px\x2010px;border-radius:7px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;font-size:12px;font-family:monospace;text-align:left;\x22>{{btn.label}}</button></for></div></div><if\x20:=\x22availableEnvs.length\x22><div\x20style=\x22margin-bottom:14px;\x22><div\x20style=\x22font-size:11px;opacity:0.5;margin-bottom:7px;\x22>Data\x20envs\x20—\x20{{linkEditEnvs\x20===\x20null\x20?\x20\x27all\x27\x20:\x20linkEditEnvs.length\x20+\x20\x27\x20selected\x27}}</div><div\x20style=\x22display:flex;flex-wrap:wrap;gap:5px;\x22><for\x20:=\x22envButtons\x22\x20let:btn><button\x20@click=\x22toggleLinkEnv(btn.name)\x22\x20:style=\x22btn.style\x22\x20style=\x22padding:4px\x2010px;border-radius:6px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;font-size:11px;\x22>{{btn.name}}</button></for></div></div></if><div\x20style=\x22margin-bottom:16px;display:flex;align-items:center;gap:10px;\x22><span\x20style=\x22font-size:11px;opacity:0.5;\x22>Enabled</span>\x20<button\x20@click=\x22linkEditEnabled=!linkEditEnabled\x22\x20:style=\x22_sEnabledBtn(linkEditEnabled)\x22\x20style=\x22padding:4px\x2012px;border-radius:6px;border:1px\x20solid;background:var(--panel2);cursor:pointer;font-size:11px;\x22>{{linkEditEnabled\x20?\x20\x27●\x20ON\x27\x20:\x20\x27○\x20OFF\x27}}</button></div><div\x20style=\x22display:flex;gap:8px;\x22><button\x20@click=\x22saveLink()\x22\x20:disabled=\x22savingLink\x22\x20style=\x22flex:1;padding:8px;border-radius:8px;border:1px\x20solid\x20var(--accent);background:rgba(77,163,255,0.1);color:var(--accent);cursor:pointer;font-size:12px;\x22><span\x20style=\x22display:flex;align-items:center;justify-content:center;gap:5px;\x22><span\x20:style=\x22savingLink?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20Save</span></button>\x20<button\x20@click=\x22deleteLink()\x22\x20:disabled=\x22savingLink\x22\x20style=\x22padding:8px\x2014px;border-radius:8px;border:1px\x20solid\x20#3d1a1a;background:rgba(255,59,48,0.08);color:var(--err);cursor:pointer;font-size:12px;\x22>Remove</button></div></div></if></div></if></div><div\x20style=\x22padding:9px\x2014px;background:var(--bg);border-top:1px\x20solid\x20var(--border2);display:flex;gap:16px;font-size:11px;align-items:center;flex-wrap:wrap;opacity:0.9;\x22><span><span\x20style=\x22color:var(--ok);\x22>●</span>\x20synced</span>\x20<span><span\x20style=\x22color:var(--okdb-info);\x22>●</span>\x20behind</span>\x20<span><span\x20style=\x22color:var(--rec);\x22>●</span>\x20reconciling</span>\x20<span><span\x20style=\x22color:var(--warn);\x22>●</span>\x20lag</span>\x20<span><span\x20style=\x22color:var(--err);\x22>●</span>\x20error</span>\x20<span><span\x20style=\x22color:var(--dis);\x22>●</span>\x20disabled</span>\x20<span\x20style=\x22opacity:0.4;\x22>⇄\x20both\x20→\x20send\x20←\x20receive\x20--\x20disabled\x20(click\x20to\x20inspect)</span></div></div>','_drag','zoom','51lAEYxG','\x20ln-lag-med','behind','_applyTransform','\x20ln-dim','selected_node_id','indexOf','_mousemoveCb','_customPos','_onMousemove','key','few\x20seconds\x20ago','status','querySelector','_wheelCb','_ro','deltaY','startsWith','critical','lagging','push','Remove\x20this\x20data\x20link?\x20Nodes\x20stay\x20connected\x20but\x20data\x20will\x20stop\x20syncing.','lag-high','_onMouseup','_pullHealth','select','autoRefresh','includes','nodeHealth','min','pointer-events:none','disabled','application/json','data'];_0x38cf=function(){return _0xa9b2ff;};return _0x38cf();}
|
|
1
|
+
function _0x15a2(){const _0x2ceb39=['setItem','1163368RBnNTG','externalSelectedNodeId','topology','_mousemoveCb','envs','node','node_hi','_recomputeLayout','hoveredLinkKey','fresh-stale','\x20ln-disabled','left','selfId','cos','/api/sync/reconcile-peer','lo_to_hi','_customPos','zoom','type','refreshTopology','application/json','lag-med','status','/api/sync/links/','selectLink','few\x20seconds\x20ago','_onSvgMousedown','direction','includes','json','wheel','\x20nd-lag','min','\x20→\x20','set','rec','\x20nd-critical','sin','_autoRefreshTimer','Remove\x20this\x20data\x20link?\x20Nodes\x20stay\x20connected\x20but\x20data\x20will\x20stop\x20syncing.','addEventListener','now','\x20nd-stale','$dispatch','has','both','translate(','length','idle','indexOf','disabled','\x20ln-lag-high','_onMouseup','panY','lo_pull','push','floor','\x20nd-hover','stringify','select','startsWith','selectedLinkKey','all','hoveredNodeId','color:var(--dis);opacity:0.7','_wheelCb','autoRefresh','lag-high','mousedown','hi_to_lo','isLinkInteractable','Save\x20failed','_onWheel','last_seen','removeEventListener','style','_mousedownCb','disconnect','3425260gFlLng','reconciling','height','577550oIposY','key','stale','12256006OnHxhv','.topo-g','fresh-ok','transform','loadingTopology','pointer-events:none','_effectivePos','editingLink','slice','okdb-topo-pos','savingLink','last_error','_healthMarker','enabled','backlog',')\x20scale(','588201pyoymB','nodeRadius','$attr','preventDefault','_groupEl','nodes','color:var(--ok)','getItem','/api/sync/reconcile','svg','hi_pull','get','lastUpdatedAt','_drag','_savePositions','map','mousemove','/api/sync/topology','available_envs','\x20ln-stale','_applyTransform','parse','\x20nd-dim','_svgEl','canon','visibilitychange','sort','getBoundingClientRect','clientY','message','\x20(mesh)','mouseup','links','removeItem','layout','sqrt','linkEditEnabled','url(#arrow-rev-','_ro','refresh\x20failed','selected_node_id','$el','\x20ln-rec','_mouseupCb','selectedNodeId','address','url(#arrow-disabled)','pan','_px2vb','lagging','self_id','clock','fitView','critical','querySelector','find','width','POST','error','deltaY','nodeHealth','clientX','$watch','\x20ln-err','writeText','availableEnvs','8157420IhQrpP','forEach','linkEditEnvs','clipboard','35145ytZcsZ','behind','\x20L\x20','delete','top','panX','filter','url(#arrow-','values','grabbing','_pullHealth','node_lo','\x20ln-dim','_visibilityHandler','parentElement','grab','cursor','_tick','reconcilingTarget','_measure','observe','max','border-color:var(--dis);color:var(--dis)','linkEditDir','link','DELETE','setAttribute','border-color:var(--accent);color:var(--accent);background:var(--bg)','pos','\x20⇄\x20','fresh-now','<div\x20style=\x22--bg:var(--okdb-app-bg-deep);\x20--panel:var(--okdb-app-surface);\x20--panel2:var(--okdb-app-bg-deep);\x20--border:var(--okdb-app-border);\x20--border2:var(--okdb-app-surface-2);\x0a\x20\x20--text:var(--okdb-app-fg);\x20--muted:var(--okdb-app-fg-muted);\x20--accent:var(--okdb-accent);\x20--ok:var(--okdb-success);\x20--rec:var(--okdb-accent);\x0a\x20\x20--warn:var(--okdb-warning);\x20--bad:var(--okdb-danger);\x20--err:var(--okdb-danger);\x20--dis:var(--okdb-app-fg-subtle);\x0a\x20\x20border:1px\x20solid\x20var(--border);\x20border-radius:12px;\x20background:var(--bg);\x20color:var(--text);\x0a\x20\x20display:flex;\x20flex-direction:column;\x20flex:1;\x20position:relative;\x20overflow:hidden;\x0a\x20\x20font-family:\x20ui-monospace,\x20monospace;\x22><div\x20style=\x22padding:12px\x2014px;display:flex;justify-content:space-between;border-bottom:1px\x20solid\x20var(--border2);background:var(--panel);align-items:center;\x22><div\x20style=\x22display:flex;align-items:center;gap:10px;\x22><div\x20style=\x22font-weight:700;letter-spacing:0.8px;color:var(--accent);\x22>NETWORK_TOPOLOGY</div><button\x20@click=\x22reconcileAll()\x22\x20:disabled=\x22reconciling\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--accent);cursor:pointer;\x22><span\x20style=\x22display:flex;align-items:center;gap:6px;\x22><span\x20:style=\x22reconcilingTarget===\x27all\x27?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20{{reconcilingTarget===\x27all\x27?\x27RECONCILING\x27:\x27RECONCILE\x20ALL\x27}}</span></button>\x20<button\x20@click=\x22refreshTopology()\x22\x20:disabled=\x22loadingTopology\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;\x22>REFRESH</button>\x20<button\x20@click=\x22fitView()\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;\x22\x20title=\x22Fit\x20all\x20nodes\x20into\x20view\x22>FIT</button>\x20<button\x20@click=\x22resetLayout()\x22\x20style=\x22font-size:11px;padding:4px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;\x22\x20title=\x22Reset\x20node\x20positions\x22>RESET</button>\x20<span\x20:style=\x22{opacity:loadingTopology?1:0}\x22\x20class=\x22spinner\x22/></div><div\x20style=\x22display:flex;align-items:center;gap:12px;font-size:11px;\x22><span\x20:class=\x22freshnessClass\x22>updated:\x20{{freshnessLabel}}</span>\x20<span\x20style=\x22opacity:0.75;\x22>{{nodes.length}}\x20NODES\x20//\x20{{links.length}}\x20LINKS</span></div></div><div\x20style=\x22flex:1;position:relative;\x22><svg\x20:viewBox=\x22\x270\x200\x20\x27+w+\x27\x20\x27+h\x22\x20style=\x22width:100%;height:100%;\x22><rect\x20:width=\x22w\x22\x20:height=\x22h\x22\x20fill=\x22transparent\x22\x20style=\x22pointer-events:all\x22\x20@click=\x22deselect()\x22/><defs><marker\x20id=\x22arrow-ok\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--ok)\x22/></marker><marker\x20id=\x22arrow-rec\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--rec)\x22/></marker><marker\x20id=\x22arrow-err\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--err)\x22/></marker><marker\x20id=\x22arrow-lag-med\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--warn)\x22/></marker><marker\x20id=\x22arrow-lag-high\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--bad)\x22/></marker><marker\x20id=\x22arrow-disabled\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--dis)\x22/></marker><marker\x20id=\x22arrow-rev-ok\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--ok)\x22/></marker><marker\x20id=\x22arrow-rev-rec\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--rec)\x22/></marker><marker\x20id=\x22arrow-rev-err\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--err)\x22/></marker><marker\x20id=\x22arrow-rev-lag-med\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--warn)\x22/></marker><marker\x20id=\x22arrow-rev-lag-high\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--bad)\x22/></marker><marker\x20id=\x22arrow-rev-disabled\x22\x20viewBox=\x220\x200\x2010\x2010\x22\x20refX=\x2210\x22\x20refY=\x225\x22\x20markerWidth=\x226\x22\x20markerHeight=\x226\x22\x20orient=\x22auto-start-reverse\x22><path\x20d=\x22M\x200\x200\x20L\x2010\x205\x20L\x200\x2010\x20z\x22\x20fill=\x22var(--dis)\x22/></marker></defs><style>.ln\x20{\x20fill:none;\x20stroke-width:1.9;\x20opacity:0.70;\x20transition:opacity\x200.14s,stroke-width\x200.14s,filter\x200.14s;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-ok\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--ok);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-behind-light\x20{\x20stroke:var(--okdb-info);\x20opacity:0.8;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-rec\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--rec);\x20stroke-dasharray:4\x203;\x20animation:dash\x201.1s\x20linear\x20infinite;\x20filter:drop-shadow(0\x200\x204px\x20rgba(77,163,255,0.5));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-lag-med\x20\x20\x20\x20\x20\x20{\x20stroke:var(--warn);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-lag-high\x20\x20\x20\x20\x20{\x20stroke:var(--bad);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-err\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--err);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-stale\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke:var(--okdb-app-fg-subtle);\x20opacity:0.5;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-disabled\x20\x20\x20\x20\x20{\x20stroke:var(--dis);\x20stroke-dasharray:6\x204;\x20opacity:0.45;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-dim\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20opacity:0.08;\x20filter:none\x20!important;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-hover\x20\x20\x20\x20\x20\x20\x20\x20{\x20stroke-width:3.0;\x20opacity:1;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.ln-selected\x20\x20\x20\x20\x20{\x20stroke:var(--accent)\x20!important;\x20stroke-width:5.2\x20!important;\x20opacity:1\x20!important;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20filter:drop-shadow(0\x200\x204px\x20rgba(77,163,255,0.9))\x20drop-shadow(0\x200\x2010px\x20rgba(77,163,255,0.35));\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd\x20circle\x20{\x20fill:var(--bg);\x20stroke:var(--border);\x20stroke-width:2;\x20transition:stroke\x200.14s,stroke-width\x200.14s,filter\x200.14s,opacity\x200.14s;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd\x20text\x20\x20\x20{\x20fill:var(--muted);\x20font-size:11px;\x20pointer-events:none;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-hover\x20\x20circle\x20{\x20stroke:rgba(77,163,255,0.8);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-sel\x20\x20\x20\x20circle\x20{\x20stroke:var(--accent);\x20stroke-width:3.4;\x20filter:drop-shadow(0\x200\x204px\x20rgba(77,163,255,0.75))\x20drop-shadow(0\x200\x2010px\x20rgba(77,163,255,0.25));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-sel2\x20\x20\x20circle\x20{\x20stroke:rgba(77,163,255,0.75);\x20stroke-width:3.0;\x20filter:drop-shadow(0\x200\x206px\x20rgba(77,163,255,0.25));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-dim\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20{\x20opacity:0.22;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-err\x20\x20\x20\x20circle\x20\x20{\x20stroke:var(--err);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-stale\x20\x20circle\x20\x20{\x20stroke:var(--okdb-app-fg-subtle);\x20stroke-width:2;\x20opacity:0.7;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-behind\x20circle\x20\x20{\x20stroke:var(--okdb-info);\x20stroke-width:2.5;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-lag\x20\x20\x20\x20circle\x20\x20{\x20stroke:var(--warn);\x20stroke-width:3;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.nd-critical\x20circle\x20{\x20stroke:var(--bad);\x20stroke-width:3.5;\x20filter:drop-shadow(0\x200\x206px\x20rgba(255,77,77,0.5));\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.fresh-now\x20\x20\x20{\x20color:var(--ok);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.fresh-ok\x20\x20\x20\x20{\x20color:var(--okdb-info);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.fresh-stale\x20{\x20color:var(--warn);\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.spinner\x20{\x20display:inline-block;\x20width:12px;\x20height:12px;\x20border:2px\x20solid\x20rgba(77,163,255,0.2);\x20border-top:2px\x20solid\x20var(--accent);\x20border-radius:50%;\x20animation:spin\x200.8s\x20linear\x20infinite;\x20flex-shrink:0;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keyframes\x20dash\x20{\x20to\x20{\x20stroke-dashoffset:-14;\x20}\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keyframes\x20spin\x20\x20{\x20to\x20{\x20transform:rotate(360deg);\x20}\x20}</style><g\x20class=\x22topo-g\x22><for\x20:=\x22links\x22\x20let:l><if\x20:=\x22!isActiveLink(l)\x22><g><path\x20:d=\x22linkPath(l)\x22\x20stroke=\x22transparent\x22\x20stroke-width=\x2214\x22\x20fill=\x22none\x22\x20:style=\x22_sPointerEventsFor(l)\x22\x20@mouseenter=\x22isLinkInteractable(l)?(hoveredLinkKey=l.key):null\x22\x20@mouseleave=\x22hoveredLinkKey=null\x22\x20@click=\x22pickLink(l.key)\x22/><path\x20:d=\x22linkPath(l)\x22\x20:class=\x22linkClass(l)\x22\x20:marker-end=\x22linkMarker(l)\x22\x20:marker-start=\x22linkStartMarker(l)\x22><title>{{l.lo.slice(0,8)}}\x20↔\x20{{l.hi.slice(0,8)}}\x20direction:\x20{{l.link\x20?\x20l.link.direction\x20:\x20\x27mesh\x27}}\x20enabled:\x20{{l.link\x20?\x20l.link.enabled\x20:\x20true}}\x20envs:\x20{{l.link\x20&&\x20l.link.envs\x20?\x20l.link.envs.join(\x27,\x20\x27)\x20:\x20\x27all\x27}}</title></path></g></if></for><for\x20:=\x22nodeList\x22\x20let:n><g\x20:id=\x22\x27nd-\x27+n.id\x22\x20:transform=\x22\x27translate(\x27+n.px+\x27,\x27+n.py+\x27)\x27\x22\x20:class=\x22nodeClass(n)\x22\x20@mouseenter=\x22hoveredNodeId=n.id\x22\x20@mouseleave=\x22hoveredNodeId=null\x22\x20@click=\x22pickNode(n.id)\x22><circle\x20:r=\x22nodeRadius()\x22/><text\x20text-anchor=\x22middle\x22\x20dy=\x224\x22>{{n.id.slice(0,6)}}</text><title>{{n.id}}\x20clock:\x20{{n.clock\x20??\x20\x27--\x27}}\x20addr:\x20{{n.address\x20??\x20\x27—\x27}}</title></g></for><for\x20:=\x22links\x22\x20let:l><if\x20:=\x22isActiveLink(l)\x22><g><path\x20:d=\x22linkPath(l)\x22\x20stroke=\x22transparent\x22\x20stroke-width=\x2216\x22\x20fill=\x22none\x22\x20:style=\x22_sPointerEventsFor(l)\x22\x20@mouseenter=\x22isLinkInteractable(l)?(hoveredLinkKey=l.key):null\x22\x20@mouseleave=\x22hoveredLinkKey=null\x22\x20@click=\x22pickLink(l.key)\x22/><path\x20:d=\x22linkPath(l)\x22\x20:class=\x22linkClass(l)\x22\x20:marker-end=\x22linkMarker(l)\x22\x20:marker-start=\x22linkStartMarker(l)\x22/></g></if></for></g></svg><if\x20:=\x22selection\x20||\x20editingLink\x22><div\x20style=\x22position:absolute;top:18px;right:18px;width:320px;background:var(--panel);border:1px\x20solid\x20var(--border);border-radius:12px;padding:16px;box-shadow:0\x2016px\x2034px\x20rgba(0,0,0,0.45);border-left:4px\x20solid\x20var(--accent);\x22><div\x20style=\x22display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;\x22><span\x20style=\x22font-size:10px;background:var(--bg);padding:3px\x207px;border-radius:6px;color:var(--accent);letter-spacing:0.6px;\x22>{{editingLink\x20?\x20\x27LINK_CONFIG\x27\x20:\x20selection.type.toUpperCase()}}\x20</span><span\x20@click=\x22editingLink\x20?\x20closeLinkEditor()\x20:\x20deselect()\x22\x20style=\x22cursor:pointer;opacity:0.7;font-size:16px;line-height:12px;\x22>×</span></div><if\x20:=\x22!editingLink\x20&&\x20selection\x20&&\x20selection.type\x20===\x20\x27node\x27\x22><div\x20style=\x22font-size:13px;\x22><div\x20style=\x22display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;\x22><div\x20style=\x22color:var(--text);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>{{selection.id}}</div><button\x20@click=\x22copy(selection.id)\x22\x20style=\x22border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);font-size:11px;padding:4px\x208px;border-radius:8px;cursor:pointer;\x22>copy</button></div><div\x20style=\x22display:grid;grid-template-columns:92px\x201fr;row-gap:8px;column-gap:10px;\x22><div\x20style=\x22opacity:0.65;\x22>Clock</div><div>{{selection.data.clock??\x27--\x27}}</div><div\x20style=\x22opacity:0.65;\x22>Addr</div><div\x20style=\x22font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\x22>{{selection.data.address||\x27N/A\x27}}</div><div\x20style=\x22opacity:0.65;\x22>Status</div><div\x20:style=\x22selection.data.error?\x27color:var(--err)\x27:\x27color:var(--ok)\x27\x22>{{selection.data.error?(\x27ERR:\x20\x27+selection.data.error):\x27OK\x27}}</div></div><div\x20style=\x22margin-top:12px;border-top:1px\x20solid\x20var(--border2);padding-top:10px;\x22><div\x20style=\x22font-size:11px;opacity:0.7;margin-bottom:6px;\x22>Tags</div><div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;\x22><if\x20:=\x22!(selection.data.tags\x20||\x20[]).length\x22><span\x20style=\x22font-size:11px;opacity:0.45;\x22>No\x20tags</span></if><for\x20:=\x22selection.data.tags\x20||\x20[]\x22\x20let:tag><span\x20style=\x22font-size:10px;padding:2px\x208px;border-radius:999px;border:1px\x20solid\x20var(--okdb-accent-soft-border);color:var(--okdb-accent);background:var(--okdb-accent-soft-bg);\x22>{{tag}}</span></for></div></div><div\x20style=\x22margin-top:12px;border-top:1px\x20solid\x20var(--border2);padding-top:10px;\x22><div\x20style=\x22font-size:11px;opacity:0.7;margin-bottom:6px;\x22>Available\x20envs</div><div\x20style=\x22font-size:11px;color:var(--muted);line-height:1.5;word-break:break-word;\x22>{{(selection.data.availableEnvs\x20||\x20[]).join(\x27,\x20\x27)\x20||\x20\x27—\x27}}</div></div><div\x20style=\x22margin-top:12px;border-top:1px\x20solid\x20var(--border2);padding-top:10px;\x22><div\x20style=\x22font-size:11px;opacity:0.7;margin-bottom:6px;\x22>Outbound\x20peers</div><div\x20style=\x22display:flex;flex-wrap:wrap;gap:6px;\x22><for\x20:=\x22Object.keys(selection.data.peers||{})\x22\x20let:pid><span\x20style=\x22font-size:11px;padding:3px\x207px;border:1px\x20solid\x20var(--border);background:var(--panel2);border-radius:999px;color:var(--muted);\x22>{{pid.slice(0,8)}}</span></for></div></div><div\x20style=\x22margin-top:14px;\x22><button\x20@click=\x22reconcileNode(selection.id)\x22\x20:disabled=\x22reconciling\x22\x20style=\x22width:100%;box-sizing:border-box;padding:6px\x2010px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--accent);cursor:pointer;font-size:12px;\x22><span\x20style=\x22display:flex;align-items:center;justify-content:center;gap:6px;\x22><span\x20:style=\x22reconcilingTarget===selection.id?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20{{reconcilingTarget===selection.id?\x27RECONCILING\x27:\x27RECONCILE\x20NODE\x27}}</span></button></div></div></if><if\x20:=\x22!editingLink\x20&&\x20selection\x20&&\x20selection.type\x20===\x20\x27link\x27\x22><div\x20style=\x22font-size:13px;\x22><div\x20style=\x22margin-bottom:12px;\x22><div\x20style=\x22display:flex;align-items:center;gap:8px;margin-bottom:6px;\x22><span\x20style=\x22font-family:monospace;font-size:12px;font-weight:700;\x22>{{selection.data.lo.slice(0,8)}}</span>\x20<span\x20style=\x22font-size:16px;color:var(--accent);\x22>{{selection.data.link\x20?\x20(selection.data.link.direction\x20===\x20\x27lo_to_hi\x27\x20?\x20\x27→\x27\x20:\x20selection.data.link.direction\x20===\x20\x27hi_to_lo\x27\x20?\x20\x27←\x27\x20:\x20\x27⇄\x27)\x20:\x20\x27⇄\x27}}\x20</span><span\x20style=\x22font-family:monospace;font-size:12px;font-weight:700;\x22>{{selection.data.hi.slice(0,8)}}</span><if\x20:=\x22selection.data.link\x22><span\x20style=\x22font-size:11px;margin-left:4px;\x22\x20:style=\x22_sEnabledBadge(selection.data.link.enabled)\x22>{{selection.data.link.enabled\x20?\x20\x27●\x20on\x27\x20:\x20\x27○\x20off\x27}}</span></if></div><if\x20:=\x22selection.data.link\x20&&\x20selection.data.link.envs\x22><div\x20style=\x22font-size:11px;opacity:0.45;\x22>envs:\x20{{selection.data.link.envs.join(\x27,\x20\x27)}}</div></if><if\x20:=\x22!selection.data.link\x22><div\x20style=\x22font-size:11px;opacity:0.45;\x22>no\x20link\x20config\x20—\x20mesh\x20(legacy)</div></if></div><div\x20style=\x22border:1px\x20solid\x20var(--border2);border-radius:8px;overflow:hidden;margin-bottom:12px;font-size:11px;\x22><if\x20:=\x22!selection.data.link\x20||\x20selection.data.link.direction\x20===\x20\x27both\x27\x20||\x20selection.data.link.direction\x20===\x20\x27lo_to_hi\x27\x22><div\x20style=\x22padding:9px\x2011px;border-bottom:1px\x20solid\x20var(--bg);\x22><div\x20style=\x22display:flex;align-items:center;gap:6px;margin-bottom:6px;\x22><span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.lo.slice(0,6)}}</span>\x20<span\x20style=\x22color:var(--accent);\x22>→</span>\x20<span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.hi.slice(0,6)}}</span>\x20<span\x20style=\x22opacity:0.4;\x22>(hi\x20receives\x20from\x20lo)</span></div><div\x20style=\x22display:grid;grid-template-columns:70px\x201fr;row-gap:4px;gap:6px;opacity:0.85;\x22><span\x20style=\x22opacity:0.5;\x22>status</span>\x20<span>{{selection.data.hi_pull\x20?\x20selection.data.hi_pull.status\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>backlog</span>\x20<span>{{selection.data.hi_pull\x20?\x20selection.data.hi_pull.backlog\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>last\x20seen</span>\x20<span>{{selection.data.hi_pull\x20&&\x20selection.data.hi_pull.last_seen\x20?\x20(Math.round((now\x20-\x20selection.data.hi_pull.last_seen)/1000)\x20+\x20\x27s\x20ago\x27)\x20:\x20\x27—\x27}}</span><if\x20:=\x22selection.data.hi_pull\x20&&\x20selection.data.hi_pull.last_error\x22><span\x20style=\x22opacity:0.5;\x22>error</span>\x20<span\x20style=\x22color:var(--err);\x22>{{selection.data.hi_pull.last_error}}</span></if></div></div></if><if\x20:=\x22!selection.data.link\x20||\x20selection.data.link.direction\x20===\x20\x27both\x27\x20||\x20selection.data.link.direction\x20===\x20\x27hi_to_lo\x27\x22><div\x20style=\x22padding:9px\x2011px;\x22><div\x20style=\x22display:flex;align-items:center;gap:6px;margin-bottom:6px;\x22><span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.hi.slice(0,6)}}</span>\x20<span\x20style=\x22color:var(--accent);\x22>→</span>\x20<span\x20style=\x22font-family:monospace;opacity:0.7;\x22>{{selection.data.lo.slice(0,6)}}</span>\x20<span\x20style=\x22opacity:0.4;\x22>(lo\x20receives\x20from\x20hi)</span></div><div\x20style=\x22display:grid;grid-template-columns:70px\x201fr;row-gap:4px;gap:6px;opacity:0.85;\x22><span\x20style=\x22opacity:0.5;\x22>status</span>\x20<span>{{selection.data.lo_pull\x20?\x20selection.data.lo_pull.status\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>backlog</span>\x20<span>{{selection.data.lo_pull\x20?\x20selection.data.lo_pull.backlog\x20:\x20\x27—\x27}}</span>\x20<span\x20style=\x22opacity:0.5;\x22>last\x20seen</span>\x20<span>{{selection.data.lo_pull\x20&&\x20selection.data.lo_pull.last_seen\x20?\x20(Math.round((now\x20-\x20selection.data.lo_pull.last_seen)/1000)\x20+\x20\x27s\x20ago\x27)\x20:\x20\x27—\x27}}</span><if\x20:=\x22selection.data.lo_pull\x20&&\x20selection.data.lo_pull.last_error\x22><span\x20style=\x22opacity:0.5;\x22>error</span>\x20<span\x20style=\x22color:var(--err);\x22>{{selection.data.lo_pull.last_error}}</span></if></div></div></if></div><div\x20style=\x22display:flex;flex-direction:column;gap:7px;\x22><button\x20@click=\x22reconcileLink(selection.data)\x22\x20:disabled=\x22reconciling\x22\x20style=\x22width:100%;box-sizing:border-box;padding:7px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--accent);cursor:pointer;font-size:12px;\x22><span\x20style=\x22display:flex;align-items:center;justify-content:center;gap:6px;\x22><span\x20:style=\x22reconcilingTarget===selection.data.key?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20{{reconcilingTarget===selection.data.key\x20?\x20\x27Reconciling…\x27\x20:\x20\x27Reconcile\x27}}</span></button>\x20<button\x20@click=\x22openLinkEditor(selection.data)\x22\x20style=\x22width:100%;box-sizing:border-box;padding:7px;border-radius:8px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;font-size:12px;\x22>✎\x20Configure\x20Link</button></div></div></if><if\x20:=\x22editingLink\x22><div\x20style=\x22font-size:13px;\x22><div\x20style=\x22margin-bottom:14px;\x22><div\x20style=\x22font-family:monospace;font-size:11px;opacity:0.5;margin-bottom:2px;\x22>link\x20id</div><div\x20style=\x22font-family:monospace;font-size:11px;\x22>{{editingLink.key}}</div></div><div\x20style=\x22margin-bottom:14px;\x22><div\x20style=\x22font-size:11px;opacity:0.5;margin-bottom:7px;\x22>Direction</div><div\x20style=\x22display:flex;flex-direction:column;gap:5px;\x22><for\x20:=\x22dirButtons\x22\x20let:btn><button\x20@click=\x22linkEditDir\x20=\x20btn.canon\x22\x20:style=\x22btn.style\x22\x20style=\x22width:100%;box-sizing:border-box;padding:7px\x2010px;border-radius:7px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;font-size:12px;font-family:monospace;text-align:left;\x22>{{btn.label}}</button></for></div></div><if\x20:=\x22availableEnvs.length\x22><div\x20style=\x22margin-bottom:14px;\x22><div\x20style=\x22font-size:11px;opacity:0.5;margin-bottom:7px;\x22>Data\x20envs\x20—\x20{{linkEditEnvs\x20===\x20null\x20?\x20\x27all\x27\x20:\x20linkEditEnvs.length\x20+\x20\x27\x20selected\x27}}</div><div\x20style=\x22display:flex;flex-wrap:wrap;gap:5px;\x22><for\x20:=\x22envButtons\x22\x20let:btn><button\x20@click=\x22toggleLinkEnv(btn.name)\x22\x20:style=\x22btn.style\x22\x20style=\x22padding:4px\x2010px;border-radius:6px;border:1px\x20solid\x20var(--border);background:var(--panel2);color:var(--muted);cursor:pointer;font-size:11px;\x22>{{btn.name}}</button></for></div></div></if><div\x20style=\x22margin-bottom:16px;display:flex;align-items:center;gap:10px;\x22><span\x20style=\x22font-size:11px;opacity:0.5;\x22>Enabled</span>\x20<button\x20@click=\x22linkEditEnabled=!linkEditEnabled\x22\x20:style=\x22_sEnabledBtn(linkEditEnabled)\x22\x20style=\x22padding:4px\x2012px;border-radius:6px;border:1px\x20solid;background:var(--panel2);cursor:pointer;font-size:11px;\x22>{{linkEditEnabled\x20?\x20\x27●\x20ON\x27\x20:\x20\x27○\x20OFF\x27}}</button></div><div\x20style=\x22display:flex;gap:8px;\x22><button\x20@click=\x22saveLink()\x22\x20:disabled=\x22savingLink\x22\x20style=\x22flex:1;padding:8px;border-radius:8px;border:1px\x20solid\x20var(--accent);background:rgba(77,163,255,0.1);color:var(--accent);cursor:pointer;font-size:12px;\x22><span\x20style=\x22display:flex;align-items:center;justify-content:center;gap:5px;\x22><span\x20:style=\x22savingLink?\x27display:inline-block\x27:\x27display:none\x27\x22\x20class=\x22spinner\x22/>\x20Save</span></button>\x20<button\x20@click=\x22deleteLink()\x22\x20:disabled=\x22savingLink\x22\x20style=\x22padding:8px\x2014px;border-radius:8px;border:1px\x20solid\x20#3d1a1a;background:rgba(255,59,48,0.08);color:var(--err);cursor:pointer;font-size:12px;\x22>Remove</button></div></div></if></div></if></div><div\x20style=\x22padding:9px\x2014px;background:var(--bg);border-top:1px\x20solid\x20var(--border2);display:flex;gap:16px;font-size:11px;align-items:center;flex-wrap:wrap;opacity:0.9;\x22><span><span\x20style=\x22color:var(--ok);\x22>●</span>\x20synced</span>\x20<span><span\x20style=\x22color:var(--okdb-info);\x22>●</span>\x20behind</span>\x20<span><span\x20style=\x22color:var(--rec);\x22>●</span>\x20reconciling</span>\x20<span><span\x20style=\x22color:var(--warn);\x22>●</span>\x20lag</span>\x20<span><span\x20style=\x22color:var(--err);\x22>●</span>\x20error</span>\x20<span><span\x20style=\x22color:var(--dis);\x22>●</span>\x20disabled</span>\x20<span\x20style=\x22opacity:0.4;\x22>⇄\x20both\x20→\x20send\x20←\x20receive\x20--\x20disabled\x20(click\x20to\x20inspect)</span></div></div>'];_0x15a2=function(){return _0x2ceb39;};return _0x15a2();}const _0x4a26d6=_0x3111;function _0x3111(_0x14d4a3,_0x106efd){_0x14d4a3=_0x14d4a3-0xba;const _0x15a23b=_0x15a2();let _0x3111ba=_0x15a23b[_0x14d4a3];return _0x3111ba;}(function(_0x504811,_0x1e5e47){const _0xc1ed=_0x3111,_0x21d417=_0x504811();while(!![]){try{const _0x294e9d=-parseInt(_0xc1ed(0x152))/0x1+-parseInt(_0xc1ed(0xee))/0x2+-parseInt(_0xc1ed(0xcd))/0x3+-parseInt(_0xc1ed(0x13c))/0x4+-parseInt(_0xc1ed(0x13f))/0x5+parseInt(_0xc1ed(0xc9))/0x6+parseInt(_0xc1ed(0x142))/0x7;if(_0x294e9d===_0x1e5e47)break;else _0x21d417['push'](_0x21d417['shift']());}catch(_0x32f5a0){_0x21d417['push'](_0x21d417['shift']());}}}(_0x15a2,0xe9a4b));export default{'tag':'sync-topology','unwrap':!0x0,'context':_0x18a441=>({'w':0x384,'h':0x1f4,'layout':{'cx':0x0,'cy':0x0,'r':0x0,'pos':{}},'_ro':null,'_tick':null,'now':Date[_0x4a26d6(0x117)](),'selectedNodeId':null,'selectedLinkKey':null,'hoveredLinkKey':null,'hoveredNodeId':null,'lastUpdatedAt':null,'autoRefresh':!0x0,'autoRefreshIntervalMs':0x1388,'_autoRefreshTimer':null,'loadingTopology':!0x1,'editingLink':null,'linkEditDir':_0x4a26d6(0x11b),'linkEditEnvs':null,'linkEditEnabled':!0x0,'savingLink':!0x1,'panX':0x0,'panY':0x0,'zoom':0x1,'_drag':null,'_customPos':{},'_svgEl':null,'_groupEl':null,'_applyTransform'(){const _0x542513=_0x4a26d6;this['_groupEl']||(this[_0x542513(0x156)]=this[_0x542513(0x169)]?.[_0x542513(0xbd)](_0x542513(0x143))),this[_0x542513(0x156)]&&this[_0x542513(0x156)][_0x542513(0xe7)](_0x542513(0x145),_0x542513(0x11c)+this[_0x542513(0xd2)]+','+this['panY']+_0x542513(0x151)+this['zoom']+')');},'_px2vb'(){const _0x17e13e=_0x4a26d6;if(!this['_svgEl'])return{'sx':0x1,'sy':0x1};const _0x2a8ecf=this[_0x17e13e(0x169)][_0x17e13e(0x16d)]();return{'sx':this['w']/(_0x2a8ecf[_0x17e13e(0xbf)]||0x1),'sy':this['h']/(_0x2a8ecf[_0x17e13e(0x13e)]||0x1)};},'_onWheel'(_0x2cfbd5){const _0x254d32=_0x4a26d6;if(!this['_svgEl'])return;const _0xc19cd8=this[_0x254d32(0x169)][_0x254d32(0x16d)](),{sx:_0x3d5760,sy:_0x25af5d}=this['_px2vb'](),_0x38e12d=(_0x2cfbd5[_0x254d32(0xc4)]-_0xc19cd8['left'])*_0x3d5760,_0x341ba7=(_0x2cfbd5['clientY']-_0xc19cd8[_0x254d32(0xd1)])*_0x25af5d,_0x452a1c=_0x2cfbd5[_0x254d32(0xc2)]<0x0?1.12:0x1/1.12,_0x185291=Math[_0x254d32(0xe2)](0.1,Math[_0x254d32(0x10e)](0x8,this[_0x254d32(0xff)]*_0x452a1c)),_0x27dab7=_0x185291/this['zoom'];this[_0x254d32(0xd2)]=_0x38e12d+(this[_0x254d32(0xd2)]-_0x38e12d)*_0x27dab7,this[_0x254d32(0x123)]=_0x341ba7+(this[_0x254d32(0x123)]-_0x341ba7)*_0x27dab7,this[_0x254d32(0xff)]=_0x185291,this[_0x254d32(0x166)]();},'_onSvgMousedown'(_0x18386e){const _0xbc9fdc=_0x4a26d6;if(0x0!==_0x18386e['button'])return;_0x18386e[_0xbc9fdc(0x155)]();let _0x1333a2=null,_0x3677eb=_0x18386e['target'];for(;_0x3677eb&&_0x3677eb!==this[_0xbc9fdc(0x169)];){if(_0x3677eb['id']&&_0x3677eb['id'][_0xbc9fdc(0x12a)]('nd-')){_0x1333a2=_0x3677eb['id'][_0xbc9fdc(0x14a)](0x3);break;}_0x3677eb=_0x3677eb[_0xbc9fdc(0xdb)];}if(_0x1333a2){const _0x4d67aa=this[_0xbc9fdc(0x169)][_0xbc9fdc(0x16d)](),{sx:_0x1300a4,sy:_0x21e68b}=this[_0xbc9fdc(0x182)](),_0x1bcc44=(_0x18386e[_0xbc9fdc(0xc4)]-_0x4d67aa[_0xbc9fdc(0xf9)])*_0x1300a4,_0x42c0cc=(_0x18386e[_0xbc9fdc(0x16e)]-_0x4d67aa[_0xbc9fdc(0xd1)])*_0x21e68b,_0x42cf3b=(_0x1bcc44-this['panX'])/this[_0xbc9fdc(0xff)],_0x580d84=(_0x42c0cc-this[_0xbc9fdc(0x123)])/this[_0xbc9fdc(0xff)],_0x170ef3=this[_0xbc9fdc(0x148)](_0x1333a2)||{'x':_0x42cf3b,'y':_0x580d84};this[_0xbc9fdc(0x15f)]={'type':_0xbc9fdc(0xf3),'id':_0x1333a2,'ox':_0x42cf3b-_0x170ef3['x'],'oy':_0x580d84-_0x170ef3['y']};}else this['_drag']={'type':_0xbc9fdc(0x181),'sx':_0x18386e['clientX'],'sy':_0x18386e[_0xbc9fdc(0x16e)],'px':this[_0xbc9fdc(0xd2)],'py':this['panY']};this[_0xbc9fdc(0x169)]&&(this[_0xbc9fdc(0x169)][_0xbc9fdc(0x139)][_0xbc9fdc(0xdd)]=_0xbc9fdc(0xd6));},'_onMousemove'(_0x26f495){const _0x1e1c54=_0x4a26d6;if(!this[_0x1e1c54(0x15f)])return;const {sx:_0x4838d7,sy:_0x56089d}=this[_0x1e1c54(0x182)]();if(_0x1e1c54(0x181)===this['_drag'][_0x1e1c54(0x100)])this[_0x1e1c54(0xd2)]=this['_drag']['px']+(_0x26f495[_0x1e1c54(0xc4)]-this['_drag']['sx'])*_0x4838d7,this[_0x1e1c54(0x123)]=this[_0x1e1c54(0x15f)]['py']+(_0x26f495[_0x1e1c54(0x16e)]-this[_0x1e1c54(0x15f)]['sy'])*_0x56089d,this[_0x1e1c54(0x166)]();else{const _0xe18dbe=this[_0x1e1c54(0x169)][_0x1e1c54(0x16d)](),_0x424a82=(_0x26f495[_0x1e1c54(0xc4)]-_0xe18dbe[_0x1e1c54(0xf9)])*_0x4838d7,_0x13fa24=(_0x26f495[_0x1e1c54(0x16e)]-_0xe18dbe[_0x1e1c54(0xd1)])*_0x56089d,_0x440d4b=(_0x424a82-this[_0x1e1c54(0xd2)])/this[_0x1e1c54(0xff)],_0x2a3808=(_0x13fa24-this[_0x1e1c54(0x123)])/this[_0x1e1c54(0xff)];this['_customPos']={...this['_customPos'],[this[_0x1e1c54(0x15f)]['id']]:{'x':_0x440d4b-this[_0x1e1c54(0x15f)]['ox'],'y':_0x2a3808-this[_0x1e1c54(0x15f)]['oy']}},this[_0x1e1c54(0x160)]();}},'_onMouseup'(){const _0x547cfd=_0x4a26d6;this[_0x547cfd(0x15f)]=null,this['_svgEl']&&(this['_svgEl']['style'][_0x547cfd(0xdd)]=_0x547cfd(0xdc));},get 'externalSelectedNodeId'(){const _0x29de75=_0x4a26d6;return _0x18a441['$attr'][_0x29de75(0x17a)]??null;},get 'selfId'(){const _0x56ed28=_0x4a26d6;return _0x18a441[_0x56ed28(0x154)][_0x56ed28(0x184)];},get 'topology'(){const _0x2aa8b7=_0x4a26d6;return _0x18a441[_0x2aa8b7(0x154)]['topology']||{};},get 'availableEnvs'(){const _0x28c3cd=_0x4a26d6;return _0x18a441[_0x28c3cd(0x154)][_0x28c3cd(0x164)]||[];},get 'envButtons'(){const _0x4d2865=_0x4a26d6,_0x453e63=this[_0x4d2865(0xcb)];return(_0x18a441[_0x4d2865(0x154)][_0x4d2865(0x164)]||[])[_0x4d2865(0x161)](_0x26130c=>({'name':_0x26130c,'style':null===_0x453e63||Array['isArray'](_0x453e63)&&_0x453e63[_0x4d2865(0x10a)](_0x26130c)?_0x4d2865(0xe8):''}));},get 'dirButtons'(){const _0x26296a=_0x4a26d6,_0x49610e=this['editingLink'];if(!_0x49610e)return[];const _0x500e96=_0x49610e['lo']['slice'](0x0,0x6),_0xe769b5=_0x49610e['hi'][_0x26296a(0x14a)](0x0,0x6),_0x5365f2=this['linkEditDir'];return[{'canon':_0x26296a(0x11b),'label':_0x500e96+_0x26296a(0xea)+_0xe769b5},{'canon':_0x26296a(0xfd),'label':_0x500e96+_0x26296a(0x10f)+_0xe769b5},{'canon':_0x26296a(0x133),'label':_0xe769b5+'\x20→\x20'+_0x500e96}][_0x26296a(0x161)](_0x53843a=>({..._0x53843a,'style':_0x53843a[_0x26296a(0x16a)]===_0x5365f2?'border-color:var(--accent);color:var(--accent)':''}));},get 'nodes'(){const _0x7adb1d=_0x4a26d6;return Object[_0x7adb1d(0xd5)](this['topology']||{})[_0x7adb1d(0xd3)](_0x4b30de=>_0x4b30de&&null!=_0x4b30de['id'])[_0x7adb1d(0x16c)]((_0x572c48,_0x1bcf03)=>String(_0x572c48['id'])['localeCompare'](String(_0x1bcf03['id'])));},get 'nodeList'(){const _0x7a600a=_0x4a26d6;return this[_0x7a600a(0x157)][_0x7a600a(0x161)](_0x59aabb=>{const _0x4238ed=_0x7a600a,_0x1c4c71=this['_customPos'][_0x59aabb['id']]||this[_0x4238ed(0x174)]['pos']?.[_0x59aabb['id']]||{'x':this['w']/0x2,'y':this['h']/0x2};return{..._0x59aabb,'px':_0x1c4c71['x'],'py':_0x1c4c71['y']};});},get 'links'(){const _0x4d82db=_0x4a26d6,_0x259a07=this[_0x4d82db(0xf0)]||{},_0x472bb4=_0x259a07[this[_0x4d82db(0xfa)]]||Object[_0x4d82db(0xd5)](_0x259a07)['find'](_0x34bb7b=>null!=_0x34bb7b?.[_0x4d82db(0x172)]),_0xd00e00=_0x472bb4?.['links']||{},_0x2c0a53=new Map(),_0x4af9a6=(_0x565eae,_0x5058d1)=>({'status':_0x565eae['status']||_0x4d82db(0x11e),'backlog':Math['max'](0x0,Number(_0x5058d1??0x0)-Number(_0x565eae[_0x4d82db(0xba)]??0x0)),'last_seen':_0x565eae[_0x4d82db(0x137)]??null,'last_error':_0x565eae[_0x4d82db(0x14d)]??null});for(const _0xc3c1ff in _0x259a07){const _0x372dd9=_0x259a07[_0xc3c1ff];if(_0x372dd9?.['peers'])for(const _0x55c54b in _0x372dd9['peers']){const _0x509ecd=_0xc3c1ff<_0x55c54b?_0xc3c1ff:_0x55c54b,_0x832bad=_0xc3c1ff<_0x55c54b?_0x55c54b:_0xc3c1ff,_0x3c56a0=_0x509ecd+':'+_0x832bad;_0x2c0a53[_0x4d82db(0x11a)](_0x3c56a0)||_0x2c0a53[_0x4d82db(0x110)](_0x3c56a0,{'lo':_0x509ecd,'hi':_0x832bad,'lo_pull':null,'hi_pull':null});const _0x11e04c=_0x2c0a53[_0x4d82db(0x15d)](_0x3c56a0),_0x4f61f9=_0x372dd9['peers'][_0x55c54b];_0xc3c1ff===_0x509ecd?_0x11e04c[_0x4d82db(0x124)]=_0x4af9a6(_0x4f61f9,_0x259a07[_0x55c54b]?.[_0x4d82db(0xba)]):_0x11e04c[_0x4d82db(0x15c)]=_0x4af9a6(_0x4f61f9,_0x259a07[_0x55c54b]?.[_0x4d82db(0xba)]);}}for(const _0x47d608 in _0xd00e00)if(_0xd00e00[_0x47d608]&&!_0x2c0a53[_0x4d82db(0x11a)](_0x47d608)){const _0x5ddb2c=_0xd00e00[_0x47d608];_0x2c0a53[_0x4d82db(0x110)](_0x47d608,{'lo':_0x5ddb2c[_0x4d82db(0xd8)],'hi':_0x5ddb2c[_0x4d82db(0xf4)],'lo_pull':null,'hi_pull':null});}return[..._0x2c0a53['entries']()]['map'](([_0x2fc3e7,_0x5d1e03])=>({'key':_0x2fc3e7,'lo':_0x5d1e03['lo'],'hi':_0x5d1e03['hi'],'link':_0xd00e00[_0x2fc3e7]||null,'lo_pull':_0x5d1e03['lo_pull'],'hi_pull':_0x5d1e03['hi_pull']}));},'_linkConfig'(_0x1bc225){const _0x35531b=_0x4a26d6,_0x2ba74f=(this[_0x35531b(0xf0)]||{})[this[_0x35531b(0xfa)]];return _0x2ba74f?.[_0x35531b(0x172)]?.[_0x1bc225]||null;},'_linkHealth'(_0x41a7cd){const _0x1c517e=_0x4a26d6;if(_0x41a7cd['link']&&!_0x41a7cd[_0x1c517e(0xe5)][_0x1c517e(0x14f)])return'disabled';const _0x101242=_0x41a7cd[_0x1c517e(0xe5)]?.[_0x1c517e(0x109)]??'both',_0x497a1e=[];'both'!==_0x101242&&'lo_to_hi'!==_0x101242||_0x497a1e[_0x1c517e(0x125)](_0x41a7cd['hi_pull']),_0x1c517e(0x11b)!==_0x101242&&_0x1c517e(0x133)!==_0x101242||_0x497a1e[_0x1c517e(0x125)](_0x41a7cd[_0x1c517e(0x124)]);const _0x4cff43=['error',_0x1c517e(0x131),'lag-med',_0x1c517e(0xce),_0x1c517e(0x13d),'stale','ok'];let _0x3c58d1=_0x1c517e(0x141);for(const _0x2b6ea3 of _0x497a1e){const _0x2804d0=this[_0x1c517e(0xd7)](_0x2b6ea3);_0x4cff43[_0x1c517e(0x11f)](_0x2804d0)<_0x4cff43[_0x1c517e(0x11f)](_0x3c58d1)&&(_0x3c58d1=_0x2804d0);}return _0x3c58d1;},'_pullHealth'(_0x23a388){const _0x5d6b65=_0x4a26d6;if(!_0x23a388)return _0x5d6b65(0x141);if(_0x5d6b65(0x13d)===_0x23a388[_0x5d6b65(0x104)])return _0x5d6b65(0x13d);if(_0x23a388[_0x5d6b65(0x137)]){const _0x5009b8=this[_0x5d6b65(0x117)]-Number(_0x23a388[_0x5d6b65(0x137)]);return _0x23a388[_0x5d6b65(0x150)]>0x32?_0x5d6b65(0x131):_0x23a388[_0x5d6b65(0x150)]>0x5?'lag-med':_0x23a388[_0x5d6b65(0x150)]>0x0?'behind':_0x5009b8>0x7530?_0x5d6b65(0x141):'ok';}return _0x23a388[_0x5d6b65(0x14d)]?_0x5d6b65(0xc1):_0x5d6b65(0x141);},'_healthMarker':_0x341170=>'error'===_0x341170?'err':'reconciling'===_0x341170?_0x4a26d6(0x111):_0x4a26d6(0x131)===_0x341170?_0x4a26d6(0x131):_0x4a26d6(0x103)===_0x341170||_0x4a26d6(0xce)===_0x341170||_0x4a26d6(0x141)===_0x341170?'lag-med':'ok','_linkDirLabel'(_0x274e53){const _0x1276cc=_0x4a26d6;if(!_0x274e53['link'])return _0x274e53['lo'][_0x1276cc(0x14a)](0x0,0x6)+_0x1276cc(0xea)+_0x274e53['hi'][_0x1276cc(0x14a)](0x0,0x6)+_0x1276cc(0x170);if(!_0x274e53['link'][_0x1276cc(0x14f)])return'disabled';const _0x3c770c=_0x274e53['lo'][_0x1276cc(0x14a)](0x0,0x6),_0x2ff9f3=_0x274e53['hi'][_0x1276cc(0x14a)](0x0,0x6);switch(_0x274e53[_0x1276cc(0xe5)][_0x1276cc(0x109)]){case _0x1276cc(0x11b):return _0x3c770c+'\x20⇄\x20'+_0x2ff9f3;case _0x1276cc(0xfd):return _0x3c770c+_0x1276cc(0x10f)+_0x2ff9f3;case _0x1276cc(0x133):return _0x2ff9f3+_0x1276cc(0x10f)+_0x3c770c;default:return _0x274e53[_0x1276cc(0xe5)]['direction'];}},get 'selection'(){const _0x5a125d=_0x4a26d6;if(this[_0x5a125d(0x12b)]){const _0x192bea=this['links'][_0x5a125d(0xbe)](_0x193b00=>_0x193b00['key']===this[_0x5a125d(0x12b)])||null;if(_0x192bea)return{'type':_0x5a125d(0xe5),'data':_0x192bea};}if(this['selectedNodeId']){const _0x5e875e=this[_0x5a125d(0xf0)][this[_0x5a125d(0x17e)]]||null;return _0x5e875e?{'type':_0x5a125d(0xf3),'id':this[_0x5a125d(0x17e)],'data':_0x5e875e}:null;}return null;},get 'freshnessLabel'(){const _0x1314c7=_0x4a26d6;if(!this['lastUpdatedAt'])return'never';const _0x144872=this['now']-this[_0x1314c7(0x15e)];return _0x144872<0x5dc?'now':_0x144872<0x1388?_0x1314c7(0x107):_0x144872<0x3a98?'recent':Math[_0x1314c7(0x126)](_0x144872/0x3e8)+'s\x20ago';},get 'freshnessClass'(){const _0x37e482=_0x4a26d6;if(!this[_0x37e482(0x15e)])return'fresh-stale';const _0x5472d7=this['now']-this[_0x37e482(0x15e)];return _0x5472d7<0x1388?_0x37e482(0xeb):_0x5472d7<0x3a98?_0x37e482(0x144):_0x37e482(0xf7);},'_recomputeLayout'(){const _0x5a7f11=_0x4a26d6,_0x2807a6=this[_0x5a7f11(0x157)],_0x397b2a=this['w']/0x2,_0x188dcd=this['h']/0x2,_0x515dd2=Math[_0x5a7f11(0xe2)](0x50,Math[_0x5a7f11(0x10e)](_0x397b2a,_0x188dcd)-this[_0x5a7f11(0x153)]()-0x3c),_0x23d73f={},_0x569cd2=_0x2807a6[_0x5a7f11(0x11d)]||0x1;_0x2807a6[_0x5a7f11(0xca)]((_0x95bf5e,_0x2e7f52)=>{const _0x17f6fa=_0x5a7f11;if(0x1===_0x569cd2)return void(_0x23d73f[_0x95bf5e['id']]={'x':_0x397b2a,'y':_0x188dcd});const _0x49691d=0x2===_0x569cd2?0x0===_0x2e7f52?Math['PI']:0x0:_0x2e7f52/_0x569cd2*Math['PI']*0x2-Math['PI']/0x2;_0x23d73f[_0x95bf5e['id']]={'x':_0x397b2a+_0x515dd2*Math[_0x17f6fa(0xfb)](_0x49691d),'y':_0x188dcd+_0x515dd2*Math[_0x17f6fa(0x113)](_0x49691d)};}),this[_0x5a7f11(0x174)]={'cx':_0x397b2a,'cy':_0x188dcd,'r':_0x515dd2,'pos':_0x23d73f};},'_measure'(){const _0x217e95=_0x4a26d6,_0x38caa7=(this[_0x217e95(0x169)]||_0x18a441[_0x217e95(0x17b)])[_0x217e95(0x16d)]();this['w']=Math[_0x217e95(0xe2)](0x12c,_0x38caa7[_0x217e95(0xbf)]||0x384),this['h']=Math[_0x217e95(0xe2)](0xc8,_0x38caa7[_0x217e95(0x13e)]||0x1f4),this[_0x217e95(0xf5)]();},'_effectivePos'(_0x5e9ac8){const _0x120efa=_0x4a26d6;return this[_0x120efa(0xfe)][_0x5e9ac8]||this['layout'][_0x120efa(0xe9)]?.[_0x5e9ac8]||null;},'fitView'(){const _0x4c3153=_0x4a26d6;this[_0x4c3153(0xe0)]();const _0x285268=this[_0x4c3153(0x157)];if(!_0x285268[_0x4c3153(0x11d)])return;let _0x2c37dd=0x1/0x0,_0x347a6b=0x1/0x0,_0x4891fd=-0x1/0x0,_0x2b9568=-0x1/0x0;for(const _0x54a6f9 of _0x285268){const _0x53b0bc=this[_0x4c3153(0x148)](_0x54a6f9['id']);_0x53b0bc&&(_0x2c37dd=Math['min'](_0x2c37dd,_0x53b0bc['x']),_0x347a6b=Math['min'](_0x347a6b,_0x53b0bc['y']),_0x4891fd=Math[_0x4c3153(0xe2)](_0x4891fd,_0x53b0bc['x']),_0x2b9568=Math[_0x4c3153(0xe2)](_0x2b9568,_0x53b0bc['y']));}if(!isFinite(_0x2c37dd))return;const _0x17967d=this[_0x4c3153(0x153)]()+0x3c;_0x2c37dd-=_0x17967d,_0x347a6b-=_0x17967d,_0x4891fd+=_0x17967d,_0x2b9568+=_0x17967d;const _0x5b457d=_0x4891fd-_0x2c37dd,_0x1d2fb6=_0x2b9568-_0x347a6b,_0x173e35=0.88*Math['min'](this['w']/_0x5b457d,this['h']/_0x1d2fb6,0x3);this[_0x4c3153(0xff)]=_0x173e35,this[_0x4c3153(0xd2)]=this['w']/0x2-(_0x2c37dd+_0x5b457d/0x2)*_0x173e35,this['panY']=this['h']/0x2-(_0x347a6b+_0x1d2fb6/0x2)*_0x173e35,this['_applyTransform']();},'resetLayout'(){const _0x4cb462=_0x4a26d6;this['_customPos']={};try{localStorage[_0x4cb462(0x173)](_0x4cb462(0x14b));}catch{}this['fitView']();},'_savePositions'(){const _0x11061e=_0x4a26d6;try{localStorage[_0x11061e(0xed)](_0x11061e(0x14b),JSON[_0x11061e(0x128)](this[_0x11061e(0xfe)]));}catch{}},'_loadPositions'(){const _0x10cced=_0x4a26d6;try{const _0x111bc5=localStorage[_0x10cced(0x159)](_0x10cced(0x14b));_0x111bc5&&(this['_customPos']=JSON[_0x10cced(0x167)](_0x111bc5));}catch{}},'nodeRadius':()=>0x16,'linkPath'(_0x3c79b7){const _0x4875cf=_0x4a26d6,_0x129848=this['_effectivePos'](_0x3c79b7['lo']),_0x3ba664=this[_0x4875cf(0x148)](_0x3c79b7['hi']);if(!_0x129848||!_0x3ba664)return'';const _0x2de9b5=_0x3ba664['x']-_0x129848['x'],_0x244871=_0x3ba664['y']-_0x129848['y'],_0x1bec33=Math[_0x4875cf(0x175)](_0x2de9b5*_0x2de9b5+_0x244871*_0x244871)||0x1,_0x1d453c=this['nodeRadius']();return'M\x20'+(_0x129848['x']+_0x2de9b5/_0x1bec33*_0x1d453c)+'\x20'+(_0x129848['y']+_0x244871/_0x1bec33*_0x1d453c)+_0x4875cf(0xcf)+(_0x3ba664['x']-_0x2de9b5/_0x1bec33*_0x1d453c)+'\x20'+(_0x3ba664['y']-_0x244871/_0x1bec33*_0x1d453c);},'reconciling':!0x1,'reconcilingTarget':null,async 'refreshTopology'(){const _0x554412=_0x4a26d6;if(!this['loadingTopology']){this[_0x554412(0x146)]=!0x0;try{const _0x2d6199=await fetch(_0x554412(0x163)),_0x18722a=await _0x2d6199[_0x554412(0x10b)](),_0x1148b7=_0x18722a['data']??_0x18722a;_0x18a441[_0x554412(0x154)][_0x554412(0xf0)]=_0x1148b7[_0x554412(0xf0)]??_0x1148b7,_0x18a441[_0x554412(0x154)][_0x554412(0x164)]=_0x1148b7[_0x554412(0xc8)]??[],this['lastUpdatedAt']=Date['now']();}catch(_0x41e1ca){console[_0x554412(0xc1)](_0x554412(0x179),_0x41e1ca);}finally{this[_0x554412(0x146)]=!0x1;}}},async 'reconcileAll'(){const _0xb48cf7=_0x4a26d6;if(!this[_0xb48cf7(0x13d)]){this[_0xb48cf7(0x13d)]=!0x0,this[_0xb48cf7(0xdf)]=_0xb48cf7(0x12c);try{await fetch('/api/sync/reconcile-all',{'method':_0xb48cf7(0xc0)}),await this[_0xb48cf7(0x101)]();}finally{this['reconciling']=!0x1,this[_0xb48cf7(0xdf)]=null;}}},async 'reconcileNode'(_0x3792b4){const _0x500803=_0x4a26d6;if(!this[_0x500803(0x13d)]){this[_0x500803(0x13d)]=!0x0,this[_0x500803(0xdf)]=_0x3792b4;try{_0x3792b4===this['selfId']?await fetch(_0x500803(0x15a),{'method':_0x500803(0xc0)}):await fetch(this[_0x500803(0xf0)][_0x3792b4]?.[_0x500803(0x17f)]+_0x500803(0x15a),{'method':_0x500803(0xc0)}),await this[_0x500803(0x101)]();}finally{this[_0x500803(0x13d)]=!0x1,this[_0x500803(0xdf)]=null;}}},async 'reconcileLink'(_0x4d6b0d){const _0x4ff58f=_0x4a26d6;if(this[_0x4ff58f(0x13d)])return;this['reconciling']=!0x0,this['reconcilingTarget']=_0x4d6b0d[_0x4ff58f(0x140)];const _0x914ce4=_0x4d6b0d['lo']===this[_0x4ff58f(0xfa)]?_0x4d6b0d['hi']:_0x4d6b0d['lo'];try{await fetch(_0x4ff58f(0xfc),{'method':_0x4ff58f(0xc0),'headers':{'Content-Type':_0x4ff58f(0x102)},'body':JSON[_0x4ff58f(0x128)]({'peer_id':_0x914ce4})}),await this[_0x4ff58f(0x101)]();}finally{this[_0x4ff58f(0x13d)]=!0x1,this['reconcilingTarget']=null;}},'openLinkEditor'(_0x242e36){const _0x11e22b=_0x4a26d6;this[_0x11e22b(0x149)]=_0x242e36,this['linkEditDir']=_0x242e36['link']?.[_0x11e22b(0x109)]??_0x11e22b(0x11b),this[_0x11e22b(0xcb)]=_0x242e36[_0x11e22b(0xe5)]?.[_0x11e22b(0xf2)]??null,this['linkEditEnabled']=!0x1!==_0x242e36[_0x11e22b(0xe5)]?.[_0x11e22b(0x14f)];},'closeLinkEditor'(){const _0x859f1f=_0x4a26d6;this[_0x859f1f(0x149)]=null;},'toggleLinkEnv'(_0x4fc8af){const _0x568084=_0x4a26d6;if(null===this[_0x568084(0xcb)])this[_0x568084(0xcb)]=this[_0x568084(0xc8)][_0x568084(0xd3)](_0x30ceaa=>_0x30ceaa!==_0x4fc8af);else{const _0x2146ea=new Set(this['linkEditEnvs']);_0x2146ea[_0x568084(0x11a)](_0x4fc8af)?_0x2146ea[_0x568084(0xd0)](_0x4fc8af):_0x2146ea['add'](_0x4fc8af);const _0x5c9043=[..._0x2146ea];this[_0x568084(0xcb)]=_0x5c9043['length']===this[_0x568084(0xc8)][_0x568084(0x11d)]?null:_0x5c9043;}},async 'saveLink'(){const _0x5b90c6=_0x4a26d6;if(!this[_0x5b90c6(0x149)]||this[_0x5b90c6(0x14c)])return;this['savingLink']=!0x0;const _0x2f8a41=this[_0x5b90c6(0x149)];try{const _0x57ef17=await fetch(_0x5b90c6(0x105)+_0x2f8a41['lo']+'/'+_0x2f8a41['hi'],{'method':'PUT','headers':{'Content-Type':_0x5b90c6(0x102)},'body':JSON['stringify']({'direction':this[_0x5b90c6(0xe4)],'envs':this[_0x5b90c6(0xcb)],'enabled':this[_0x5b90c6(0x176)]})});if(!_0x57ef17['ok']){const _0x5300e0=await _0x57ef17[_0x5b90c6(0x10b)]();throw new Error(_0x5300e0?.['error']?.['message']||_0x5b90c6(0x135));}this['closeLinkEditor'](),await this['refreshTopology']();}catch(_0x5acfc7){alert(_0x5acfc7[_0x5b90c6(0x16f)]);}finally{this[_0x5b90c6(0x14c)]=!0x1;}},async 'deleteLink'(){const _0x7e3014=_0x4a26d6;if(!this['editingLink']||this[_0x7e3014(0x14c)])return;if(!confirm(_0x7e3014(0x115)))return;this[_0x7e3014(0x14c)]=!0x0;const _0xa4479c=this['editingLink'];try{await fetch(_0x7e3014(0x105)+_0xa4479c['lo']+'/'+_0xa4479c['hi'],{'method':_0x7e3014(0xe6)}),this['closeLinkEditor'](),await this[_0x7e3014(0x101)]();}catch(_0x541433){alert(_0x541433[_0x7e3014(0x16f)]);}finally{this[_0x7e3014(0x14c)]=!0x1;}},'deselect'(){const _0x3b9d22=_0x4a26d6;this[_0x3b9d22(0x17e)]=null,this[_0x3b9d22(0x12b)]=null,this[_0x3b9d22(0xf6)]=null,this[_0x3b9d22(0x12d)]=null,this[_0x3b9d22(0x149)]=null,_0x18a441['$dispatch']?.(_0x3b9d22(0x129),null),_0x18a441[_0x3b9d22(0x119)]?.(_0x3b9d22(0x106),null);},'pickNode'(_0x47e756){const _0xc99840=_0x4a26d6;this['selectedNodeId']=_0x47e756,this[_0xc99840(0x12b)]=null,this[_0xc99840(0x149)]=null,_0x18a441[_0xc99840(0x119)]?.(_0xc99840(0x129),_0x47e756),_0x18a441[_0xc99840(0x119)]?.(_0xc99840(0x106),null);},'pickLink'(_0xb95794){const _0x5ba91d=_0x4a26d6,_0x202625=this[_0x5ba91d(0x172)]['find'](_0x4ae165=>_0x4ae165['key']===_0xb95794)||null;if(_0x202625&&(!this[_0x5ba91d(0x17e)]||_0x202625['lo']===this[_0x5ba91d(0x17e)]||_0x202625['hi']===this[_0x5ba91d(0x17e)])){if(this[_0x5ba91d(0x12b)]===_0xb95794)return this[_0x5ba91d(0x12b)]=null,this[_0x5ba91d(0x149)]=null,void _0x18a441[_0x5ba91d(0x119)]?.(_0x5ba91d(0x106),null);this['selectedLinkKey']=_0xb95794,this[_0x5ba91d(0x17e)]||(this[_0x5ba91d(0x17e)]=_0x202625['lo'],_0x18a441[_0x5ba91d(0x119)]?.(_0x5ba91d(0x129),this[_0x5ba91d(0x17e)])),_0x18a441[_0x5ba91d(0x119)]?.('selectLink',_0xb95794);}},async 'copy'(_0x14f665){const _0x1d7641=_0x4a26d6;try{await navigator[_0x1d7641(0xcc)][_0x1d7641(0xc7)](String(_0x14f665??''));}catch(_0x562234){}},'_sPointerEventsFor'(_0xab1ab8){const _0xb0395=_0x4a26d6;return this[_0xb0395(0x17e)]&&_0xab1ab8['lo']!==this[_0xb0395(0x17e)]&&_0xab1ab8['hi']!==this[_0xb0395(0x17e)]?_0xb0395(0x147):'pointer-events:stroke;cursor:pointer';},'_sEnabledBadge':_0x1a5f43=>_0x1a5f43?_0x4a26d6(0x158):_0x4a26d6(0x12e),'_sEnabledBtn':_0x1f6184=>_0x1f6184?'border-color:var(--ok);color:var(--ok)':_0x4a26d6(0xe3),'nodeHealth'(_0xe6c4e1){const _0x4ccb51=_0x4a26d6,_0x325882=this[_0x4ccb51(0x172)][_0x4ccb51(0xd3)](_0x75de49=>_0x75de49['lo']===_0xe6c4e1||_0x75de49['hi']===_0xe6c4e1);if(!_0x325882['length'])return'ok';const _0x389e52=_0x325882['map'](_0x1bd27c=>this['_linkHealth'](_0x1bd27c));return _0x389e52['includes'](_0x4ccb51(0xc1))?_0x4ccb51(0xc1):_0x389e52[_0x4ccb51(0x10a)](_0x4ccb51(0x131))?_0x4ccb51(0xbc):_0x389e52['includes'](_0x4ccb51(0x103))?'lagging':_0x389e52[_0x4ccb51(0x10a)](_0x4ccb51(0xce))?_0x4ccb51(0xce):_0x389e52['every'](_0x26ca13=>_0x4ccb51(0x141)===_0x26ca13||'disabled'===_0x26ca13)?_0x4ccb51(0x141):'ok';},'isLinkInteractable'(_0x1d5e92){const _0x50c41d=_0x4a26d6;return!this[_0x50c41d(0x17e)]||_0x1d5e92['lo']===this[_0x50c41d(0x17e)]||_0x1d5e92['hi']===this[_0x50c41d(0x17e)];},'isActiveLink'(_0x1f7855){const _0x35db12=_0x4a26d6;return this['selectedLinkKey']===_0x1f7855[_0x35db12(0x140)]||this[_0x35db12(0xf6)]===_0x1f7855[_0x35db12(0x140)]&&this['isLinkInteractable'](_0x1f7855);},'nodeClass'(_0x26e4b9){const _0x535bd1=_0x4a26d6;let _0x2790ff='nd';const _0x7e2ad5=this[_0x535bd1(0x17e)],_0x4160ab=this[_0x535bd1(0x12d)];if(_0x7e2ad5&&_0x7e2ad5!==_0x26e4b9['id']&&(_0x2790ff+=_0x535bd1(0x168)),_0x7e2ad5===_0x26e4b9['id']&&(_0x2790ff+='\x20nd-sel'),this[_0x535bd1(0x12b)]){const _0x5bc90a=this[_0x535bd1(0x172)]['find'](_0x4d4f5e=>_0x4d4f5e[_0x535bd1(0x140)]===this[_0x535bd1(0x12b)]);!_0x5bc90a||_0x5bc90a['lo']!==_0x26e4b9['id']&&_0x5bc90a['hi']!==_0x26e4b9['id']||_0x7e2ad5===_0x26e4b9['id']||(_0x2790ff+='\x20nd-sel2');}_0x7e2ad5||_0x4160ab!==_0x26e4b9['id']||(_0x2790ff+=_0x535bd1(0x127));const _0x1d5343=this[_0x535bd1(0xc3)](_0x26e4b9['id']);return _0x535bd1(0xc1)===_0x1d5343?_0x2790ff+='\x20nd-err':'critical'===_0x1d5343?_0x2790ff+=_0x535bd1(0x112):_0x535bd1(0x183)===_0x1d5343?_0x2790ff+=_0x535bd1(0x10d):_0x535bd1(0xce)===_0x1d5343?_0x2790ff+='\x20nd-behind':_0x535bd1(0x141)===_0x1d5343&&(_0x2790ff+=_0x535bd1(0x118)),_0x2790ff;},'linkClass'(_0x16f893){const _0x9c2f77=_0x4a26d6;let _0x23ee21='ln';const _0x23ea79=this[_0x9c2f77(0x12b)]===_0x16f893[_0x9c2f77(0x140)],_0x2c5f87=this[_0x9c2f77(0xf6)]===_0x16f893[_0x9c2f77(0x140)]&&this[_0x9c2f77(0x134)](_0x16f893);switch(this[_0x9c2f77(0x134)](_0x16f893)||_0x23ea79||(_0x23ee21+=_0x9c2f77(0xd9)),_0x23ea79?_0x23ee21+='\x20ln-selected':_0x2c5f87&&(_0x23ee21+='\x20ln-hover'),this['_linkHealth'](_0x16f893)){case _0x9c2f77(0x120):_0x23ee21+=_0x9c2f77(0xf8);break;case'error':_0x23ee21+=_0x9c2f77(0xc6);break;case _0x9c2f77(0x13d):_0x23ee21+=_0x9c2f77(0x17c);break;case _0x9c2f77(0x131):_0x23ee21+=_0x9c2f77(0x121);break;case'lag-med':_0x23ee21+='\x20ln-lag-med';break;case _0x9c2f77(0xce):_0x23ee21+='\x20ln-behind-light';break;case _0x9c2f77(0x141):_0x23ee21+=_0x9c2f77(0x165);break;default:_0x23ee21+='\x20ln-ok';}return _0x23ee21;},'linkMarker'(_0x116f3e){const _0x108d90=_0x4a26d6,_0x2ad1be=_0x116f3e[_0x108d90(0xe5)]?.['direction']??_0x108d90(0x11b);return _0x108d90(0x11b)!==_0x2ad1be&&'lo_to_hi'!==_0x2ad1be?'':_0x116f3e[_0x108d90(0xe5)]&&!_0x116f3e[_0x108d90(0xe5)]['enabled']?_0x108d90(0x180):_0x108d90(0xd4)+this['_healthMarker'](this[_0x108d90(0xd7)](_0x116f3e[_0x108d90(0x15c)]))+')';},'linkStartMarker'(_0x55e932){const _0x270615=_0x4a26d6,_0x23fc32=_0x55e932[_0x270615(0xe5)]?.['direction']??_0x270615(0x11b);return _0x270615(0x11b)!==_0x23fc32&&_0x270615(0x133)!==_0x23fc32?'':_0x55e932['link']&&!_0x55e932[_0x270615(0xe5)][_0x270615(0x14f)]?'url(#arrow-rev-disabled)':_0x270615(0x177)+this[_0x270615(0x14e)](this[_0x270615(0xd7)](_0x55e932[_0x270615(0x124)]))+')';}}),'mount'(_0x3e43e2){const _0x232a89=_0x4a26d6;this[_0x232a89(0x169)]=_0x3e43e2[_0x232a89(0x17b)]['querySelector'](_0x232a89(0x15b)),this[_0x232a89(0x156)]=this[_0x232a89(0x169)]?.[_0x232a89(0xbd)](_0x232a89(0x143)),this[_0x232a89(0x169)]&&(this[_0x232a89(0x169)][_0x232a89(0x139)]['cursor']=_0x232a89(0xdc)),this[_0x232a89(0xe0)](),this['_loadPositions'](),this[_0x232a89(0x178)]=new ResizeObserver(()=>this[_0x232a89(0xbb)]()),this[_0x232a89(0x178)][_0x232a89(0xe1)](_0x3e43e2[_0x232a89(0x17b)]),this[_0x232a89(0xde)]=setInterval(()=>{const _0x37d48d=_0x232a89;this[_0x37d48d(0x117)]=Date[_0x37d48d(0x117)]();},0x3e8),this['refreshTopology']()['then'](()=>this[_0x232a89(0xbb)]()),this[_0x232a89(0x12f)]=_0x5cf059=>{const _0x5a4ef6=_0x232a89;_0x5cf059[_0x5a4ef6(0x155)](),this[_0x5a4ef6(0x136)](_0x5cf059);},this[_0x232a89(0x169)]&&this[_0x232a89(0x169)][_0x232a89(0x116)](_0x232a89(0x10c),this['_wheelCb'],{'passive':!0x1}),this['_mousedownCb']=_0x33e6f8=>this[_0x232a89(0x108)](_0x33e6f8),this['_svgEl']&&this[_0x232a89(0x169)][_0x232a89(0x116)](_0x232a89(0x132),this[_0x232a89(0x13a)]),this['_mousemoveCb']=_0x53b9db=>this['_onMousemove'](_0x53b9db),this[_0x232a89(0x17d)]=()=>this[_0x232a89(0x122)](),window['addEventListener']('mousemove',this[_0x232a89(0xf1)]),window['addEventListener'](_0x232a89(0x171),this['_mouseupCb']),this[_0x232a89(0xda)]=()=>{const _0x9397de=_0x232a89;document['hidden']||this[_0x9397de(0x101)]();},document[_0x232a89(0x116)](_0x232a89(0x16b),this[_0x232a89(0xda)]),this[_0x232a89(0x130)]&&(this[_0x232a89(0x114)]=setInterval(()=>this[_0x232a89(0x101)](),this['autoRefreshIntervalMs'])),this[_0x232a89(0x17e)]=this[_0x232a89(0xef)],_0x3e43e2[_0x232a89(0xc5)](()=>_0x3e43e2[_0x232a89(0x154)][_0x232a89(0x17a)],_0xcfc93b=>{const _0x1ae585=_0x232a89;this[_0x1ae585(0x17e)]=_0xcfc93b??null,_0xcfc93b||(this[_0x1ae585(0x12b)]=null);});},'unmount'(){const _0x433893=_0x4a26d6;this[_0x433893(0x178)]?.[_0x433893(0x13b)](),clearInterval(this[_0x433893(0xde)]),clearInterval(this[_0x433893(0x114)]),this[_0x433893(0x169)]&&(this['_svgEl'][_0x433893(0x138)](_0x433893(0x10c),this['_wheelCb']),this['_svgEl'][_0x433893(0x138)](_0x433893(0x132),this['_mousedownCb'])),window['removeEventListener'](_0x433893(0x162),this[_0x433893(0xf1)]),window['removeEventListener']('mouseup',this[_0x433893(0x17d)]),document[_0x433893(0x138)](_0x433893(0x16b),this[_0x433893(0xda)]);},'template':_0x4a26d6(0xec)};
|