@evomap/evolver 1.88.4 → 1.89.0
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/.cursor/BUGBOT.md +182 -0
- package/.env.example +68 -0
- package/.git-commit-guard-token +1 -0
- package/.github/CODEOWNERS +63 -0
- package/.github/ISSUE_TEMPLATE/good_first_issue.md +23 -0
- package/.github/pull_request_template.md +45 -0
- package/.github/workflows/test.yml +75 -0
- package/CHANGELOG.md +1123 -0
- package/README.md +86 -553
- package/README.public.md +594 -0
- package/SECURITY.md +108 -0
- package/assets/gep/events.jsonl +3 -0
- package/examples/atp-consumer-quickstart.md +100 -0
- package/examples/hello-world.md +38 -0
- package/index.js +30 -1
- package/package.json +6 -17
- package/proxy-package.json +39 -0
- package/public.manifest.json +141 -0
- package/src/evolve/guards.js +721 -1
- package/src/evolve/pipeline/collect.js +1283 -1
- package/src/evolve/pipeline/dispatch.js +421 -1
- package/src/evolve/pipeline/enrich.js +434 -1
- package/src/evolve/pipeline/hub.js +319 -1
- package/src/evolve/pipeline/select.js +274 -1
- package/src/evolve/pipeline/signals.js +206 -1
- package/src/evolve/utils.js +264 -1
- package/src/evolve.js +350 -1
- package/src/gep/a2aProtocol.js +4395 -1
- package/src/gep/autoDistillConv.js +205 -1
- package/src/gep/autoDistillLlm.js +315 -1
- package/src/gep/candidateEval.js +92 -1
- package/src/gep/candidates.js +198 -1
- package/src/gep/contentHash.js +30 -1
- package/src/gep/conversationSniffer.js +266 -1
- package/src/gep/crypto.js +89 -1
- package/src/gep/curriculum.js +163 -1
- package/src/gep/deviceId.js +218 -1
- package/src/gep/envFingerprint.js +118 -1
- package/src/gep/epigenetics.js +31 -1
- package/src/gep/execBridge.js +711 -1
- package/src/gep/explore.js +289 -1
- package/src/gep/hash.js +15 -1
- package/src/gep/hubFetch.js +359 -1
- package/src/gep/hubReview.js +207 -1
- package/src/gep/hubSearch.js +526 -1
- package/src/gep/hubVerify.js +306 -1
- package/src/gep/learningSignals.js +89 -1
- package/src/gep/memoryGraph.js +1374 -1
- package/src/gep/memoryGraphAdapter.js +203 -1
- package/src/gep/mutation.js +203 -1
- package/src/gep/narrativeMemory.js +108 -1
- package/src/gep/oauthLogin.js +143 -0
- package/src/gep/openPRRegistry.js +205 -1
- package/src/gep/personality.js +423 -1
- package/src/gep/policyCheck.js +599 -1
- package/src/gep/prompt.js +836 -1
- package/src/gep/recallInject.js +409 -1
- package/src/gep/recallVerifier.js +318 -1
- package/src/gep/reflection.js +177 -1
- package/src/gep/selector.js +602 -1
- package/src/gep/skillDistiller.js +1294 -1
- package/src/gep/solidify.js +1699 -1
- package/src/gep/strategy.js +136 -1
- package/src/gep/tokenSavings.js +88 -1
- package/src/gep/workspaceKeychain.js +174 -1
- package/src/proxy/extensions/traceControl.js +99 -1
- package/src/proxy/inject.js +52 -1
- package/src/proxy/trace/extractor.js +534 -1
- package/src/proxy/trace/usage.js +105 -1
- package/CONTRIBUTING.md +0 -19
- package/assets/cover.png +0 -0
- package/scripts/a2a_export.js +0 -63
- package/scripts/a2a_ingest.js +0 -79
- package/scripts/a2a_promote.js +0 -118
- package/scripts/analyze_by_skill.js +0 -121
- package/scripts/build_binaries.js +0 -479
- package/scripts/check-changelog.js +0 -166
- package/scripts/extract_log.js +0 -85
- package/scripts/generate_history.js +0 -75
- package/scripts/gep_append_event.js +0 -96
- package/scripts/gep_personality_report.js +0 -234
- package/scripts/human_report.js +0 -147
- package/scripts/recall-verify-report.js +0 -234
- package/scripts/recover_loop.js +0 -61
- package/scripts/seed-merchants.js +0 -91
- package/scripts/suggest_version.js +0 -89
- package/scripts/validate-modules.js +0 -38
- package/scripts/validate-suite.js +0 -78
- package/skills/index.json +0 -14
- /package/assets/gep/{genes.seed.json → genes.json} +0 -0
- /package/{skills → bundled-skills}/_meta/SKILL.md +0 -0
package/src/gep/hubFetch.js
CHANGED
|
@@ -1 +1,359 @@
|
|
|
1
|
-
const _0x49f02d=_0x3861;(function(_0x1bcaf0,_0x4c2c1c){const _0x4e7e92=_0x3861,_0x5d2978=_0x1bcaf0();while(!![]){try{const _0x35d0f0=parseInt(_0x4e7e92(0x16c,'\x37\x4b\x5d\x76'))/(0x11a0+0x1b6e+-0x2d0d)+parseInt(_0x4e7e92(0x1fa,'\x61\x46\x48\x65'))/(0xa9d+0xe2f*0x2+0xb*-0x38b)*(-parseInt(_0x4e7e92(0x170,'\x76\x78\x71\x32'))/(0x1a*-0x95+-0x34e+0x1273))+-parseInt(_0x4e7e92(0x1f9,'\x61\x70\x6c\x76'))/(0x135e+0x4d5+-0x182f)*(-parseInt(_0x4e7e92(0x1cb,'\x73\x75\x40\x32'))/(0x2602+-0xd*0x150+0x1e7*-0xb))+parseInt(_0x4e7e92(0x192,'\x61\x7a\x21\x6e'))/(0x1807+-0x4c7*-0x1+-0x1cc8)+-parseInt(_0x4e7e92(0x1d0,'\x59\x59\x4f\x30'))/(-0x17e0+0x1c*0xa3+-0x5*-0x137)+-parseInt(_0x4e7e92(0x14a,'\x6f\x4c\x72\x4e'))/(-0x2663+0x1d*0x115+0x1*0x70a)+parseInt(_0x4e7e92(0x160,'\x28\x53\x33\x5b'))/(0x25bd*-0x1+0x2149+-0x47d*-0x1)*(parseInt(_0x4e7e92(0x21a,'\x59\x59\x4f\x30'))/(-0x8c8+0x1849+-0x6b*0x25));if(_0x35d0f0===_0x4c2c1c)break;else _0x5d2978['push'](_0x5d2978['shift']());}catch(_0x221207){_0x5d2978['push'](_0x5d2978['shift']());}}}(_0x263b,0x4b29f+0xf3894+0x3*-0x24bcd));const _0x8e7f2a=require(_0x49f02d(0x18f,'\x28\x5b\x21\x76')),{Agent:_0x3cf43e,fetch:_0x4a670,buildConnector:_0x16aad7}=require(_0x49f02d(0x168,'\x6d\x35\x62\x28')),_0x2f2eff={};_0x2f2eff[_0x49f02d(0x1e4,'\x66\x62\x71\x76')+_0x49f02d(0x16e,'\x4c\x70\x69\x2a')+'\x65\x64']=!![],_0x2f2eff[_0x49f02d(0x166,'\x71\x57\x25\x55')]=0x2710,_0x2f2eff[_0x49f02d(0x23d,'\x6f\x4c\x72\x4e')+_0x49f02d(0x215,'\x6e\x4d\x69\x69')]=!![],_0x2f2eff[_0x49f02d(0x1f6,'\x33\x40\x4a\x59')+_0x49f02d(0x234,'\x6d\x35\x62\x28')+_0x49f02d(0x14c,'\x58\x6f\x51\x4e')+_0x49f02d(0x1f7,'\x61\x46\x48\x65')]=0xfa;function _0x3861(_0xfa1091,_0x28af9e){_0xfa1091=_0xfa1091-(-0x198e+0x232d+-0x85a);const _0x1ac1b6=_0x263b();let _0x318efb=_0x1ac1b6[_0xfa1091];if(_0x3861['\x6e\x4e\x58\x72\x6e\x6d']===undefined){var _0x1be6a7=function(_0xf1a73f){const _0x513b62='\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2b\x2f\x3d';let _0x4baadc='',_0x9d019d='',_0x550216=_0x4baadc+_0x1be6a7,_0x524e5b=(''+function(){return-0x7bf+0x71f+0x50*0x2;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')!==-(-0x982*0x4+0x33*0x2b+0x148*0x17);for(let _0x2c040a=0xb*0x31e+-0x2049+0x39*-0x9,_0xa219d,_0x23644d,_0x2d036c=0x1f39*0x1+-0x1266+-0xcd3;_0x23644d=_0xf1a73f['\x63\x68\x61\x72\x41\x74'](_0x2d036c++);~_0x23644d&&(_0xa219d=_0x2c040a%(-0x4*-0x132+-0x970+-0x12b*-0x4)?_0xa219d*(0x18f2+0x2*-0xe1d+-0xe2*-0x4)+_0x23644d:_0x23644d,_0x2c040a++%(0x623*-0x1+-0x2311*-0x1+-0x1cea))?_0x4baadc+=_0x524e5b||_0x550216['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x2d036c+(0x42f+-0x11ef+0xdca))-(-0x51*0x18+0x8*-0x180+0x13a2)!==-0x1e*-0xcf+-0x19*-0x5+-0x4f3*0x5?String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](0x5*-0x509+-0x295*-0x5+0x1e5*0x7&_0xa219d>>(-(-0xd*0x1db+-0x1bcb+0x1*0x33ec)*_0x2c040a&0x5a9+-0x1*-0x10b4+-0x13*0x12d)):_0x2c040a:-0x184a+-0x9a8*0x1+0x21f2){_0x23644d=_0x513b62['\x69\x6e\x64\x65\x78\x4f\x66'](_0x23644d);}for(let _0x596933=-0x4f*-0x48+-0x3a*-0xa7+-0x3c0e,_0x8714e1=_0x4baadc['\x6c\x65\x6e\x67\x74\x68'];_0x596933<_0x8714e1;_0x596933++){_0x9d019d+='\x25'+('\x30\x30'+_0x4baadc['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x596933)['\x74\x6f\x53\x74\x72\x69\x6e\x67'](-0x8c3+0x31*-0x86+0x5*0x6e5))['\x73\x6c\x69\x63\x65'](-(0x1435+0x1267+0x3d*-0xa2));}return decodeURIComponent(_0x9d019d);};const _0x4397b7=function(_0x57323f,_0x497310){let _0x2e29f3=[],_0x4050f2=0x3*0x239+-0x6a+-0x641*0x1,_0x43a09c,_0x450a72='';_0x57323f=_0x1be6a7(_0x57323f);let _0x5ca3e1;for(_0x5ca3e1=-0x201d+0x43d+0x1*0x1be0;_0x5ca3e1<0x2*0xa63+0x13fb+-0x27c1;_0x5ca3e1++){_0x2e29f3[_0x5ca3e1]=_0x5ca3e1;}for(_0x5ca3e1=-0x12af*0x1+-0x15a1+-0x50*-0x81;_0x5ca3e1<0x181+0x1d9b+0x1e1c*-0x1;_0x5ca3e1++){_0x4050f2=(_0x4050f2+_0x2e29f3[_0x5ca3e1]+_0x497310['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x5ca3e1%_0x497310['\x6c\x65\x6e\x67\x74\x68']))%(-0x1*-0x1acd+-0xea2*-0x1+-0x286f),_0x43a09c=_0x2e29f3[_0x5ca3e1],_0x2e29f3[_0x5ca3e1]=_0x2e29f3[_0x4050f2],_0x2e29f3[_0x4050f2]=_0x43a09c;}_0x5ca3e1=-0x2*-0x95+-0x16d8+0x4a*0x4b,_0x4050f2=-0x251+-0x124c*-0x1+-0xffb;for(let _0x21656b=0x7*-0x18a+0xb*-0x1b1+0x1d61;_0x21656b<_0x57323f['\x6c\x65\x6e\x67\x74\x68'];_0x21656b++){_0x5ca3e1=(_0x5ca3e1+(0x24ec+0xd*0x34+-0x278f))%(-0x3*-0x88a+0x1d9*0xe+-0x327c),_0x4050f2=(_0x4050f2+_0x2e29f3[_0x5ca3e1])%(0x613+0x5c*0x1+-0x6b*0xd),_0x43a09c=_0x2e29f3[_0x5ca3e1],_0x2e29f3[_0x5ca3e1]=_0x2e29f3[_0x4050f2],_0x2e29f3[_0x4050f2]=_0x43a09c,_0x450a72+=String['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65'](_0x57323f['\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74'](_0x21656b)^_0x2e29f3[(_0x2e29f3[_0x5ca3e1]+_0x2e29f3[_0x4050f2])%(-0x1c09*-0x1+-0xb8b*0x1+-0xf7e)]);}return _0x450a72;};_0x3861['\x43\x5a\x6e\x47\x73\x77']=_0x4397b7,_0x3861['\x43\x46\x58\x65\x66\x56']={},_0x3861['\x6e\x4e\x58\x72\x6e\x6d']=!![];}const _0x313cb6=_0x1ac1b6[-0x173b+0x2141+-0xa06*0x1],_0x468c8d=_0xfa1091+_0x313cb6,_0x53272d=_0x3861['\x43\x46\x58\x65\x66\x56'][_0x468c8d];if(!_0x53272d){if(_0x3861['\x53\x71\x71\x76\x50\x4f']===undefined){const _0x44b2d1=function(_0x1e05b6){this['\x6e\x4e\x75\x63\x52\x73']=_0x1e05b6,this['\x4a\x71\x68\x55\x4c\x71']=[-0x15b5*-0x1+-0xf85+-0x62f,-0x1d68+0x2*0xb89+0x32b*0x2,-0x220c+0x1559+0xcb3],this['\x42\x59\x58\x72\x70\x52']=function(){return'\x6e\x65\x77\x53\x74\x61\x74\x65';},this['\x66\x70\x51\x74\x76\x72']='\x5c\x77\x2b\x20\x2a\x5c\x28\x5c\x29\x20\x2a\x7b\x5c\x77\x2b\x20\x2a',this['\x44\x4e\x62\x42\x45\x4e']='\x5b\x27\x7c\x22\x5d\x2e\x2b\x5b\x27\x7c\x22\x5d\x3b\x3f\x20\x2a\x7d';};_0x44b2d1['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x44\x62\x78\x42\x77\x74']=function(){const _0x159600=new RegExp(this['\x66\x70\x51\x74\x76\x72']+this['\x44\x4e\x62\x42\x45\x4e']),_0x396ee5=_0x159600['\x74\x65\x73\x74'](this['\x42\x59\x58\x72\x70\x52']['\x74\x6f\x53\x74\x72\x69\x6e\x67']())?--this['\x4a\x71\x68\x55\x4c\x71'][0x60d*0x6+-0x291+-0x21bc]:--this['\x4a\x71\x68\x55\x4c\x71'][-0x812+-0x1a09+0x221b*0x1];return this['\x4a\x66\x55\x6b\x5a\x68'](_0x396ee5);},_0x44b2d1['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x4a\x66\x55\x6b\x5a\x68']=function(_0x584d1e){if(!Boolean(~_0x584d1e))return _0x584d1e;return this['\x5a\x72\x4d\x7a\x47\x4a'](this['\x6e\x4e\x75\x63\x52\x73']);},_0x44b2d1['\x70\x72\x6f\x74\x6f\x74\x79\x70\x65']['\x5a\x72\x4d\x7a\x47\x4a']=function(_0x482a35){for(let _0x6c3129=0xc55+0x20b2+0x2d07*-0x1,_0xd18190=this['\x4a\x71\x68\x55\x4c\x71']['\x6c\x65\x6e\x67\x74\x68'];_0x6c3129<_0xd18190;_0x6c3129++){this['\x4a\x71\x68\x55\x4c\x71']['\x70\x75\x73\x68'](Math['\x72\x6f\x75\x6e\x64'](Math['\x72\x61\x6e\x64\x6f\x6d']())),_0xd18190=this['\x4a\x71\x68\x55\x4c\x71']['\x6c\x65\x6e\x67\x74\x68'];}return _0x482a35(this['\x4a\x71\x68\x55\x4c\x71'][0x96e+-0x4fb+0x473*-0x1]);},(''+function(){return-0x1d6*0x9+0xeeb+0x1*0x19b;})['\x69\x6e\x64\x65\x78\x4f\x66']('\x0a')===-(0x253c+-0x99*-0xe+-0x2d99*0x1)&&new _0x44b2d1(_0x3861)['\x44\x62\x78\x42\x77\x74'](),_0x3861['\x53\x71\x71\x76\x50\x4f']=!![];}_0x318efb=_0x3861['\x43\x5a\x6e\x47\x73\x77'](_0x318efb,_0x28af9e),_0x3861['\x43\x46\x58\x65\x66\x56'][_0x468c8d]=_0x318efb;}else _0x318efb=_0x53272d;return _0x318efb;}const _0x58f5f5=_0x2f2eff,_0x9afec4=_0x16aad7(_0x58f5f5);function _0x527d1a(_0x22a006,_0x5e0725){const _0x36f213=_0x49f02d,_0x45e120={'\x47\x4d\x76\x47\x41':function(_0x1dd6e9,_0x2fbc40){return _0x1dd6e9+_0x2fbc40;},'\x54\x4e\x68\x67\x44':_0x36f213(0x1a9,'\x34\x49\x29\x56')+_0x36f213(0x204,'\x70\x59\x79\x57')+_0x36f213(0x16f,'\x73\x75\x40\x32')+_0x36f213(0x193,'\x58\x6f\x51\x4e')+'\x73\x3a\x2f\x2f\x20\u2014\x20\x67'+_0x36f213(0x20a,'\x28\x5b\x21\x76'),'\x6d\x5a\x5a\x6a\x6a':function(_0x329a24,_0x4ce939,_0x5f19e0){return _0x329a24(_0x4ce939,_0x5f19e0);},'\x74\x75\x51\x6e\x58':function(_0x3894e9,_0x58f8ae){return _0x3894e9===_0x58f8ae;},'\x47\x49\x46\x69\x4f':_0x36f213(0x20f,'\x73\x47\x41\x23'),'\x44\x65\x70\x6a\x45':function(_0x4d8f95,_0x803498){return _0x4d8f95===_0x803498;},'\x5a\x55\x76\x55\x70':_0x36f213(0x216,'\x29\x21\x50\x53'),'\x4c\x6e\x61\x72\x62':'\x53\x74\x45\x41\x62','\x4a\x46\x55\x76\x51':function(_0x230871,_0xdbcd87,_0x259c3b){return _0x230871(_0xdbcd87,_0x259c3b);}};return _0x45e120[_0x36f213(0x1a8,'\x6c\x76\x4d\x42')](_0x9afec4,_0x22a006,function(_0x210f59,_0x13fc37){const _0x448e19=_0x36f213,_0x14e270={'\x57\x55\x4b\x59\x61':function(_0x481c7b,_0x27c3ec){const _0x25d800=_0x3861;return _0x45e120[_0x25d800(0x208,'\x25\x25\x35\x75')](_0x481c7b,_0x27c3ec);},'\x72\x49\x43\x41\x6d':_0x45e120[_0x448e19(0x1fd,'\x71\x57\x25\x55')],'\x41\x6a\x6f\x6b\x64':_0x448e19(0x1e2,'\x33\x40\x4a\x59')+_0x448e19(0x1e0,'\x56\x41\x64\x28')+_0x448e19(0x19a,'\x61\x46\x48\x65')+_0x448e19(0x1bf,'\x69\x24\x4d\x5e')+_0x448e19(0x1fe,'\x76\x78\x71\x32')+_0x448e19(0x15c,'\x28\x5b\x21\x76')+_0x448e19(0x213,'\x61\x70\x6c\x76')+_0x448e19(0x251,'\x6d\x35\x62\x28')+_0x448e19(0x252,'\x71\x57\x25\x55')};if(_0x210f59)return _0x45e120['\x6d\x5a\x5a\x6a\x6a'](_0x5e0725,_0x210f59,_0x13fc37);try{if(_0x13fc37&&_0x45e120[_0x448e19(0x20c,'\x45\x54\x64\x4f')](typeof _0x13fc37[_0x448e19(0x1a6,'\x45\x54\x64\x4f')+_0x448e19(0x1cf,'\x59\x59\x4f\x30')],_0x45e120[_0x448e19(0x1a0,'\x6a\x42\x42\x64')])){if(_0x45e120[_0x448e19(0x19e,'\x61\x7a\x21\x6e')](_0x45e120[_0x448e19(0x15b,'\x61\x5d\x49\x79')],_0x45e120[_0x448e19(0x1eb,'\x33\x40\x4a\x59')]))throw new _0xa655f2(_0x14e270[_0x448e19(0x183,'\x6c\x76\x4d\x42')](_0x14e270[_0x448e19(0x173,'\x36\x48\x45\x71')](_0x14e270[_0x448e19(0x17b,'\x24\x30\x6a\x55')]+_0x245982[_0x448e19(0x1d6,'\x34\x49\x29\x56')+'\x79'](_0x405883),'\x2e\x20'),_0x14e270[_0x448e19(0x1c0,'\x59\x59\x4f\x30')]));else _0x13fc37['\x73\x65\x74\x4b\x65\x65\x70\x41'+_0x448e19(0x1f2,'\x61\x5d\x49\x79')](!![],-0x4da8+-0xd5a+0x959a);}}catch(_0x5cdee7){}_0x5e0725(null,_0x13fc37);});}_0x527d1a[_0x49f02d(0x239,'\x28\x53\x33\x5b')+'\x61\x75\x74\x68\x6f\x72\x69\x7a'+'\x65\x64']=!![];function _0x284fd7(){const _0x590e01=_0x49f02d,_0x32ff78={'\x59\x6d\x64\x4e\x64':_0x590e01(0x23e,'\x61\x70\x6c\x76'),'\x4b\x59\x72\x59\x7a':'\x5b\x68\x75\x62\x46\x65\x74\x63'+_0x590e01(0x147,'\x6b\x74\x51\x65')+_0x590e01(0x225,'\x4d\x6c\x38\x79')+_0x590e01(0x18e,'\x36\x48\x45\x71')+_0x590e01(0x1a7,'\x4b\x37\x5e\x77'),'\x56\x76\x4a\x45\x63':function(_0x52da87,_0x4314d3){return _0x52da87!==_0x4314d3;},'\x65\x50\x77\x6f\x4c':_0x590e01(0x229,'\x4d\x6c\x38\x79'),'\x4d\x46\x51\x59\x51':function(_0x403baa,_0x10667a){return _0x403baa!==_0x10667a;},'\x6b\x4b\x71\x79\x52':function(_0x102d8f,_0x702401,_0x573867){return _0x102d8f(_0x702401,_0x573867);},'\x56\x68\x50\x50\x50':function(_0x5f479a,_0x1a0537){return _0x5f479a===_0x1a0537;},'\x63\x7a\x7a\x54\x56':'\x52\x64\x4f\x6d\x78','\x59\x69\x5a\x4a\x77':_0x590e01(0x182,'\x28\x53\x33\x5b')+_0x590e01(0x1f4,'\x56\x41\x64\x28'),'\x72\x4a\x4b\x42\x66':function(_0x25092c){return _0x25092c();}},_0x1e7295=(function(){const _0x3cf393=_0x590e01,_0x15b5c9={};_0x15b5c9['\x73\x45\x65\x56\x46']=function(_0x115a32,_0x3cfc30){return _0x115a32+_0x3cfc30;},_0x15b5c9[_0x3cf393(0x1b8,'\x5b\x55\x38\x41')]=_0x32ff78[_0x3cf393(0x18c,'\x69\x24\x4d\x5e')];const _0x581b95=_0x15b5c9;if(_0x32ff78['\x56\x76\x4a\x45\x63'](_0x32ff78[_0x3cf393(0x1cd,'\x6a\x42\x42\x64')],_0x32ff78[_0x3cf393(0x232,'\x41\x6a\x7a\x61')]))throw new _0x44d11e(_0x581b95[_0x3cf393(0x222,'\x28\x53\x33\x5b')](_0x581b95[_0x3cf393(0x221,'\x36\x48\x45\x71')](_0x581b95[_0x3cf393(0x1c1,'\x29\x21\x50\x53')],_0xdac358[_0x3cf393(0x1c5,'\x6e\x4d\x69\x69')+'\x79'](_0x1e24f5))+'\x2e\x20',_0x3cf393(0x209,'\x4b\x37\x5e\x77')+_0x3cf393(0x175,'\x6a\x42\x42\x64')+_0x3cf393(0x22c,'\x6f\x4c\x72\x4e')+_0x3cf393(0x1c4,'\x61\x5d\x49\x79')+_0x3cf393(0x17c,'\x25\x25\x35\x75')+_0x3cf393(0x1f1,'\x58\x6f\x51\x4e')+_0x3cf393(0x17a,'\x71\x57\x25\x55')+'\x6f\x63\x6b\x20\x68\x75\x62\x20'+_0x3cf393(0x1d7,'\x45\x54\x64\x4f')));else{let _0x18464e=!![];return function(_0x329beb,_0x3a0d63){const _0x45c579=_0x3cf393,_0x212295={};_0x212295[_0x45c579(0x1b2,'\x5b\x55\x38\x41')]=_0x32ff78[_0x45c579(0x165,'\x74\x4a\x25\x24')];const _0x135ae8=_0x212295,_0x16a5e3=_0x18464e?function(){const _0x4221f8=_0x45c579;if(_0x135ae8[_0x4221f8(0x25f,'\x7a\x65\x26\x43')]!==_0x135ae8[_0x4221f8(0x1c2,'\x6d\x35\x62\x28')])try{_0x4706f1();}catch(_0x64daf3){}else{if(_0x3a0d63){const _0x10bd43=_0x3a0d63[_0x4221f8(0x186,'\x61\x7a\x21\x6e')](_0x329beb,arguments);return _0x3a0d63=null,_0x10bd43;}}}:function(){};return _0x18464e=![],_0x16a5e3;};}}()),_0x3aaf9f=_0x32ff78[_0x590e01(0x1c7,'\x66\x7a\x29\x6a')](_0x1e7295,this,function(){const _0x1acf41=_0x590e01;if(_0x32ff78[_0x1acf41(0x184,'\x59\x59\x4f\x30')](_0x32ff78[_0x1acf41(0x240,'\x61\x5d\x49\x79')],_0x32ff78['\x63\x7a\x7a\x54\x56']))return _0x3aaf9f[_0x1acf41(0x1ea,'\x66\x64\x32\x4f')]()[_0x1acf41(0x20e,'\x73\x75\x40\x32')](_0x32ff78[_0x1acf41(0x1df,'\x61\x70\x6c\x76')])[_0x1acf41(0x19c,'\x61\x46\x48\x65')]()[_0x1acf41(0x167,'\x45\x54\x64\x4f')+_0x1acf41(0x1b9,'\x7a\x65\x26\x43')](_0x3aaf9f)[_0x1acf41(0x1be,'\x73\x47\x41\x23')](_0x32ff78[_0x1acf41(0x16b,'\x6f\x4c\x72\x4e')]);else{const _0x5e6e7a=_0x32ff78[_0x1acf41(0x264,'\x71\x57\x25\x55')](_0x5336b5,_0x19d7a9)?_0x311bf4:_0x13ce7a[_0x1acf41(0x1bc,'\x6d\x35\x62\x28')];return _0x32ff78[_0x1acf41(0x1d4,'\x67\x5b\x30\x40')](_0x5e6e7a,_0x3361eb,_0x1dee7f);}});_0x32ff78[_0x590e01(0x199,'\x6c\x76\x4d\x42')](_0x3aaf9f);const _0x221c46={};return _0x221c46[_0x590e01(0x146,'\x6f\x4c\x72\x4e')]=_0x527d1a,_0x221c46[_0x590e01(0x1b3,'\x52\x32\x28\x52')+_0x590e01(0x187,'\x58\x6f\x51\x4e')]=0x2710,_0x221c46[_0x590e01(0x194,'\x7a\x65\x26\x43')+_0x590e01(0x25d,'\x56\x41\x64\x28')+_0x590e01(0x155,'\x74\x4a\x25\x24')]=0xea60,_0x221c46[_0x590e01(0x217,'\x6f\x4c\x72\x4e')+_0x590e01(0x14e,'\x6d\x35\x62\x28')]=0x7530,_0x221c46[_0x590e01(0x15d,'\x33\x40\x4a\x59')+_0x590e01(0x211,'\x73\x75\x40\x32')]=0x7530,_0x221c46[_0x590e01(0x1c8,'\x69\x7a\x76\x4f')+'\x6e\x67']=0x1,new _0x3cf43e(_0x221c46);}function _0x2b17b7(){const _0x2e5122=_0x49f02d,_0xc585e5={};return _0xc585e5[_0x2e5122(0x247,'\x61\x46\x48\x65')]=_0x527d1a,_0xc585e5[_0x2e5122(0x214,'\x74\x4a\x25\x24')+_0x2e5122(0x179,'\x34\x49\x29\x56')]=0x2710,_0xc585e5[_0x2e5122(0x233,'\x59\x59\x4f\x30')+_0x2e5122(0x25d,'\x56\x41\x64\x28')+_0x2e5122(0x207,'\x73\x47\x41\x23')]=0xea60,_0xc585e5[_0x2e5122(0x1ad,'\x73\x75\x40\x32')+_0x2e5122(0x153,'\x36\x48\x45\x71')]=0xfde8,_0xc585e5[_0x2e5122(0x148,'\x66\x62\x71\x76')+_0x2e5122(0x203,'\x6e\x4d\x69\x69')]=0xfde8,_0xc585e5[_0x2e5122(0x20b,'\x66\x7a\x29\x6a')+'\x6e\x67']=0x1,new _0x3cf43e(_0xc585e5);}function _0x1f33aa(){const _0x2b2b06=_0x49f02d,_0x56b9e5={};return _0x56b9e5[_0x2b2b06(0x14b,'\x37\x4b\x5d\x76')]=_0x527d1a,_0x56b9e5[_0x2b2b06(0x1cc,'\x69\x24\x4d\x5e')+_0x2b2b06(0x1f8,'\x33\x40\x4a\x59')]=0x2710,_0x56b9e5[_0x2b2b06(0x224,'\x6c\x76\x4d\x42')+_0x2b2b06(0x1ef,'\x74\x4a\x25\x24')+_0x2b2b06(0x190,'\x45\x54\x64\x4f')]=0xea60,_0x56b9e5[_0x2b2b06(0x258,'\x61\x7a\x21\x6e')+_0x2b2b06(0x1ed,'\x5b\x55\x38\x41')]=0xafc8,_0x56b9e5[_0x2b2b06(0x181,'\x69\x7a\x76\x4f')+_0x2b2b06(0x1b0,'\x66\x7a\x29\x6a')]=0xafc8,_0x56b9e5[_0x2b2b06(0x1f5,'\x66\x62\x71\x76')+'\x6e\x67']=0x1,new _0x3cf43e(_0x56b9e5);}const _0x71c9d0={};_0x71c9d0[_0x49f02d(0x156,'\x4b\x37\x5e\x77')+_0x49f02d(0x238,'\x6e\x4d\x69\x69')+'\x65\x64']=!![];const _0x478db6=new _0x8e7f2a[(_0x49f02d(0x152,'\x6e\x4d\x69\x69'))](_0x71c9d0);let _0x17ea89=_0x284fd7(),_0x11b416=_0x2b17b7(),_0x475d39=_0x1f33aa();function _0x4a85b9(){const _0x2baca4=_0x49f02d,_0x4399a9={'\x43\x64\x6a\x63\x64':function(_0x103f6d,_0x1c370d){return _0x103f6d===_0x1c370d;},'\x48\x50\x6e\x52\x4f':function(_0x4f7ab6){return _0x4f7ab6();},'\x6b\x62\x58\x4c\x61':function(_0x1312cf){return _0x1312cf();},'\x4e\x76\x49\x50\x57':function(_0xc22345){return _0xc22345();},'\x43\x69\x70\x4a\x68':function(_0x1dd7ba,_0x31f43a){return _0x1dd7ba!==_0x31f43a;},'\x7a\x6f\x43\x52\x57':_0x2baca4(0x1e3,'\x56\x41\x64\x28'),'\x48\x41\x52\x58\x79':_0x2baca4(0x1b5,'\x25\x25\x35\x75'),'\x4f\x74\x42\x4c\x55':_0x2baca4(0x180,'\x61\x70\x6c\x76')},_0x250c08=[_0x17ea89,_0x11b416,_0x475d39];_0x17ea89=_0x4399a9[_0x2baca4(0x14d,'\x41\x6a\x7a\x61')](_0x284fd7),_0x11b416=_0x4399a9[_0x2baca4(0x244,'\x67\x5b\x30\x40')](_0x2b17b7),_0x475d39=_0x4399a9[_0x2baca4(0x1fc,'\x7a\x65\x26\x43')](_0x1f33aa);for(const _0x3cf2b7 of _0x250c08){if(_0x4399a9[_0x2baca4(0x15e,'\x42\x23\x64\x68')](_0x4399a9[_0x2baca4(0x1ca,'\x69\x24\x4d\x5e')],_0x4399a9[_0x2baca4(0x228,'\x6a\x42\x42\x64')]))try{const _0x5744b8=_0x3cf2b7['\x63\x6c\x6f\x73\x65']();if(_0x5744b8&&_0x4399a9[_0x2baca4(0x242,'\x69\x24\x4d\x5e')](typeof _0x5744b8[_0x2baca4(0x159,'\x61\x7a\x21\x6e')],_0x4399a9[_0x2baca4(0x22e,'\x33\x40\x4a\x59')]))_0x5744b8[_0x2baca4(0x1db,'\x28\x5b\x21\x76')](()=>{});}catch(_0x6d2a58){}else{const _0x336683=_0x3af723[_0x2baca4(0x158,'\x4c\x70\x69\x2a')]();if(_0x336683&&_0x4399a9[_0x2baca4(0x262,'\x5b\x55\x38\x41')](typeof _0x336683[_0x2baca4(0x18a,'\x6f\x30\x38\x67')],_0x2baca4(0x231,'\x6f\x30\x38\x67')))_0x336683[_0x2baca4(0x196,'\x55\x53\x67\x74')](()=>{});}}}function _0x22762c(_0x2bc863){const _0x492fd9=_0x49f02d,_0x193842={};_0x193842[_0x492fd9(0x18d,'\x47\x59\x47\x73')]=_0x492fd9(0x1f0,'\x45\x54\x64\x4f')+_0x492fd9(0x1ac,'\x69\x24\x4d\x5e'),_0x193842['\x6f\x47\x4e\x66\x57']=function(_0x2a1ea4,_0x39224b){return _0x2a1ea4===_0x39224b;},_0x193842[_0x492fd9(0x15a,'\x6e\x4d\x69\x69')]=function(_0x25e0e3,_0x2fa751){return _0x25e0e3===_0x2fa751;},_0x193842['\x4f\x62\x47\x44\x4c']=_0x492fd9(0x23a,'\x28\x53\x33\x5b'),_0x193842[_0x492fd9(0x210,'\x61\x46\x48\x65')]=_0x492fd9(0x178,'\x33\x40\x4a\x59')+_0x492fd9(0x24f,'\x34\x49\x29\x56')+_0x492fd9(0x205,'\x6f\x30\x38\x67'),_0x193842[_0x492fd9(0x174,'\x6d\x6b\x40\x45')]=function(_0x4075a6,_0x1bad87){return _0x4075a6===_0x1bad87;},_0x193842[_0x492fd9(0x198,'\x52\x32\x28\x52')]=_0x492fd9(0x202,'\x28\x53\x33\x5b')+_0x492fd9(0x164,'\x33\x40\x4a\x59')+_0x492fd9(0x1dc,'\x6b\x74\x51\x65');const _0x53bbb2=_0x193842,_0x2c7e06=process.env.EVOLVER_LONG_POLL_PATH||_0x53bbb2[_0x492fd9(0x24d,'\x6d\x35\x62\x28')];try{const _0x5b55a6=new URL(_0x2bc863);if(_0x53bbb2[_0x492fd9(0x22b,'\x59\x59\x4f\x30')](_0x5b55a6[_0x492fd9(0x265,'\x67\x5b\x30\x40')],_0x2c7e06)){if(_0x53bbb2[_0x492fd9(0x1bd,'\x6f\x30\x38\x67')](_0x53bbb2[_0x492fd9(0x157,'\x70\x6c\x5d\x66')],_0x53bbb2['\x4f\x62\x47\x44\x4c']))return _0x11b416;else{const _0x477472={};return _0x477472[_0x492fd9(0x1af,'\x67\x5b\x30\x40')]=_0x1b897f,_0x477472[_0x492fd9(0x1c6,'\x61\x46\x48\x65')+_0x492fd9(0x189,'\x61\x46\x48\x65')]=0x2710,_0x477472[_0x492fd9(0x1d9,'\x70\x6c\x5d\x66')+_0x492fd9(0x201,'\x67\x5b\x30\x40')+_0x492fd9(0x24a,'\x71\x57\x25\x55')]=0xea60,_0x477472['\x68\x65\x61\x64\x65\x72\x73\x54'+_0x492fd9(0x21d,'\x59\x59\x4f\x30')]=0xfde8,_0x477472[_0x492fd9(0x185,'\x47\x59\x47\x73')+_0x492fd9(0x1a1,'\x36\x48\x45\x71')]=0xfde8,_0x477472[_0x492fd9(0x1c8,'\x69\x7a\x76\x4f')+'\x6e\x67']=0x1,new _0x10f380(_0x477472);}}if(_0x53bbb2[_0x492fd9(0x21f,'\x74\x4a\x25\x24')](_0x5b55a6[_0x492fd9(0x1ee,'\x45\x54\x64\x4f')],_0x53bbb2[_0x492fd9(0x1a5,'\x69\x24\x4d\x5e')])||_0x53bbb2[_0x492fd9(0x212,'\x7a\x65\x26\x43')](_0x5b55a6['\x70\x61\x74\x68\x6e\x61\x6d\x65'],_0x53bbb2[_0x492fd9(0x19b,'\x61\x70\x6c\x76')]))return _0x475d39;}catch{}return _0x17ea89;}let _0x3ef1da=_0x4a670;function _0x54f6d7(_0xca7d35){const _0x56b525=_0x49f02d,_0x582df0={};_0x582df0[_0x56b525(0x253,'\x58\x6f\x51\x4e')]=function(_0x448668,_0x3e2e7d){return _0x448668||_0x3e2e7d;};const _0x4e5655=_0x582df0;_0x3ef1da=_0x4e5655[_0x56b525(0x188,'\x24\x30\x6a\x55')](_0xca7d35,_0x4a670);}function _0x263b(){const _0x556052=['\x65\x4d\x5a\x64\x51\x57','\x57\x52\x54\x65\x77\x43\x6b\x42\x46\x47','\x6e\x75\x43\x53\x6a\x67\x52\x64\x4f\x68\x5a\x64\x4e\x71','\x41\x4e\x31\x30','\x65\x38\x6b\x65\x57\x35\x43\x51\x57\x36\x33\x63\x53\x67\x6e\x67','\x75\x77\x47\x59\x76\x53\x6f\x6e','\x41\x53\x6f\x59\x7a\x73\x4a\x63\x4e\x57','\x61\x63\x4e\x63\x4b\x38\x6f\x45\x57\x4f\x6d\x35','\x67\x32\x5a\x64\x53\x72\x39\x64\x57\x37\x74\x64\x53\x71\x69','\x71\x47\x31\x44\x57\x51\x57\x59','\x68\x64\x4e\x63\x48\x47','\x57\x35\x4a\x63\x4c\x53\x6f\x63\x41\x43\x6b\x78','\x74\x53\x6f\x4b\x69\x49\x58\x5a\x69\x53\x6f\x57\x74\x71','\x57\x36\x47\x2b\x57\x50\x4f\x4b\x61\x57\x50\x4f\x73\x61','\x57\x52\x68\x64\x50\x6d\x6b\x54\x57\x34\x38\x65\x57\x4f\x4f\x31\x76\x57','\x75\x43\x6f\x57\x41\x58\x4a\x63\x52\x61','\x57\x36\x34\x71\x6d\x43\x6f\x4a\x68\x6d\x6f\x74\x57\x52\x78\x64\x4a\x47','\x63\x4b\x53\x55\x79\x71','\x57\x37\x71\x58\x57\x51\x4b\x34\x66\x61','\x41\x43\x6b\x5a\x6b\x78\x66\x6e\x68\x67\x76\x6d','\x6c\x4c\x42\x64\x4e\x64\x44\x59\x57\x34\x4b','\x57\x34\x65\x6d\x73\x6d\x6b\x65\x75\x71','\x6d\x43\x6f\x55\x64\x78\x6e\x4f\x62\x71','\x57\x37\x69\x6d\x69\x38\x6f\x33\x67\x61','\x57\x36\x38\x2f\x57\x4f\x53\x78\x61\x71','\x78\x73\x33\x63\x53\x43\x6b\x65\x57\x36\x46\x64\x56\x5a\x58\x71\x57\x34\x6c\x64\x52\x65\x71\x47\x41\x57','\x57\x34\x50\x4f\x57\x37\x44\x73\x57\x37\x47','\x68\x76\x37\x63\x4d\x38\x6f\x4a\x79\x57','\x6b\x65\x53\x64\x57\x52\x6a\x4f\x57\x36\x5a\x63\x52\x57\x69','\x57\x37\x57\x4d\x76\x38\x6b\x2b\x77\x58\x34\x63\x74\x61','\x57\x34\x68\x63\x51\x53\x6b\x61\x62\x4d\x78\x64\x51\x53\x6f\x6d\x76\x61','\x62\x38\x6f\x71\x65\x62\x4b\x48','\x6c\x58\x62\x55\x6f\x71\x2f\x64\x4b\x75\x78\x63\x4e\x53\x6b\x74','\x57\x37\x54\x68\x57\x50\x44\x67\x70\x47','\x57\x37\x78\x63\x4c\x38\x6f\x76\x63\x65\x79','\x6d\x76\x57\x44\x57\x36\x64\x64\x4b\x6d\x6f\x74\x69\x53\x6b\x73\x6e\x38\x6f\x71\x43\x43\x6f\x50\x57\x37\x38','\x6e\x38\x6f\x65\x6a\x4e\x50\x6b','\x57\x34\x4f\x35\x68\x38\x6f\x71\x6a\x53\x6f\x4f\x57\x4f\x4a\x64\x49\x71','\x76\x32\x76\x76\x57\x52\x6e\x67\x57\x52\x72\x2b\x74\x71','\x57\x35\x69\x68\x57\x36\x35\x67\x41\x71','\x57\x36\x79\x36\x71\x38\x6b\x6a\x78\x57','\x46\x53\x6b\x4e\x57\x52\x64\x64\x4d\x53\x6f\x4b','\x66\x53\x6f\x57\x7a\x4c\x37\x64\x47\x53\x6b\x70\x57\x4f\x4a\x63\x4f\x71','\x42\x6d\x6b\x74\x41\x66\x38\x31','\x6d\x38\x6f\x4d\x64\x77\x58\x43\x68\x77\x4c\x6b','\x75\x38\x6b\x71\x72\x65\x75\x4a\x57\x37\x4e\x63\x53\x38\x6f\x35','\x42\x76\x72\x30\x73\x4e\x72\x35\x57\x36\x52\x64\x51\x61','\x71\x64\x61\x37\x41\x61','\x61\x67\x65\x48\x73\x78\x43','\x57\x52\x70\x64\x50\x43\x6b\x46\x57\x34\x79\x67\x57\x50\x65\x57\x76\x61','\x68\x68\x37\x63\x4c\x6d\x6f\x71\x72\x53\x6b\x39\x73\x43\x6b\x51','\x68\x4c\x68\x63\x56\x43\x6f\x74\x76\x71','\x57\x35\x61\x2b\x57\x4f\x54\x30\x62\x5a\x62\x6f\x43\x57','\x45\x6d\x6b\x36\x42\x4e\x43\x38','\x57\x36\x43\x61\x6a\x6d\x6f\x4f\x6b\x53\x6f\x65\x57\x51\x52\x64\x56\x57','\x64\x6d\x6f\x4c\x6c\x61\x30\x58','\x57\x35\x57\x57\x57\x36\x71','\x71\x63\x75\x4c\x77\x77\x4f','\x79\x43\x6f\x4b\x57\x51\x68\x64\x51\x66\x53','\x6c\x59\x37\x63\x54\x53\x6f\x64\x57\x4f\x47','\x57\x35\x4f\x36\x57\x51\x47\x64\x62\x71','\x63\x67\x33\x64\x53\x65\x4f\x57','\x6f\x38\x6f\x49\x68\x77\x39\x34','\x6e\x53\x6b\x4a\x57\x36\x6d\x71\x57\x34\x74\x63\x49\x31\x39\x57','\x7a\x71\x72\x65\x57\x51\x34\x41\x57\x4f\x62\x54','\x74\x68\x62\x75','\x57\x50\x6e\x4e\x71\x38\x6b\x4c\x66\x4d\x4f','\x41\x62\x39\x45','\x64\x77\x4b\x39\x57\x50\x6e\x74\x57\x37\x37\x63\x4e\x59\x57','\x57\x37\x43\x52\x57\x4f\x57\x76\x6a\x71\x6e\x56\x73\x47','\x46\x53\x6b\x51\x75\x32\x53\x6d','\x44\x61\x62\x55\x57\x51\x4b\x6d\x57\x50\x66\x53\x57\x51\x34','\x45\x38\x6b\x76\x57\x4f\x4a\x64\x4f\x43\x6b\x35\x41\x53\x6f\x78\x57\x51\x79','\x57\x34\x70\x64\x52\x53\x6f\x46\x57\x36\x64\x64\x51\x57','\x78\x38\x6b\x68\x41\x71\x71\x4d\x57\x36\x78\x63\x56\x43\x6b\x47','\x41\x61\x72\x67\x57\x51\x2f\x64\x47\x6d\x6f\x6f','\x57\x50\x48\x70\x6a\x4a\x46\x63\x52\x61','\x6c\x43\x6f\x48\x6f\x33\x39\x31\x66\x67\x31\x7a','\x57\x37\x69\x68\x57\x4f\x57','\x63\x33\x64\x64\x52\x43\x6f\x76','\x66\x78\x4a\x64\x52\x61','\x67\x53\x6f\x51\x57\x35\x62\x58\x57\x35\x50\x5a\x64\x43\x6b\x66','\x77\x66\x79\x6e','\x79\x47\x72\x6d\x57\x52\x4e\x63\x4d\x38\x6b\x64\x44\x43\x6b\x52','\x76\x77\x38\x6d\x74\x6d\x6f\x36\x44\x6d\x6f\x4a\x57\x52\x4b','\x66\x73\x66\x4d\x57\x52\x44\x34\x57\x52\x35\x59\x77\x57','\x71\x43\x6b\x37\x78\x57\x54\x35\x57\x4f\x52\x63\x50\x38\x6f\x41','\x71\x38\x6b\x6a\x57\x34\x69\x35\x57\x51\x68\x64\x54\x49\x31\x63','\x57\x34\x4e\x63\x52\x53\x6f\x5a\x7a\x43\x6b\x6b','\x76\x68\x79\x58\x61\x4a\x53','\x6f\x66\x46\x64\x4d\x49\x48\x5a\x57\x35\x6c\x64\x49\x73\x69','\x6d\x58\x72\x72\x57\x37\x38\x74','\x57\x34\x50\x7a\x57\x36\x62\x54\x57\x35\x30\x73\x67\x33\x4f','\x73\x49\x58\x37\x57\x4f\x2f\x63\x55\x61','\x65\x32\x37\x64\x4e\x67\x34\x2f\x57\x52\x68\x64\x47\x71\x6d','\x6a\x53\x6b\x53\x57\x36\x71\x68','\x42\x78\x57\x32\x72\x67\x72\x56\x57\x51\x4e\x64\x4c\x71','\x46\x4e\x44\x6d\x57\x4f\x58\x64','\x57\x36\x75\x41\x70\x53\x6f\x50\x68\x6d\x6f\x63\x57\x52\x69','\x44\x78\x48\x36\x65\x4a\x2f\x64\x55\x57\x4a\x63\x4a\x57','\x75\x62\x6c\x63\x4b\x43\x6b\x2b\x45\x53\x6f\x4a\x57\x50\x66\x50','\x57\x36\x56\x64\x4f\x53\x6f\x78\x57\x34\x46\x64\x56\x47','\x57\x52\x72\x67\x7a\x43\x6b\x59\x73\x6d\x6b\x74\x57\x50\x68\x64\x49\x43\x6f\x35\x72\x6d\x6f\x68\x64\x57','\x63\x4e\x71\x59\x57\x50\x72\x79\x57\x34\x33\x63\x48\x61','\x57\x50\x35\x48\x67\x63\x70\x63\x50\x53\x6b\x57\x6e\x53\x6f\x7a','\x71\x43\x6b\x74\x43\x77\x69\x32','\x77\x43\x6b\x6a\x7a\x30\x53\x37\x57\x36\x71','\x43\x75\x57\x53\x70\x57','\x6f\x53\x6f\x62\x57\x50\x34\x68\x61\x32\x4e\x64\x51\x6d\x6b\x34','\x77\x4e\x38\x4e\x69\x38\x6b\x38','\x57\x50\x70\x64\x54\x38\x6b\x6f\x57\x34\x61\x44','\x57\x35\x62\x61\x57\x37\x44\x52\x57\x34\x53\x73','\x7a\x4c\x64\x63\x4e\x38\x6b\x4b\x57\x35\x30','\x57\x36\x57\x55\x57\x4f\x53','\x66\x65\x43\x59\x79\x75\x5a\x64\x47\x4d\x42\x64\x56\x47','\x46\x31\x75\x35\x6c\x6d\x6b\x6a','\x72\x33\x31\x69\x57\x51\x4c\x6e','\x65\x43\x6f\x55\x57\x34\x76\x32\x57\x35\x43','\x57\x52\x37\x64\x54\x6d\x6b\x46\x57\x36\x30\x51','\x45\x71\x4f\x50\x77\x65\x57','\x44\x49\x4c\x38\x42\x4d\x35\x34\x57\x51\x56\x64\x4b\x71','\x57\x37\x38\x43\x57\x34\x48\x5a\x41\x64\x34\x35\x57\x36\x75','\x57\x35\x37\x63\x52\x6d\x6b\x6e\x57\x52\x6c\x63\x48\x47','\x42\x5a\x43\x6b\x57\x50\x37\x63\x4e\x6d\x6b\x63\x6d\x6d\x6b\x32','\x77\x59\x4e\x64\x48\x38\x6b\x6e\x65\x38\x6f\x58\x6b\x38\x6b\x51\x6b\x32\x2f\x64\x48\x61\x6e\x4f','\x70\x38\x6b\x79\x79\x49\x56\x63\x4a\x38\x6f\x67\x6d\x4d\x4a\x64\x53\x73\x52\x63\x52\x4a\x48\x6d','\x57\x52\x44\x30\x68\x57','\x57\x36\x65\x71\x45\x6d\x6b\x4d\x41\x71','\x57\x37\x65\x72\x57\x34\x6e\x59\x65\x5a\x47\x48\x57\x37\x71','\x57\x35\x4f\x32\x57\x50\x53\x41\x6a\x47','\x43\x57\x6e\x68\x57\x52\x70\x63\x48\x53\x6b\x76\x7a\x61','\x72\x4e\x69\x6e\x73\x38\x6f\x48\x7a\x43\x6f\x35\x57\x52\x79','\x72\x43\x6b\x6b\x7a\x4b\x30\x54\x57\x37\x4b','\x57\x36\x52\x63\x4e\x6d\x6b\x52\x57\x50\x70\x63\x55\x57','\x42\x38\x6f\x73\x6b\x33\x5a\x64\x49\x38\x6b\x6b\x44\x47','\x57\x35\x38\x43\x63\x53\x6f\x6e\x64\x47','\x75\x63\x35\x53\x57\x34\x53\x66\x57\x37\x33\x63\x54\x59\x65\x6c\x57\x37\x47\x43','\x46\x71\x58\x7a\x57\x52\x78\x63\x48\x57','\x72\x77\x72\x74\x57\x52\x6a\x68\x57\x51\x66\x2b\x75\x71','\x69\x71\x64\x64\x4b\x53\x6f\x62\x57\x50\x75\x49\x64\x58\x30','\x57\x50\x6a\x67\x42\x38\x6b\x78\x61\x43\x6f\x6a\x46\x59\x62\x75\x57\x35\x68\x63\x55\x47','\x63\x53\x6f\x70\x73\x68\x66\x4f\x61\x4e\x71\x43','\x74\x6d\x6b\x2f\x75\x57\x6e\x62\x57\x51\x78\x63\x50\x43\x6f\x6e','\x57\x36\x35\x34\x57\x35\x4c\x44\x57\x35\x38','\x78\x6d\x6f\x42\x6f\x66\x4e\x64\x4a\x71','\x57\x37\x6a\x77\x57\x50\x50\x77\x65\x53\x6f\x72\x78\x6d\x6f\x74','\x57\x52\x2f\x64\x4d\x53\x6b\x36\x57\x37\x53\x71','\x57\x37\x37\x63\x50\x6d\x6b\x69\x57\x4f\x56\x63\x49\x57','\x57\x52\x69\x73\x57\x50\x35\x52\x65\x5a\x4f\x31\x57\x36\x4b','\x43\x53\x6b\x4a\x57\x4f\x37\x64\x54\x6d\x6f\x5a\x42\x6d\x6f\x6d\x57\x52\x61','\x6a\x57\x35\x70\x57\x51\x64\x64\x49\x43\x6f\x70\x6d\x6d\x6b\x6f','\x57\x34\x64\x63\x55\x47\x5a\x64\x56\x38\x6b\x4f','\x57\x4f\x48\x4d\x64\x38\x6b\x2b\x72\x4a\x74\x64\x53\x38\x6f\x67','\x42\x38\x6f\x37\x57\x50\x78\x64\x4e\x33\x53','\x57\x37\x58\x4a\x57\x35\x44\x71\x57\x36\x53\x4f\x61\x75\x53','\x57\x36\x75\x2b\x57\x4f\x53\x33\x6b\x47','\x63\x6d\x6f\x31\x6b\x74\x4b\x4e\x7a\x6d\x6b\x2f\x74\x47','\x57\x34\x37\x64\x4a\x53\x6f\x51\x57\x35\x70\x64\x49\x57\x43\x37\x6a\x57','\x72\x4a\x70\x64\x4c\x53\x6b\x42\x64\x53\x6f\x47\x6e\x38\x6f\x54','\x57\x34\x61\x77\x45\x43\x6b\x78\x45\x57','\x64\x53\x6f\x52\x6f\x65\x58\x6e','\x46\x43\x6f\x57\x6e\x58\x54\x43\x71\x53\x6f\x75\x57\x4f\x75','\x65\x38\x6f\x2f\x57\x34\x66\x35\x57\x34\x79','\x57\x52\x50\x62\x62\x73\x56\x63\x52\x53\x6b\x56\x6e\x38\x6f\x35','\x57\x37\x78\x63\x51\x71\x78\x64\x4a\x38\x6b\x49','\x79\x5a\x39\x64\x57\x51\x30\x41\x57\x4f\x58\x53\x57\x51\x4f','\x65\x38\x6f\x4b\x46\x66\x37\x64\x4e\x47','\x44\x38\x6f\x4c\x6e\x49\x64\x63\x47\x57','\x6a\x58\x70\x63\x52\x53\x6f\x35\x57\x50\x79','\x75\x43\x6f\x72\x61\x49\x31\x6b','\x57\x34\x30\x6e\x57\x37\x6d\x4b\x57\x34\x47\x68\x70\x32\x43','\x42\x78\x30\x47\x43\x4e\x69','\x73\x4d\x47\x78','\x73\x59\x33\x63\x56\x43\x6b\x6c\x46\x71','\x72\x6d\x6b\x35\x57\x4f\x79\x4a\x57\x4f\x79\x59\x74\x6d\x6b\x47\x6c\x32\x70\x63\x4a\x6d\x6f\x59\x57\x37\x53','\x57\x51\x50\x4d\x63\x77\x42\x63\x4f\x38\x6b\x30\x6e\x53\x6f\x39','\x57\x36\x78\x63\x47\x53\x6f\x65\x75\x38\x6b\x49\x57\x4f\x6d\x44\x6b\x57','\x44\x75\x53\x63\x57\x51\x57\x71\x57\x4f\x62\x34\x57\x52\x69','\x41\x6d\x6f\x54\x57\x51\x42\x64\x4b\x33\x4b','\x46\x6d\x6b\x57\x45\x48\x61\x72\x57\x37\x64\x63\x54\x38\x6f\x73','\x71\x43\x6f\x47\x64\x64\x68\x63\x50\x71','\x57\x36\x75\x6a\x45\x43\x6b\x6d\x46\x61','\x73\x49\x44\x4c\x57\x50\x43\x47\x57\x51\x50\x78\x57\x4f\x30','\x6c\x38\x6f\x51\x70\x5a\x53\x30','\x43\x47\x72\x35\x57\x52\x71\x6e\x57\x4f\x50\x33\x57\x52\x4b','\x57\x51\x58\x57\x67\x61\x33\x63\x52\x53\x6b\x4c\x6d\x53\x6f\x6d','\x6e\x53\x6f\x51\x57\x34\x66\x2f\x57\x37\x4f','\x71\x59\x48\x4c\x57\x4f\x34\x58\x57\x52\x66\x43\x57\x4f\x30','\x57\x37\x72\x70\x57\x4f\x6e\x33\x63\x61','\x57\x35\x7a\x79\x57\x36\x79','\x68\x73\x71\x78\x57\x36\x53\x71\x57\x4f\x62\x71\x73\x43\x6b\x6e\x57\x52\x42\x63\x49\x61','\x75\x6d\x6f\x72\x68\x59\x44\x48','\x6d\x6d\x6f\x33\x68\x67\x58\x55\x73\x57','\x6b\x63\x5a\x63\x51\x38\x6f\x6d\x57\x51\x65','\x76\x4e\x47\x78\x43\x38\x6f\x57\x43\x53\x6f\x38\x57\x50\x71','\x61\x47\x69\x6e\x76\x4d\x70\x63\x4a\x62\x6d','\x57\x35\x30\x66\x7a\x38\x6b\x34\x73\x57','\x74\x6d\x6b\x46\x57\x50\x6c\x64\x55\x38\x6f\x71\x7a\x53\x6f\x6e\x57\x51\x43','\x72\x67\x4b\x41\x78\x6d\x6f\x57','\x78\x72\x37\x63\x4e\x53\x6f\x4e\x72\x53\x6f\x2f\x57\x50\x34\x53','\x61\x4a\x37\x63\x52\x38\x6b\x70\x57\x50\x57\x41\x57\x51\x35\x45','\x67\x59\x4e\x63\x4b\x38\x6f\x69\x57\x4f\x75\x4a\x63\x67\x4b','\x6f\x4e\x64\x64\x47\x6d\x6f\x49\x57\x52\x43','\x61\x67\x64\x64\x48\x4d\x47\x30\x57\x52\x70\x64\x4d\x61','\x64\x6d\x6b\x79\x57\x35\x6d','\x75\x78\x71\x6d\x76\x53\x6f\x71\x7a\x43\x6f\x2b\x57\x52\x4f','\x6e\x5a\x4c\x50\x57\x35\x4f\x45','\x41\x38\x6f\x56\x65\x73\x64\x63\x47\x58\x69\x49\x57\x4f\x53','\x61\x4a\x78\x63\x47\x38\x6f\x52\x57\x51\x75','\x57\x50\x50\x49\x7a\x43\x6b\x6c\x45\x61','\x77\x4b\x74\x63\x49\x43\x6b\x73\x57\x37\x4f','\x43\x43\x6b\x55\x72\x78\x79\x32','\x6a\x74\x4c\x51\x57\x37\x71\x57','\x57\x37\x52\x63\x49\x6d\x6f\x74','\x42\x72\x74\x63\x48\x53\x6b\x6a\x73\x38\x6f\x2b\x57\x4f\x54\x4a','\x62\x49\x6e\x58\x57\x37\x71\x65','\x76\x53\x6b\x62\x44\x4b\x43\x4d','\x68\x6d\x6f\x48\x46\x68\x37\x64\x54\x71','\x64\x4e\x5a\x64\x56\x47\x35\x75\x57\x37\x75','\x6b\x71\x4e\x63\x49\x43\x6f\x59\x57\x51\x4c\x69\x57\x37\x6d\x73','\x67\x43\x6f\x50\x62\x33\x44\x35','\x76\x53\x6f\x52\x79\x57\x70\x63\x51\x47','\x44\x38\x6b\x54\x75\x67\x69\x4e','\x76\x33\x72\x74\x57\x50\x66\x6e\x57\x52\x7a\x4e\x41\x47','\x7a\x48\x57\x6b\x78\x33\x4e\x64\x4e\x75\x4e\x64\x4f\x57','\x57\x51\x68\x64\x50\x6d\x6b\x7a\x57\x34\x43\x68\x57\x4f\x71\x57\x73\x61','\x42\x71\x35\x70\x57\x52\x61\x2b\x57\x4f\x39\x57\x57\x51\x47','\x63\x6d\x6b\x4d\x57\x35\x79\x32\x57\x35\x6d','\x57\x35\x5a\x64\x49\x6d\x6f\x2b\x57\x34\x2f\x64\x53\x57\x43\x34\x6b\x57','\x57\x35\x62\x50\x57\x51\x66\x37','\x66\x49\x78\x63\x4e\x38\x6f\x59\x57\x52\x53','\x71\x68\x52\x64\x49\x38\x6b\x7a\x57\x50\x4b\x7a\x67\x77\x4c\x70\x57\x51\x38','\x62\x59\x2f\x63\x55\x43\x6f\x71\x57\x51\x30\x7a\x57\x51\x54\x65','\x57\x35\x7a\x77\x57\x52\x6a\x58\x63\x57','\x6d\x75\x70\x63\x49\x67\x38\x49\x57\x37\x64\x64\x47\x47\x4b','\x6e\x6d\x6f\x51\x68\x4e\x4b','\x42\x43\x6b\x58\x75\x63\x47\x56\x72\x4a\x4c\x58\x57\x37\x56\x63\x4a\x38\x6b\x6c\x57\x51\x33\x64\x4e\x71','\x68\x67\x4f\x6f\x74\x66\x47','\x61\x47\x62\x69\x75\x6d\x6b\x63\x57\x36\x31\x54\x66\x43\x6b\x4b\x43\x61','\x77\x72\x48\x70\x57\x52\x71\x35\x57\x4f\x7a\x54\x57\x52\x30','\x63\x65\x74\x64\x4d\x78\x38\x64','\x6c\x43\x6b\x53\x7a\x4c\x43\x35\x67\x43\x6f\x55\x57\x52\x70\x63\x48\x64\x68\x63\x52\x6d\x6b\x4a','\x7a\x6d\x6b\x64\x57\x50\x78\x64\x53\x6d\x6f\x34\x7a\x6d\x6f\x71\x57\x51\x69','\x73\x4e\x6d\x70\x71\x43\x6b\x38\x6f\x71','\x57\x50\x31\x36\x78\x6d\x6b\x31\x77\x63\x4f','\x77\x31\x69\x42\x67\x6d\x6b\x65\x57\x35\x62\x4a\x61\x61','\x57\x50\x68\x64\x4a\x61\x52\x63\x4c\x49\x68\x63\x47\x74\x46\x63\x50\x71','\x7a\x4d\x47\x47\x79\x77\x4b','\x46\x30\x4f\x56\x6e\x63\x34','\x75\x77\x57\x4e\x44\x47','\x57\x4f\x72\x39\x67\x73\x74\x63\x4a\x43\x6b\x4c\x6e\x53\x6f\x55','\x6e\x38\x6f\x50\x68\x72\x61\x4b','\x7a\x43\x6b\x4d\x79\x74\x54\x34\x57\x51\x68\x63\x4c\x43\x6f\x2b','\x46\x68\x57\x78\x77\x38\x6f\x38','\x57\x34\x34\x77\x57\x35\x47\x51\x45\x71\x65\x42\x57\x34\x30','\x73\x38\x6b\x4c\x41\x74\x50\x37','\x71\x62\x4a\x63\x4e\x38\x6b\x49\x74\x43\x6f\x2b\x57\x51\x4c\x49','\x6c\x64\x52\x63\x4b\x38\x6f\x61\x57\x4f\x4b\x31\x67\x4b\x4b','\x57\x35\x62\x4e\x57\x52\x62\x54\x69\x47','\x46\x4d\x68\x63\x4f\x53\x6b\x4a\x57\x35\x53','\x57\x36\x6a\x76\x62\x43\x6f\x76\x6e\x43\x6b\x42\x57\x36\x79','\x72\x72\x46\x63\x4f\x38\x6b\x52\x45\x61','\x68\x68\x64\x64\x4d\x53\x6f\x65\x57\x51\x46\x63\x4f\x77\x54\x36','\x57\x35\x65\x44\x57\x34\x31\x34\x78\x47','\x66\x73\x71\x46\x57\x36\x53\x72\x57\x4f\x6a\x64\x46\x38\x6b\x58\x57\x50\x2f\x63\x56\x57','\x67\x72\x31\x45\x57\x37\x6d\x63\x62\x57','\x76\x78\x57\x78\x75\x6d\x6f\x37\x44\x53\x6f\x48\x57\x52\x61','\x57\x36\x79\x77\x57\x50\x34\x53\x66\x47\x39\x53\x77\x57','\x63\x4e\x58\x72\x77\x43\x6b\x36\x43\x53\x6f\x36\x57\x52\x61','\x57\x51\x57\x31\x72\x63\x52\x63\x50\x6d\x6b\x4a\x69\x38\x6f\x48','\x74\x5a\x79\x50\x41\x61','\x68\x78\x78\x63\x51\x43\x6f\x73\x76\x57','\x64\x38\x6f\x46\x66\x76\x43','\x71\x48\x74\x63\x48\x43\x6b\x49\x71\x53\x6f\x4a\x57\x50\x6a\x4c','\x57\x37\x57\x67\x57\x35\x48\x4c\x42\x5a\x69\x34\x57\x36\x75','\x42\x57\x7a\x70\x57\x51\x38\x6b\x57\x50\x43','\x57\x37\x47\x4e\x57\x34\x76\x4e\x77\x74\x47\x48\x57\x37\x71','\x78\x6d\x6b\x33\x43\x77\x69\x75\x78\x6d\x6b\x33\x71\x38\x6f\x38\x79\x47','\x6e\x66\x34\x45\x57\x51\x6d\x36\x57\x51\x54\x30\x57\x50\x4f\x4a','\x71\x65\x4f\x62\x75\x65\x71\x4d\x57\x37\x56\x63\x4e\x71','\x57\x34\x64\x63\x4b\x43\x6f\x4f\x43\x38\x6b\x30','\x75\x59\x72\x63\x57\x52\x68\x63\x52\x71','\x57\x35\x43\x43\x44\x38\x6f\x65\x71\x43\x6f\x4f\x73\x47\x43','\x66\x75\x43\x53\x74\x30\x52\x64\x4b\x30\x70\x64\x4b\x71','\x57\x34\x42\x63\x4e\x67\x2f\x64\x4e\x6d\x6b\x38\x77\x66\x33\x64\x50\x61','\x62\x4b\x6c\x64\x49\x78\x34\x66\x57\x52\x4e\x64\x47\x71\x6d','\x71\x78\x52\x64\x4a\x6d\x6f\x75\x63\x53\x6b\x4b\x46\x43\x6b\x54','\x57\x52\x33\x64\x50\x43\x6b\x46','\x44\x67\x56\x64\x4a\x6d\x6b\x70\x57\x34\x42\x63\x49\x73\x58\x61','\x68\x38\x6f\x57\x7a\x4c\x4b','\x6d\x74\x50\x38\x57\x34\x34\x70'];_0x263b=function(){return _0x556052;};return _0x263b();}const _0x23f8f7=new Set([_0x49f02d(0x19f,'\x61\x46\x48\x65')+'\x45\x54',_0x49f02d(0x261,'\x73\x47\x41\x23'),_0x49f02d(0x17e,'\x36\x48\x45\x71')+_0x49f02d(0x23f,'\x33\x40\x4a\x59'),'\x45\x48\x4f\x53\x54\x55\x4e\x52'+_0x49f02d(0x266,'\x66\x7a\x29\x6a'),_0x49f02d(0x150,'\x2a\x75\x65\x69'),_0x49f02d(0x246,'\x66\x7a\x29\x6a')+_0x49f02d(0x21b,'\x73\x47\x41\x23')]);function _0x17ec00(_0x7a0796){const _0x2a1891=_0x49f02d;if(!_0x7a0796)return![];if(_0x23f8f7[_0x2a1891(0x259,'\x70\x6c\x5d\x66')](_0x7a0796[_0x2a1891(0x256,'\x66\x64\x32\x4f')]))return!![];if(_0x7a0796[_0x2a1891(0x177,'\x42\x23\x64\x68')]&&_0x23f8f7[_0x2a1891(0x257,'\x73\x47\x41\x23')](_0x7a0796[_0x2a1891(0x177,'\x42\x23\x64\x68')][_0x2a1891(0x236,'\x61\x5d\x49\x79')]))return!![];return![];}function _0x5718fb(_0x3b7e9d){const _0x946092=_0x49f02d,_0x1ef544={'\x41\x4a\x47\x52\x78':function(_0x1fe4ca,_0x452ea8){return _0x1fe4ca===_0x452ea8;},'\x5a\x66\x6b\x56\x6b':function(_0x248a34,_0x410f79){return _0x248a34(_0x410f79);},'\x6a\x48\x59\x4b\x79':function(_0xf503ce,_0x575b86){return _0xf503ce(_0x575b86);},'\x59\x61\x74\x63\x69':_0x946092(0x18b,'\x52\x32\x28\x52'),'\x65\x58\x50\x4b\x70':function(_0x539476,_0x25d082){return _0x539476+_0x25d082;},'\x6a\x68\x73\x58\x4a':function(_0x125f32,_0x23d09c){return _0x125f32+_0x23d09c;},'\x73\x6e\x57\x67\x72':_0x946092(0x1de,'\x58\x6f\x51\x4e')+_0x946092(0x235,'\x28\x5b\x21\x76')+_0x946092(0x1ce,'\x67\x5b\x30\x40')+_0x946092(0x1da,'\x24\x4d\x6f\x55')+_0x946092(0x1e8,'\x6f\x4c\x72\x4e'),'\x7a\x66\x73\x63\x6e':_0x946092(0x23b,'\x74\x4a\x25\x24')+_0x946092(0x223,'\x37\x4b\x5d\x76')+_0x946092(0x22c,'\x6f\x4c\x72\x4e')+_0x946092(0x1fb,'\x28\x5b\x21\x76')+_0x946092(0x200,'\x24\x30\x6a\x55')+_0x946092(0x195,'\x61\x46\x48\x65')+_0x946092(0x25e,'\x66\x7a\x29\x6a')+_0x946092(0x1ab,'\x66\x62\x71\x76')+_0x946092(0x249,'\x25\x25\x35\x75'),'\x77\x59\x56\x6b\x55':function(_0xe41faf,_0x54865a){return _0xe41faf!==_0x54865a;},'\x6f\x4f\x51\x4a\x74':_0x946092(0x21c,'\x6c\x76\x4d\x42'),'\x52\x6f\x49\x52\x62':function(_0x2b4e33,_0x56e41c){return _0x2b4e33+_0x56e41c;}};let _0x1d79da;try{if(_0x1ef544[_0x946092(0x1e1,'\x45\x54\x64\x4f')]!=='\x4d\x54\x4b\x69\x53')_0x1d79da=new URL(_0x3b7e9d);else{if(_0x1ef544[_0x946092(0x1b7,'\x6d\x35\x62\x28')](_0x2e1af2.env.EVOMAP_HUB_ALLOW_INSECURE,'\x31'))return;_0x1ef544[_0x946092(0x145,'\x4c\x70\x69\x2a')](_0x204ba2,_0x40e426);}}catch{throw new Error(_0x1ef544['\x65\x58\x50\x4b\x70'](_0x1ef544['\x6a\x68\x73\x58\x4a'](_0x1ef544[_0x946092(0x1f3,'\x28\x53\x33\x5b')]+JSON['\x73\x74\x72\x69\x6e\x67\x69\x66'+'\x79'](_0x3b7e9d),'\x2e\x20'),_0x1ef544[_0x946092(0x154,'\x70\x59\x79\x57')]));}if(_0x1ef544[_0x946092(0x169,'\x42\x23\x64\x68')](_0x1d79da[_0x946092(0x25b,'\x45\x54\x64\x4f')],_0x946092(0x1a4,'\x59\x59\x4f\x30'))){if(_0x1ef544[_0x946092(0x206,'\x5b\x55\x38\x41')](_0x946092(0x1aa,'\x45\x54\x64\x4f'),_0x1ef544[_0x946092(0x250,'\x69\x7a\x76\x4f')])){if(_0x1ef544[_0x946092(0x151,'\x70\x6c\x5d\x66')](_0xfa2ec3,_0x425f4d))try{_0x18fb37();}catch(_0xc4e1aa){}throw _0x28a14f;}else throw new Error(_0x1ef544[_0x946092(0x241,'\x55\x53\x67\x74')](_0x1ef544[_0x946092(0x1ae,'\x66\x64\x32\x4f')]('\x5b\x68\x75\x62\x46\x65\x74\x63'+_0x946092(0x15f,'\x71\x57\x25\x55')+_0x946092(0x171,'\x59\x59\x4f\x30')+_0x946092(0x197,'\x41\x6a\x7a\x61')+'\x73\x3a\x2f\x2f\x20\u2014\x20\x67'+_0x946092(0x255,'\x33\x40\x4a\x59'),JSON[_0x946092(0x22d,'\x4c\x70\x69\x2a')+'\x79'](_0x3b7e9d))+'\x2e\x20',_0x1ef544[_0x946092(0x16d,'\x71\x57\x25\x55')]));}}function _0xdac3cf(_0x33983c){const _0x2c0b12=_0x49f02d,_0x30c8b4={};_0x30c8b4[_0x2c0b12(0x219,'\x74\x4a\x25\x24')]=function(_0x51a7a5,_0x4784f8){return _0x51a7a5===_0x4784f8;};const _0x31f9cd=_0x30c8b4;if(_0x31f9cd[_0x2c0b12(0x1e9,'\x66\x62\x71\x76')](process.env.EVOMAP_HUB_ALLOW_INSECURE,'\x31'))return;_0x5718fb(_0x33983c);}async function _0x3a37a3(_0x4237c5,_0x413262){const _0x385986=_0x49f02d,_0x46cef0={'\x59\x61\x57\x57\x47':function(_0x273667,_0x1420a2,_0xabd0bd){return _0x273667(_0x1420a2,_0xabd0bd);},'\x46\x72\x65\x55\x49':function(_0x472683,_0x39d336){return _0x472683===_0x39d336;},'\x7a\x48\x56\x48\x77':function(_0x1f6451,_0x18735f,_0x4b7fd8){return _0x1f6451(_0x18735f,_0x4b7fd8);},'\x6d\x4a\x51\x55\x79':function(_0x54222b,_0x4d67e9){return _0x54222b===_0x4d67e9;},'\x69\x50\x57\x43\x72':function(_0x2fa59f,_0x1200b8){return _0x2fa59f!==_0x1200b8;},'\x49\x53\x6b\x58\x71':_0x385986(0x1e7,'\x70\x59\x79\x57'),'\x74\x79\x73\x70\x61':_0x385986(0x191,'\x66\x62\x71\x76'),'\x71\x79\x71\x47\x45':function(_0x44eabe,_0x4a8946){return _0x44eabe(_0x4a8946);},'\x66\x43\x79\x4d\x58':'\x78\x65\x61\x43\x78','\x4f\x4e\x4c\x45\x69':_0x385986(0x17d,'\x55\x53\x67\x74'),'\x45\x4c\x4b\x50\x6d':function(_0x1cfb4f,_0x4e392b){return _0x1cfb4f===_0x4e392b;},'\x47\x43\x59\x6d\x61':function(_0x4d55cd){return _0x4d55cd();}};if(_0x46cef0[_0x385986(0x176,'\x6e\x4d\x69\x69')](process.env.EVOMAP_HUB_ALLOW_INSECURE,'\x31')){if(_0x46cef0[_0x385986(0x230,'\x34\x49\x29\x56')](_0x46cef0[_0x385986(0x260,'\x6b\x74\x51\x65')],_0x46cef0[_0x385986(0x21e,'\x6f\x4c\x72\x4e')])){const _0x2d225f=_0x46cef0[_0x385986(0x20d,'\x29\x21\x50\x53')](_0x3ef1da,_0x4a670)?_0x3ef1da:global[_0x385986(0x17f,'\x74\x4a\x25\x24')];return _0x2d225f(_0x4237c5,_0x413262);}else{if(!_0x230575)return![];if(_0x120b0c[_0x385986(0x248,'\x4c\x70\x69\x2a')](_0x23e789[_0x385986(0x1c9,'\x6a\x42\x42\x64')]))return!![];if(_0x2cee96[_0x385986(0x245,'\x59\x59\x4f\x30')]&&_0x58c4fd[_0x385986(0x162,'\x58\x6f\x51\x4e')](_0x280049[_0x385986(0x1e6,'\x6a\x42\x42\x64')][_0x385986(0x1c9,'\x6a\x42\x42\x64')]))return!![];return![];}}_0x46cef0[_0x385986(0x1b4,'\x73\x75\x40\x32')](_0x5718fb,_0x4237c5);const _0x536bca=_0x46cef0[_0x385986(0x23c,'\x41\x6a\x7a\x61')](_0x22762c,_0x4237c5);try{if(_0x46cef0[_0x385986(0x226,'\x61\x70\x6c\x76')](_0x46cef0[_0x385986(0x237,'\x4b\x37\x5e\x77')],_0x46cef0[_0x385986(0x1a3,'\x47\x59\x47\x73')])){const _0x3fb565={};return _0x3fb565['\x64\x69\x73\x70\x61\x74\x63\x68'+'\x65\x72']=_0x536bca,await _0x3ef1da(_0x4237c5,Object[_0x385986(0x1d8,'\x25\x25\x35\x75')]({},_0x413262,_0x3fb565));}else{if(_0x385f3a)return qvSiNi[_0x385986(0x243,'\x74\x4a\x25\x24')](_0x1ee140,_0x334712,_0x5048eb);try{_0x1d4cf3&&qvSiNi[_0x385986(0x1b6,'\x70\x59\x79\x57')](typeof _0x3586c2[_0x385986(0x1ff,'\x4b\x37\x5e\x77')+_0x385986(0x218,'\x4b\x37\x5e\x77')],'\x66\x75\x6e\x63\x74\x69\x6f\x6e')&&_0x5a8591[_0x385986(0x19d,'\x58\x6f\x51\x4e')+'\x6c\x69\x76\x65'](!![],0x4918+-0x6f43+0x3*0x2041);}catch(_0x557c15){}qvSiNi[_0x385986(0x1d1,'\x4b\x37\x5e\x77')](_0x4cc36f,null,_0x2f2a65);}}catch(_0xe0c721){if(_0x46cef0['\x45\x4c\x4b\x50\x6d'](_0x385986(0x163,'\x6c\x76\x4d\x42'),_0x385986(0x1bb,'\x5b\x55\x38\x41'))){if(_0x46cef0[_0x385986(0x22f,'\x6c\x76\x4d\x42')](_0x17ec00,_0xe0c721))try{_0x46cef0[_0x385986(0x149,'\x69\x7a\x76\x4f')](_0x4a85b9);}catch(_0x368997){}throw _0xe0c721;}else _0x3077f8[_0x385986(0x1c3,'\x4c\x70\x69\x2a')+_0x385986(0x14f,'\x6b\x74\x51\x65')](!![],-0x2105+-0x144a+0x6fe7);}}const _0x30bd00={};_0x30bd00[_0x49f02d(0x267,'\x28\x5b\x21\x76')]=_0x3a37a3,_0x30bd00[_0x49f02d(0x24b,'\x37\x4b\x5d\x76')+'\x6c']=_0x4a85b9,_0x30bd00[_0x49f02d(0x1ba,'\x66\x62\x71\x76')+_0x49f02d(0x24e,'\x61\x46\x48\x65')+_0x49f02d(0x1b1,'\x45\x54\x64\x4f')+'\x72']=_0x17ec00,_0x30bd00[_0x49f02d(0x1e5,'\x73\x75\x40\x32')+'\x65\x48\x75\x62\x55\x72\x6c']=_0x5718fb,_0x30bd00[_0x49f02d(0x25a,'\x71\x57\x25\x55')+_0x49f02d(0x254,'\x59\x59\x4f\x30')]=_0xdac3cf,_0x30bd00[_0x49f02d(0x263,'\x36\x48\x45\x71')+_0x49f02d(0x24c,'\x74\x4a\x25\x24')]=_0x478db6,_0x30bd00[_0x49f02d(0x1d3,'\x61\x46\x48\x65')+_0x49f02d(0x172,'\x56\x41\x64\x28')+_0x49f02d(0x1dd,'\x28\x5b\x21\x76')]=_0x54f6d7,module[_0x49f02d(0x16a,'\x6d\x6b\x40\x45')]=_0x30bd00;
|
|
1
|
+
// hubFetch -- single chokepoint for every Hub-facing HTTP call.
|
|
2
|
+
//
|
|
3
|
+
// Two protections, both bypassable only via EVOMAP_HUB_ALLOW_INSECURE=1:
|
|
4
|
+
//
|
|
5
|
+
// 1. URL schema check. Rejects anything that does not parse as https://.
|
|
6
|
+
// This catches every misconfigured / attacker-supplied env var even
|
|
7
|
+
// when the caller bypassed resolveHubUrl() and read process.env
|
|
8
|
+
// directly (httpTransportSend / getHubUrl() / per-call opts.hubUrl /
|
|
9
|
+
// proxy this.hubUrl all reach here).
|
|
10
|
+
//
|
|
11
|
+
// 2. TLS verification. Built-in fetch validates certificates by default,
|
|
12
|
+
// but NODE_TLS_REJECT_UNAUTHORIZED=0 disables that globally. Passing
|
|
13
|
+
// an explicit undici.Agent with connect.rejectUnauthorized:true as
|
|
14
|
+
// the dispatcher makes Hub traffic immune to that env var.
|
|
15
|
+
//
|
|
16
|
+
// Escape hatch: EVOMAP_HUB_ALLOW_INSECURE=1 disables BOTH protections (used
|
|
17
|
+
// for local dev / mock hubs on http:// or with self-signed certs). Any
|
|
18
|
+
// value other than exactly "1" is treated as absent.
|
|
19
|
+
|
|
20
|
+
// Use BOTH Agent and fetch from the same undici package. Node's global
|
|
21
|
+
// fetch is built on an internal undici, and an Agent created from the
|
|
22
|
+
// installed `undici` package is not interface-compatible with it — mixing
|
|
23
|
+
// them yields `UND_ERR_INVALID_ARG: invalid onRequestStart method` at
|
|
24
|
+
// request time. Pulling fetch from the same package keeps them in sync.
|
|
25
|
+
const https = require('https');
|
|
26
|
+
const { Agent, fetch: undiciFetch, buildConnector } = require('undici');
|
|
27
|
+
|
|
28
|
+
// Cap idle keep-alive well below consumer-router NAT eviction (typically
|
|
29
|
+
// 60-300s). undici's default keepAliveTimeout is 600s, which means after an
|
|
30
|
+
// idle period the next request reuses a socket the NAT has already silently
|
|
31
|
+
// dropped and only fails after AbortSignal timeout — a major contributor to
|
|
32
|
+
// post-idle heartbeat death. headers/bodyTimeout are bounded so a wedged
|
|
33
|
+
// socket cannot stall the heartbeat indefinitely.
|
|
34
|
+
// Connect options shared between agents.
|
|
35
|
+
// - rejectUnauthorized: TLS verification, immune to NODE_TLS_REJECT_UNAUTHORIZED=0.
|
|
36
|
+
// - timeout: TCP+TLS handshake deadline.
|
|
37
|
+
// - autoSelectFamily: Happy Eyeballs. On dual-stack networks where the v6
|
|
38
|
+
// route black-holes after sleep/wake (common with residential routers),
|
|
39
|
+
// without this Node tries v6 first and only falls back to v4 after the
|
|
40
|
+
// full connect.timeout (~10s). With autoSelectFamily the v4 attempt
|
|
41
|
+
// races in within ~250ms, so the first post-wake hub call is fast
|
|
42
|
+
// instead of suffering a guaranteed 10s pause.
|
|
43
|
+
const _connectOpts = {
|
|
44
|
+
rejectUnauthorized: true,
|
|
45
|
+
timeout: 10_000,
|
|
46
|
+
autoSelectFamily: true,
|
|
47
|
+
autoSelectFamilyAttemptTimeout: 250,
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
// Round-8 (§21.6): wrap undici's built-in connector so we can enable
|
|
51
|
+
// OS-level TCP keepalive on the underlying socket. macOS default
|
|
52
|
+
// TCP_KEEPIDLE is 7200s -- way too long for our 10s heartbeat
|
|
53
|
+
// AbortSignal to ever benefit from kernel-level dead-socket detection.
|
|
54
|
+
// undici's keepAliveTimeout (10s above) trims sockets that have been
|
|
55
|
+
// idle in our pool, but a socket that is freshly idle (1-9s) and gets
|
|
56
|
+
// silently NAT-evicted during the macOS sleep window is reused on
|
|
57
|
+
// wake, the next request hangs until the AbortSignal trips, and the
|
|
58
|
+
// dispatcher pool fills with "destroying" sockets that pin capacity.
|
|
59
|
+
// With setKeepAlive(true, 15_000) the kernel fires TCP keepalive
|
|
60
|
+
// probes after 15s of socket idle, sees the silent drop within a few
|
|
61
|
+
// probe intervals, and surfaces ECONNRESET to the next read -- so
|
|
62
|
+
// reuse of a dead socket fails fast instead of hanging until app-
|
|
63
|
+
// layer timeout. autoSelectFamily, rejectUnauthorized, connect.timeout
|
|
64
|
+
// all still apply because we delegate to buildConnector(opts).
|
|
65
|
+
const _baseConnect = buildConnector(_connectOpts);
|
|
66
|
+
function _connectWithKeepAlive(opts, cb) {
|
|
67
|
+
return _baseConnect(opts, function (err, socket) {
|
|
68
|
+
if (err) return cb(err, socket);
|
|
69
|
+
try {
|
|
70
|
+
if (socket && typeof socket.setKeepAlive === 'function') {
|
|
71
|
+
socket.setKeepAlive(true, 15_000);
|
|
72
|
+
}
|
|
73
|
+
} catch (_) { /* never block connect on a setKeepAlive failure */ }
|
|
74
|
+
cb(null, socket);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Marker so the #160 TLS-pinning contract (dispatcher.options.connect
|
|
78
|
+
// .rejectUnauthorized === true) remains introspectable now that
|
|
79
|
+
// `connect` is a function wrapping buildConnector(_connectOpts) instead
|
|
80
|
+
// of a plain options object. The actual TLS pinning is enforced by
|
|
81
|
+
// _connectOpts above; this property only mirrors that intent for tests
|
|
82
|
+
// and readers.
|
|
83
|
+
_connectWithKeepAlive.rejectUnauthorized = true;
|
|
84
|
+
|
|
85
|
+
function _makeStrictAgent() {
|
|
86
|
+
return new Agent({
|
|
87
|
+
connect: _connectWithKeepAlive,
|
|
88
|
+
keepAliveTimeout: 10_000,
|
|
89
|
+
keepAliveMaxTimeout: 60_000,
|
|
90
|
+
headersTimeout: 30_000,
|
|
91
|
+
bodyTimeout: 30_000,
|
|
92
|
+
pipelining: 1,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function _makeLongPollAgent() {
|
|
97
|
+
return new Agent({
|
|
98
|
+
connect: _connectWithKeepAlive,
|
|
99
|
+
keepAliveTimeout: 10_000,
|
|
100
|
+
keepAliveMaxTimeout: 60_000,
|
|
101
|
+
headersTimeout: 65_000,
|
|
102
|
+
bodyTimeout: 65_000,
|
|
103
|
+
pipelining: 1,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function _makeMailboxAgent() {
|
|
108
|
+
return new Agent({
|
|
109
|
+
connect: _connectWithKeepAlive,
|
|
110
|
+
keepAliveTimeout: 10_000,
|
|
111
|
+
keepAliveMaxTimeout: 60_000,
|
|
112
|
+
// Sits just above the highest mailbox AbortSignal (inbound=35s) so the
|
|
113
|
+
// app-layer signal is the authority on cancellation, while still
|
|
114
|
+
// bounding wedged-socket lifetime well below "forever".
|
|
115
|
+
headersTimeout: 45_000,
|
|
116
|
+
bodyTimeout: 45_000,
|
|
117
|
+
pipelining: 1,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Default agent for short hub calls (heartbeat, hello, transport, publish).
|
|
122
|
+
// Header/body timeouts (30s) are bounded so a wedged socket cannot stall
|
|
123
|
+
// the heartbeat loop (HEARTBEAT_TIMEOUT_MS=10s leaves a 3x margin).
|
|
124
|
+
// keepAliveTimeout is well below consumer-router NAT eviction (typically
|
|
125
|
+
// 60-300s) so the next call after an idle period gets a fresh socket
|
|
126
|
+
// rather than reusing one the NAT has silently dropped.
|
|
127
|
+
// Node's native `https.Agent` for callers that build their own
|
|
128
|
+
// `https.request(...)` transport (atpExecute._postJson). hubFetch pins
|
|
129
|
+
// TLS verification for fetch() via the undici Agent above; this is the
|
|
130
|
+
// equivalent for the `node:https` API so the second protection layer
|
|
131
|
+
// described at the top of this file is honoured everywhere, not just by
|
|
132
|
+
// hubFetch.
|
|
133
|
+
const _strictHttpsAgent = new https.Agent({ rejectUnauthorized: true });
|
|
134
|
+
|
|
135
|
+
// Long-poll agent for /a2a/events/poll. The application-layer
|
|
136
|
+
// AbortSignal.timeout for that path is 60s (EVENT_POLL_TIMEOUT_MS), but
|
|
137
|
+
// _strictAgent's headersTimeout=30s would otherwise fire first and abort
|
|
138
|
+
// every long poll at 30s -- the hub gets no chance to deliver an event
|
|
139
|
+
// that arrives in the 30-55s window. Headers/body timeouts here sit just
|
|
140
|
+
// above the app-layer 60s ceiling so the AbortSignal is the visible
|
|
141
|
+
// timeout signal.
|
|
142
|
+
// Mailbox agent for /a2a/mailbox/inbound (35s AbortSignal) and
|
|
143
|
+
// /a2a/mailbox/outbound (30s AbortSignal). _strictAgent's 30s
|
|
144
|
+
// headers/bodyTimeout would fire AT OR BEFORE those app signals,
|
|
145
|
+
// silently capping inbound at 30s (regression vs main where _strictAgent
|
|
146
|
+
// had undici defaults ~300s) and racing with outbound's identical 30s
|
|
147
|
+
// signal. The 45s ceiling here keeps the app-layer AbortSignal as the
|
|
148
|
+
// authority while still bounding a wedged socket.
|
|
149
|
+
let _strictAgent = _makeStrictAgent();
|
|
150
|
+
let _longPollAgent = _makeLongPollAgent();
|
|
151
|
+
let _mailboxAgent = _makeMailboxAgent();
|
|
152
|
+
|
|
153
|
+
// Drain and rebuild both undici agents. Called from the index.js SIGCONT
|
|
154
|
+
// handler on macOS resume: undici's keepAliveTimeout is measured from
|
|
155
|
+
// "socket goes idle" on libuv's monotonic clock, which freezes through
|
|
156
|
+
// sleep. The next post-wake request can therefore reuse a socket the
|
|
157
|
+
// NAT silently dropped during the suspend window and only fail after the
|
|
158
|
+
// 30s headersTimeout -- well above HEARTBEAT_TIMEOUT_MS (10s). The
|
|
159
|
+
// AbortSignal trips first but the socket may linger in the pool's
|
|
160
|
+
// "destroying" state, pinning capacity. Closing both agents forces all
|
|
161
|
+
// idle sockets shut and frees the per-host autoSelectFamily cache so a
|
|
162
|
+
// stale "v6 wins" decision from before sleep does not stick when v6 is
|
|
163
|
+
// now black-holed. In-flight requests still finish on their existing
|
|
164
|
+
// socket (close() does not abort them). Cheap to call -- safe to invoke
|
|
165
|
+
// even if nothing changed.
|
|
166
|
+
function drainPool() {
|
|
167
|
+
const old = [_strictAgent, _longPollAgent, _mailboxAgent];
|
|
168
|
+
_strictAgent = _makeStrictAgent();
|
|
169
|
+
_longPollAgent = _makeLongPollAgent();
|
|
170
|
+
_mailboxAgent = _makeMailboxAgent();
|
|
171
|
+
for (const agent of old) {
|
|
172
|
+
try {
|
|
173
|
+
// Agent.close() returns a Promise that resolves when all in-flight
|
|
174
|
+
// requests finish. We do not await it -- the new agents already
|
|
175
|
+
// serve fresh calls, and the old ones drain naturally.
|
|
176
|
+
const p = agent.close();
|
|
177
|
+
if (p && typeof p.catch === 'function') p.catch(() => {});
|
|
178
|
+
} catch (_) {}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function _pickDispatcher(url) {
|
|
183
|
+
// Three dispatcher pools, picked by exact path match:
|
|
184
|
+
// - /a2a/events/poll -> _longPollAgent (65s timeouts)
|
|
185
|
+
// - /a2a/mailbox/{inbound,outbound} -> _mailboxAgent (45s timeouts)
|
|
186
|
+
// - everything else -> _strictAgent (30s timeouts)
|
|
187
|
+
//
|
|
188
|
+
// The split exists because each path has a different app-layer
|
|
189
|
+
// AbortSignal ceiling: event poll = 60s, mailbox inbound = 35s, mailbox
|
|
190
|
+
// outbound = 30s (racy against strict's 30s), heartbeat / hello /
|
|
191
|
+
// transport = <= 10s. The strict agent's 30s headers/bodyTimeout
|
|
192
|
+
// would otherwise fire BEFORE the longer app signals, silently
|
|
193
|
+
// capping those paths and making AbortSignal cosmetic. Mailbox /
|
|
194
|
+
// long-poll dispatchers keep the app-layer signal as the visible
|
|
195
|
+
// timeout while still bounding wedged-socket lifetime.
|
|
196
|
+
//
|
|
197
|
+
// Match on path (not host) to avoid coupling to a specific hub URL.
|
|
198
|
+
//
|
|
199
|
+
// Round-6 (§19.8): previously the matcher accepted both
|
|
200
|
+
// `pathname === '/a2a/events/poll'` AND `pathname.endsWith('/a2a/events/poll')`.
|
|
201
|
+
// The endsWith branch was a needless widening that also caught
|
|
202
|
+
// unrelated paths such as `/admin/a2a/events/poll`, `/v2/a2a/events/poll`,
|
|
203
|
+
// or any future hub path that happens to end with the same suffix --
|
|
204
|
+
// those would silently inherit the 65s long-poll timeout when they
|
|
205
|
+
// should fail fast on the 30s strict timeout. Use exact match only.
|
|
206
|
+
// For hub deployments mounted under a base path (rare; not in the
|
|
207
|
+
// current hub repo), set EVOLVER_LONG_POLL_PATH to override.
|
|
208
|
+
const longPollPath = process.env.EVOLVER_LONG_POLL_PATH || '/a2a/events/poll';
|
|
209
|
+
try {
|
|
210
|
+
const u = new URL(url);
|
|
211
|
+
if (u.pathname === longPollPath) {
|
|
212
|
+
return _longPollAgent;
|
|
213
|
+
}
|
|
214
|
+
if (u.pathname === '/a2a/mailbox/inbound' || u.pathname === '/a2a/mailbox/outbound') {
|
|
215
|
+
return _mailboxAgent;
|
|
216
|
+
}
|
|
217
|
+
} catch {
|
|
218
|
+
// fall through to strict
|
|
219
|
+
}
|
|
220
|
+
return _strictAgent;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Test seam: lets unit tests swap in a mock fetch without forking the call
|
|
224
|
+
// path. Production code must NEVER reassign this from outside the module.
|
|
225
|
+
let _fetchImpl = undiciFetch;
|
|
226
|
+
function _setFetchImplForTest(fn) { _fetchImpl = fn || undiciFetch; }
|
|
227
|
+
|
|
228
|
+
// Error codes that indicate a network-layer disruption rather than an
|
|
229
|
+
// application-layer error. On Linux, a NetworkManager reconnect, VPN
|
|
230
|
+
// re-establishment, or WiFi hand-off invalidates the 5-tuples of all
|
|
231
|
+
// existing TCP connections in the undici pool. The kernel surfaces the
|
|
232
|
+
// break as one of these codes on the next read/write; undici wraps them
|
|
233
|
+
// in Error objects but preserves the original .code property.
|
|
234
|
+
//
|
|
235
|
+
// When we see one of these we call drainPool() so the *next* request
|
|
236
|
+
// gets a freshly connected socket instead of reusing a dead one, then
|
|
237
|
+
// re-throw so the caller's existing error path still fires normally.
|
|
238
|
+
// ECONNRESET -- TCP RST received (NM reconnect, VPN teardown)
|
|
239
|
+
// ENETDOWN -- network interface went offline
|
|
240
|
+
// ENETUNREACH -- no route to host (transient during re-IP)
|
|
241
|
+
// EHOSTUNREACH-- host unreachable (routing table flush)
|
|
242
|
+
// ENOTCONN -- socket not connected (rare but seen on interface bounce)
|
|
243
|
+
// UND_ERR_SOCKET -- undici's own wrapper for abrupt socket closure
|
|
244
|
+
const _NETWORK_DISRUPTION_CODES = new Set([
|
|
245
|
+
'ECONNRESET',
|
|
246
|
+
'ENETDOWN',
|
|
247
|
+
'ENETUNREACH',
|
|
248
|
+
'EHOSTUNREACH',
|
|
249
|
+
'ENOTCONN',
|
|
250
|
+
'UND_ERR_SOCKET',
|
|
251
|
+
]);
|
|
252
|
+
|
|
253
|
+
function _isNetworkDisruptionError(err) {
|
|
254
|
+
if (!err) return false;
|
|
255
|
+
// undici may carry the original code either on err.code or on err.cause.code
|
|
256
|
+
if (_NETWORK_DISRUPTION_CODES.has(err.code)) return true;
|
|
257
|
+
if (err.cause && _NETWORK_DISRUPTION_CODES.has(err.cause.code)) return true;
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function _validateHubUrl(url) {
|
|
262
|
+
let parsed;
|
|
263
|
+
try {
|
|
264
|
+
parsed = new URL(url);
|
|
265
|
+
} catch {
|
|
266
|
+
throw new Error(
|
|
267
|
+
'[hubFetch] Hub URL is not a valid URL: ' + JSON.stringify(url) + '. ' +
|
|
268
|
+
'Set EVOMAP_HUB_ALLOW_INSECURE=1 to bypass (local dev / mock hub only).'
|
|
269
|
+
);
|
|
270
|
+
}
|
|
271
|
+
if (parsed.protocol !== 'https:') {
|
|
272
|
+
throw new Error(
|
|
273
|
+
'[hubFetch] Hub URL must use https:// — got ' + JSON.stringify(url) + '. ' +
|
|
274
|
+
'Set EVOMAP_HUB_ALLOW_INSECURE=1 to bypass (local dev / mock hub only).'
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
// Public scheme-only guard for callers that already manage their own HTTP
|
|
280
|
+
// transport (Node's `http`/`https` modules, the platform `fetch`, etc.) and
|
|
281
|
+
// just want to honour the same "https-only unless EVOMAP_HUB_ALLOW_INSECURE=1"
|
|
282
|
+
// posture hubFetch enforces. Throws synchronously on bad input — match
|
|
283
|
+
// _validateHubUrl's throw semantics so call sites can wrap in try/catch.
|
|
284
|
+
//
|
|
285
|
+
// Use this instead of bare URL/fetch when you cannot route through hubFetch
|
|
286
|
+
// (e.g. the existing src/atp/atpExecute.js and src/atp/hubClient.js paths
|
|
287
|
+
// that use http.request / native fetch directly).
|
|
288
|
+
function enforceHubScheme(url) {
|
|
289
|
+
if (process.env.EVOMAP_HUB_ALLOW_INSECURE === '1') return;
|
|
290
|
+
_validateHubUrl(url);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// async so synchronous validation throws become Promise rejections — every
|
|
294
|
+
// caller already awaits / .then()s the result, and this makes the function
|
|
295
|
+
// behave uniformly for `assert.rejects(...)` in tests.
|
|
296
|
+
async function hubFetch(url, options) {
|
|
297
|
+
if (process.env.EVOMAP_HUB_ALLOW_INSECURE === '1') {
|
|
298
|
+
// Insecure mode is documented as "local dev / mock hub on http:// or
|
|
299
|
+
// self-signed cert". In that mode use the platform fetch — Node's
|
|
300
|
+
// built-in global.fetch is identical engine to undici, but keeping it
|
|
301
|
+
// as the platform lookup lets tests that stub `global.fetch = mockImpl`
|
|
302
|
+
// intercept the call without forking through _setFetchImplForTest. If
|
|
303
|
+
// a test has explicitly installed the seam, honor that — the explicit
|
|
304
|
+
// override wins over the implicit global lookup.
|
|
305
|
+
const insecureFetch = (_fetchImpl !== undiciFetch) ? _fetchImpl : global.fetch;
|
|
306
|
+
return insecureFetch(url, options);
|
|
307
|
+
}
|
|
308
|
+
_validateHubUrl(url);
|
|
309
|
+
// Object.assign last-wins is intentional: a caller-supplied dispatcher
|
|
310
|
+
// would defeat the TLS guard, so we always force ours. No current caller
|
|
311
|
+
// passes one; revisit if that changes.
|
|
312
|
+
const dispatcher = _pickDispatcher(url);
|
|
313
|
+
try {
|
|
314
|
+
return await _fetchImpl(url, Object.assign({}, options, { dispatcher }));
|
|
315
|
+
} catch (err) {
|
|
316
|
+
// On Linux a NetworkManager reconnect, VPN re-establishment, or WiFi
|
|
317
|
+
// hand-off silently invalidates all existing TCP sockets in the undici
|
|
318
|
+
// pool. The kernel surfaces the break as a network-disruption error
|
|
319
|
+
// code on the next read/write. Without drainPool() the next request
|
|
320
|
+
// reuses another dead socket from the same pool and suffers the same
|
|
321
|
+
// error again. Draining here lets the *next* call open a fresh
|
|
322
|
+
// connection immediately without waiting for the heartbeat's normal
|
|
323
|
+
// interval or the drift-detector's 2*interval poke window.
|
|
324
|
+
//
|
|
325
|
+
// We call drainPool() synchronously before re-throwing so the caller's
|
|
326
|
+
// existing error path (heartbeat .catch, poll .catch, etc.) fires as
|
|
327
|
+
// normal -- this is purely a pool-hygiene side-effect, not a retry.
|
|
328
|
+
if (_isNetworkDisruptionError(err)) {
|
|
329
|
+
try {
|
|
330
|
+
drainPool();
|
|
331
|
+
} catch (_) { /* never block the throw on a pool-drain failure */ }
|
|
332
|
+
}
|
|
333
|
+
throw err;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
module.exports = {
|
|
338
|
+
hubFetch,
|
|
339
|
+
drainPool,
|
|
340
|
+
_isNetworkDisruptionError,
|
|
341
|
+
_validateHubUrl,
|
|
342
|
+
enforceHubScheme,
|
|
343
|
+
// For callers that must build their own HTTP transport. The Node
|
|
344
|
+
// native case (`https.request(...)`) needs an Agent pinned to
|
|
345
|
+
// rejectUnauthorized:true so a global `NODE_TLS_REJECT_UNAUTHORIZED=0`
|
|
346
|
+
// cannot weaken the Hub channel; pass `strictHttpsAgent` as
|
|
347
|
+
// `options.agent`. Skip when `EVOMAP_HUB_ALLOW_INSECURE=1`, matching
|
|
348
|
+
// hubFetch's own escape-hatch behaviour.
|
|
349
|
+
//
|
|
350
|
+
// For fetch-based callers do NOT pair a hand-rolled Agent with
|
|
351
|
+
// `global.fetch`: `global.fetch` is backed by Node's *internal*
|
|
352
|
+
// undici, and an Agent from the installed `undici` package crashes
|
|
353
|
+
// it with `UND_ERR_INVALID_ARG: invalid onRequestStart method`
|
|
354
|
+
// (see the warning at the top of this file). Route through
|
|
355
|
+
// `hubFetch()` itself instead — it already applies the dispatcher
|
|
356
|
+
// from the right undici copy.
|
|
357
|
+
strictHttpsAgent: _strictHttpsAgent,
|
|
358
|
+
_setFetchImplForTest,
|
|
359
|
+
};
|