@wowok/wowok 3.1.0 → 3.1.2
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/dist/esm/{arb-DfwGgOuj.mjs → arb-B14RyFnl.mjs} +1 -1
- package/dist/esm/bcs/index.d.mts +1 -1
- package/dist/esm/{call-Bi3kQ2dz.mjs → call-CfhUYfeY.mjs} +1 -1
- package/dist/esm/client/index.d.mts +1 -1
- package/dist/esm/client/index.mjs +1 -1
- package/dist/esm/client-BzcnDuHx.mjs +1 -0
- package/dist/esm/{common-DC9BAaSg.mjs → common-CWx5RgBw.mjs} +1 -1
- package/dist/esm/cryptography/index.d.mts +1 -1
- package/dist/esm/{exception-D2n4LV8F.mjs → exception-CSVNDnxf.mjs} +1 -1
- package/dist/esm/{fund-approval-D9vwQz49.mjs → fund-approval-6jgGhYPs.mjs} +1 -1
- package/dist/esm/graphql/index.d.mts +1 -1
- package/dist/esm/graphql/index.mjs +1 -1
- package/dist/esm/{graphql-6uRIEz97.mjs → graphql-BgUdJroE.mjs} +1 -1
- package/dist/esm/grpc/index.d.mts +1 -1
- package/dist/esm/grpc/index.mjs +1 -1
- package/dist/esm/{grpc-CuD3bO9t.mjs → grpc-DrPf3iOt.mjs} +1 -1
- package/dist/esm/{index-DKne9Aij.d.mts → index-D9MgIgit.d.mts} +32 -9
- package/dist/esm/{index-B-cxGU73.d.mts → index-o_aMVwsK.d.mts} +6 -6
- package/dist/esm/index.d.mts +3 -3
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/jsonRpc/index.d.mts +1 -1
- package/dist/esm/jsonRpc/index.mjs +1 -1
- package/dist/esm/keypairs/ed25519/index.d.mts +1 -1
- package/dist/esm/keypairs/falcon512/index.d.mts +1 -1
- package/dist/esm/keypairs/passkey/index.d.mts +1 -1
- package/dist/esm/keypairs/secp256k1/index.d.mts +1 -1
- package/dist/esm/keypairs/secp256r1/index.d.mts +1 -1
- package/dist/esm/{messenger-CTktoUW7.mjs → messenger-DHE08OC4.mjs} +1 -1
- package/dist/esm/{messenger-api-DpkUVzX3.mjs → messenger-api-Dkq7-bpv.mjs} +1 -1
- package/dist/esm/multisig/index.d.mts +1 -1
- package/dist/esm/{proof-A-gI-Jbd.mjs → proof-Cx8ZdZg1.mjs} +1 -1
- package/dist/esm/{received-k4hM6HMS.mjs → received-CXVoQR5Q.mjs} +1 -1
- package/dist/esm/{service-D-99KdWk.mjs → service-Ce74bWYK.mjs} +1 -1
- package/dist/esm/transactions/index.d.mts +1 -1
- package/dist/esm/{util-CCMJ8QaZ.mjs → util-DpsaFX5J.mjs} +1 -1
- package/dist/esm/util-jt3Z417T.mjs +1 -0
- package/dist/esm/verify/index.d.mts +1 -1
- package/dist/esm/w/call/allocation.d.mts +1 -1
- package/dist/esm/w/call/allocation.mjs +1 -1
- package/dist/esm/w/call/arbitration.d.mts +1 -1
- package/dist/esm/w/call/arbitration.mjs +1 -1
- package/dist/esm/w/call/base.d.mts +1 -1
- package/dist/esm/w/call/base.mjs +1 -1
- package/dist/esm/w/call/demand.d.mts +1 -1
- package/dist/esm/w/call/demand.mjs +1 -1
- package/dist/esm/w/call/guard.d.mts +1 -1
- package/dist/esm/w/call/guard.mjs +1 -1
- package/dist/esm/w/call/index.d.mts +1 -1
- package/dist/esm/w/call/index.mjs +1 -1
- package/dist/esm/w/call/machine.d.mts +1 -1
- package/dist/esm/w/call/machine.mjs +1 -1
- package/dist/esm/w/call/passport.d.mts +1 -1
- package/dist/esm/w/call/passport.mjs +1 -1
- package/dist/esm/w/call/payment.d.mts +1 -1
- package/dist/esm/w/call/payment.mjs +1 -1
- package/dist/esm/w/call/permission.d.mts +1 -1
- package/dist/esm/w/call/permission.mjs +1 -1
- package/dist/esm/w/call/progress.d.mts +1 -1
- package/dist/esm/w/call/progress.mjs +1 -1
- package/dist/esm/w/call/repository.d.mts +1 -1
- package/dist/esm/w/call/repository.mjs +1 -1
- package/dist/esm/w/call/reward.d.mts +1 -1
- package/dist/esm/w/call/reward.mjs +1 -1
- package/dist/esm/w/call/service.d.mts +1 -1
- package/dist/esm/w/call/service.mjs +1 -1
- package/dist/esm/w/call/treasury.d.mts +1 -1
- package/dist/esm/w/call/treasury.mjs +1 -1
- package/dist/esm/w/common.d.mts +1 -1
- package/dist/esm/w/common.mjs +1 -1
- package/dist/esm/w/index.d.mts +2 -2
- package/dist/esm/w/index.mjs +1 -1
- package/dist/esm/w/local/account.d.mts +1 -1
- package/dist/esm/w/local/account.mjs +1 -1
- package/dist/esm/w/local/evm-account.mjs +1 -1
- package/dist/esm/w/local/fund-approval.mjs +1 -1
- package/dist/esm/w/local/index.d.mts +1 -1
- package/dist/esm/w/local/index.mjs +1 -1
- package/dist/esm/w/local/local.mjs +1 -1
- package/dist/esm/w/local/token.d.mts +1 -1
- package/dist/esm/w/local/token.mjs +1 -1
- package/dist/esm/w/local/wip.mjs +1 -1
- package/dist/esm/w/messenger/attachment.d.mts +1 -1
- package/dist/esm/w/messenger/index.d.mts +1 -1
- package/dist/esm/w/messenger/index.mjs +1 -1
- package/dist/esm/w/messenger/messenger-api.d.mts +1 -1
- package/dist/esm/w/messenger/messenger-api.mjs +1 -1
- package/dist/esm/w/messenger/messenger.d.mts +1 -1
- package/dist/esm/w/messenger/messenger.mjs +1 -1
- package/dist/esm/w/messenger/reply.d.mts +1 -1
- package/dist/esm/w/messenger/storage.d.mts +1 -1
- package/dist/esm/w/messenger/types.d.mts +1 -1
- package/dist/esm/w/messenger/utils.d.mts +1 -1
- package/dist/esm/w/query/index.d.mts +2 -2
- package/dist/esm/w/query/index.mjs +1 -1
- package/dist/esm/w/query/object.d.mts +1 -1
- package/dist/esm/w/query/object.mjs +1 -1
- package/dist/esm/{w-DBP-lq8H.mjs → w-CbdAw-mH.mjs} +1 -1
- package/package.json +1 -1
- package/dist/esm/client-BMMGbUOY.mjs +0 -1
- package/dist/esm/util-BKGG0lou.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as a34a}from'./exception-D2n4LV8F.mjs';import'./network-UpRYD8EM.mjs';import{ct as a34b}from'./common-DC9BAaSg.mjs';import{getWowokWorkspaceDir}from'./w/local/util.mjs';import{LocalMark}from'./w/local/local.mjs';import{r as a34c}from'./logger-Da7dKX2V.mjs';import{Account}from'./w/local/account.mjs';import{Bn as a34d,Et as a34e,Rn as a34f,Vn as a34g,h as a34h,jn as a34i,p as a34j,zn as a34k}from'./util-CCMJ8QaZ.mjs';import{MessageStorage,MessengerPersistStorage}from'./w/messenger/storage.mjs';import{DEFAULT_MESSENGER_CONFIG,MAX_QUERY_LIMIT,MessengerError,WTS_SCHEMA_URL}from'./w/messenger/types.mjs';import{t as a34l}from'./messenger-CTktoUW7.mjs';import{generateNonce,hashPlaintext,verifyFalcon512Signature,verifySingleMerkleRoot}from'./w/messenger/crypto.mjs';import{parseReplyPlaintext}from'./w/messenger/reply.mjs';import{parseAttachmentEnvelope,presentMessageForRead,presentMessagesForRead,sanitizeFileName}from'./w/messenger/attachment.mjs';import{canonicalizeJson,messagePreviewText}from'./w/messenger/utils.mjs';import*as a34m from'path';import*as a34n from'fs';import{createHash}from'crypto';const logger$1=a34c('messenger:manager'),MAX_ACCOUNTS=0x14,sleep=a=>new Promise(b=>setTimeout(b,a)),MESSENGER_INIT_SPACING_MS=0x3e8;var MessengerManager=class{constructor(a){this['accounts']=new Map(),this['messageListeners']=new Set(),this['isWatching']=![],this['accountRefreshTimer']=null,this['pollingLockedAccounts']=new Set(),this['emergencyAccounts']=new Set(),this['lastInitCompletedAt']=0x0,this['config']={...DEFAULT_MESSENGER_CONFIG,...a?.['messengerConfig']},this['instanceId']=a?.['instanceId']||'default',this['persistStorage']=new MessengerPersistStorage();}['findAccount'](a){return this['accounts']['get'](a['toLowerCase']());}['getConfig'](){return this['config'];}['get_accounts'](){return Array['from'](this['accounts']['values']())['map'](a=>a['address']);}async['pullAllAccounts'](a){const b=a?.['accounts']?.['length']?new Set(a['accounts']['map'](j=>j['toLowerCase']())):void 0x0,c=[];if(b)for(const j of b){if(this['pollingLockedAccounts']['has'](j))continue;try{await this['ensureAccountReady'](j);}catch(k){c['push']({'account':j,'pulled':0x0,'messages':[],'error':k instanceof Error?k['message']:String(k)});}}const d=[...this['pollingLockedAccounts']]['filter'](l=>!b||b['has'](l)),e=new Set(c['map'](l=>l['account'])),f=Math['max'](0x1,a?.['concurrency']??0x5),g=[...c];let h=0x0;const i=async()=>{while(h<d['length']){const l=d[h++];if(e['has'](l))continue;const m=this['accounts']['get'](l);if(!m?.['initialized']){g['push']({'account':l,'pulled':0x0,'messages':[],'error':'Account\x20is\x20not\x20initialized\x20in\x20this\x20process'});continue;}try{const n=await m['messenger']['pullMessages'](a?.['limit']),o=new MessageStorage(l),p=n['messages']['map'](q=>{return presentMessageForRead(o['getMessageById'](q['id'])??q);});g['push']({'account':l,'pulled':p['length'],'messages':p});}catch(q){g['push']({'account':l,'pulled':0x0,'messages':[],'error':q instanceof Error?q['message']:String(q)});}}};return await Promise['all'](Array['from']({'length':Math['min'](f,d['length'])},()=>i())),g['sort']((l,m)=>l['account']['localeCompare'](m['account'])),g;}async['refresh_accounts'](){const {Account:a}=await import('./w/local/account.mjs'),b=await a['Instance']()['list_messenger_accounts'](),c=new Set(this['accounts']['keys']()),d=new Set(b['map'](e=>e['address']['toLowerCase']()));for(const e of c)if(!d['has'](e))this['remove_account_internal'](e);for(const f of b){const g=f['address']['toLowerCase']();if(!this['accounts']['has'](g))try{await this['add_account_internal'](f['address']);}catch(h){}}if(this['accounts']['size']>0x0&&!this['isWatching'])this['startPolling']();else{if(this['accounts']['size']===0x0&&this['isWatching'])this['stopPolling']();}await this['syncAllContactLists']();}async['start'](){await this['refresh_accounts']();for(const a of this['accounts']['values']()){if(!a['initialized']||!a['messenger'])continue;this['persistStorage']['tryAcquirePollingLock'](a['address'],this['instanceId'])&&(this['pollingLockedAccounts']['add'](a['address']['toLowerCase']()),a['messenger']['setOnMessageCallback'](b=>{for(const c of this['messageListeners'])c(b);}));}if(!this['isWatching'])this['startPolling']();if(this['accountRefreshTimer'])clearInterval(this['accountRefreshTimer']);this['accountRefreshTimer']=setInterval(()=>{this['refresh_accounts']()['catch'](b=>{});},this['config']['watch_interval_ms']);}['stop'](){this['accountRefreshTimer']&&(clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=null);for(const a of this['pollingLockedAccounts'])this['persistStorage']['releasePollingLock'](a,this['instanceId']);this['pollingLockedAccounts']['clear'](),this['stopPolling'](),this['clear_accounts']();}async['ensureAccountReady'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c?.['initialized'])return c;if(c?.['initializing']){await c['initializing'];const d=this['accounts']['get'](b);if(d?.['initialized'])return d;throw new MessengerError('SERVER_ERROR','Account\x20'+a+'\x20initialization\x20failed');}return this['initializeAccount'](b);}async['isPeerRegistered'](a,b){const {Account:c}=await import('./w/local/account.mjs'),d=await c['Instance']()['get'](a,![]);if(!d)throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20'+a+'\x20not\x20found');if(!d['messenger'])throw new MessengerError('ACCOUNT_MESSENGER_NOT_ENABLED','Account\x20'+a+'\x20messenger\x20not\x20enabled');return(await this['ensureAccountReady'](a))['messenger']['isPeerRegistered'](b);}async['setEmergencyAccounts'](a){const b=new Set((a??[])['map'](f=>f['toLowerCase']())),c=[],d=[];for(const f of b){if(this['emergencyAccounts']['has'](f))continue;try{(await this['ensureAccountReady'](f))['messenger']['triggerEmergencyPull'](),this['emergencyAccounts']['add'](f),c['push'](f);}catch(g){logger$1['error']('Emergency\x20arm\x20failed\x20for\x20account\x20'+f+':',g),d['push']({'account':f,'error':g instanceof Error?g['message']:String(g)});}}const e=[];for(const h of[...this['emergencyAccounts']]){if(b['has'](h))continue;this['accounts']['get'](h)?.['messenger']['stopEmergencyPull'](),this['emergencyAccounts']['delete'](h),e['push'](h);}return{'active':[...this['emergencyAccounts']]['sort'](),'added':c,'removed':e,'failed':d};}async['initializeAccount'](a){const b=a['toLowerCase']();if(this['accounts']['size']>=MAX_ACCOUNTS)throw new MessengerError('INVALID_INPUT','Maximum\x20'+MAX_ACCOUNTS+'\x20accounts\x20allowed');const c=this['doInitialize'](b),d={'address':b,'messenger':null,'initialized':![],'initializing':c,'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}};this['accounts']['set'](b,d);try{await c;const e=this['accounts']['get'](b);if(!e||!e['initialized'])throw new MessengerError('SERVER_ERROR','Account\x20'+a+'\x20initialization\x20failed');return e;}catch(f){this['accounts']['delete'](b);throw f;}}async['doInitialize'](a){const b=new a34l(a,this['config']);try{await b['initialize']();}catch(d){throw new MessengerError('SERVER_ERROR','Failed\x20to\x20initialize\x20account\x20'+a+':\x20'+(d instanceof Error?d['message']:String(d)));}const c=Date['now']()-this['lastInitCompletedAt'];if(c<MESSENGER_INIT_SPACING_MS)await sleep(MESSENGER_INIT_SPACING_MS-c);this['lastInitCompletedAt']=Date['now'](),this['accounts']['set'](a,{'address':a,'messenger':b,'initialized':!![],'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}});this['isWatching']&&(this['persistStorage']['tryAcquirePollingLock'](a,this['instanceId'])&&(this['pollingLockedAccounts']['add'](a),b['setOnMessageCallback'](e=>{for(const f of this['messageListeners'])f(e);})));if(this['emergencyAccounts']['has'](a))b['triggerEmergencyPull']();}async['add_account_internal'](a){await this['ensureAccountReady'](a);}['remove_account_internal'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(!c)return![];if(c['initialized']&&c['messenger'])c['messenger']['disconnect']();return this['persistStorage']['releasePollingLock'](b,this['instanceId']),this['pollingLockedAccounts']['delete'](b),this['emergencyAccounts']['delete'](b),this['accounts']['delete'](b);}['clear_accounts'](){this['stopPolling']();for(const a of this['accounts']['values']())if(a['messenger'])a['messenger']['disconnect']();this['accounts']['clear'](),this['emergencyAccounts']['clear']();}async['send'](a,b,c,d){const {Account:e}=await import('./w/local/account.mjs'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20'+a+'\x20not\x20found');if(!f['messenger']){if(!d?.['enable_messenger'])throw new MessengerError('ACCOUNT_MESSENGER_NOT_ENABLED','Account\x20messenger\x20not\x20enabled.\x20Use\x20enable_messenger\x20parameter\x20to\x20enable\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,!![]);}const g=await this['ensureAccountReady'](a);try{return await g['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force'],'network':d?.['network'],'replyTo':d?.['replyTo']});}catch(h){if(h instanceof MessengerError&&h['code']==='IDENTITY_NOT_FOUND'){const i=h['message']||'',j=a['toLowerCase'](),k=b['toLowerCase'](),l=i['toLowerCase']()['includes'](j);if((i['toLowerCase']()['includes'](k)||i['toLowerCase']()['includes']('recipient')||i['toLowerCase']()['includes']('no\x20signed\x20prekey'))&&!l)throw new MessengerError('IDENTITY_NOT_FOUND','Recipient\x20'+b+'\x20is\x20not\x20registered\x20on\x20the\x20messenger\x20server.\x20Please\x20ask\x20them\x20to\x20enable\x20messenger\x20first.');logger$1['info']('Sender\x20'+a+'\x20not\x20found\x20on\x20server,\x20re-registering...'),await this['reinitializeAccount'](a);const m=this['accounts']['get'](a['toLowerCase']());if(m?.['initialized'])return await m['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force'],'network':d?.['network'],'replyTo':d?.['replyTo']});}throw h;}}async['reinitializeAccount'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c){if(c['messenger'])c['messenger']['disconnect']();this['accounts']['delete'](b);}await this['initializeAccount'](b);}async['send_file'](a,b,c,d){const {Account:e}=await import('./w/local/account.mjs'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20'+a+'\x20not\x20found');if(!f['messenger']){if(!d?.['enable_messenger'])throw new MessengerError('ACCOUNT_MESSENGER_NOT_ENABLED','Account\x20messenger\x20not\x20enabled.\x20Use\x20enable_messenger\x20parameter\x20to\x20enable\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,!![]);}const g=await this['ensureAccountReady'](a),h={'fileName':d?.['fileName'],'contentType':d?.['contentType'],'kind':d?.['kind'],'mimeType':d?.['mimeType'],'caption':d?.['caption'],'durationMs':d?.['durationMs'],'width':d?.['width'],'height':d?.['height'],'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force'],'network':d?.['network']};try{return await g['messenger']['sendZipFile'](b,c,h);}catch(i){if(i instanceof MessengerError&&i['code']==='IDENTITY_NOT_FOUND'){const j=i['message']||'',k=a['toLowerCase'](),l=b['toLowerCase'](),m=j['toLowerCase']()['includes'](k);if((j['toLowerCase']()['includes'](l)||j['toLowerCase']()['includes']('recipient')||j['toLowerCase']()['includes']('no\x20signed\x20prekey'))&&!m)throw new MessengerError('IDENTITY_NOT_FOUND','Recipient\x20'+b+'\x20is\x20not\x20registered\x20on\x20the\x20messenger\x20server.\x20Please\x20ask\x20them\x20to\x20enable\x20messenger\x20first.');logger$1['info']('Sender\x20'+a+'\x20not\x20found\x20on\x20server,\x20re-registering...'),await this['reinitializeAccount'](a);const n=this['accounts']['get'](a['toLowerCase']());if(n?.['initialized'])return await n['messenger']['sendZipFile'](b,c,h);}throw i;}}async['queryMessages'](a){let b=[];const c=a?.['peerAddress']!==void 0x0?await a34j(a['peerAddress']):void 0x0;if(a?.['account']!==void 0x0){const f=a['account']['toLowerCase'](),g=this['accounts']['get'](f);if(g?.['messenger']){const k=g['messenger']['pullMessages']();if(a?.['sync']!==![])await k;else k['catch'](()=>{});}const h=new MessageStorage(f),i=a['beforeCreatedAt']!==void 0x0&&a['beforeMessageId']?{'createdAt':a['beforeCreatedAt'],'messageId':a['beforeMessageId']}:void 0x0,j=c!==void 0x0&&a['limit']!==void 0x0&&a['offset']===void 0x0&&(a['beforeCreatedAt']===void 0x0||a['beforeMessageId']!==void 0x0&&i!==void 0x0);if(c&&j)b=h['getRecentMessagesBySession'](f,c,a['limit'],i);else{if(c)b=h['getMessagesBySession'](f,c);else b=h['getAllMessages'](f);}}else for(const l of this['accounts']['values']()){if(l['messenger']){const n=l['messenger']['pullMessages']();if(a?.['sync']!==![])await n;else n['catch'](()=>{});}const m=new MessageStorage(l['address']);if(c){const o=m['getMessagesBySession'](l['address'],c);b['push'](...o);}else{const p=m['getAllMessages'](l['address']);b['push'](...p);}}if(a){const q=c;b=b['filter'](r=>{const s=a?.['account']!==void 0x0?a['account']['toLowerCase']():void 0x0;if(s!==void 0x0){const u=r['fromAddress']['toLowerCase'](),v=r['toAddress']['toLowerCase']();if(u!==s&&v!==s)return![];}if(a['direction']&&r['direction']!==a['direction'])return![];if(a['status']&&r['status']!==a['status'])return![];if(a['msgType']!==void 0x0&&r['msgType']!==a['msgType'])return![];if(a['contentType'])switch(a['contentType']){case'text':if(r['msgType']!==0x1)return![];break;case'zip':if(!r['zipMetadata'])return![];break;case'wts':if(!r['zipMetadata']||r['zipMetadata']?.['contentType']!=='wts')return![];break;case'wip':if(!r['zipMetadata']||r['zipMetadata']?.['contentType']!=='wip')return![];break;}if(a['peerAddress']&&q){const w=q['toLowerCase'](),x=r['fromAddress']['toLowerCase'](),y=r['toAddress']['toLowerCase']();if(s!==void 0x0&&w===s){if(x!==s||y!==s)return![];}else{if(s!==void 0x0&&!(x===s&&y===w||x===w&&y===s))return![];else{if(s===void 0x0&&x!==w&&y!==w)return![];}}}const t=a['timeField']||'createdAt';if(a['startTime']!==void 0x0||a['endTime']!==void 0x0){const z=r[t];if(z!==void 0x0){if(a['startTime']!==void 0x0&&z<a['startTime'])return![];if(a['endTime']!==void 0x0&&z>a['endTime'])return![];}}if(a['createdAtStart']!==void 0x0&&r['createdAt']<a['createdAtStart'])return![];if(a['createdAtEnd']!==void 0x0&&r['createdAt']>a['createdAtEnd'])return![];if(a['receivedAtStart']!==void 0x0){if(r['receivedAt']===void 0x0||r['receivedAt']<a['receivedAtStart'])return![];}if(a['receivedAtEnd']!==void 0x0){if(r['receivedAt']===void 0x0||r['receivedAt']>a['receivedAtEnd'])return![];}if(a['serverTimestampStart']!==void 0x0){if(r['serverTimestamp']===void 0x0||r['serverTimestamp']<a['serverTimestampStart'])return![];}if(a['serverTimestampEnd']!==void 0x0){if(r['serverTimestamp']===void 0x0||r['serverTimestamp']>a['serverTimestampEnd'])return![];}if(a['decryptedOnly']&&!r['plaintext'])return![];if(a['confirmedOnly']&&r['status']!=='confirmed')return![];if(a['arkConfirmedOnly']){if(!r['arkConfirmed'])return![];}if(a['proofedOnly']){if(!r['proof'])return![];}if(a['arkTimestampStart']!==void 0x0){if(r['arkConfirmed']===void 0x0||r['arkConfirmed']['timestamp']<a['arkTimestampStart'])return![];}if(a['arkTimestampEnd']!==void 0x0){if(r['arkConfirmed']===void 0x0||r['arkConfirmed']['timestamp']>a['arkTimestampEnd'])return![];}if(a['hasLastReceivedIndexOnly']){if(r['lastReceivedLeafIndex']===void 0x0||r['lastReceivedLeafIndex']===null)return![];}if(a['lastReceivedIndexMin']!==void 0x0){if(r['lastReceivedLeafIndex']===void 0x0||r['lastReceivedLeafIndex']<a['lastReceivedIndexMin'])return![];}if(a['lastReceivedIndexMax']!==void 0x0){if(r['lastReceivedLeafIndex']===void 0x0||r['lastReceivedLeafIndex']>a['lastReceivedIndexMax'])return![];}if(a['keyword']&&r['plaintext']){if(!r['plaintext']['toLowerCase']()['includes'](a['keyword']['toLowerCase']()))return![];}if(a['listFilterMode']&&a['listFilterMode']!=='any'){const A=this['findAccount'](r['toAddress']);if(!A)return![];const B=r['fromAddress']['toLowerCase'](),C=A['contactLists'],D=new Set(C['friends']['map'](I=>I['toLowerCase']())),E=new Set(C['guards']['map'](I=>I['guardAddress']['toLowerCase']())),F=D['has'](B),G=E['has'](B),H=!F&&!G;switch(a['listFilterMode']){case'friends':if(!F)return![];break;case'guard':if(!G)return![];break;case'stranger':if(!H)return![];break;}if(a['customListFilter']){const {includeAddresses:I,excludeAddresses:J,relation:relation='union'}=a['customListFilter'];if(J){if(new Set(J['map'](K=>K['toLowerCase']()))['has'](B))return![];}if(I&&I['length']>0x0){const K=new Set(I['map'](L=>L['toLowerCase']()))['has'](B);if(relation==='union'){const L=a['listFilterMode']==='friends'&&F||a['listFilterMode']==='guard'&&G||a['listFilterMode']==='stranger'&&H;if(!K&&!L)return![];}else{if(!K)return![];}}}}if(a['viewed']!==void 0x0){const M=r['viewedAt']!==void 0x0;if(a['viewed']!==M)return![];}if(a['viewedAtStart']!==void 0x0){if(r['viewedAt']===void 0x0||r['viewedAt']<a['viewedAtStart'])return![];}if(a['viewedAtEnd']!==void 0x0){if(r['viewedAt']===void 0x0||r['viewedAt']>a['viewedAtEnd'])return![];}return!![];});}const d=a?.['sortOrder']??'desc',e=a?.['timeField']||'createdAt';b['sort']((r,s)=>{const t=r[e]||0x0,u=s[e]||0x0;return d==='asc'?t-u:u-t;});if(b['some'](r=>r['plaintext']!==void 0x0||r['zipMetadata']))b=presentMessagesForRead(b,{'includeAttachmentPayload':a?.['includeAttachmentPayload']});return b;}async['watch'](a){const b=await this['queryMessages'](a),c=this['config']['defaultQueryLimit']??0x32,d=Math['min'](a?.['limit']??c,MAX_QUERY_LIMIT),e=a?.['offset']??0x0;return b['slice'](e,e+d);}['startPolling'](){if(this['isWatching'])return;this['isWatching']=!![];}['stopPolling'](){this['isWatching']=![];}['onMessage'](a){this['messageListeners']['add'](a);}['offMessage'](a){this['messageListeners']['delete'](a);}['destroy'](){this['stop'](),this['messageListeners']['clear']();}async['syncContactLists'](a){const b=this['findAccount'](a);if(!b)return{'success':![],'friends':[],'guards':[],'error':'Account\x20not\x20found:\x20'+a};try{const [c,d]=await Promise['all']([b['messenger']['getFriendsList'](),b['messenger']['getGuardList']()]),e=d['currentGuardList']||[];return b['contactLists']={'friends':c,'guards':e,'lastUpdatedAt':Date['now']()},{'success':!![],'friends':c,'guards':e};}catch(f){return{'success':![],'friends':b['contactLists']['friends'],'guards':b['contactLists']['guards'],'error':f instanceof Error?f['message']:String(f)};}}async['syncAllContactLists'](){const a=new Map();for(const b of this['accounts']['values']()){const c=await this['syncContactLists'](b['address']);a['set'](b['address'],c);}return a;}['getContactLists'](a){return this['findAccount'](a)?.['contactLists'];}['setContactLists'](a,b){const c=this['findAccount'](a);if(!c)return![];return c['contactLists']={...c['contactLists'],...b,'lastUpdatedAt':Date['now']()},!![];}['isStranger'](a,b){const c=this['findAccount'](a);if(!c)return!![];const d=b['toLowerCase'](),e=c['contactLists'],f=e['friends']['some'](h=>h['toLowerCase']()===d),g=e['guards']['some'](h=>h['guardAddress']['toLowerCase']()===d);return!f&&!g;}['recordGuardSender'](a,b){const c=this['findAccount'](a);if(!c)return![];const d=b['toLowerCase']();return!c['contactLists']['guards']['some'](e=>e['guardAddress']['toLowerCase']()===d)&&(c['contactLists']['guards']['push']({'guardAddress':b,'passportValiditySeconds':0x15180}),c['contactLists']['lastUpdatedAt']=Date['now']()),!![];}['generateNonce'](){return generateNonce();}async['watch_paginated'](a){const b=await this['queryMessages'](a),c=this['config']['defaultQueryLimit']??0x32,d=Math['min'](a?.['limit']??c,MAX_QUERY_LIMIT),e=a?.['offset']??0x0;return{'messages':b['slice'](e,e+d),'total':b['length'],'offset':e,'limit':d};}async['get_conversations'](a){const b=a?{'account':a}:void 0x0,c=await this['queryMessages'](b),d=new Map();for(const e of c){const f=e['fromAddress']['toLowerCase'](),g=e['toAddress']['toLowerCase'](),h=a?.['toLowerCase'](),i=h!==void 0x0?h:this['findAccount'](e['fromAddress'])?f:this['findAccount'](e['toAddress'])?g:void 0x0;if(i===void 0x0)continue;const j=f===i?e['toAddress']:e['fromAddress'];if(!d['has'](j))d['set'](j,{'peerAddress':j,'lastMessageAt':e['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':messagePreviewText(e)});const k=d['get'](j);k['messageCount']++;e['createdAt']>k['lastMessageAt']&&(k['lastMessageAt']=e['createdAt'],k['lastMessagePreview']=messagePreviewText(e));if(e['status']!=='read'&&g===i)k['unreadCount']++;}return Array['from'](d['values']())['sort']((l,m)=>m['lastMessageAt']-l['lastMessageAt']);}async['generate_wts'](a,b,c,d,e){const f=await import('fs'),g=await import('path'),h=b['toLowerCase'](),k=c['toLowerCase']();let l=new MessageStorage(h)['getMessagesBySession'](h,k)['filter'](u=>u['leafIndex']!==void 0x0&&u['serverTimestamp']!==void 0x0)['sort']((u,v)=>{const w=u['serverTimestamp']-v['serverTimestamp'];if(w!==0x0)return w;return u['leafIndex']-v['leafIndex'];});if(d)switch(d['type']){case'time':{const u=Math['min'](d['start'],d['end']),v=Math['max'](d['start'],d['end']);l=l['filter'](w=>w['createdAt']>=u&&w['createdAt']<=v);break;}case'messageId':{const w=l['findIndex'](A=>A['messageId']===d['start']),x=l['findIndex'](A=>A['messageId']===d['end']);if(w===-0x1||x===-0x1)throw new MessengerError('INVALID_INPUT','Range\x20endpoint\x20not\x20found\x20in\x20this\x20conversation:\x20'+(w===-0x1?d['start']:d['end']));const y=Math['min'](w,x),z=Math['max'](w,x);l=l['slice'](y,z+0x1);break;}case'seqIndex':{const A=Math['min'](d['start'],d['end']),B=Math['max'](d['start'],d['end']);l=l['filter'](C=>C['leafIndex']>=A&&C['leafIndex']<=B);break;}}if(l['length']===0x0)throw new MessengerError('INVALID_INPUT','No\x20messages\x20found\x20for\x20the\x20given\x20criteria');const m=l['map'](C=>C['leafIndex'])['filter'](C=>C!==void 0x0)['sort']((C,D)=>C-D),n=[];for(let C=0x1;C<m['length'];C++){const D=m[C-0x1]+0x1,E=m[C];if(E!==D){for(let F=D;F<E;F++)n['push'](F);}}if(n['length']>0x0){}if(l['length']>0x1f4)throw new MessengerError('INVALID_INPUT','Message\x20count\x20('+l['length']+')\x20exceeds\x20maximum\x20allowed\x20(500)');if(!f['existsSync'](a))f['mkdirSync'](a,{'recursive':!![]});const o=h['slice'](0x0,0x6)+'_'+k['slice'](0x0,0x6),p=[];let q=[];for(let G=0x0;G<l['length'];G++){const H=l[G];if(q['length']===0x0)q['push'](H);else{const I=q[q['length']-0x1]['leafIndex']+0x1;if(q['length']>=0x1f4||H['leafIndex']!==I)p['push'](q),q=[H];else q['push'](H);}}if(q['length']>0x0)p['push'](q);p['forEach']((J,K)=>{J['map'](L=>L['leafIndex'])['join'](',\x20');});const r=[];for(const J of p){const K=J['map'](a2=>a2['leafIndex'])['filter'](a2=>a2!==void 0x0),L=Math['min'](...K),M=Math['max'](...K),N=J[0x0]['createdAt'],O=J[J['length']-0x1]['createdAt'];for(const a2 of J){if(a2['serverTimestamp']===void 0x0)throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20serverTimestamp');if(a2['leafIndex']===void 0x0)throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20leafIndex');if(!a2['prevRoot'])throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20prevRoot');if(!a2['newRoot'])throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20newRoot');if(!a2['serverSignature'])throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20serverSignature');}const P=J['map'](a3=>{const a4={'id':a3['messageId'],'from':a3['fromAddress'],'to':a3['toAddress'],'plaintextHash':a3['plaintextHash'],'clientTimestamp':a3['createdAt'],'timestamp':a3['serverTimestamp'],'leafIndex':a3['leafIndex'],'prevRoot':a3['prevRoot'],'merkleRoot':a3['newRoot'],'serverSignature':a3['serverSignature'],'serverPublicKeyIndex':0x0,'msgType':a3['msgType']};if(!e&&a3['plaintext']!==void 0x0)a4['plaintext']=a3['plaintext'];if(a3['guardAddress']!==void 0x0)a4['guardAddress']=a3['guardAddress'];if(a3['passportAddress']!==void 0x0)a4['passportAddress']=a3['passportAddress'];if(a3['arkConfirmed']!==void 0x0)a4['arkConfirmed']={'recipient':a3['arkConfirmed']['recipient'],'recipientPublicKey':a3['arkConfirmed']['recipientPublicKey'],'signature':a3['arkConfirmed']['signature'],'timestamp':a3['arkConfirmed']['timestamp']};if(a3['zipMetadata']!==void 0x0)a4['zipMetadata']=a3['zipMetadata'];if(a3['lastReceivedLeafIndex']!==void 0x0&&a3['lastReceivedLeafIndex']!==-0x1)a4['lastReceivedLeafIndex']=a3['lastReceivedLeafIndex'];return a4;}),Q=[h,k]['sort'](),R={'id':o+'_'+L+'-'+M,'participants':Q},S=[],T=new Map();for(const a3 of P){const a4=J['find'](a6=>a6['messageId']===a3['id'])?.['serverPublicKey']||'';if(!a4)continue;let a5=T['get'](a4);a5===void 0x0&&(a5=S['length'],T['set'](a4,a5),S['push']({'publicKey':a4,'validFrom':0x0})),a3['serverPublicKeyIndex']=a5;}const U={'session':R,'messages':P},{sha256:V}=await import('@noble/hashes/sha2.js'),{bytesToHex:W}=await import('@noble/hashes/utils.js'),X={'wts':WTS_SCHEMA_URL,...U},Y=W(V(new TextEncoder()['encode'](canonicalizeJson(X)))),Z={'wts':WTS_SCHEMA_URL,'payload':U,'meta':{'type':'wts','version':'1.0','created':new Date()['toISOString'](),'hash':Y,'algorithm':'sha256','startTime':N,'endTime':O,'messageCount':P['length'],'merkleRoot':P[P['length']-0x1]['merkleRoot'],'creator':h,'participant':k,'serverPublicKeys':S}},a0=o+'_'+L+'-'+M+'.wts',a1=g['join'](a,a0);f['writeFileSync'](a1,JSON['stringify'](Z,null,0x2)),r['push'](a1);}const s=l[0x0]?.['createdAt']||0x0,t=l[l['length']-0x1]?.['createdAt']||0x0;return{'files':r,'totalMessageCount':l['length'],'timeRange':{'start':s,'end':t}};}async['addToBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToBlacklist'](b);}async['removeFromBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromBlacklist'](b);}async['clearBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearBlacklist']();}async['getBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getBlacklist']();}async['existInBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInBlacklist'](b);}async['addToFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToFriendsList'](b);}async['removeFromFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromFriendsList'](b);}async['clearFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearFriendsList']();}async['getFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getFriendsList']();}async['existInFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInFriendsList'](b);}async['addToGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToGuardList'](b);}async['removeFromGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromGuardList'](b);}async['getGuardList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getGuardList']();}async['getSettings'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getSettings']();}async['setSettings'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['setSettings'](b);}};const GUARD_NETWORK='mainnet';async function lookupGuardRequirements(a,b){try{const c=await a34i({'account':a,'network':GUARD_NETWORK},b);return{'required':new Set(c['submission']['filter'](d=>(d['submission']?.['length']??0x0)>0x0)['map'](d=>String(d['guard'])['toLowerCase']())),'raw':c['submission']};}catch{return;}}function pickReusableGuard(a,b,c){const d=new Set(b['map'](f=>f['toLowerCase']())),e=new Set((a['submissionGuards']??[])['map'](f=>f['toLowerCase']()));for(const f of a['guards'])if(d['has'](f)&&!c['has'](f))return f;for(const h of a['guards'])if(d['has'](h)&&e['has'](h))return h;}async function smartSendResolve(a,b,c,d){const e=await lookupGuardRequirements(a,b),{passport:f,stale:g}=a34d(a,GUARD_NETWORK,b);if(f){if(e){const h=pickReusableGuard(f,b,e['required']);if(h)return{'kind':'resend','guardAddress':h,'passportAddress':f['id'],'network':GUARD_NETWORK};a34g(a['toLowerCase'](),f['id']);}}if(d['authorize']){const i={'account':a,'network':GUARD_NETWORK},j=e?e['raw']:(await a34i(i,b))['submission'];if(j['length']>0x0)return{'kind':'auth_required','result':buildGuardAuthRequired(b,GUARD_NETWORK,'no_local_passport',void 0x0,j)};const k=a34k(await a34f(i,{'type':'submission','guard':b['map'](l=>({'object':l,'impack':!![]})),'submission':[]}));if(!k)throw new Error('Passport\x20transaction\x20succeeded\x20but\x20the\x20created\x20Passport\x20object\x20could\x20not\x20be\x20resolved\x20from\x20objectChanges');return{'kind':'resend','guardAddress':b[0x0],'passportAddress':k,'network':GUARD_NETWORK};}return{'kind':'auth_required','result':buildGuardAuthRequired(b,GUARD_NETWORK,g?'local_passport_stale':'no_local_passport',void 0x0,e?.['raw'])};}function buildGuardAuthRequired(a,b,c,d,e){return{'authRequired':!![],'status':'guard_authorization_required','guardList':a,'network':b,'reason':c,'hint':'This\x20recipient\x20accepts\x20non-friend\x20messages\x20only\x20through\x20guard\x20verification\x20—\x20no\x20free\x20stranger\x20quota\x20while\x20guards\x20are\x20configured.\x20Authorize\x20to\x20obtain\x20a\x20Passport\x20via\x20their\x20guard\x20(one\x20gas-consuming\x20transaction)\x20and\x20the\x20message\x20is\x20resent\x20automatically.\x20Once\x20the\x20recipient\x20replies,\x20they\x20are\x20added\x20as\x20a\x20friend\x20and\x20future\x20messages\x20need\x20no\x20verification.','serverError':d,'submissions':e};}function escapeHtml(a){if(!a)return'';return a['replace'](/&/g,'&')['replace'](/</g,'<')['replace'](/>/g,'>')['replace'](/"/g,'"')['replace'](/'/g,''');}function formatFileSize(a){if(a<0x400)return a+'\x20B';if(a<0x400*0x400)return(a/0x400)['toFixed'](0x1)+'\x20KB';return(a/(0x400*0x400))['toFixed'](0x1)+'\x20MB';}function isNonTextMessage(a){return!!a['zipMetadata'];}function getFileTypeLabel(a){if(a['zipMetadata']?.['contentType'])return a['zipMetadata']['contentType']['toUpperCase']();const b=a['zipMetadata']?.['fileName']||'';if(b['endsWith']('.wts'))return'WTS';if(b['endsWith']('.wip'))return'WIP';if(b['endsWith']('.zip'))return'ZIP';if(b['endsWith']('.json'))return'JSON';if(b['endsWith']('.txt'))return'TXT';if(a['zipMetadata'])return'ZIP';return'FILE';}function getThemeColors(a){return{'bgColor':a==='dark'?'#1a1a1a':'#ffffff','textColor':a==='dark'?'#e0e0e0':'#333333','borderColor':a==='dark'?'#444444':'#e0e0e0'};}function getMessageColors(a,b){if(b)return{'bgColor':a==='dark'?'#1a365d':'#e3f2fd','borderColor':a==='dark'?'#3b82f6':'#90caf9'};else return{'bgColor':a==='dark'?'#1e3a2f':'#e8f5e9','borderColor':a==='dark'?'#10b981':'#a5d6a7'};}function generateFileButton(a,b,c){if(!a['plaintext']||!a['zipMetadata']?.['fileName'])return'';const d=a['zipMetadata']['fileName'],e=a['plaintext'],f=a['zipMetadata']['fileSize']||0x0,g=getFileTypeLabel(a),h=c==='dark'?'#2a3f2a':'#e8f5e9',i=c==='dark'?'#4caf50':'#4caf50',j=c==='dark'?'#81c784':'#2e7d32',k='#4caf50';return'\x0a\x09\x09<div\x20style=\x22margin:\x2012px\x200;\x20padding:\x2016px;\x20background:\x20'+h+';\x20border:\x201px\x20solid\x20'+i+';\x20border-radius:\x208px;\x20text-align:\x20center;\x22>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2014px;\x20color:\x20'+j+';\x20margin-bottom:\x208px;\x22>\x0a\x09\x09\x09\x09📎\x20'+escapeHtml(g)+'\x20File\x0a\x09\x09\x09\x09<span\x20style=\x22font-size:\x2012px;\x20color:\x20#666;\x22>('+formatFileSize(f)+')</span>\x0a\x09\x09\x09</div>\x0a\x09\x09\x09<button\x20\x0a\x09\x09\x09\x09onclick=\x22saveFile'+b+'()\x22\x0a\x09\x09\x09\x09style=\x22padding:\x2010px\x2024px;\x20background:\x20'+k+';\x20color:\x20white;\x20border:\x20none;\x20border-radius:\x204px;\x20cursor:\x20pointer;\x20font-size:\x2014px;\x22\x0a\x09\x09\x09\x09onmouseover=\x22this.style.background=\x27#45a049\x27\x22\x0a\x09\x09\x09\x09onmouseout=\x22this.style.background=\x27'+k+'\x27\x22\x0a\x09\x09\x09>\x0a\x09\x09\x09\x09💾\x20Save\x20'+escapeHtml(d)+'\x0a\x09\x09\x09</button>\x0a\x09\x09</div>\x0a\x09\x09<script>\x0a\x09\x09\x09function\x20saveFile'+b+'()\x20{\x0a\x09\x09\x09\x09try\x20{\x0a\x09\x09\x09\x09\x09const\x20base64Data\x20=\x20'+JSON['stringify'](e)+';\x0a\x09\x09\x09\x09\x09const\x20byteCharacters\x20=\x20atob(base64Data);\x0a\x09\x09\x09\x09\x09const\x20byteNumbers\x20=\x20new\x20Array(byteCharacters.length);\x0a\x09\x09\x09\x09\x09for\x20(let\x20i\x20=\x200;\x20i\x20<\x20byteCharacters.length;\x20i++)\x20{\x0a\x09\x09\x09\x09\x09\x09byteNumbers[i]\x20=\x20byteCharacters.charCodeAt(i);\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09const\x20byteArray\x20=\x20new\x20Uint8Array(byteNumbers);\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09let\x20mimeType\x20=\x20\x22application/octet-stream\x22;\x0a\x09\x09\x09\x09\x09const\x20fileName\x20=\x20'+JSON['stringify'](d)+';\x0a\x09\x09\x09\x09\x09if\x20(fileName.endsWith(\x27.json\x27))\x20mimeType\x20=\x20\x22application/json\x22;\x0a\x09\x09\x09\x09\x09else\x20if\x20(fileName.endsWith(\x27.zip\x27))\x20mimeType\x20=\x20\x22application/zip\x22;\x0a\x09\x09\x09\x09\x09else\x20if\x20(fileName.endsWith(\x27.txt\x27))\x20mimeType\x20=\x20\x22text/plain\x22;\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09const\x20blob\x20=\x20new\x20Blob([byteArray],\x20{\x20type:\x20mimeType\x20});\x0a\x09\x09\x09\x09\x09const\x20url\x20=\x20URL.createObjectURL(blob);\x0a\x09\x09\x09\x09\x09const\x20a\x20=\x20document.createElement(\x22a\x22);\x0a\x09\x09\x09\x09\x09a.href\x20=\x20url;\x0a\x09\x09\x09\x09\x09a.download\x20=\x20fileName;\x0a\x09\x09\x09\x09\x09document.body.appendChild(a);\x0a\x09\x09\x09\x09\x09a.click();\x0a\x09\x09\x09\x09\x09document.body.removeChild(a);\x0a\x09\x09\x09\x09\x09URL.revokeObjectURL(url);\x0a\x09\x09\x09\x09}\x20catch\x20(e)\x20{\x0a\x09\x09\x09\x09\x09alert(\x27保存文件失败:\x20\x27\x20+\x20e.message);\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09}\x0a\x09\x09</script>\x0a\x09';}function generateReplyQuoteHtml(a,b){if(!a['plaintext'])return'';const c=parseReplyPlaintext(a['plaintext'])['replyTo'];if(!c)return'';const {theme:d}=b,e=b['payload']['messages']['find'](j=>j['id']===c['messageId']),f=d==='dark'?'#2b2b2b':'#f5f5f5';if(!e)return'\x0a\x09\x09\x09<div\x20style=\x22margin:\x208px\x200;\x20padding:\x208px\x2010px;\x20background:\x20'+f+';\x20border-left:\x203px\x20solid\x20'+(d==='dark'?'#b45309':'#f59e0b')+';\x20border-radius:\x204px;\x22>\x0a\x09\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+(d==='dark'?'#fbbf24':'#b45309')+';\x20word-break:\x20break-all;\x22>\x0a\x09\x09\x09\x09\x09⚠\x20Replied\x20message\x20not\x20found\x20—\x20message\x20ID:\x20'+escapeHtml(c['messageId'])+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09</div>\x0a\x09\x09';let g='';if(e['zipMetadata']?.['fileName'])g='[File]\x20'+e['zipMetadata']['fileName'];else{if(e['plaintext'])g=parseReplyPlaintext(e['plaintext'])['content'];}const h=e['from']['slice'](0x0,0x6)+'...'+e['from']['slice'](-0x3),i=(g||'Original\x20message')['replace'](/\s+/g,'\x20')['trim']()['slice'](0x0,0x78);return'\x0a\x09\x09<div\x20style=\x22margin:\x208px\x200;\x20padding:\x208px\x2010px;\x20background:\x20'+f+';\x20border-left:\x203px\x20solid\x20'+(d==='dark'?'#5a5a5a':'#c9c9c9')+';\x20border-radius:\x204px;\x22>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20#888;\x20margin-bottom:\x202px;\x22>↩\x20Replied\x20to\x20'+escapeHtml(h)+'</div>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2013px;\x20color:\x20'+(d==='dark'?'#bbbbbb':'#555555')+';\x20word-break:\x20break-word;\x22>'+escapeHtml(i)+'</div>\x0a\x09\x09</div>\x0a\x09';}function generateMessageHtml(a,b,c){const {theme:d,borderColor:e,myAddress:f,maxLastReceivedLeafIndex:g}=c,h=isNonTextMessage(a),i=a['from']['toLowerCase']()===f['toLowerCase'](),j=i&&g>=0x0&&a['leafIndex']<=g,k=getMessageColors(d,i),l=d==='dark'?'#333333':'#ffffff';let m='';if(h)m=generateFileButton(a,b,d);else{if(a['plaintext']){const o=parseReplyPlaintext(a['plaintext']);m=generateReplyQuoteHtml(a,c)+('<div\x20style=\x22margin:\x2012px\x200;\x20padding:\x2012px;\x20background:\x20'+l+';\x20border:\x201px\x20solid\x20'+e+';\x20border-radius:\x204px;\x20font-size:\x2014px;\x20line-height:\x201.6;\x20max-height:\x20calc(1.6em\x20*\x206);\x20overflow-y:\x20auto;\x20white-space:\x20pre-wrap;\x20word-break:\x20break-word;\x22>'+escapeHtml(o['content'])+'</div>');}else m='<div\x20style=\x22margin:\x2012px\x200;\x20padding:\x2012px;\x20background:\x20'+l+';\x20border:\x201px\x20solid\x20'+e+';\x20border-radius:\x204px;\x20font-size:\x2013px;\x20color:\x20#999;\x22>Plaintext\x20unavailable\x20locally\x20—\x20content\x20hash\x20verification\x20will\x20fail\x20for\x20this\x20message.</div>';}const n=['<div>Merkle\x20Root:\x20'+escapeHtml(a['merkleRoot'])+'</div>',a['arkConfirmed']?'<div>ARK\x20Confirmed:\x20'+escapeHtml(a['arkConfirmed']['recipient'])+'\x20at\x20'+new Date(a['arkConfirmed']['timestamp'])['toLocaleString']()+'</div>':'',a['guardAddress']?'<div>Guard:\x20'+escapeHtml(a['guardAddress'])+'</div>':'',a['passportAddress']?'<div>Passport:\x20'+escapeHtml(a['passportAddress'])+'</div>':'']['filter'](Boolean)['join']('');return'\x0a\x09\x09<div\x20style=\x22margin:\x2016px\x200;\x20padding:\x2016px;\x20border:\x201px\x20solid\x20'+k['borderColor']+';\x20border-radius:\x208px;\x20background:\x20'+k['bgColor']+';\x22>\x0a\x09\x09\x09<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20margin-bottom:\x208px;\x20font-size:\x2012px;\x20color:\x20#666;\x22>\x0a\x09\x09\x09\x09<span>From:\x20'+escapeHtml(a['from']['slice'](0x0,0x6))+'...'+escapeHtml(a['from']['slice'](-0x3))+'\x20To:\x20'+escapeHtml(a['to']['slice'](0x0,0x6))+'...'+escapeHtml(a['to']['slice'](-0x3))+'</span>\x0a\x09\x09\x09\x09<span>'+new Date(a['timestamp'])['toLocaleString']()+'</span>\x0a\x09\x09\x09</div>\x0a\x09\x09\x09'+m+'\x0a\x09\x09\x09<div\x20style=\x22margin:\x208px\x200;\x20font-size:\x2011px;\x20color:\x20#666;\x22>\x0a\x09\x09\x09\x09'+n+'\x0a\x09\x09\x09</div>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20#888;\x20margin-top:\x208px;\x20padding-top:\x208px;\x20border-top:\x201px\x20solid\x20'+e+';\x20display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x22>\x0a\x09\x09\x09\x09<div>Leaf\x20Index:\x20'+a['leafIndex']+'</div>\x0a\x09\x09\x09\x09'+(j?'<span\x20style=\x22color:\x20#4caf50;\x22>Delivered\x20&\x20Decrypted</span>':'')+'\x0a\x09\x09\x09</div>\x0a\x09\x09</div>\x0a\x09';}function generateSignatureHtml(a,b,c){if(!a['signatures']||a['signatures']['length']===0x0)return'';const d=a['valid'],e=d?b==='dark'?'#2a3f2a':'#e8f5e9':b==='dark'?'#3a2a2a':'#fff3e0',f=d?b==='dark'?'#81c784':'#2e7d32':b==='dark'?'#ffab40':'#e65100',g=a['signatures']['map']((h,i)=>'\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2010px;\x20color:\x20'+c+';\x20margin-left:\x208px;\x22>\x0a\x09\x09\x09\x09'+(i+0x1)+'.\x20'+(h['address']?escapeHtml(h['address']['slice'](0x0,0x6))+'...'+escapeHtml(h['address']['slice'](-0x3)):'Unknown')+':\x0a\x09\x09\x09\x09'+(h['valid']?'<span\x20style=\x22color:\x20#4caf50;\x22>✓\x20Valid</span>':'<span\x20style=\x22color:\x20#f44336;\x22>✗\x20Invalid</span>')+'\x0a\x09\x09\x09</div>\x0a\x09\x09')['join']('');return'\x0a\x09\x09<div\x20style=\x22margin-top:\x208px;\x20padding:\x208px;\x20background:\x20'+e+';\x20border-radius:\x204px;\x22>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+f+';\x20margin-bottom:\x204px;\x22>\x0a\x09\x09\x09\x09'+(d?'✓':'⚠')+'\x20Signature\x20Verification\x20('+a['signatures']['length']+'\x20signature'+(a['signatures']['length']>0x1?'s':'')+')'+(d?'':'\x20(signature\x20valid\x20but\x20content\x20hash\x20verification\x20failed)')+'\x0a\x09\x09\x09</div>\x0a\x09\x09\x09'+g+'\x0a\x09\x09</div>\x0a\x09';}const MESSAGES_PER_PAGE=0x64;function generateHtmlPage(a){const {title:b,theme:c,bgColor:d,textColor:e,borderColor:f,meta:g,payload:h,verifyResult:i,maxLastReceivedLeafIndex:j}=a,k=h['messages']['length'],l=Math['ceil'](k/MESSAGES_PER_PAGE),m=[];for(let s=0x0;s<l;s++){const t=s*MESSAGES_PER_PAGE,u=Math['min'](t+MESSAGES_PER_PAGE,k),v=h['messages']['slice'](t,u)['map']((w,x)=>generateMessageHtml(w,t+x,a))['join']('');m['push']({'pageNum':s+0x1,'html':'<div\x20class=\x22page\x22\x20data-page=\x22'+(s+0x1)+'\x22\x20style=\x22display:\x20'+(s===0x0?'block':'none')+';\x22>'+v+'</div>'});}const n=l>0x1?generatePaginationHtml(l,c,e):'',o=m['map'](w=>w['html'])['join'](''),p=generateSignatureHtml(i,c,e),q=i['valid']?'<span\x20style=\x22color:\x20#4caf50;\x20margin-left:\x208px;\x22>✓\x20The\x20accuracy,\x20sequentiality,\x20and\x20integrity\x20of\x20the\x20messages\x20are\x20verified\x20without\x20tampering</span>':'<span\x20style=\x22color:\x20#ff9800;\x20margin-left:\x208px;\x22>⚠\x20'+(i['error']||'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered')+'</span>',r=j>=0x0?'<div>Delivered\x20&\x20Decrypted\x20Leaf\x20Index:\x20'+j+'\x20(sent\x20messages\x20are\x20only\x20confirmed\x20as\x20decrypted\x20after\x20receiving\x20a\x20reply\x20from\x20the\x20other\x20party)</div>':'';return'<!DOCTYPE\x20html>\x0a<html\x20lang=\x22en\x22>\x0a<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22>\x0a\x20\x20\x20\x20<title>'+escapeHtml(b)+'</title>\x0a\x20\x20\x20\x20<style>\x0a\x20\x20\x20\x20\x20\x20\x20\x20body\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20-apple-system,\x20BlinkMacSystemFont,\x20\x22Segoe\x20UI\x22,\x20Roboto,\x20sans-serif;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20max-width:\x20800px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x200\x20auto;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2020px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+d+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20'+e+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.header\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x202px\x20solid\x20'+f+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding-bottom:\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-bottom:\x2024px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.meta\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#666;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.note\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#999;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+(c==='dark'?'#2a2a2a':'#f5f5f5')+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-style:\x20italic;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20justify-content:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x2024px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-top:\x201px\x20solid\x20'+f+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20button\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20'+f+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+(c==='dark'?'#333':'#fff')+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20'+e+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20button:hover:not(:disabled)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+(c==='dark'?'#444':'#f0f0f0')+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20button:disabled\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x200.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20not-allowed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20.page-info\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#666;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.page\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20animation:\x20fadeIn\x200.3s\x20ease-in;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keyframes\x20fadeIn\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20from\x20{\x20opacity:\x200;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20to\x20{\x20opacity:\x201;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20</style>\x0a</head>\x0a<body>\x0a\x20\x20\x20\x20<div\x20class=\x22header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<h1>Witness\x20Timestamped\x20Sequence</h1>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22note\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Important\x20Note:\x20This\x20page\x20is\x20for\x20message\x20browsing\x20and\x20verification\x20reference\x20only.\x20Please\x20verify\x20whether\x20the\x20message\x20sequence\x20has\x20been\x20tampered\x20with\x20through\x20the\x20\x27verify_wts\x27\x20API\x20using\x20the\x20WTS\x20file.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2014px;\x20color:\x20#666;\x20margin-top:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+new Date(g['startTime'])['toLocaleDateString']()+'\x20-\x20'+new Date(g['endTime'])['toLocaleDateString']()+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+q+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22meta\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>Messages:\x20'+g['messageCount']+'\x20|\x20Time:\x20'+new Date(g['startTime'])['toLocaleString']()+'\x20-\x20'+new Date(g['endTime'])['toLocaleString']()+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22word-break:\x20break-all;\x22>Merkle\x20Root:\x20'+escapeHtml(g['merkleRoot'])+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+r+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:\x20'+(c==='dark'?'#3b82f6':'#1976d2')+';\x22>Creator:\x20'+escapeHtml(g['creator'])+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:\x20'+(c==='dark'?'#10b981':'#2e7d32')+';\x22>Participant:\x20'+escapeHtml(g['participant'])+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+p+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20id=\x22messages-container\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+o+'\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20'+n+'\x0a\x20\x20\x20\x20<script>\x0a\x20\x20\x20\x20\x20\x20\x20\x20(function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20currentPage\x20=\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20totalPages\x20=\x20'+l+';\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20function\x20showPage(pageNum)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20隐藏所有页面\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20document.querySelectorAll(\x27.page\x27).forEach(page\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20page.style.display\x20=\x20\x27none\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20显示目标页面\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20targetPage\x20=\x20document.querySelector(\x27.page[data-page=\x22\x27\x20+\x20pageNum\x20+\x20\x27\x22]\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(targetPage)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20targetPage.style.display\x20=\x20\x27block\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20currentPage\x20=\x20pageNum;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updatePaginationButtons();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20function\x20updatePaginationButtons()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20prevBtn\x20=\x20document.getElementById(\x27prev-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20nextBtn\x20=\x20document.getElementById(\x27next-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20pageInfo\x20=\x20document.getElementById(\x27page-info\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(prevBtn)\x20prevBtn.disabled\x20=\x20currentPage\x20===\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(nextBtn)\x20nextBtn.disabled\x20=\x20currentPage\x20===\x20totalPages;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(pageInfo)\x20pageInfo.textContent\x20=\x20\x27Page\x20\x27\x20+\x20currentPage\x20+\x20\x27\x20of\x20\x27\x20+\x20totalPages;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20绑定按钮事件\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20prevBtn\x20=\x20document.getElementById(\x27prev-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20nextBtn\x20=\x20document.getElementById(\x27next-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(prevBtn)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20prevBtn.addEventListener(\x27click\x27,\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(currentPage\x20>\x201)\x20showPage(currentPage\x20-\x201);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(nextBtn)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20nextBtn.addEventListener(\x27click\x27,\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(currentPage\x20<\x20totalPages)\x20showPage(currentPage\x20+\x201);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20初始化\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updatePaginationButtons();\x0a\x20\x20\x20\x20\x20\x20\x20\x20})();\x0a\x20\x20\x20\x20</script>\x0a</body>\x0a</html>';}function generatePaginationHtml(a,b,c){return'\x0a\x20\x20\x20\x20<div\x20class=\x22pagination\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20id=\x22prev-btn\x22\x20disabled>←\x20Previous</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22page-info\x22\x20id=\x22page-info\x22>Page\x201\x20of\x20'+a+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20id=\x22next-btn\x22\x20'+(a<=0x1?'disabled':'')+'>Next\x20→</button>\x0a\x20\x20\x20\x20</div>';}const logger=a34c('messenger:api');let managerInstance=null,isInitialized=![],backgroundTimer=null;async function autoRegisterMessengerAccounts(){const a=await Account['Instance']()['list_messenger_accounts'](),b=managerInstance;if(!b)return;for(const c of a){if(!c['address']||!c['messenger'])continue;try{await b['ensureAccountReady'](c['address']);}catch(d){logger['error']('Failed\x20to\x20initialize\x20account\x20'+c['address']+':',d);}}}function getMessengerManager(){if(!managerInstance)managerInstance=new MessengerManager();return!isInitialized&&(isInitialized=!![],autoRegisterMessengerAccounts()['then'](()=>{return managerInstance['start']();})['catch'](a=>{return logger['error']('Failed\x20to\x20auto-register\x20messenger\x20accounts:',a),managerInstance['start']();})['catch'](a=>{logger['error']('Failed\x20to\x20auto-start\x20messenger\x20manager:',a);})),managerInstance;}function registerCleanupHandler(){const a=()=>{backgroundTimer&&(clearInterval(backgroundTimer),backgroundTimer=null);if(managerInstance)managerInstance['stop']();};process['on']('exit',a),process['on']('SIGINT',()=>{a();}),process['on']('SIGTERM',()=>{a();});}registerCleanupHandler();async function watch_conversations(a){const b=await Account['Instance']()['get_address'](a?.['account']);if(!b)a34a('account\x20not\x20found','watch_conversations.account\x20'+a?.['account']);const c=b['toLowerCase'](),d=(await getMessengerManager()['ensureAccountReady'](b))['messenger']['pullMessages']();if(a?.['sync']!==![])await d;else d['catch'](()=>{});const e=new MessageStorage(c),f=e['getAllMessages'](c),g=new Map(),h=a?.['previewMessageCount']??0x2,i=a?.['skipAutoMarkViewed']??![],j=n=>messagePreviewText(n);for(const n of f){const o=n['fromAddress']['toLowerCase']()===c?n['toAddress']:n['fromAddress'];if(!g['has'](o))g['set'](o,{'peerAddress':o,'lastMessageAt':n['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':j(n),'messages':[]});const p=g['get'](o);p['messages']['push'](n),p['messageCount']++;n['createdAt']>p['lastMessageAt']&&(p['lastMessageAt']=n['createdAt'],p['lastMessagePreview']=j(n));if(n['direction']==='received'&&n['viewedAt']===void 0x0)p['unreadCount']++;}const k=[];for(const [,q]of g){if(a?.['startTime']!==void 0x0&&q['lastMessageAt']<a['startTime'])continue;if(a?.['endTime']!==void 0x0&&q['lastMessageAt']>a['endTime'])continue;if(a?.['unreadOnly']&&q['unreadCount']===0x0)continue;const r=[];if(h>0x0){const s=q['messages']['sort']((t,u)=>u['createdAt']-t['createdAt'])['slice'](0x0,h);r['push'](...s['reverse']());if(!i){const t=s['filter'](u=>u['direction']==='received'&&u['viewedAt']===void 0x0)['map'](u=>u['messageId']);if(t['length']>0x0)e['updateMessagesViewed'](t);}}k['push']({'peerAddress':q['peerAddress'],'lastMessageAt':q['lastMessageAt'],'messageCount':q['messageCount'],'unreadCount':q['unreadCount'],'lastMessagePreview':q['lastMessagePreview'],...h>0x0&&{'previewMessages':r['map'](u=>presentMessageForRead(u))}});}const l=a?.['sortBy']??'lastMessageAt',m=a?.['sortOrder']??'desc';return k['sort']((u,v)=>{let w=0x0;switch(l){case'lastMessageAt':w=u['lastMessageAt']-v['lastMessageAt'];break;case'unreadCount':w=u['unreadCount']-v['unreadCount'];break;case'messageCount':w=u['messageCount']-v['messageCount'];break;}return m==='asc'?w:-w;}),k;}async function mark_messages_as_viewed(a,b){if(!a||a['length']===0x0)return 0x0;const c=await Account['Instance']()['get_address'](b);if(!c)a34a('account\x20not\x20found','mark_messages_as_viewed.account\x20'+b);return new MessageStorage(c['toLowerCase']())['updateMessagesViewed'](a);}async function mark_conversation_as_viewed(a,b){const c=await Account['Instance']()['get_address'](b);if(!c)a34a('account\x20not\x20found','mark_conversation_as_viewed.account\x20'+b);const d=c['toLowerCase'](),e=await a34j(a);if(!e)a34a('account\x20not\x20found','mark_conversation_as_viewed.peerAddress\x20'+a+'\x20is\x20not\x20a\x20valid\x20account/address');const f=e['toLowerCase'](),g=new MessageStorage(d),h=g['getMessagesBySession'](d,f)['filter'](i=>i['direction']==='received'&&i['viewedAt']===void 0x0)['map'](i=>i['messageId']);if(h['length']===0x0)return 0x0;return g['updateMessagesViewed'](h);}async function send_message(a,b,c,d){const f=await Account['Instance']()['get_address'](a);if(!f)a34a('account\x20not\x20found','send_message.from\x20'+a);const g=await a34j(b);if(!g)a34a('account\x20not\x20found','send_message.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');if(d?.['guardAddress']!=null&&d?.['passportAddress']!=null){[d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]);if(!d['guardAddress']||!d['passportAddress'])a34a('account\x20not\x20found','send_message.guardAddress\x20or\x20passportAddress\x20not\x20found');}const h=getMessengerManager();try{return await h['send'](f,g,c,d);}catch(i){const j=i?.['guardList'];if(d?.['smart']===![]||d?.['guardAddress']!=null||!Array['isArray'](j)||j['length']===0x0)throw i;const k=await smartSendResolve(f,j['map'](l=>String(l)),d?.['network'],{'authorize':d?.['authorize']===!![]});if(k['kind']==='resend')return await h['send'](f,g,c,{'guardAddress':k['guardAddress'],'passportAddress':k['passportAddress'],'network':k['network'],'force':d?.['force'],'enable_messenger':d?.['enable_messenger'],'replyTo':d?.['replyTo']});return k['result'];}}async function peer_registered(a,b){const c=await Account['Instance']()['get_address'](a);if(!c)a34a('account\x20not\x20found','peer_registered.account\x20'+a);if(!b||!b['trim']())a34a('invalid\x20parameter','peer_registered.peer\x20'+b);return getMessengerManager()['isPeerRegistered'](c,b['trim']());}async function send_file(a,b,c,d){const e=await Account['Instance']()['get_address'](a);if(!e)a34a('account\x20not\x20found','send_file.from\x20'+a);const f=await a34j(b);if(!f)a34a('account\x20not\x20found','send_file.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');if(d?.['guardAddress']!=null&&d?.['passportAddress']!=null){[d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]);if(!d['guardAddress']||!d['passportAddress'])a34a('account\x20not\x20found','send_file.guardAddress\x20or\x20passportAddress\x20not\x20found');}return getMessengerManager()['send_file'](e,f,c,d);}async function watch_messages(a){if(a?.['account']!==void 0x0){a['account']=await Account['Instance']()['get_address'](a['account']);if(!a['account'])a34a('account\x20not\x20found','watch_messages.account\x20'+a['account']);}if(a?.['customListFilter']?.['includeAddresses']!=null)a['customListFilter']['includeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['includeAddresses']))['filter'](c=>c!=null);if(a?.['customListFilter']?.['excludeAddresses']!=null)a['customListFilter']['excludeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['excludeAddresses']))['filter'](c=>c!=null);const b=await getMessengerManager()['watch'](a);if(!(a?.['skipAutoMarkViewed']??![])&&b['length']>0x0&&a?.['account']){const c=new MessageStorage(a['account']['toLowerCase']()),d=b['filter'](e=>e['direction']==='received'&&e['viewedAt']===void 0x0)['map'](e=>e['messageId']);if(d['length']>0x0)c['updateMessagesViewed'](d);}return b;}async function search_messages(a){const b=(a['query']??'')['trim']();if(!b)return[];const c=await Account['Instance']()['get_address'](a['account']);if(!c)a34a('account\x20not\x20found','search_messages.account\x20'+a['account']);let d;if(a['peerAddress'])try{d=await a34j(a['peerAddress'])??a['peerAddress'];}catch{d=a['peerAddress'];}return presentMessagesForRead(new MessageStorage(c)['searchMessages'](b,{'peerAddress':d,'limit':a['limit']}));}async function pull_messages(a,b,c){if(c?.['allAccounts']||c?.['accounts']?.['length'])return getMessengerManager()['pullAllAccounts']({'accounts':c['accounts'],'limit':b,'concurrency':c['concurrency']});const d=await Account['Instance']()['get_address'](a);if(!d)a34a('account\x20not\x20found','pull_messages.account\x20'+a);const e=await(await getMessengerManager()['ensureAccountReady'](d))['messenger']['pullMessages'](b),f=new MessageStorage(d['toLowerCase']());return e['messages']['map'](g=>{return presentMessageForRead(f['getMessageById'](g['id'])??g);});}async function emergency_pull(a){return getMessengerManager()['setEmergencyAccounts'](a?.['accounts']??[]);}async function get_attachment(a,b){const c=await Account['Instance']()['get_address'](a);if(!c)a34a('account\x20not\x20found','get_attachment.account\x20'+a);const d=new MessageStorage(c['toLowerCase']())['getMessageById'](b);if(!d)throw new MessengerError('FILE_NOT_FOUND','Message\x20not\x20found:\x20'+b);if(!d['zipMetadata'])throw new MessengerError('INVALID_MESSAGE_TYPE','Message\x20'+b+'\x20is\x20not\x20an\x20attachment');if(!d['plaintext'])throw new MessengerError('MESSAGE_NOT_DECRYPTED','Message\x20'+b+'\x20plaintext\x20is\x20not\x20available');const e=Buffer['from'](d['plaintext'],'base64'),f=d['zipMetadata']['fileHash']?.['replace']('0x','');if(f){const g=createHash('sha256')['update'](e)['digest']('hex');if(g!==f)throw new MessengerError('HASH_MISMATCH','Attachment\x20hash\x20mismatch\x20for\x20'+b+':\x20expected\x20'+f+',\x20got\x20'+g);}return parseAttachmentEnvelope(new Uint8Array(e),{'contentType':d['zipMetadata']['contentType']});}async function export_attachment(a,b,c){const d=await get_attachment(a,b),e=c?.['outputDir']??a34m['join'](getWowokWorkspaceDir(),'attachments');a34n['mkdirSync'](e,{'recursive':!![]});const f=c?.['saveAs']?sanitizeFileName(c['saveAs']):d['fileName'],g=f['lastIndexOf']('.'),h=g>0x0?f['slice'](0x0,g):f,i=g>0x0?f['slice'](g):'';let j=f,k=0x1;while(a34n['existsSync'](a34m['join'](e,j))){j=h+'\x20('+k+')'+i,k++;}const l=a34m['join'](e,j);return a34n['writeFileSync'](l,Buffer['from'](d['bytes'])),l;}async function extract_zip_message(a,b){if(!a['zipMetadata'])throw new MessengerError('INVALID_MESSAGE_TYPE','Message\x20is\x20not\x20a\x20ZIP\x20archive');if(!a['plaintext'])throw new MessengerError('MESSAGE_NOT_DECRYPTED','Message\x20plaintext\x20not\x20available');const c=Buffer['from'](a['plaintext'],'base64');if(a['zipMetadata']?.['fileHash']){const f=createHash('sha256')['update'](c)['digest']('hex'),g=a['zipMetadata']['fileHash']['replace']('0x','');if(f!==g)throw new MessengerError('HASH_MISMATCH','ZIP\x20file\x20hash\x20mismatch:\x20expected\x20'+g+',\x20got\x20'+f);}const d=await extractZipFromPlaintext(a['plaintext']);if(!a34n['existsSync'](b))a34n['mkdirSync'](b,{'recursive':!![]});const e=[];for(const h of d){const i=a34m['join'](b,h['filename']);a34n['writeFileSync'](i,h['content']),e['push'](i);}return e['length']>0x0&&a['zipMetadata']&&(a['zipMetadata']={'fileName':a['zipMetadata']['fileName'],'fileSize':a['zipMetadata']['fileSize'],'fileHash':a['zipMetadata']['fileHash'],'contentType':a['zipMetadata']['contentType'],'localCachePath':e[0x0],'downloadedAt':Date['now']()},new MessageStorage(a['direction']==='sent'?a['fromAddress']:a['toAddress'])['saveMessage'](a)),e[0x0]||'';}async function extractZipFromPlaintext(a){if(!a)throw new MessengerError('INVALID_INPUT','plaintext\x20is\x20empty');const b=Buffer['from'](a,'base64');if(b['length']<0x4||b[0x0]!==0x50||b[0x1]!==0x4b)throw new MessengerError('INVALID_INPUT','Invalid\x20ZIP\x20data:\x20magic\x20bytes\x20mismatch\x20(expected\x20PK,\x20got\x20'+b['slice'](0x0,0x2)['toString']('hex')+')');const {ZipReader:c,BlobReader:d,BlobWriter:e}=await import('@zip.js/zip.js'),f=new c(new d(new Blob([b]))),g=await f['getEntries']();if(g['length']===0x0){await f['close']();throw new MessengerError('INVALID_INPUT','ZIP\x20archive\x20contains\x20no\x20files');}const h=[];for(const i of g)if(!i['directory']){const j=i,k=new e(),l=await j['getData'](k),m=Buffer['from'](await l['arrayBuffer']());h['push']({'filename':i['filename'],'content':m});}return await f['close'](),h;}async function extract_zip_messages(a,b,c){const d=[],f=c??a34m['join'](getWowokWorkspaceDir(),'extracted'),g=await Account['Instance']()['get_address'](a);if(!g)throw new MessengerError('INVALID_INPUT','account\x20is\x20required\x20when\x20extracting\x20by\x20message\x20IDs');for(const h of b)try{let i;if(typeof h==='string'){const k=h,l=new MessageStorage(g)['getMessageById'](k);if(!l){logger['error']('Message\x20not\x20found:\x20'+k);continue;}i=l;}else i=h;if(!i['zipMetadata']){logger['error']('Message\x20'+i['messageId']+'\x20is\x20not\x20a\x20ZIP\x20archive');continue;}const j=await extract_zip_message(i,f);d['push'](j);}catch(m){const n=typeof h==='string'?h:h['messageId'];logger['error']('Failed\x20to\x20extract\x20message\x20'+n+':',m);}return d;}async function generate_wts(a){const b=await Account['Instance']()['get_address'](a['myAccount']);if(!b)a34a('account\x20not\x20found','generate_wts.myAccount\x20'+a['myAccount']);const c=await a34j(a['peerAccount']);if(!c)a34a('account\x20not\x20found','generate_wts.peerAccount\x20'+a['peerAccount']);const d=a['outputDir']??a34m['join'](getWowokWorkspaceDir(),'wts'),f=await getMessengerManager()['generate_wts'](d,b,c,a['range'],a['excludePlaintext']),g=[];for(const h of f['files'])try{const i=await wts2html(h,{'outputPath':d});if(typeof i==='string')g['push'](i);}catch(j){logger['error']('Failed\x20to\x20render\x20HTML\x20report\x20for\x20'+h+':',j);}return{...f,'htmlFiles':g};}function load_wts(a){const b=a34n['readFileSync'](a,'utf-8');return JSON['parse'](b);}function save_wts(a,b){const c=a34m['dirname'](b);if(!a34n['existsSync'](c))a34n['mkdirSync'](c,{'recursive':!![]});a34n['writeFileSync'](b,JSON['stringify'](a,null,0x2),'utf-8');}function resolveServerPublicKey(a,b){if(b['serverPublicKeys']&&a['serverPublicKeyIndex']!==void 0x0&&a['serverPublicKeyIndex']>=0x0&&a['serverPublicKeyIndex']<b['serverPublicKeys']['length'])return b['serverPublicKeys'][a['serverPublicKeyIndex']]['publicKey'];const c=a;if(c['serverPublicKey'])return c['serverPublicKey'];return null;}async function verify_wts(a){try{const b=load_wts(a);if(!b['payload']||!b['meta'])return{'valid':![],'error':'Invalid\x20WTS\x20file\x20structure','hashValid':![],'hasSignature':![]};if(b['meta']['type']!=='wts')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+b['meta']['type'],'hashValid':![],'hasSignature':!!b['meta']['signature']};const {payload:c,meta:d}=b,e=[...c['messages']]['sort']((m,n)=>{if(m['leafIndex']===void 0x0||n['leafIndex']===void 0x0)return 0x0;return m['leafIndex']-n['leafIndex'];});for(let m=0x0;m<e['length'];m++){const n=e[m];if(!n)return{'valid':![],'error':'Message\x20'+m+':\x20Message\x20is\x20null\x20or\x20undefined','hashValid':![],'hasSignature':!!d['signature']};if(!n['prevRoot'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20prevRoot','hashValid':![],'hasSignature':!!d['signature']};if(!n['merkleRoot'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20merkleRoot','hashValid':![],'hasSignature':!!d['signature']};if(!n['plaintextHash'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20plaintextHash','hashValid':![],'hasSignature':!!d['signature']};if(n['timestamp']===void 0x0||n['timestamp']===null)return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20timestamp','hashValid':![],'hasSignature':!!d['signature']};if(n['leafIndex']===void 0x0||n['leafIndex']===null)return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20leafIndex','hashValid':![],'hasSignature':!!d['signature']};const o=verifySingleMerkleRoot(n['prevRoot'],n['merkleRoot'],n['plaintextHash'],n['timestamp'],n['leafIndex']);if(!o['valid'])return{'valid':![],'error':o['error']+'\x20at\x20message\x20'+m+',\x20leafIndex\x20'+n['leafIndex'],'hashValid':![],'hasSignature':!!d['signature']};if(m>0x0){const p=e[m-0x1];if(n['leafIndex']!==p['leafIndex']+0x1)return{'valid':![],'error':'Merkle\x20chain\x20discontinuity:\x20leafIndex\x20'+p['leafIndex']+'\x20->\x20'+n['leafIndex']+'\x20(expected\x20'+(p['leafIndex']+0x1)+')','hashValid':![],'hasSignature':!!d['signature']};if(n['prevRoot']['toLowerCase']()!==p['merkleRoot']['toLowerCase']())return{'valid':![],'error':'Merkle\x20root\x20mismatch\x20at\x20leafIndex\x20'+n['leafIndex']+':\x20expected\x20prevRoot='+p['merkleRoot']+',\x20got\x20'+n['prevRoot'],'hashValid':![],'hasSignature':!!d['signature']};}}for(let q=0x0;q<c['messages']['length'];q++){const r=c['messages'][q];if(!r)return{'valid':![],'error':'Message\x20'+q+':\x20Message\x20is\x20null\x20or\x20undefined','hashValid':![],'hasSignature':!!d['signature']};if(!!!r['zipMetadata']){if(!r['plaintextHash']['startsWith']('0x')||r['plaintextHash']['length']!==0x42)return{'valid':![],'error':'Message\x20'+q+':\x20Invalid\x20plaintextHash\x20format','hashValid':![],'hasSignature':!!d['signature']};if(r['plaintext']){if(hashPlaintext(r['plaintext'],r['clientTimestamp'],r['guardAddress'],r['passportAddress'],r['lastReceivedLeafIndex'])['toLowerCase']()!==r['plaintextHash']['toLowerCase']())return{'valid':![],'error':'Message\x20'+q+':\x20Plaintext\x20hash\x20mismatch','hashValid':![],'hasSignature':!!d['signature']};}}const s=resolveServerPublicKey(r,d);if(r['serverSignature']&&s){if(!r['timestamp'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20timestamp\x20for\x20signature\x20verification','hashValid':![],'hasSignature':!!d['signature']};if(!r['merkleRoot'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20merkleRoot\x20for\x20signature\x20verification','hashValid':![],'hasSignature':!!d['signature']};if(!r['prevRoot'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20prevRoot\x20for\x20signature\x20verification','hashValid':![],'hasSignature':!!d['signature']};if(!verifyFalcon512Signature(s,r['prevRoot']+':'+r['merkleRoot']+':'+r['timestamp']+':'+s,r['serverSignature']))return{'valid':![],'error':'Message\x20'+q+':\x20Server\x20signature\x20verification\x20failed','hashValid':![],'hasSignature':!!d['signature']};}}const {sha256:f}=await import('@noble/hashes/sha2.js'),{bytesToHex:g}=await import('@noble/hashes/utils.js'),h={'wts':b['wts'],...c};if(g(f(new TextEncoder()['encode'](canonicalizeJson(h))))!==d['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!d['signature']};if(d['messageCount']!==c['messages']['length'])return{'valid':![],'error':'messageCount\x20mismatch:\x20meta='+d['messageCount']+',\x20actual='+c['messages']['length'],'hashValid':!![],'hasSignature':!!d['signature']};const j=c['messages'][c['messages']['length']-0x1];if(d['merkleRoot']['toLowerCase']()!==j['merkleRoot']['toLowerCase']())return{'valid':![],'error':'merkleRoot\x20mismatch:\x20meta='+d['merkleRoot']+',\x20lastMessage='+j['merkleRoot'],'hashValid':!![],'hasSignature':!!d['signature']};const k=[];let l;if(d['signature']){const {Falcon512PublicKey:t}=await import('./publickey-CvXcTL6j.mjs')['then'](z=>z['n']),{signature:u,...v}=d,w=g(f(new TextEncoder()['encode'](canonicalizeJson(v)))),x=Array['isArray'](d['signature'])?d['signature']:[d['signature']];let y=!![];for(const z of x){let A;const B=z['publicKey'];if(B['startsWith']('0x')){const C=Buffer['from'](B['slice'](0x2),'hex');if(C['length']===0x382)A=C['slice'](0x1);else{if(C['length']===0x381)A=C;else{let D;try{D=new t(B['slice'](0x2))['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':D,'valid':![]}),y=![];continue;}}}else try{const E=Buffer['from'](B,'base64');if(E['length']===0x382)A=E['slice'](0x1);else{if(E['length']===0x381)A=E;else{let F;try{F=new t(B)['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':F,'valid':![]}),y=![];continue;}}}catch{A=Buffer['from'](B,'base64');}try{const G=new t(A),H=Uint8Array['from'](Buffer['from'](z['value'],'base64')),I=await G['verify'](new TextEncoder()['encode'](w),H);let J;try{J=G['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':J,'valid':I});if(!I)y=![];}catch{let K;try{K=new t(A)['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':K,'valid':![]}),y=![];}}l=y;if(!l)return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+k['filter'](L=>!L['valid']&&L['address'])['map'](L=>L['address'])['join'](',\x20'),'hashValid':!![],'hasSignature':!![],'signatureValid':![],'signatures':k};}return{'valid':!![],'hashValid':!![],'hasSignature':!!d['signature'],'signatureValid':l,'signatures':k['length']>0x0?k:void 0x0};}catch(L){return{'valid':![],'error':'Verification\x20error:\x20'+L,'hashValid':![],'hasSignature':![]};}}async function sign_wts(a,b,c){const d=await verify_wts(a);if(!d['valid'])throw new MessengerError('INVALID_INPUT','WTS\x20file\x20verification\x20failed:\x20'+d['error']);const e=load_wts(a),f=await Account['Instance']()['get_address'](b);if(!f)a34a('account\x20not\x20found','sign_wts.account\x20'+b);const {sha256:g}=await import('@noble/hashes/sha2.js'),{bytesToHex:h}=await import('@noble/hashes/utils.js'),{signature:i,...j}=e['meta'],k=h(g(new TextEncoder()['encode'](canonicalizeJson(j)))),l=await Account['Instance']()['signData'](f,k);let m;const n=l['publicKey'];if(n['startsWith']('0x')){const s=Buffer['from'](n['slice'](0x2),'hex');if(s['length']===0x382)m=s['slice'](0x1)['toString']('base64');else{if(s['length']===0x381)m=s['toString']('base64');else throw new MessengerError('INVALID_INPUT','Invalid\x20public\x20key\x20length:\x20'+s['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else m=n;const o={'value':Buffer['from'](l['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':m,'algorithm':'Falcon512','address':l['address']};let p;if(e['meta']['signature']){const t=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],u=t['findIndex'](v=>v['publicKey']===m);if(u>=0x0)t[u]=o,p=t;else p=[...t,o];}else p=[o];const q={...e,'meta':{...e['meta'],'signature':p}};let r;if(c)r=c;else{const v=a34m['extname'](a),w=a34m['basename'](a,v);r=a34m['join'](getWowokWorkspaceDir(),'signed_'+w+v);}return save_wts(q,r),r;}async function wts2html(a,b={}){const c=await import('fs'),d=await import('path');if(c['statSync'](a)['isDirectory']()){const i=c['readdirSync'](a)['filter'](k=>k['endsWith']('.wts'));if(i['length']===0x0)throw new MessengerError('INVALID_INPUT','No\x20.wts\x20files\x20found\x20in\x20directory:\x20'+a);const j=[];for(const k of i){const l=await convertWtsToHtml(d['join'](a,k),b),m=toHtmlFileName(k),n=b['outputPath']?d['join'](b['outputPath'],m):d['join'](getWowokWorkspaceDir(),m),o=d['dirname'](n);if(!c['existsSync'](o))c['mkdirSync'](o,{'recursive':!![]});c['writeFileSync'](n,l,'utf-8'),j['push'](n);}return j;}const e=await convertWtsToHtml(a,b),f=toHtmlFileName(d['basename'](a)),g=b['outputPath']?d['join'](b['outputPath'],f):d['join'](getWowokWorkspaceDir(),f),h=d['dirname'](g);if(!c['existsSync'](h))c['mkdirSync'](h,{'recursive':!![]});return c['writeFileSync'](g,e,'utf-8'),g;}function toHtmlFileName(a){if(a['endsWith']('.wts.json'))return a['slice'](0x0,-0x9)+'.html';if(a['endsWith']('.wts'))return a['slice'](0x0,-0x4)+'.html';const b=a['lastIndexOf']('.');if(b>0x0)return a['slice'](0x0,b)+'.html';return a+'.html';}async function convertWtsToHtml(a,b={}){const {title:title='WTS\x20Document',theme:theme='light'}=b,c=await verify_wts(a),{payload:d,meta:e}=load_wts(a),{bgColor:f,textColor:g,borderColor:h}=getThemeColors(theme),i=e['creator'];let j=-0x1;for(const k of d['messages'])if(k['to']['toLowerCase']()===i['toLowerCase']()){if(k['lastReceivedLeafIndex']!==void 0x0&&k['lastReceivedLeafIndex']>=0x0){if(k['lastReceivedLeafIndex']>j)j=k['lastReceivedLeafIndex'];}}return generateHtmlPage({'title':title,'theme':theme,'bgColor':f,'textColor':g,'borderColor':h,'meta':e,'payload':d,'verifyResult':c,'maxLastReceivedLeafIndex':j,'myAddress':i});}async function proof_message(a,b,c){const d=await Account['Instance']()['get_address'](a);if(!d)a34a('account\x20not\x20found','proof_message.account\x20'+a);const e=new MessageStorage(d),f=e['getMessageById'](b);if(!f)throw new MessengerError('INVALID_INPUT','Message\x20not\x20found:\x20'+b);if(f['fromAddress']['toLowerCase']()!==d['toLowerCase']()&&f['toAddress']['toLowerCase']()!==d['toLowerCase']())throw new MessengerError('INVALID_INPUT','Message\x20does\x20not\x20belong\x20to\x20account\x20'+d);if(!f['serverSignature'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20server\x20signature');if(!f['serverPublicKey'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20server\x20public\x20key');if(!f['plaintext'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20plaintext');const {verifyMessage:g}=await import('./w/messenger/crypto.mjs'),h={'messageId':f['messageId'],'plaintext':f['plaintext'],'plaintextHash':f['plaintextHash'],'createdAt':f['createdAt'],'guardAddress':f['guardAddress'],'passportAddress':f['passportAddress'],'lastReceivedLeafIndex':f['lastReceivedLeafIndex'],'serverSignature':f['serverSignature'],'serverPublicKey':f['serverPublicKey']};if(f['newRoot']&&f['leafIndex']!==void 0x0){if(!f['serverTimestamp'])throw new MessengerError('INVALID_PROOF','Message\x20'+f['messageId']+'\x20missing\x20server\x20timestamp\x20for\x20verification');h['merkleMetadata']={'newRoot':f['newRoot'],'prevRoot':f['prevRoot'],'leafIndex':f['leafIndex'],'serverTimestamp':f['serverTimestamp']};}const i=g(h);if(!i['valid'])throw new MessengerError('INVALID_PROOF','Message\x20verification\x20failed:\x20'+i['error']);if(!f['serverPublicKey'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20server\x20public\x20key');const {CallProof:j}=await import('./proof-A-gI-Jbd.mjs')['then'](q=>q['r']),k=new j({'proof':f['newRoot'],'server_pubkey':f['serverPublicKey'],'server_signature':f['serverSignature'],'proof_type':0x1,'description':'Message\x20proof\x20for\x20'+b,'item_count':f['leafIndex']??0x1,'about_address':f['fromAddress']['toLowerCase']()===d['toLowerCase']()?f['toAddress']:f['fromAddress']}),l={'network':c,'account':d},m=await k['call'](l),{ResponseData:n}=await import('./w/call/base.mjs'),o=n(m)['find'](q=>q['type']==='Proof');if(!o||!o['object'])throw new MessengerError('INVALID_PROOF','Failed\x20to\x20get\x20proof\x20address\x20from\x20transaction\x20result');const p=e['addMessageProof'](b,o['object'],c);return f['proofs']=p,f['proof']=p[p['length']-0x1]?.['address'],{'proofAddress':o['object']};}const MIN_PASSPORT_VALIDITY=0xa,MAX_PASSPORT_VALIDITY=0xa*0x16d*0x18*0x3c*0x3c,MAX_BLACKLIST_SIZE_ONCE=0x64,MAX_FRIENDS_SIZE_ONCE=0x64,MAX_GUARDS_SIZE_ONCE=0xa;async function blacklist(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','blacklist.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await a34h(a['users']);if(d['length']===0x0)a34a('invalid\x20parameter','blacklist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');d=[...new Set(d['map'](e=>e['toLowerCase']()))];if(d['length']>MAX_BLACKLIST_SIZE_ONCE)a34a('invalid\x20parameter','blacklist.add.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);return{'op':'add','result':await c['addToBlacklist'](b,d)};}case'remove':{let e=await a34h(a['users']);if(e['length']===0x0)a34a('invalid\x20parameter','blacklist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');e=[...new Set(e['map'](f=>f['toLowerCase']()))];if(e['length']>MAX_BLACKLIST_SIZE_ONCE)a34a('invalid\x20parameter','blacklist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);return{'op':'remove','result':await c['removeFromBlacklist'](b,e)};}case'clear':return{'op':'clear','result':await c['clearBlacklist'](b)};case'get':return{'op':'get','result':await c['getBlacklist'](b)};case'exist':{let f=await a34h(a['users']);if(f['length']===0x0)a34a('invalid\x20parameter','blacklist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](g=>g['toLowerCase']()))];if(f['length']>MAX_BLACKLIST_SIZE_ONCE)a34a('invalid\x20parameter','blacklist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);return{'op':'exist','result':await c['existInBlacklist'](b,f)};}default:throw new MessengerError('INVALID_INPUT','blacklist.unknown\x20op:\x20'+a);}}async function friendslist(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','friendslist.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await a34h(a['users']);if(d['length']===0x0)a34a('invalid\x20parameter','friendslist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');return d=[...new Set(d['map'](e=>e['toLowerCase']()))],{'op':'add','result':await c['addToFriendsList'](b,d)};}case'remove':{let e=await a34h(a['users']);if(e['length']===0x0)a34a('invalid\x20parameter','friendslist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');e=[...new Set(e['map'](f=>f['toLowerCase']()))];if(e['length']>MAX_FRIENDS_SIZE_ONCE)a34a('invalid\x20parameter','friendslist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);return{'op':'remove','result':await c['removeFromFriendsList'](b,e)};}case'clear':return{'op':'clear','result':await c['clearFriendsList'](b)};case'get':return{'op':'get','result':await c['getFriendsList'](b)};case'exist':{let f=await a34h(a['users']);if(f['length']===0x0)a34a('invalid\x20parameter','friendslist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](g=>g['toLowerCase']()))];if(f['length']>MAX_FRIENDS_SIZE_ONCE)a34a('invalid\x20parameter','friendslist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);return{'op':'exist','result':await c['existInFriendsList'](b,f)};}default:throw new MessengerError('INVALID_INPUT','friendslist.unknown\x20op:\x20'+a);}}async function guardlist(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','guardlist.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'add':{const d=new Map();for(const l of a['guards'])d['set'](l['guard']['toLowerCase'](),l);const e=Array['from'](d['values']());if(e['length']===0x0)a34a('invalid\x20parameter','guardlist.add.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');if(e['length']>MAX_GUARDS_SIZE_ONCE)a34a('invalid\x20parameter','guardlist.add.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);for(const m of e)if(!a34b(m['passportValiditySeconds'])||m['passportValiditySeconds']<MIN_PASSPORT_VALIDITY||m['passportValiditySeconds']>MAX_PASSPORT_VALIDITY)a34a('invalid\x20parameter','Guard\x20'+m['guard']+':\x20passport\x20validity\x20'+m['passportValiditySeconds']+'\x20must\x20be\x20between\x20'+MIN_PASSPORT_VALIDITY+'\x20and\x20'+MAX_PASSPORT_VALIDITY+'\x20seconds');const f=await LocalMark['Instance']()['get_many_address'](e['map'](n=>n['guard']));if(f['length']!==e['length']){const n=new Set(f),o=[];for(const p of e)if(!n['has'](p['guard'])&&!p['guard']['startsWith']('0x'))o['push'](p['guard']);a34a('invalid\x20parameter','Guard\x20not\x20found:\x20'+o['join'](',\x20'));}const h=await a34e({'objects':f,'no_cache':!![],'network':'mainnet'}),i=new Set((h?.['objects']??[])['filter'](q=>q['type']==='Guard')['map'](q=>q['object']['toLowerCase']())),j=e['filter']((q,r)=>!f[r]||!i['has'](f[r]['toLowerCase']()));if(j['length']>0x0)a34a('invalid\x20parameter','Guard\x20not\x20found\x20on\x20mainnet:\x20'+j['map'](q=>q['guard'])['join'](',\x20')+'.\x20Messenger\x20guards\x20must\x20be\x20Guard\x20objects\x20on\x20mainnet.');const k=e['map']((q,r)=>({'guardAddress':f[r],'passportValiditySeconds':q['passportValiditySeconds']}));return{'op':'add','result':await c['addToGuardList'](b,k)};}case'remove':{const q=[...new Set(a['guards']['map'](s=>s['toLowerCase']()))];if(q['length']===0x0)a34a('invalid\x20parameter','guardlist.remove.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');if(q['length']>MAX_GUARDS_SIZE_ONCE)a34a('invalid\x20parameter','guardlist.remove.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);const r=await LocalMark['Instance']()['get_many_address'](q);if(r['length']!==q['length']){const s=new Set(r),t=[];for(const u of q)if(!s['has'](u)&&!u['startsWith']('0x'))t['push'](u);a34a('invalid\x20parameter','Guard\x20not\x20found:\x20'+t['join'](',\x20'));}return{'op':'remove','result':await c['removeFromGuardList'](b,r)};}case'get':return{'op':'get','result':await c['getGuardList'](b)};default:throw new MessengerError('INVALID_INPUT','guardlist.unknown\x20op:\x20'+a);}}async function settings(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','settings.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'get':return{'op':'get','result':await c['getSettings'](b)};case'set':{const d={};if(a['allowStrangerMessages']!==void 0x0)d['allowStrangerMessages']=a['allowStrangerMessages'];if(a['maxInboxSize']!==void 0x0)d['maxInboxSize']=a['maxInboxSize'];return{'op':'set','result':await c['setSettings'](b,d)};}default:throw new MessengerError('INVALID_INPUT','settings.unknown\x20op:\x20'+a);}}export{watch_messages as C,watch_conversations as S,MessengerManager as T,send_file as _,extract_zip_messages as a,sign_wts as b,getMessengerManager as c,mark_conversation_as_viewed as d,mark_messages_as_viewed as f,search_messages as g,pull_messages as h,extractZipFromPlaintext as i,get_attachment as l,proof_message as m,emergency_pull as n,friendslist as o,peer_registered as p,export_attachment as r,generate_wts as s,blacklist as t,guardlist as u,send_message as v,wts2html as w,verify_wts as x,settings as y};
|
|
1
|
+
import{o as a34a}from'./exception-CSVNDnxf.mjs';import'./network-UpRYD8EM.mjs';import{ct as a34b}from'./common-CWx5RgBw.mjs';import{getWowokWorkspaceDir}from'./w/local/util.mjs';import{LocalMark}from'./w/local/local.mjs';import{r as a34c}from'./logger-Da7dKX2V.mjs';import{Account}from'./w/local/account.mjs';import{Bn as a34d,Et as a34e,Rn as a34f,Vn as a34g,h as a34h,jn as a34i,p as a34j,zn as a34k}from'./util-DpsaFX5J.mjs';import{MessageStorage,MessengerPersistStorage}from'./w/messenger/storage.mjs';import{DEFAULT_MESSENGER_CONFIG,MAX_QUERY_LIMIT,MessengerError,WTS_SCHEMA_URL}from'./w/messenger/types.mjs';import{t as a34l}from'./messenger-DHE08OC4.mjs';import{generateNonce,hashPlaintext,verifyFalcon512Signature,verifySingleMerkleRoot}from'./w/messenger/crypto.mjs';import{parseReplyPlaintext}from'./w/messenger/reply.mjs';import{parseAttachmentEnvelope,presentMessageForRead,presentMessagesForRead,sanitizeFileName}from'./w/messenger/attachment.mjs';import{canonicalizeJson,messagePreviewText}from'./w/messenger/utils.mjs';import*as a34m from'path';import*as a34n from'fs';import{createHash}from'crypto';const logger$1=a34c('messenger:manager'),MAX_ACCOUNTS=0x14,sleep=a=>new Promise(b=>setTimeout(b,a)),MESSENGER_INIT_SPACING_MS=0x3e8;var MessengerManager=class{constructor(a){this['accounts']=new Map(),this['messageListeners']=new Set(),this['isWatching']=![],this['accountRefreshTimer']=null,this['pollingLockedAccounts']=new Set(),this['emergencyAccounts']=new Set(),this['lastInitCompletedAt']=0x0,this['config']={...DEFAULT_MESSENGER_CONFIG,...a?.['messengerConfig']},this['instanceId']=a?.['instanceId']||'default',this['persistStorage']=new MessengerPersistStorage();}['findAccount'](a){return this['accounts']['get'](a['toLowerCase']());}['getConfig'](){return this['config'];}['get_accounts'](){return Array['from'](this['accounts']['values']())['map'](a=>a['address']);}async['pullAllAccounts'](a){const b=a?.['accounts']?.['length']?new Set(a['accounts']['map'](j=>j['toLowerCase']())):void 0x0,c=[];if(b)for(const j of b){if(this['pollingLockedAccounts']['has'](j))continue;try{await this['ensureAccountReady'](j);}catch(k){c['push']({'account':j,'pulled':0x0,'messages':[],'error':k instanceof Error?k['message']:String(k)});}}const d=[...this['pollingLockedAccounts']]['filter'](l=>!b||b['has'](l)),e=new Set(c['map'](l=>l['account'])),f=Math['max'](0x1,a?.['concurrency']??0x5),g=[...c];let h=0x0;const i=async()=>{while(h<d['length']){const l=d[h++];if(e['has'](l))continue;const m=this['accounts']['get'](l);if(!m?.['initialized']){g['push']({'account':l,'pulled':0x0,'messages':[],'error':'Account\x20is\x20not\x20initialized\x20in\x20this\x20process'});continue;}try{const n=await m['messenger']['pullMessages'](a?.['limit']),o=new MessageStorage(l),p=n['messages']['map'](q=>{return presentMessageForRead(o['getMessageById'](q['id'])??q);});g['push']({'account':l,'pulled':p['length'],'messages':p});}catch(q){g['push']({'account':l,'pulled':0x0,'messages':[],'error':q instanceof Error?q['message']:String(q)});}}};return await Promise['all'](Array['from']({'length':Math['min'](f,d['length'])},()=>i())),g['sort']((l,m)=>l['account']['localeCompare'](m['account'])),g;}async['refresh_accounts'](){const {Account:a}=await import('./w/local/account.mjs'),b=await a['Instance']()['list_messenger_accounts'](),c=new Set(this['accounts']['keys']()),d=new Set(b['map'](e=>e['address']['toLowerCase']()));for(const e of c)if(!d['has'](e))this['remove_account_internal'](e);for(const f of b){const g=f['address']['toLowerCase']();if(!this['accounts']['has'](g))try{await this['add_account_internal'](f['address']);}catch(h){}}if(this['accounts']['size']>0x0&&!this['isWatching'])this['startPolling']();else{if(this['accounts']['size']===0x0&&this['isWatching'])this['stopPolling']();}await this['syncAllContactLists']();}async['start'](){await this['refresh_accounts']();for(const a of this['accounts']['values']()){if(!a['initialized']||!a['messenger'])continue;this['persistStorage']['tryAcquirePollingLock'](a['address'],this['instanceId'])&&(this['pollingLockedAccounts']['add'](a['address']['toLowerCase']()),a['messenger']['setOnMessageCallback'](b=>{for(const c of this['messageListeners'])c(b);}));}if(!this['isWatching'])this['startPolling']();if(this['accountRefreshTimer'])clearInterval(this['accountRefreshTimer']);this['accountRefreshTimer']=setInterval(()=>{this['refresh_accounts']()['catch'](b=>{});},this['config']['watch_interval_ms']);}['stop'](){this['accountRefreshTimer']&&(clearInterval(this['accountRefreshTimer']),this['accountRefreshTimer']=null);for(const a of this['pollingLockedAccounts'])this['persistStorage']['releasePollingLock'](a,this['instanceId']);this['pollingLockedAccounts']['clear'](),this['stopPolling'](),this['clear_accounts']();}async['ensureAccountReady'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c?.['initialized'])return c;if(c?.['initializing']){await c['initializing'];const d=this['accounts']['get'](b);if(d?.['initialized'])return d;throw new MessengerError('SERVER_ERROR','Account\x20'+a+'\x20initialization\x20failed');}return this['initializeAccount'](b);}async['isPeerRegistered'](a,b){const {Account:c}=await import('./w/local/account.mjs'),d=await c['Instance']()['get'](a,![]);if(!d)throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20'+a+'\x20not\x20found');if(!d['messenger'])throw new MessengerError('ACCOUNT_MESSENGER_NOT_ENABLED','Account\x20'+a+'\x20messenger\x20not\x20enabled');return(await this['ensureAccountReady'](a))['messenger']['isPeerRegistered'](b);}async['setEmergencyAccounts'](a){const b=new Set((a??[])['map'](f=>f['toLowerCase']())),c=[],d=[];for(const f of b){if(this['emergencyAccounts']['has'](f))continue;try{(await this['ensureAccountReady'](f))['messenger']['triggerEmergencyPull'](),this['emergencyAccounts']['add'](f),c['push'](f);}catch(g){logger$1['error']('Emergency\x20arm\x20failed\x20for\x20account\x20'+f+':',g),d['push']({'account':f,'error':g instanceof Error?g['message']:String(g)});}}const e=[];for(const h of[...this['emergencyAccounts']]){if(b['has'](h))continue;this['accounts']['get'](h)?.['messenger']['stopEmergencyPull'](),this['emergencyAccounts']['delete'](h),e['push'](h);}return{'active':[...this['emergencyAccounts']]['sort'](),'added':c,'removed':e,'failed':d};}async['initializeAccount'](a){const b=a['toLowerCase']();if(this['accounts']['size']>=MAX_ACCOUNTS)throw new MessengerError('INVALID_INPUT','Maximum\x20'+MAX_ACCOUNTS+'\x20accounts\x20allowed');const c=this['doInitialize'](b),d={'address':b,'messenger':null,'initialized':![],'initializing':c,'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}};this['accounts']['set'](b,d);try{await c;const e=this['accounts']['get'](b);if(!e||!e['initialized'])throw new MessengerError('SERVER_ERROR','Account\x20'+a+'\x20initialization\x20failed');return e;}catch(f){this['accounts']['delete'](b);throw f;}}async['doInitialize'](a){const b=new a34l(a,this['config']);try{await b['initialize']();}catch(d){throw new MessengerError('SERVER_ERROR','Failed\x20to\x20initialize\x20account\x20'+a+':\x20'+(d instanceof Error?d['message']:String(d)));}const c=Date['now']()-this['lastInitCompletedAt'];if(c<MESSENGER_INIT_SPACING_MS)await sleep(MESSENGER_INIT_SPACING_MS-c);this['lastInitCompletedAt']=Date['now'](),this['accounts']['set'](a,{'address':a,'messenger':b,'initialized':!![],'contactLists':{'friends':[],'guards':[],'lastUpdatedAt':0x0}});this['isWatching']&&(this['persistStorage']['tryAcquirePollingLock'](a,this['instanceId'])&&(this['pollingLockedAccounts']['add'](a),b['setOnMessageCallback'](e=>{for(const f of this['messageListeners'])f(e);})));if(this['emergencyAccounts']['has'](a))b['triggerEmergencyPull']();}async['add_account_internal'](a){await this['ensureAccountReady'](a);}['remove_account_internal'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(!c)return![];if(c['initialized']&&c['messenger'])c['messenger']['disconnect']();return this['persistStorage']['releasePollingLock'](b,this['instanceId']),this['pollingLockedAccounts']['delete'](b),this['emergencyAccounts']['delete'](b),this['accounts']['delete'](b);}['clear_accounts'](){this['stopPolling']();for(const a of this['accounts']['values']())if(a['messenger'])a['messenger']['disconnect']();this['accounts']['clear'](),this['emergencyAccounts']['clear']();}async['send'](a,b,c,d){const {Account:e}=await import('./w/local/account.mjs'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20'+a+'\x20not\x20found');if(!f['messenger']){if(!d?.['enable_messenger'])throw new MessengerError('ACCOUNT_MESSENGER_NOT_ENABLED','Account\x20messenger\x20not\x20enabled.\x20Use\x20enable_messenger\x20parameter\x20to\x20enable\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,!![]);}const g=await this['ensureAccountReady'](a);try{return await g['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force'],'network':d?.['network'],'replyTo':d?.['replyTo']});}catch(h){if(h instanceof MessengerError&&h['code']==='IDENTITY_NOT_FOUND'){const i=h['message']||'',j=a['toLowerCase'](),k=b['toLowerCase'](),l=i['toLowerCase']()['includes'](j);if((i['toLowerCase']()['includes'](k)||i['toLowerCase']()['includes']('recipient')||i['toLowerCase']()['includes']('no\x20signed\x20prekey'))&&!l)throw new MessengerError('IDENTITY_NOT_FOUND','Recipient\x20'+b+'\x20is\x20not\x20registered\x20on\x20the\x20messenger\x20server.\x20Please\x20ask\x20them\x20to\x20enable\x20messenger\x20first.');logger$1['info']('Sender\x20'+a+'\x20not\x20found\x20on\x20server,\x20re-registering...'),await this['reinitializeAccount'](a);const m=this['accounts']['get'](a['toLowerCase']());if(m?.['initialized'])return await m['messenger']['sendMessage'](b,c,{'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force'],'network':d?.['network'],'replyTo':d?.['replyTo']});}throw h;}}async['reinitializeAccount'](a){const b=a['toLowerCase'](),c=this['accounts']['get'](b);if(c){if(c['messenger'])c['messenger']['disconnect']();this['accounts']['delete'](b);}await this['initializeAccount'](b);}async['send_file'](a,b,c,d){const {Account:e}=await import('./w/local/account.mjs'),f=await e['Instance']()['get'](a,![]);if(!f)throw new MessengerError('IDENTITY_NOT_FOUND','Account\x20'+a+'\x20not\x20found');if(!f['messenger']){if(!d?.['enable_messenger'])throw new MessengerError('ACCOUNT_MESSENGER_NOT_ENABLED','Account\x20messenger\x20not\x20enabled.\x20Use\x20enable_messenger\x20parameter\x20to\x20enable\x20it\x20automatically.');await e['Instance']()['set_messenger'](a,!![]);}const g=await this['ensureAccountReady'](a),h={'fileName':d?.['fileName'],'contentType':d?.['contentType'],'kind':d?.['kind'],'mimeType':d?.['mimeType'],'caption':d?.['caption'],'durationMs':d?.['durationMs'],'width':d?.['width'],'height':d?.['height'],'guardAddress':d?.['guardAddress'],'passportAddress':d?.['passportAddress'],'force':d?.['force'],'network':d?.['network']};try{return await g['messenger']['sendZipFile'](b,c,h);}catch(i){if(i instanceof MessengerError&&i['code']==='IDENTITY_NOT_FOUND'){const j=i['message']||'',k=a['toLowerCase'](),l=b['toLowerCase'](),m=j['toLowerCase']()['includes'](k);if((j['toLowerCase']()['includes'](l)||j['toLowerCase']()['includes']('recipient')||j['toLowerCase']()['includes']('no\x20signed\x20prekey'))&&!m)throw new MessengerError('IDENTITY_NOT_FOUND','Recipient\x20'+b+'\x20is\x20not\x20registered\x20on\x20the\x20messenger\x20server.\x20Please\x20ask\x20them\x20to\x20enable\x20messenger\x20first.');logger$1['info']('Sender\x20'+a+'\x20not\x20found\x20on\x20server,\x20re-registering...'),await this['reinitializeAccount'](a);const n=this['accounts']['get'](a['toLowerCase']());if(n?.['initialized'])return await n['messenger']['sendZipFile'](b,c,h);}throw i;}}async['queryMessages'](a){let b=[];const c=a?.['peerAddress']!==void 0x0?await a34j(a['peerAddress']):void 0x0;if(a?.['account']!==void 0x0){const f=a['account']['toLowerCase'](),g=this['accounts']['get'](f);if(g?.['messenger']){const k=g['messenger']['pullMessages']();if(a?.['sync']!==![])await k;else k['catch'](()=>{});}const h=new MessageStorage(f),i=a['beforeCreatedAt']!==void 0x0&&a['beforeMessageId']?{'createdAt':a['beforeCreatedAt'],'messageId':a['beforeMessageId']}:void 0x0,j=c!==void 0x0&&a['limit']!==void 0x0&&a['offset']===void 0x0&&(a['beforeCreatedAt']===void 0x0||a['beforeMessageId']!==void 0x0&&i!==void 0x0);if(c&&j)b=h['getRecentMessagesBySession'](f,c,a['limit'],i);else{if(c)b=h['getMessagesBySession'](f,c);else b=h['getAllMessages'](f);}}else for(const l of this['accounts']['values']()){if(l['messenger']){const n=l['messenger']['pullMessages']();if(a?.['sync']!==![])await n;else n['catch'](()=>{});}const m=new MessageStorage(l['address']);if(c){const o=m['getMessagesBySession'](l['address'],c);b['push'](...o);}else{const p=m['getAllMessages'](l['address']);b['push'](...p);}}if(a){const q=c;b=b['filter'](r=>{const s=a?.['account']!==void 0x0?a['account']['toLowerCase']():void 0x0;if(s!==void 0x0){const u=r['fromAddress']['toLowerCase'](),v=r['toAddress']['toLowerCase']();if(u!==s&&v!==s)return![];}if(a['direction']&&r['direction']!==a['direction'])return![];if(a['status']&&r['status']!==a['status'])return![];if(a['msgType']!==void 0x0&&r['msgType']!==a['msgType'])return![];if(a['contentType'])switch(a['contentType']){case'text':if(r['msgType']!==0x1)return![];break;case'zip':if(!r['zipMetadata'])return![];break;case'wts':if(!r['zipMetadata']||r['zipMetadata']?.['contentType']!=='wts')return![];break;case'wip':if(!r['zipMetadata']||r['zipMetadata']?.['contentType']!=='wip')return![];break;}if(a['peerAddress']&&q){const w=q['toLowerCase'](),x=r['fromAddress']['toLowerCase'](),y=r['toAddress']['toLowerCase']();if(s!==void 0x0&&w===s){if(x!==s||y!==s)return![];}else{if(s!==void 0x0&&!(x===s&&y===w||x===w&&y===s))return![];else{if(s===void 0x0&&x!==w&&y!==w)return![];}}}const t=a['timeField']||'createdAt';if(a['startTime']!==void 0x0||a['endTime']!==void 0x0){const z=r[t];if(z!==void 0x0){if(a['startTime']!==void 0x0&&z<a['startTime'])return![];if(a['endTime']!==void 0x0&&z>a['endTime'])return![];}}if(a['createdAtStart']!==void 0x0&&r['createdAt']<a['createdAtStart'])return![];if(a['createdAtEnd']!==void 0x0&&r['createdAt']>a['createdAtEnd'])return![];if(a['receivedAtStart']!==void 0x0){if(r['receivedAt']===void 0x0||r['receivedAt']<a['receivedAtStart'])return![];}if(a['receivedAtEnd']!==void 0x0){if(r['receivedAt']===void 0x0||r['receivedAt']>a['receivedAtEnd'])return![];}if(a['serverTimestampStart']!==void 0x0){if(r['serverTimestamp']===void 0x0||r['serverTimestamp']<a['serverTimestampStart'])return![];}if(a['serverTimestampEnd']!==void 0x0){if(r['serverTimestamp']===void 0x0||r['serverTimestamp']>a['serverTimestampEnd'])return![];}if(a['decryptedOnly']&&!r['plaintext'])return![];if(a['confirmedOnly']&&r['status']!=='confirmed')return![];if(a['arkConfirmedOnly']){if(!r['arkConfirmed'])return![];}if(a['proofedOnly']){if(!r['proof'])return![];}if(a['arkTimestampStart']!==void 0x0){if(r['arkConfirmed']===void 0x0||r['arkConfirmed']['timestamp']<a['arkTimestampStart'])return![];}if(a['arkTimestampEnd']!==void 0x0){if(r['arkConfirmed']===void 0x0||r['arkConfirmed']['timestamp']>a['arkTimestampEnd'])return![];}if(a['hasLastReceivedIndexOnly']){if(r['lastReceivedLeafIndex']===void 0x0||r['lastReceivedLeafIndex']===null)return![];}if(a['lastReceivedIndexMin']!==void 0x0){if(r['lastReceivedLeafIndex']===void 0x0||r['lastReceivedLeafIndex']<a['lastReceivedIndexMin'])return![];}if(a['lastReceivedIndexMax']!==void 0x0){if(r['lastReceivedLeafIndex']===void 0x0||r['lastReceivedLeafIndex']>a['lastReceivedIndexMax'])return![];}if(a['keyword']&&r['plaintext']){if(!r['plaintext']['toLowerCase']()['includes'](a['keyword']['toLowerCase']()))return![];}if(a['listFilterMode']&&a['listFilterMode']!=='any'){const A=this['findAccount'](r['toAddress']);if(!A)return![];const B=r['fromAddress']['toLowerCase'](),C=A['contactLists'],D=new Set(C['friends']['map'](I=>I['toLowerCase']())),E=new Set(C['guards']['map'](I=>I['guardAddress']['toLowerCase']())),F=D['has'](B),G=E['has'](B),H=!F&&!G;switch(a['listFilterMode']){case'friends':if(!F)return![];break;case'guard':if(!G)return![];break;case'stranger':if(!H)return![];break;}if(a['customListFilter']){const {includeAddresses:I,excludeAddresses:J,relation:relation='union'}=a['customListFilter'];if(J){if(new Set(J['map'](K=>K['toLowerCase']()))['has'](B))return![];}if(I&&I['length']>0x0){const K=new Set(I['map'](L=>L['toLowerCase']()))['has'](B);if(relation==='union'){const L=a['listFilterMode']==='friends'&&F||a['listFilterMode']==='guard'&&G||a['listFilterMode']==='stranger'&&H;if(!K&&!L)return![];}else{if(!K)return![];}}}}if(a['viewed']!==void 0x0){const M=r['viewedAt']!==void 0x0;if(a['viewed']!==M)return![];}if(a['viewedAtStart']!==void 0x0){if(r['viewedAt']===void 0x0||r['viewedAt']<a['viewedAtStart'])return![];}if(a['viewedAtEnd']!==void 0x0){if(r['viewedAt']===void 0x0||r['viewedAt']>a['viewedAtEnd'])return![];}return!![];});}const d=a?.['sortOrder']??'desc',e=a?.['timeField']||'createdAt';b['sort']((r,s)=>{const t=r[e]||0x0,u=s[e]||0x0;return d==='asc'?t-u:u-t;});if(b['some'](r=>r['plaintext']!==void 0x0||r['zipMetadata']))b=presentMessagesForRead(b,{'includeAttachmentPayload':a?.['includeAttachmentPayload']});return b;}async['watch'](a){const b=await this['queryMessages'](a),c=this['config']['defaultQueryLimit']??0x32,d=Math['min'](a?.['limit']??c,MAX_QUERY_LIMIT),e=a?.['offset']??0x0;return b['slice'](e,e+d);}['startPolling'](){if(this['isWatching'])return;this['isWatching']=!![];}['stopPolling'](){this['isWatching']=![];}['onMessage'](a){this['messageListeners']['add'](a);}['offMessage'](a){this['messageListeners']['delete'](a);}['destroy'](){this['stop'](),this['messageListeners']['clear']();}async['syncContactLists'](a){const b=this['findAccount'](a);if(!b)return{'success':![],'friends':[],'guards':[],'error':'Account\x20not\x20found:\x20'+a};try{const [c,d]=await Promise['all']([b['messenger']['getFriendsList'](),b['messenger']['getGuardList']()]),e=d['currentGuardList']||[];return b['contactLists']={'friends':c,'guards':e,'lastUpdatedAt':Date['now']()},{'success':!![],'friends':c,'guards':e};}catch(f){return{'success':![],'friends':b['contactLists']['friends'],'guards':b['contactLists']['guards'],'error':f instanceof Error?f['message']:String(f)};}}async['syncAllContactLists'](){const a=new Map();for(const b of this['accounts']['values']()){const c=await this['syncContactLists'](b['address']);a['set'](b['address'],c);}return a;}['getContactLists'](a){return this['findAccount'](a)?.['contactLists'];}['setContactLists'](a,b){const c=this['findAccount'](a);if(!c)return![];return c['contactLists']={...c['contactLists'],...b,'lastUpdatedAt':Date['now']()},!![];}['isStranger'](a,b){const c=this['findAccount'](a);if(!c)return!![];const d=b['toLowerCase'](),e=c['contactLists'],f=e['friends']['some'](h=>h['toLowerCase']()===d),g=e['guards']['some'](h=>h['guardAddress']['toLowerCase']()===d);return!f&&!g;}['recordGuardSender'](a,b){const c=this['findAccount'](a);if(!c)return![];const d=b['toLowerCase']();return!c['contactLists']['guards']['some'](e=>e['guardAddress']['toLowerCase']()===d)&&(c['contactLists']['guards']['push']({'guardAddress':b,'passportValiditySeconds':0x15180}),c['contactLists']['lastUpdatedAt']=Date['now']()),!![];}['generateNonce'](){return generateNonce();}async['watch_paginated'](a){const b=await this['queryMessages'](a),c=this['config']['defaultQueryLimit']??0x32,d=Math['min'](a?.['limit']??c,MAX_QUERY_LIMIT),e=a?.['offset']??0x0;return{'messages':b['slice'](e,e+d),'total':b['length'],'offset':e,'limit':d};}async['get_conversations'](a){const b=a?{'account':a}:void 0x0,c=await this['queryMessages'](b),d=new Map();for(const e of c){const f=e['fromAddress']['toLowerCase'](),g=e['toAddress']['toLowerCase'](),h=a?.['toLowerCase'](),i=h!==void 0x0?h:this['findAccount'](e['fromAddress'])?f:this['findAccount'](e['toAddress'])?g:void 0x0;if(i===void 0x0)continue;const j=f===i?e['toAddress']:e['fromAddress'];if(!d['has'](j))d['set'](j,{'peerAddress':j,'lastMessageAt':e['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':messagePreviewText(e)});const k=d['get'](j);k['messageCount']++;e['createdAt']>k['lastMessageAt']&&(k['lastMessageAt']=e['createdAt'],k['lastMessagePreview']=messagePreviewText(e));if(e['status']!=='read'&&g===i)k['unreadCount']++;}return Array['from'](d['values']())['sort']((l,m)=>m['lastMessageAt']-l['lastMessageAt']);}async['generate_wts'](a,b,c,d,e){const f=await import('fs'),g=await import('path'),h=b['toLowerCase'](),k=c['toLowerCase']();let l=new MessageStorage(h)['getMessagesBySession'](h,k)['filter'](u=>u['leafIndex']!==void 0x0&&u['serverTimestamp']!==void 0x0)['sort']((u,v)=>{const w=u['serverTimestamp']-v['serverTimestamp'];if(w!==0x0)return w;return u['leafIndex']-v['leafIndex'];});if(d)switch(d['type']){case'time':{const u=Math['min'](d['start'],d['end']),v=Math['max'](d['start'],d['end']);l=l['filter'](w=>w['createdAt']>=u&&w['createdAt']<=v);break;}case'messageId':{const w=l['findIndex'](A=>A['messageId']===d['start']),x=l['findIndex'](A=>A['messageId']===d['end']);if(w===-0x1||x===-0x1)throw new MessengerError('INVALID_INPUT','Range\x20endpoint\x20not\x20found\x20in\x20this\x20conversation:\x20'+(w===-0x1?d['start']:d['end']));const y=Math['min'](w,x),z=Math['max'](w,x);l=l['slice'](y,z+0x1);break;}case'seqIndex':{const A=Math['min'](d['start'],d['end']),B=Math['max'](d['start'],d['end']);l=l['filter'](C=>C['leafIndex']>=A&&C['leafIndex']<=B);break;}}if(l['length']===0x0)throw new MessengerError('INVALID_INPUT','No\x20messages\x20found\x20for\x20the\x20given\x20criteria');const m=l['map'](C=>C['leafIndex'])['filter'](C=>C!==void 0x0)['sort']((C,D)=>C-D),n=[];for(let C=0x1;C<m['length'];C++){const D=m[C-0x1]+0x1,E=m[C];if(E!==D){for(let F=D;F<E;F++)n['push'](F);}}if(n['length']>0x0){}if(l['length']>0x1f4)throw new MessengerError('INVALID_INPUT','Message\x20count\x20('+l['length']+')\x20exceeds\x20maximum\x20allowed\x20(500)');if(!f['existsSync'](a))f['mkdirSync'](a,{'recursive':!![]});const o=h['slice'](0x0,0x6)+'_'+k['slice'](0x0,0x6),p=[];let q=[];for(let G=0x0;G<l['length'];G++){const H=l[G];if(q['length']===0x0)q['push'](H);else{const I=q[q['length']-0x1]['leafIndex']+0x1;if(q['length']>=0x1f4||H['leafIndex']!==I)p['push'](q),q=[H];else q['push'](H);}}if(q['length']>0x0)p['push'](q);p['forEach']((J,K)=>{J['map'](L=>L['leafIndex'])['join'](',\x20');});const r=[];for(const J of p){const K=J['map'](a2=>a2['leafIndex'])['filter'](a2=>a2!==void 0x0),L=Math['min'](...K),M=Math['max'](...K),N=J[0x0]['createdAt'],O=J[J['length']-0x1]['createdAt'];for(const a2 of J){if(a2['serverTimestamp']===void 0x0)throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20serverTimestamp');if(a2['leafIndex']===void 0x0)throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20leafIndex');if(!a2['prevRoot'])throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20prevRoot');if(!a2['newRoot'])throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20newRoot');if(!a2['serverSignature'])throw new MessengerError('INVALID_INPUT','Message\x20'+a2['messageId']+'\x20missing\x20serverSignature');}const P=J['map'](a3=>{const a4={'id':a3['messageId'],'from':a3['fromAddress'],'to':a3['toAddress'],'plaintextHash':a3['plaintextHash'],'clientTimestamp':a3['createdAt'],'timestamp':a3['serverTimestamp'],'leafIndex':a3['leafIndex'],'prevRoot':a3['prevRoot'],'merkleRoot':a3['newRoot'],'serverSignature':a3['serverSignature'],'serverPublicKeyIndex':0x0,'msgType':a3['msgType']};if(!e&&a3['plaintext']!==void 0x0)a4['plaintext']=a3['plaintext'];if(a3['guardAddress']!==void 0x0)a4['guardAddress']=a3['guardAddress'];if(a3['passportAddress']!==void 0x0)a4['passportAddress']=a3['passportAddress'];if(a3['arkConfirmed']!==void 0x0)a4['arkConfirmed']={'recipient':a3['arkConfirmed']['recipient'],'recipientPublicKey':a3['arkConfirmed']['recipientPublicKey'],'signature':a3['arkConfirmed']['signature'],'timestamp':a3['arkConfirmed']['timestamp']};if(a3['zipMetadata']!==void 0x0)a4['zipMetadata']=a3['zipMetadata'];if(a3['lastReceivedLeafIndex']!==void 0x0&&a3['lastReceivedLeafIndex']!==-0x1)a4['lastReceivedLeafIndex']=a3['lastReceivedLeafIndex'];return a4;}),Q=[h,k]['sort'](),R={'id':o+'_'+L+'-'+M,'participants':Q},S=[],T=new Map();for(const a3 of P){const a4=J['find'](a6=>a6['messageId']===a3['id'])?.['serverPublicKey']||'';if(!a4)continue;let a5=T['get'](a4);a5===void 0x0&&(a5=S['length'],T['set'](a4,a5),S['push']({'publicKey':a4,'validFrom':0x0})),a3['serverPublicKeyIndex']=a5;}const U={'session':R,'messages':P},{sha256:V}=await import('@noble/hashes/sha2.js'),{bytesToHex:W}=await import('@noble/hashes/utils.js'),X={'wts':WTS_SCHEMA_URL,...U},Y=W(V(new TextEncoder()['encode'](canonicalizeJson(X)))),Z={'wts':WTS_SCHEMA_URL,'payload':U,'meta':{'type':'wts','version':'1.0','created':new Date()['toISOString'](),'hash':Y,'algorithm':'sha256','startTime':N,'endTime':O,'messageCount':P['length'],'merkleRoot':P[P['length']-0x1]['merkleRoot'],'creator':h,'participant':k,'serverPublicKeys':S}},a0=o+'_'+L+'-'+M+'.wts',a1=g['join'](a,a0);f['writeFileSync'](a1,JSON['stringify'](Z,null,0x2)),r['push'](a1);}const s=l[0x0]?.['createdAt']||0x0,t=l[l['length']-0x1]?.['createdAt']||0x0;return{'files':r,'totalMessageCount':l['length'],'timeRange':{'start':s,'end':t}};}async['addToBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToBlacklist'](b);}async['removeFromBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromBlacklist'](b);}async['clearBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearBlacklist']();}async['getBlacklist'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getBlacklist']();}async['existInBlacklist'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInBlacklist'](b);}async['addToFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToFriendsList'](b);}async['removeFromFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromFriendsList'](b);}async['clearFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['clearFriendsList']();}async['getFriendsList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getFriendsList']();}async['existInFriendsList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['existInFriendsList'](b);}async['addToGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['addToGuardList'](b);}async['removeFromGuardList'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['removeFromGuardList'](b);}async['getGuardList'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getGuardList']();}async['getSettings'](a){const b=this['findAccount'](a);if(!b)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return b['messenger']['getSettings']();}async['setSettings'](a,b){const c=this['findAccount'](a);if(!c)throw new MessengerError('ACCOUNT_NOT_FOUND','Account\x20'+a+'\x20not\x20in\x20managed\x20accounts');return c['messenger']['setSettings'](b);}};const GUARD_NETWORK='mainnet';async function lookupGuardRequirements(a,b){try{const c=await a34i({'account':a,'network':GUARD_NETWORK},b);return{'required':new Set(c['submission']['filter'](d=>(d['submission']?.['length']??0x0)>0x0)['map'](d=>String(d['guard'])['toLowerCase']())),'raw':c['submission']};}catch{return;}}function pickReusableGuard(a,b,c){const d=new Set(b['map'](f=>f['toLowerCase']())),e=new Set((a['submissionGuards']??[])['map'](f=>f['toLowerCase']()));for(const f of a['guards'])if(d['has'](f)&&!c['has'](f))return f;for(const h of a['guards'])if(d['has'](h)&&e['has'](h))return h;}async function smartSendResolve(a,b,c,d){const e=await lookupGuardRequirements(a,b),{passport:f,stale:g}=a34d(a,GUARD_NETWORK,b);if(f){if(e){const h=pickReusableGuard(f,b,e['required']);if(h)return{'kind':'resend','guardAddress':h,'passportAddress':f['id'],'network':GUARD_NETWORK};a34g(a['toLowerCase'](),f['id']);}}if(d['authorize']){const i={'account':a,'network':GUARD_NETWORK},j=e?e['raw']:(await a34i(i,b))['submission'];if(j['length']>0x0)return{'kind':'auth_required','result':buildGuardAuthRequired(b,GUARD_NETWORK,'no_local_passport',void 0x0,j)};const k=a34k(await a34f(i,{'type':'submission','guard':b['map'](l=>({'object':l,'impack':!![]})),'submission':[]}));if(!k)throw new Error('Passport\x20transaction\x20succeeded\x20but\x20the\x20created\x20Passport\x20object\x20could\x20not\x20be\x20resolved\x20from\x20objectChanges');return{'kind':'resend','guardAddress':b[0x0],'passportAddress':k,'network':GUARD_NETWORK};}return{'kind':'auth_required','result':buildGuardAuthRequired(b,GUARD_NETWORK,g?'local_passport_stale':'no_local_passport',void 0x0,e?.['raw'])};}function buildGuardAuthRequired(a,b,c,d,e){return{'authRequired':!![],'status':'guard_authorization_required','guardList':a,'network':b,'reason':c,'hint':'This\x20recipient\x20accepts\x20non-friend\x20messages\x20only\x20through\x20guard\x20verification\x20—\x20no\x20free\x20stranger\x20quota\x20while\x20guards\x20are\x20configured.\x20Authorize\x20to\x20obtain\x20a\x20Passport\x20via\x20their\x20guard\x20(one\x20gas-consuming\x20transaction)\x20and\x20the\x20message\x20is\x20resent\x20automatically.\x20Once\x20the\x20recipient\x20replies,\x20they\x20are\x20added\x20as\x20a\x20friend\x20and\x20future\x20messages\x20need\x20no\x20verification.','serverError':d,'submissions':e};}function escapeHtml(a){if(!a)return'';return a['replace'](/&/g,'&')['replace'](/</g,'<')['replace'](/>/g,'>')['replace'](/"/g,'"')['replace'](/'/g,''');}function formatFileSize(a){if(a<0x400)return a+'\x20B';if(a<0x400*0x400)return(a/0x400)['toFixed'](0x1)+'\x20KB';return(a/(0x400*0x400))['toFixed'](0x1)+'\x20MB';}function isNonTextMessage(a){return!!a['zipMetadata'];}function getFileTypeLabel(a){if(a['zipMetadata']?.['contentType'])return a['zipMetadata']['contentType']['toUpperCase']();const b=a['zipMetadata']?.['fileName']||'';if(b['endsWith']('.wts'))return'WTS';if(b['endsWith']('.wip'))return'WIP';if(b['endsWith']('.zip'))return'ZIP';if(b['endsWith']('.json'))return'JSON';if(b['endsWith']('.txt'))return'TXT';if(a['zipMetadata'])return'ZIP';return'FILE';}function getThemeColors(a){return{'bgColor':a==='dark'?'#1a1a1a':'#ffffff','textColor':a==='dark'?'#e0e0e0':'#333333','borderColor':a==='dark'?'#444444':'#e0e0e0'};}function getMessageColors(a,b){if(b)return{'bgColor':a==='dark'?'#1a365d':'#e3f2fd','borderColor':a==='dark'?'#3b82f6':'#90caf9'};else return{'bgColor':a==='dark'?'#1e3a2f':'#e8f5e9','borderColor':a==='dark'?'#10b981':'#a5d6a7'};}function generateFileButton(a,b,c){if(!a['plaintext']||!a['zipMetadata']?.['fileName'])return'';const d=a['zipMetadata']['fileName'],e=a['plaintext'],f=a['zipMetadata']['fileSize']||0x0,g=getFileTypeLabel(a),h=c==='dark'?'#2a3f2a':'#e8f5e9',i=c==='dark'?'#4caf50':'#4caf50',j=c==='dark'?'#81c784':'#2e7d32',k='#4caf50';return'\x0a\x09\x09<div\x20style=\x22margin:\x2012px\x200;\x20padding:\x2016px;\x20background:\x20'+h+';\x20border:\x201px\x20solid\x20'+i+';\x20border-radius:\x208px;\x20text-align:\x20center;\x22>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2014px;\x20color:\x20'+j+';\x20margin-bottom:\x208px;\x22>\x0a\x09\x09\x09\x09📎\x20'+escapeHtml(g)+'\x20File\x0a\x09\x09\x09\x09<span\x20style=\x22font-size:\x2012px;\x20color:\x20#666;\x22>('+formatFileSize(f)+')</span>\x0a\x09\x09\x09</div>\x0a\x09\x09\x09<button\x20\x0a\x09\x09\x09\x09onclick=\x22saveFile'+b+'()\x22\x0a\x09\x09\x09\x09style=\x22padding:\x2010px\x2024px;\x20background:\x20'+k+';\x20color:\x20white;\x20border:\x20none;\x20border-radius:\x204px;\x20cursor:\x20pointer;\x20font-size:\x2014px;\x22\x0a\x09\x09\x09\x09onmouseover=\x22this.style.background=\x27#45a049\x27\x22\x0a\x09\x09\x09\x09onmouseout=\x22this.style.background=\x27'+k+'\x27\x22\x0a\x09\x09\x09>\x0a\x09\x09\x09\x09💾\x20Save\x20'+escapeHtml(d)+'\x0a\x09\x09\x09</button>\x0a\x09\x09</div>\x0a\x09\x09<script>\x0a\x09\x09\x09function\x20saveFile'+b+'()\x20{\x0a\x09\x09\x09\x09try\x20{\x0a\x09\x09\x09\x09\x09const\x20base64Data\x20=\x20'+JSON['stringify'](e)+';\x0a\x09\x09\x09\x09\x09const\x20byteCharacters\x20=\x20atob(base64Data);\x0a\x09\x09\x09\x09\x09const\x20byteNumbers\x20=\x20new\x20Array(byteCharacters.length);\x0a\x09\x09\x09\x09\x09for\x20(let\x20i\x20=\x200;\x20i\x20<\x20byteCharacters.length;\x20i++)\x20{\x0a\x09\x09\x09\x09\x09\x09byteNumbers[i]\x20=\x20byteCharacters.charCodeAt(i);\x0a\x09\x09\x09\x09\x09}\x0a\x09\x09\x09\x09\x09const\x20byteArray\x20=\x20new\x20Uint8Array(byteNumbers);\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09let\x20mimeType\x20=\x20\x22application/octet-stream\x22;\x0a\x09\x09\x09\x09\x09const\x20fileName\x20=\x20'+JSON['stringify'](d)+';\x0a\x09\x09\x09\x09\x09if\x20(fileName.endsWith(\x27.json\x27))\x20mimeType\x20=\x20\x22application/json\x22;\x0a\x09\x09\x09\x09\x09else\x20if\x20(fileName.endsWith(\x27.zip\x27))\x20mimeType\x20=\x20\x22application/zip\x22;\x0a\x09\x09\x09\x09\x09else\x20if\x20(fileName.endsWith(\x27.txt\x27))\x20mimeType\x20=\x20\x22text/plain\x22;\x0a\x09\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09const\x20blob\x20=\x20new\x20Blob([byteArray],\x20{\x20type:\x20mimeType\x20});\x0a\x09\x09\x09\x09\x09const\x20url\x20=\x20URL.createObjectURL(blob);\x0a\x09\x09\x09\x09\x09const\x20a\x20=\x20document.createElement(\x22a\x22);\x0a\x09\x09\x09\x09\x09a.href\x20=\x20url;\x0a\x09\x09\x09\x09\x09a.download\x20=\x20fileName;\x0a\x09\x09\x09\x09\x09document.body.appendChild(a);\x0a\x09\x09\x09\x09\x09a.click();\x0a\x09\x09\x09\x09\x09document.body.removeChild(a);\x0a\x09\x09\x09\x09\x09URL.revokeObjectURL(url);\x0a\x09\x09\x09\x09}\x20catch\x20(e)\x20{\x0a\x09\x09\x09\x09\x09alert(\x27保存文件失败:\x20\x27\x20+\x20e.message);\x0a\x09\x09\x09\x09}\x0a\x09\x09\x09}\x0a\x09\x09</script>\x0a\x09';}function generateReplyQuoteHtml(a,b){if(!a['plaintext'])return'';const c=parseReplyPlaintext(a['plaintext'])['replyTo'];if(!c)return'';const {theme:d}=b,e=b['payload']['messages']['find'](j=>j['id']===c['messageId']),f=d==='dark'?'#2b2b2b':'#f5f5f5';if(!e)return'\x0a\x09\x09\x09<div\x20style=\x22margin:\x208px\x200;\x20padding:\x208px\x2010px;\x20background:\x20'+f+';\x20border-left:\x203px\x20solid\x20'+(d==='dark'?'#b45309':'#f59e0b')+';\x20border-radius:\x204px;\x22>\x0a\x09\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+(d==='dark'?'#fbbf24':'#b45309')+';\x20word-break:\x20break-all;\x22>\x0a\x09\x09\x09\x09\x09⚠\x20Replied\x20message\x20not\x20found\x20—\x20message\x20ID:\x20'+escapeHtml(c['messageId'])+'\x0a\x09\x09\x09\x09</div>\x0a\x09\x09\x09</div>\x0a\x09\x09';let g='';if(e['zipMetadata']?.['fileName'])g='[File]\x20'+e['zipMetadata']['fileName'];else{if(e['plaintext'])g=parseReplyPlaintext(e['plaintext'])['content'];}const h=e['from']['slice'](0x0,0x6)+'...'+e['from']['slice'](-0x3),i=(g||'Original\x20message')['replace'](/\s+/g,'\x20')['trim']()['slice'](0x0,0x78);return'\x0a\x09\x09<div\x20style=\x22margin:\x208px\x200;\x20padding:\x208px\x2010px;\x20background:\x20'+f+';\x20border-left:\x203px\x20solid\x20'+(d==='dark'?'#5a5a5a':'#c9c9c9')+';\x20border-radius:\x204px;\x22>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20#888;\x20margin-bottom:\x202px;\x22>↩\x20Replied\x20to\x20'+escapeHtml(h)+'</div>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2013px;\x20color:\x20'+(d==='dark'?'#bbbbbb':'#555555')+';\x20word-break:\x20break-word;\x22>'+escapeHtml(i)+'</div>\x0a\x09\x09</div>\x0a\x09';}function generateMessageHtml(a,b,c){const {theme:d,borderColor:e,myAddress:f,maxLastReceivedLeafIndex:g}=c,h=isNonTextMessage(a),i=a['from']['toLowerCase']()===f['toLowerCase'](),j=i&&g>=0x0&&a['leafIndex']<=g,k=getMessageColors(d,i),l=d==='dark'?'#333333':'#ffffff';let m='';if(h)m=generateFileButton(a,b,d);else{if(a['plaintext']){const o=parseReplyPlaintext(a['plaintext']);m=generateReplyQuoteHtml(a,c)+('<div\x20style=\x22margin:\x2012px\x200;\x20padding:\x2012px;\x20background:\x20'+l+';\x20border:\x201px\x20solid\x20'+e+';\x20border-radius:\x204px;\x20font-size:\x2014px;\x20line-height:\x201.6;\x20max-height:\x20calc(1.6em\x20*\x206);\x20overflow-y:\x20auto;\x20white-space:\x20pre-wrap;\x20word-break:\x20break-word;\x22>'+escapeHtml(o['content'])+'</div>');}else m='<div\x20style=\x22margin:\x2012px\x200;\x20padding:\x2012px;\x20background:\x20'+l+';\x20border:\x201px\x20solid\x20'+e+';\x20border-radius:\x204px;\x20font-size:\x2013px;\x20color:\x20#999;\x22>Plaintext\x20unavailable\x20locally\x20—\x20content\x20hash\x20verification\x20will\x20fail\x20for\x20this\x20message.</div>';}const n=['<div>Merkle\x20Root:\x20'+escapeHtml(a['merkleRoot'])+'</div>',a['arkConfirmed']?'<div>ARK\x20Confirmed:\x20'+escapeHtml(a['arkConfirmed']['recipient'])+'\x20at\x20'+new Date(a['arkConfirmed']['timestamp'])['toLocaleString']()+'</div>':'',a['guardAddress']?'<div>Guard:\x20'+escapeHtml(a['guardAddress'])+'</div>':'',a['passportAddress']?'<div>Passport:\x20'+escapeHtml(a['passportAddress'])+'</div>':'']['filter'](Boolean)['join']('');return'\x0a\x09\x09<div\x20style=\x22margin:\x2016px\x200;\x20padding:\x2016px;\x20border:\x201px\x20solid\x20'+k['borderColor']+';\x20border-radius:\x208px;\x20background:\x20'+k['bgColor']+';\x22>\x0a\x09\x09\x09<div\x20style=\x22display:\x20flex;\x20justify-content:\x20space-between;\x20margin-bottom:\x208px;\x20font-size:\x2012px;\x20color:\x20#666;\x22>\x0a\x09\x09\x09\x09<span>From:\x20'+escapeHtml(a['from']['slice'](0x0,0x6))+'...'+escapeHtml(a['from']['slice'](-0x3))+'\x20To:\x20'+escapeHtml(a['to']['slice'](0x0,0x6))+'...'+escapeHtml(a['to']['slice'](-0x3))+'</span>\x0a\x09\x09\x09\x09<span>'+new Date(a['timestamp'])['toLocaleString']()+'</span>\x0a\x09\x09\x09</div>\x0a\x09\x09\x09'+m+'\x0a\x09\x09\x09<div\x20style=\x22margin:\x208px\x200;\x20font-size:\x2011px;\x20color:\x20#666;\x22>\x0a\x09\x09\x09\x09'+n+'\x0a\x09\x09\x09</div>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20#888;\x20margin-top:\x208px;\x20padding-top:\x208px;\x20border-top:\x201px\x20solid\x20'+e+';\x20display:\x20flex;\x20justify-content:\x20space-between;\x20align-items:\x20center;\x22>\x0a\x09\x09\x09\x09<div>Leaf\x20Index:\x20'+a['leafIndex']+'</div>\x0a\x09\x09\x09\x09'+(j?'<span\x20style=\x22color:\x20#4caf50;\x22>Delivered\x20&\x20Decrypted</span>':'')+'\x0a\x09\x09\x09</div>\x0a\x09\x09</div>\x0a\x09';}function generateSignatureHtml(a,b,c){if(!a['signatures']||a['signatures']['length']===0x0)return'';const d=a['valid'],e=d?b==='dark'?'#2a3f2a':'#e8f5e9':b==='dark'?'#3a2a2a':'#fff3e0',f=d?b==='dark'?'#81c784':'#2e7d32':b==='dark'?'#ffab40':'#e65100',g=a['signatures']['map']((h,i)=>'\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2010px;\x20color:\x20'+c+';\x20margin-left:\x208px;\x22>\x0a\x09\x09\x09\x09'+(i+0x1)+'.\x20'+(h['address']?escapeHtml(h['address']['slice'](0x0,0x6))+'...'+escapeHtml(h['address']['slice'](-0x3)):'Unknown')+':\x0a\x09\x09\x09\x09'+(h['valid']?'<span\x20style=\x22color:\x20#4caf50;\x22>✓\x20Valid</span>':'<span\x20style=\x22color:\x20#f44336;\x22>✗\x20Invalid</span>')+'\x0a\x09\x09\x09</div>\x0a\x09\x09')['join']('');return'\x0a\x09\x09<div\x20style=\x22margin-top:\x208px;\x20padding:\x208px;\x20background:\x20'+e+';\x20border-radius:\x204px;\x22>\x0a\x09\x09\x09<div\x20style=\x22font-size:\x2011px;\x20color:\x20'+f+';\x20margin-bottom:\x204px;\x22>\x0a\x09\x09\x09\x09'+(d?'✓':'⚠')+'\x20Signature\x20Verification\x20('+a['signatures']['length']+'\x20signature'+(a['signatures']['length']>0x1?'s':'')+')'+(d?'':'\x20(signature\x20valid\x20but\x20content\x20hash\x20verification\x20failed)')+'\x0a\x09\x09\x09</div>\x0a\x09\x09\x09'+g+'\x0a\x09\x09</div>\x0a\x09';}const MESSAGES_PER_PAGE=0x64;function generateHtmlPage(a){const {title:b,theme:c,bgColor:d,textColor:e,borderColor:f,meta:g,payload:h,verifyResult:i,maxLastReceivedLeafIndex:j}=a,k=h['messages']['length'],l=Math['ceil'](k/MESSAGES_PER_PAGE),m=[];for(let s=0x0;s<l;s++){const t=s*MESSAGES_PER_PAGE,u=Math['min'](t+MESSAGES_PER_PAGE,k),v=h['messages']['slice'](t,u)['map']((w,x)=>generateMessageHtml(w,t+x,a))['join']('');m['push']({'pageNum':s+0x1,'html':'<div\x20class=\x22page\x22\x20data-page=\x22'+(s+0x1)+'\x22\x20style=\x22display:\x20'+(s===0x0?'block':'none')+';\x22>'+v+'</div>'});}const n=l>0x1?generatePaginationHtml(l,c,e):'',o=m['map'](w=>w['html'])['join'](''),p=generateSignatureHtml(i,c,e),q=i['valid']?'<span\x20style=\x22color:\x20#4caf50;\x20margin-left:\x208px;\x22>✓\x20The\x20accuracy,\x20sequentiality,\x20and\x20integrity\x20of\x20the\x20messages\x20are\x20verified\x20without\x20tampering</span>':'<span\x20style=\x22color:\x20#ff9800;\x20margin-left:\x208px;\x22>⚠\x20'+(i['error']||'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered')+'</span>',r=j>=0x0?'<div>Delivered\x20&\x20Decrypted\x20Leaf\x20Index:\x20'+j+'\x20(sent\x20messages\x20are\x20only\x20confirmed\x20as\x20decrypted\x20after\x20receiving\x20a\x20reply\x20from\x20the\x20other\x20party)</div>':'';return'<!DOCTYPE\x20html>\x0a<html\x20lang=\x22en\x22>\x0a<head>\x0a\x20\x20\x20\x20<meta\x20charset=\x22UTF-8\x22>\x0a\x20\x20\x20\x20<meta\x20name=\x22viewport\x22\x20content=\x22width=device-width,\x20initial-scale=1.0\x22>\x0a\x20\x20\x20\x20<title>'+escapeHtml(b)+'</title>\x0a\x20\x20\x20\x20<style>\x0a\x20\x20\x20\x20\x20\x20\x20\x20body\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-family:\x20-apple-system,\x20BlinkMacSystemFont,\x20\x22Segoe\x20UI\x22,\x20Roboto,\x20sans-serif;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20max-width:\x20800px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin:\x200\x20auto;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2020px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+d+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20'+e+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.header\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-bottom:\x202px\x20solid\x20'+f+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding-bottom:\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-bottom:\x2024px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.meta\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#666;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.note\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2011px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#999;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x2012px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+(c==='dark'?'#2a2a2a':'#f5f5f5')+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-style:\x20italic;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20display:\x20flex;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20justify-content:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20align-items:\x20center;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20gap:\x208px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20margin-top:\x2024px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-top:\x201px\x20solid\x20'+f+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20button\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20padding:\x208px\x2016px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border:\x201px\x20solid\x20'+f+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+(c==='dark'?'#333':'#fff')+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20'+e+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20pointer;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20border-radius:\x204px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20button:hover:not(:disabled)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20background:\x20'+(c==='dark'?'#444':'#f0f0f0')+';\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20button:disabled\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20opacity:\x200.5;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20cursor:\x20not-allowed;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.pagination\x20.page-info\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20font-size:\x2014px;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20color:\x20#666;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20.page\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20animation:\x20fadeIn\x200.3s\x20ease-in;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20@keyframes\x20fadeIn\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20from\x20{\x20opacity:\x200;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20to\x20{\x20opacity:\x201;\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20</style>\x0a</head>\x0a<body>\x0a\x20\x20\x20\x20<div\x20class=\x22header\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<h1>Witness\x20Timestamped\x20Sequence</h1>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22note\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20Important\x20Note:\x20This\x20page\x20is\x20for\x20message\x20browsing\x20and\x20verification\x20reference\x20only.\x20Please\x20verify\x20whether\x20the\x20message\x20sequence\x20has\x20been\x20tampered\x20with\x20through\x20the\x20\x27verify_wts\x27\x20API\x20using\x20the\x20WTS\x20file.\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22font-size:\x2014px;\x20color:\x20#666;\x20margin-top:\x204px;\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+new Date(g['startTime'])['toLocaleDateString']()+'\x20-\x20'+new Date(g['endTime'])['toLocaleDateString']()+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+q+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<div\x20class=\x22meta\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div>Messages:\x20'+g['messageCount']+'\x20|\x20Time:\x20'+new Date(g['startTime'])['toLocaleString']()+'\x20-\x20'+new Date(g['endTime'])['toLocaleString']()+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22word-break:\x20break-all;\x22>Merkle\x20Root:\x20'+escapeHtml(g['merkleRoot'])+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+r+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:\x20'+(c==='dark'?'#3b82f6':'#1976d2')+';\x22>Creator:\x20'+escapeHtml(g['creator'])+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20<div\x20style=\x22color:\x20'+(c==='dark'?'#10b981':'#2e7d32')+';\x22>Participant:\x20'+escapeHtml(g['participant'])+'</div>\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20'+p+'\x0a\x20\x20\x20\x20\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20<div\x20id=\x22messages-container\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20'+o+'\x0a\x20\x20\x20\x20</div>\x0a\x20\x20\x20\x20'+n+'\x0a\x20\x20\x20\x20<script>\x0a\x20\x20\x20\x20\x20\x20\x20\x20(function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20let\x20currentPage\x20=\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20totalPages\x20=\x20'+l+';\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20function\x20showPage(pageNum)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20隐藏所有页面\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20document.querySelectorAll(\x27.page\x27).forEach(page\x20=>\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20page.style.display\x20=\x20\x27none\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20显示目标页面\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20targetPage\x20=\x20document.querySelector(\x27.page[data-page=\x22\x27\x20+\x20pageNum\x20+\x20\x27\x22]\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(targetPage)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20targetPage.style.display\x20=\x20\x27block\x27;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20currentPage\x20=\x20pageNum;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updatePaginationButtons();\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20function\x20updatePaginationButtons()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20prevBtn\x20=\x20document.getElementById(\x27prev-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20nextBtn\x20=\x20document.getElementById(\x27next-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20pageInfo\x20=\x20document.getElementById(\x27page-info\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(prevBtn)\x20prevBtn.disabled\x20=\x20currentPage\x20===\x201;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(nextBtn)\x20nextBtn.disabled\x20=\x20currentPage\x20===\x20totalPages;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(pageInfo)\x20pageInfo.textContent\x20=\x20\x27Page\x20\x27\x20+\x20currentPage\x20+\x20\x27\x20of\x20\x27\x20+\x20totalPages;\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20绑定按钮事件\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20prevBtn\x20=\x20document.getElementById(\x27prev-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20const\x20nextBtn\x20=\x20document.getElementById(\x27next-btn\x27);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(prevBtn)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20prevBtn.addEventListener(\x27click\x27,\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(currentPage\x20>\x201)\x20showPage(currentPage\x20-\x201);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(nextBtn)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20nextBtn.addEventListener(\x27click\x27,\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20if\x20(currentPage\x20<\x20totalPages)\x20showPage(currentPage\x20+\x201);\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20});\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20//\x20初始化\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20updatePaginationButtons();\x0a\x20\x20\x20\x20\x20\x20\x20\x20})();\x0a\x20\x20\x20\x20</script>\x0a</body>\x0a</html>';}function generatePaginationHtml(a,b,c){return'\x0a\x20\x20\x20\x20<div\x20class=\x22pagination\x22>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20id=\x22prev-btn\x22\x20disabled>←\x20Previous</button>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<span\x20class=\x22page-info\x22\x20id=\x22page-info\x22>Page\x201\x20of\x20'+a+'</span>\x0a\x20\x20\x20\x20\x20\x20\x20\x20<button\x20id=\x22next-btn\x22\x20'+(a<=0x1?'disabled':'')+'>Next\x20→</button>\x0a\x20\x20\x20\x20</div>';}const logger=a34c('messenger:api');let managerInstance=null,isInitialized=![],backgroundTimer=null;async function autoRegisterMessengerAccounts(){const a=await Account['Instance']()['list_messenger_accounts'](),b=managerInstance;if(!b)return;for(const c of a){if(!c['address']||!c['messenger'])continue;try{await b['ensureAccountReady'](c['address']);}catch(d){logger['error']('Failed\x20to\x20initialize\x20account\x20'+c['address']+':',d);}}}function getMessengerManager(){if(!managerInstance)managerInstance=new MessengerManager();return!isInitialized&&(isInitialized=!![],autoRegisterMessengerAccounts()['then'](()=>{return managerInstance['start']();})['catch'](a=>{return logger['error']('Failed\x20to\x20auto-register\x20messenger\x20accounts:',a),managerInstance['start']();})['catch'](a=>{logger['error']('Failed\x20to\x20auto-start\x20messenger\x20manager:',a);})),managerInstance;}function registerCleanupHandler(){const a=()=>{backgroundTimer&&(clearInterval(backgroundTimer),backgroundTimer=null);if(managerInstance)managerInstance['stop']();};process['on']('exit',a),process['on']('SIGINT',()=>{a();}),process['on']('SIGTERM',()=>{a();});}registerCleanupHandler();async function watch_conversations(a){const b=await Account['Instance']()['get_address'](a?.['account']);if(!b)a34a('account\x20not\x20found','watch_conversations.account\x20'+a?.['account']);const c=b['toLowerCase'](),d=(await getMessengerManager()['ensureAccountReady'](b))['messenger']['pullMessages']();if(a?.['sync']!==![])await d;else d['catch'](()=>{});const e=new MessageStorage(c),f=e['getAllMessages'](c),g=new Map(),h=a?.['previewMessageCount']??0x2,i=a?.['skipAutoMarkViewed']??![],j=n=>messagePreviewText(n);for(const n of f){const o=n['fromAddress']['toLowerCase']()===c?n['toAddress']:n['fromAddress'];if(!g['has'](o))g['set'](o,{'peerAddress':o,'lastMessageAt':n['createdAt'],'messageCount':0x0,'unreadCount':0x0,'lastMessagePreview':j(n),'messages':[]});const p=g['get'](o);p['messages']['push'](n),p['messageCount']++;n['createdAt']>p['lastMessageAt']&&(p['lastMessageAt']=n['createdAt'],p['lastMessagePreview']=j(n));if(n['direction']==='received'&&n['viewedAt']===void 0x0)p['unreadCount']++;}const k=[];for(const [,q]of g){if(a?.['startTime']!==void 0x0&&q['lastMessageAt']<a['startTime'])continue;if(a?.['endTime']!==void 0x0&&q['lastMessageAt']>a['endTime'])continue;if(a?.['unreadOnly']&&q['unreadCount']===0x0)continue;const r=[];if(h>0x0){const s=q['messages']['sort']((t,u)=>u['createdAt']-t['createdAt'])['slice'](0x0,h);r['push'](...s['reverse']());if(!i){const t=s['filter'](u=>u['direction']==='received'&&u['viewedAt']===void 0x0)['map'](u=>u['messageId']);if(t['length']>0x0)e['updateMessagesViewed'](t);}}k['push']({'peerAddress':q['peerAddress'],'lastMessageAt':q['lastMessageAt'],'messageCount':q['messageCount'],'unreadCount':q['unreadCount'],'lastMessagePreview':q['lastMessagePreview'],...h>0x0&&{'previewMessages':r['map'](u=>presentMessageForRead(u))}});}const l=a?.['sortBy']??'lastMessageAt',m=a?.['sortOrder']??'desc';return k['sort']((u,v)=>{let w=0x0;switch(l){case'lastMessageAt':w=u['lastMessageAt']-v['lastMessageAt'];break;case'unreadCount':w=u['unreadCount']-v['unreadCount'];break;case'messageCount':w=u['messageCount']-v['messageCount'];break;}return m==='asc'?w:-w;}),k;}async function mark_messages_as_viewed(a,b){if(!a||a['length']===0x0)return 0x0;const c=await Account['Instance']()['get_address'](b);if(!c)a34a('account\x20not\x20found','mark_messages_as_viewed.account\x20'+b);return new MessageStorage(c['toLowerCase']())['updateMessagesViewed'](a);}async function mark_conversation_as_viewed(a,b){const c=await Account['Instance']()['get_address'](b);if(!c)a34a('account\x20not\x20found','mark_conversation_as_viewed.account\x20'+b);const d=c['toLowerCase'](),e=await a34j(a);if(!e)a34a('account\x20not\x20found','mark_conversation_as_viewed.peerAddress\x20'+a+'\x20is\x20not\x20a\x20valid\x20account/address');const f=e['toLowerCase'](),g=new MessageStorage(d),h=g['getMessagesBySession'](d,f)['filter'](i=>i['direction']==='received'&&i['viewedAt']===void 0x0)['map'](i=>i['messageId']);if(h['length']===0x0)return 0x0;return g['updateMessagesViewed'](h);}async function send_message(a,b,c,d){const f=await Account['Instance']()['get_address'](a);if(!f)a34a('account\x20not\x20found','send_message.from\x20'+a);const g=await a34j(b);if(!g)a34a('account\x20not\x20found','send_message.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');if(d?.['guardAddress']!=null&&d?.['passportAddress']!=null){[d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]);if(!d['guardAddress']||!d['passportAddress'])a34a('account\x20not\x20found','send_message.guardAddress\x20or\x20passportAddress\x20not\x20found');}const h=getMessengerManager();try{return await h['send'](f,g,c,d);}catch(i){const j=i?.['guardList'];if(d?.['smart']===![]||d?.['guardAddress']!=null||!Array['isArray'](j)||j['length']===0x0)throw i;const k=await smartSendResolve(f,j['map'](l=>String(l)),d?.['network'],{'authorize':d?.['authorize']===!![]});if(k['kind']==='resend')return await h['send'](f,g,c,{'guardAddress':k['guardAddress'],'passportAddress':k['passportAddress'],'network':k['network'],'force':d?.['force'],'enable_messenger':d?.['enable_messenger'],'replyTo':d?.['replyTo']});return k['result'];}}async function peer_registered(a,b){const c=await Account['Instance']()['get_address'](a);if(!c)a34a('account\x20not\x20found','peer_registered.account\x20'+a);if(!b||!b['trim']())a34a('invalid\x20parameter','peer_registered.peer\x20'+b);return getMessengerManager()['isPeerRegistered'](c,b['trim']());}async function send_file(a,b,c,d){const e=await Account['Instance']()['get_address'](a);if(!e)a34a('account\x20not\x20found','send_file.from\x20'+a);const f=await a34j(b);if(!f)a34a('account\x20not\x20found','send_file.to\x20'+b+'\x20is\x20not\x20a\x20valid\x20account/address');if(d?.['guardAddress']!=null&&d?.['passportAddress']!=null){[d['guardAddress'],d['passportAddress']]=await LocalMark['Instance']()['get_many_address']([d['guardAddress'],d['passportAddress']]);if(!d['guardAddress']||!d['passportAddress'])a34a('account\x20not\x20found','send_file.guardAddress\x20or\x20passportAddress\x20not\x20found');}return getMessengerManager()['send_file'](e,f,c,d);}async function watch_messages(a){if(a?.['account']!==void 0x0){a['account']=await Account['Instance']()['get_address'](a['account']);if(!a['account'])a34a('account\x20not\x20found','watch_messages.account\x20'+a['account']);}if(a?.['customListFilter']?.['includeAddresses']!=null)a['customListFilter']['includeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['includeAddresses']))['filter'](c=>c!=null);if(a?.['customListFilter']?.['excludeAddresses']!=null)a['customListFilter']['excludeAddresses']=(await Account['Instance']()['get_many_address'](a['customListFilter']['excludeAddresses']))['filter'](c=>c!=null);const b=await getMessengerManager()['watch'](a);if(!(a?.['skipAutoMarkViewed']??![])&&b['length']>0x0&&a?.['account']){const c=new MessageStorage(a['account']['toLowerCase']()),d=b['filter'](e=>e['direction']==='received'&&e['viewedAt']===void 0x0)['map'](e=>e['messageId']);if(d['length']>0x0)c['updateMessagesViewed'](d);}return b;}async function search_messages(a){const b=(a['query']??'')['trim']();if(!b)return[];const c=await Account['Instance']()['get_address'](a['account']);if(!c)a34a('account\x20not\x20found','search_messages.account\x20'+a['account']);let d;if(a['peerAddress'])try{d=await a34j(a['peerAddress'])??a['peerAddress'];}catch{d=a['peerAddress'];}return presentMessagesForRead(new MessageStorage(c)['searchMessages'](b,{'peerAddress':d,'limit':a['limit']}));}async function pull_messages(a,b,c){if(c?.['allAccounts']||c?.['accounts']?.['length'])return getMessengerManager()['pullAllAccounts']({'accounts':c['accounts'],'limit':b,'concurrency':c['concurrency']});const d=await Account['Instance']()['get_address'](a);if(!d)a34a('account\x20not\x20found','pull_messages.account\x20'+a);const e=await(await getMessengerManager()['ensureAccountReady'](d))['messenger']['pullMessages'](b),f=new MessageStorage(d['toLowerCase']());return e['messages']['map'](g=>{return presentMessageForRead(f['getMessageById'](g['id'])??g);});}async function emergency_pull(a){return getMessengerManager()['setEmergencyAccounts'](a?.['accounts']??[]);}async function get_attachment(a,b){const c=await Account['Instance']()['get_address'](a);if(!c)a34a('account\x20not\x20found','get_attachment.account\x20'+a);const d=new MessageStorage(c['toLowerCase']())['getMessageById'](b);if(!d)throw new MessengerError('FILE_NOT_FOUND','Message\x20not\x20found:\x20'+b);if(!d['zipMetadata'])throw new MessengerError('INVALID_MESSAGE_TYPE','Message\x20'+b+'\x20is\x20not\x20an\x20attachment');if(!d['plaintext'])throw new MessengerError('MESSAGE_NOT_DECRYPTED','Message\x20'+b+'\x20plaintext\x20is\x20not\x20available');const e=Buffer['from'](d['plaintext'],'base64'),f=d['zipMetadata']['fileHash']?.['replace']('0x','');if(f){const g=createHash('sha256')['update'](e)['digest']('hex');if(g!==f)throw new MessengerError('HASH_MISMATCH','Attachment\x20hash\x20mismatch\x20for\x20'+b+':\x20expected\x20'+f+',\x20got\x20'+g);}return parseAttachmentEnvelope(new Uint8Array(e),{'contentType':d['zipMetadata']['contentType']});}async function export_attachment(a,b,c){const d=await get_attachment(a,b),e=c?.['outputDir']??a34m['join'](getWowokWorkspaceDir(),'attachments');a34n['mkdirSync'](e,{'recursive':!![]});const f=c?.['saveAs']?sanitizeFileName(c['saveAs']):d['fileName'],g=f['lastIndexOf']('.'),h=g>0x0?f['slice'](0x0,g):f,i=g>0x0?f['slice'](g):'';let j=f,k=0x1;while(a34n['existsSync'](a34m['join'](e,j))){j=h+'\x20('+k+')'+i,k++;}const l=a34m['join'](e,j);return a34n['writeFileSync'](l,Buffer['from'](d['bytes'])),l;}async function extract_zip_message(a,b){if(!a['zipMetadata'])throw new MessengerError('INVALID_MESSAGE_TYPE','Message\x20is\x20not\x20a\x20ZIP\x20archive');if(!a['plaintext'])throw new MessengerError('MESSAGE_NOT_DECRYPTED','Message\x20plaintext\x20not\x20available');const c=Buffer['from'](a['plaintext'],'base64');if(a['zipMetadata']?.['fileHash']){const f=createHash('sha256')['update'](c)['digest']('hex'),g=a['zipMetadata']['fileHash']['replace']('0x','');if(f!==g)throw new MessengerError('HASH_MISMATCH','ZIP\x20file\x20hash\x20mismatch:\x20expected\x20'+g+',\x20got\x20'+f);}const d=await extractZipFromPlaintext(a['plaintext']);if(!a34n['existsSync'](b))a34n['mkdirSync'](b,{'recursive':!![]});const e=[];for(const h of d){const i=a34m['join'](b,h['filename']);a34n['writeFileSync'](i,h['content']),e['push'](i);}return e['length']>0x0&&a['zipMetadata']&&(a['zipMetadata']={'fileName':a['zipMetadata']['fileName'],'fileSize':a['zipMetadata']['fileSize'],'fileHash':a['zipMetadata']['fileHash'],'contentType':a['zipMetadata']['contentType'],'localCachePath':e[0x0],'downloadedAt':Date['now']()},new MessageStorage(a['direction']==='sent'?a['fromAddress']:a['toAddress'])['saveMessage'](a)),e[0x0]||'';}async function extractZipFromPlaintext(a){if(!a)throw new MessengerError('INVALID_INPUT','plaintext\x20is\x20empty');const b=Buffer['from'](a,'base64');if(b['length']<0x4||b[0x0]!==0x50||b[0x1]!==0x4b)throw new MessengerError('INVALID_INPUT','Invalid\x20ZIP\x20data:\x20magic\x20bytes\x20mismatch\x20(expected\x20PK,\x20got\x20'+b['slice'](0x0,0x2)['toString']('hex')+')');const {ZipReader:c,BlobReader:d,BlobWriter:e}=await import('@zip.js/zip.js'),f=new c(new d(new Blob([b]))),g=await f['getEntries']();if(g['length']===0x0){await f['close']();throw new MessengerError('INVALID_INPUT','ZIP\x20archive\x20contains\x20no\x20files');}const h=[];for(const i of g)if(!i['directory']){const j=i,k=new e(),l=await j['getData'](k),m=Buffer['from'](await l['arrayBuffer']());h['push']({'filename':i['filename'],'content':m});}return await f['close'](),h;}async function extract_zip_messages(a,b,c){const d=[],f=c??a34m['join'](getWowokWorkspaceDir(),'extracted'),g=await Account['Instance']()['get_address'](a);if(!g)throw new MessengerError('INVALID_INPUT','account\x20is\x20required\x20when\x20extracting\x20by\x20message\x20IDs');for(const h of b)try{let i;if(typeof h==='string'){const k=h,l=new MessageStorage(g)['getMessageById'](k);if(!l){logger['error']('Message\x20not\x20found:\x20'+k);continue;}i=l;}else i=h;if(!i['zipMetadata']){logger['error']('Message\x20'+i['messageId']+'\x20is\x20not\x20a\x20ZIP\x20archive');continue;}const j=await extract_zip_message(i,f);d['push'](j);}catch(m){const n=typeof h==='string'?h:h['messageId'];logger['error']('Failed\x20to\x20extract\x20message\x20'+n+':',m);}return d;}async function generate_wts(a){const b=await Account['Instance']()['get_address'](a['myAccount']);if(!b)a34a('account\x20not\x20found','generate_wts.myAccount\x20'+a['myAccount']);const c=await a34j(a['peerAccount']);if(!c)a34a('account\x20not\x20found','generate_wts.peerAccount\x20'+a['peerAccount']);const d=a['outputDir']??a34m['join'](getWowokWorkspaceDir(),'wts'),f=await getMessengerManager()['generate_wts'](d,b,c,a['range'],a['excludePlaintext']),g=[];for(const h of f['files'])try{const i=await wts2html(h,{'outputPath':d});if(typeof i==='string')g['push'](i);}catch(j){logger['error']('Failed\x20to\x20render\x20HTML\x20report\x20for\x20'+h+':',j);}return{...f,'htmlFiles':g};}function load_wts(a){const b=a34n['readFileSync'](a,'utf-8');return JSON['parse'](b);}function save_wts(a,b){const c=a34m['dirname'](b);if(!a34n['existsSync'](c))a34n['mkdirSync'](c,{'recursive':!![]});a34n['writeFileSync'](b,JSON['stringify'](a,null,0x2),'utf-8');}function resolveServerPublicKey(a,b){if(b['serverPublicKeys']&&a['serverPublicKeyIndex']!==void 0x0&&a['serverPublicKeyIndex']>=0x0&&a['serverPublicKeyIndex']<b['serverPublicKeys']['length'])return b['serverPublicKeys'][a['serverPublicKeyIndex']]['publicKey'];const c=a;if(c['serverPublicKey'])return c['serverPublicKey'];return null;}async function verify_wts(a){try{const b=load_wts(a);if(!b['payload']||!b['meta'])return{'valid':![],'error':'Invalid\x20WTS\x20file\x20structure','hashValid':![],'hasSignature':![]};if(b['meta']['type']!=='wts')return{'valid':![],'error':'Invalid\x20meta.type:\x20'+b['meta']['type'],'hashValid':![],'hasSignature':!!b['meta']['signature']};const {payload:c,meta:d}=b,e=[...c['messages']]['sort']((m,n)=>{if(m['leafIndex']===void 0x0||n['leafIndex']===void 0x0)return 0x0;return m['leafIndex']-n['leafIndex'];});for(let m=0x0;m<e['length'];m++){const n=e[m];if(!n)return{'valid':![],'error':'Message\x20'+m+':\x20Message\x20is\x20null\x20or\x20undefined','hashValid':![],'hasSignature':!!d['signature']};if(!n['prevRoot'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20prevRoot','hashValid':![],'hasSignature':!!d['signature']};if(!n['merkleRoot'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20merkleRoot','hashValid':![],'hasSignature':!!d['signature']};if(!n['plaintextHash'])return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20plaintextHash','hashValid':![],'hasSignature':!!d['signature']};if(n['timestamp']===void 0x0||n['timestamp']===null)return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20timestamp','hashValid':![],'hasSignature':!!d['signature']};if(n['leafIndex']===void 0x0||n['leafIndex']===null)return{'valid':![],'error':'Message\x20'+m+':\x20Missing\x20leafIndex','hashValid':![],'hasSignature':!!d['signature']};const o=verifySingleMerkleRoot(n['prevRoot'],n['merkleRoot'],n['plaintextHash'],n['timestamp'],n['leafIndex']);if(!o['valid'])return{'valid':![],'error':o['error']+'\x20at\x20message\x20'+m+',\x20leafIndex\x20'+n['leafIndex'],'hashValid':![],'hasSignature':!!d['signature']};if(m>0x0){const p=e[m-0x1];if(n['leafIndex']!==p['leafIndex']+0x1)return{'valid':![],'error':'Merkle\x20chain\x20discontinuity:\x20leafIndex\x20'+p['leafIndex']+'\x20->\x20'+n['leafIndex']+'\x20(expected\x20'+(p['leafIndex']+0x1)+')','hashValid':![],'hasSignature':!!d['signature']};if(n['prevRoot']['toLowerCase']()!==p['merkleRoot']['toLowerCase']())return{'valid':![],'error':'Merkle\x20root\x20mismatch\x20at\x20leafIndex\x20'+n['leafIndex']+':\x20expected\x20prevRoot='+p['merkleRoot']+',\x20got\x20'+n['prevRoot'],'hashValid':![],'hasSignature':!!d['signature']};}}for(let q=0x0;q<c['messages']['length'];q++){const r=c['messages'][q];if(!r)return{'valid':![],'error':'Message\x20'+q+':\x20Message\x20is\x20null\x20or\x20undefined','hashValid':![],'hasSignature':!!d['signature']};if(!!!r['zipMetadata']){if(!r['plaintextHash']['startsWith']('0x')||r['plaintextHash']['length']!==0x42)return{'valid':![],'error':'Message\x20'+q+':\x20Invalid\x20plaintextHash\x20format','hashValid':![],'hasSignature':!!d['signature']};if(r['plaintext']){if(hashPlaintext(r['plaintext'],r['clientTimestamp'],r['guardAddress'],r['passportAddress'],r['lastReceivedLeafIndex'])['toLowerCase']()!==r['plaintextHash']['toLowerCase']())return{'valid':![],'error':'Message\x20'+q+':\x20Plaintext\x20hash\x20mismatch','hashValid':![],'hasSignature':!!d['signature']};}}const s=resolveServerPublicKey(r,d);if(r['serverSignature']&&s){if(!r['timestamp'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20timestamp\x20for\x20signature\x20verification','hashValid':![],'hasSignature':!!d['signature']};if(!r['merkleRoot'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20merkleRoot\x20for\x20signature\x20verification','hashValid':![],'hasSignature':!!d['signature']};if(!r['prevRoot'])return{'valid':![],'error':'Message\x20'+q+':\x20Missing\x20prevRoot\x20for\x20signature\x20verification','hashValid':![],'hasSignature':!!d['signature']};if(!verifyFalcon512Signature(s,r['prevRoot']+':'+r['merkleRoot']+':'+r['timestamp']+':'+s,r['serverSignature']))return{'valid':![],'error':'Message\x20'+q+':\x20Server\x20signature\x20verification\x20failed','hashValid':![],'hasSignature':!!d['signature']};}}const {sha256:f}=await import('@noble/hashes/sha2.js'),{bytesToHex:g}=await import('@noble/hashes/utils.js'),h={'wts':b['wts'],...c};if(g(f(new TextEncoder()['encode'](canonicalizeJson(h))))!==d['hash'])return{'valid':![],'error':'Hash\x20mismatch\x20-\x20content\x20has\x20been\x20tampered','hashValid':![],'hasSignature':!!d['signature']};if(d['messageCount']!==c['messages']['length'])return{'valid':![],'error':'messageCount\x20mismatch:\x20meta='+d['messageCount']+',\x20actual='+c['messages']['length'],'hashValid':!![],'hasSignature':!!d['signature']};const j=c['messages'][c['messages']['length']-0x1];if(d['merkleRoot']['toLowerCase']()!==j['merkleRoot']['toLowerCase']())return{'valid':![],'error':'merkleRoot\x20mismatch:\x20meta='+d['merkleRoot']+',\x20lastMessage='+j['merkleRoot'],'hashValid':!![],'hasSignature':!!d['signature']};const k=[];let l;if(d['signature']){const {Falcon512PublicKey:t}=await import('./publickey-CvXcTL6j.mjs')['then'](z=>z['n']),{signature:u,...v}=d,w=g(f(new TextEncoder()['encode'](canonicalizeJson(v)))),x=Array['isArray'](d['signature'])?d['signature']:[d['signature']];let y=!![];for(const z of x){let A;const B=z['publicKey'];if(B['startsWith']('0x')){const C=Buffer['from'](B['slice'](0x2),'hex');if(C['length']===0x382)A=C['slice'](0x1);else{if(C['length']===0x381)A=C;else{let D;try{D=new t(B['slice'](0x2))['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':D,'valid':![]}),y=![];continue;}}}else try{const E=Buffer['from'](B,'base64');if(E['length']===0x382)A=E['slice'](0x1);else{if(E['length']===0x381)A=E;else{let F;try{F=new t(B)['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':F,'valid':![]}),y=![];continue;}}}catch{A=Buffer['from'](B,'base64');}try{const G=new t(A),H=Uint8Array['from'](Buffer['from'](z['value'],'base64')),I=await G['verify'](new TextEncoder()['encode'](w),H);let J;try{J=G['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':J,'valid':I});if(!I)y=![];}catch{let K;try{K=new t(A)['toWowAddress']();}catch{}k['push']({'publicKey':B,'address':K,'valid':![]}),y=![];}}l=y;if(!l)return{'valid':![],'error':'Signatures\x20from\x20the\x20following\x20addresses\x20are\x20invalid:\x20'+k['filter'](L=>!L['valid']&&L['address'])['map'](L=>L['address'])['join'](',\x20'),'hashValid':!![],'hasSignature':!![],'signatureValid':![],'signatures':k};}return{'valid':!![],'hashValid':!![],'hasSignature':!!d['signature'],'signatureValid':l,'signatures':k['length']>0x0?k:void 0x0};}catch(L){return{'valid':![],'error':'Verification\x20error:\x20'+L,'hashValid':![],'hasSignature':![]};}}async function sign_wts(a,b,c){const d=await verify_wts(a);if(!d['valid'])throw new MessengerError('INVALID_INPUT','WTS\x20file\x20verification\x20failed:\x20'+d['error']);const e=load_wts(a),f=await Account['Instance']()['get_address'](b);if(!f)a34a('account\x20not\x20found','sign_wts.account\x20'+b);const {sha256:g}=await import('@noble/hashes/sha2.js'),{bytesToHex:h}=await import('@noble/hashes/utils.js'),{signature:i,...j}=e['meta'],k=h(g(new TextEncoder()['encode'](canonicalizeJson(j)))),l=await Account['Instance']()['signData'](f,k);let m;const n=l['publicKey'];if(n['startsWith']('0x')){const s=Buffer['from'](n['slice'](0x2),'hex');if(s['length']===0x382)m=s['slice'](0x1)['toString']('base64');else{if(s['length']===0x381)m=s['toString']('base64');else throw new MessengerError('INVALID_INPUT','Invalid\x20public\x20key\x20length:\x20'+s['length']+',\x20expected\x20897\x20or\x20898\x20bytes');}}else m=n;const o={'value':Buffer['from'](l['signature']['slice'](0x2),'hex')['toString']('base64'),'publicKey':m,'algorithm':'Falcon512','address':l['address']};let p;if(e['meta']['signature']){const t=Array['isArray'](e['meta']['signature'])?[...e['meta']['signature']]:[e['meta']['signature']],u=t['findIndex'](v=>v['publicKey']===m);if(u>=0x0)t[u]=o,p=t;else p=[...t,o];}else p=[o];const q={...e,'meta':{...e['meta'],'signature':p}};let r;if(c)r=c;else{const v=a34m['extname'](a),w=a34m['basename'](a,v);r=a34m['join'](getWowokWorkspaceDir(),'signed_'+w+v);}return save_wts(q,r),r;}async function wts2html(a,b={}){const c=await import('fs'),d=await import('path');if(c['statSync'](a)['isDirectory']()){const i=c['readdirSync'](a)['filter'](k=>k['endsWith']('.wts'));if(i['length']===0x0)throw new MessengerError('INVALID_INPUT','No\x20.wts\x20files\x20found\x20in\x20directory:\x20'+a);const j=[];for(const k of i){const l=await convertWtsToHtml(d['join'](a,k),b),m=toHtmlFileName(k),n=b['outputPath']?d['join'](b['outputPath'],m):d['join'](getWowokWorkspaceDir(),m),o=d['dirname'](n);if(!c['existsSync'](o))c['mkdirSync'](o,{'recursive':!![]});c['writeFileSync'](n,l,'utf-8'),j['push'](n);}return j;}const e=await convertWtsToHtml(a,b),f=toHtmlFileName(d['basename'](a)),g=b['outputPath']?d['join'](b['outputPath'],f):d['join'](getWowokWorkspaceDir(),f),h=d['dirname'](g);if(!c['existsSync'](h))c['mkdirSync'](h,{'recursive':!![]});return c['writeFileSync'](g,e,'utf-8'),g;}function toHtmlFileName(a){if(a['endsWith']('.wts.json'))return a['slice'](0x0,-0x9)+'.html';if(a['endsWith']('.wts'))return a['slice'](0x0,-0x4)+'.html';const b=a['lastIndexOf']('.');if(b>0x0)return a['slice'](0x0,b)+'.html';return a+'.html';}async function convertWtsToHtml(a,b={}){const {title:title='WTS\x20Document',theme:theme='light'}=b,c=await verify_wts(a),{payload:d,meta:e}=load_wts(a),{bgColor:f,textColor:g,borderColor:h}=getThemeColors(theme),i=e['creator'];let j=-0x1;for(const k of d['messages'])if(k['to']['toLowerCase']()===i['toLowerCase']()){if(k['lastReceivedLeafIndex']!==void 0x0&&k['lastReceivedLeafIndex']>=0x0){if(k['lastReceivedLeafIndex']>j)j=k['lastReceivedLeafIndex'];}}return generateHtmlPage({'title':title,'theme':theme,'bgColor':f,'textColor':g,'borderColor':h,'meta':e,'payload':d,'verifyResult':c,'maxLastReceivedLeafIndex':j,'myAddress':i});}async function proof_message(a,b,c){const d=await Account['Instance']()['get_address'](a);if(!d)a34a('account\x20not\x20found','proof_message.account\x20'+a);const e=new MessageStorage(d),f=e['getMessageById'](b);if(!f)throw new MessengerError('INVALID_INPUT','Message\x20not\x20found:\x20'+b);if(f['fromAddress']['toLowerCase']()!==d['toLowerCase']()&&f['toAddress']['toLowerCase']()!==d['toLowerCase']())throw new MessengerError('INVALID_INPUT','Message\x20does\x20not\x20belong\x20to\x20account\x20'+d);if(!f['serverSignature'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20server\x20signature');if(!f['serverPublicKey'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20server\x20public\x20key');if(!f['plaintext'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20plaintext');const {verifyMessage:g}=await import('./w/messenger/crypto.mjs'),h={'messageId':f['messageId'],'plaintext':f['plaintext'],'plaintextHash':f['plaintextHash'],'createdAt':f['createdAt'],'guardAddress':f['guardAddress'],'passportAddress':f['passportAddress'],'lastReceivedLeafIndex':f['lastReceivedLeafIndex'],'serverSignature':f['serverSignature'],'serverPublicKey':f['serverPublicKey']};if(f['newRoot']&&f['leafIndex']!==void 0x0){if(!f['serverTimestamp'])throw new MessengerError('INVALID_PROOF','Message\x20'+f['messageId']+'\x20missing\x20server\x20timestamp\x20for\x20verification');h['merkleMetadata']={'newRoot':f['newRoot'],'prevRoot':f['prevRoot'],'leafIndex':f['leafIndex'],'serverTimestamp':f['serverTimestamp']};}const i=g(h);if(!i['valid'])throw new MessengerError('INVALID_PROOF','Message\x20verification\x20failed:\x20'+i['error']);if(!f['serverPublicKey'])throw new MessengerError('INVALID_PROOF','Message\x20does\x20not\x20have\x20server\x20public\x20key');const {CallProof:j}=await import('./proof-Cx8ZdZg1.mjs')['then'](q=>q['r']),k=new j({'proof':f['newRoot'],'server_pubkey':f['serverPublicKey'],'server_signature':f['serverSignature'],'proof_type':0x1,'description':'Message\x20proof\x20for\x20'+b,'item_count':f['leafIndex']??0x1,'about_address':f['fromAddress']['toLowerCase']()===d['toLowerCase']()?f['toAddress']:f['fromAddress']}),l={'network':c,'account':d},m=await k['call'](l),{ResponseData:n}=await import('./w/call/base.mjs'),o=n(m)['find'](q=>q['type']==='Proof');if(!o||!o['object'])throw new MessengerError('INVALID_PROOF','Failed\x20to\x20get\x20proof\x20address\x20from\x20transaction\x20result');const p=e['addMessageProof'](b,o['object'],c);return f['proofs']=p,f['proof']=p[p['length']-0x1]?.['address'],{'proofAddress':o['object']};}const MIN_PASSPORT_VALIDITY=0xa,MAX_PASSPORT_VALIDITY=0xa*0x16d*0x18*0x3c*0x3c,MAX_BLACKLIST_SIZE_ONCE=0x64,MAX_FRIENDS_SIZE_ONCE=0x64,MAX_GUARDS_SIZE_ONCE=0xa;async function blacklist(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','blacklist.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await a34h(a['users']);if(d['length']===0x0)a34a('invalid\x20parameter','blacklist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');d=[...new Set(d['map'](e=>e['toLowerCase']()))];if(d['length']>MAX_BLACKLIST_SIZE_ONCE)a34a('invalid\x20parameter','blacklist.add.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);return{'op':'add','result':await c['addToBlacklist'](b,d)};}case'remove':{let e=await a34h(a['users']);if(e['length']===0x0)a34a('invalid\x20parameter','blacklist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');e=[...new Set(e['map'](f=>f['toLowerCase']()))];if(e['length']>MAX_BLACKLIST_SIZE_ONCE)a34a('invalid\x20parameter','blacklist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);return{'op':'remove','result':await c['removeFromBlacklist'](b,e)};}case'clear':return{'op':'clear','result':await c['clearBlacklist'](b)};case'get':return{'op':'get','result':await c['getBlacklist'](b)};case'exist':{let f=await a34h(a['users']);if(f['length']===0x0)a34a('invalid\x20parameter','blacklist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](g=>g['toLowerCase']()))];if(f['length']>MAX_BLACKLIST_SIZE_ONCE)a34a('invalid\x20parameter','blacklist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_BLACKLIST_SIZE_ONCE);return{'op':'exist','result':await c['existInBlacklist'](b,f)};}default:throw new MessengerError('INVALID_INPUT','blacklist.unknown\x20op:\x20'+a);}}async function friendslist(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','friendslist.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'add':{let d=await a34h(a['users']);if(d['length']===0x0)a34a('invalid\x20parameter','friendslist.add.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');return d=[...new Set(d['map'](e=>e['toLowerCase']()))],{'op':'add','result':await c['addToFriendsList'](b,d)};}case'remove':{let e=await a34h(a['users']);if(e['length']===0x0)a34a('invalid\x20parameter','friendslist.remove.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');e=[...new Set(e['map'](f=>f['toLowerCase']()))];if(e['length']>MAX_FRIENDS_SIZE_ONCE)a34a('invalid\x20parameter','friendslist.remove.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);return{'op':'remove','result':await c['removeFromFriendsList'](b,e)};}case'clear':return{'op':'clear','result':await c['clearFriendsList'](b)};case'get':return{'op':'get','result':await c['getFriendsList'](b)};case'exist':{let f=await a34h(a['users']);if(f['length']===0x0)a34a('invalid\x20parameter','friendslist.exist.users\x20'+a['users']+'\x20have\x20not\x20valid\x20addresses');f=[...new Set(f['map'](g=>g['toLowerCase']()))];if(f['length']>MAX_FRIENDS_SIZE_ONCE)a34a('invalid\x20parameter','friendslist.exist.users\x20'+a['users']+'\x20have\x20too\x20many\x20addresses,\x20max\x20'+MAX_FRIENDS_SIZE_ONCE);return{'op':'exist','result':await c['existInFriendsList'](b,f)};}default:throw new MessengerError('INVALID_INPUT','friendslist.unknown\x20op:\x20'+a);}}async function guardlist(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','guardlist.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'add':{const d=new Map();for(const l of a['guards'])d['set'](l['guard']['toLowerCase'](),l);const e=Array['from'](d['values']());if(e['length']===0x0)a34a('invalid\x20parameter','guardlist.add.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');if(e['length']>MAX_GUARDS_SIZE_ONCE)a34a('invalid\x20parameter','guardlist.add.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);for(const m of e)if(!a34b(m['passportValiditySeconds'])||m['passportValiditySeconds']<MIN_PASSPORT_VALIDITY||m['passportValiditySeconds']>MAX_PASSPORT_VALIDITY)a34a('invalid\x20parameter','Guard\x20'+m['guard']+':\x20passport\x20validity\x20'+m['passportValiditySeconds']+'\x20must\x20be\x20between\x20'+MIN_PASSPORT_VALIDITY+'\x20and\x20'+MAX_PASSPORT_VALIDITY+'\x20seconds');const f=await LocalMark['Instance']()['get_many_address'](e['map'](n=>n['guard']));if(f['length']!==e['length']){const n=new Set(f),o=[];for(const p of e)if(!n['has'](p['guard'])&&!p['guard']['startsWith']('0x'))o['push'](p['guard']);a34a('invalid\x20parameter','Guard\x20not\x20found:\x20'+o['join'](',\x20'));}const h=await a34e({'objects':f,'no_cache':!![],'network':'mainnet'}),i=new Set((h?.['objects']??[])['filter'](q=>q['type']==='Guard')['map'](q=>q['object']['toLowerCase']())),j=e['filter']((q,r)=>!f[r]||!i['has'](f[r]['toLowerCase']()));if(j['length']>0x0)a34a('invalid\x20parameter','Guard\x20not\x20found\x20on\x20mainnet:\x20'+j['map'](q=>q['guard'])['join'](',\x20')+'.\x20Messenger\x20guards\x20must\x20be\x20Guard\x20objects\x20on\x20mainnet.');const k=e['map']((q,r)=>({'guardAddress':f[r],'passportValiditySeconds':q['passportValiditySeconds']}));return{'op':'add','result':await c['addToGuardList'](b,k)};}case'remove':{const q=[...new Set(a['guards']['map'](s=>s['toLowerCase']()))];if(q['length']===0x0)a34a('invalid\x20parameter','guardlist.remove.guards\x20'+a['guards']+'\x20have\x20not\x20valid\x20guards');if(q['length']>MAX_GUARDS_SIZE_ONCE)a34a('invalid\x20parameter','guardlist.remove.guards\x20'+a['guards']+'\x20have\x20too\x20many\x20guards,\x20max\x20'+MAX_GUARDS_SIZE_ONCE);const r=await LocalMark['Instance']()['get_many_address'](q);if(r['length']!==q['length']){const s=new Set(r),t=[];for(const u of q)if(!s['has'](u)&&!u['startsWith']('0x'))t['push'](u);a34a('invalid\x20parameter','Guard\x20not\x20found:\x20'+t['join'](',\x20'));}return{'op':'remove','result':await c['removeFromGuardList'](b,r)};}case'get':return{'op':'get','result':await c['getGuardList'](b)};default:throw new MessengerError('INVALID_INPUT','guardlist.unknown\x20op:\x20'+a);}}async function settings(a){const b=await Account['Instance']()['get_address'](a['account']);if(!b)a34a('account\x20not\x20found','settings.account\x20'+a['account']);const c=getMessengerManager();await c['ensureAccountReady'](b);switch(a['op']){case'get':return{'op':'get','result':await c['getSettings'](b)};case'set':{const d={};if(a['allowStrangerMessages']!==void 0x0)d['allowStrangerMessages']=a['allowStrangerMessages'];if(a['maxInboxSize']!==void 0x0)d['maxInboxSize']=a['maxInboxSize'];return{'op':'set','result':await c['setSettings'](b,d)};}default:throw new MessengerError('INVALID_INPUT','settings.unknown\x20op:\x20'+a);}}export{watch_messages as C,watch_conversations as S,MessengerManager as T,send_file as _,extract_zip_messages as a,sign_wts as b,getMessengerManager as c,mark_conversation_as_viewed as d,mark_messages_as_viewed as f,search_messages as g,pull_messages as h,extractZipFromPlaintext as i,get_attachment as l,proof_message as m,emergency_pull as n,friendslist as o,peer_registered as p,export_attachment as r,generate_wts as s,blacklist as t,guardlist as u,send_message as v,wts2html as w,verify_wts as x,settings as y};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { B as parsePartialSignatures,
|
|
1
|
+
import { B as parsePartialSignatures, JS as MultiSigSigner, R as MultiSigPublicKey, z as MultiSigStruct } from "../index-D9MgIgit.mjs";
|
|
2
2
|
export { MultiSigPublicKey, MultiSigSigner, type MultiSigStruct, parsePartialSignatures };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as a39a}from'./chunk-D7D4PA-g.mjs';import{o as a39b}from'./exception-
|
|
1
|
+
import{t as a39a}from'./chunk-D7D4PA-g.mjs';import{o as a39b}from'./exception-CSVNDnxf.mjs';import{et as a39c,y as a39d}from'./common-CWx5RgBw.mjs';import{isValidAddress}from'./w/local/local.mjs';import{Fr as a39e,Gr as a39f,Kr as a39g,cn as a39h}from'./util-DpsaFX5J.mjs';var proof_exports=a39a({'CallProof':()=>CallProof,'create':()=>create,'gen_proof':()=>gen_proof,'proofFn':()=>proofFn}),CallProof=class extends a39h{constructor(a){super(),this['data']=a;}async['call'](a){return await this['prepare'](a),await this['exec'](a);}async['operate'](a,b,c){await this['new_with_mark'](a,b,'Proof',create(b,this['data']?.['description'],this['data']?.['proof'],this['data']?.['server_pubkey'],this['data']?.['server_signature'],this['data']?.['proof_type'],this['data']?.['item_count'],this['data']?.['about_address']),this['data']?.['namedNew']);}};function proofFn(a){return'0x2::proof::'+a;}const gen_proof=async(a,b,c,d,e,f,g,h)=>{return await new CallProof({'proof':b,'server_pubkey':c,'server_signature':d,'proof_type':e,'description':f,'item_count':g,'about_address':h})['call'](a);};function create(a,b,c,d,e,f,g,h){if(!a39c(b))a39b('invalid\x20description','Description\x20length\x20exceeds\x20'+a39d);if(c['length']>a39e)a39b('invalid\x20parameter','Proof\x20length\x20exceeds\x20'+a39e);if(d['length']>a39f)a39b('invalid\x20parameter','Server\x20pubkey\x20length\x20exceeds\x20'+a39f);if(e['length']>a39g)a39b('invalid\x20parameter','Server\x20signature\x20length\x20exceeds\x20'+a39g);if(h&&!isValidAddress(h))a39b('invalid\x20address','About\x20address\x20'+h+'\x20is\x20not\x20valid');return a['moveCall']({'target':proofFn('create_wowok_proof_v2'),'arguments':[a['pure']['string'](c),a['pure']['option']('u64',g),a['pure']['string'](b),a['pure']['string'](d),a['pure']['string'](e),a['pure']['option']('address',h??null),a['pure']['u64'](f),a['object']['clock'](),a['object']['mutObjectLinkerTx']()]});}export{gen_proof as n,proof_exports as r,CallProof as t};
|