diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 12a1ad97b..a68a6123e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -173,7 +173,7 @@ jobs: -v ${{ github.workspace }}:/project \ build/${{ matrix.os }}:latest - - name: Build smp-server (postgresql) and tests + - name: Build smp-server, xftp-server (postgresql) and tests if: matrix.should_run == true shell: docker exec -t builder sh -eu {0} run: | @@ -182,12 +182,12 @@ jobs: cabal update cabal build --jobs=$(nproc) --enable-tests -fserver_postgres mkdir -p /out - for i in smp-server simplexmq-test; do + for i in smp-server xftp-server simplexmq-test; do bin=$(find /project/dist-newstyle -name "$i" -type f -executable) chmod +x "$bin" mv "$bin" /out/ done - strip /out/smp-server + strip /out/smp-server /out/xftp-server - name: Copy simplexmq-test from container if: matrix.should_run == true @@ -195,19 +195,29 @@ jobs: run: | docker cp builder:/out/simplexmq-test . - - name: Copy smp-server (postgresql) from container and prepare it + - name: Copy smp-server, xftp-server (postgresql) from container and prepare it if: startsWith(github.ref, 'refs/tags/v') && matrix.should_run == true id: prepare-postgres shell: bash run: | - name="smp-server-postgres-ubuntu-${{ matrix.os_underscore }}-${{ matrix.arch }}" - docker cp builder:/out/smp-server $name + printf 'bins< bins.output + printf 'hashes< hashes.output - path="${{ github.workspace }}/$name" - echo "bin=$path" >> $GITHUB_OUTPUT + for i in smp-server xftp-server; do + name="${i}-postgres-ubuntu-${{ matrix.os_underscore }}-${{ matrix.arch }}" + docker cp builder:/out/$i $name - hash="SHA2-256($name)= $(openssl sha256 $path | cut -d' ' -f 2)" - printf 'hash=%s' "$hash" >> $GITHUB_OUTPUT + path="${{ github.workspace }}/$name" + hash="SHA2-256($name)= $(openssl sha256 $path | cut -d' ' -f 2)" + + printf '%s\n' "$path" >> bins.output + printf '%s\n\n' "$hash" >> hashes.output + done + printf 'EOF\n' >> bins.output + printf 'EOF\n' >> hashes.output + + cat bins.output >> "$GITHUB_OUTPUT" + cat hashes.output >> "$GITHUB_OUTPUT" - name: Build everything else (standard) if: matrix.should_run == true @@ -257,10 +267,10 @@ jobs: fail_on_unmatched_files: true body: | ${{ steps.prepare-regular.outputs.hashes }} - ${{ steps.prepare-postgres.outputs.hash }} + ${{ steps.prepare-postgres.outputs.hashes }} files: | ${{ steps.prepare-regular.outputs.bins }} - ${{ steps.prepare-postgres.outputs.bin }} + ${{ steps.prepare-postgres.outputs.bins }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 58c4dc559..817cf7d3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,39 @@ +# 6.5.1 + +Version 6.5.1.0 + +XFTP client: +- backwards compatible file header decoding. + +# 6.5.0 + +Version 6.5.0.17 + +SMP agent: +- improve subscriptions + - reduce memory usage and retries during initial subscription (#1758) + - fix race resulting in pending subscriptions never subscribed (#1756) + - batch processing of subscription results and errors (#1652) + - reduce memory usage of active subscriptions. +- drop message after N reception attempts (#1762) +- fix possible deadlocks of queue overloading when processing messages (#1713) +- improved APIs for short link management and creation. +- support multiple link owners in link data (#1701) + +SMP server: +- store messages in PostgreSQL (#1622). +- reduce memory usage with PostgreSQL database - do not use queue cache (#1637) +- fix in-memory server not restoring queue/service associations after 2+ restarts (#1618) + +XFTP server: +- support PostgreSQL database. +- add server page. +- support uploads from web clients. + +Servers: +- better socket leak prevention during TLS handshake, NetworkError type to bette diagnose connection errors (#1619) +- use "=" as default INI key-value separator (#1767) + # 6.4.4 Servers: diff --git a/README.md b/README.md index eada2d49f..7ec978ce2 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Routers are the network infrastructure — they accept, buffer, and deliver pack - **XFTP routers** accept and deliver data packets over HTTP/2 — individually addressed blocks in fixed sizes (64KB–4MB) for larger payloads. Protocol: [XFTP](./protocol/xftp.md). Module spec: [`Simplex.FileTransfer.Server`](./spec/modules/Simplex/FileTransfer/Server.md). - **NTF routers** bridge to platform push services (APNS) for mobile notification delivery. Protocol: [Push Notifications](./protocol/push-notifications.md). Module spec: [`Simplex.Messaging.Notifications.Server`](./spec/modules/Simplex/Messaging/Notifications/Server.md). + #### Running an SMP router [SMP server](./apps/smp-server/Main.hs) runs on any Linux distribution. OpenSSL is required for initialization. diff --git a/apps/common/Web/static/index.html b/apps/common/Web/static/index.html index fdc6fb054..a5b42313a 100644 --- a/apps/common/Web/static/index.html +++ b/apps/common/Web/static/index.html @@ -105,6 +105,13 @@ class="text-[16px] leading-[26px] tracking-[0.01em] nav-link-text text-black dark:text-white before:bg-black dark:before:bg-white">Server information + Donate diff --git a/apps/xftp-server/XFTPWeb.hs b/apps/xftp-server/XFTPWeb.hs index dd57d43c0..a9ee55e15 100644 --- a/apps/xftp-server/XFTPWeb.hs +++ b/apps/xftp-server/XFTPWeb.hs @@ -1,12 +1,16 @@ {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TemplateHaskell #-} module XFTPWeb ( xftpGenerateSite, xftpServerInformation, ) where +import Control.Monad (forM_) +import qualified Data.ByteString.Char8 as B import Data.ByteString (ByteString) +import Data.FileEmbed (embedDir, embedFile) import Data.Maybe (isJust) import Data.String (fromString) import Web.Embedded (embeddedContent) @@ -18,15 +22,41 @@ import Simplex.Messaging.Server.Main (simplexmqSource) import qualified Simplex.Messaging.Server.Web as Web import Simplex.Messaging.Server.Web (render, serverInfoSubsts, timedTTLText) import Simplex.Messaging.Transport.Client (TransportHost (..)) +import System.Directory (createDirectoryIfMissing) +import System.FilePath (()) -xftpGenerateSite :: XFTPServerConfig -> Maybe ServerPublicInfo -> Maybe TransportHost -> FilePath -> IO () -xftpGenerateSite cfg info onionHost path = - Web.generateSite embeddedContent (xftpServerInformation cfg info onionHost) [] path +xftpWebContent :: [(FilePath, ByteString)] +xftpWebContent = $(embedDir "apps/xftp-server/static/xftp-web-bundle/") -xftpServerInformation :: XFTPServerConfig -> Maybe ServerPublicInfo -> Maybe TransportHost -> ByteString -xftpServerInformation XFTPServerConfig {fileExpiration, logStatsInterval, allowNewFiles, newFileBasicAuth} information onionHost = render (Web.indexHtml embeddedContent) substs +xftpMediaContent :: [(FilePath, ByteString)] +xftpMediaContent = $(embedDir "apps/xftp-server/static/media/") + +xftpFilePageHtml :: ByteString +xftpFilePageHtml = $(embedFile "apps/xftp-server/static/file.html") + +xftpGenerateSite :: XFTPServerConfig s -> Maybe ServerPublicInfo -> Maybe TransportHost -> FilePath -> IO () +xftpGenerateSite cfg info onionHost path = do + let substs = xftpSubsts cfg info onionHost + Web.generateSite embeddedContent (render (Web.indexHtml embeddedContent) substs) [] path + let xftpDir = path "xftp-web-bundle" + mediaDir = path "media" + fileDir = path "file" + filePage xftpDir xftpWebContent + filePage mediaDir xftpMediaContent + createDirectoryIfMissing True fileDir + B.writeFile (fileDir "index.html") $ render xftpFilePageHtml substs + where + filePage dir content_ = do + createDirectoryIfMissing True dir + forM_ content_ $ \(fp, content) -> B.writeFile (dir fp) content + +xftpServerInformation :: XFTPServerConfig s -> Maybe ServerPublicInfo -> Maybe TransportHost -> ByteString +xftpServerInformation cfg info onionHost = render (Web.indexHtml embeddedContent) (xftpSubsts cfg info onionHost) + +xftpSubsts :: XFTPServerConfig s -> Maybe ServerPublicInfo -> Maybe TransportHost -> [(ByteString, Maybe ByteString)] +xftpSubsts XFTPServerConfig {fileExpiration, logStatsInterval, allowNewFiles, newFileBasicAuth} information onionHost = + [("smpConfig", Nothing), ("xftpConfig", Just "y")] <> substConfig <> serverInfoSubsts simplexmqSource information <> [("onionHost", strEncode <$> onionHost), ("iniFileName", Just "file-server.ini")] where - substs = [("smpConfig", Nothing), ("xftpConfig", Just "y")] <> substConfig <> serverInfoSubsts simplexmqSource information <> [("onionHost", strEncode <$> onionHost), ("iniFileName", Just "file-server.ini")] substConfig = [ ("fileExpiration", Just $ maybe "Never" (fromString . timedTTLText . ttl) fileExpiration), ("statsEnabled", Just . yesNo $ isJust logStatsInterval), diff --git a/apps/xftp-server/static/file.html b/apps/xftp-server/static/file.html new file mode 100644 index 000000000..67c1731d6 --- /dev/null +++ b/apps/xftp-server/static/file.html @@ -0,0 +1,664 @@ + + + + + + + SimpleX File Transfer + + + + + + + + + + + + + + + +
+
+ +
+ +
+ +
+
+ +

SimpleX File Transfer

+
+
+
+

Drag & drop a file here

+

or

+ Choose file +

Max 100 MB - SimpleX Chat app supports files up to 1 GB

+
+
+
+ + + + +

Send files securely with end-to-end encryption — no accounts, no tracking.

+ Learn more about XFTP protocol +
+
+ +
+
+

+ Get SimpleX Chat — the most secure & private messenger +

+

+ The file transfer you just used uses the same data routing protocol as SimpleX Chat. The app has end-to-end encrypted messaging, voice and video calls, groups, and sending files. No account. No phone. No email. No user profile IDs. +

+
+ + + + + +
+
+
+ + + + + + + +
+ +
+ + + + diff --git a/apps/xftp-server/static/media/xftp-protocol-dark.svg b/apps/xftp-server/static/media/xftp-protocol-dark.svg new file mode 100644 index 000000000..c6a0224d5 --- /dev/null +++ b/apps/xftp-server/static/media/xftp-protocol-dark.svg @@ -0,0 +1,115 @@ + + + + Sender's browser + encrypts file + + + + + + + encrypted chunks + + + + + + + + + + + + + + + + + SimpleX + XFTP router + + + + + + + + + + + + Flux + XFTP router + + + + + + + + + + + + SimpleX + XFTP router + + + + + + + + re-encrypted + per recipient + + + + encrypted chunks + + + + + + + Recipient's browser + decrypts file + + + + key in URL fragment - never sent to page server or data router + + + + + + + + + + + + + + + + + + + + + + + + + + + Each file fragment uses unique anonymous credentials - no shared identifiers + + + + + + + diff --git a/apps/xftp-server/static/media/xftp-protocol.svg b/apps/xftp-server/static/media/xftp-protocol.svg new file mode 100644 index 000000000..b4cdb1183 --- /dev/null +++ b/apps/xftp-server/static/media/xftp-protocol.svg @@ -0,0 +1,130 @@ + + + + Sender's browser + encrypts file + + + + + + + encrypted chunks + + + + + + + + + + + + + + + + + SimpleX + XFTP router + + + + + + + + + + + + Flux + XFTP router + + + + + + + + + + + + SimpleX + XFTP router + + + + + + + + re-encrypted + per recipient + + + + encrypted chunks + + + + + + + Recipient's browser + decrypts file + + + + key in URL fragment - never sent to page server or data router + + + + + + + + + + + + + + + + + + + + + + + + + + + Each file fragment uses unique anonymous credentials - no shared identifiers + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/xftp-server/static/xftp-web-bundle/crypto.worker.js b/apps/xftp-server/static/xftp-web-bundle/crypto.worker.js new file mode 100644 index 000000000..20b6859ac --- /dev/null +++ b/apps/xftp-server/static/xftp-web-bundle/crypto.worker.js @@ -0,0 +1,851 @@ +// ESM polyfills for Node.js compatibility +// __dirname and __filename are not available in ESM, so we polyfill them for Node.js +var __filename$1, __dirname$1; +try { + // Only works in Node.js ESM - browsers will skip this + if (typeof process !== 'undefined' && process.versions && process.versions.node) { + var url = await import('url'); + var path = await import('./__vite-browser-external-C6dvzdW7.js'); + __filename$1 = url.fileURLToPath(import.meta.url); + __dirname$1 = path.dirname(__filename$1); + } +} catch (e) { + // In browser environments, these are not needed +} + +var Module = {}; + +// Set up getRandomValue for ESM environments (browsers and Node.js 19+) +// This must be done before the WASM module initializes +(function() { + try { + // Try globalThis.crypto first (works in browsers and Node.js 19+) + var crypto_ = globalThis.crypto; + if (crypto_ && typeof crypto_.getRandomValues === 'function') { + Module.getRandomValue = function() { + var buf = new Uint32Array(1); + crypto_.getRandomValues(buf); + return buf[0] >>> 0; + }; + return; + } + } catch (e) {} + + try { + // Fallback for older browsers: window.crypto or self.crypto + var window_ = typeof window !== 'undefined' ? window : self; + var crypto_ = window_.crypto || window_.msCrypto; + if (crypto_ && typeof crypto_.getRandomValues === 'function') { + Module.getRandomValue = function() { + var buf = new Uint32Array(1); + crypto_.getRandomValues(buf); + return buf[0] >>> 0; + }; + return; + } + } catch (e) {} + + // No crypto available - will fail at runtime if random bytes are needed +})(); + var Module; + if (typeof Module === 'undefined') { + Module = {}; + } + var root = Module; + if (typeof root['sodium'] !== 'object') { + if (typeof global === 'object') { + root = global; + } else if (typeof window === 'object') { + root = window; + } + } + if (typeof Module.getRandomValue === 'undefined') { + try { + var window_ = 'object' === typeof window ? window : self; + var crypto_ = typeof window_.crypto !== 'undefined' ? window_.crypto : window_.msCrypto; + var randomValuesStandard = function() { + var buf = new Uint32Array(1); + crypto_.getRandomValues(buf); + return buf[0] >>> 0; + }; + randomValuesStandard(); + Module.getRandomValue = randomValuesStandard; + } catch (e) { + try { + var crypto$1 = null; + var randomValueNodeJS = function() { + var buf = crypto$1['randomBytes'](4); + return (buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]) >>> 0; + }; + randomValueNodeJS(); + Module.getRandomValue = randomValueNodeJS; + } catch (e) { + throw 'No secure random number generator found'; + } + } + } + var _Module = Module; + Module.ready = new Promise(function(resolve, reject) { + var Module = _Module; + Module.onAbort = reject; + Module.print = function(what) { + typeof(console) !== 'undefined' && console.log(what); + }; + Module.printErr = function(what) { + typeof(console) !== 'undefined' && console.warn(what); + }; + Module.onRuntimeInitialized = function() { + try { + /* Test arbitrary wasm function */ + Module._crypto_secretbox_keybytes(); + resolve(); + } catch (err) { + reject(err); + } + }; + Module.useBackupModule = function() { + return new Promise(function(resolve, reject) { + var Module = {}; + Module.onAbort = reject; + Module.getRandomValue = _Module.getRandomValue; + + Module.onRuntimeInitialized = function() { + Object.keys(_Module).forEach(function(k) { + if (k !== 'getRandomValue') { + delete _Module[k]; + } + }); + Object.keys(Module).forEach(function(k) { + _Module[k] = Module[k]; + }); + resolve(); + }; + +var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename$1!="undefined"){_scriptName=__filename$1;}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href;}var scriptDirectory="";if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname$1+"/";if(process.argv.length>1){process.argv[1].replace(/\\/g,"/");}process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module;}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href;}catch{}}else;console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536);},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(ea){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c;}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;r=r>>>0;if(p+r>a.length)throw "trap: invalid memory.fill";a.fill(q,p,p+r);}function s(){throw new Error("abort")}function t(p,u,r){a.copyWithin(p,u,u+r);}function da(n){var v=new ArrayBuffer(50331648);var w=new Int8Array(v);var x=new Int16Array(v);var y=new Int32Array(v);var z=new Uint8Array(v);var A=new Uint16Array(v);var B=new Uint32Array(v);var E=Math.imul;var H=Math.clz32;var O=n.a;var P=O.a;var Q=O.b;var R=O.c;var S=O.d;var T=106768;var U=0;var V=0;var W=0; +// EMSCRIPTEN_START_FUNCS +function Eb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;ia=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);c=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);ka=c;Z=z[b+104|0]|z[b+105|0]<<8|(z[b+106|0]<<16|z[b+107|0]<<24);c=z[b+108|0]|z[b+109|0]<<8|(z[b+110|0]<<16|z[b+111|0]<<24);la=c;c=z[b+68|0]|z[b+69|0]<<8|(z[b+70|0]<<16|z[b+71|0]<<24);O=z[b+64|0]|z[b+65|0]<<8|(z[b+66|0]<<16|z[b+67|0]<<24);$=c;c=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);wa=c;s=c;da=z[b+120|0]|z[b+121|0]<<8|(z[b+122|0]<<16|z[b+123|0]<<24);c=z[b+124|0]|z[b+125|0]<<8|(z[b+126|0]<<16|z[b+127|0]<<24);qa=c;c=z[b+92|0]|z[b+93|0]<<8|(z[b+94|0]<<16|z[b+95|0]<<24);Aa=c;pa=z[b+88|0]|z[b+89|0]<<8|(z[b+90|0]<<16|z[b+91|0]<<24);N=c;ca=z[b+80|0]|z[b+81|0]<<8|(z[b+82|0]<<16|z[b+83|0]<<24);c=z[b+84|0]|z[b+85|0]<<8|(z[b+86|0]<<16|z[b+87|0]<<24);na=c;P=c;aa=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);fa=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);c=fa+s|0;ea=z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24);ga=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);L=ea+ga|0;c=(z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24))+(ea>>>0>L>>>0?c+1|0:c)|0;d=L;L=L+aa|0;aa=d>>>0>L>>>0?c+1|0:c;c=aa+ka|0;ja=L+ia|0;c=ja>>>0>>0?c+1|0:c;ba=ja;ja=c;L=Ci(L^(z[a+80|0]|z[a+81|0]<<8|(z[a+82|0]<<16|z[a+83|0]<<24))^-79577749,aa^(z[a+84|0]|z[a+85|0]<<8|(z[a+86|0]<<16|z[a+87|0]<<24))^528734635,32);c=W;ta=c;c=c+1013904242|0;aa=L;L=L-23791573|0;c=L>>>0<4271175723?c+1|0:c;S=c;fa=Ci(L^ea,c^fa,40);ea=fa+ba|0;c=ja;ja=W;c=c+ja|0;k=ea;l=k>>>0>>0?c+1|0:c;ea=Ci(aa^k,ta^l,48);J=W;c=S+J|0;m=ea;ea=L+m|0;c=ea>>>0>>0?c+1|0:c;o=ea;p=c;c=Ci(fa^o,ja^c,1);L=W;ea=c;S=L;ja=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);c=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);ta=c;ha=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);fa=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);aa=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);L=fa+aa|0;xa=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);Ba=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);c=xa+Ba|0;c=(z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24))+(L>>>0>>0?c+1|0:c)|0;d=L;L=L+ha|0;ba=d>>>0>L>>>0?c+1|0:c;c=ta+ba|0;ha=L+ja|0;c=ha>>>0>>0?c+1|0:c;d=Ci(L^(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))^725511199,ba^(z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24))^-1694144372,32);L=W;C=L;e=d-2067093701|0;H=C-((d>>>0<2067093701)+1150833018|0)|0;h=Ci(aa^e,Ba^H,40);L=h+ha|0;K=W;c=K+c|0;q=L;B=q>>>0>>0?c+1|0:c;c=B+S|0;L=q+ea|0;c=(q>>>0>L>>>0?c+1|0:c)+P|0;f=L;L=L+ca|0;aa=f>>>0>L>>>0?c+1|0:c;c=aa+N|0;N=L+pa|0;c=N>>>0>>0?c+1|0:c;F=N;j=c;n=ea;ra=S;S=L;ba=aa;ea=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);L=c;c=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);Ba=c;aa=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);Ca=aa;P=c;ua=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);g=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);c=ua+g|0;N=z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24);aa=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);f=N+aa|0;c=Ca+(N>>>0>f>>>0?c+1|0:c)|0;P=f+P|0;ha=P>>>0>>0?c+1|0:c;c=ha+L|0;f=P+ea|0;c=f>>>0

>>0?c+1|0:c;oa=f;f=c;i=N;c=a- -64|0;N=Ci(P^(z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24))^-1377402159,ha^(z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24))^1359893119,32);c=W;ha=c;c=c+1779033703|0;P=N;N=N-205731576|0;c=N>>>0<4089235720?c+1|0:c;r=N;x=c;g=Ci(i^r,c^g,40);N=g+oa|0;E=W;c=E+f|0;f=N;t=g>>>0>f>>>0?c+1|0:c;i=Ci(P^f,ha^t,48);U=W;c=Ci(i^S,U^ba,32);N=W;R=N;G=c;c=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);za=c;oa=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);ha=oa;v=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);ba=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);P=z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24);N=ba+P|0;va=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);D=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);c=va+D|0;c=(z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24))+(N>>>0

>>0?c+1|0:c)|0;u=N;N=v+N|0;S=u>>>0>N>>>0?c+1|0:c;c=za+S|0;v=N+ha|0;c=v>>>0>>0?c+1|0:c;S=Ci(N^(z[a+88|0]|z[a+89|0]<<8|(z[a+90|0]<<16|z[a+91|0]<<24))^327033209,S^(z[a+92|0]|z[a+93|0]<<8|(z[a+94|0]<<16|z[a+95|0]<<24))^1541459225,32);N=W;y=N;ha=S+1595750129|0;u=D;D=y-((S>>>0<2699217167)+1521486533|0)|0;P=Ci(P^ha,u^D,40);N=P+v|0;Y=W;c=Y+c|0;v=N;u=v>>>0

>>0?c+1|0:c;N=Ci(v^S,y^u,48);V=W;c=D+V|0;D=N;N=ha+D|0;c=N>>>0>>0?c+1|0:c;y=N;A=c;c=R+c|0;S=G+y|0;c=S>>>0>>0?c+1|0:c;Q=n^S;n=c;ha=Ci(Q,c^ra,40);N=ha+F|0;ra=W;c=ra+j|0;j=N;F=G^j;G=j>>>0>>0?c+1|0:c;N=Ci(F,R^G,48);_=W;c=n+_|0;F=N;n=S+F|0;c=n>>>0>>0?c+1|0:c;R=c;I=Ci(n^ha,ra^c,1);S=z[b+72|0]|z[b+73|0]<<8|(z[b+74|0]<<16|z[b+75|0]<<24);N=I+S|0;ma=W;ra=z[b+76|0]|z[b+77|0]<<8|(z[b+78|0]<<16|z[b+79|0]<<24);c=ma+ra|0;sa=N;M=N>>>0>>0?c+1|0:c;T=la;N=z[b+96|0]|z[b+97|0]<<8|(z[b+98|0]<<16|z[b+99|0]<<24);c=z[b+100|0]|z[b+101|0]<<8|(z[b+102|0]<<16|z[b+103|0]<<24);ha=c;c=k;k=Ci(y^P,A^Y,1);P=c+k|0;y=W;c=y+l|0;c=(k>>>0>P>>>0?c+1|0:c)+ha|0;l=P;P=N+P|0;l=l>>>0>P>>>0?c+1|0:c;c=l+T|0;A=P+Z|0;c=A>>>0

>>0?c+1|0:c;Q=A;A=c;q=Ci(d^q,B^C,48);C=W;c=Ci(q^P,C^l,32);P=W;Y=P;B=c;c=x+U|0;P=i+r|0;r=P>>>0>>0?c+1|0:c;c=Y+r|0;l=P;i=l+B|0;c=l>>>0>i>>>0?c+1|0:c;x=c;k=Ci(i^k,y^c,40);P=k+Q|0;U=W;c=U+A|0;A=P;y=k>>>0>A>>>0?c+1|0:c;c=y+M|0;P=A+sa|0;d=A>>>0>P>>>0?c+1|0:c;c=d+qa|0;M=P+da|0;c=M>>>0

>>0?c+1|0:c;sa=M;M=c;Q=P;T=d;P=z[b+116|0]|z[b+117|0]<<8|(z[b+118|0]<<16|z[b+119|0]<<24);b=z[b+112|0]|z[b+113|0]<<8|(z[b+114|0]<<16|z[b+115|0]<<24);g=Ci(g^l,r^E,1);d=g+v|0;E=W;c=E+u|0;c=(d>>>0>>0?c+1|0:c)+P|0;r=d;d=b+d|0;l=r>>>0>d>>>0?c+1|0:c;c=l+qa|0;r=d+da|0;c=r>>>0>>0?c+1|0:c;ya=r;r=c;c=Ci(d^m,l^J,32);d=W;X=d;m=c;l=d;c=C+H|0;d=e+q|0;c=d>>>0>>0?c+1|0:c;q=d;v=c;c=c+l|0;d=d+m|0;c=q>>>0>d>>>0?c+1|0:c;u=d;J=c;l=Ci(d^g,E^c,40);d=l+ya|0;E=W;c=E+r|0;e=d>>>0>>0?c+1|0:c;m=Ci(d^m,X^e,48);ya=W;c=Ci(m^Q,ya^T,32);g=W;X=g;r=c;Q=g;h=Ci(h^q,v^K,1);q=W;c=t+q|0;g=f;f=f+h|0;c=(g>>>0>f>>>0?c+1|0:c)+$|0;g=f+O|0;f=g>>>0>>0?c+1|0:c;c=f+ra|0;t=g+S|0;c=t>>>0>>0?c+1|0:c;T=t;t=c;v=h;g=Ci(g^D,f^V,32);h=g+o|0;D=W;c=D+p|0;f=h;p=g>>>0>f>>>0?c+1|0:c;o=Ci(v^f,p^q,40);h=o+T|0;V=W;c=V+t|0;q=h;t=h>>>0>>0?c+1|0:c;h=Ci(g^h,D^t,48);Da=W;c=p+Da|0;p=h;h=f+h|0;c=h>>>0>>0?c+1|0:c;v=h;D=c;c=c+Q|0;h=h+r|0;c=v>>>0>h>>>0?c+1|0:c;Q=h;h=h^I;I=c;g=Ci(h,ma^c,40);h=g+sa|0;ma=W;c=ma+M|0;M=h;T=g>>>0>h>>>0?c+1|0:c;c=Aa+T|0;h=h+pa|0;c=h>>>0>>0?c+1|0:c;sa=h;C=c;h=d;H=Z;K=la;d=Ci(B^A,y^Y,48);Y=W;c=x+Y|0;B=d;f=i+d|0;c=f>>>0>>0?c+1|0:c;x=c;d=Ci(f^k,U^c,1);i=W;c=i+K|0;k=d+H|0;c=(k>>>0>>0?c+1|0:c)+e|0;e=h+k|0;h=e>>>0>>0?c+1|0:c;c=va+h|0;k=e+ba|0;c=k>>>0>>0?c+1|0:c;A=k;k=c;e=Ci(e^p,h^Da,32);y=W;c=R+y|0;p=e;e=n+e|0;c=e>>>0>>0?c+1|0:c;n=c;h=Ci(d^e,c^i,40);d=h+A|0;c=k;k=W;c=c+k|0;i=d;A=d>>>0>>0?c+1|0:c;d=Ci(d^p,y^A,48);U=W;c=n+U|0;y=d;n=e+d|0;c=n>>>0>>0?c+1|0:c;R=c;d=Ci(h^n,k^c,1);k=W;c=k+C|0;e=d+sa|0;h=e>>>0>>0?c+1|0:c;c=za+h|0;p=e+oa|0;c=p>>>0>>0?c+1|0:c;sa=p;p=c;C=d;H=k;c=J+ya|0;d=m+u|0;c=d>>>0>>0?c+1|0:c;m=d;u=c;c=Ci(d^l,E^c,1);k=W;l=k;d=c;c=t+P|0;q=b+q|0;c=(q>>>0>>0?c+1|0:c)+k|0;k=d+q|0;q=k>>>0>>0?c+1|0:c;c=na+q|0;t=k+ca|0;c=t>>>0>>0?c+1|0:c;J=t;t=c;k=Ci(k^F,q^_,32);F=W;c=x+F|0;x=f;q=k;f=f+k|0;c=x>>>0>f>>>0?c+1|0:c;x=c;k=Ci(d^f,c^l,40);d=k+J|0;E=W;c=E+t|0;l=d;t=d^q;q=d>>>0>>0?c+1|0:c;d=Ci(t,F^q,48);_=W;c=x+_|0;x=d;d=f+d|0;c=d>>>0>>0?c+1|0:c;t=d;F=c;J=e;K=h;d=Ci(o^v,D^V,1);f=W;c=f+s|0;e=d+ga|0;c=G+(e>>>0>>0?c+1|0:c)|0;e=e+j|0;h=e>>>0>>0?c+1|0:c;c=$+h|0;j=e+O|0;c=j>>>0>>0?c+1|0:c;G=j;j=c;o=d;e=Ci(e^B,h^Y,32);d=e+m|0;m=W;c=m+u|0;h=d;B=d>>>0>>0?c+1|0:c;f=Ci(d^o,B^f,40);d=f+G|0;Y=W;c=Y+j|0;j=d;G=d>>>0>>0?c+1|0:c;v=Ci(d^e,m^G,48);c=K;K=W;e=Ci(v^J,c^K,32);d=e+t|0;J=W;c=J+F|0;m=d;u=d>>>0>>0?c+1|0:c;o=Ci(d^C,u^H,40);d=o+sa|0;C=W;c=C+p|0;p=d;D=d>>>0>>0?c+1|0:c;d=Ci(d^e,J^D,48);V=W;c=u+V|0;e=m;u=d;m=m+d|0;c=e>>>0>m>>>0?c+1|0:c;J=c;d=Ci(m^o,C^c,1);sa=W;c=qa+sa|0;C=d;d=da+d|0;c=d>>>0>>0?c+1|0:c;ya=d;o=c;e=ia;d=Ci(k^t,E^F,1);k=W;c=A+k|0;t=i;i=d+i|0;c=(t>>>0>i>>>0?c+1|0:c)+ka|0;e=e+i|0;t=e>>>0>>0?c+1|0:c;c=t+ta|0;i=e+ja|0;c=i>>>0>>0?c+1|0:c;H=i;A=c;F=d;i=Ci(r^M,T^X,48);E=W;c=Ci(i^e,E^t,32);d=W;X=d;r=c;e=d;c=B+K|0;d=h+v|0;c=d>>>0>>0?c+1|0:c;h=d;B=c;c=c+e|0;d=d+r|0;c=h>>>0>d>>>0?c+1|0:c;t=d;v=c;e=Ci(d^F,c^k,40);c=A;A=W;c=c+A|0;d=e+H|0;c=d>>>0>>0?c+1|0:c;F=d;M=c;c=c+o|0;k=d+ya|0;c=k>>>0>>0?c+1|0:c;T=c;o=c;d=Ci(f^h,B^Y,1);f=W;c=L+f|0;h=d+ea|0;c=q+(h>>>0>>0?c+1|0:c)|0;h=h+l|0;l=h>>>0>>0?c+1|0:c;c=ha+l|0;q=h+N|0;c=q>>>0>>0?c+1|0:c;H=q;q=c;B=d;c=Ci(h^y,l^U,32);d=W;K=d;h=c;l=d;c=E+I|0;d=i+Q|0;c=d>>>0>>0?c+1|0:c;y=d;I=c;c=c+l|0;i=d+h|0;c=i>>>0>>0?c+1|0:c;d=i^B;B=c;l=Ci(d,c^f,40);d=l+H|0;U=W;c=U+q|0;f=d;q=d>>>0>>0?c+1|0:c;Q=Ci(d^h,K^q,48);Y=W;c=Ci(Q^k,Y^o,32);d=W;ya=d;H=c;o=d;d=Ci(g^y,I^ma,1);g=W;c=G+g|0;h=d+j|0;c=ua+(h>>>0>>0?c+1|0:c)|0;h=h+aa|0;j=h>>>0>>0?c+1|0:c;c=j+xa|0;G=h+fa|0;c=G>>>0>>0?c+1|0:c;y=G;G=c;h=Ci(h^x,j^_,32);I=W;c=R+I|0;x=h;h=n+h|0;c=h>>>0>>0?c+1|0:c;j=g;g=c;j=Ci(d^h,j^c,40);d=j+y|0;_=W;c=_+G|0;n=d;y=d^x;x=d>>>0>>0?c+1|0:c;d=Ci(y,I^x,48);E=W;c=g+E|0;g=d;d=h+d|0;c=d>>>0>>0?c+1|0:c;G=d;y=c;c=c+o|0;o=d+H|0;c=o>>>0>>0?c+1|0:c;R=c;h=Ci(o^C,sa^c,40);I=W;c=T+I|0;d=h+k|0;c=(d>>>0>>0?c+1|0:c)+la|0;k=d;d=d+Z|0;c=k>>>0>d>>>0?c+1|0:c;T=d;C=c;K=$;k=Ci(r^F,M^X,48);d=k+t|0;ma=W;c=ma+v|0;r=d;t=d>>>0>>0?c+1|0:c;c=Ci(d^e,t^A,1);e=W;A=e;d=c;c=q+Aa|0;f=f+pa|0;c=(f>>>0>>0?c+1|0:c)+e|0;e=d+f|0;f=e>>>0>>0?c+1|0:c;c=f+K|0;q=e+O|0;c=q>>>0>>0?c+1|0:c;v=q;q=c;e=Ci(e^g,f^E,32);F=W;c=J+F|0;g=e+m|0;c=g>>>0>>0?c+1|0:c;m=c;f=Ci(d^g,c^A,40);d=f+v|0;M=W;c=M+q|0;q=d;A=d>>>0>>0?c+1|0:c;e=Ci(d^e,F^A,48);v=W;c=m+v|0;m=e+g|0;c=m>>>0>>0?c+1|0:c;F=c;d=Ci(f^m,M^c,1);M=W;c=M+C|0;g=d+T|0;c=ra+(g>>>0>>0?c+1|0:c)|0;g=g+S|0;f=g>>>0>>0?c+1|0:c;c=f+s|0;s=g+ga|0;c=s>>>0>>0?c+1|0:c;sa=s;s=c;J=d;K=g;E=f;g=ia;d=Ci(j^G,y^_,1);j=W;c=D+j|0;f=p;p=d+p|0;c=(f>>>0>p>>>0?c+1|0:c)+ka|0;g=g+p|0;f=g>>>0

>>0?c+1|0:c;c=xa+f|0;p=g+fa|0;c=p>>>0>>0?c+1|0:c;D=p;G=c;p=d;c=Ci(g^k,f^ma,32);d=W;y=d;f=c;c=B+Y|0;d=i+Q|0;i=d>>>0>>0?c+1|0:c;c=y+i|0;k=d+f|0;c=k>>>0>>0?c+1|0:c;B=c;p=Ci(k^p,c^j,40);g=p+D|0;Y=W;c=Y+G|0;D=g^f;f=g>>>0

>>0?c+1|0:c;G=Ci(D,y^f,48);_=W;c=Ci(G^K,_^E,32);j=W;ma=j;D=c;y=j;d=Ci(d^l,i^U,1);j=W;c=ha+j|0;i=d+N|0;c=x+(i>>>0>>0?c+1|0:c)|0;i=i+n|0;n=i>>>0>>0?c+1|0:c;c=ua+n|0;l=i+aa|0;c=l>>>0>>0?c+1|0:c;K=l;l=c;x=d;Q=j;i=Ci(i^u,n^V,32);d=i+r|0;u=W;c=u+t|0;j=d;r=d>>>0>>0?c+1|0:c;n=Ci(d^x,r^Q,40);d=n+K|0;U=W;c=U+l|0;x=d;t=d>>>0>>0?c+1|0:c;d=Ci(d^i,u^t,48);K=W;c=r+K|0;l=d;d=j+d|0;c=d>>>0>>0?c+1|0:c;r=d;u=c;c=c+y|0;d=d+D|0;c=r>>>0>d>>>0?c+1|0:c;y=d;i=M;M=c;i=Ci(d^J,i^c,40);c=s;s=W;c=c+s|0;d=i+sa|0;c=d>>>0>>0?c+1|0:c;Q=d;J=c;j=f;d=Ci(H^T,C^ya,48);V=W;c=R+V|0;R=d;d=o+d|0;c=d>>>0>>0?c+1|0:c;f=d^h;h=c;f=Ci(f,c^I,1);g=f+g|0;I=W;c=I+j|0;c=za+(g>>>0>>0?c+1|0:c)|0;g=g+oa|0;j=g>>>0>>0?c+1|0:c;c=j+L|0;o=g+ea|0;c=o>>>0>>0?c+1|0:c;T=o;o=c;g=Ci(g^l,j^K,32);C=W;c=F+C|0;F=g;j=m+g|0;c=j>>>0>>0?c+1|0:c;m=c;f=Ci(f^j,I^c,40);g=f+T|0;c=o;o=W;c=c+o|0;l=g;H=g^F;F=g>>>0>>0?c+1|0:c;g=Ci(H,C^F,48);sa=W;c=m+sa|0;I=g;m=j+g|0;c=m>>>0>>0?c+1|0:c;T=c;g=Ci(f^m,o^c,1);o=W;c=o+J|0;f=g+Q|0;c=Aa+(f>>>0>>0?c+1|0:c)|0;f=f+pa|0;j=f>>>0>>0?c+1|0:c;c=P+j|0;C=b+f|0;c=C>>>0>>0?c+1|0:c;ya=C;C=c;H=g;K=o;o=f;E=j;g=Ci(n^r,u^U,1);j=W;c=j+A|0;f=g+q|0;c=na+(f>>>0>>0?c+1|0:c)|0;f=f+ca|0;n=f>>>0>>0?c+1|0:c;c=n+P|0;q=b+f|0;c=q>>>0>>0?c+1|0:c;A=q;q=c;r=g;c=Ci(f^R,n^V,32);g=W;f=c;n=g;c=B+_|0;g=k+G|0;c=g>>>0>>0?c+1|0:c;k=g;B=c;c=c+n|0;g=g+f|0;c=k>>>0>g>>>0?c+1|0:c;G=g;g=g^r;r=c;j=Ci(g,c^j,40);g=j+A|0;U=W;c=U+q|0;q=g^f;f=g>>>0>>0?c+1|0:c;n=Ci(q,n^f,48);c=E;E=W;c=Ci(n^o,c^E,32);o=W;V=o;q=c;A=h;h=e;c=Ci(k^p,B^Y,1);e=W;u=e;k=c;c=t+ta|0;p=x+ja|0;c=(p>>>0>>0?c+1|0:c)+e|0;e=k+p|0;c=e>>>0

>>0?c+1|0:c;p=c;h=Ci(e^h,c^v,32);d=h+d|0;c=A;A=W;c=c+A|0;B=d>>>0>>0?c+1|0:c;k=Ci(d^k,u^B,40);Y=W;c=p+Y|0;t=e;x=k;e=e+k|0;c=va+(t>>>0>e>>>0?c+1|0:c)|0;k=e+ba|0;c=k>>>0>>0?c+1|0:c;t=c;e=Ci(h^k,A^c,48);_=W;c=B+_|0;v=d;h=e;d=d+e|0;c=v>>>0>d>>>0?c+1|0:c;B=d;A=c;c=c+o|0;o=d+q|0;c=o>>>0>>0?c+1|0:c;v=c;p=Ci(o^H,c^K,40);d=p+ya|0;ya=W;c=ya+C|0;u=d;R=d>>>0

>>0?c+1|0:c;d=Ci(D^Q,J^ma,48);D=W;c=D+M|0;e=d+y|0;c=e>>>0>>0?c+1|0:c;y=e;H=s;s=c;c=Ci(e^i,H^c,1);e=W;Q=e;i=c;c=f+za|0;g=g+oa|0;c=(g>>>0>>0?c+1|0:c)+e|0;e=g+i|0;g=e>>>0>>0?c+1|0:c;c=ra+g|0;f=e+S|0;c=f>>>0>>0?c+1|0:c;J=f;f=c;e=Ci(e^h,g^_,32);C=W;c=T+C|0;M=e;h=m+e|0;c=h>>>0>>0?c+1|0:c;e=h^i;i=c;g=Ci(e,Q^c,40);e=g+J|0;c=f;f=W;c=c+f|0;Q=e;m=e^M;M=e>>>0>>0?c+1|0:c;e=Ci(m,C^M,48);_=W;c=i+_|0;T=e;e=h+e|0;c=e>>>0>>0?c+1|0:c;h=c;g=Ci(e^g,f^c,1);m=W;c=m+R|0;f=g+u|0;c=qa+(f>>>0>>0?c+1|0:c)|0;f=f+da|0;i=f>>>0>>0?c+1|0:c;c=i+$|0;J=f+O|0;c=J>>>0>>0?c+1|0:c;X=J;J=c;C=g;H=f;K=i;g=Ci(x^B,A^Y,1);f=g+Z|0;A=W;c=A+la|0;c=F+(g>>>0>f>>>0?c+1|0:c)|0;f=f+l|0;c=f>>>0>>0?c+1|0:c;i=c;c=Ci(d^f,c^D,32);d=W;D=d;l=c;c=r+E|0;d=n+G|0;c=d>>>0>>0?c+1|0:c;n=d;B=c;c=D+c|0;d=d+l|0;c=n>>>0>d>>>0?c+1|0:c;r=d;x=c;d=Ci(d^g,A^c,40);E=W;c=i+E|0;G=d;d=f+d|0;c=ha+(d>>>0>>0?c+1|0:c)|0;d=d+N|0;c=d>>>0>>0?c+1|0:c;A=d;d=d^l;l=c;i=Ci(d,D^c,48);c=K;K=W;c=Ci(i^H,c^K,32);d=W;Y=d;D=c;F=d;d=Ci(j^n,B^U,1);f=W;c=ta+f|0;g=d+ja|0;c=t+(g>>>0>>0?c+1|0:c)|0;g=g+k|0;j=g>>>0>>0?c+1|0:c;c=j+L|0;n=g+ea|0;c=n>>>0>>0?c+1|0:c;t=n;n=c;k=d;B=f;g=Ci(g^I,j^sa,32);d=g+y|0;y=W;c=y+s|0;f=d;j=d^k;k=d>>>0>>0?c+1|0:c;j=Ci(j,k^B,40);d=j+t|0;U=W;c=U+n|0;n=d;s=d>>>0>>0?c+1|0:c;g=Ci(d^g,y^s,48);B=W;c=k+B|0;d=g+f|0;c=d>>>0>>0?c+1|0:c;t=d;y=c;c=c+F|0;k=d+D|0;c=k>>>0>>0?c+1|0:c;F=c;f=Ci(k^C,c^m,40);I=W;c=I+J|0;d=f+X|0;c=d>>>0>>0?c+1|0:c;J=d;C=c;d=e;m=h;h=g;e=Ci(q^u,R^V,48);X=W;c=v+X|0;q=e;g=o+e|0;c=g>>>0>>0?c+1|0:c;o=c;c=Ci(g^p,ya^c,1);e=W;v=e;p=c;c=l+wa|0;l=A+ga|0;c=(l>>>0>>0?c+1|0:c)+e|0;e=l+p|0;c=e>>>0>>0?c+1|0:c;l=c;h=Ci(e^h,c^B,32);d=h+d|0;A=W;c=A+m|0;m=d>>>0>>0?c+1|0:c;p=Ci(d^p,v^m,40);u=W;c=l+u|0;l=e;e=e+p|0;c=ua+(l>>>0>e>>>0?c+1|0:c)|0;l=e+aa|0;c=l>>>0>>0?c+1|0:c;B=c;e=Ci(h^l,A^c,48);V=W;c=m+V|0;A=e;m=d+e|0;c=m>>>0>>0?c+1|0:c;v=c;d=Ci(m^p,u^c,1);p=W;c=p+C|0;e=d+J|0;c=na+(e>>>0>>0?c+1|0:c)|0;e=e+ca|0;h=e>>>0>>0?c+1|0:c;c=qa+h|0;u=e+da|0;c=u>>>0>>0?c+1|0:c;ma=u;u=c;R=d;H=e;d=Ci(j^t,y^U,1);j=W;c=j+M|0;e=d+Q|0;c=xa+(e>>>0>>0?c+1|0:c)|0;e=e+fa|0;t=e>>>0>>0?c+1|0:c;c=va+t|0;y=e+ba|0;c=y>>>0>>0?c+1|0:c;Q=y;y=c;M=d;c=Ci(e^q,t^X,32);d=W;X=d;e=c;c=x+K|0;d=i+r|0;c=d>>>0>>0?c+1|0:c;r=d;q=c;c=X+c|0;i=d+e|0;c=i>>>0>>0?c+1|0:c;x=c;j=Ci(i^M,c^j,40);d=j+Q|0;K=W;c=K+y|0;t=d;y=d>>>0>>0?c+1|0:c;M=Ci(d^e,X^y,48);X=W;c=Ci(M^H,X^h,32);d=W;U=d;Q=c;h=d;e=ia;d=Ci(r^G,q^E,1);q=W;c=s+q|0;r=n;n=d+n|0;c=(r>>>0>n>>>0?c+1|0:c)+ka|0;e=e+n|0;n=e>>>0>>0?c+1|0:c;c=na+n|0;s=e+ca|0;c=s>>>0>>0?c+1|0:c;r=s;s=c;e=Ci(e^T,n^_,32);G=W;c=o+G|0;o=e;e=g+e|0;c=e>>>0>>0?c+1|0:c;g=q;q=c;g=Ci(d^e,g^c,40);d=g+r|0;E=W;c=E+s|0;n=d;s=d>>>0>>0?c+1|0:c;d=Ci(d^o,G^s,48);H=W;c=q+H|0;q=d;d=e+d|0;c=d>>>0>>0?c+1|0:c;r=d;G=c;c=c+h|0;o=d+Q|0;c=o>>>0>>0?c+1|0:c;d=o^R;R=c;p=Ci(d,c^p,40);d=p+ma|0;_=W;c=_+u|0;u=d;T=d>>>0

>>0?c+1|0:c;d=Ci(D^J,C^Y,48);Y=W;c=F+Y|0;D=d;d=k+d|0;c=d>>>0>>0?c+1|0:c;k=d;F=c;c=Ci(d^f,c^I,1);d=W;I=d;h=c;c=y+ra|0;e=t+S|0;c=(e>>>0>>0?c+1|0:c)+d|0;d=e+h|0;e=d>>>0>>0?c+1|0:c;c=ua+e|0;f=d+aa|0;c=f>>>0>>0?c+1|0:c;t=f;f=c;d=Ci(d^q,e^H,32);y=W;c=v+y|0;q=d;e=m+d|0;c=e>>>0>>0?c+1|0:c;m=c;h=Ci(e^h,I^c,40);d=h+t|0;I=W;c=I+f|0;t=d;f=d^q;q=d>>>0>>0?c+1|0:c;d=Ci(f,y^q,48);ma=W;c=m+ma|0;m=d;f=e+d|0;c=f>>>0>>0?c+1|0:c;v=c;d=Ci(f^h,I^c,1);y=W;c=y+T|0;e=d+u|0;c=ta+(e>>>0>>0?c+1|0:c)|0;e=e+ja|0;h=e>>>0>>0?c+1|0:c;c=h+la|0;I=e+Z|0;c=I>>>0>>0?c+1|0:c;sa=I;I=c;J=d;C=e;H=h;d=Ci(g^r,E^G,1);h=W;c=xa+h|0;e=d+fa|0;c=B+(e>>>0>>0?c+1|0:c)|0;e=e+l|0;g=e>>>0>>0?c+1|0:c;c=wa+g|0;l=e+ga|0;c=l>>>0>>0?c+1|0:c;G=l;l=c;B=d;r=h;c=Ci(e^D,g^Y,32);d=W;D=d;g=c;e=d;c=x+X|0;d=i+M|0;c=d>>>0>>0?c+1|0:c;i=d;x=c;c=c+e|0;h=d+g|0;c=h>>>0>>0?c+1|0:c;d=h^B;B=c;d=Ci(d,c^r,40);c=l;l=W;c=c+l|0;e=d+G|0;c=e>>>0>>0?c+1|0:c;r=e;G=c;D=Ci(e^g,D^c,48);c=H;H=W;c=Ci(D^C,c^H,32);e=W;E=e;M=c;e=Ci(i^j,x^K,1);i=W;c=i+ka|0;g=e+ia|0;c=s+(g>>>0>>0?c+1|0:c)|0;g=g+n|0;j=g>>>0>>0?c+1|0:c;c=za+j|0;n=g+oa|0;c=n>>>0>>0?c+1|0:c;K=n;n=c;s=e;x=i;g=Ci(g^A,j^V,32);e=g+k|0;A=W;c=A+F|0;i=e;k=e>>>0>>0?c+1|0:c;j=Ci(e^s,k^x,40);e=j+K|0;K=W;c=K+n|0;s=e;x=e>>>0>>0?c+1|0:c;e=Ci(e^g,A^x,48);X=W;c=k+X|0;A=e;e=i+e|0;c=e>>>0>>0?c+1|0:c;F=e;C=c;c=E+c|0;g=e+M|0;c=g>>>0>>0?c+1|0:c;e=y;y=c;i=Ci(g^J,e^c,40);e=i+sa|0;Y=W;c=Y+I|0;n=e;I=e>>>0>>0?c+1|0:c;c=Ci(e^M,E^I,48);e=W;E=e;M=c;e=d;c=B+H|0;d=h+D|0;c=d>>>0>>0?c+1|0:c;B=d;D=c;c=Ci(d^e,c^l,1);e=W;h=e;d=c;c=x+Aa|0;k=s+pa|0;c=(k>>>0>>0?c+1|0:c)+e|0;e=d+k|0;k=e>>>0>>0?c+1|0:c;c=ha+k|0;l=e+N|0;c=l>>>0>>0?c+1|0:c;H=l;l=c;s=d;x=h;d=Ci(u^Q,T^U,48);U=W;c=R+U|0;u=d;d=o+d|0;c=d>>>0>>0?c+1|0:c;o=d;e=Ci(e^m,k^ma,32);d=e+d|0;R=c;Q=W;c=c+Q|0;h=d;m=d>>>0>>0?c+1|0:c;k=Ci(d^s,m^x,40);d=k+H|0;T=W;c=T+l|0;l=d;s=d>>>0>>0?c+1|0:c;d=Ci(d^e,Q^s,48);V=W;c=m+V|0;x=d;m=h+d|0;c=m>>>0>>0?c+1|0:c;Q=c;d=Ci(k^m,T^c,1);H=W;c=ua+H|0;T=d;d=aa+d|0;c=d>>>0>>0?c+1|0:c;ma=d;h=c;d=Ci(p^o,R^_,1);k=W;c=k+G|0;e=d+r|0;c=va+(e>>>0>>0?c+1|0:c)|0;e=e+ba|0;o=e>>>0>>0?c+1|0:c;c=$+o|0;p=e+O|0;c=p>>>0>>0?c+1|0:c;R=p;p=c;r=k;e=Ci(e^A,o^X,32);X=W;c=v+X|0;G=e;k=f+e|0;c=k>>>0>>0?c+1|0:c;f=r;r=c;o=Ci(d^k,f^c,40);d=o+R|0;_=W;c=_+p|0;A=d;v=d>>>0>>0?c+1|0:c;c=v+h|0;h=d+ma|0;c=h>>>0>>0?c+1|0:c;p=c;c=Ci(h^M,c^E,32);d=W;R=c;J=d;d=Ci(j^F,C^K,1);f=W;c=f+q|0;e=d+t|0;c=P+(e>>>0>>0?c+1|0:c)|0;e=b+e|0;j=e>>>0>>0?c+1|0:c;c=j+L|0;q=e+ea|0;c=q>>>0>>0?c+1|0:c;C=q;q=c;t=d;F=f;e=Ci(e^u,j^U,32);d=e+B|0;u=W;c=u+D|0;f=d;B=d>>>0>>0?c+1|0:c;j=Ci(d^t,B^F,40);d=j+C|0;C=W;c=C+q|0;q=d;t=d>>>0>>0?c+1|0:c;d=Ci(d^e,u^t,48);U=W;c=B+U|0;B=d;d=f+d|0;c=d>>>0>>0?c+1|0:c;f=d;u=c;c=c+J|0;d=d+R|0;c=f>>>0>d>>>0?c+1|0:c;D=c;e=Ci(d^T,H^c,40);H=W;c=p+H|0;F=e;e=h+e|0;c=Aa+(e>>>0>>0?c+1|0:c)|0;e=e+pa|0;c=e>>>0>>0?c+1|0:c;T=e;h=e^R;R=c;e=Ci(h,J^c,48);J=W;c=D+J|0;p=d+e|0;c=p>>>0>>0?c+1|0:c;D=c;c=Ci(p^F,H^c,1);h=W;d=c;F=h;h=Ci(f^j,u^C,1);j=W;c=s+j|0;f=h+l|0;c=va+(f>>>0>>0?c+1|0:c)|0;f=f+ba|0;l=f>>>0>>0?c+1|0:c;c=na+l|0;s=f+ca|0;c=s>>>0>>0?c+1|0:c;H=s;s=c;u=h;C=j;c=y+E|0;h=g+M|0;c=h>>>0>>0?c+1|0:c;y=h;G=Ci(A^G,v^X,48);X=W;j=Ci(f^G,l^X,32);h=j+h|0;A=c;ma=W;c=c+ma|0;l=h;v=h>>>0>>0?c+1|0:c;h=Ci(h^u,v^C,40);u=W;c=u+s|0;g=h+H|0;c=g>>>0>>0?c+1|0:c;M=g;C=c;c=c+F|0;g=d+g|0;c=za+(M>>>0>g>>>0?c+1|0:c)|0;g=g+oa|0;f=g>>>0>>0?c+1|0:c;c=f+ka|0;s=g+ia|0;c=s>>>0>>0?c+1|0:c;sa=s;H=c;K=d;E=g;c=Ci(i^y,A^Y,1);g=W;i=g;d=c;c=t+xa|0;s=q+fa|0;c=(s>>>0>>0?c+1|0:c)+g|0;g=d+s|0;s=g>>>0>>0?c+1|0:c;c=ha+s|0;q=g+N|0;c=q>>>0>>0?c+1|0:c;A=q;q=c;t=d;c=Ci(g^x,s^V,32);d=W;y=d;g=c;s=d;c=r+X|0;d=k+G|0;c=d>>>0>>0?c+1|0:c;r=d;x=c;c=c+s|0;k=d+g|0;c=k>>>0>>0?c+1|0:c;d=k^t;t=c;s=Ci(d,c^i,40);d=s+A|0;X=W;c=X+q|0;q=d^g;g=d>>>0>>0?c+1|0:c;G=Ci(q,y^g,48);c=G^E;E=W;c=Ci(c,E^f,32);f=W;Y=f;A=c;q=f;f=Ci(o^r,x^_,1);o=W;c=$+o|0;i=f+O|0;c=I+(i>>>0>>0?c+1|0:c)|0;i=i+n|0;n=i>>>0>>0?c+1|0:c;c=ta+n|0;r=i+ja|0;c=r>>>0>>0?c+1|0:c;x=r;r=c;i=Ci(i^B,n^U,32);y=W;c=Q+y|0;B=i;i=m+i|0;c=i>>>0>>0?c+1|0:c;m=c;n=Ci(f^i,c^o,40);f=n+x|0;U=W;c=U+r|0;o=f;r=f^B;B=f>>>0>>0?c+1|0:c;f=Ci(r,y^B,48);V=W;c=m+V|0;r=f;f=i+f|0;c=f>>>0>>0?c+1|0:c;x=f;y=c;c=c+q|0;i=f+A|0;c=i>>>0>>0?c+1|0:c;f=F;F=c;m=Ci(i^K,f^c,40);f=m+sa|0;I=W;c=I+H|0;q=f;H=f^A;A=f>>>0>>0?c+1|0:c;f=Ci(H,Y^A,48);Y=W;c=F+Y|0;F=f;f=i+f|0;c=f>>>0>>0?c+1|0:c;i=c;c=Ci(f^m,I^c,1);m=W;I=c;_=c;Q=m;m=g;g=h;h=Ci(j^M,C^ma,48);ma=W;c=v+ma|0;v=h;h=l+h|0;c=h>>>0>>0?c+1|0:c;l=d;d=g^h;g=c;d=Ci(d,c^u,1);j=l+d|0;u=W;c=u+m|0;c=wa+(d>>>0>j>>>0?c+1|0:c)|0;j=j+ga|0;l=j>>>0>>0?c+1|0:c;c=la+l|0;m=j+Z|0;c=m>>>0>>0?c+1|0:c;M=m;m=c;j=Ci(j^r,l^V,32);C=W;c=D+C|0;l=j+p|0;c=l>>>0

>>0?c+1|0:c;r=c;p=Ci(d^l,u^c,40);d=p+M|0;V=W;c=V+m|0;u=d;D=d>>>0

>>0?c+1|0:c;j=Ci(d^j,C^D,48);M=W;c=r+M|0;d=j+l|0;c=d>>>0>>0?c+1|0:c;C=d;r=d;H=c;l=h;m=g;c=t+E|0;d=k+G|0;c=d>>>0>>0?c+1|0:c;k=d;d=d^s;s=c;c=Ci(d,X^c,1);d=W;K=d;t=c;g=c;c=B+L|0;h=o+ea|0;c=(h>>>0>>0?c+1|0:c)+d|0;d=h;h=g+h|0;c=d>>>0>h>>>0?c+1|0:c;o=c;g=Ci(e^h,c^J,32);d=g+l|0;c=m;m=W;c=c+m|0;G=d;e=d^t;t=d>>>0>>0?c+1|0:c;e=Ci(e,K^t,40);J=W;c=o+J|0;d=e+h|0;c=ra+(d>>>0>>0?c+1|0:c)|0;l=d+S|0;c=l>>>0>>0?c+1|0:c;K=c;m=Ci(g^l,m^c,48);c=W;sa=c;d=Ci(n^x,y^U,1);g=W;c=g+R|0;h=d+T|0;c=qa+(h>>>0>>0?c+1|0:c)|0;h=h+da|0;n=h>>>0>>0?c+1|0:c;c=P+n|0;o=b+h|0;c=o>>>0>>0?c+1|0:c;R=o;x=c;y=d;o=Ci(h^v,n^ma,32);d=o+k|0;U=W;c=U+s|0;s=d;v=d>>>0>>0?c+1|0:c;h=Ci(d^y,v^g,40);c=x;x=W;c=c+x|0;d=h+R|0;c=d>>>0>>0?c+1|0:c;y=d;R=c;g=c;c=P+Q|0;n=b+I|0;c=(n>>>0>>0?c+1|0:c)+g|0;g=d+n|0;c=g>>>0>>0?c+1|0:c;B=c;d=Ci(g^m,sa^c,32);I=W;c=I+H|0;n=d+r|0;c=n>>>0>>0?c+1|0:c;k=Ci(n^_,c^Q,40);Q=c;r=W;c=la+r|0;T=k+Z|0;c=B+(T>>>0>>0?c+1|0:c)|0;B=g+T|0;c=B>>>0>>0?c+1|0:c;g=I;I=c;g=Ci(d^B,g^c,48);c=Q;Q=W;c=c+Q|0;n=g+n|0;c=n>>>0>>0?c+1|0:c;d=k^n;k=c;c=Ci(d,c^r,1);d=W;T=c;_=c;E=d;r=f;X=i;f=h;h=Ci(o^y,R^U,48);y=W;c=v+y|0;d=h+s|0;c=d>>>0>>0?c+1|0:c;o=d;s=c;f=Ci(d^f,c^x,1);d=f+ga|0;R=W;c=R+wa|0;c=K+(d>>>0>>0?c+1|0:c)|0;i=d+l|0;c=i>>>0>>0?c+1|0:c;l=c;d=Ci(i^j,c^M,32);x=W;c=x+X|0;j=d+r|0;c=j>>>0>>0?c+1|0:c;r=j;v=c;f=Ci(f^j,c^R,40);ma=W;c=na+ma|0;R=f;f=ca+f|0;c=l+(f>>>0>>0?c+1|0:c)|0;f=f+i|0;c=f>>>0>>0?c+1|0:c;i=c;j=Ci(d^f,c^x,48);c=v;v=W;c=c+v|0;d=j+r|0;c=d>>>0>>0?c+1|0:c;M=d;x=d;K=c;c=t+sa|0;d=m+G|0;c=d>>>0>>0?c+1|0:c;r=d^e;e=c;c=Ci(r,c^J,1);l=W;J=l;r=c;c=D+ha|0;m=u+N|0;c=(m>>>0>>0?c+1|0:c)+l|0;t=m;m=m+r|0;c=t>>>0>m>>>0?c+1|0:c;t=c;l=Ci(m^F,Y^c,32);G=l;c=W;u=c;c=c+s|0;l=l+o|0;c=G>>>0>l>>>0?c+1|0:c;D=l;F=c;l=Ci(l^r,J^c,40);J=W;c=ka+J|0;o=l+ia|0;c=t+(o>>>0>>0?c+1|0:c)|0;r=m;m=m+o|0;c=r>>>0>m>>>0?c+1|0:c;o=c;r=Ci(m^G,c^u,48);c=W;Y=c;s=c;p=Ci(p^C,H^V,1);c=W;t=c;G=h;c=c+L|0;h=p+ea|0;c=A+(h>>>0>>0?c+1|0:c)|0;h=h+q|0;c=h>>>0>>0?c+1|0:c;q=h^G;G=c;q=Ci(q,c^y,32);d=q+d|0;V=W;c=V+e|0;A=d;e=t;t=d>>>0>>0?c+1|0:c;e=Ci(d^p,e^t,40);u=W;c=qa+u|0;d=e+da|0;c=G+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;G=d;y=c;h=c;c=E+va|0;p=T+ba|0;c=(p>>>0>>0?c+1|0:c)+h|0;h=d+p|0;c=h>>>0

>>0?c+1|0:c;T=c;d=Ci(h^r,c^s,32);C=W;c=C+K|0;p=d+x|0;c=p>>>0>>0?c+1|0:c;s=Ci(p^_,c^E,40);x=W;H=x;E=c;c=x+ta|0;x=s+ja|0;c=T+(x>>>0>>0?c+1|0:c)|0;x=h+x|0;c=x>>>0>>0?c+1|0:c;T=c;h=Ci(d^x,c^C,48);C=W;c=C+E|0;p=h+p|0;c=p>>>0>>0?c+1|0:c;d=p^s;s=c;c=Ci(d,c^H,1);d=W;H=c;E=d;X=n;U=j;j=e;e=Ci(q^G,y^V,48);q=W;c=q+t|0;d=e+A|0;c=d>>>0>>0?c+1|0:c;t=d;G=c;j=Ci(d^j,c^u,1);d=j+aa|0;u=W;c=u+ua|0;c=(d>>>0>>0?c+1|0:c)+o|0;n=d+m|0;c=n>>>0>>0?c+1|0:c;m=c;d=Ci(n^U,c^v,32);o=W;c=o+k|0;k=d+X|0;c=k>>>0>>0?c+1|0:c;A=k;v=c;j=Ci(j^k,c^u,40);U=W;c=za+U|0;u=j;j=oa+j|0;c=m+(j>>>0>>0?c+1|0:c)|0;k=j+n|0;c=k>>>0>>0?c+1|0:c;y=c;j=Ci(d^k,c^o,48);c=v;v=W;c=c+v|0;d=j+A|0;c=d>>>0>>0?c+1|0:c;A=d;X=c;m=g;n=f;c=F+Y|0;d=r+D|0;c=d>>>0>>0?c+1|0:c;g=c;f=Ci(d^l,c^J,1);l=W;c=l+$|0;o=f+O|0;c=(o>>>0>>0?c+1|0:c)+i|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;i=Ci(m^n,c^Q,32);o=c;r=f;m=W;c=m+G|0;f=i+t|0;c=f>>>0>>0?c+1|0:c;t=f;f=f^r;r=c;f=Ci(f,c^l,40);G=W;c=Aa+G|0;l=f+pa|0;c=(l>>>0>>0?c+1|0:c)+o|0;o=l;l=l+n|0;c=o>>>0>l>>>0?c+1|0:c;D=c;m=Ci(i^l,c^m,48);c=W;Y=c;n=c;i=Ci(M^R,K^ma,1);c=W;F=c;R=g;c=c+ra|0;g=i+S|0;c=I+(g>>>0>>0?c+1|0:c)|0;g=g+B|0;c=g>>>0>>0?c+1|0:c;o=q;q=c;o=Ci(e^g,o^c,32);d=o+d|0;V=W;c=V+R|0;B=d;e=F;F=d>>>0>>0?c+1|0:c;e=Ci(d^i,e^F,40);R=W;c=xa+R|0;d=e+fa|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;I=d;M=c;g=c;c=E+ha|0;i=N+H|0;c=(i>>>0>>0?c+1|0:c)+g|0;g=d+i|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^m,c^n,32);Q=W;c=Q+X|0;i=d+A|0;c=i>>>0>>0?c+1|0:c;n=Ci(i^H,c^E,40);H=c;J=W;c=L+J|0;K=n+ea|0;c=q+(K>>>0>>0?c+1|0:c)|0;q=g+K|0;c=q>>>0>>0?c+1|0:c;g=Q;Q=c;g=Ci(d^q,g^c,48);c=H;H=W;c=c+H|0;i=g+i|0;c=i>>>0>>0?c+1|0:c;d=i^n;n=c;c=Ci(d,c^J,1);d=W;J=c;K=d;E=j;j=e;e=Ci(o^I,M^V,48);c=F;F=W;c=c+F|0;d=e+B|0;c=d>>>0>>0?c+1|0:c;B=d;o=R;R=c;j=Ci(d^j,o^c,1);d=j+ja|0;I=W;c=I+ta|0;c=D+(d>>>0>>0?c+1|0:c)|0;o=l;l=d+l|0;c=o>>>0>l>>>0?c+1|0:c;d=v;v=c;d=Ci(l^E,d^c,32);c=s;s=W;c=c+s|0;o=d+p|0;c=o>>>0>>0?c+1|0:c;D=c;p=o;j=Ci(j^o,c^I,40);V=W;c=ra+V|0;I=j;j=S+j|0;c=v+(j>>>0>>0?c+1|0:c)|0;o=j+l|0;c=o>>>0>>0?c+1|0:c;v=c;j=Ci(d^o,c^s,48);c=D;D=W;c=c+D|0;d=j+p|0;c=d>>>0>>0?c+1|0:c;M=d;E=c;p=h;c=r+Y|0;d=m+t|0;c=d>>>0>>0?c+1|0:c;h=c;f=Ci(d^f,c^G,1);m=W;c=la+m|0;l=f+Z|0;c=y+(l>>>0>>0?c+1|0:c)|0;l=k+l|0;c=l>>>0>>0?c+1|0:c;r=l^p;p=c;k=Ci(r,c^C,32);c=W;s=c;r=f;c=c+R|0;f=k+B|0;c=f>>>0>>0?c+1|0:c;t=f;f=f^r;r=c;f=Ci(f,c^m,40);G=W;c=Aa+G|0;m=f+pa|0;c=p+(m>>>0>>0?c+1|0:c)|0;m=l+m|0;c=m>>>0>>0?c+1|0:c;y=c;p=Ci(k^m,c^s,48);c=W;Y=c;l=c;k=Ci(u^A,U^X,1);c=W;B=c;A=h;c=c+za|0;h=k+oa|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+x|0;c=h>>>0>>0?c+1|0:c;x=c;s=Ci(e^h,c^F,32);d=s+d|0;_=W;c=_+A|0;A=d;u=d>>>0>>0?c+1|0:c;e=Ci(d^k,u^B,40);F=W;c=P+F|0;d=b+e|0;c=x+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;x=d;R=c;h=c;c=K+qa|0;k=J+da|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+E|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^J,c^K,40);C=c;J=W;c=wa+J|0;K=l+ga|0;c=B+(K>>>0>>0?c+1|0:c)|0;B=h+K|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=C;C=W;c=c+C|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^J,1);d=W;J=c;ma=c;K=d;X=i;U=j;i=e;e=Ci(s^x,R^_,48);s=W;c=s+u|0;d=e+A|0;c=d>>>0>>0?c+1|0:c;x=d;A=c;i=Ci(d^i,c^F,1);d=i+ia|0;F=W;c=F+ka|0;c=y+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);u=W;c=u+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=c;i=Ci(i^n,c^F,40);_=W;c=ua+_|0;y=i;i=aa+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;m=i+j|0;c=m>>>0>>0?c+1|0:c;i=u;u=c;i=Ci(d^m,i^c,48);c=D;D=W;c=c+D|0;d=i+n|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;j=g;c=r+Y|0;d=p+t|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^G,1);p=W;c=p+xa|0;n=f+fa|0;c=v+(n>>>0>>0?c+1|0:c)|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;j=Ci(j^n,c^H,32);o=W;r=o;o=c;t=f;c=r+A|0;f=j+x|0;c=f>>>0>>0?c+1|0:c;x=f;f=f^t;t=c;f=Ci(f,c^p,40);G=W;c=na+G|0;p=f+ca|0;c=(p>>>0>>0?c+1|0:c)+o|0;o=n+p|0;c=o>>>0

>>0?c+1|0:c;v=r;r=c;p=Ci(j^o,v^c,48);c=W;Y=c;n=c;j=Ci(M^I,E^V,1);c=W;A=c;v=g;c=c+$|0;g=j+O|0;c=Q+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=c;s=Ci(e^g,c^s,32);d=s+d|0;V=W;c=V+v|0;v=d;e=A;A=d>>>0>>0?c+1|0:c;e=Ci(d^j,e^A,40);I=W;c=va+I|0;d=e+ba|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;g=c;c=K+Aa|0;j=J+pa|0;c=(j>>>0>>0?c+1|0:c)+g|0;g=d+j|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^p,c^n,32);J=W;c=J+R|0;j=d+F|0;c=j>>>0>>0?c+1|0:c;n=Ci(j^ma,c^K,40);K=c;H=W;c=ta+H|0;E=n+ja|0;c=q+(E>>>0>>0?c+1|0:c)|0;q=g+E|0;c=q>>>0>>0?c+1|0:c;g=J;J=c;g=Ci(d^q,g^c,48);c=K;K=W;c=c+K|0;j=g+j|0;c=j>>>0>>0?c+1|0:c;d=j^n;n=c;c=Ci(d,c^H,1);d=W;H=c;E=d;X=k;U=i;i=e;e=Ci(s^M,Q^V,48);s=W;c=s+A|0;d=e+v|0;c=d>>>0>>0?c+1|0:c;A=d;v=c;i=Ci(d^i,c^I,1);d=i+aa|0;I=W;c=I+ua|0;c=r+(d>>>0>>0?c+1|0:c)|0;k=d+o|0;c=k>>>0>>0?c+1|0:c;o=c;d=Ci(k^U,c^D,32);r=W;c=r+l|0;l=d+X|0;c=l>>>0>>0?c+1|0:c;D=c;i=Ci(i^l,c^I,40);V=W;c=$+V|0;I=i;i=O+i|0;c=o+(i>>>0>>0?c+1|0:c)|0;o=i+k|0;c=o>>>0>>0?c+1|0:c;i=r;r=c;i=Ci(d^o,i^c,48);c=D;D=W;c=c+D|0;d=i+l|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;k=h;c=t+Y|0;d=p+x|0;c=d>>>0

>>0?c+1|0:c;h=c;f=Ci(d^f,c^G,1);p=W;c=va+p|0;l=f+ba|0;c=u+(l>>>0>>0?c+1|0:c)|0;l=l+m|0;c=l>>>0>>0?c+1|0:c;m=c;k=Ci(k^l,c^C,32);c=W;x=c;t=f;c=c+v|0;f=k+A|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=qa+A|0;p=f+da|0;c=m+(p>>>0>>0?c+1|0:c)|0;m=l+p|0;c=m>>>0>>0?c+1|0:c;l=x;x=c;p=Ci(k^m,l^c,48);c=W;Y=c;l=c;k=Ci(y^F,R^_,1);c=W;v=c;u=h;c=c+P|0;h=b+k|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+B|0;c=h>>>0>>0?c+1|0:c;B=c;s=Ci(e^h,c^s,32);d=s+d|0;_=W;c=_+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^k,e^v,40);y=W;c=ra+y|0;d=e+S|0;c=B+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;h=c;c=E+la|0;k=H+Z|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+Q|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^H,c^E,40);H=c;C=W;c=za+C|0;E=l+oa|0;c=B+(E>>>0>>0?c+1|0:c)|0;B=h+E|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=H;H=W;c=c+H|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=j;U=i;i=e;e=Ci(s^F,R^_,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^y,1);d=i+N|0;y=W;c=y+ha|0;c=x+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);x=W;c=x+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=c;i=Ci(i^n,c^y,40);_=W;c=xa+_|0;y=i;i=fa+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;m=i+j|0;c=m>>>0>>0?c+1|0:c;i=x;x=c;i=Ci(d^m,i^c,48);c=D;D=W;c=c+D|0;d=i+n|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;j=g;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^A,1);p=W;c=p+na|0;n=f+ca|0;c=r+(n>>>0>>0?c+1|0:c)|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;o=c;j=Ci(j^n,c^K,32);c=W;r=c;t=f;c=c+u|0;f=j+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=ka+A|0;p=f+ia|0;c=o+(p>>>0>>0?c+1|0:c)|0;o=n+p|0;c=o>>>0>>0?c+1|0:c;v=r;r=c;p=Ci(j^o,v^c,48);c=W;Y=c;n=c;j=Ci(M^I,Q^V,1);c=W;v=c;u=g;c=c+L|0;g=j+ea|0;c=J+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=c;s=Ci(e^g,c^s,32);d=s+d|0;V=W;c=V+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^j,e^v,40);I=W;c=wa+I|0;d=e+ga|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;g=c;c=E+za|0;j=C+oa|0;c=(j>>>0>>0?c+1|0:c)+g|0;g=d+j|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^p,c^n,32);J=W;c=J+R|0;j=d+F|0;c=j>>>0>>0?c+1|0:c;n=Ci(j^C,c^E,40);K=c;C=W;c=va+C|0;E=n+ba|0;c=q+(E>>>0>>0?c+1|0:c)|0;q=g+E|0;c=q>>>0>>0?c+1|0:c;g=J;J=c;g=Ci(d^q,g^c,48);c=K;K=W;c=c+K|0;j=g+j|0;c=j>>>0>>0?c+1|0:c;d=j^n;n=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=k;U=i;i=e;e=Ci(s^M,Q^V,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^I,1);d=i+ea|0;I=W;c=I+L|0;c=r+(d>>>0>>0?c+1|0:c)|0;k=d+o|0;c=k>>>0>>0?c+1|0:c;o=c;d=Ci(k^U,c^D,32);r=W;c=r+l|0;l=d+X|0;c=l>>>0>>0?c+1|0:c;D=c;i=Ci(i^l,c^I,40);V=W;c=ka+V|0;I=i;i=ia+i|0;c=o+(i>>>0>>0?c+1|0:c)|0;o=i+k|0;c=o>>>0>>0?c+1|0:c;i=r;r=c;i=Ci(d^o,i^c,48);c=D;D=W;c=c+D|0;d=i+l|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;k=h;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;h=c;f=Ci(d^f,c^A,1);p=W;c=na+p|0;l=f+ca|0;c=x+(l>>>0>>0?c+1|0:c)|0;l=l+m|0;c=l>>>0>>0?c+1|0:c;m=c;k=Ci(k^l,c^H,32);c=W;x=c;t=f;c=c+u|0;f=k+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=xa+A|0;p=f+fa|0;c=m+(p>>>0>>0?c+1|0:c)|0;m=l+p|0;c=m>>>0>>0?c+1|0:c;l=x;x=c;p=Ci(k^m,l^c,48);c=W;Y=c;l=c;k=Ci(y^F,R^_,1);c=W;v=c;u=h;c=c+$|0;h=k+O|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+B|0;c=h>>>0>>0?c+1|0:c;B=c;s=Ci(e^h,c^s,32);d=s+d|0;_=W;c=_+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^k,e^v,40);y=W;c=wa+y|0;d=e+ga|0;c=B+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;h=c;c=E+ra|0;k=C+S|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+Q|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^C,c^E,40);H=c;C=W;c=P+C|0;E=b+l|0;c=B+(E>>>0>>0?c+1|0:c)|0;B=h+E|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=H;H=W;c=c+H|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=j;U=i;i=e;e=Ci(s^F,R^_,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^y,1);d=i+da|0;y=W;c=y+qa|0;c=x+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);x=W;c=x+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=c;i=Ci(i^n,c^y,40);_=W;c=Aa+_|0;y=i;i=pa+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;m=i+j|0;c=m>>>0>>0?c+1|0:c;i=x;x=c;i=Ci(d^m,i^c,48);c=D;D=W;c=c+D|0;d=i+n|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;j=g;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^A,1);p=W;c=p+la|0;n=f+Z|0;c=r+(n>>>0>>0?c+1|0:c)|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;o=c;j=Ci(j^n,c^K,32);c=W;r=c;t=f;c=c+u|0;f=j+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=ua+A|0;p=f+aa|0;c=o+(p>>>0>>0?c+1|0:c)|0;o=n+p|0;c=o>>>0>>0?c+1|0:c;v=r;r=c;p=Ci(j^o,v^c,48);c=W;Y=c;n=c;j=Ci(M^I,Q^V,1);c=W;v=c;u=g;c=c+ta|0;g=j+ja|0;c=J+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=c;s=Ci(e^g,c^s,32);d=s+d|0;V=W;c=V+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^j,e^v,40);I=W;c=ha+I|0;d=e+N|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;g=c;c=E+wa|0;j=C+ga|0;c=(j>>>0>>0?c+1|0:c)+g|0;g=d+j|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^p,c^n,32);J=W;c=J+R|0;j=d+F|0;c=j>>>0>>0?c+1|0:c;n=Ci(j^C,c^E,40);K=c;C=W;c=ka+C|0;E=n+ia|0;c=q+(E>>>0>>0?c+1|0:c)|0;q=g+E|0;c=q>>>0>>0?c+1|0:c;g=J;J=c;g=Ci(d^q,g^c,48);c=K;K=W;c=c+K|0;j=g+j|0;c=j>>>0>>0?c+1|0:c;d=j^n;n=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=k;U=i;i=e;e=Ci(s^M,Q^V,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^I,1);d=i+ba|0;I=W;c=I+va|0;c=r+(d>>>0>>0?c+1|0:c)|0;k=d+o|0;c=k>>>0>>0?c+1|0:c;o=c;d=Ci(k^U,c^D,32);r=W;c=r+l|0;l=d+X|0;c=l>>>0>>0?c+1|0:c;D=c;i=Ci(i^l,c^I,40);V=W;c=za+V|0;I=i;i=oa+i|0;c=o+(i>>>0>>0?c+1|0:c)|0;o=i+k|0;c=o>>>0>>0?c+1|0:c;i=r;r=c;i=Ci(d^o,i^c,48);c=D;D=W;c=c+D|0;d=i+l|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;k=h;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;h=c;f=Ci(d^f,c^A,1);p=W;c=ua+p|0;l=f+aa|0;c=x+(l>>>0>>0?c+1|0:c)|0;l=l+m|0;c=l>>>0>>0?c+1|0:c;m=c;k=Ci(k^l,c^H,32);c=W;x=c;t=f;c=c+u|0;f=k+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=L+A|0;p=f+ea|0;c=m+(p>>>0>>0?c+1|0:c)|0;m=l+p|0;c=m>>>0>>0?c+1|0:c;l=x;x=c;p=Ci(k^m,l^c,48);c=W;Y=c;l=c;k=Ci(y^F,R^_,1);c=W;v=c;u=h;c=c+xa|0;h=k+fa|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+B|0;c=h>>>0>>0?c+1|0:c;B=c;s=Ci(e^h,c^s,32);d=s+d|0;_=W;c=_+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^k,e^v,40);y=W;c=ta+y|0;d=e+ja|0;c=B+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;h=c;c=E+na|0;k=C+ca|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+Q|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^C,c^E,40);H=c;C=W;c=Aa+C|0;E=l+pa|0;c=B+(E>>>0>>0?c+1|0:c)|0;B=h+E|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=H;H=W;c=c+H|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=j;U=i;i=e;e=Ci(s^F,R^_,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^y,1);d=i+O|0;F=W;c=F+$|0;c=x+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);x=W;c=x+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=n;y=c;i=Ci(i^n,c^F,40);X=W;c=ra+X|0;F=i;i=S+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;n=i+j|0;c=n>>>0>>0?c+1|0:c;i=x;x=c;i=Ci(d^n,i^c,48);c=y;y=W;c=c+y|0;d=i+D|0;c=d>>>0>>0?c+1|0:c;D=d;R=c;j=g;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^A,1);p=W;c=p+P|0;m=b+f|0;c=r+(m>>>0>>0?c+1|0:c)|0;m=m+o|0;c=m>>>0>>0?c+1|0:c;o=c;j=Ci(j^m,c^K,32);r=j;c=W;t=c;G=f;c=c+u|0;f=j+v|0;c=f>>>0>>0?c+1|0:c;A=f;f=f^G;G=c;f=Ci(f,c^p,40);v=W;c=qa+v|0;j=f+da|0;c=o+(j>>>0>>0?c+1|0:c)|0;j=j+m|0;c=j>>>0>>0?c+1|0:c;u=j^r;r=c;m=Ci(u,c^t,48);c=W;K=c;p=c;o=Ci(M^I,Q^V,1);t=o;c=W;u=c;I=g;c=c+ha|0;g=o+N|0;c=J+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=s;s=c;o=Ci(e^g,q^c,32);d=o+d|0;U=W;c=U+I|0;q=d;e=d^t;t=d>>>0>>0?c+1|0:c;e=Ci(e,t^u,40);u=W;c=la+u|0;d=e+Z|0;c=s+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;s=d;I=c;g=c;c=E+ra|0;J=S;S=C+S|0;c=(J>>>0>S>>>0?c+1|0:c)+g|0;d=d+S|0;c=d>>>0>>0?c+1|0:c;ra=c;S=Ci(d^m,c^p,32);M=W;c=M+R|0;g=D+S|0;c=g>>>0>>0?c+1|0:c;p=Ci(g^C,c^E,40);J=c;Q=W;c=qa+Q|0;C=da;da=p+da|0;c=ra+(C>>>0>da>>>0?c+1|0:c)|0;da=d+da|0;c=da>>>0>>0?c+1|0:c;d=S^da;S=c;qa=Ci(d,c^M,48);ra=W;c=ra+J|0;d=g+qa|0;c=d>>>0>>0?c+1|0:c;g=c;c=Ci(d^p,c^Q,1);p=W;M=c;Q=k;k=Z;J=la;la=Ci(o^s,I^U,48);o=W;c=o+t|0;Z=q+la|0;c=Z>>>0>>0?c+1|0:c;t=k;s=Z;q=c;k=Ci(e^s,c^u,1);Z=t+k|0;u=W;c=u+J|0;c=r+(k>>>0>Z>>>0?c+1|0:c)|0;Z=j+Z|0;c=Z>>>0>>0?c+1|0:c;e=c;i=Ci(i^Z,c^y,32);c=l;l=W;c=c+l|0;j=i+Q|0;c=j>>>0>>0?c+1|0:c;r=j;t=c;j=Ci(j^k,c^u,40);ba=j+ba|0;u=W;c=u+va|0;c=(j>>>0>ba>>>0?c+1|0:c)+e|0;e=ba;ba=Z+ba|0;c=e>>>0>ba>>>0?c+1|0:c;e=c;i=Ci(i^ba,c^l,48);k=W;c=k+t|0;Z=i+r|0;c=Z>>>0>>0?c+1|0:c;l=Z;va=c;r=b;t=P;c=G+K|0;b=m+A|0;c=b>>>0>>0?c+1|0:c;Z=c;P=Ci(b^f,c^v,1);m=W;c=m+t|0;f=r+P|0;c=x+(f>>>0

>>0?c+1|0:c)|0;f=f+n|0;c=f>>>0>>0?c+1|0:c;h=Ci(f^h,c^H,32);r=c;x=ca;ca=P;n=W;c=n+q|0;P=h+s|0;c=P>>>0>>0?c+1|0:c;q=m;m=c;ca=Ci(P^ca,q^c,40);s=W;c=s+na|0;na=x+ca|0;c=(na>>>0>>0?c+1|0:c)+r|0;r=na;na=f+na|0;c=r>>>0>na>>>0?c+1|0:c;f=h^na;h=c;c=Ci(f,c^n,48);f=W;G=f;n=c;q=O;r=$;O=Ci(D^F,R^X,1);x=O;c=W;t=c;c=c+wa|0;O=x+ga|0;c=T+(O>>>0>>0?c+1|0:c)|0;O=B+O|0;c=O>>>0>>0?c+1|0:c;ga=c;$=Ci(O^la,c^o,32);b=$+b|0;B=W;c=B+Z|0;Z=b;o=b>>>0<$>>>0?c+1|0:c;la=Ci(b^x,o^t,40);b=la+q|0;c=r;r=W;c=c+r|0;c=ga+(b>>>0>>0?c+1|0:c)|0;b=b+O|0;c=b>>>0>>0?c+1|0:c;ga=b;wa=c;O=c;c=p+ua|0;x=aa;aa=M+aa|0;c=(x>>>0>aa>>>0?c+1|0:c)+O|0;O=b+aa|0;c=O>>>0>>0?c+1|0:c;ua=c;aa=Ci(n^O,c^f,32);b=aa+l|0;x=W;c=x+va|0;f=b;q=p;p=b>>>0>>0?c+1|0:c;b=Ci(b^M,q^p,40);t=W;c=xa+t|0;xa=b;b=fa+b|0;c=ua+(b>>>0>>0?c+1|0:c)|0;b=b+O|0;c=b>>>0>>0?c+1|0:c;ua=b;A=(z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24))^b;q=c;v=c^(z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24));O=Ci($^ga,B^wa,48);ga=W;c=ga+o|0;b=O+Z|0;c=b>>>0>>0?c+1|0:c;o=b;wa=c;$=ia;c=m+G|0;b=n+P|0;c=b>>>0

>>0?c+1|0:c;ia=c;ca=Ci(b^ca,c^s,1);$=ca+$|0;n=W;c=n+ka|0;c=($>>>0>>0?c+1|0:c)+e|0;ka=$+ba|0;c=ka>>>0<$>>>0?c+1|0:c;$=c;Z=Ci(ka^qa,c^ra,32);P=W;c=P+wa|0;fa=Z+o|0;c=fa>>>0>>0?c+1|0:c;ba=c;qa=Z;Z=Ci(ca^fa,c^n,40);ca=Z+ja|0;e=W;c=e+ta|0;c=(Z>>>0>ca>>>0?c+1|0:c)+$|0;ka=ca+ka|0;c=ka>>>0>>0?c+1|0:c;ja=ka;m=P;P=c;ca=Ci(qa^ja,m^c,48);$=ca+fa|0;n=W;c=n+ba|0;c=$>>>0>>0?c+1|0:c;fa=$;$=A^$;w[a+8|0]=$;w[a+9|0]=$>>>8;w[a+10|0]=$>>>16;w[a+11|0]=$>>>24;ba=c;c=c^v;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;ka=b;$=ia;b=O;O=Ci(j^l,u^va,1);ia=O+pa|0;ta=W;c=ta+Aa|0;c=(O>>>0>ia>>>0?c+1|0:c)+S|0;l=ia;ia=da+ia|0;c=l>>>0>ia>>>0?c+1|0:c;da=c;b=Ci(b^ia,c^ga,32);c=$;$=W;c=c+$|0;ka=b+ka|0;c=ka>>>0>>0?c+1|0:c;ga=c;qa=b;S=ka;ka=Ci(O^S,c^ta,40);b=ka+oa|0;j=W;c=j+za|0;c=da+(b>>>0>>0?c+1|0:c)|0;b=b+ia|0;c=b>>>0>>0?c+1|0:c;da=b;b=b^qa;qa=c;ia=Ci(b,c^$,48);b=ia+S|0;l=W;c=l+ga|0;S=b;ga=b>>>0>>0?c+1|0:c;b=Ci(o^la,r^wa,1);la=b;c=W;ta=c;c=c+L|0;b=b+ea|0;c=h+(b>>>0>>0?c+1|0:c)|0;O=b+na|0;c=O>>>0>>0?c+1|0:c;L=c;$=Ci(i^O,c^k,32);b=$+d|0;d=W;c=d+g|0;na=b;h=b^la;la=b>>>0<$>>>0?c+1|0:c;ea=Ci(h,la^ta,40);b=ea+N|0;N=W;c=N+ha|0;c=L+(b>>>0>>0?c+1|0:c)|0;L=b+O|0;c=L>>>0>>0?c+1|0:c;b=a;O=L^Ba^S;w[b|0]=O;w[b+1|0]=O>>>8;w[b+2|0]=O>>>16;w[b+3|0]=O>>>24;O=c^Ca^ga;w[b+4|0]=O;w[b+5|0]=O>>>8;w[b+6|0]=O>>>16;w[b+7|0]=O>>>24;$=Ci(L^$,c^d,48);O=$+na|0;na=W;c=na+la|0;la=O>>>0<$>>>0?c+1|0:c;c=la^((z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24))^qa);L=(z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24))^da^O;w[b+16|0]=L;w[b+17|0]=L>>>8;w[b+18|0]=L>>>16;w[b+19|0]=L>>>24;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;b=Ci(aa^ua,q^x,48);L=W;da=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);c=(z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24))^Ci(Z^fa,e^ba,1)^b;w[a+32|0]=c;w[a+33|0]=c>>>8;w[a+34|0]=c>>>16;w[a+35|0]=c>>>24;c=W^da^L;w[a+36|0]=c;w[a+37|0]=c>>>8;w[a+38|0]=c>>>16;w[a+39|0]=c>>>24;c=p+L|0;da=b+f|0;c=da>>>0>>0?c+1|0:c;b=a;Z=(z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24))^P^c;L=(z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24))^ja^da;w[b+24|0]=L;w[b+25|0]=L>>>8;w[b+26|0]=L>>>16;w[b+27|0]=L>>>24;w[b+28|0]=Z;w[b+29|0]=Z>>>8;w[b+30|0]=Z>>>16;w[b+31|0]=Z>>>24;Z=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);b=ia^((z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24))^Ci(O^ea,N^la,1));w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;b=l^(W^Z);w[a+44|0]=b;w[a+45|0]=b>>>8;w[a+46|0]=b>>>16;w[a+47|0]=b>>>24;O=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);b=$^((z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24))^Ci(S^ka,j^ga,1));w[a+56|0]=b;w[a+57|0]=b>>>8;w[a+58|0]=b>>>16;w[a+59|0]=b>>>24;b=na^(W^O);w[a+60|0]=b;w[a+61|0]=b>>>8;w[a+62|0]=b>>>16;w[a+63|0]=b>>>24;O=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);b=ca^((z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24))^Ci(da^xa,c^t,1));w[a+48|0]=b;w[a+49|0]=b>>>8;w[a+50|0]=b>>>16;w[a+51|0]=b>>>24;b=n^(W^O);w[a+52|0]=b;w[a+53|0]=b>>>8;w[a+54|0]=b>>>16;w[a+55|0]=b>>>24;}function qc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0;H=T-560|0;T=H;k=H+352|0;Za(k);if(g){va(k,39696,34,0);}rb(H+288|0,f,32,0);n=H+352|0;va(n,H+320|0,32,0);va(n,c,d,e);p=H+224|0;Ca(n,p);j=f;r=z[f+32|0]|z[f+33|0]<<8|(z[f+34|0]<<16|z[f+35|0]<<24);t=z[f+36|0]|z[f+37|0]<<8|(z[f+38|0]<<16|z[f+39|0]<<24);l=z[f+40|0]|z[f+41|0]<<8|(z[f+42|0]<<16|z[f+43|0]<<24);h=z[f+44|0]|z[f+45|0]<<8|(z[f+46|0]<<16|z[f+47|0]<<24);k=z[f+48|0]|z[f+49|0]<<8|(z[f+50|0]<<16|z[f+51|0]<<24);f=z[f+52|0]|z[f+53|0]<<8|(z[f+54|0]<<16|z[f+55|0]<<24);m=z[j+60|0]|z[j+61|0]<<8|(z[j+62|0]<<16|z[j+63|0]<<24);j=z[j+56|0]|z[j+57|0]<<8|(z[j+58|0]<<16|z[j+59|0]<<24);w[a+56|0]=j;w[a+57|0]=j>>>8;w[a+58|0]=j>>>16;w[a+59|0]=j>>>24;w[a+60|0]=m;w[a+61|0]=m>>>8;w[a+62|0]=m>>>16;w[a+63|0]=m>>>24;w[a+48|0]=k;w[a+49|0]=k>>>8;w[a+50|0]=k>>>16;w[a+51|0]=k>>>24;w[a+52|0]=f;w[a+53|0]=f>>>8;w[a+54|0]=f>>>16;w[a+55|0]=f>>>24;w[a+40|0]=l;w[a+41|0]=l>>>8;w[a+42|0]=l>>>16;w[a+43|0]=l>>>24;w[a+44|0]=h;w[a+45|0]=h>>>8;w[a+46|0]=h>>>16;w[a+47|0]=h>>>24;w[a+32|0]=r;w[a+33|0]=r>>>8;w[a+34|0]=r>>>16;w[a+35|0]=r>>>24;w[a+36|0]=t;w[a+37|0]=t>>>8;w[a+38|0]=t>>>16;w[a+39|0]=t>>>24;Pa(p);jb(H,p);Wa(a,H);Za(n);if(g){va(n,39696,34,0);}f=H+352|0;va(f,a,64,0);va(f,c,d,e);o=H+160|0;Ca(f,o);Pa(o);w[H+288|0]=z[H+288|0]&248;w[H+319|0]=z[H+319|0]&63|64;u=H+288|0;c=u;d=z[c+23|0];P=z[c+21|0]|z[c+22|0]<<8|d<<16&2031616;Q=(z[o+28|0]|z[o+29|0]<<8|(z[o+30|0]<<16|z[o+31|0]<<24))>>>7|0;l=Ai(P,0,Q,0);k=W;c=z[o+27|0];d=0;h=z[o+23|0]|z[o+24|0]<<8|(z[o+25|0]<<16|z[o+26|0]<<24);f=c<<8|h>>>24;e=z[o+28|0];c=0;e=e<<16;t=c|d;d=e|f;R=((t&3)<<30|d>>>2)&2097151;g=z[u+23|0]|z[u+24|0]<<8|(z[u+25|0]<<16|z[u+26|0]<<24);S=g>>>5&2097151;c=Ai(R,0,S,0);f=c+l|0;d=W+k|0;e=c>>>0>f>>>0?d+1|0:d;d=z[o+23|0];U=d<<16&2031616|(z[o+21|0]|z[o+22|0]<<8);V=(z[u+28|0]|z[u+29|0]<<8|(z[u+30|0]<<16|z[u+31|0]<<24))>>>7|0;c=Ai(U,0,V,0);d=c+f|0;e=W+e|0;k=d;f=c>>>0>d>>>0?e+1|0:e;c=z[u+27|0];e=0;g=c<<8|g>>>24;c=z[u+28|0];d=0;c=c<<16;e=d|e;d=c|g;X=((e&3)<<30|d>>>2)&2097151;Y=h>>>5&2097151;c=Ai(X,0,Y,0);e=c+k|0;d=W+f|0;j=e;f=c>>>0>e>>>0?d+1|0:d;h=Ai(S,0,Y,0);k=W;c=z[u+19|0];d=0;E=z[u+15|0]|z[u+16|0]<<8|(z[u+17|0]<<16|z[u+18|0]<<24);g=c<<8|E>>>24;c=z[u+20|0];c=c<<16;e=d|d;d=c|g;Z=(e&7)<<29|d>>>3;t=e>>>3|0;d=Ai(Z,t,Q,0);e=d+h|0;c=W+k|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(P,i,R,i);g=d+e|0;e=W+c|0;h=g;d=d>>>0>h>>>0?e+1|0:e;c=z[o+19|0];e=0;B=z[o+15|0]|z[o+16|0]<<8|(z[o+17|0]<<16|z[o+18|0]<<24);k=c<<8|B>>>24;g=z[o+20|0];c=0;g=g<<16;l=c|e;e=g|k;_=(l&7)<<29|e>>>3;$=l>>>3|0;c=Ai(_,$,V,0);e=c+h|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(X,i,U,i);p=c+e|0;d=W+d|0;d=c>>>0>p>>>0?d+1|0:d;r=d;c=d-((p>>>0<4293918720)-1|0)|0;v=c;d=c>>>21|0;l=p- -1048576|0;c=(c&2097151)<<11|l>>>21;j=c+j|0;e=d+f|0;e=c>>>0>j>>>0?e+1|0:e;h=e;c=e-((j>>>0<4293918720)-1|0)|0;A=c;k=j- -1048576|0;m=(c&2097151)<<11|k>>>21;g=c>>>21|0;c=Ai(V,0,Y,0);d=W;e=c;c=Ai(Q,0,S,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(R,i,X,i);x=c+e|0;c=W+d|0;c=e>>>0>x>>>0?c+1|0:c;e=x- -1048576|0;d=e&-2097152;n=x-d|0;f=c-((x>>>0<4293918720)-1|0)|0;d=(c-((f&131071)+(d>>>0>x>>>0)|0)|0)+g|0;c=m+n|0;d=c>>>0>>0?d+1|0:d;Ea=d;Fa=c;n=Ai(c,d,470296,0);m=W;d=Ai(Q,0,X,i);c=W;g=d;d=Ai(R,i,V,0);g=g+d|0;c=W+c|0;d=d>>>0>g>>>0?c+1|0:c;c=f>>>21|0;f=(f&2097151)<<11|e>>>21;g=f+g|0;e=c+d|0;e=f>>>0>g>>>0?e+1|0:e;f=e-((g>>>0<4293918720)-1|0)|0;J=f;I=g- -1048576|0;d=I&-2097152;c=g-d|0;g=e-((f&131071)+(d>>>0>g>>>0)|0)|0;Ga=g;e=k&-2097152;d=j-e|0;Ha=d;f=h-((e>>>0>j>>>0)+A|0)|0;Ia=f;Ja=c;e=Ai(c,g,666643,0);g=e+n|0;c=W+m|0;c=e>>>0>g>>>0?c+1|0:c;e=Ai(d,f,654183,0);f=e+g|0;d=W+c|0;q=f;k=e>>>0>f>>>0?d+1|0:d;c=l&-2097152;x=p-c|0;v=r-((c>>>0>p>>>0)+v|0)|0;d=Ai(R,i,Z,t);e=W;c=d;aa=E>>>6&2097151;d=Ai(aa,0,Q,0);f=c+d|0;c=W+e|0;c=d>>>0>f>>>0?c+1|0:c;d=Ai(S,0,U,i);f=d+f|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(P,i,Y,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;ba=B>>>6&2097151;e=Ai(V,0,ba,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;e=Ai(X,i,_,$);f=e+f|0;d=W+c|0;p=f;g=e>>>0>f>>>0?d+1|0:d;c=z[u+14|0];d=0;r=z[u+10|0]|z[u+11|0]<<8|(z[u+12|0]<<16|z[u+13|0]<<24);f=c<<8|r>>>24;e=z[u+15|0];c=0;e=e<<16;d=c|d;c=e|f;ca=((d&1)<<31|c>>>1)&2097151;d=Ai(ca,0,Q,0);c=W;e=d;d=Ai(R,i,aa,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Y,0,Z,t);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(S,0,_,$);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(P,i,U,i);e=c+f|0;d=W+d|0;l=e;f=c>>>0>e>>>0?d+1|0:d;c=z[o+14|0];d=0;j=z[o+10|0]|z[o+11|0]<<8|(z[o+12|0]<<16|z[o+13|0]<<24);h=c<<8|j>>>24;c=z[o+15|0];c=c<<16|h;d=d|d;da=((d&1)<<31|c>>>1)&2097151;d=Ai(da,0,V,0);e=d+l|0;c=W+f|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(X,i,ba,0);l=d+e|0;c=W+c|0;c=d>>>0>l>>>0?c+1|0:c;h=c;d=c-((l>>>0<4293918720)-1|0)|0;K=d;c=d>>>21|0;n=l- -1048576|0;d=(d&2097151)<<11|n>>>21;A=d+p|0;e=c+g|0;e=d>>>0>A>>>0?e+1|0:e;m=e;d=e-((A>>>0<4293918720)-1|0)|0;F=d;c=d>>>21|0;p=A- -1048576|0;e=(d&2097151)<<11|p>>>21;d=e+x|0;c=c+v|0;c=d>>>0>>0?c+1|0:c;Ka=c;La=d;c=Ai(d,c,-997805,-1);e=c+q|0;d=W+k|0;q=e;k=c>>>0>e>>>0?d+1|0:d;s=H+224|0;N=z[s+23|0]|z[s+24|0]<<8|(z[s+25|0]<<16|z[s+26|0]<<24);x=N>>>5&2097151;c=z[u+2|0];ea=c<<16&2031616|(z[u|0]|z[u+1|0]<<8);e=Ai(ea,0,Y,0);d=W;g=z[u+2|0]|z[u+3|0]<<8|(z[u+4|0]<<16|z[u+5|0]<<24);fa=g>>>5&2097151;c=Ai(U,i,fa,0);f=c+e|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;ga=(z[u+7|0]|z[u+8|0]<<8|(z[u+9|0]<<16|z[u+10|0]<<24))>>>7&2097151;c=Ai(ga,0,ba,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;ha=r>>>4&2097151;e=Ai(da,i,ha,0);f=e+f|0;c=W+d|0;r=f;f=e>>>0>f>>>0?c+1|0:c;d=z[u+6|0];c=0;g=d<<8|g>>>24;e=c;c=z[u+7|0];d=0;c=c<<16|g;d=d|e;ia=((d&3)<<30|c>>>2)&2097151;d=Ai(ia,0,_,$);e=d+r|0;c=W+f|0;c=d>>>0>e>>>0?c+1|0:c;ka=(z[o+7|0]|z[o+8|0]<<8|(z[o+9|0]<<16|z[o+10|0]<<24))>>>7&2097151;d=Ai(aa,0,ka,0);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;G=j>>>4&2097151;d=Ai(ca,i,G,0);f=d+f|0;c=W+e|0;g=d>>>0>f>>>0?c+1|0:c;d=z[o+6|0];c=0;j=z[o+2|0]|z[o+3|0]<<8|(z[o+4|0]<<16|z[o+5|0]<<24);r=d<<8|j>>>24;d=c;c=z[o+7|0];e=0;c=c<<16|r;d=d|e;la=((d&3)<<30|c>>>2)&2097151;c=Ai(Z,t,la,0);e=c+f|0;d=W+g|0;d=c>>>0>e>>>0?d+1|0:d;c=z[o+2|0];f=e;ma=c<<16&2031616|(z[o|0]|z[o+1|0]<<8);e=Ai(ma,0,S,0);f=f+e|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;na=j>>>5&2097151;d=Ai(P,i,na,0);e=d+f|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=e+x|0;d=d>>>0>e>>>0?c+1|0:c;r=e;g=d;f=z[s+21|0]|z[s+22|0]<<8;c=Ai(ea,i,U,i);d=W;e=c;c=Ai(_,$,fa,0);j=e+c|0;e=W+d|0;e=c>>>0>j>>>0?e+1|0:e;c=Ai(da,i,ga,0);j=c+j|0;d=W+e|0;d=c>>>0>j>>>0?d+1|0:d;c=Ai(ha,0,G,0);e=c+j|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ba,0,ia,i);j=c+e|0;c=W+d|0;c=e>>>0>j>>>0?c+1|0:c;d=Ai(aa,0,la,i);e=d+j|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(ca,i,ka,0);j=d+e|0;e=W+c|0;e=d>>>0>j>>>0?e+1|0:e;c=Ai(Z,t,na,0);j=c+j|0;d=W+e|0;d=c>>>0>j>>>0?d+1|0:d;c=Ai(P,i,ma,i);e=c+j|0;d=W+d|0;c=c>>>0>e>>>0?d+1|0:d;d=e;e=e+f|0;d=d>>>0>e>>>0?c+1|0:c;c=z[s+23|0];f=e;e=c<<16&2031616;f=f+e|0;c=d;c=e>>>0>f>>>0?c+1|0:c;e=c;c=c-((f>>>0<4293918720)-1|0)|0;o=c;d=c>>>21|0;j=f- -1048576|0;c=(c&2097151)<<11|j>>>21;r=c+r|0;d=d+g|0;g=r;d=g>>>0>>0?d+1|0:d;c=d+k|0;k=g+q|0;c=k>>>0>>0?c+1|0:c;B=g- -1048576|0;g=d-((g>>>0<4293918720)-1|0)|0;C=g;d=B&-2097152;D=k-d|0;L=c-((d>>>0>k>>>0)+g|0)|0;r=f;k=e;c=Ai(Ha,Ia,470296,0);d=W;e=c;c=Ai(Fa,Ea,666643,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(La,Ka,654183,0);f=c+e|0;c=W+d|0;E=f;g=e>>>0>f>>>0?c+1|0:c;d=Ai(_,$,ea,i);c=W;e=d;d=Ai(ba,0,fa,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(ga,0,G,0);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;c=Ai(ha,0,ka,0);f=c+f|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(da,i,ia,i);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(aa,0,na,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(ca,i,la,i);e=d+f|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(Z,t,ma,i);f=d+e|0;d=W+c|0;x=f;e=e>>>0>f>>>0?d+1|0:d;c=z[s+19|0];d=0;q=z[s+15|0]|z[s+16|0]<<8|(z[s+17|0]<<16|z[s+18|0]<<24);v=c<<8|q>>>24;f=z[s+20|0];c=0;f=f<<16;M=c|d;d=f|v;e=(M>>>3|0)+e|0;d=(M&7)<<29|d>>>3;f=d+x|0;x=f;f=d>>>0>f>>>0?e+1|0:e;v=q>>>6&2097151;c=Ai(ba,0,ea,i);d=W;e=c;c=Ai(da,i,fa,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ga,0,ka,0);q=c+e|0;c=W+d|0;c=e>>>0>q>>>0?c+1|0:c;e=Ai(ha,0,la,i);q=e+q|0;d=W+c|0;d=e>>>0>q>>>0?d+1|0:d;e=Ai(ia,i,G,0);q=e+q|0;c=W+d|0;c=e>>>0>q>>>0?c+1|0:c;d=Ai(aa,0,ma,i);q=d+q|0;e=W+c|0;e=d>>>0>q>>>0?e+1|0:e;c=Ai(ca,i,na,0);q=c+q|0;d=W+e|0;c=c>>>0>q>>>0?d+1|0:d;oa=q+v|0;c=oa>>>0>>0?c+1|0:c;wa=c;c=c-((oa>>>0<4293918720)-1|0)|0;Ua=c;ta=oa- -1048576|0;e=(c&2097151)<<11|ta>>>21;xa=e+x|0;c=(c>>>21|0)+f|0;c=e>>>0>xa>>>0?c+1|0:c;ya=c;c=c-((xa>>>0<4293918720)-1|0)|0;Va=c;qa=xa- -1048576|0;e=(c&2097151)<<11|qa>>>21;f=e+E|0;c=(c>>>21|0)+g|0;d=(e>>>0>f>>>0?c+1|0:c)+k|0;e=f+r|0;d=e>>>0>>0?d+1|0:d;c=j&-2097152;k=e-c|0;c=d-((c>>>0>e>>>0)+o|0)|0;o=c;c=c-((k>>>0<4293918720)-1|0)|0;Xa=c;ra=k- -1048576|0;e=(c&2097151)<<11|ra>>>21;g=e+D|0;c=(c>>21)+L|0;c=e>>>0>g>>>0?c+1|0:c;f=c;c=c-((g>>>0<4293918720)-1|0)|0;Ma=c;E=g- -1048576|0;sa=(c&2097151)<<11|E>>>21;r=c>>21;c=p&-2097152;M=A-c|0;F=m-((c>>>0>A>>>0)+F|0)|0;c=Ai(Q,0,V,0);d=W;ua=d;D=c;q=c- -1048576|0;d=d-((c>>>0<4293918720)-1|0)|0;pa=d;c=d>>>21|0;Na=c;Da=(d&2097151)<<11|q>>>21;c=Ai(Da,c,-683901,-1);e=c+l|0;d=W+h|0;d=c>>>0>e>>>0?d+1|0:d;c=n&-2097152;p=e-c|0;j=d-((c>>>0>e>>>0)+K|0)|0;d=Ai(Y,0,aa,0);c=W;e=d;d=Ai(Q,0,ha,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(R,i,ca,i);e=d+e|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(Z,t,U,i);h=d+e|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;c=Ai(S,0,ba,0);h=c+h|0;e=W+d|0;e=c>>>0>h>>>0?e+1|0:e;c=Ai(P,i,_,$);h=c+h|0;d=W+e|0;d=c>>>0>h>>>0?d+1|0:d;e=Ai(V,0,G,0);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(X,i,da,i);e=d+h|0;c=W+c|0;l=e;h=d>>>0>e>>>0?c+1|0:c;c=Ai(R,i,ha,0);d=W;e=c;c=Ai(Q,0,ga,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(aa,0,U,i);m=c+e|0;e=W+d|0;e=c>>>0>m>>>0?e+1|0:e;c=Ai(Y,0,ca,i);m=c+m|0;d=W+e|0;d=c>>>0>m>>>0?d+1|0:d;e=Ai(Z,t,_,$);m=e+m|0;c=W+d|0;c=e>>>0>m>>>0?c+1|0:c;d=Ai(S,0,da,i);e=d+m|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(P,i,ba,0);m=d+e|0;d=W+c|0;d=e>>>0>m>>>0?d+1|0:d;c=Ai(V,0,ka,0);m=c+m|0;e=W+d|0;e=c>>>0>m>>>0?e+1|0:e;c=Ai(X,i,G,0);x=c+m|0;d=W+e|0;d=c>>>0>x>>>0?d+1|0:d;v=d;c=d-((x>>>0<4293918720)-1|0)|0;Aa=c;A=x- -1048576|0;d=(c&2097151)<<11|A>>>21;K=d+l|0;c=(c>>>21|0)+h|0;c=d>>>0>K>>>0?c+1|0:c;n=c;c=c-((K>>>0<4293918720)-1|0)|0;O=c;e=c>>>21|0;m=K- -1048576|0;c=(c&2097151)<<11|m>>>21;L=c+p|0;d=e+j|0;d=c>>>0>L>>>0?d+1|0:d;p=d;c=d-((L>>>0<4293918720)-1|0)|0;za=c;j=L- -1048576|0;h=(c&2097151)<<11|j>>>21;d=h+M|0;c=(c>>21)+F|0;c=d>>>0>>0?c+1|0:c;Oa=c;Qa=d;c=Ai(d,c,-683901,-1);e=c+sa|0;d=W+r|0;sa=e;r=c>>>0>e>>>0?d+1|0:d;c=Ai(R,i,ea,i);d=W;e=c;c=Ai(Y,0,fa,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(_,$,ga,0);h=c+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(ba,0,ha,0);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;d=Ai(U,i,ia,i);h=d+h|0;c=W+e|0;c=d>>>0>h>>>0?c+1|0:c;e=Ai(aa,0,G,0);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;c=Ai(ca,i,da,i);e=c+h|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Z,t,ka,0);h=c+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(S,0,na,0);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;d=Ai(P,i,la,i);h=d+h|0;c=W+e|0;c=d>>>0>h>>>0?c+1|0:c;e=Ai(X,i,ma,i);h=e+h|0;d=W+c|0;F=h;e=e>>>0>h>>>0?d+1|0:d;c=z[s+27|0];d=0;l=c<<8|N>>>24;h=z[s+28|0];c=0;h=h<<16;d=c|d;c=h|l;h=((d&3)<<30|c>>>2)&2097151;c=h+F|0;d=e;l=c;h=c>>>0>>0?d+1|0:d;M=Ai(Ja,Ga,470296,0);F=W;e=(J&2097151)<<11|I>>>21;d=q&-2097152;c=e+(D-d|0)|0;d=ua-((pa&524287)+(d>>>0>D>>>0)|0)+(J>>>21)|0;d=c>>>0>>0?d+1|0:d;Ra=d;Sa=c;d=Ai(c,d,666643,0);e=d+M|0;c=W+F|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Fa,Ea,654183,0);q=d+e|0;e=W+c|0;e=d>>>0>q>>>0?e+1|0:e;d=Ai(Ha,Ia,-997805,-1);q=d+q|0;c=W+e|0;c=d>>>0>q>>>0?c+1|0:c;e=Ai(La,Ka,136657,0);q=e+q|0;d=W+c|0;c=(C&2097151)<<11|B>>>21;B=c+q|0;d=(C>>>21|0)+(e>>>0>q>>>0?d+1|0:d)|0;ua=l- -1048576|0;q=h-((l>>>0<4293918720)-1|0)|0;pa=q;c=(c>>>0>B>>>0?d+1|0:d)+h|0;h=l+B|0;c=h>>>0>>0?c+1|0:c;e=ua&-2097152;d=h-e|0;c=c-((e>>>0>h>>>0)+q|0)|0;e=c+r|0;l=d+sa|0;e=l>>>0>>0?e+1|0:e;h=c-((d>>>0<4293918720)-1|0)|0;M=h;F=d- -1048576|0;d=F&-2097152;c=l-d|0;D=e-((d>>>0>l>>>0)+h|0)|0;N=c;h=g;g=f;c=j&-2097152;Ba=L-c|0;q=p-((c>>>0>L>>>0)+za|0)|0;c=Ai(Sa,Ra,-683901,-1);d=W;e=c;c=Ai(Da,Na,136657,0);f=e+c|0;e=W+d|0;d=n+(c>>>0>f>>>0?e+1|0:e)|0;e=f+K|0;d=e>>>0>>0?d+1|0:d;c=m&-2097152;m=e-c|0;p=d-((c>>>0>e>>>0)+O|0)|0;d=Ai(Da,Na,-997805,-1);e=d+x|0;c=W+v|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Sa,Ra,136657,0);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(Ja,Ga,-683901,-1);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=A&-2097152;j=f-c|0;r=d-((c>>>0>f>>>0)+Aa|0)|0;d=Ai(Y,0,ha,0);c=W;e=d;d=Ai(R,i,ga,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Q,0,ia,i);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(_,$,aa,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(U,i,ca,i);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;e=Ai(Z,t,ba,0);f=e+f|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;e=Ai(S,0,G,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(P,i,da,i);f=d+f|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(V,0,la,i);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(X,i,ka,0);f=e+f|0;c=W+d|0;l=f;f=e>>>0>f>>>0?c+1|0:c;c=Ai(Y,0,ga,0);d=W;e=c;c=Ai(Q,0,fa,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(U,i,ha,0);n=c+e|0;c=W+d|0;c=e>>>0>n>>>0?c+1|0:c;d=Ai(R,i,ia,i);n=d+n|0;e=W+c|0;e=d>>>0>n>>>0?e+1|0:e;c=Ai(aa,0,ba,0);n=c+n|0;d=W+e|0;d=c>>>0>n>>>0?d+1|0:d;e=Ai(_,$,ca,i);n=e+n|0;c=W+d|0;c=e>>>0>n>>>0?c+1|0:c;e=Ai(Z,t,da,i);n=e+n|0;d=W+c|0;d=e>>>0>n>>>0?d+1|0:d;e=Ai(S,0,ka,0);n=e+n|0;c=W+d|0;c=e>>>0>n>>>0?c+1|0:c;d=Ai(P,i,G,0);n=d+n|0;e=W+c|0;e=d>>>0>n>>>0?e+1|0:e;c=Ai(V,0,na,0);n=c+n|0;d=W+e|0;e=Ai(X,i,la,i);za=e+n|0;c=W+(c>>>0>n>>>0?d+1|0:d)|0;c=e>>>0>za>>>0?c+1|0:c;L=c;c=c-((za>>>0<4293918720)-1|0)|0;$a=c;J=za- -1048576|0;e=(c&2097151)<<11|J>>>21;sa=e+l|0;c=(c>>>21|0)+f|0;c=e>>>0>sa>>>0?c+1|0:c;I=c;c=c-((sa>>>0<4293918720)-1|0)|0;ab=c;C=sa- -1048576|0;e=(c&2097151)<<11|C>>>21;K=e+j|0;c=(c>>>21|0)+r|0;c=e>>>0>K>>>0?c+1|0:c;B=c;c=c-((K>>>0<4293918720)-1|0)|0;bb=c;v=K- -1048576|0;e=(c&2097151)<<11|v>>>21;j=e+m|0;c=(c>>21)+p|0;c=e>>>0>j>>>0?c+1|0:c;f=c;c=c-((j>>>0<4293918720)-1|0)|0;p=c;e=j- -1048576|0;r=(c&2097151)<<11|e>>>21;l=r+Ba|0;c=(c>>21)+q|0;c=l>>>0>>0?c+1|0:c;Aa=c;O=l;c=Ai(l,c,-683901,-1);d=W;l=c;c=Ai(Qa,Oa,136657,0);l=l+c|0;d=W+d|0;c=(c>>>0>l>>>0?d+1|0:d)+g|0;g=h+l|0;c=g>>>0>>0?c+1|0:c;d=E&-2097152;Ya=g-d|0;_a=c-((d>>>0>g>>>0)+Ma|0)|0;r=k;l=o;k=Ai(O,Aa,136657,0);g=W;d=e&-2097152;c=j-d|0;Ba=c;f=f-((d>>>0>j>>>0)+p|0)|0;Ta=f;e=Ai(Qa,Oa,-997805,-1);k=e+k|0;d=W+g|0;d=e>>>0>k>>>0?d+1|0:d;e=Ai(c,f,-683901,-1);f=e+k|0;c=W+d|0;Ma=f;h=e>>>0>f>>>0?c+1|0:c;c=Ai(La,Ka,470296,0);d=W;e=c;c=Ai(Ha,Ia,666643,0);f=e+c|0;e=W+d|0;d=ya+(c>>>0>f>>>0?e+1|0:e)|0;c=f+xa|0;d=c>>>0>>0?d+1|0:d;E=c;g=d;d=Ai(La,Ka,666643,0);e=d+oa|0;c=W+wa|0;c=d>>>0>e>>>0?c+1|0:c;d=ta&-2097152;m=e-d|0;x=c-((d>>>0>e>>>0)+Ua|0)|0;d=Ai(ea,i,da,i);c=W;e=d;d=Ai(fa,0,G,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(ga,0,la,i);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;e=Ai(ha,0,na,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(ia,i,ka,0);f=d+f|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(ca,i,ma,i);f=c+f|0;d=W+e|0;j=f;f=c>>>0>f>>>0?d+1|0:d;c=z[s+14|0];d=0;p=z[s+10|0]|z[s+11|0]<<8|(z[s+12|0]<<16|z[s+13|0]<<24);k=c<<8|p>>>24;c=z[s+15|0];e=0;c=k|c<<16;d=d|e;d=((d&1)<<31|c>>>1)&2097151;e=d+j|0;c=f;j=e;f=d>>>0>e>>>0?c+1|0:c;k=p>>>4&2097151;c=Ai(ea,i,G,0);d=W;e=c;c=Ai(fa,0,ka,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(ga,0,na,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ha,0,ma,i);p=c+e|0;c=W+d|0;c=e>>>0>p>>>0?c+1|0:c;d=Ai(ia,i,la,i);p=d+p|0;e=W+c|0;c=d>>>0>p>>>0?e+1|0:e;ta=k+p|0;c=ta>>>0

>>0?c+1|0:c;o=c;c=c-((ta>>>0<4293918720)-1|0)|0;cb=c;e=c>>>21|0;q=ta- -1048576|0;c=(c&2097151)<<11|q>>>21;ya=c+j|0;d=e+f|0;d=c>>>0>ya>>>0?d+1|0:d;A=d;c=d-((ya>>>0<4293918720)-1|0)|0;db=c;n=ya- -1048576|0;d=(c&2097151)<<11|n>>>21;m=d+m|0;c=(c>>>21|0)+x|0;c=d>>>0>m>>>0?c+1|0:c;p=c;c=c-((m>>>0<4293918720)-1|0)|0;eb=c;e=c>>21;j=m- -1048576|0;c=(c&2097151)<<11|j>>>21;f=c+E|0;d=e+g|0;d=c>>>0>f>>>0?d+1|0:d;e=qa&-2097152;c=f-e|0;d=d-((e>>>0>f>>>0)+Va|0)|0;Ua=d;qa=c;k=c- -1048576|0;c=d-((c>>>0<4293918720)-1|0)|0;Va=c;d=c>>21;c=(c&2097151)<<11|k>>>21;f=c+Ma|0;e=d+h|0;d=(c>>>0>f>>>0?e+1|0:e)+l|0;c=f;f=f+r|0;d=c>>>0>f>>>0?d+1|0:d;e=ra&-2097152;c=f-e|0;d=d-((e>>>0>f>>>0)+Xa|0)|0;oa=d;l=c;g=c- -1048576|0;c=d-((c>>>0<4293918720)-1|0)|0;wa=c;d=c>>21;c=(c&2097151)<<11|g>>>21;h=c+Ya|0;e=d+_a|0;e=c>>>0>h>>>0?e+1|0:e;c=e-((h>>>0<4293918720)-1|0)|0;ra=c;E=N- -1048576|0;x=D-((N>>>0<4293918720)-1|0)|0;f=h- -1048576|0;r=(c&2097151)<<11|f>>>21;N=r+N|0;c=(c>>21)+D|0;d=E&-2097152;Xa=N-d|0;Ya=(r>>>0>N>>>0?c+1|0:c)-((d>>>0>N>>>0)+x|0)|0;c=f&-2097152;_a=h-c|0;Ma=e-((c>>>0>h>>>0)+ra|0)|0;c=g&-2097152;xa=l-c|0;N=oa-((c>>>0>l>>>0)+wa|0)|0;c=Ai(O,Aa,-997805,-1);d=W;e=c;c=Ai(Qa,Oa,654183,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Ba,Ta,136657,0);f=c+e|0;c=W+d|0;d=Ua+(e>>>0>f>>>0?c+1|0:c)|0;e=f+qa|0;d=e>>>0>>0?d+1|0:d;c=k&-2097152;oa=e-c|0;wa=d-((c>>>0>e>>>0)+Va|0)|0;c=v&-2097152;qa=K-c|0;D=B-((c>>>0>K>>>0)+bb|0)|0;d=Ai(Sa,Ra,-997805,-1);c=W;e=d;d=Ai(Da,Na,654183,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(Ja,Ga,136657,0);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;c=Ai(Fa,Ea,-683901,-1);f=c+f|0;e=W+d|0;d=I+(c>>>0>f>>>0?e+1|0:e)|0;e=f+sa|0;d=e>>>0>>0?d+1|0:d;c=C&-2097152;v=e-c|0;B=d-((c>>>0>e>>>0)+ab|0)|0;d=Ai(Sa,Ra,654183,0);c=W;e=d;d=Ai(Da,Na,470296,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Ja,Ga,-997805,-1);f=d+e|0;e=W+c|0;d=L+(d>>>0>f>>>0?e+1|0:e)|0;c=f+za|0;d=c>>>0>>0?d+1|0:d;e=c;c=Ai(Fa,Ea,136657,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Ha,Ia,-683901,-1);f=c+e|0;c=W+d|0;d=J&-2097152;k=f-d|0;g=(e>>>0>f>>>0?c+1|0:c)-((d>>>0>f>>>0)+$a|0)|0;f=(z[s+28|0]|z[s+29|0]<<8|(z[s+30|0]<<16|z[s+31|0]<<24))>>>7|0;c=Ai(Q,0,ea,i);d=W;e=c;c=Ai(R,i,fa,0);h=e+c|0;e=W+d|0;e=c>>>0>h>>>0?e+1|0:e;c=Ai(U,i,ga,0);h=c+h|0;d=W+e|0;d=c>>>0>h>>>0?d+1|0:d;e=Ai(_,$,ha,0);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;e=Ai(Y,0,ia,i);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;e=Ai(aa,0,da,i);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(ba,0,ca,i);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;c=Ai(Z,t,G,0);h=c+h|0;d=W+e|0;d=c>>>0>h>>>0?d+1|0:d;e=Ai(S,0,la,i);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;e=Ai(P,i,ka,0);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;e=Ai(V,0,ma,i);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(X,i,na,0);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;d=e;c=f+h|0;d=c>>>0>>0?d+1|0:d;e=(pa&2097151)<<11|ua>>>21;I=e+c|0;c=(pa>>>21|0)+d|0;c=e>>>0>I>>>0?c+1|0:c;r=c;d=c-((I>>>0<4293918720)-1|0)|0;ra=d;c=d>>>21|0;t=I- -1048576|0;d=(d&2097151)<<11|t>>>21;C=d+k|0;e=c+g|0;e=d>>>0>C>>>0?e+1|0:e;l=e;d=e-((C>>>0<4293918720)-1|0)|0;ua=d;c=d>>21;h=C- -1048576|0;d=(d&2097151)<<11|h>>>21;v=d+v|0;c=c+B|0;c=d>>>0>v>>>0?c+1|0:c;k=c;d=c-((v>>>0<4293918720)-1|0)|0;J=d;c=d>>21;g=v- -1048576|0;f=(d&2097151)<<11|g>>>21;d=f+qa|0;e=c+D|0;e=d>>>0>>0?e+1|0:e;pa=e;D=d;c=Ai(d,e,-683901,-1);e=c+oa|0;d=W+wa|0;B=e;f=c>>>0>e>>>0?d+1|0:d;d=Ai(Qa,Oa,470296,0);m=d+m|0;c=W+p|0;c=d>>>0>m>>>0?c+1|0:c;d=Ai(O,Aa,654183,0);e=j&-2097152;j=d+(m-e|0)|0;c=W+(c-((e>>>0>m>>>0)+eb|0)|0)|0;c=d>>>0>j>>>0?c+1|0:c;e=Ai(Ba,Ta,-997805,-1);j=e+j|0;d=W+c|0;d=e>>>0>j>>>0?d+1|0:d;c=g&-2097152;e=v-c|0;L=e;k=k-((c>>>0>v>>>0)+J|0)|0;G=k;g=Ai(D,pa,136657,0);j=g+j|0;c=W+d|0;e=Ai(e,k,-683901,-1);p=e+j|0;d=W+(g>>>0>j>>>0?c+1|0:c)|0;d=e>>>0>p>>>0?d+1|0:d;k=d;c=d-((p>>>0<4293918720)-1|0)|0;J=c;g=p- -1048576|0;d=(c&2097151)<<11|g>>>21;j=d+B|0;c=(c>>21)+f|0;c=d>>>0>j>>>0?c+1|0:c;d=c-((j>>>0<4293918720)-1|0)|0;v=d;f=j- -1048576|0;m=(d&2097151)<<11|f>>>21;B=m+xa|0;d=(d>>21)+N|0;xa=B;B=m>>>0>B>>>0?d+1|0:d;d=f&-2097152;N=j-d|0;za=c-((d>>>0>j>>>0)+v|0)|0;c=g&-2097152;oa=p-c|0;wa=k-((c>>>0>p>>>0)+J|0)|0;c=Ai(Qa,Oa,666643,0);e=A+W|0;g=c+ya|0;e=g>>>0>>0?e+1|0:e;c=Ai(O,Aa,470296,0);d=n&-2097152;f=c+(g-d|0)|0;d=W+(e-((d>>>0>g>>>0)+db|0)|0)|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(Ba,Ta,654183,0);f=e+f|0;c=W+d|0;j=f;f=e>>>0>f>>>0?c+1|0:c;c=h&-2097152;g=C-c|0;k=l-((c>>>0>C>>>0)+ua|0)|0;c=Ai(Sa,Ra,470296,0);d=W;e=c;c=Ai(Da,Na,666643,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(Ja,Ga,654183,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Fa,Ea,-997805,-1);h=c+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(Ha,Ia,136657,0);e=d+h|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(La,Ka,-683901,-1);h=d+e|0;e=W+c|0;d=r+(d>>>0>h>>>0?e+1|0:e)|0;h=h+I|0;d=h>>>0>>0?d+1|0:d;e=(M&2097151)<<11|F>>>21;c=t&-2097152;C=e+(h-c|0)|0;c=(d-((c>>>0>h>>>0)+ra|0)|0)+(M>>21)|0;c=e>>>0>C>>>0?c+1|0:c;v=c;c=c-((C>>>0<4293918720)-1|0)|0;qa=c;d=g;n=C- -1048576|0;g=(c&2097151)<<11|n>>>21;e=d+g|0;c=(c>>21)+k|0;c=e>>>0>>0?c+1|0:c;J=c;I=e;c=Ai(e,c,-683901,-1);e=c+j|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(D,pa,-997805,-1);f=c+e|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(L,G,136657,0);f=d+f|0;e=W+c|0;F=f;l=d>>>0>f>>>0?e+1|0:e;c=q&-2097152;j=ta-c|0;r=o-((c>>>0>ta>>>0)+cb|0)|0;d=Ai(ea,i,ka,0);c=W;e=d;d=Ai(fa,0,la,i);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(ga,0,ma,i);e=d+e|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(ia,i,na,0);f=d+e|0;e=W+c|0;d=d>>>0>f>>>0?e+1|0:e;c=(z[s+7|0]|z[s+8|0]<<8|(z[s+9|0]<<16|z[s+10|0]<<24))>>>7&2097151;e=c+f|0;t=e;h=c>>>0>e>>>0?d+1|0:d;c=Ai(ea,i,la,i);d=W;e=c;c=Ai(fa,0,na,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ia,i,ma,i);f=c+e|0;c=W+d|0;k=f;f=e>>>0>f>>>0?c+1|0:c;d=z[s+6|0];c=0;ra=z[s+2|0]|z[s+3|0]<<8|(z[s+4|0]<<16|z[s+5|0]<<24);g=d<<8|ra>>>24;e=c;c=z[s+7|0];d=0;c=c<<16|g;d=d|e;c=((d&3)<<30|c>>>2)&2097151;k=c+k|0;e=f;e=c>>>0>k>>>0?e+1|0:e;g=e;c=e-((k>>>0<4293918720)-1|0)|0;sa=c;A=k- -1048576|0;e=(c&2097151)<<11|A>>>21;o=e+t|0;c=(c>>>21|0)+h|0;c=e>>>0>o>>>0?c+1|0:c;m=c;c=c-((o>>>0<4293918720)-1|0)|0;ua=c;d=c>>>21|0;p=o- -1048576|0;c=(c&2097151)<<11|p>>>21;f=c+j|0;e=d+r|0;e=c>>>0>f>>>0?e+1|0:e;d=Ai(O,Aa,666643,0);f=d+f|0;c=W+e|0;c=d>>>0>f>>>0?c+1|0:c;d=Ai(Ba,Ta,470296,0);e=d+f|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(I,J,136657,0);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;c=Ai(D,pa,654183,0);e=c+f|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(L,G,-997805,-1);j=c+e|0;e=W+d|0;e=c>>>0>j>>>0?e+1|0:e;r=e;c=e-((j>>>0<4293918720)-1|0)|0;M=c;t=j- -1048576|0;e=(c&2097151)<<11|t>>>21;f=e+F|0;c=(c>>21)+l|0;c=e>>>0>f>>>0?c+1|0:c;e=c-((f>>>0<4293918720)-1|0)|0;F=e;l=f- -1048576|0;h=(e&2097151)<<11|l>>>21;q=h+oa|0;e=(e>>21)+wa|0;K=q;q=h>>>0>q>>>0?e+1|0:e;h=f;d=c;c=n&-2097152;n=(x&2097151)<<11|E>>>21;f=(C-c|0)+n|0;c=(v-((c>>>0>C>>>0)+qa|0)|0)+(x>>21)|0;c=f>>>0>>0?c+1|0:c;x=c;c=c-((f>>>0<4293918720)-1|0)|0;oa=c;e=c>>21;C=e;v=f- -1048576|0;O=(c&2097151)<<11|v>>>21;c=Ai(O,e,-683901,-1);e=c+h|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=l&-2097152;wa=e-c|0;ta=d-((c>>>0>e>>>0)+F|0)|0;d=Ai(O,C,136657,0);e=d+j|0;c=W+r|0;c=d>>>0>e>>>0?c+1|0:c;d=t&-2097152;ya=e-d|0;M=c-((d>>>0>e>>>0)+M|0)|0;d=Ai(Ba,Ta,666643,0);e=p&-2097152;h=d+(o-e|0)|0;c=W+(m-((e>>>0>o>>>0)+ua|0)|0)|0;c=d>>>0>h>>>0?c+1|0:c;e=Ai(I,J,-997805,-1);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;c=Ai(D,pa,470296,0);h=c+h|0;e=W+d|0;e=c>>>0>h>>>0?e+1|0:e;d=Ai(L,G,654183,0);h=d+h|0;c=W+e|0;F=h;r=d>>>0>h>>>0?c+1|0:c;e=ra>>>5&2097151;c=Ai(ea,i,na,0);d=W;l=c;c=Ai(fa,0,ma,i);h=l+c|0;d=W+d|0;c=c>>>0>h>>>0?d+1|0:d;d=e+h|0;c=d>>>0>>0?c+1|0:c;l=d;e=c;d=Ai(ea,i,ma,i);c=z[s+2|0];c=c<<16&2031616|(z[s|0]|z[s+1|0]<<8);o=d+c|0;d=W;d=c>>>0>o>>>0?d+1|0:d;n=d;d=d-((o>>>0<4293918720)-1|0)|0;qa=d;c=d>>>21|0;m=o- -1048576|0;d=(d&2097151)<<11|m>>>21;E=d+l|0;c=c+e|0;c=d>>>0>E>>>0?c+1|0:c;p=c;d=c-((E>>>0<4293918720)-1|0)|0;ra=d;j=E- -1048576|0;e=(d&2097151)<<11|j>>>21;h=e+k|0;d=(d>>>21|0)+g|0;d=e>>>0>h>>>0?d+1|0:d;e=Ai(I,J,654183,0);g=A&-2097152;k=e+(h-g|0)|0;c=W+(d-((g>>>0>h>>>0)+sa|0)|0)|0;c=e>>>0>k>>>0?c+1|0:c;d=Ai(D,pa,666643,0);e=d+k|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(L,G,470296,0);t=d+e|0;d=W+c|0;d=e>>>0>t>>>0?d+1|0:d;l=d;d=d-((t>>>0<4293918720)-1|0)|0;ua=d;c=d>>21;h=t- -1048576|0;d=(d&2097151)<<11|h>>>21;k=d+F|0;e=c+r|0;e=d>>>0>k>>>0?e+1|0:e;d=e-((k>>>0<4293918720)-1|0)|0;A=d;g=k- -1048576|0;r=(d&2097151)<<11|g>>>21;D=r+ya|0;d=(d>>21)+M|0;pa=D;r=r>>>0>D>>>0?d+1|0:d;c=Ai(O,C,-997805,-1);k=c+k|0;d=W+e|0;d=c>>>0>k>>>0?d+1|0:d;c=g&-2097152;M=k-c|0;F=d-((c>>>0>k>>>0)+A|0)|0;d=Ai(O,C,654183,0);e=d+t|0;c=W+l|0;c=d>>>0>e>>>0?c+1|0:c;d=h&-2097152;D=e-d|0;A=c-((d>>>0>e>>>0)+ua|0)|0;c=Ai(I,J,470296,0);d=j&-2097152;g=c+(E-d|0)|0;e=W+(p-((d>>>0>E>>>0)+ra|0)|0)|0;e=c>>>0>g>>>0?e+1|0:e;d=Ai(L,G,666643,0);g=d+g|0;c=W+e|0;k=g;e=d>>>0>g>>>0?c+1|0:c;d=Ai(I,J,666643,0);g=m&-2097152;j=d+(o-g|0)|0;c=W+(n-((qa&4095)+(g>>>0>o>>>0)|0)|0)|0;c=d>>>0>j>>>0?c+1|0:c;t=c;c=c-((j>>>0<4293918720)-1|0)|0;n=c;l=j- -1048576|0;g=(c&2097151)<<11|l>>>21;h=g+k|0;c=(c>>21)+e|0;c=g>>>0>h>>>0?c+1|0:c;e=c;c=c-((h>>>0<4293918720)-1|0)|0;m=c;k=h- -1048576|0;g=(c&2097151)<<11|k>>>21;p=g+D|0;c=(c>>21)+A|0;g=g>>>0>p>>>0?c+1|0:c;c=Ai(O,C,470296,0);d=c+h|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=k&-2097152;h=d-c|0;k=e-((c>>>0>d>>>0)+m|0)|0;d=Ai(O,C,666643,0);e=l&-2097152;A=d+(j-e|0)|0;c=W+(t-((e>>>0>j>>>0)+n|0)|0)|0;c=d>>>0>A>>>0?c+1|0:c;e=c>>21;c=(c&2097151)<<11|A>>>21;n=c+h|0;d=e+k|0;d=c>>>0>n>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|n>>>21;m=d+p|0;c=c+g|0;c=d>>>0>m>>>0?c+1|0:c;d=c>>21;c=(c&2097151)<<11|m>>>21;g=c+M|0;d=d+F|0;d=c>>>0>g>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|g>>>21;p=d+pa|0;e=c+r|0;e=d>>>0>p>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|p>>>21;j=e+wa|0;c=d+ta|0;c=e>>>0>j>>>0?c+1|0:c;e=c>>21;c=(c&2097151)<<11|j>>>21;r=c+K|0;d=e+q|0;d=c>>>0>r>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|r>>>21;t=d+N|0;c=c+za|0;c=d>>>0>t>>>0?c+1|0:c;d=c>>21;c=(c&2097151)<<11|t>>>21;l=c+xa|0;d=d+B|0;d=c>>>0>l>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|l>>>21;h=d+_a|0;e=c+Ma|0;e=d>>>0>h>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|h>>>21;k=e+Xa|0;c=d+Ya|0;d=v&-2097152;q=f-d|0;c=e>>>0>k>>>0?c+1|0:c;v=q+((c&2097151)<<11|k>>>21)|0;c=(x-((d>>>0>f>>>0)+oa|0)|0)+(c>>21)|0;c=q>>>0>v>>>0?c+1|0:c;B=(c&2097151)<<11|v>>>21;d=c>>21;x=d;c=Ai(B,d,666643,0);d=A&2097151;A=c+d|0;c=W;c=d>>>0>A>>>0?c+1|0:c;f=c;w[a+32|0]=A;w[a+33|0]=(c&255)<<24|A>>>8;c=n&2097151;d=Ai(B,x,470296,0)+c|0;e=W;q=(f&2097151)<<11|A>>>21;n=q+d|0;c=(f>>21)+(c>>>0>d>>>0?e+1|0:e)|0;c=n>>>0>>0?c+1|0:c;w[a+36|0]=(c&2047)<<21|n>>>11;d=c;e=n;w[a+35|0]=(c&7)<<29|e>>>3;w[a+34|0]=((f&65535)<<16|A>>>16)&31|e<<5;f=m&2097151;m=Ai(B,x,654183,0)+f|0;c=W;f=f>>>0>m>>>0?c+1|0:c;n=(d&2097151)<<11|e>>>21;m=n+m|0;d=(d>>21)+f|0;d=m>>>0>>0?d+1|0:d;c=d;w[a+38|0]=(c&63)<<26|m>>>6;f=m;w[a+37|0]=f<<2|(e&1572864)>>>19;e=g&2097151;g=Ai(B,x,-997805,-1)+e|0;d=W;d=e>>>0>g>>>0?d+1|0:d;e=c;c=c>>21;m=(e&2097151)<<11|f>>>21;g=m+g|0;e=c+d|0;e=g>>>0>>0?e+1|0:e;w[a+41|0]=(e&511)<<23|g>>>9;w[a+40|0]=(e&1)<<31|g>>>1;w[a+39|0]=g<<7|(f&2080768)>>>14;d=p&2097151;f=Ai(B,x,136657,0)+d|0;c=W;c=d>>>0>f>>>0?c+1|0:c;d=e;e=d>>21;p=(d&2097151)<<11|g>>>21;f=p+f|0;d=c+e|0;d=f>>>0

>>0?d+1|0:d;w[a+44|0]=(d&4095)<<20|f>>>12;e=f;w[a+43|0]=(d&15)<<28|e>>>4;w[a+42|0]=e<<4|(g&1966080)>>>17;f=j&2097151;g=Ai(B,x,-683901,-1)+f|0;c=W;c=f>>>0>g>>>0?c+1|0:c;f=d;d=d>>21;j=g;g=(f&2097151)<<11|e>>>21;f=j+g|0;d=c+d|0;d=f>>>0>>0?d+1|0:d;w[a+46|0]=(d&127)<<25|f>>>7;w[a+45|0]=f<<1|(e&1048576)>>>20;c=d>>21;d=(d&2097151)<<11|f>>>21;g=d+(r&2097151)|0;e=d>>>0>g>>>0?c+1|0:c;w[a+49|0]=(e&1023)<<22|g>>>10;w[a+48|0]=(e&3)<<30|g>>>2;w[a+47|0]=g<<6|(f&2064384)>>>15;c=e>>21;d=(e&2097151)<<11|g>>>21;e=d+(t&2097151)|0;c=d>>>0>e>>>0?c+1|0:c;w[a+52|0]=(c&8191)<<19|e>>>13;w[a+51|0]=(c&31)<<27|e>>>5;d=l&2097151;l=(c&2097151)<<11|e>>>21;f=d+l|0;d=c>>21;d=f>>>0>>0?d+1|0:d;l=f;w[a+53|0]=f;w[a+50|0]=e<<3|(g&1835008)>>>18;w[a+54|0]=(d&255)<<24|f>>>8;g=(d&2097151)<<11|f>>>21;f=g+(h&2097151)|0;e=d>>21;e=f>>>0>>0?e+1|0:e;w[a+57|0]=(e&2047)<<21|f>>>11;w[a+56|0]=(e&7)<<29|f>>>3;w[a+55|0]=((d&65535)<<16|l>>>16)&31|f<<5;c=e>>21;d=(e&2097151)<<11|f>>>21;e=d+(k&2097151)|0;c=d>>>0>e>>>0?c+1|0:c;w[a+59|0]=(c&63)<<26|e>>>6;w[a+58|0]=e<<2|(f&1572864)>>>19;d=c;c=c>>21;k=(d&2097151)<<11|e>>>21;g=v&2097151;f=k+g|0;d=f>>>0>>0?c+1|0:c;w[a+63|0]=(d&131071)<<15|f>>>17;c=f;w[a+62|0]=(d&511)<<23|c>>>9;w[a+60|0]=c<<7|(e&2080768)>>>14;w[a+61|0]=k+v>>>1;ja(u,64);ja(s,64);if(b){y[b>>2]=64;y[b+4>>2]=0;}T=H+560|0;return 0}function ha(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0;e=z[c+2|0];M=e<<16&2031616|(z[c|0]|z[c+1|0]<<8);p=z[b+23|0]|z[b+24|0]<<8|(z[b+25|0]<<16|z[b+26|0]<<24);N=p>>>5&2097151;g=Ai(M,0,N,0);f=W;e=z[b+23|0];O=e<<16&2031616|(z[b+21|0]|z[b+22|0]<<8);i=z[c+2|0]|z[c+3|0]<<8|(z[c+4|0]<<16|z[c+5|0]<<24);P=i>>>5&2097151;d=Ai(O,0,P,0);g=d+g|0;e=W+f|0;e=d>>>0>g>>>0?e+1|0:e;Q=(z[c+7|0]|z[c+8|0]<<8|(z[c+9|0]<<16|z[c+10|0]<<24))>>>7&2097151;t=z[b+15|0]|z[b+16|0]<<8|(z[b+17|0]<<16|z[b+18|0]<<24);R=t>>>6&2097151;f=Ai(Q,0,R,0);g=f+g|0;d=W+e|0;l=g;f=f>>>0>g>>>0?d+1|0:d;e=z[b+14|0];d=0;m=z[b+10|0]|z[b+11|0]<<8|(z[b+12|0]<<16|z[b+13|0]<<24);j=e<<8|m>>>24;g=z[b+15|0];g=g<<16;n=d|d;e=g|j;S=((n&1)<<31|e>>>1)&2097151;k=z[c+10|0]|z[c+11|0]<<8|(z[c+12|0]<<16|z[c+13|0]<<24);T=k>>>4&2097151;d=Ai(S,0,T,0);e=d+l|0;f=W+f|0;n=e;g=e>>>0>>0?f+1|0:f;d=z[c+6|0];f=0;l=d<<8|i>>>24;e=z[c+7|0];d=0;e=l|e<<16;f=d|f;U=((f&3)<<30|e>>>2)&2097151;i=U;l=0;e=z[b+19|0];j=e<<8|t>>>24;f=d;d=z[b+20|0];e=0;d=d<<16|j;e=e|f;f=e>>>3|0;V=(e&7)<<29|d>>>3;ia=f;d=Ai(i,l,V,f);j=d+n|0;e=W+g|0;e=d>>>0>j>>>0?e+1|0:e;i=z[c+15|0]|z[c+16|0]<<8|(z[c+17|0]<<16|z[c+18|0]<<24);X=i>>>6&2097151;Y=(z[b+7|0]|z[b+8|0]<<8|(z[b+9|0]<<16|z[b+10|0]<<24))>>>7&2097151;f=Ai(X,0,Y,0);g=f+j|0;d=W+e|0;l=g;g=f>>>0>g>>>0?d+1|0:d;e=z[c+14|0];d=0;j=e<<8|k>>>24;e=d;d=z[c+15|0];f=0;d=d<<16;f=e|f;e=d|j;Z=((f&1)<<31|e>>>1)&2097151;_=m>>>4&2097151;d=Ai(Z,0,_,0);f=d+l|0;e=W+g|0;k=f;l=d>>>0>f>>>0?e+1|0:e;d=z[c+19|0];e=0;g=d<<8|i>>>24;d=z[c+20|0];f=0;d=g|d<<16;f=e|f;e=f>>>3|0;$=(f&7)<<29|d>>>3;A=e;g=e;d=z[b+6|0];e=0;n=z[b+2|0]|z[b+3|0]<<8|(z[b+4|0]<<16|z[b+5|0]<<24);i=d<<8|n>>>24;d=z[b+7|0];d=d<<16|i;e=e|e;aa=((e&3)<<30|d>>>2)&2097151;e=Ai($,g,aa,0);g=e+k|0;d=W+l|0;f=e>>>0>g>>>0?d+1|0:d;e=z[c+23|0];ba=e<<16&2031616|(z[c+21|0]|z[c+22|0]<<8);ca=n>>>5&2097151;e=Ai(ba,0,ca,0);g=e+g|0;d=W+f|0;f=e>>>0>g>>>0?d+1|0:d;e=z[b+2|0];da=e<<16&2031616|(z[b|0]|z[b+1|0]<<8);n=z[c+23|0]|z[c+24|0]<<8|(z[c+25|0]<<16|z[c+26|0]<<24);D=n>>>5&2097151;d=Ai(da,0,D,0);g=d+g|0;e=W+f|0;i=g;l=d>>>0>g>>>0?e+1|0:e;d=Ai(O,h,M,h);e=W;f=d;d=Ai(V,ia,P,0);g=f+d|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;d=Ai(Q,0,S,h);g=d+g|0;e=W+f|0;e=d>>>0>g>>>0?e+1|0:e;f=Ai(T,0,_,0);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;e=Ai(R,0,U,h);f=e+g|0;d=W+d|0;d=e>>>0>f>>>0?d+1|0:d;e=f;f=Ai(X,0,aa,h);g=e+f|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=Ai(Z,h,Y,0);g=d+g|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;d=Ai($,A,ca,0);g=d+g|0;e=W+f|0;f=Ai(ba,h,da,h);j=f+g|0;d=W+(d>>>0>g>>>0?e+1|0:e)|0;d=f>>>0>j>>>0?d+1|0:d;g=d;d=d-((j>>>0<4293918720)-1|0)|0;B=d;e=d>>>21|0;v=j- -1048576|0;d=(d&2097151)<<11|v>>>21;i=d+i|0;e=e+l|0;e=d>>>0>i>>>0?e+1|0:e;f=e-((i>>>0<4293918720)-1|0)|0;r=f;s=i- -1048576|0;d=s&-2097152;q=i-d|0;o=e-((d>>>0>i>>>0)+f|0)|0;e=z[c+27|0];d=0;l=e<<8|n>>>24;f=d;d=z[c+28|0];e=0;d=d<<16;f=e|f;e=d|l;ea=((f&3)<<30|e>>>2)&2097151;E=(z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24))>>>7|0;i=Ai(ea,0,E,0);l=W;d=z[b+27|0];e=0;b=z[b+28|0];f=0;d=d<<8|p>>>24|b<<16;e=e|f;fa=((e&3)<<30|d>>>2)&2097151;F=(z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24))>>>7|0;b=Ai(fa,0,F,0);c=b+i|0;d=W+l|0;d=b>>>0>c>>>0?d+1|0:d;f=c;b=Ai(N,0,F,0);c=W;e=b;b=Ai(D,0,E,0);l=e+b|0;e=W+c|0;e=b>>>0>l>>>0?e+1|0:e;b=Ai(ea,h,fa,h);n=b+l|0;e=W+e|0;e=b>>>0>n>>>0?e+1|0:e;l=e;b=e-((n>>>0<4293918720)-1|0)|0;k=b;e=b>>>21|0;c=n- -1048576|0;b=(b&2097151)<<11|c>>>21;i=b+f|0;f=e+d|0;f=b>>>0>i>>>0?f+1|0:f;e=f-((i>>>0<4293918720)-1|0)|0;t=e;m=i- -1048576|0;d=m&-2097152;b=i-d|0;d=f-((e&131071)+(d>>>0>i>>>0)|0)|0;ua=d;va=b;b=Ai(b,d,666643,0);e=b+q|0;d=W+o|0;I=e;i=b>>>0>e>>>0?d+1|0:d;b=c&-2097152;q=n-b|0;x=l-((k&131071)+(b>>>0>n>>>0)|0)|0;b=Ai(ba,h,E,0);c=W;d=b;b=Ai(D,0,fa,h);e=d+b|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(O,h,F,0);c=b+e|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(N,0,ea,h);c=b+c|0;d=W+e|0;k=c;b=b>>>0>c>>>0?d+1|0:d;c=Ai(N,0,D,0);d=W;e=c;c=Ai($,A,E,0);f=e+c|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(ba,h,fa,h);d=c+f|0;f=W+e|0;f=c>>>0>d>>>0?f+1|0:f;c=Ai(V,ia,F,0);e=c+d|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(O,h,ea,h);o=c+e|0;e=W+d|0;e=c>>>0>o>>>0?e+1|0:e;n=e;c=e-((o>>>0<4293918720)-1|0)|0;u=c;d=c>>>21|0;l=o- -1048576|0;c=(c&2097151)<<11|l>>>21;k=c+k|0;e=b+d|0;e=c>>>0>k>>>0?e+1|0:e;c=e;e=e-((k>>>0<4293918720)-1|0)|0;p=e;d=q;b=k- -1048576|0;q=(e&2097151)<<11|b>>>21;f=d+q|0;e=(e>>>21|0)+x|0;e=f>>>0>>0?e+1|0:e;wa=e;d=b&-2097152;b=k-d|0;xa=b;k=c-((d>>>0>k>>>0)+p|0)|0;ya=k;za=f;c=Ai(f,e,470296,0);e=c+I|0;d=W+i|0;d=c>>>0>e>>>0?d+1|0:d;b=Ai(b,k,654183,0);c=b+e|0;f=W+d|0;x=c;i=b>>>0>c>>>0?f+1|0:f;b=l&-2097152;p=o-b|0;o=n-((b>>>0>o>>>0)+u|0)|0;b=Ai($,A,fa,h);c=W;d=b;b=Ai(X,0,E,0);e=d+b|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(O,h,D,0);c=b+e|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(N,0,ba,h);c=b+c|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(R,0,F,0);c=b+c|0;d=W+f|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(V,ia,ea,h);c=b+c|0;e=W+d|0;n=c;l=b>>>0>c>>>0?e+1|0:e;b=Ai(Z,h,E,0);c=W;d=b;b=Ai(X,0,fa,h);e=d+b|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(N,0,$,A);c=b+e|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(V,ia,D,0);c=b+c|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(O,h,ba,h);c=b+c|0;d=W+f|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(S,h,F,0);c=b+c|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(R,0,ea,h);c=b+c|0;d=W+e|0;d=b>>>0>c>>>0?d+1|0:d;b=d;d=d-((c>>>0<4293918720)-1|0)|0;C=d;e=d>>>21|0;u=c- -1048576|0;d=(d&2097151)<<11|u>>>21;G=d+n|0;f=e+l|0;f=d>>>0>G>>>0?f+1|0:f;q=f;d=f-((G>>>0<4293918720)-1|0)|0;ga=d;k=G- -1048576|0;l=(d&2097151)<<11|k>>>21;f=l+p|0;d=(d>>>21|0)+o|0;d=f>>>0>>0?d+1|0:d;Aa=d;Ba=f;d=Ai(f,d,-997805,-1);f=d+x|0;e=W+i|0;o=f;i=d>>>0>f>>>0?e+1|0:e;l=j;j=g;d=Ai(M,h,V,ia);e=W;f=d;d=Ai(R,0,P,0);g=f+d|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai(Q,0,_,0);g=e+g|0;d=W+f|0;d=e>>>0>g>>>0?d+1|0:d;f=Ai(T,0,Y,0);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;f=Ai(S,h,U,h);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;f=Ai(X,0,ca,0);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=Ai(Z,h,aa,h);g=d+g|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai($,A,da,h);g=e+g|0;d=W+f|0;n=g;g=e>>>0>g>>>0?d+1|0:d;d=Ai(M,h,R,0);e=W;f=d;d=Ai(P,0,S,h);f=f+d|0;e=W+e|0;e=d>>>0>f>>>0?e+1|0:e;d=f;f=Ai(Q,0,Y,0);p=d+f|0;d=W+e|0;d=f>>>0>p>>>0?d+1|0:d;f=Ai(T,0,aa,h);p=f+p|0;e=W+d|0;e=f>>>0>p>>>0?e+1|0:e;d=Ai(U,h,_,0);p=d+p|0;f=W+e|0;f=d>>>0>p>>>0?f+1|0:f;e=Ai(X,0,da,h);p=e+p|0;d=W+f|0;f=Ai(Z,h,ca,0);ja=f+p|0;e=W+(e>>>0>p>>>0?d+1|0:d)|0;e=f>>>0>ja>>>0?e+1|0:e;ka=e;e=e-((ja>>>0<4293918720)-1|0)|0;Ja=e;ha=ja- -1048576|0;f=(e&2097151)<<11|ha>>>21;la=f+n|0;e=(e>>>21|0)+g|0;e=f>>>0>la>>>0?e+1|0:e;y=e;e=e-((la>>>0<4293918720)-1|0)|0;Ka=e;I=la- -1048576|0;f=(e&2097151)<<11|I>>>21;l=f+l|0;e=(e>>>21|0)+j|0;e=f>>>0>l>>>0?e+1|0:e;d=Ai(za,wa,666643,0);f=v&-2097152;g=d+(l-f|0)|0;e=W+(e-((f>>>0>l>>>0)+B|0)|0)|0;e=d>>>0>g>>>0?e+1|0:e;f=Ai(xa,ya,470296,0);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;f=Ai(Ba,Aa,654183,0);J=f+g|0;e=W+d|0;e=f>>>0>J>>>0?e+1|0:e;x=e;e=e-((J>>>0<4293918720)-1|0)|0;ra=e;d=e>>21;p=J- -1048576|0;e=(e&2097151)<<11|p>>>21;B=e+o|0;d=d+i|0;d=e>>>0>B>>>0?d+1|0:d;o=d;e=d-((B>>>0<4293918720)-1|0)|0;ma=e;v=B- -1048576|0;pa=(e&2097151)<<11|v>>>21;n=e>>21;d=Ai(M,h,fa,h);e=W;f=d;d=Ai(N,0,P,0);f=f+d|0;e=W+e|0;e=d>>>0>f>>>0?e+1|0:e;d=Ai(Q,0,V,ia);g=d+f|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai(R,0,T,0);g=e+g|0;d=W+f|0;d=e>>>0>g>>>0?d+1|0:d;f=Ai(O,h,U,h);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;f=Ai(X,0,_,0);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;f=Ai(Z,h,S,h);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=Ai(Y,0,$,A);g=d+g|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai(ca,0,D,0);g=e+g|0;d=W+f|0;d=e>>>0>g>>>0?d+1|0:d;f=Ai(aa,h,ba,h);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=g;g=Ai(ea,h,da,h);f=d+g|0;d=W+e|0;i=f;l=f>>>0>>0?d+1|0:d;K=Ai(E,0,F,0);g=K- -1048576|0;L=W;f=L-((K>>>0<4293918720)-1|0)|0;j=f;d=g&-2097152;e=K-d|0;d=L-((f&524287)+(d>>>0>K>>>0)|0)|0;m=(t&2097151)<<11|m>>>21;f=m+e|0;d=(t>>>21|0)+d|0;d=f>>>0>>0?d+1|0:d;Ca=d;Da=f;e=(r&2097151)<<11|s>>>21;m=Ai(f,d,666643,0)+e|0;d=W+(r>>>21|0)|0;d=e>>>0>m>>>0?d+1|0:d;f=Ai(va,ua,470296,0);m=f+m|0;e=W+d|0;e=(f>>>0>m>>>0?e+1|0:e)+l|0;d=i+m|0;e=d>>>0>>0?e+1|0:e;f=Ai(za,wa,654183,0);m=f+d|0;d=W+e|0;qa=i- -1048576|0;l=l-((i>>>0<4293918720)-1|0)|0;K=l;e=Ai(xa,ya,-997805,-1);i=e+m|0;f=W+(f>>>0>m>>>0?d+1|0:d)|0;f=e>>>0>i>>>0?f+1|0:f;d=Ai(Ba,Aa,136657,0);e=qa&-2097152;s=d+(i-e|0)|0;e=W+(f-((e>>>0>i>>>0)+l|0)|0)|0;t=d>>>0>s>>>0?e+1|0:e;f=t+n|0;d=s+pa|0;f=d>>>0>>0?f+1|0:f;na=d;m=f;d=k&-2097152;L=G-d|0;G=q-((d>>>0>G>>>0)+ga|0)|0;f=j>>>21|0;Ea=f;d=c;ta=(j&2097151)<<11|g>>>21;c=Ai(ta,f,-683901,-1);e=d+c|0;d=W+b|0;b=u&-2097152;q=e-b|0;r=(c>>>0>e>>>0?d+1|0:d)-((b>>>0>e>>>0)+C|0)|0;b=Ai(N,0,X,0);c=W;d=b;b=Ai(T,0,E,0);d=d+b|0;e=W+c|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(Z,h,fa,h);c=b+d|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(O,h,$,A);c=b+c|0;d=W+f|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(R,0,D,0);c=b+c|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(V,ia,ba,h);c=b+c|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(_,0,F,0);c=b+c|0;e=W+e|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(S,h,ea,h);c=b+c|0;f=W+e|0;g=c;b=b>>>0>c>>>0?f+1|0:f;c=Ai(T,0,fa,h);d=W;e=c;c=Ai(Q,0,E,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(O,h,X,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(N,0,Z,h);f=c+e|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(V,ia,$,A);d=c+f|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(S,h,D,0);d=c+d|0;f=W+e|0;f=c>>>0>d>>>0?f+1|0:f;c=Ai(R,0,ba,h);e=c+d|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(Y,0,F,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(_,0,ea,h);k=c+e|0;e=W+d|0;e=c>>>0>k>>>0?e+1|0:e;n=e;c=e-((k>>>0<4293918720)-1|0)|0;oa=c;d=c>>>21|0;i=k- -1048576|0;c=(c&2097151)<<11|i>>>21;u=c+g|0;f=b+d|0;f=c>>>0>u>>>0?f+1|0:f;l=f;b=f-((u>>>0<4293918720)-1|0)|0;C=b;d=b>>>21|0;j=u- -1048576|0;b=(b&2097151)<<11|j>>>21;q=b+q|0;e=d+r|0;e=b>>>0>q>>>0?e+1|0:e;g=e;c=e-((q>>>0<4293918720)-1|0)|0;r=c;d=c>>21;b=q- -1048576|0;e=(c&2097151)<<11|b>>>21;c=e+L|0;f=d+G|0;f=c>>>0>>0?f+1|0:f;Fa=f;ga=s- -1048576|0;e=t-((s>>>0<4293918720)-1|0)|0;pa=e;sa=c;c=Ai(c,f,-683901,-1);f=c+na|0;d=W+m|0;d=c>>>0>f>>>0?d+1|0:d;c=ga&-2097152;m=f-c|0;G=m- -1048576|0;e=d-((c>>>0>f>>>0)+e|0)|0;d=e-((m>>>0<4293918720)-1|0)|0;L=d;c=G&-2097152;Pa=m-c|0;La=e-((c>>>0>m>>>0)+d|0)|0;c=Ai(sa,Fa,136657,0);d=v&-2097152;f=c+(B-d|0)|0;e=W+(o-((d>>>0>B>>>0)+ma|0)|0)|0;Ga=f;c=c>>>0>f>>>0?e+1|0:e;b=b&-2097152;H=q-b|0;v=g-((b>>>0>q>>>0)+r|0)|0;b=Ai(Da,Ca,-683901,-1);d=W;e=b;b=Ai(ta,Ea,136657,0);f=e+b|0;d=W+d|0;e=l+(b>>>0>f>>>0?d+1|0:d)|0;d=f+u|0;e=d>>>0>>0?e+1|0:e;b=j&-2097152;t=d-b|0;m=e-((b>>>0>d>>>0)+C|0)|0;b=Ai(ta,Ea,-997805,-1);e=b+k|0;d=W+n|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(Da,Ca,136657,0);e=b+e|0;d=W+d|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(va,ua,-683901,-1);f=b+e|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=i&-2097152;l=f-b|0;j=e-((b>>>0>f>>>0)+oa|0)|0;b=Ai(N,0,T,0);d=W;e=b;b=Ai(Q,0,fa,h);f=e+b|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(U,h,E,0);f=b+f|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(X,0,V,ia);f=b+f|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(O,h,Z,h);f=b+f|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(R,0,$,A);e=b+f|0;f=W+d|0;f=b>>>0>e>>>0?f+1|0:f;b=Ai(_,0,D,0);d=b+e|0;e=W+f|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(S,h,ba,h);f=b+d|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(aa,h,F,0);f=b+f|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(Y,0,ea,h);f=b+f|0;d=W+e|0;g=f;b=b>>>0>f>>>0?d+1|0:d;d=Ai(N,0,Q,0);e=W;f=d;d=Ai(P,0,E,0);i=f+d|0;f=W+e|0;f=d>>>0>i>>>0?f+1|0:f;d=Ai(O,h,T,0);i=d+i|0;e=W+f|0;e=d>>>0>i>>>0?e+1|0:e;f=Ai(U,h,fa,h);i=f+i|0;d=W+e|0;d=f>>>0>i>>>0?d+1|0:d;f=Ai(R,0,X,0);i=f+i|0;e=W+d|0;e=f>>>0>i>>>0?e+1|0:e;f=Ai(V,ia,Z,h);i=f+i|0;d=W+e|0;d=f>>>0>i>>>0?d+1|0:d;e=Ai(S,h,$,A);i=e+i|0;f=W+d|0;f=e>>>0>i>>>0?f+1|0:f;d=Ai(Y,0,D,0);i=d+i|0;e=W+f|0;e=d>>>0>i>>>0?e+1|0:e;f=Ai(_,0,ba,h);i=f+i|0;d=W+e|0;d=f>>>0>i>>>0?d+1|0:d;f=Ai(ca,0,F,0);i=f+i|0;e=W+d|0;e=f>>>0>i>>>0?e+1|0:e;f=Ai(aa,h,ea,h);ma=f+i|0;d=W+e|0;d=f>>>0>ma>>>0?d+1|0:d;B=d;d=d-((ma>>>0<4293918720)-1|0)|0;Qa=d;e=d>>>21|0;r=ma- -1048576|0;d=(d&2097151)<<11|r>>>21;na=d+g|0;e=b+e|0;e=d>>>0>na>>>0?e+1|0:e;s=e;b=e-((na>>>0<4293918720)-1|0)|0;Ra=b;e=b>>>21|0;u=na- -1048576|0;b=(b&2097151)<<11|u>>>21;oa=b+l|0;d=e+j|0;d=b>>>0>oa>>>0?d+1|0:d;q=d;b=d-((oa>>>0<4293918720)-1|0)|0;Sa=b;e=b>>21;o=oa- -1048576|0;b=(b&2097151)<<11|o>>>21;C=b+t|0;e=e+m|0;e=b>>>0>C>>>0?e+1|0:e;n=e;b=e-((C>>>0<4293918720)-1|0)|0;Ma=b;e=b>>21;g=C- -1048576|0;f=(b&2097151)<<11|g>>>21;b=f+H|0;d=e+v|0;d=b>>>0>>0?d+1|0:d;Ha=d;H=b;b=Ai(b,d,-683901,-1);d=b+Ga|0;f=W+c|0;Na=d;i=b>>>0>d>>>0?f+1|0:f;b=p&-2097152;Oa=J-b|0;ra=x-((b>>>0>J>>>0)+ra|0)|0;b=Ai(xa,ya,666643,0);c=I&-2097152;e=b+(la-c|0)|0;d=W+(y-((c>>>0>la>>>0)+Ka|0)|0)|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(Ba,Aa,470296,0);c=b+e|0;e=W+d|0;I=c;c=b>>>0>c>>>0?e+1|0:e;b=ha&-2097152;k=ja-b|0;l=ka-((b>>>0>ja>>>0)+Ja|0)|0;b=Ai(M,h,S,h);d=W;e=b;b=Ai(P,0,_,0);e=e+b|0;f=W+d|0;f=b>>>0>e>>>0?f+1|0:f;b=Ai(Q,0,aa,h);e=b+e|0;d=W+f|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(T,0,ca,0);f=b+e|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(U,h,Y,0);f=b+f|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(Z,h,da,h);f=b+f|0;e=W+d|0;j=f;b=b>>>0>f>>>0?e+1|0:e;d=Ai(M,h,_,0);e=W;f=d;d=Ai(P,0,Y,0);m=f+d|0;f=W+e|0;f=d>>>0>m>>>0?f+1|0:f;e=Ai(Q,0,ca,0);m=e+m|0;d=W+f|0;d=e>>>0>m>>>0?d+1|0:d;f=Ai(T,0,da,h);m=f+m|0;e=W+d|0;e=f>>>0>m>>>0?e+1|0:e;f=Ai(U,h,aa,h);J=f+m|0;d=W+e|0;d=f>>>0>J>>>0?d+1|0:d;x=d;d=d-((J>>>0<4293918720)-1|0)|0;Ta=d;e=d>>>21|0;p=J- -1048576|0;d=(d&2097151)<<11|p>>>21;ka=d+j|0;f=b+e|0;f=d>>>0>ka>>>0?f+1|0:f;v=f;b=f-((ka>>>0<4293918720)-1|0)|0;Ja=b;e=b>>>21|0;t=ka- -1048576|0;b=(b&2097151)<<11|t>>>21;f=b+k|0;d=e+l|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(Ba,Aa,666643,0);ha=b+f|0;e=W+d|0;e=b>>>0>ha>>>0?e+1|0:e;m=e;b=e-((ha>>>0<4293918720)-1|0)|0;Ka=b;d=b>>21;k=ha- -1048576|0;b=(b&2097151)<<11|k>>>21;y=b+I|0;d=c+d|0;d=b>>>0>y>>>0?d+1|0:d;l=d;b=d-((y>>>0<4293918720)-1|0)|0;Ga=b;d=b>>21;j=y- -1048576|0;b=(b&2097151)<<11|j>>>21;c=b+Oa|0;e=d+ra|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(sa,Fa,-997805,-1);d=b+c|0;f=W+e|0;f=b>>>0>d>>>0?f+1|0:f;c=g&-2097152;b=C-c|0;la=b;e=n-((c>>>0>C>>>0)+Ma|0)|0;Ia=e;c=Ai(H,Ha,136657,0);g=c+d|0;d=W+f|0;b=Ai(b,e,-683901,-1);n=b+g|0;d=W+(c>>>0>g>>>0?d+1|0:d)|0;d=b>>>0>n>>>0?d+1|0:d;g=d;b=d-((n>>>0<4293918720)-1|0)|0;ja=b;e=b>>21;f=n- -1048576|0;b=(b&2097151)<<11|f>>>21;I=b+Na|0;d=e+i|0;i=I;d=i>>>0>>0?d+1|0:d;c=d;d=d-((i>>>0<4293918720)-1|0)|0;C=d;b=i- -1048576|0;I=(d&2097151)<<11|b>>>21;ra=I+Pa|0;d=(d>>21)+La|0;La=ra;I=I>>>0>ra>>>0?d+1|0:d;b=b&-2097152;Ma=i-b|0;Na=c-((b>>>0>i>>>0)+C|0)|0;b=f&-2097152;Oa=n-b|0;ra=g-((b>>>0>n>>>0)+ja|0)|0;b=Ai(sa,Fa,654183,0);c=j&-2097152;d=b+(y-c|0)|0;e=W+(l-((c>>>0>y>>>0)+Ga|0)|0)|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(H,Ha,-997805,-1);c=b+d|0;d=W+e|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(la,Ia,136657,0);c=b+c|0;d=W+d|0;Ga=c;b=b>>>0>c>>>0?d+1|0:d;c=o&-2097152;ja=oa-c|0;y=q-((c>>>0>oa>>>0)+Sa|0)|0;c=Ai(Da,Ca,-997805,-1);d=W;e=c;c=Ai(ta,Ea,654183,0);f=e+c|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(va,ua,136657,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(za,wa,-683901,-1);f=c+f|0;d=W+d|0;e=s+(c>>>0>f>>>0?d+1|0:d)|0;d=f+na|0;e=d>>>0>>0?e+1|0:e;c=u&-2097152;o=d-c|0;u=e-((c>>>0>d>>>0)+Ra|0)|0;c=Ai(Da,Ca,654183,0);d=W;e=c;c=Ai(ta,Ea,470296,0);f=e+c|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(va,ua,-997805,-1);f=c+f|0;d=W+e|0;e=B+(c>>>0>f>>>0?d+1|0:d)|0;c=f+ma|0;e=c>>>0>>0?e+1|0:e;d=c;c=Ai(za,wa,136657,0);f=d+c|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(xa,ya,-683901,-1);e=c+f|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=r&-2097152;j=e-c|0;g=f-((c>>>0>e>>>0)+Qa|0)|0;c=Ai(M,h,E,0);d=W;e=c;c=Ai(P,0,fa,h);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(O,h,Q,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(V,ia,T,0);e=c+e|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=Ai(N,0,U,h);d=c+e|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(X,0,S,h);d=c+d|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(R,0,Z,h);f=c+d|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(_,0,$,A);e=c+f|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(aa,h,D,0);e=c+e|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=Ai(Y,0,ba,h);d=c+e|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(da,h,F,0);d=c+d|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(ea,h,ca,0);f=c+d|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=(K&2097151)<<11|qa>>>21;s=c+f|0;d=(K>>>21|0)+d|0;d=c>>>0>s>>>0?d+1|0:d;n=d;c=d-((s>>>0<4293918720)-1|0)|0;ma=c;e=c>>>21|0;i=s- -1048576|0;c=(c&2097151)<<11|i>>>21;q=c+j|0;e=e+g|0;e=c>>>0>q>>>0?e+1|0:e;l=e;c=e-((q>>>0<4293918720)-1|0)|0;C=c;e=c>>21;j=q- -1048576|0;c=(c&2097151)<<11|j>>>21;o=c+o|0;d=e+u|0;d=c>>>0>o>>>0?d+1|0:d;g=d;d=d-((o>>>0<4293918720)-1|0)|0;r=d;e=d>>21;c=o- -1048576|0;f=(d&2097151)<<11|c>>>21;d=f+ja|0;e=e+y|0;e=d>>>0>>0?e+1|0:e;y=e;qa=d;e=Ai(d,e,-683901,-1);f=e+Ga|0;d=W+b|0;u=f;b=e>>>0>f>>>0?d+1|0:d;d=Ai(sa,Fa,470296,0);e=k&-2097152;k=d+(ha-e|0)|0;f=W+(m-((e>>>0>ha>>>0)+Ka|0)|0)|0;f=d>>>0>k>>>0?f+1|0:f;d=Ai(H,Ha,654183,0);k=d+k|0;e=W+f|0;e=d>>>0>k>>>0?e+1|0:e;f=Ai(la,Ia,-997805,-1);k=f+k|0;d=W+e|0;d=f>>>0>k>>>0?d+1|0:d;e=c&-2097152;c=o-e|0;K=c;g=g-((e>>>0>o>>>0)+r|0)|0;A=g;f=Ai(qa,y,136657,0);k=f+k|0;e=W+d|0;c=Ai(c,g,-683901,-1);m=c+k|0;f=W+(f>>>0>k>>>0?e+1|0:e)|0;f=c>>>0>m>>>0?f+1|0:f;g=f;e=f-((m>>>0<4293918720)-1|0)|0;B=e;c=m- -1048576|0;f=(e&2097151)<<11|c>>>21;k=f+u|0;e=(e>>21)+b|0;e=f>>>0>k>>>0?e+1|0:e;f=e-((k>>>0<4293918720)-1|0)|0;r=f;b=k- -1048576|0;o=(f&2097151)<<11|b>>>21;u=o+Oa|0;f=(f>>21)+ra|0;D=u;u=o>>>0>u>>>0?f+1|0:f;b=b&-2097152;E=k-b|0;F=e-((b>>>0>k>>>0)+r|0)|0;b=c&-2097152;na=m-b|0;oa=g-((b>>>0>m>>>0)+B|0)|0;b=Ai(sa,Fa,666643,0);c=t&-2097152;d=b+(ka-c|0)|0;e=W+(v-((c>>>0>ka>>>0)+Ja|0)|0)|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(H,Ha,470296,0);c=b+d|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(la,Ia,654183,0);c=b+c|0;e=W+f|0;k=c;b=b>>>0>c>>>0?e+1|0:e;c=j&-2097152;j=q-c|0;g=l-((c>>>0>q>>>0)+C|0)|0;c=Ai(Da,Ca,470296,0);d=W;e=c;c=Ai(ta,Ea,666643,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(va,ua,654183,0);e=c+e|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=Ai(za,wa,-997805,-1);d=c+e|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(xa,ya,136657,0);f=c+d|0;e=W+e|0;d=n+(c>>>0>f>>>0?e+1|0:e)|0;c=f+s|0;d=c>>>0>>0?d+1|0:d;e=c;c=Ai(Ba,Aa,-683901,-1);f=e+c|0;d=W+d|0;d=c>>>0>f>>>0?d+1|0:d;c=(pa&2097151)<<11|ga>>>21;e=i&-2097152;r=c+(f-e|0)|0;e=(d-((e>>>0>f>>>0)+ma|0)|0)+(pa>>21)|0;e=c>>>0>r>>>0?e+1|0:e;q=e;c=e-((r>>>0<4293918720)-1|0)|0;C=c;d=c>>21;o=r- -1048576|0;f=(c&2097151)<<11|o>>>21;c=f+j|0;e=d+g|0;e=c>>>0>>0?e+1|0:e;pa=e;B=c;c=Ai(c,e,-683901,-1);d=c+k|0;f=W+b|0;f=c>>>0>d>>>0?f+1|0:f;b=Ai(qa,y,-997805,-1);c=b+d|0;e=W+f|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(K,A,136657,0);c=b+c|0;d=W+e|0;ga=c;j=b>>>0>c>>>0?d+1|0:d;b=p&-2097152;i=J-b|0;l=x-((b>>>0>J>>>0)+Ta|0)|0;b=Ai(M,h,Y,0);c=W;d=b;b=Ai(P,0,aa,h);d=d+b|0;e=W+c|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(Q,0,da,h);c=b+d|0;e=W+e|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(U,h,ca,0);c=b+c|0;d=W+e|0;e=c;b=b>>>0>e>>>0?d+1|0:d;c=Ai(M,h,aa,h);d=W;f=c;c=Ai(P,0,ca,0);g=f+c|0;f=W+d|0;f=c>>>0>g>>>0?f+1|0:f;c=Ai(U,h,da,h);g=c+g|0;d=W+f|0;d=c>>>0>g>>>0?d+1|0:d;c=d;d=d-((g>>>0<4293918720)-1|0)|0;sa=d;f=d>>>21|0;v=g- -1048576|0;d=(d&2097151)<<11|v>>>21;s=d+e|0;e=b+f|0;e=d>>>0>s>>>0?e+1|0:e;t=e;b=e-((s>>>0<4293918720)-1|0)|0;ka=b;f=b>>>21|0;m=s- -1048576|0;b=(b&2097151)<<11|m>>>21;e=b+i|0;d=f+l|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(H,Ha,666643,0);f=b+e|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(la,Ia,470296,0);d=b+f|0;e=W+e|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(B,pa,136657,0);f=b+d|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(qa,y,654183,0);e=b+f|0;f=W+d|0;f=b>>>0>e>>>0?f+1|0:f;b=Ai(K,A,-997805,-1);k=b+e|0;d=W+f|0;d=b>>>0>k>>>0?d+1|0:d;n=d;b=d-((k>>>0<4293918720)-1|0)|0;ha=b;f=b>>21;i=k- -1048576|0;d=(b&2097151)<<11|i>>>21;b=d+ga|0;e=f+j|0;e=b>>>0>>0?e+1|0:e;d=e-((b>>>0<4293918720)-1|0)|0;ga=d;l=b- -1048576|0;j=(d&2097151)<<11|l>>>21;p=j+na|0;d=(d>>21)+oa|0;ja=p;x=j>>>0>p>>>0?d+1|0:d;j=b;f=e;d=o&-2097152;o=(L&2097151)<<11|G>>>21;b=(r-d|0)+o|0;e=(q-((d>>>0>r>>>0)+C|0)|0)+(L>>21)|0;e=b>>>0>>0?e+1|0:e;p=e;e=e-((b>>>0<4293918720)-1|0)|0;ma=e;d=e>>21;r=d;q=b- -1048576|0;H=(e&2097151)<<11|q>>>21;e=Ai(H,d,-683901,-1);j=e+j|0;d=W+f|0;d=e>>>0>j>>>0?d+1|0:d;e=l&-2097152;na=j-e|0;oa=d-((e>>>0>j>>>0)+ga|0)|0;d=Ai(H,r,136657,0);f=d+k|0;e=W+n|0;e=d>>>0>f>>>0?e+1|0:e;d=i&-2097152;C=f-d|0;ga=e-((d>>>0>f>>>0)+ha|0)|0;d=Ai(la,Ia,666643,0);e=m&-2097152;f=d+(s-e|0)|0;e=W+(t-((e>>>0>s>>>0)+ka|0)|0)|0;e=d>>>0>f>>>0?e+1|0:e;d=Ai(B,pa,-997805,-1);j=d+f|0;f=W+e|0;f=d>>>0>j>>>0?f+1|0:f;e=Ai(qa,y,470296,0);j=e+j|0;d=W+f|0;d=e>>>0>j>>>0?d+1|0:d;f=Ai(K,A,654183,0);j=f+j|0;e=W+d|0;L=j;n=f>>>0>j>>>0?e+1|0:e;j=g;g=c;c=Ai(P,0,da,h);d=W;e=c;c=Ai(M,h,ca,0);f=e+c|0;d=W+d|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(M,h,da,h);e=W;J=e;s=c;t=c- -1048576|0;c=e-((c>>>0<4293918720)-1|0)|0;ka=c;e=c>>>21|0;c=(c&2097151)<<11|t>>>21;o=c+f|0;f=e+d|0;f=c>>>0>o>>>0?f+1|0:f;m=f;c=f-((o>>>0<4293918720)-1|0)|0;ha=c;e=c>>>21|0;k=o- -1048576|0;c=(c&2097151)<<11|k>>>21;f=c+j|0;d=e+g|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(B,pa,654183,0);e=v&-2097152;g=c+(f-e|0)|0;f=W+(d-((sa&8191)+(e>>>0>f>>>0)|0)|0)|0;f=c>>>0>g>>>0?f+1|0:f;c=Ai(qa,y,666643,0);d=c+g|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(K,A,470296,0);i=c+d|0;d=W+e|0;d=c>>>0>i>>>0?d+1|0:d;l=d;c=d-((i>>>0<4293918720)-1|0)|0;G=c;e=c>>21;j=i- -1048576|0;c=(c&2097151)<<11|j>>>21;g=c+L|0;e=e+n|0;e=c>>>0>g>>>0?e+1|0:e;f=e;d=e-((g>>>0<4293918720)-1|0)|0;v=d;c=g- -1048576|0;n=(d&2097151)<<11|c>>>21;L=n+C|0;d=(d>>21)+ga|0;y=L;n=n>>>0>y>>>0?d+1|0:d;e=Ai(H,r,-997805,-1);g=e+g|0;d=W+f|0;c=c&-2097152;qa=g-c|0;ga=(e>>>0>g>>>0?d+1|0:d)-((c>>>0>g>>>0)+v|0)|0;c=Ai(H,r,654183,0);d=c+i|0;f=W+l|0;f=c>>>0>d>>>0?f+1|0:f;c=j&-2097152;L=d-c|0;G=f-((c>>>0>d>>>0)+G|0)|0;c=Ai(B,pa,470296,0);d=k&-2097152;f=c+(o-d|0)|0;e=W+(m-((ha&8191)+(d>>>0>o>>>0)|0)|0)|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(K,A,666643,0);d=c+f|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;g=d;c=Ai(B,pa,666643,0);d=t&-2097152;k=c+(s-d|0)|0;f=W+(J-((ka&2047)+(d>>>0>s>>>0)|0)|0)|0;f=c>>>0>k>>>0?f+1|0:f;i=f;c=f-((k>>>0<4293918720)-1|0)|0;v=c;d=c>>21;l=k- -1048576|0;c=(c&2097151)<<11|l>>>21;j=c+g|0;e=e+d|0;e=c>>>0>j>>>0?e+1|0:e;c=e-((j>>>0<4293918720)-1|0)|0;t=c;d=c>>21;g=j- -1048576|0;c=(c&2097151)<<11|g>>>21;m=c+L|0;f=d+G|0;c=c>>>0>m>>>0?f+1|0:f;d=Ai(H,r,470296,0);f=d+j|0;e=W+e|0;e=d>>>0>f>>>0?e+1|0:e;d=g&-2097152;g=f-d|0;j=e-((d>>>0>f>>>0)+t|0)|0;d=Ai(H,r,666643,0);e=l&-2097152;o=d+(k-e|0)|0;f=W+(i-((e>>>0>k>>>0)+v|0)|0)|0;f=d>>>0>o>>>0?f+1|0:f;e=f>>21;f=(f&2097151)<<11|o>>>21;g=f+g|0;d=e+j|0;d=f>>>0>g>>>0?d+1|0:d;f=d>>21;d=(d&2097151)<<11|g>>>21;j=d+m|0;e=c+f|0;c=j;e=c>>>0>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|c>>>21;v=e+qa|0;d=d+ga|0;d=e>>>0>v>>>0?d+1|0:d;e=d>>21;d=(d&2097151)<<11|v>>>21;t=d+y|0;e=e+n|0;e=d>>>0>t>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|t>>>21;m=e+na|0;f=d+oa|0;f=e>>>0>m>>>0?f+1|0:f;e=f>>21;f=(f&2097151)<<11|m>>>21;k=f+ja|0;d=e+x|0;d=f>>>0>k>>>0?d+1|0:d;f=d>>21;d=(d&2097151)<<11|k>>>21;n=d+E|0;e=f+F|0;e=d>>>0>n>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|n>>>21;i=e+D|0;d=d+u|0;d=e>>>0>i>>>0?d+1|0:d;e=d>>21;d=(d&2097151)<<11|i>>>21;l=d+Ma|0;e=e+Na|0;e=d>>>0>l>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|l>>>21;j=e+La|0;f=d+I|0;d=q&-2097152;x=b-d|0;f=e>>>0>j>>>0?f+1|0:f;q=x+((f&2097151)<<11|j>>>21)|0;e=(p-((b>>>0>>0)+ma|0)|0)+(f>>21)|0;e=q>>>0>>0?e+1|0:e;x=(e&2097151)<<11|q>>>21;d=e>>21;p=d;b=Ai(x,d,666643,0);d=o&2097151;b=b+d|0;f=W;w[a|0]=b;f=b>>>0>>0?f+1|0:f;w[a+1|0]=(f&255)<<24|b>>>8;d=g&2097151;g=Ai(x,p,470296,0)+d|0;e=W;e=d>>>0>g>>>0?e+1|0:e;o=(f&2097151)<<11|b>>>21;g=o+g|0;e=(f>>21)+e|0;e=g>>>0>>0?e+1|0:e;w[a+4|0]=(e&2047)<<21|g>>>11;w[a+3|0]=(e&7)<<29|g>>>3;w[a+2|0]=((f&65535)<<16|b>>>16)&31|g<<5;b=c&2097151;c=Ai(x,p,654183,0)+b|0;f=W;f=b>>>0>c>>>0?f+1|0:f;b=e;e=e>>21;b=(b&2097151)<<11|g>>>21;c=b+c|0;d=e+f|0;d=b>>>0>c>>>0?d+1|0:d;b=d;w[a+6|0]=(d&63)<<26|c>>>6;w[a+5|0]=c<<2|(g&1572864)>>>19;e=v&2097151;f=Ai(x,p,-997805,-1)+e|0;d=W;d=e>>>0>f>>>0?d+1|0:d;e=b>>21;g=f;f=(b&2097151)<<11|c>>>21;b=g+f|0;e=e+d|0;e=b>>>0>>0?e+1|0:e;w[a+9|0]=(e&511)<<23|b>>>9;w[a+8|0]=(e&1)<<31|b>>>1;w[a+7|0]=b<<7|(c&2080768)>>>14;c=t&2097151;d=Ai(x,p,136657,0)+c|0;f=W;f=c>>>0>d>>>0?f+1|0:f;c=e;e=e>>21;g=(c&2097151)<<11|b>>>21;c=g+d|0;d=e+f|0;d=c>>>0>>0?d+1|0:d;w[a+12|0]=(d&4095)<<20|c>>>12;w[a+11|0]=(d&15)<<28|c>>>4;w[a+10|0]=c<<4|(b&1966080)>>>17;b=m&2097151;f=Ai(x,p,-683901,-1)+b|0;e=W;e=b>>>0>f>>>0?e+1|0:e;b=d;d=d>>21;g=f;f=(b&2097151)<<11|c>>>21;b=g+f|0;d=e+d|0;d=b>>>0>>0?d+1|0:d;w[a+14|0]=(d&127)<<25|b>>>7;w[a+13|0]=b<<1|(c&1048576)>>>20;e=d>>21;d=(d&2097151)<<11|b>>>21;c=d+(k&2097151)|0;e=c>>>0>>0?e+1|0:e;w[a+17|0]=(e&1023)<<22|c>>>10;w[a+16|0]=(e&3)<<30|c>>>2;w[a+15|0]=c<<6|(b&2064384)>>>15;b=e;e=e>>21;d=(b&2097151)<<11|c>>>21;b=d+(n&2097151)|0;f=b>>>0>>0?e+1|0:e;w[a+20|0]=(f&8191)<<19|b>>>13;w[a+19|0]=(f&31)<<27|b>>>5;g=(f&2097151)<<11|b>>>21;e=g+(i&2097151)|0;d=f>>21;d=e>>>0>>0?d+1|0:d;g=e;w[a+21|0]=e;w[a+18|0]=b<<3|(c&1835008)>>>18;w[a+22|0]=(d&255)<<24|e>>>8;c=(d&2097151)<<11|e>>>21;b=c+(l&2097151)|0;e=d>>21;e=b>>>0>>0?e+1|0:e;w[a+25|0]=(e&2047)<<21|b>>>11;w[a+24|0]=(e&7)<<29|b>>>3;w[a+23|0]=((d&65535)<<16|g>>>16)&31|b<<5;d=(e&2097151)<<11|b>>>21;c=d+(j&2097151)|0;e=e>>21;e=c>>>0>>0?e+1|0:e;w[a+27|0]=(e&63)<<26|c>>>6;w[a+26|0]=c<<2|(b&1572864)>>>19;b=e;e=e>>21;g=(b&2097151)<<11|c>>>21;f=q&2097151;b=g+f|0;d=e;d=b>>>0>>0?d+1|0:d;w[a+31|0]=(d&131071)<<15|b>>>17;w[a+30|0]=(d&511)<<23|b>>>9;w[a+28|0]=b<<7|(c&2080768)>>>14;w[a+29|0]=g+q>>>1;}function Xb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0;while(1){e=i<<3;g=e+c|0;e=b+e|0;f=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);u=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);l=f<<24|(f&65280)<<8;h=f&16711680;p=h<<24;h=h>>>8|0;j=f&-16777216;e=j>>>24|0;y[g>>2]=p|j<<8|(((u&255)<<24|f>>>8)&-16777216|((u&16777215)<<8|f>>>24)&16711680|(u>>>8&65280|u>>>24));e=e|h|l;y[g+4>>2]=e;i=i+1|0;if((i|0)!=16){continue}break}b=y[a+60>>2];y[d+56>>2]=y[a+56>>2];y[d+60>>2]=b;b=y[a+52>>2];y[d+48>>2]=y[a+48>>2];y[d+52>>2]=b;b=y[a+44>>2];y[d+40>>2]=y[a+40>>2];y[d+44>>2]=b;b=y[a+36>>2];y[d+32>>2]=y[a+32>>2];y[d+36>>2]=b;b=y[a+28>>2];y[d+24>>2]=y[a+24>>2];y[d+28>>2]=b;b=y[a+20>>2];y[d+16>>2]=y[a+16>>2];y[d+20>>2]=b;b=y[a+12>>2];y[d+8>>2]=y[a+8>>2];y[d+12>>2]=b;b=y[a+4>>2];y[d>>2]=y[a>>2];y[d+4>>2]=b;while(1){g=y[d+56>>2];h=y[d+60>>2];B=K<<3;u=B+c|0;b=u;e=y[b>>2];b=y[b+4>>2];f=y[d+36>>2];s=f;m=y[d+32>>2];f=Ci(m,f,50);i=W;f=Ci(m,s,46)^f;i=W^i;f=Ci(m,s,23)^f;e=f+e|0;b=(W^i)+b|0;b=e>>>0>>0?b+1|0:b;f=B+38512|0;i=y[f>>2];e=i+e|0;b=y[f+4>>2]+b|0;b=e>>>0>>0?b+1|0:b;p=y[d+48>>2];w=y[d+40>>2];i=(p^w)&m^p;f=i+e|0;r=y[d+52>>2];n=y[d+44>>2];e=((r^n)&s^r)+b|0;b=(f>>>0>>0?e+1|0:e)+h|0;g=f+g|0;b=g>>>0>>0?b+1|0:b;f=y[d+24>>2];i=f+g|0;e=y[d+28>>2]+b|0;e=f>>>0>i>>>0?e+1|0:e;x=e;y[d+24>>2]=i;y[d+28>>2]=e;e=y[d+4>>2];v=e;f=y[d>>2];e=Ci(f,e,36);h=W;e=Ci(f,v,30)^e;h=W^h;j=g+(Ci(f,v,25)^e)|0;e=b+(W^h)|0;e=g>>>0>j>>>0?e+1|0:e;b=j;h=y[d+16>>2];g=y[d+8>>2];j=f&(h|g)|g&h;l=b+j|0;b=e;e=y[d+20>>2];k=y[d+12>>2];b=b+(v&(e|k)|e&k)|0;b=j>>>0>l>>>0?b+1|0:b;j=b;y[d+56>>2]=l;y[d+60>>2]=b;o=h;q=e;t=B|8;C=t+c|0;b=C;A=y[b>>2];F=y[b+4>>2];h=(m^w)&i^w;b=h+p|0;e=((s^n)&x^n)+r|0;e=b>>>0>>0?e+1|0:e;h=Ci(i,x,50);p=W;h=Ci(i,x,46)^h;p=W^p;r=Ci(i,x,23)^h;h=r+b|0;b=(W^p)+e|0;b=(h>>>0>>0?b+1|0:b)+F|0;e=h+A|0;b=e>>>0>>0?b+1|0:b;h=e;e=t+38512|0;p=y[e>>2];h=h+p|0;e=y[e+4>>2]+b|0;b=h>>>0

>>0?e+1|0:e;e=b+q|0;p=h+o|0;e=p>>>0>>0?e+1|0:e;r=e;y[d+16>>2]=p;y[d+20>>2]=e;b=b+((k|v)&j|k&v)|0;e=h+((f|g)&l|f&g)|0;b=e>>>0>>0?b+1|0:b;h=Ci(l,j,36);o=W;h=Ci(l,j,30)^h;o=W^o;q=e;e=Ci(l,j,25)^h;h=q+e|0;b=(W^o)+b|0;b=e>>>0>h>>>0?b+1|0:b;o=b;y[d+48>>2]=h;y[d+52>>2]=b;q=g;t=k;g=B|16;e=g+c|0;k=y[e>>2];b=k+w|0;e=y[e+4>>2]+n|0;e=b>>>0>>0?e+1|0:e;n=b;b=g+38512|0;k=y[b>>2];g=n+k|0;b=y[b+4>>2]+e|0;b=g>>>0>>0?b+1|0:b;e=g;g=(i^m)&p^m;e=e+g|0;b=((s^x)&r^s)+b|0;b=e>>>0>>0?b+1|0:b;g=Ci(p,r,50);k=W;g=Ci(p,r,46)^g;k=W^k;w=Ci(p,r,23)^g;g=w+e|0;e=(W^k)+b|0;k=g;w=g>>>0>>0?e+1|0:e;e=w+t|0;g=g+q|0;e=k>>>0>g>>>0?e+1|0:e;t=e;y[d+8>>2]=g;y[d+12>>2]=e;b=Ci(h,o,36);e=W;b=Ci(h,o,30)^b;e=W^e;n=Ci(h,o,25)^b;q=n+((f|l)&h|f&l)|0;b=((j|v)&o|j&v)+(W^e)|0;e=w+(q>>>0>>0?b+1|0:b)|0;w=k+q|0;e=w>>>0>>0?e+1|0:e;k=e;y[d+40>>2]=w;y[d+44>>2]=e;q=f;e=m;f=B|24;b=f+c|0;m=y[b>>2];e=e+m|0;b=y[b+4>>2]+s|0;b=e>>>0>>0?b+1|0:b;n=e;e=f+38512|0;m=y[e>>2];f=n+m|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=i^(i^p)&g;b=b+f|0;e=(x^(r^x)&t)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(g,t,50);m=W;f=Ci(g,t,46)^f;m=W^m;s=Ci(g,t,23)^f;f=s+b|0;b=(W^m)+e|0;b=f>>>0>>0?b+1|0:b;e=b+v|0;v=f+q|0;e=v>>>0>>0?e+1|0:e;s=e;y[d>>2]=v;y[d+4>>2]=e;e=Ci(w,k,36);m=W;e=Ci(w,k,30)^e;q=W^m;n=Ci(w,k,25)^e;m=n+((h|l)&w|h&l)|0;e=((j|o)&k|j&o)+(W^q)|0;b=b+(m>>>0>>0?e+1|0:e)|0;q=f+m|0;b=q>>>0>>0?b+1|0:b;m=b;y[d+32>>2]=q;y[d+36>>2]=b;b=B|32;e=b+c|0;f=y[e>>2];e=x+y[e+4>>2]|0;f=f+i|0;e=f>>>0>>0?e+1|0:e;b=b+38512|0;i=y[b>>2];f=i+f|0;b=y[b+4>>2]+e|0;b=f>>>0>>0?b+1|0:b;e=f;f=p^(g^p)&v;e=e+f|0;b=(r^(r^t)&s)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(v,s,50);i=W;f=Ci(v,s,46)^f;i=W^i;x=Ci(v,s,23)^f;f=x+e|0;e=(W^i)+b|0;e=f>>>0>>0?e+1|0:e;n=e;b=e;e=Ci(q,m,36);i=W;e=Ci(q,m,30)^e;x=W^i;A=Ci(q,m,25)^e;i=A+((h|w)&q|h&w)|0;e=((o|k)&m|o&k)+(W^x)|0;b=(i>>>0>>0?e+1|0:e)+b|0;x=f+i|0;b=x>>>0>>0?b+1|0:b;i=b;y[d+24>>2]=x;y[d+28>>2]=b;e=j+n|0;j=f+l|0;e=j>>>0>>0?e+1|0:e;n=e;y[d+56>>2]=j;y[d+60>>2]=e;e=B|40;b=e+c|0;f=y[b>>2];b=r+y[b+4>>2]|0;f=f+p|0;b=f>>>0

>>0?b+1|0:b;e=e+38512|0;l=y[e>>2];f=l+f|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=g^(g^v)&j;b=b+f|0;e=(t^(s^t)&n)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(j,n,50);l=W;f=Ci(j,n,46)^f;l=W^l;p=Ci(j,n,23)^f;f=p+b|0;b=(W^l)+e|0;b=f>>>0

>>0?b+1|0:b;e=Ci(x,i,36);l=W;e=Ci(x,i,30)^e;p=W^l;r=Ci(x,i,25)^e;l=r+((q|w)&x|q&w)|0;e=((k|m)&i|k&m)+(W^p)|0;e=(l>>>0>>0?e+1|0:e)+b|0;p=f+l|0;e=p>>>0>>0?e+1|0:e;l=e;y[d+16>>2]=p;y[d+20>>2]=e;b=b+o|0;e=h;h=f+h|0;b=e>>>0>h>>>0?b+1|0:b;r=b;y[d+48>>2]=h;y[d+52>>2]=b;b=B|48;e=b+c|0;f=y[e>>2];e=t+y[e+4>>2]|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;b=b+38512|0;g=y[b>>2];f=g+f|0;b=y[b+4>>2]+e|0;b=f>>>0>>0?b+1|0:b;e=f;f=v^(j^v)&h;e=e+f|0;b=(s^(s^n)&r)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(h,r,50);g=W;f=Ci(h,r,46)^f;g=W^g;o=Ci(h,r,23)^f;f=o+e|0;e=(W^g)+b|0;e=f>>>0>>0?e+1|0:e;t=e;b=e;e=Ci(p,l,36);g=W;e=Ci(p,l,30)^e;o=W^g;A=Ci(p,l,25)^e;g=A+((q|x)&p|q&x)|0;e=((i|m)&l|i&m)+(W^o)|0;b=(g>>>0>>0?e+1|0:e)+b|0;e=g;g=f+g|0;b=e>>>0>g>>>0?b+1|0:b;o=b;y[d+8>>2]=g;y[d+12>>2]=b;e=k+t|0;A=f+w|0;e=A>>>0>>0?e+1|0:e;t=e;y[d+40>>2]=A;y[d+44>>2]=e;e=B|56;b=e+c|0;f=y[b>>2];b=s+y[b+4>>2]|0;f=f+v|0;b=f>>>0>>0?b+1|0:b;e=e+38512|0;k=y[e>>2];f=k+f|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=j^(h^j)&A;b=b+f|0;e=(n^(r^n)&t)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(A,t,50);k=W;f=Ci(A,t,46)^f;k=W^k;w=Ci(A,t,23)^f;f=w+b|0;b=(W^k)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(g,o,36);k=W;e=Ci(g,o,30)^e;w=W^k;v=Ci(g,o,25)^e;k=v+((p|x)&g|p&x)|0;e=((i|l)&o|i&l)+(W^w)|0;e=(k>>>0>>0?e+1|0:e)+b|0;w=f+k|0;e=w>>>0>>0?e+1|0:e;k=e;y[d>>2]=w;y[d+4>>2]=e;b=b+m|0;v=f+q|0;b=v>>>0>>0?b+1|0:b;s=b;y[d+32>>2]=v;y[d+36>>2]=b;b=B|64;e=b+c|0;f=y[e>>2];e=n+y[e+4>>2]|0;f=f+j|0;e=f>>>0>>0?e+1|0:e;b=b+38512|0;j=y[b>>2];f=j+f|0;b=y[b+4>>2]+e|0;b=f>>>0>>0?b+1|0:b;e=f;f=h^(h^A)&v;e=e+f|0;b=(r^(r^t)&s)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(v,s,50);j=W;f=Ci(v,s,46)^f;j=W^j;m=Ci(v,s,23)^f;f=m+e|0;e=(W^j)+b|0;e=f>>>0>>0?e+1|0:e;q=e;b=e;e=Ci(w,k,36);j=W;e=Ci(w,k,30)^e;m=W^j;n=Ci(w,k,25)^e;j=n+((g|p)&w|g&p)|0;e=((l|o)&k|l&o)+(W^m)|0;b=(j>>>0>>0?e+1|0:e)+b|0;m=f+j|0;b=m>>>0>>0?b+1|0:b;j=b;y[d+56>>2]=m;y[d+60>>2]=b;e=i+q|0;i=f+x|0;e=i>>>0>>0?e+1|0:e;n=e;y[d+24>>2]=i;y[d+28>>2]=e;e=B|72;F=e+c|0;b=F;f=y[b>>2];b=r+y[b+4>>2]|0;f=f+h|0;b=f>>>0>>0?b+1|0:b;e=e+38512|0;h=y[e>>2];f=h+f|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=A^(v^A)&i;b=b+f|0;e=(t^(s^t)&n)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(i,n,50);h=W;f=Ci(i,n,46)^f;h=W^h;q=Ci(i,n,23)^f;f=q+b|0;b=(W^h)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(m,j,36);h=W;e=Ci(m,j,30)^e;q=W^h;x=Ci(m,j,25)^e;h=x+((g|w)&m|g&w)|0;e=((o|k)&j|o&k)+(W^q)|0;e=(h>>>0>>0?e+1|0:e)+b|0;q=f+h|0;e=q>>>0>>0?e+1|0:e;h=e;y[d+48>>2]=q;y[d+52>>2]=e;b=b+l|0;l=f+p|0;b=l>>>0>>0?b+1|0:b;r=b;y[d+16>>2]=l;y[d+20>>2]=b;f=B|80;Q=f+c|0;e=Q;p=y[e>>2];b=p+A|0;e=y[e+4>>2]+t|0;e=b>>>0

>>0?e+1|0:e;t=b;b=f+38512|0;p=y[b>>2];f=t+p|0;b=y[b+4>>2]+e|0;b=f>>>0

>>0?b+1|0:b;e=f;f=v^(i^v)&l;e=e+f|0;b=(s^(s^n)&r)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(l,r,50);p=W;f=Ci(l,r,46)^f;p=W^p;x=Ci(l,r,23)^f;f=x+e|0;e=(W^p)+b|0;e=f>>>0>>0?e+1|0:e;t=e;b=e;e=Ci(q,h,36);p=W;e=Ci(q,h,30)^e;x=W^p;A=Ci(q,h,25)^e;p=A+((m|w)&q|m&w)|0;e=((j|k)&h|j&k)+(W^x)|0;b=(p>>>0>>0?e+1|0:e)+b|0;x=f+p|0;b=x>>>0

>>0?b+1|0:b;p=b;y[d+40>>2]=x;y[d+44>>2]=b;e=o+t|0;o=f+g|0;e=o>>>0>>0?e+1|0:e;t=e;y[d+8>>2]=o;y[d+12>>2]=e;b=B|88;e=b+38512|0;R=b+c|0;b=R;g=y[b>>2];f=y[e>>2]+g|0;b=y[e+4>>2]+y[b+4>>2]|0;e=s+(f>>>0>>0?b+1|0:b)|0;b=f+v|0;e=b>>>0>>0?e+1|0:e;f=i^(i^l)&o;b=f+b|0;e=(n^(r^n)&t)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(o,t,50);g=W;f=Ci(o,t,46)^f;g=W^g;v=Ci(o,t,23)^f;f=v+b|0;b=(W^g)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(x,p,36);g=W;e=Ci(x,p,30)^e;v=W^g;s=Ci(x,p,25)^e;g=s+((m|q)&x|m&q)|0;e=((h|j)&p|h&j)+(W^v)|0;e=(g>>>0>>0?e+1|0:e)+b|0;s=g;g=f+g|0;e=s>>>0>g>>>0?e+1|0:e;v=e;y[d+32>>2]=g;y[d+36>>2]=e;b=b+k|0;k=f+w|0;b=k>>>0>>0?b+1|0:b;w=b;y[d>>2]=k;y[d+4>>2]=b;b=B|96;e=b+38512|0;S=b+c|0;b=S;s=y[b>>2];f=y[e>>2]+s|0;e=y[e+4>>2]+y[b+4>>2]|0;b=n+(f>>>0>>0?e+1|0:e)|0;e=f+i|0;b=e>>>0>>0?b+1|0:b;i=l^(l^o)&k;f=i+e|0;e=(r^(r^t)&w)+b|0;e=f>>>0>>0?e+1|0:e;b=Ci(k,w,50);i=W;b=Ci(k,w,46)^b;i=W^i;n=f;f=Ci(k,w,23)^b;b=n+f|0;e=(W^i)+e|0;e=b>>>0>>0?e+1|0:e;n=e;f=b;b=Ci(g,v,36);i=W;b=Ci(g,v,30)^b;s=W^i;A=Ci(g,v,25)^b;i=A+((q|x)&g|q&x)|0;b=((h|p)&v|h&p)+(W^s)|0;e=(i>>>0>>0?b+1|0:b)+e|0;s=f+i|0;e=s>>>0>>0?e+1|0:e;i=e;y[d+24>>2]=s;y[d+28>>2]=e;e=j+n|0;m=f+m|0;e=m>>>0>>0?e+1|0:e;j=e;y[d+56>>2]=m;y[d+60>>2]=e;b=B|104;e=b+38512|0;T=b+c|0;b=T;n=y[b>>2];f=y[e>>2]+n|0;b=y[e+4>>2]+y[b+4>>2]|0;e=r+(f>>>0>>0?b+1|0:b)|0;b=f+l|0;e=b>>>0>>0?e+1|0:e;l=o^(o^k)&m;f=l+b|0;b=(t^(t^w)&j)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(m,j,50);l=W;e=Ci(m,j,46)^e;l=W^l;r=Ci(m,j,23)^e;f=r+f|0;e=(W^l)+b|0;e=f>>>0>>0?e+1|0:e;n=e;b=e;e=Ci(s,i,36);l=W;e=Ci(s,i,30)^e;r=W^l;A=Ci(s,i,25)^e;l=A+((g|x)&s|g&x)|0;e=((p|v)&i|p&v)+(W^r)|0;b=(l>>>0>>0?e+1|0:e)+b|0;r=f+l|0;b=r>>>0>>0?b+1|0:b;l=b;y[d+16>>2]=r;y[d+20>>2]=b;b=h+n|0;q=f+q|0;b=q>>>0>>0?b+1|0:b;h=b;y[d+48>>2]=q;y[d+52>>2]=b;b=B|112;e=b+38512|0;A=b+c|0;f=A;n=y[f>>2];b=y[e>>2]+n|0;e=y[e+4>>2]+y[f+4>>2]|0;e=t+(b>>>0>>0?e+1|0:e)|0;b=b+o|0;e=b>>>0>>0?e+1|0:e;f=k^(k^m)&q;b=f+b|0;e=(w^(j^w)&h)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(q,h,50);o=W;f=Ci(q,h,46)^f;o=W^o;t=Ci(q,h,23)^f;f=t+b|0;b=(W^o)+e|0;b=f>>>0>>0?b+1|0:b;n=b;e=b;b=Ci(r,l,36);o=W;b=Ci(r,l,30)^b;t=W^o;G=Ci(r,l,25)^b;o=G+((g|s)&r|g&s)|0;b=((i|v)&l|i&v)+(W^t)|0;e=(o>>>0>>0?b+1|0:b)+e|0;t=f+o|0;e=t>>>0>>0?e+1|0:e;o=e;y[d+8>>2]=t;y[d+12>>2]=e;e=p+n|0;p=f+x|0;e=p>>>0>>0?e+1|0:e;f=e;y[d+40>>2]=p;y[d+44>>2]=e;b=B|120;e=b+38512|0;U=b+c|0;b=U;n=y[b>>2];x=y[e>>2]+n|0;e=y[e+4>>2]+y[b+4>>2]|0;b=w+(n>>>0>x>>>0?e+1|0:e)|0;e=k+x|0;b=(j^(h^j)&f)+(e>>>0>>0?b+1|0:b)|0;h=Ci(p,f,50);j=W;h=Ci(p,f,46)^h;j=W^j;k=m^(m^q)&p;e=k+e|0;h=Ci(p,f,23)^h;f=e+h|0;e=(W^j)+(e>>>0>>0?b+1|0:b)|0;e=f>>>0>>0?e+1|0:e;h=f;j=e;b=e;e=Ci(t,o,36);p=W;e=Ci(t,o,30)^e;k=W^p;w=Ci(t,o,25)^e;p=w+((r|s)&t|r&s)|0;e=((i|l)&o|i&l)+(W^k)|0;b=(p>>>0>>0?e+1|0:e)+b|0;f=f+p|0;b=f>>>0

>>0?b+1|0:b;y[d>>2]=f;y[d+4>>2]=b;e=j+v|0;k=g;g=g+h|0;e=k>>>0>g>>>0?e+1|0:e;y[d+32>>2]=g;y[d+36>>2]=e;if((K|0)!=64){K=K+16|0;h=(K<<3)+c|0;g=y[u>>2];i=y[u+4>>2];b=y[F>>2];V=b;e=y[F+4>>2];X=e;f=y[A+4>>2];w=f;F=y[A>>2];f=Ci(F,f,45);j=W;l=((w&63)<<26|F>>>6)^(Ci(F,w,3)^f);f=l+b|0;b=(W^j^w>>>6)+e|0;e=(f>>>0>>0?b+1|0:b)+i|0;b=f+g|0;e=b>>>0>>0?e+1|0:e;f=y[C+4>>2];g=f;j=y[C>>2];f=Ci(j,f,63);i=W;l=((g&127)<<25|j>>>7)^(Ci(j,g,56)^f);f=l+b|0;e=(W^i^g>>>7)+e|0;x=f;y[h>>2]=f;e=f>>>0>>0?e+1|0:e;y[h+4>>2]=e;b=y[u+20>>2];l=b;k=y[u+16>>2];h=b;H=y[u+88>>2];b=y[u+92>>2];G=b;i=b;p=e;b=Ci(f,e,45);v=W;n=Ci(f,e,3)^b;b=e;e=e>>>6|0;m=n^((b&63)<<26|f>>>6);f=m+H|0;b=(e^(W^v))+i|0;e=(f>>>0>>0?b+1|0:b)+h|0;b=f+k|0;e=b>>>0>>0?e+1|0:e;f=y[u+28>>2];h=f;i=y[u+24>>2];f=Ci(i,f,63);o=W;f=((h&127)<<25|i>>>7)^(Ci(i,h,56)^f);m=f+b|0;b=(W^o^h>>>7)+e|0;b=f>>>0>m>>>0?b+1|0:b;o=b;y[u+144>>2]=m;y[u+148>>2]=b;r=y[u+80>>2];b=r+j|0;I=y[u+84>>2];e=I+g|0;v=y[u+120>>2];f=y[u+124>>2];g=Ci(v,f,45);j=W;q=((f&63)<<26|v>>>6)^(Ci(v,f,3)^g);g=q+b|0;e=(W^j^f>>>6)+(b>>>0>>0?e+1|0:e)|0;b=g>>>0>>0?e+1|0:e;e=Ci(k,l,63);j=W;n=g;g=((l&127)<<25|k>>>7)^(Ci(k,l,56)^e);t=n+g|0;b=(W^j^l>>>7)+b|0;b=g>>>0>t>>>0?b+1|0:b;l=b;y[u+136>>2]=t;y[u+140>>2]=b;b=y[u+36>>2];q=b;n=y[u+32>>2];k=n;L=y[u+104>>2];e=y[u+108>>2];M=e;g=e;e=Ci(m,o,45);j=W;e=Ci(m,o,3)^e;s=W^j;A=((o&63)<<26|m>>>6)^e;j=A+L|0;e=(o>>>6^s)+g|0;b=(j>>>0>>0?e+1|0:e)+b|0;e=j+k|0;b=e>>>0>>0?b+1|0:b;g=y[u+44>>2];j=g;k=y[u+40>>2];g=Ci(k,g,63);s=W;g=Ci(k,j,56)^g;A=W^s;g=((j&127)<<25|k>>>7)^g;s=g+e|0;e=(j>>>7^A)+b|0;e=g>>>0>s>>>0?e+1|0:e;g=e;y[u+160>>2]=s;y[u+164>>2]=e;N=y[u+96>>2];b=y[u+100>>2];O=b;e=b;b=Ci(t,l,45);A=W;b=Ci(t,l,3)^b;B=W^A;C=((l&63)<<26|t>>>6)^b;A=C+N|0;e=(l>>>6^B)+e|0;b=(A>>>0>>0?e+1|0:e)+h|0;e=i+A|0;b=e>>>0>>0?b+1|0:b;h=Ci(n,q,63);i=W;h=((q&127)<<25|n>>>7)^(Ci(n,q,56)^h);n=h+e|0;e=(W^i^q>>>7)+b|0;e=h>>>0>n>>>0?e+1|0:e;h=e;y[u+152>>2]=n;y[u+156>>2]=e;b=y[u+52>>2];B=b;C=y[u+48>>2];q=C;e=b;b=Ci(s,g,45);i=W;b=Ci(s,g,3)^b;A=W^i;D=((g&63)<<26|s>>>6)^b;i=D+v|0;b=(g>>>6^A)+f|0;e=(i>>>0>>0?b+1|0:b)+e|0;b=i+q|0;e=b>>>0>>0?e+1|0:e;i=y[u+60>>2];D=i;q=y[u+56>>2];i=Ci(q,i,63);A=W;i=Ci(q,D,56)^i;J=W^A;i=((D&127)<<25|q>>>7)^i;A=i+b|0;e=(D>>>7^J)+e|0;e=i>>>0>A>>>0?e+1|0:e;i=e;y[u+176>>2]=A;y[u+180>>2]=e;P=y[u+112>>2];b=y[u+116>>2];J=b;e=Ci(n,h,45);E=W;e=Ci(n,h,3)^e;Y=W^E;e=((h&63)<<26|n>>>6)^e;E=e+P|0;b=(h>>>6^Y)+b|0;e=(e>>>0>E>>>0?b+1|0:b)+j|0;b=k+E|0;e=b>>>0>>0?e+1|0:e;j=Ci(C,B,63);k=W;E=b;b=B>>>7|0;j=((B&127)<<25|C>>>7)^(Ci(C,B,56)^j);B=E+j|0;e=(b^(W^k))+e|0;e=j>>>0>B>>>0?e+1|0:e;j=e;y[u+168>>2]=B;y[u+172>>2]=e;e=p+D|0;k=q+x|0;b=k>>>0>>0?e+1|0:e;e=Ci(B,j,45);q=W;C=((j&63)<<26|B>>>6)^(Ci(B,j,3)^e);k=C+k|0;b=(W^q^j>>>6)+b|0;b=k>>>0>>0?b+1|0:b;e=u- -64|0;C=y[e>>2];e=y[e+4>>2];D=e;e=Ci(C,e,63);q=W;e=Ci(C,D,56)^e;E=W^q;q=k;k=((D&127)<<25|C>>>7)^e;q=q+k|0;b=(D>>>7^E)+b|0;b=k>>>0>q>>>0?b+1|0:b;k=b;y[u+184>>2]=q;y[u+188>>2]=b;e=l+D|0;b=t+C|0;e=b>>>0>>0?e+1|0:e;l=Ci(A,i,45);t=W;l=Ci(A,i,3)^l;C=W^t;l=((i&63)<<26|A>>>6)^l;t=l+b|0;b=(i>>>6^C)+e|0;C=l>>>0>t>>>0?b+1|0:b;b=y[u+72>>2];e=y[u+76>>2];l=Ci(b,e,63);D=W;E=Ci(b,e,56)^l;l=e;e=e>>>7|0;b=E^((l&127)<<25|b>>>7);t=b+t|0;e=(e^(W^D))+C|0;e=b>>>0>t>>>0?e+1|0:e;l=e;y[u+192>>2]=t;y[u+196>>2]=e;b=Ci(r,I,63);e=W;C=((I&127)<<25|r>>>7)^(Ci(r,I,56)^b);r=C+V|0;e=(W^e^I>>>7)+X|0;b=o+(r>>>0>>0?e+1|0:e)|0;e=m+r|0;b=e>>>0>>0?b+1|0:b;o=Ci(q,k,45);m=W;o=Ci(q,k,3)^o;r=W^m;o=((k&63)<<26|q>>>6)^o;m=o+e|0;e=(k>>>6^r)+b|0;e=o>>>0>m>>>0?e+1|0:e;o=e;y[u+200>>2]=m;y[u+204>>2]=e;C=y[Q>>2];e=y[Q+4>>2];b=Ci(H,G,63);r=W;b=Ci(H,G,56)^b;I=W^r;r=n;n=((G&127)<<25|H>>>7)^b;r=r+n|0;b=(G>>>7^I)+h|0;e=(r>>>0>>0?b+1|0:b)+e|0;b=r+C|0;e=b>>>0>>0?e+1|0:e;h=Ci(t,l,45);r=W;h=Ci(t,l,3)^h;n=W^r;h=((l&63)<<26|t>>>6)^h;r=h+b|0;e=(l>>>6^n)+e|0;e=h>>>0>r>>>0?e+1|0:e;h=e;y[u+208>>2]=r;y[u+212>>2]=e;n=y[R>>2];C=y[R+4>>2];b=Ci(N,O,63);e=W;H=((O&127)<<25|N>>>7)^(Ci(N,O,56)^b);s=H+s|0;b=(W^e^O>>>7)+g|0;e=(s>>>0>>0?b+1|0:b)+C|0;b=s+n|0;e=b>>>0>>0?e+1|0:e;g=Ci(m,o,45);s=W;n=b;b=o>>>6|0;g=((o&63)<<26|m>>>6)^(Ci(m,o,3)^g);o=n+g|0;e=(b^(W^s))+e|0;e=g>>>0>o>>>0?e+1|0:e;g=e;y[u+216>>2]=o;y[u+220>>2]=e;s=y[S>>2];b=y[S+4>>2];e=Ci(L,M,63);m=W;e=Ci(L,M,56)^e;n=W^m;D=B;B=((M&127)<<25|L>>>7)^e;m=D+B|0;e=(M>>>7^n)+j|0;b=(m>>>0>>0?e+1|0:e)+b|0;e=m+s|0;b=e>>>0>>0?b+1|0:b;j=Ci(r,h,45);m=W;n=e;e=h>>>6|0;h=((h&63)<<26|r>>>6)^(Ci(r,h,3)^j);j=n+h|0;e=(e^(W^m))+b|0;e=h>>>0>j>>>0?e+1|0:e;h=e;y[u+224>>2]=j;y[u+228>>2]=e;r=y[T>>2];s=y[T+4>>2];b=Ci(P,J,63);e=W;n=((J&127)<<25|P>>>7)^(Ci(P,J,56)^b);m=n+A|0;e=(W^e^J>>>7)+i|0;b=(m>>>0>>0?e+1|0:e)+s|0;e=m+r|0;b=e>>>0>>0?b+1|0:b;i=Ci(o,g,45);m=W;n=e;e=g>>>6|0;g=((g&63)<<26|o>>>6)^(Ci(o,g,3)^i);i=n+g|0;e=(e^(W^m))+b|0;e=g>>>0>i>>>0?e+1|0:e;g=e;y[u+232>>2]=i;y[u+236>>2]=e;b=Ci(v,f,63);e=W;n=Ci(v,f,56)^b;b=f>>>7|0;o=n^((f&127)<<25|v>>>7);f=o+F|0;b=(b^(W^e))+w|0;e=k+(f>>>0>>0?b+1|0:b)|0;b=f+q|0;e=b>>>0>>0?e+1|0:e;f=Ci(j,h,45);o=W;k=b;b=h>>>6|0;h=((h&63)<<26|j>>>6)^(Ci(j,h,3)^f);f=k+h|0;e=(b^(W^o))+e|0;y[u+240>>2]=f;y[u+244>>2]=f>>>0>>0?e+1|0:e;h=y[U>>2];j=y[U+4>>2];b=Ci(x,p,63);e=W;b=Ci(x,p,56)^b;o=W^e;e=p>>>7|0;p=((p&127)<<25|x>>>7)^b;f=p+t|0;b=(e^o)+l|0;e=(f>>>0

>>0?b+1|0:b)+j|0;b=f+h|0;e=b>>>0>>0?e+1|0:e;f=Ci(i,g,45);h=W;k=b;b=g>>>6|0;g=((g&63)<<26|i>>>6)^(Ci(i,g,3)^f);f=k+g|0;e=(b^(W^h))+e|0;y[u+248>>2]=f;y[u+252>>2]=f>>>0>>0?e+1|0:e;continue}break}e=b+y[a+4>>2]|0;b=f+y[a>>2]|0;e=b>>>0>>0?e+1|0:e;y[a>>2]=b;y[a+4>>2]=e;b=y[a+12>>2]+y[d+12>>2]|0;e=y[d+8>>2];c=e+y[a+8>>2]|0;y[a+8>>2]=c;y[a+12>>2]=c>>>0>>0?b+1|0:b;e=y[a+20>>2]+y[d+20>>2]|0;c=y[d+16>>2];b=c+y[a+16>>2]|0;y[a+16>>2]=b;y[a+20>>2]=b>>>0>>0?e+1|0:e;e=y[a+28>>2]+y[d+28>>2]|0;c=y[d+24>>2];b=c+y[a+24>>2]|0;y[a+24>>2]=b;y[a+28>>2]=b>>>0>>0?e+1|0:e;b=y[a+36>>2]+y[d+36>>2]|0;e=y[d+32>>2];c=e+y[a+32>>2]|0;y[a+32>>2]=c;y[a+36>>2]=c>>>0>>0?b+1|0:b;e=y[a+44>>2]+y[d+44>>2]|0;c=y[d+40>>2];b=c+y[a+40>>2]|0;y[a+40>>2]=b;y[a+44>>2]=b>>>0>>0?e+1|0:e;b=y[a+52>>2]+y[d+52>>2]|0;e=y[d+48>>2];c=e+y[a+48>>2]|0;y[a+48>>2]=c;y[a+52>>2]=c>>>0>>0?b+1|0:b;e=y[a+60>>2]+y[d+60>>2]|0;c=y[d+56>>2];b=c+y[a+56>>2]|0;y[a+56>>2]=b;y[a+60>>2]=b>>>0>>0?e+1|0:e;}function Pb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0;B=T-4096|0;T=B;a:{if(!a){break a}b:{c:{f=y[a+36>>2];d:{if((f|0)!=2){ja=y[a+4>>2];g=z[b+8|0];ca=y[b>>2];break d}ja=y[a+4>>2];ca=y[b>>2];g=z[b+8|0];if(ca|g>>>0>=2){break c}ca=0;}o(B+3072|0,0,1024);o(B+2104|0,0,968);y[B+2048>>2]=ca;y[B+2052>>2]=0;K=y[b+4>>2];y[B+2064>>2]=g&255;y[B+2068>>2]=0;y[B+2056>>2]=K;y[B+2060>>2]=0;y[B+2072>>2]=y[a+16>>2];y[B+2076>>2]=0;K=y[a+8>>2];y[B+2088>>2]=f;y[B+2092>>2]=0;y[B+2080>>2]=K;y[B+2084>>2]=0;if(!y[a+20>>2]){break b}K=0;while(1){f=p&127;if(!f){R=R+1|0;K=R?K:K+1|0;y[B+2096>>2]=R;y[B+2100>>2]=K;o(B,0,1024);s=B+1024|0;o(s,0,1024);d=B+3072|0;oc(d,B+2048|0,B);oc(d,B,s);}f=(B+1024|0)+(f<<3)|0;s=y[f+4>>2];d=(p<<3)+ja|0;y[d>>2]=y[f>>2];y[d+4>>2]=s;s=y[a+20>>2];p=p+1|0;if(s>>>0>p>>>0){continue}break}break b}s=y[a+20>>2];la=1;}fa=g&255;f=fa|ca;K=f?0:2;if(K>>>0>=s>>>0){break a}ma=!f;f=y[a+24>>2];ia=y[b+4>>2];R=(E(f,ia)+K|0)+E(s,fa)|0;p=R+((R>>>0)%(f>>>0)|0?-1:f-1|0)|0;na=fa+1|0;while(1){g=y[a+28>>2];f=y[a+24>>2];ka=((R>>>0)%(f>>>0)|0)==1?R-1|0:p;p=la?y[y[a>>2]+4>>2]+(ka<<10)|0:(K<<3)+ja|0;d=y[p>>2];p=y[p+4>>2];y[b+12>>2]=K;g=ma?ia:(p>>>0)%(g>>>0)|0;e:{if(!ca){if(!fa){p=K-1|0;c=0;break e}p=E(s,fa);if((g|0)==(ia|0)){p=(p+K|0)-1|0;c=0;break e}p=p-!K|0;c=0;break e}p=f+((g|0)==(ia|0)?(s^-1)+K|0:(K?0:-1)-s|0)|0;c=0;if((fa|0)==3){break e}c=E(s,na);}s=c;k=y[y[a>>2]+4>>2];j=k+(E(f,g)<<10)|0;g=p-1|0;c=g+s|0;e=g>>>0>c>>>0;Ai(d,0,d,0);Ai(p,0,W,0);p=W;g=c-p|0;s=0;m=0;f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p=e-(c>>>0

>>0)|0;if(p){if(!f){break o}break n}U=g-E((g>>>0)/(f>>>0)|0,f)|0;V=0;W=0;break f}if(!g){break m}break l}d=f-1|0;if(!(d&f)){break k}d=(H(f)+33|0)-H(p)|0;h=0-d|0;break i}U=0;V=p;W=0;break f}s=32-H(p)|0;if(s>>>0<31){break j}break h}U=d&g;V=0;if((f|0)==1){break g}g=zi(f);f=g&31;if((g&63)>>>0>=32){d=p>>>f|0;}else {s=p>>>f|0;d=0;}W=s;break f}d=s+1|0;h=63-s|0;}s=d&63;c=s&31;if(s>>>0>=32){s=0;e=p>>>c|0;}else {s=p>>>c|0;e=((1<>>c;}h=h&63;c=h&31;if(h>>>0>=32){p=g<>>32-c|p<>>31;s=e<<1|p>>>31;c=i-(n+(s>>>0>h>>>0)|0)>>31;G=c&f;e=s-G|0;s=n-(s>>>0>>0)|0;p=p<<1|g>>>31;g=m|g<<1;m=c&1;d=d-1|0;if(d){continue}break}}U=e;V=s;W=p<<1|g>>>31;break f}U=g;V=p;p=0;}W=p;}W=V;p=(U<<10)+j|0;f=k+(ka<<10)|0;s=k+(R<<10)|0;p:{if(ca){oc(f,p,s);break p}t(B+3072|0,p,1024);g=0;while(1){p=g<<3;d=B+3072|0;c=p+d|0;e=y[c>>2];k=f+p|0;m=y[k>>2];k=y[c+4>>2]^y[k+4>>2];y[c>>2]=e^m;y[c+4>>2]=k;e=p|8;c=e+d|0;k=y[c>>2];e=f+e|0;m=y[e>>2];e=y[c+4>>2]^y[e+4>>2];y[c>>2]=k^m;y[c+4>>2]=e;e=p|16;c=e+d|0;k=y[c>>2];e=f+e|0;m=y[e>>2];e=y[c+4>>2]^y[e+4>>2];y[c>>2]=k^m;y[c+4>>2]=e;c=p|24;p=c+d|0;e=y[p>>2];c=c+f|0;k=y[c>>2];c=y[p+4>>2]^y[c+4>>2];y[p>>2]=e^k;y[p+4>>2]=c;g=g+4|0;if((g|0)!=128){continue}break}t(B+2048|0,d,1024);p=0;g=0;while(1){f=(B+3072|0)+(g<<7)|0;k=y[f+56>>2];c=y[f+24>>2];e=k+c|0;n=y[f+60>>2];d=y[f+28>>2];m=n+d|0;j=Ai(c<<1&-2,(d<<1|c>>>31)&1,k,0);d=j+e|0;c=W+(c>>>0>e>>>0?m+1|0:m)|0;m=d>>>0>>0?c+1|0:c;j=Ci(d^y[f+120>>2],m^y[f+124>>2],32);c=y[f+88>>2];h=j+c|0;u=W;e=y[f+92>>2];i=u+e|0;G=Ai(j,0,c<<1&-2,(e<<1|c>>>31)&1);e=G+h|0;c=W+(c>>>0>h>>>0?i+1|0:i)|0;M=e>>>0>>0?c+1|0:c;F=Ci(k^e,n^M,40);ga=W;c=m+ga|0;i=c+1|0;l=c;c=d+F|0;k=c>>>0>>0?i:l;d=Ai(F,0,d<<1&-2,(m<<1|d>>>31)&1);G=d+c|0;c=W+k|0;X=d>>>0>G>>>0?c+1|0:c;u=Ci(G^j,u^X,48);l=W;C=l;r=y[f+44>>2];d=y[f+12>>2];k=r+d|0;m=y[f+40>>2];c=y[f+8>>2];j=m+c|0;h=Ai(c<<1&-2,(d<<1|c>>>31)&1,m,0);d=j+h|0;c=W+(c>>>0>j>>>0?k+1|0:k)|0;h=d>>>0>>0?c+1|0:c;i=Ci(d^y[f+104>>2],h^y[f+108>>2],32);k=y[f+72>>2];j=i+k|0;v=W;c=y[f+76>>2];n=v+c|0;q=Ai(i,0,k<<1&-2,(c<<1|k>>>31)&1);c=q+j|0;A=m^c;k=W+(k>>>0>j>>>0?n+1|0:n)|0;m=c>>>0>>0?k+1|0:k;j=Ci(A,r^m,40);n=W;k=h+n|0;r=k+1|0;q=k;k=d+j|0;r=k>>>0>>0?r:q;d=Ai(j,0,d<<1&-2,(h<<1|d>>>31)&1);k=d+k|0;h=W+r|0;Y=d>>>0>k>>>0?h+1|0:h;r=Ci(k^i,v^Y,48);ha=W;d=m+ha|0;q=d+1|0;i=d;d=c+r|0;h=d>>>0>>0?q:i;c=Ai(r,0,c<<1&-2,(m<<1|c>>>31)&1);m=d+c|0;d=W+h|0;_=c>>>0>m>>>0?d+1|0:d;v=Ci(j^m,n^_,1);A=W;da=A;D=y[f+36>>2];d=y[f+4>>2];j=D+d|0;h=y[f+32>>2];c=y[f>>2];i=h+c|0;n=Ai(c<<1&-2,(d<<1|c>>>31)&1,h,0);d=i+n|0;c=W+(c>>>0>i>>>0?j+1|0:j)|0;i=d>>>0>>0?c+1|0:c;Q=Ci(d^y[f+96>>2],i^y[f+100>>2],32);S=f- -64|0;j=S;c=y[j>>2];n=Q+c|0;aa=W;j=y[j+4>>2];q=aa+j|0;N=Ai(Q,0,c<<1&-2,(j<<1|c>>>31)&1);j=N+n|0;c=W+(c>>>0>n>>>0?q+1|0:q)|0;N=j>>>0>>0?c+1|0:c;q=Ci(h^j,D^N,40);ba=W;c=i+ba|0;n=c+1|0;h=c;c=d+q|0;h=c>>>0>>0?n:h;i=Ai(q,0,d<<1&-2,(i<<1|d>>>31)&1);d=c+i|0;c=W+h|0;Z=d>>>0>>0?c+1|0:c;c=Z+A|0;h=c+1|0;i=c;c=d+v|0;i=c>>>0>>0?h:i;n=Ai(v,0,d<<1&-2,(Z<<1|d>>>31)&1);h=c+n|0;c=W+i|0;J=h>>>0>>0?c+1|0:c;l=Ci(h^u,J^l,32);O=W;w=y[f+52>>2];c=y[f+20>>2];n=w+c|0;A=y[f+48>>2];i=y[f+16>>2];D=A+i|0;I=Ai(i<<1&-2,(c<<1|i>>>31)&1,A,0);c=D+I|0;i=W+(i>>>0>D>>>0?n+1|0:n)|0;D=c>>>0>>0?i+1|0:i;I=Ci(c^y[f+112>>2],D^y[f+116>>2],32);n=y[f+80>>2];P=I+n|0;ea=W;i=y[f+84>>2];L=ea+i|0;x=Ai(I,0,n<<1&-2,(i<<1|n>>>31)&1);i=x+P|0;n=W+(n>>>0>P>>>0?L+1|0:L)|0;P=i>>>0>>0?n+1|0:n;A=Ci(A^i,w^P,40);w=W;n=D+w|0;x=n+1|0;L=n;n=c+A|0;L=n>>>0>>0?x:L;c=Ai(A,0,c<<1&-2,(D<<1|c>>>31)&1);n=c+n|0;x=n^I;D=W+L|0;I=c>>>0>n>>>0?D+1|0:D;D=Ci(x,ea^I,48);ea=W;c=P+ea|0;x=c+1|0;L=c;c=i+D|0;L=c>>>0>>0?x:L;i=Ai(D,0,i<<1&-2,(P<<1|i>>>31)&1);c=i+c|0;P=W+L|0;P=c>>>0>>0?P+1|0:P;i=P+O|0;x=i+1|0;L=i;i=c+l|0;L=i>>>0>>0?x:L;x=Ai(l,0,c<<1&-2,(P<<1|c>>>31)&1);i=x+i|0;$=v^i;v=W+L|0;L=i>>>0>>0?v+1|0:v;v=Ci($,da^L,40);da=W;x=J+da|0;oa=x+1|0;$=x;x=h+v|0;$=x>>>0>>0?oa:$;J=Ai(v,0,h<<1&-2,(J<<1|h>>>31)&1);h=J+x|0;y[f>>2]=h;x=W+$|0;J=h>>>0>>0?x+1|0:x;y[f+4>>2]=J;h=Ci(h^l,J^O,48);y[f+120>>2]=h;l=W;y[f+124>>2]=l;l=l+L|0;$=l+1|0;x=l;l=h+i|0;J=l>>>0>>0?$:x;i=Ai(h,0,i<<1&-2,(L<<1|i>>>31)&1);h=i+l|0;y[f+80>>2]=h;l=W+J|0;i=h>>>0>>0?l+1|0:l;y[f+84>>2]=i;pa=f,qa=Ci(h^v,i^da,1),y[pa+40>>2]=qa;y[f+44>>2]=W;h=Ci(c^A,w^P,1);A=W;c=Y+A|0;i=c+1|0;l=c;c=h+k|0;i=c>>>0>>0?i:l;v=Ai(h,0,k<<1&-2,(Y<<1|k>>>31)&1);c=c+v|0;k=W+i|0;i=Ci(d^Q,Z^aa,48);v=c>>>0>>0?k+1|0:k;Y=W;k=Ci(i^c,v^Y,32);l=W;Q=l;d=M+C|0;w=d+1|0;C=d;d=e+u|0;Z=d>>>0>>0?w:C;e=Ai(u,0,e<<1&-2,(M<<1|e>>>31)&1);d=e+d|0;u=W+Z|0;u=d>>>0>>0?u+1|0:u;e=u+l|0;C=e+1|0;l=e;e=d+k|0;l=e>>>0>>0?C:l;M=Ai(k,0,d<<1&-2,(u<<1|d>>>31)&1);e=M+e|0;C=h^e;h=W+l|0;l=e>>>0>>0?h+1|0:h;h=Ci(C,A^l,40);A=W;M=v+A|0;w=M+1|0;C=M;M=c+h|0;Z=M>>>0>>0?w:C;v=Ai(h,0,c<<1&-2,(v<<1|c>>>31)&1);c=v+M|0;C=k^c;k=W+Z|0;v=c>>>0>>0?k+1|0:k;k=Ci(C,Q^v,48);y[f+96>>2]=k;M=W;y[f+100>>2]=M;y[f+8>>2]=c;y[f+12>>2]=v;c=l+M|0;w=c+1|0;C=c;c=e+k|0;v=c>>>0>>0?w:C;e=Ai(k,0,e<<1&-2,(l<<1|e>>>31)&1);c=e+c|0;y[f+88>>2]=c;k=W+v|0;e=c>>>0>>0?k+1|0:k;y[f+92>>2]=e;pa=f,qa=Ci(c^h,e^A,1),y[pa+48>>2]=qa;y[f+52>>2]=W;k=Ci(d^F,u^ga,1);F=W;d=I+F|0;e=d+1|0;c=d;d=k+n|0;e=d>>>0>>0?e:c;h=Ai(k,0,n<<1&-2,(I<<1|n>>>31)&1);c=d+h|0;d=W+e|0;n=c>>>0>>0?d+1|0:d;h=Ci(c^r,ha^n,32);e=W;u=e;d=N+Y|0;l=d+1|0;e=d;d=i+j|0;r=d>>>0>>0?l:e;j=Ai(i,0,j<<1&-2,(N<<1|j>>>31)&1);d=j+d|0;e=W+r|0;j=d>>>0>>0?e+1|0:e;e=u+j|0;i=e+1|0;l=e;e=d+h|0;i=e>>>0>>0?i:l;r=Ai(h,0,d<<1&-2,(j<<1|d>>>31)&1);e=e+r|0;l=k^e;k=W+i|0;i=e>>>0>>0?k+1|0:k;k=Ci(l,F^i,40);F=W;r=n+F|0;C=r+1|0;l=r;r=c+k|0;v=r>>>0>>0?C:l;n=Ai(k,0,c<<1&-2,(n<<1|c>>>31)&1);c=n+r|0;l=h^c;h=W+v|0;n=c>>>0>>0?h+1|0:h;h=Ci(l,u^n,48);y[f+104>>2]=h;u=W;y[f+108>>2]=u;y[f+16>>2]=c;y[f+20>>2]=n;c=i+u|0;n=c+1|0;l=c;c=e+h|0;n=c>>>0>>0?n:l;e=Ai(h,0,e<<1&-2,(i<<1|e>>>31)&1);c=e+c|0;y[S>>2]=c;h=W+n|0;e=c>>>0>>0?h+1|0:h;y[S+4>>2]=e;pa=f,qa=Ci(c^k,e^F,1),y[pa+56>>2]=qa;y[f+60>>2]=W;e=Ci(d^q,j^ba,1);c=e+G|0;h=W;k=h+X|0;j=Ai(G<<1&-2,(X<<1|G>>>31)&1,e,0);d=j+c|0;c=W+(c>>>0>>0?k+1|0:k)|0;j=d>>>0>>0?c+1|0:c;k=Ci(d^D,ea^j,32);i=W;c=_+i|0;q=c+1|0;l=c;c=k+m|0;n=c>>>0>>0?q:l;m=Ai(k,0,m<<1&-2,(_<<1|m>>>31)&1);c=c+m|0;l=e^c;e=W+n|0;m=c>>>0>>0?e+1|0:e;e=Ci(l,h^m,40);h=W;n=j+h|0;q=n+1|0;l=n;n=d+e|0;G=n>>>0>>0?q:l;j=Ai(e,0,d<<1&-2,(j<<1|d>>>31)&1);d=j+n|0;l=k^d;k=W+G|0;j=d>>>0>>0?k+1|0:k;k=Ci(l,i^j,48);y[f+112>>2]=k;i=W;y[f+116>>2]=i;y[f+24>>2]=d;y[f+28>>2]=j;d=i+m|0;i=d+1|0;l=d;d=c+k|0;j=d>>>0>>0?i:l;c=Ai(k,0,c<<1&-2,(m<<1|c>>>31)&1);d=c+d|0;y[f+72>>2]=d;k=W+j|0;c=d>>>0>>0?k+1|0:k;y[f+76>>2]=c;pa=f,qa=Ci(d^e,c^h,1),y[pa+32>>2]=qa;y[f+36>>2]=W;g=g+1|0;if((g|0)!=8){continue}break}while(1){f=(B+3072|0)+(p<<4)|0;e=y[f+392>>2];d=y[f+136>>2];c=e+d|0;i=y[f+396>>2];g=y[f+140>>2];k=i+g|0;m=Ai(d<<1&-2,(g<<1|d>>>31)&1,e,0);g=m+c|0;d=W+(d>>>0>c>>>0?k+1|0:k)|0;k=g>>>0>>0?d+1|0:d;m=Ci(g^y[f+904>>2],k^y[f+908>>2],32);d=y[f+648>>2];j=m+d|0;F=W;c=y[f+652>>2];h=F+c|0;n=Ai(m,0,d<<1&-2,(c<<1|d>>>31)&1);c=n+j|0;d=W+(d>>>0>j>>>0?h+1|0:h)|0;D=c>>>0>>0?d+1|0:d;G=Ci(e^c,i^D,40);P=W;d=k+P|0;l=d+1|0;e=d;d=g+G|0;e=d>>>0>>0?l:e;g=Ai(G,0,g<<1&-2,(k<<1|g>>>31)&1);n=g+d|0;d=W+e|0;M=g>>>0>n>>>0?d+1|0:d;F=Ci(n^m,F^M,48);q=W;L=q;u=y[f+268>>2];g=y[f+12>>2];e=u+g|0;k=y[f+264>>2];d=y[f+8>>2];m=k+d|0;j=Ai(d<<1&-2,(g<<1|d>>>31)&1,k,0);g=m+j|0;d=W+(d>>>0>m>>>0?e+1|0:e)|0;j=g>>>0>>0?d+1|0:d;h=Ci(g^y[f+776>>2],j^y[f+780>>2],32);e=y[f+520>>2];m=h+e|0;r=W;d=y[f+524>>2];i=r+d|0;v=Ai(h,0,e<<1&-2,(d<<1|e>>>31)&1);d=v+m|0;l=k^d;e=W+(e>>>0>m>>>0?i+1|0:i)|0;k=d>>>0>>0?e+1|0:e;m=Ci(l,u^k,40);i=W;e=j+i|0;u=e+1|0;l=e;e=g+m|0;u=e>>>0>>0?u:l;g=Ai(m,0,g<<1&-2,(j<<1|g>>>31)&1);e=g+e|0;j=W+u|0;X=e>>>0>>0?j+1|0:j;u=Ci(e^h,r^X,48);ga=W;g=k+ga|0;h=g+1|0;l=g;g=d+u|0;j=g>>>0>>0?h:l;d=Ai(u,0,d<<1&-2,(k<<1|d>>>31)&1);k=g+d|0;g=W+j|0;Y=d>>>0>k>>>0?g+1|0:g;r=Ci(m^k,i^Y,1);l=W;C=l;A=y[f+260>>2];g=y[f+4>>2];m=A+g|0;j=y[f+256>>2];d=y[f>>2];h=j+d|0;i=Ai(d<<1&-2,(g<<1|d>>>31)&1,j,0);g=h+i|0;d=W+(d>>>0>h>>>0?m+1|0:m)|0;h=g>>>0>>0?d+1|0:d;_=Ci(g^y[f+768>>2],h^y[f+772>>2],32);d=y[f+512>>2];i=_+d|0;ha=W;m=y[f+516>>2];v=ha+m|0;Q=Ai(_,0,d<<1&-2,(m<<1|d>>>31)&1);m=Q+i|0;d=W+(d>>>0>i>>>0?v+1|0:v)|0;Q=m>>>0>>0?d+1|0:d;v=Ci(j^m,A^Q,40);da=W;d=h+da|0;j=d+1|0;i=d;d=g+v|0;j=d>>>0>>0?j:i;h=Ai(v,0,g<<1&-2,(h<<1|g>>>31)&1);g=d+h|0;d=W+j|0;S=g>>>0>>0?d+1|0:d;d=S+l|0;i=d+1|0;l=d;d=g+r|0;h=d>>>0>>0?i:l;i=Ai(r,0,g<<1&-2,(S<<1|g>>>31)&1);j=d+i|0;d=W+h|0;N=i>>>0>j>>>0?d+1|0:d;q=Ci(j^F,N^q,32);Z=W;aa=y[f+388>>2];d=y[f+132>>2];i=aa+d|0;l=y[f+384>>2];h=y[f+128>>2];A=l+h|0;J=Ai(h<<1&-2,(d<<1|h>>>31)&1,l,0);d=A+J|0;h=W+(h>>>0>A>>>0?i+1|0:i)|0;A=d>>>0>>0?h+1|0:h;J=Ci(d^y[f+896>>2],A^y[f+900>>2],32);i=y[f+640>>2];O=J+i|0;ba=W;h=y[f+644>>2];I=ba+h|0;w=Ai(J,0,i<<1&-2,(h<<1|i>>>31)&1);h=w+O|0;i=W+(i>>>0>O>>>0?I+1|0:I)|0;O=h>>>0>>0?i+1|0:i;l=Ci(l^h,aa^O,40);aa=W;i=A+aa|0;x=i+1|0;w=i;i=d+l|0;I=i>>>0>>0?x:w;d=Ai(l,0,d<<1&-2,(A<<1|d>>>31)&1);i=d+i|0;w=i^J;A=W+I|0;J=d>>>0>i>>>0?A+1|0:A;A=Ci(w,ba^J,48);ba=W;d=O+ba|0;x=d+1|0;w=d;d=h+A|0;I=d>>>0>>0?x:w;h=Ai(A,0,h<<1&-2,(O<<1|h>>>31)&1);d=h+d|0;O=W+I|0;O=d>>>0>>0?O+1|0:O;h=O+Z|0;x=h+1|0;w=h;h=d+q|0;I=h>>>0>>0?x:w;w=Ai(q,0,d<<1&-2,(O<<1|d>>>31)&1);h=w+h|0;x=r^h;r=W+I|0;I=h>>>0>>0?r+1|0:r;r=Ci(x,C^I,40);C=W;w=N+C|0;$=w+1|0;x=w;w=j+r|0;ea=w>>>0>>0?$:x;N=Ai(r,0,j<<1&-2,(N<<1|j>>>31)&1);j=N+w|0;y[f>>2]=j;w=W+ea|0;N=j>>>0>>0?w+1|0:w;y[f+4>>2]=N;j=Ci(j^q,N^Z,48);y[f+904>>2]=j;q=W;y[f+908>>2]=q;q=q+I|0;x=q+1|0;w=q;q=h+j|0;N=q>>>0>>0?x:w;h=Ai(j,0,h<<1&-2,(I<<1|h>>>31)&1);j=h+q|0;y[f+640>>2]=j;q=W+N|0;h=h>>>0>j>>>0?q+1|0:q;y[f+644>>2]=h;pa=f,qa=Ci(j^r,h^C,1),y[pa+264>>2]=qa;y[f+268>>2]=W;j=Ci(d^l,O^aa,1);l=W;d=X+l|0;h=d+1|0;q=d;d=e+j|0;h=d>>>0>>0?h:q;r=Ai(j,0,e<<1&-2,(X<<1|e>>>31)&1);d=d+r|0;e=W+h|0;h=Ci(g^_,S^ha,48);r=d>>>0>>0?e+1|0:e;X=W;e=Ci(h^d,r^X,32);q=W;_=q;g=D+L|0;w=g+1|0;C=g;g=c+F|0;S=g>>>0>>0?w:C;c=Ai(F,0,c<<1&-2,(D<<1|c>>>31)&1);g=c+g|0;F=W+S|0;F=c>>>0>g>>>0?F+1|0:F;c=F+q|0;C=c+1|0;q=c;c=e+g|0;q=c>>>0>>0?C:q;D=Ai(e,0,g<<1&-2,(F<<1|g>>>31)&1);c=D+c|0;C=j^c;j=W+q|0;q=c>>>0>>0?j+1|0:j;j=Ci(C,l^q,40);l=W;D=r+l|0;w=D+1|0;C=D;D=d+j|0;S=D>>>0>>0?w:C;r=Ai(j,0,d<<1&-2,(r<<1|d>>>31)&1);d=r+D|0;C=e^d;e=W+S|0;r=d>>>0>>0?e+1|0:e;e=Ci(C,_^r,48);y[f+768>>2]=e;D=W;y[f+772>>2]=D;y[f+8>>2]=d;y[f+12>>2]=r;d=q+D|0;r=d+1|0;C=d;d=c+e|0;r=d>>>0>>0?r:C;c=Ai(e,0,c<<1&-2,(q<<1|c>>>31)&1);d=c+d|0;y[f+648>>2]=d;e=W+r|0;c=d>>>0>>0?e+1|0:e;y[f+652>>2]=c;pa=f,qa=Ci(d^j,c^l,1),y[pa+384>>2]=qa;y[f+388>>2]=W;e=Ci(g^G,F^P,1);G=W;g=J+G|0;c=g+1|0;d=g;g=e+i|0;c=g>>>0>>0?c:d;j=Ai(e,0,i<<1&-2,(J<<1|i>>>31)&1);d=g+j|0;g=W+c|0;i=d>>>0>>0?g+1|0:g;j=Ci(d^u,ga^i,32);c=W;F=c;g=Q+X|0;l=g+1|0;c=g;g=h+m|0;u=g>>>0>>0?l:c;m=Ai(h,0,m<<1&-2,(Q<<1|m>>>31)&1);g=m+g|0;c=W+u|0;m=g>>>0>>0?c+1|0:c;c=F+m|0;q=c+1|0;l=c;c=g+j|0;h=c>>>0>>0?q:l;u=Ai(j,0,g<<1&-2,(m<<1|g>>>31)&1);c=c+u|0;l=e^c;e=W+h|0;h=c>>>0>>0?e+1|0:e;e=Ci(l,G^h,40);G=W;u=i+G|0;q=u+1|0;l=u;u=d+e|0;r=u>>>0>>0?q:l;i=Ai(e,0,d<<1&-2,(i<<1|d>>>31)&1);d=i+u|0;l=j^d;j=W+r|0;i=d>>>0>>0?j+1|0:j;j=Ci(l,F^i,48);y[f+776>>2]=j;F=W;y[f+780>>2]=F;y[f+128>>2]=d;y[f+132>>2]=i;d=h+F|0;i=d+1|0;l=d;d=c+j|0;i=d>>>0>>0?i:l;c=Ai(j,0,c<<1&-2,(h<<1|c>>>31)&1);d=c+d|0;y[f+512>>2]=d;j=W+i|0;c=d>>>0>>0?j+1|0:j;y[f+516>>2]=c;pa=f,qa=Ci(d^e,c^G,1),y[pa+392>>2]=qa;y[f+396>>2]=W;c=Ci(g^v,m^da,1);d=c+n|0;j=W;e=j+M|0;m=Ai(n<<1&-2,(M<<1|n>>>31)&1,c,0);g=m+d|0;d=W+(d>>>0>>0?e+1|0:e)|0;m=g>>>0>>0?d+1|0:d;e=Ci(g^A,ba^m,32);h=W;d=Y+h|0;i=d+1|0;l=d;d=e+k|0;i=d>>>0>>0?i:l;k=Ai(e,0,k<<1&-2,(Y<<1|k>>>31)&1);d=d+k|0;l=c^d;c=W+i|0;k=d>>>0>>0?c+1|0:c;c=Ci(l,j^k,40);j=W;i=m+j|0;q=i+1|0;l=i;i=c+g|0;n=i>>>0>>0?q:l;m=Ai(c,0,g<<1&-2,(m<<1|g>>>31)&1);g=m+i|0;l=e^g;e=W+n|0;m=g>>>0>>0?e+1|0:e;e=Ci(l,h^m,48);y[f+896>>2]=e;h=W;y[f+900>>2]=h;y[f+136>>2]=g;y[f+140>>2]=m;g=h+k|0;i=g+1|0;l=g;g=d+e|0;m=g>>>0>>0?i:l;d=Ai(e,0,d<<1&-2,(k<<1|d>>>31)&1);g=d+g|0;y[f+520>>2]=g;e=W+m|0;d=d>>>0>g>>>0?e+1|0:e;y[f+524>>2]=d;pa=f,qa=Ci(c^g,d^j,1),y[pa+256>>2]=qa;y[f+260>>2]=W;p=p+1|0;if((p|0)!=8){continue}break}t(s,B+2048|0,1024);p=0;while(1){f=p<<3;g=f+s|0;c=y[g>>2];d=B+3072|0;e=d+f|0;k=y[e>>2];e=y[g+4>>2]^y[e+4>>2];y[g>>2]=c^k;y[g+4>>2]=e;c=f|8;g=c+s|0;e=y[g>>2];c=d+c|0;k=y[c>>2];c=y[g+4>>2]^y[c+4>>2];y[g>>2]=e^k;y[g+4>>2]=c;c=f|16;g=c+s|0;e=y[g>>2];c=d+c|0;k=y[c>>2];c=y[g+4>>2]^y[c+4>>2];y[g>>2]=e^k;y[g+4>>2]=c;g=f|24;f=g+s|0;c=y[f>>2];g=d+g|0;d=y[g>>2];g=y[f+4>>2]^y[g+4>>2];y[f>>2]=d^c;y[f+4>>2]=g;p=p+4|0;if((p|0)!=128){continue}break}}p=ka+1|0;R=R+1|0;s=y[a+20>>2];K=K+1|0;if(s>>>0>K>>>0){continue}break}}T=B+4096|0;}function Pa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0;q=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);e=q>>>5&2097151;I=(z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24))>>>3|0;d=Ai(I,0,-683901,-1);b=z[a+44|0];c=b<<16&2031616|(z[a+42|0]|z[a+43|0]<<8);k=d+c|0;b=W;b=c>>>0>k>>>0?b+1|0:b;i=b;b=b-((k>>>0<4293918720)-1|0)|0;n=b;d=b>>21;c=e;g=k- -1048576|0;e=(b&2097151)<<11|g>>>21;b=c+e|0;c=d;c=b>>>0>>0?c+1|0:c;x=c;H=b;o=Ai(b,c,-683901,-1);j=W;J=(z[a+49|0]|z[a+50|0]<<8|(z[a+51|0]<<16|z[a+52|0]<<24))>>>7&2097151;h=Ai(J,0,-997805,-1);b=z[a+27|0];d=0;p=z[a+23|0]|z[a+24|0]<<8|(z[a+25|0]<<16|z[a+26|0]<<24);e=b<<8|p>>>24;b=z[a+28|0];c=0;b=e|b<<16;c=c|d;c=((c&3)<<30|b>>>2)&2097151;d=c+h|0;b=W;b=c>>>0>d>>>0?b+1|0:b;l=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);F=l>>>4&2097151;c=Ai(F,0,654183,0);d=c+d|0;b=W+b|0;h=d;d=c>>>0>d>>>0?b+1|0:b;c=z[a+48|0];b=0;f=c<<8|q>>>24;e=z[a+49|0];e=e<<16;q=b|b;c=e|f;K=((q&3)<<30|c>>>2)&2097151;b=Ai(K,0,136657,0);c=b+h|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;L=(z[a+57|0]|z[a+58|0]<<8|(z[a+59|0]<<16|z[a+60|0]<<24))>>>6&2097151;b=Ai(L,0,666643,0);e=b+c|0;c=W+d|0;h=e;d=b>>>0>e>>>0?c+1|0:c;b=z[a+56|0];c=0;f=b<<8|l>>>24;e=z[a+57|0];b=0;e=e<<16;l=b|c;c=e|f;M=((l&1)<<31|c>>>1)&2097151;c=Ai(M,0,470296,0);e=c+h|0;b=W+d|0;d=e;b=d>>>0>>0?b+1|0:b;c=b+j|0;e=d+o|0;c=d>>>0>e>>>0?c+1|0:c;r=d- -1048576|0;d=b-((d>>>0<4293918720)-1|0)|0;y=d;b=r&-2097152;j=e-b|0;o=c-((b>>>0>e>>>0)+d|0)|0;c=Ai(J,0,654183,0);d=c+(p>>>5&2097151)|0;b=W;b=c>>>0>d>>>0?b+1|0:b;c=d;d=Ai(F,0,470296,0);e=c+d|0;c=W+b|0;c=d>>>0>e>>>0?c+1|0:c;b=Ai(K,N,-997805,-1);d=b+e|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(M,O,666643,0);e=b+d|0;b=W+c|0;f=e;e=d>>>0>e>>>0?b+1|0:b;d=Ai(J,0,470296,0);b=z[a+23|0];b=b<<16&2031616|(z[a+21|0]|z[a+22|0]<<8);h=d+b|0;d=W;d=b>>>0>h>>>0?d+1|0:d;c=Ai(F,0,666643,0);h=c+h|0;b=W+d|0;d=Ai(K,N,654183,0);p=d+h|0;c=W+(c>>>0>h>>>0?b+1|0:b)|0;c=d>>>0>p>>>0?c+1|0:c;l=c;c=c-((p>>>0<4293918720)-1|0)|0;E=c;b=c>>>21|0;h=p- -1048576|0;c=(c&2097151)<<11|h>>>21;f=c+f|0;b=b+e|0;b=c>>>0>f>>>0?b+1|0:b;d=b;c=b-((f>>>0<4293918720)-1|0)|0;m=c;b=j;e=f- -1048576|0;j=(c&2097151)<<11|e>>>21;s=b+j|0;c=(c>>21)+o|0;c=j>>>0>s>>>0?c+1|0:c;j=c-((s>>>0<4293918720)-1|0)|0;q=j;o=s- -1048576|0;b=o&-2097152;G=s-b|0;P=c-((b>>>0>s>>>0)+j|0)|0;b=Ai(H,x,136657,0);c=b+f|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;b=e&-2097152;v=c-b|0;t=d-((b>>>0>c>>>0)+m|0)|0;b=g&-2097152;s=k-b|0;n=i-((b>>>0>k>>>0)+n|0)|0;i=Ai(I,0,136657,0);b=z[a+40|0];c=0;g=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);e=b<<8|g>>>24;b=z[a+41|0];d=0;b=e|b<<16;d=c|d;c=d>>>3|0;d=(d&7)<<29|b>>>3;e=d+i|0;b=c+W|0;b=d>>>0>e>>>0?b+1|0:b;c=Ai(L,0,-683901,-1);d=c+e|0;b=W+b|0;b=c>>>0>d>>>0?b+1|0:b;f=d;c=Ai(I,0,-997805,-1);e=c+(g>>>6&2097151)|0;d=W;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(L,0,136657,0);g=c+e|0;c=W+d|0;d=Ai(M,O,-683901,-1);A=d+g|0;c=W+(e>>>0>g>>>0?c+1|0:c)|0;c=d>>>0>A>>>0?c+1|0:c;j=c;d=c-((A>>>0<4293918720)-1|0)|0;S=d;c=d>>21;k=A- -1048576|0;d=(d&2097151)<<11|k>>>21;m=d+f|0;b=b+c|0;b=d>>>0>m>>>0?b+1|0:b;g=b;b=b-((m>>>0<4293918720)-1|0)|0;B=b;c=b>>21;f=m- -1048576|0;d=(b&2097151)<<11|f>>>21;b=d+s|0;c=c+n|0;c=b>>>0>>0?c+1|0:c;D=c;C=b;c=Ai(b,c,-683901,-1);d=c+v|0;b=W+t|0;u=d;e=c>>>0>d>>>0?b+1|0:b;b=h&-2097152;s=p-b|0;n=l-((E&4095)+(b>>>0>p>>>0)|0)|0;p=Ai(J,0,666643,0);c=z[a+19|0];b=0;l=z[a+15|0]|z[a+16|0]<<8|(z[a+17|0]<<16|z[a+18|0]<<24);h=c<<8|l>>>24;d=b;b=z[a+20|0];c=0;b=b<<16;d=c|d;c=b|h;c=(d&7)<<29|c>>>3;h=c+p|0;d=W+(d>>>3|0)|0;d=c>>>0>h>>>0?d+1|0:d;b=Ai(K,N,470296,0);h=b+h|0;c=W+d|0;b=b>>>0>h>>>0?c+1|0:c;d=Ai(K,N,666643,0);v=d+(l>>>6&2097151)|0;c=W;c=d>>>0>v>>>0?c+1|0:c;p=c;d=c-((v>>>0<4293918720)-1|0)|0;T=d;c=d>>>21|0;i=v- -1048576|0;d=(d&2097151)<<11|i>>>21;t=d+h|0;b=b+c|0;b=d>>>0>t>>>0?b+1|0:b;l=b;b=b-((t>>>0<4293918720)-1|0)|0;U=b;c=b>>>21|0;h=t- -1048576|0;b=(b&2097151)<<11|h>>>21;d=b+s|0;c=c+n|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(H,x,-997805,-1);n=b+d|0;b=W+c|0;b=d>>>0>n>>>0?b+1|0:b;d=f&-2097152;c=m-d|0;E=c;f=g-((d>>>0>m>>>0)+B|0)|0;Q=f;d=Ai(C,D,136657,0);g=d+n|0;b=W+b|0;b=d>>>0>g>>>0?b+1|0:b;d=Ai(c,f,-683901,-1);n=d+g|0;c=W+b|0;c=d>>>0>n>>>0?c+1|0:c;g=c;b=c-((n>>>0<4293918720)-1|0)|0;B=b;f=n- -1048576|0;c=(b&2097151)<<11|f>>>21;m=c+u|0;b=(b>>21)+e|0;b=c>>>0>m>>>0?b+1|0:b;c=b-((m>>>0<4293918720)-1|0)|0;u=c;e=m- -1048576|0;s=(c&2097151)<<11|e>>>21;G=s+G|0;c=(c>>21)+P|0;V=G;s=s>>>0>G>>>0?c+1|0:c;c=e&-2097152;X=m-c|0;Y=b-((c>>>0>m>>>0)+u|0)|0;b=f&-2097152;G=n-b|0;P=g-((b>>>0>n>>>0)+B|0)|0;b=Ai(H,x,654183,0);c=h&-2097152;d=b+(t-c|0)|0;c=W+(l-((U&2147483647)+(c>>>0>t>>>0)|0)|0)|0;c=b>>>0>d>>>0?c+1|0:c;b=Ai(C,D,-997805,-1);d=b+d|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(E,Q,136657,0);e=b+d|0;b=W+c|0;u=e;g=d>>>0>e>>>0?b+1|0:b;b=k&-2097152;t=A-b|0;m=j-((b>>>0>A>>>0)+S|0)|0;l=Ai(F,0,-683901,-1);c=z[a+35|0];b=0;h=z[a+31|0]|z[a+32|0]<<8|(z[a+33|0]<<16|z[a+34|0]<<24);e=c<<8|h>>>24;d=b;b=z[a+36|0];c=0;b=b<<16|e;c=c|d;b=((c&1)<<31|b>>>1)&2097151;c=b+l|0;d=W;d=b>>>0>c>>>0?d+1|0:d;b=Ai(I,0,654183,0);e=b+c|0;c=W+d|0;c=b>>>0>e>>>0?c+1|0:c;d=Ai(L,0,-997805,-1);e=d+e|0;b=W+c|0;b=d>>>0>e>>>0?b+1|0:b;c=Ai(M,O,136657,0);d=c+e|0;b=W+b|0;f=d;e=c>>>0>d>>>0?b+1|0:b;b=Ai(J,0,-683901,-1);d=b+(h>>>4&2097151)|0;c=W;c=b>>>0>d>>>0?c+1|0:c;b=Ai(F,0,136657,0);h=b+d|0;d=W+c|0;d=b>>>0>h>>>0?d+1|0:d;b=Ai(I,0,470296,0);h=b+h|0;c=W+d|0;c=b>>>0>h>>>0?c+1|0:c;d=Ai(L,0,654183,0);h=d+h|0;b=W+c|0;c=Ai(M,O,-997805,-1);j=c+h|0;b=W+(d>>>0>h>>>0?b+1|0:b)|0;b=c>>>0>j>>>0?b+1|0:b;l=b;c=b-((j>>>0<4293918720)-1|0)|0;Z=c;b=c>>21;h=j- -1048576|0;c=(c&2097151)<<11|h>>>21;k=c+f|0;d=b+e|0;d=c>>>0>k>>>0?d+1|0:d;c=d-((k>>>0<4293918720)-1|0)|0;n=c;b=c>>21;f=k- -1048576|0;e=(c&2097151)<<11|f>>>21;c=e+t|0;b=b+m|0;b=c>>>0>>0?b+1|0:b;B=b;e=u;u=c;b=Ai(c,b,-683901,-1);e=e+b|0;c=W+g|0;m=e;e=b>>>0>e>>>0?c+1|0:c;b=Ai(H,x,470296,0);c=i&-2097152;g=b+(v-c|0)|0;c=W+(p-((T&2047)+(c>>>0>v>>>0)|0)|0)|0;c=b>>>0>g>>>0?c+1|0:c;b=g;g=Ai(C,D,654183,0);i=b+g|0;b=W+c|0;b=g>>>0>i>>>0?b+1|0:b;g=Ai(E,Q,-997805,-1);i=g+i|0;c=W+b|0;c=g>>>0>i>>>0?c+1|0:c;b=f&-2097152;f=k-b|0;A=f;g=d-((b>>>0>k>>>0)+n|0)|0;R=g;d=Ai(u,B,136657,0);i=d+i|0;b=W+c|0;b=d>>>0>i>>>0?b+1|0:b;d=Ai(f,g,-683901,-1);p=d+i|0;c=W+b|0;c=d>>>0>p>>>0?c+1|0:c;g=c;b=c-((p>>>0<4293918720)-1|0)|0;t=b;f=p- -1048576|0;c=(b&2097151)<<11|f>>>21;i=c+m|0;b=(b>>21)+e|0;b=c>>>0>i>>>0?b+1|0:b;c=b-((i>>>0<4293918720)-1|0)|0;m=c;e=i- -1048576|0;k=(c&2097151)<<11|e>>>21;n=k+G|0;c=(c>>21)+P|0;S=n;n=k>>>0>n>>>0?c+1|0:c;c=e&-2097152;T=i-c|0;U=b-((c>>>0>i>>>0)+m|0)|0;b=f&-2097152;G=p-b|0;P=g-((b>>>0>p>>>0)+t|0)|0;g=Ai(H,x,666643,0);c=z[a+14|0];b=0;m=z[a+10|0]|z[a+11|0]<<8|(z[a+12|0]<<16|z[a+13|0]<<24);e=c<<8|m>>>24;d=b;b=z[a+15|0];c=0;b=b<<16|e;c=c|d;b=((c&1)<<31|b>>>1)&2097151;c=b+g|0;d=W;d=b>>>0>c>>>0?d+1|0:d;b=c;c=Ai(C,D,470296,0);e=b+c|0;b=W+d|0;b=c>>>0>e>>>0?b+1|0:b;c=Ai(E,Q,654183,0);d=c+e|0;b=W+b|0;b=c>>>0>d>>>0?b+1|0:b;c=d;d=Ai(u,B,-997805,-1);e=c+d|0;c=W+b|0;c=d>>>0>e>>>0?c+1|0:c;b=Ai(A,R,136657,0);d=b+e|0;c=W+c|0;p=d;e=b>>>0>d>>>0?c+1|0:c;b=h&-2097152;h=j-b|0;g=l-((b>>>0>j>>>0)+Z|0)|0;d=Ai(J,0,136657,0);b=W;c=(z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24))>>>7&2097151;d=c+d|0;b=c>>>0>d>>>0?b+1|0:b;c=d;d=Ai(F,0,-997805,-1);f=c+d|0;c=W+b|0;c=d>>>0>f>>>0?c+1|0:c;b=Ai(K,N,-683901,-1);d=b+f|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=Ai(I,0,666643,0);f=b+d|0;d=W+c|0;d=b>>>0>f>>>0?d+1|0:d;c=Ai(L,0,470296,0);f=c+f|0;b=W+d|0;b=c>>>0>f>>>0?b+1|0:b;c=Ai(M,O,654183,0);d=c+f|0;b=W+b|0;f=(y&2097151)<<11|r>>>21;r=f+d|0;c=(y>>21)+(c>>>0>d>>>0?b+1|0:b)|0;c=f>>>0>r>>>0?c+1|0:c;k=c;b=c-((r>>>0<4293918720)-1|0)|0;y=b;i=r- -1048576|0;f=(b&2097151)<<11|i>>>21;c=f+h|0;b=(b>>21)+g|0;b=c>>>0>>0?b+1|0:b;v=b;t=c;c=Ai(c,b,-683901,-1);d=c+p|0;b=W+e|0;f=d;e=c>>>0>d>>>0?b+1|0:b;b=Ai(C,D,666643,0);d=b+(m>>>4&2097151)|0;c=W;c=b>>>0>d>>>0?c+1|0:c;b=Ai(E,Q,470296,0);d=b+d|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=Ai(u,B,654183,0);g=b+d|0;d=W+c|0;d=b>>>0>g>>>0?d+1|0:d;c=Ai(A,R,-997805,-1);g=c+g|0;b=W+d|0;b=c>>>0>g>>>0?b+1|0:b;c=Ai(t,v,136657,0);j=c+g|0;b=W+b|0;b=c>>>0>j>>>0?b+1|0:b;l=b;c=b-((j>>>0<4293918720)-1|0)|0;D=c;b=f;h=j- -1048576|0;f=(c&2097151)<<11|h>>>21;d=b+f|0;c=(c>>21)+e|0;c=d>>>0>>0?c+1|0:c;e=c-((d>>>0<4293918720)-1|0)|0;C=e;b=e>>21;g=d- -1048576|0;e=(e&2097151)<<11|g>>>21;f=e+G|0;b=b+P|0;H=f;p=e>>>0>f>>>0?b+1|0:b;f=d;d=c;c=i&-2097152;i=(q&2097151)<<11|o>>>21;e=(r-c|0)+i|0;c=(k-((c>>>0>r>>>0)+y|0)|0)+(q>>21)|0;c=e>>>0>>0?c+1|0:c;m=c;c=c-((e>>>0<4293918720)-1|0)|0;F=c;b=c>>21;o=b;y=e- -1048576|0;x=(c&2097151)<<11|y>>>21;b=Ai(x,b,-683901,-1);c=b+f|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;b=g&-2097152;N=c-b|0;O=d-((b>>>0>c>>>0)+C|0)|0;b=Ai(x,o,136657,0);c=l+W|0;d=b+j|0;c=d>>>0>>0?c+1|0:c;b=h&-2097152;C=d-b|0;r=c-((b>>>0>d>>>0)+D|0)|0;c=Ai(E,Q,666643,0);d=W;b=(z[a+7|0]|z[a+8|0]<<8|(z[a+9|0]<<16|z[a+10|0]<<24))>>>7&2097151;c=b+c|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(u,B,470296,0);f=b+c|0;c=W+d|0;c=b>>>0>f>>>0?c+1|0:c;b=Ai(A,R,654183,0);d=b+f|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(t,v,-997805,-1);f=b+d|0;b=W+c|0;i=f;f=d>>>0>f>>>0?b+1|0:b;l=Ai(u,B,666643,0);c=z[a+6|0];b=0;D=z[a+2|0]|z[a+3|0]<<8|(z[a+4|0]<<16|z[a+5|0]<<24);g=c<<8|D>>>24;d=b;b=z[a+7|0];c=0;b=b<<16|g;c=c|d;c=((c&3)<<30|b>>>2)&2097151;d=c+l|0;b=W;b=c>>>0>d>>>0?b+1|0:b;c=Ai(A,R,470296,0);g=c+d|0;d=W+b|0;d=c>>>0>g>>>0?d+1|0:d;c=Ai(t,v,654183,0);k=c+g|0;b=W+d|0;b=c>>>0>k>>>0?b+1|0:b;l=b;b=b-((k>>>0<4293918720)-1|0)|0;q=b;d=b>>21;h=k- -1048576|0;b=(b&2097151)<<11|h>>>21;g=b+i|0;c=d+f|0;c=b>>>0>g>>>0?c+1|0:c;b=c-((g>>>0<4293918720)-1|0)|0;j=b;f=g- -1048576|0;i=(b&2097151)<<11|f>>>21;u=i+C|0;b=(b>>21)+r|0;C=u;i=i>>>0>u>>>0?b+1|0:b;b=Ai(x,o,-997805,-1);d=b+g|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=f&-2097152;E=d-b|0;B=c-((b>>>0>d>>>0)+j|0)|0;c=Ai(x,o,654183,0);b=l+W|0;d=c+k|0;b=d>>>0>>0?b+1|0:b;c=h&-2097152;u=d-c|0;r=b-((c>>>0>d>>>0)+q|0)|0;b=Ai(A,R,666643,0);d=b+(D>>>5&2097151)|0;c=W;c=b>>>0>d>>>0?c+1|0:c;b=Ai(t,v,470296,0);d=b+d|0;c=W+c|0;g=d;d=b>>>0>d>>>0?c+1|0:c;f=Ai(t,v,666643,0);b=z[a+2|0];c=b<<16&2031616|(z[a|0]|z[a+1|0]<<8);j=f+c|0;b=W;b=c>>>0>j>>>0?b+1|0:b;l=b;b=b-((j>>>0<4293918720)-1|0)|0;v=b;h=j- -1048576|0;f=(b&2097151)<<11|h>>>21;k=f+g|0;b=(b>>21)+d|0;b=f>>>0>k>>>0?b+1|0:b;d=b;b=b-((k>>>0<4293918720)-1|0)|0;q=b;g=k- -1048576|0;f=(b&2097151)<<11|g>>>21;t=f+u|0;b=(b>>21)+r|0;f=f>>>0>t>>>0?b+1|0:b;b=Ai(x,o,470296,0);d=d+W|0;c=b+k|0;d=c>>>0>>0?d+1|0:d;b=g&-2097152;k=c-b|0;g=d-((b>>>0>c>>>0)+q|0)|0;c=Ai(x,o,666643,0);d=h&-2097152;r=c+(j-d|0)|0;b=W+(l-((d>>>0>j>>>0)+v|0)|0)|0;b=c>>>0>r>>>0?b+1|0:b;d=b>>21;b=(b&2097151)<<11|r>>>21;q=b+k|0;c=d+g|0;c=b>>>0>q>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|q>>>21;o=c+t|0;b=b+f|0;b=c>>>0>o>>>0?b+1|0:b;c=b>>21;b=(b&2097151)<<11|o>>>21;f=b+E|0;c=c+B|0;c=b>>>0>f>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|f>>>21;j=c+C|0;d=b+i|0;d=c>>>0>j>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|j>>>21;k=d+N|0;b=c+O|0;b=d>>>0>k>>>0?b+1|0:b;d=b>>21;b=(b&2097151)<<11|k>>>21;g=b+H|0;c=d+p|0;p=g;c=b>>>0>g>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|g>>>21;i=c+T|0;b=b+U|0;b=c>>>0>i>>>0?b+1|0:b;c=b>>21;b=(b&2097151)<<11|i>>>21;l=b+S|0;c=c+n|0;c=b>>>0>l>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|l>>>21;h=c+X|0;d=b+Y|0;d=c>>>0>h>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|h>>>21;g=d+V|0;b=c+s|0;c=y&-2097152;n=e-c|0;b=d>>>0>g>>>0?b+1|0:b;y=n+((b&2097151)<<11|g>>>21)|0;b=(m-((c>>>0>e>>>0)+F|0)|0)+(b>>21)|0;b=n>>>0>y>>>0?b+1|0:b;s=(b&2097151)<<11|y>>>21;c=b>>21;m=c;b=Ai(s,c,666643,0);c=r&2097151;r=b+c|0;b=W;b=c>>>0>r>>>0?b+1|0:b;e=b;w[a|0]=r;w[a+1|0]=(b&255)<<24|r>>>8;b=q&2097151;c=Ai(s,m,470296,0)+b|0;d=W;n=(e&2097151)<<11|r>>>21;q=n+c|0;b=(e>>21)+(b>>>0>c>>>0?d+1|0:d)|0;b=n>>>0>q>>>0?b+1|0:b;w[a+4|0]=(b&2047)<<21|q>>>11;c=b;d=q;w[a+3|0]=(b&7)<<29|d>>>3;w[a+2|0]=((e&65535)<<16|r>>>16)&31|d<<5;e=o&2097151;o=Ai(s,m,654183,0)+e|0;b=W;e=e>>>0>o>>>0?b+1|0:b;q=(c&2097151)<<11|d>>>21;o=q+o|0;c=(c>>21)+e|0;c=o>>>0>>0?c+1|0:c;b=c;w[a+6|0]=(b&63)<<26|o>>>6;e=o;w[a+5|0]=e<<2|(d&1572864)>>>19;d=f&2097151;f=Ai(s,m,-997805,-1)+d|0;c=W;c=d>>>0>f>>>0?c+1|0:c;d=b;b=b>>21;o=(d&2097151)<<11|e>>>21;f=o+f|0;d=b+c|0;d=f>>>0>>0?d+1|0:d;w[a+9|0]=(d&511)<<23|f>>>9;w[a+8|0]=(d&1)<<31|f>>>1;w[a+7|0]=f<<7|(e&2080768)>>>14;c=j&2097151;e=Ai(s,m,136657,0)+c|0;b=W;b=c>>>0>e>>>0?b+1|0:b;c=d;d=c>>21;j=(c&2097151)<<11|f>>>21;e=j+e|0;c=b+d|0;c=e>>>0>>0?c+1|0:c;w[a+12|0]=(c&4095)<<20|e>>>12;d=e;w[a+11|0]=(c&15)<<28|d>>>4;w[a+10|0]=d<<4|(f&1966080)>>>17;e=k&2097151;f=Ai(s,m,-683901,-1)+e|0;b=W;b=e>>>0>f>>>0?b+1|0:b;e=c;c=c>>21;u=f;f=(e&2097151)<<11|d>>>21;e=u+f|0;c=b+c|0;c=e>>>0>>0?c+1|0:c;w[a+14|0]=(c&127)<<25|e>>>7;w[a+13|0]=e<<1|(d&1048576)>>>20;b=c>>21;c=(c&2097151)<<11|e>>>21;f=c+(p&2097151)|0;d=c>>>0>f>>>0?b+1|0:b;w[a+17|0]=(d&1023)<<22|f>>>10;w[a+16|0]=(d&3)<<30|f>>>2;w[a+15|0]=f<<6|(e&2064384)>>>15;b=d>>21;c=(d&2097151)<<11|f>>>21;d=c+(i&2097151)|0;b=c>>>0>d>>>0?b+1|0:b;w[a+20|0]=(b&8191)<<19|d>>>13;w[a+19|0]=(b&31)<<27|d>>>5;c=l&2097151;l=(b&2097151)<<11|d>>>21;e=c+l|0;c=b>>21;c=e>>>0>>0?c+1|0:c;l=e;w[a+21|0]=e;w[a+18|0]=d<<3|(f&1835008)>>>18;w[a+22|0]=(c&255)<<24|e>>>8;f=(c&2097151)<<11|e>>>21;e=f+(h&2097151)|0;d=c>>21;d=e>>>0>>0?d+1|0:d;w[a+25|0]=(d&2047)<<21|e>>>11;w[a+24|0]=(d&7)<<29|e>>>3;w[a+23|0]=((c&65535)<<16|l>>>16)&31|e<<5;b=d>>21;c=(d&2097151)<<11|e>>>21;d=c+(g&2097151)|0;b=c>>>0>d>>>0?b+1|0:b;w[a+27|0]=(b&63)<<26|d>>>6;w[a+26|0]=d<<2|(e&1572864)>>>19;c=b;b=b>>21;g=(c&2097151)<<11|d>>>21;f=y&2097151;e=g+f|0;c=e>>>0>>0?b+1|0:b;w[a+31|0]=(c&131071)<<15|e>>>17;b=e;w[a+30|0]=(c&511)<<23|b>>>9;w[a+28|0]=b<<7|(d&2080768)>>>14;w[a+29|0]=g+y>>>1;}function oc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0;C=T-2048|0;T=C;t(C+1024|0,b,1024);b=0;while(1){f=C+1024|0;d=b<<3;e=f+d|0;j=y[e>>2];g=a+d|0;k=y[g>>2];g=y[e+4>>2]^y[g+4>>2];y[e>>2]=j^k;y[e+4>>2]=g;j=d|8;e=j+f|0;g=y[e>>2];j=a+j|0;k=y[j>>2];j=y[e+4>>2]^y[j+4>>2];y[e>>2]=g^k;y[e+4>>2]=j;j=d|16;e=j+f|0;g=y[e>>2];j=a+j|0;k=y[j>>2];j=y[e+4>>2]^y[j+4>>2];y[e>>2]=g^k;y[e+4>>2]=j;e=d|24;d=e+f|0;j=y[d>>2];e=a+e|0;g=y[e>>2];e=y[d+4>>2]^y[e+4>>2];y[d>>2]=g^j;y[d+4>>2]=e;b=b+4|0;if((b|0)!=128){continue}break}t(C,f,1024);a=0;b=0;while(1){f=b<<3;d=f+C|0;e=y[d>>2];j=c+f|0;g=y[j>>2];j=y[d+4>>2]^y[j+4>>2];y[d>>2]=g^e;y[d+4>>2]=j;e=f|8;d=e+C|0;j=y[d>>2];e=c+e|0;g=y[e>>2];e=y[d+4>>2]^y[e+4>>2];y[d>>2]=g^j;y[d+4>>2]=e;e=f|16;d=e+C|0;j=y[d>>2];e=c+e|0;g=y[e>>2];e=y[d+4>>2]^y[e+4>>2];y[d>>2]=g^j;y[d+4>>2]=e;d=f|24;f=d+C|0;e=y[f>>2];d=c+d|0;j=y[d>>2];d=y[f+4>>2]^y[d+4>>2];y[f>>2]=e^j;y[f+4>>2]=d;b=b+4|0;if((b|0)!=128){continue}break}while(1){f=(C+1024|0)+(a<<7)|0;g=y[f+56>>2];d=y[f+24>>2];k=g+d|0;i=y[f+60>>2];e=y[f+28>>2];b=i+e|0;j=d>>>0>k>>>0?b+1|0:b;e=Ai(d<<1&-2,(e<<1|d>>>31)&1,g,0);d=e+k|0;b=W+j|0;j=d>>>0>>0?b+1|0:b;k=Ci(y[f+120>>2]^d,j^y[f+124>>2],32);e=y[f+88>>2];m=k+e|0;o=W;h=y[f+92>>2];b=o+h|0;l=e>>>0>m>>>0?b+1|0:b;h=Ai(e<<1&-2,(h<<1|e>>>31)&1,k,0);e=h+m|0;b=W+l|0;n=e>>>0>>0?b+1|0:b;L=Ci(g^e,i^n,40);S=W;b=j+S|0;h=d+L|0;g=h>>>0>>0?b+1|0:b;d=Ai(L,0,d<<1&-2,(j<<1|d>>>31)&1);I=d+h|0;b=W+g|0;M=d>>>0>I>>>0?b+1|0:b;D=Ci(k^I,o^M,48);b=W;U=b;p=D;m=b;k=y[f+40>>2];d=y[f+8>>2];h=k+d|0;E=y[f+44>>2];j=y[f+12>>2];b=E+j|0;g=d>>>0>h>>>0?b+1|0:b;j=Ai(d<<1&-2,(j<<1|d>>>31)&1,k,0);d=j+h|0;b=W+g|0;g=d>>>0>>0?b+1|0:b;h=Ci(y[f+104>>2]^d,g^y[f+108>>2],32);j=y[f+72>>2];o=h+j|0;s=W;l=y[f+76>>2];b=s+l|0;i=j>>>0>o>>>0?b+1|0:b;l=Ai(j<<1&-2,(l<<1|j>>>31)&1,h,0);j=l+o|0;b=W+i|0;i=j^k;k=j>>>0>>0?b+1|0:b;l=Ci(i,E^k,40);r=W;b=g+r|0;o=d+l|0;i=o>>>0>>0?b+1|0:b;g=Ai(l,0,d<<1&-2,(g<<1|d>>>31)&1);d=g+o|0;b=W+i|0;o=d>>>0>>0?b+1|0:b;N=Ci(d^h,s^o,48);O=W;b=k+O|0;h=j+N|0;g=h>>>0>>0?b+1|0:b;k=Ai(N,0,j<<1&-2,(k<<1|j>>>31)&1);j=k+h|0;b=W+g|0;E=j>>>0>>0?b+1|0:b;x=Ci(j^l,r^E,1);b=W;P=b;u=x;i=b;l=y[f+32>>2];g=y[f>>2];s=l+g|0;F=y[f+36>>2];k=y[f+4>>2];b=F+k|0;h=g>>>0>s>>>0?b+1|0:b;k=Ai(g<<1&-2,(k<<1|g>>>31)&1,l,0);g=k+s|0;b=W+h|0;h=g>>>0>>0?b+1|0:b;G=Ci(y[f+96>>2]^g,h^y[f+100>>2],32);v=f- -64|0;b=v;k=y[b>>2];q=G+k|0;R=W;s=y[b+4>>2];b=R+s|0;r=k>>>0>q>>>0?b+1|0:b;s=Ai(k<<1&-2,(s<<1|k>>>31)&1,G,0);k=s+q|0;b=W+r|0;s=k>>>0>>0?b+1|0:b;F=Ci(k^l,F^s,40);V=W;b=h+V|0;r=g+F|0;l=r>>>0>>0?b+1|0:b;h=Ai(F,0,g<<1&-2,(h<<1|g>>>31)&1);g=h+r|0;b=W+l|0;r=g>>>0>>0?b+1|0:b;b=r+i|0;h=g+u|0;l=h>>>0>>0?b+1|0:b;i=Ai(u,0,g<<1&-2,(r<<1|g>>>31)&1);h=i+h|0;b=W+l|0;q=h>>>0>>0?b+1|0:b;H=Ci(h^p,q^m,32);b=W;Q=b;z=b;p=y[f+48>>2];l=y[f+16>>2];u=p+l|0;J=y[f+52>>2];m=y[f+20>>2];b=J+m|0;i=l>>>0>u>>>0?b+1|0:b;m=Ai(l<<1&-2,(m<<1|l>>>31)&1,p,0);l=m+u|0;b=W+i|0;i=l>>>0>>0?b+1|0:b;u=Ci(y[f+112>>2]^l,i^y[f+116>>2],32);m=y[f+80>>2];w=u+m|0;K=W;A=y[f+84>>2];b=K+A|0;B=m>>>0>w>>>0?b+1|0:b;A=Ai(m<<1&-2,(A<<1|m>>>31)&1,u,0);m=A+w|0;b=W+B|0;w=m^p;p=m>>>0>>0?b+1|0:b;A=Ci(w,J^p,40);J=W;b=i+J|0;w=l+A|0;B=w>>>0>>0?b+1|0:b;i=Ai(A,0,l<<1&-2,(i<<1|l>>>31)&1);l=i+w|0;b=W+B|0;w=l^u;u=i>>>0>l>>>0?b+1|0:b;B=Ci(w,K^u,48);K=W;b=p+K|0;w=m+B|0;i=w>>>0>>0?b+1|0:b;p=Ai(B,0,m<<1&-2,(p<<1|m>>>31)&1);m=p+w|0;b=W+i|0;p=m>>>0

>>0?b+1|0:b;b=p+z|0;i=m+H|0;z=i>>>0>>0?b+1|0:b;w=Ai(H,0,m<<1&-2,(p<<1|m>>>31)&1);i=w+i|0;b=W+z|0;z=i^x;x=i>>>0>>0?b+1|0:b;z=Ci(z,P^x,40);P=W;b=q+P|0;X=h+z|0;w=X>>>0>>0?b+1|0:b;q=Ai(z,0,h<<1&-2,(q<<1|h>>>31)&1);h=q+X|0;b=W+w|0;y[f>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+4>>2]=b;h=Ci(h^H,b^Q,48);y[f+120>>2]=h;b=W;y[f+124>>2]=b;b=b+x|0;H=h+i|0;q=H>>>0>>0?b+1|0:b;i=Ai(h,0,i<<1&-2,(x<<1|i>>>31)&1);h=i+H|0;b=W+q|0;y[f+80>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+84>>2]=b;Y=f,Z=Ci(h^z,b^P,1),y[Y+40>>2]=Z;y[f+44>>2]=W;b=n+U|0;i=e+D|0;h=i>>>0>>0?b+1|0:b;e=Ai(D,0,e<<1&-2,(n<<1|e>>>31)&1);i=e+i|0;b=W+h|0;b=e>>>0>i>>>0?b+1|0:b;h=b;e=b;m=Ci(m^A,p^J,1);p=W;b=o+p|0;q=d+m|0;n=q>>>0>>0?b+1|0:b;o=Ai(m,0,d<<1&-2,(o<<1|d>>>31)&1);d=o+q|0;b=W+n|0;b=d>>>0>>0?b+1|0:b;o=Ci(g^G,r^R,48);g=b;x=W;n=Ci(o^d,b^x,32);q=n+i|0;D=W;b=D+e|0;r=n>>>0>q>>>0?b+1|0:b;b=q;q=Ai(i<<1&-2,(e<<1|i>>>31)&1,n,0);e=b+q|0;b=W+r|0;r=e^m;m=e>>>0>>0?b+1|0:b;r=Ci(r,p^m,40);p=W;b=g+p|0;G=d+r|0;q=G>>>0>>0?b+1|0:b;d=Ai(r,0,d<<1&-2,(g<<1|d>>>31)&1);g=d+G|0;b=W+q|0;b=d>>>0>g>>>0?b+1|0:b;d=Ci(g^n,D^b,48);y[f+96>>2]=d;n=W;y[f+100>>2]=n;y[f+8>>2]=g;y[f+12>>2]=b;b=m+n|0;n=d+e|0;g=n>>>0>>0?b+1|0:b;e=Ai(d,0,e<<1&-2,(m<<1|e>>>31)&1);d=e+n|0;b=W+g|0;y[f+88>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+92>>2]=b;Y=f,Z=Ci(d^r,b^p,1),y[Y+48>>2]=Z;y[f+52>>2]=W;m=Ci(i^L,h^S,1);n=W;b=u+n|0;d=l+m|0;e=d>>>0>>0?b+1|0:b;g=Ai(m,0,l<<1&-2,(u<<1|l>>>31)&1);d=g+d|0;b=W+e|0;h=d>>>0>>0?b+1|0:b;i=Ci(d^N,O^h,32);b=W;r=b;g=b;b=s+x|0;e=k+o|0;l=e>>>0>>0?b+1|0:b;k=Ai(o,0,k<<1&-2,(s<<1|k>>>31)&1);e=k+e|0;b=W+l|0;k=e>>>0>>0?b+1|0:b;b=k+g|0;g=e+i|0;l=g>>>0>>0?b+1|0:b;o=Ai(i,0,e<<1&-2,(k<<1|e>>>31)&1);g=o+g|0;b=W+l|0;l=g>>>0>>0?b+1|0:b;m=Ci(g^m,n^l,40);o=W;b=h+o|0;s=d+m|0;n=s>>>0>>0?b+1|0:b;d=Ai(m,0,d<<1&-2,(h<<1|d>>>31)&1);h=d+s|0;b=W+n|0;b=d>>>0>h>>>0?b+1|0:b;d=Ci(h^i,r^b,48);y[f+104>>2]=d;i=W;y[f+108>>2]=i;y[f+16>>2]=h;y[f+20>>2]=b;h=v;b=i+l|0;n=d+g|0;i=n>>>0>>0?b+1|0:b;g=Ai(d,0,g<<1&-2,(l<<1|g>>>31)&1);d=g+n|0;b=W+i|0;y[h>>2]=d;b=d>>>0>>0?b+1|0:b;y[h+4>>2]=b;Y=f,Z=Ci(d^m,b^o,1),y[Y+56>>2]=Z;y[f+60>>2]=W;g=Ci(e^F,k^V,1);d=g+I|0;l=W;b=l+M|0;e=d>>>0>>0?b+1|0:b;k=Ai(I<<1&-2,(M<<1|I>>>31)&1,g,0);d=k+d|0;b=W+e|0;e=d>>>0>>0?b+1|0:b;k=Ci(d^B,K^e,32);m=W;b=E+m|0;i=j+k|0;h=i>>>0>>0?b+1|0:b;b=i;i=Ai(k,0,j<<1&-2,(E<<1|j>>>31)&1);j=b+i|0;b=W+h|0;h=g^j;g=i>>>0>j>>>0?b+1|0:b;h=Ci(h,l^g,40);i=W;b=e+i|0;n=d+h|0;l=n>>>0>>0?b+1|0:b;d=Ai(h,0,d<<1&-2,(e<<1|d>>>31)&1);e=d+n|0;b=W+l|0;b=d>>>0>e>>>0?b+1|0:b;d=Ci(e^k,m^b,48);y[f+112>>2]=d;k=W;y[f+116>>2]=k;y[f+24>>2]=e;y[f+28>>2]=b;b=g+k|0;k=d+j|0;e=k>>>0>>0?b+1|0:b;j=Ai(d,0,j<<1&-2,(g<<1|j>>>31)&1);d=j+k|0;b=W+e|0;y[f+72>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+76>>2]=b;Y=f,Z=Ci(d^h,b^i,1),y[Y+32>>2]=Z;y[f+36>>2]=W;a=a+1|0;if((a|0)!=8){continue}break}a=0;while(1){f=(C+1024|0)+(a<<4)|0;g=y[f+392>>2];d=y[f+136>>2];k=g+d|0;i=y[f+396>>2];e=y[f+140>>2];b=i+e|0;j=d>>>0>k>>>0?b+1|0:b;e=Ai(d<<1&-2,(e<<1|d>>>31)&1,g,0);d=e+k|0;b=W+j|0;j=d>>>0>>0?b+1|0:b;k=Ci(y[f+904>>2]^d,j^y[f+908>>2],32);e=y[f+648>>2];m=k+e|0;o=W;h=y[f+652>>2];b=o+h|0;l=e>>>0>m>>>0?b+1|0:b;h=Ai(e<<1&-2,(h<<1|e>>>31)&1,k,0);e=h+m|0;b=W+l|0;n=e>>>0>>0?b+1|0:b;L=Ci(g^e,i^n,40);w=W;b=j+w|0;h=d+L|0;g=h>>>0>>0?b+1|0:b;d=Ai(L,0,d<<1&-2,(j<<1|d>>>31)&1);I=d+h|0;b=W+g|0;M=d>>>0>I>>>0?b+1|0:b;D=Ci(k^I,o^M,48);b=W;S=b;p=D;m=b;k=y[f+264>>2];d=y[f+8>>2];h=k+d|0;E=y[f+268>>2];j=y[f+12>>2];b=E+j|0;g=d>>>0>h>>>0?b+1|0:b;j=Ai(d<<1&-2,(j<<1|d>>>31)&1,k,0);d=j+h|0;b=W+g|0;g=d>>>0>>0?b+1|0:b;h=Ci(y[f+776>>2]^d,g^y[f+780>>2],32);j=y[f+520>>2];o=h+j|0;s=W;l=y[f+524>>2];b=s+l|0;i=j>>>0>o>>>0?b+1|0:b;l=Ai(j<<1&-2,(l<<1|j>>>31)&1,h,0);j=l+o|0;b=W+i|0;i=j^k;k=j>>>0>>0?b+1|0:b;l=Ci(i,E^k,40);r=W;b=g+r|0;o=d+l|0;i=o>>>0>>0?b+1|0:b;g=Ai(l,0,d<<1&-2,(g<<1|d>>>31)&1);d=g+o|0;b=W+i|0;o=d>>>0>>0?b+1|0:b;N=Ci(d^h,s^o,48);U=W;b=k+U|0;h=j+N|0;g=h>>>0>>0?b+1|0:b;k=Ai(N,0,j<<1&-2,(k<<1|j>>>31)&1);j=k+h|0;b=W+g|0;E=j>>>0>>0?b+1|0:b;x=Ci(j^l,r^E,1);b=W;O=b;u=x;i=b;l=y[f+256>>2];g=y[f>>2];s=l+g|0;F=y[f+260>>2];k=y[f+4>>2];b=F+k|0;h=g>>>0>s>>>0?b+1|0:b;k=Ai(g<<1&-2,(k<<1|g>>>31)&1,l,0);g=k+s|0;b=W+h|0;h=g>>>0>>0?b+1|0:b;G=Ci(y[f+768>>2]^g,h^y[f+772>>2],32);k=y[f+512>>2];q=G+k|0;P=W;s=y[f+516>>2];b=P+s|0;r=k>>>0>q>>>0?b+1|0:b;s=Ai(k<<1&-2,(s<<1|k>>>31)&1,G,0);k=s+q|0;b=W+r|0;s=k>>>0>>0?b+1|0:b;F=Ci(k^l,F^s,40);R=W;b=h+R|0;r=g+F|0;l=r>>>0>>0?b+1|0:b;h=Ai(F,0,g<<1&-2,(h<<1|g>>>31)&1);g=h+r|0;b=W+l|0;r=g>>>0>>0?b+1|0:b;b=r+i|0;h=g+u|0;l=h>>>0>>0?b+1|0:b;i=Ai(u,0,g<<1&-2,(r<<1|g>>>31)&1);h=i+h|0;b=W+l|0;q=h>>>0>>0?b+1|0:b;H=Ci(h^p,q^m,32);b=W;V=b;z=b;p=y[f+384>>2];l=y[f+128>>2];u=p+l|0;Q=y[f+388>>2];m=y[f+132>>2];b=Q+m|0;i=l>>>0>u>>>0?b+1|0:b;m=Ai(l<<1&-2,(m<<1|l>>>31)&1,p,0);l=m+u|0;b=W+i|0;i=l>>>0>>0?b+1|0:b;u=Ci(y[f+896>>2]^l,i^y[f+900>>2],32);m=y[f+640>>2];v=u+m|0;J=W;A=y[f+644>>2];b=J+A|0;B=m>>>0>v>>>0?b+1|0:b;A=Ai(m<<1&-2,(A<<1|m>>>31)&1,u,0);m=A+v|0;b=W+B|0;v=m^p;p=m>>>0>>0?b+1|0:b;A=Ci(v,Q^p,40);Q=W;b=i+Q|0;v=l+A|0;B=v>>>0>>0?b+1|0:b;i=Ai(A,0,l<<1&-2,(i<<1|l>>>31)&1);l=i+v|0;b=W+B|0;v=l^u;u=i>>>0>l>>>0?b+1|0:b;B=Ci(v,J^u,48);J=W;b=p+J|0;v=m+B|0;i=v>>>0>>0?b+1|0:b;p=Ai(B,0,m<<1&-2,(p<<1|m>>>31)&1);m=p+v|0;b=W+i|0;p=m>>>0

>>0?b+1|0:b;b=p+z|0;i=m+H|0;z=i>>>0>>0?b+1|0:b;v=Ai(H,0,m<<1&-2,(p<<1|m>>>31)&1);i=v+i|0;b=W+z|0;z=i^x;x=i>>>0>>0?b+1|0:b;z=Ci(z,O^x,40);O=W;b=q+O|0;K=h+z|0;v=K>>>0>>0?b+1|0:b;q=Ai(z,0,h<<1&-2,(q<<1|h>>>31)&1);h=q+K|0;b=W+v|0;y[f>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+4>>2]=b;h=Ci(h^H,b^V,48);y[f+904>>2]=h;b=W;y[f+908>>2]=b;b=b+x|0;H=h+i|0;q=H>>>0>>0?b+1|0:b;i=Ai(h,0,i<<1&-2,(x<<1|i>>>31)&1);h=i+H|0;b=W+q|0;y[f+640>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+644>>2]=b;Y=f,Z=Ci(h^z,b^O,1),y[Y+264>>2]=Z;y[f+268>>2]=W;b=n+S|0;i=e+D|0;h=i>>>0>>0?b+1|0:b;e=Ai(D,0,e<<1&-2,(n<<1|e>>>31)&1);i=e+i|0;b=W+h|0;b=e>>>0>i>>>0?b+1|0:b;h=b;e=b;m=Ci(m^A,p^Q,1);p=W;b=o+p|0;q=d+m|0;n=q>>>0>>0?b+1|0:b;o=Ai(m,0,d<<1&-2,(o<<1|d>>>31)&1);d=o+q|0;b=W+n|0;b=d>>>0>>0?b+1|0:b;o=Ci(g^G,r^P,48);g=b;x=W;n=Ci(o^d,b^x,32);q=n+i|0;D=W;b=D+e|0;r=n>>>0>q>>>0?b+1|0:b;b=q;q=Ai(i<<1&-2,(e<<1|i>>>31)&1,n,0);e=b+q|0;b=W+r|0;r=e^m;m=e>>>0>>0?b+1|0:b;r=Ci(r,p^m,40);p=W;b=g+p|0;G=d+r|0;q=G>>>0>>0?b+1|0:b;d=Ai(r,0,d<<1&-2,(g<<1|d>>>31)&1);g=d+G|0;b=W+q|0;b=d>>>0>g>>>0?b+1|0:b;d=Ci(g^n,D^b,48);y[f+768>>2]=d;n=W;y[f+772>>2]=n;y[f+8>>2]=g;y[f+12>>2]=b;b=m+n|0;n=d+e|0;g=n>>>0>>0?b+1|0:b;e=Ai(d,0,e<<1&-2,(m<<1|e>>>31)&1);d=e+n|0;b=W+g|0;y[f+648>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+652>>2]=b;Y=f,Z=Ci(d^r,b^p,1),y[Y+384>>2]=Z;y[f+388>>2]=W;m=Ci(i^L,h^w,1);n=W;b=u+n|0;d=l+m|0;e=d>>>0>>0?b+1|0:b;g=Ai(m,0,l<<1&-2,(u<<1|l>>>31)&1);d=g+d|0;b=W+e|0;h=d>>>0>>0?b+1|0:b;i=Ci(d^N,U^h,32);b=W;r=b;g=b;b=s+x|0;e=k+o|0;l=e>>>0>>0?b+1|0:b;k=Ai(o,0,k<<1&-2,(s<<1|k>>>31)&1);e=k+e|0;b=W+l|0;k=e>>>0>>0?b+1|0:b;b=k+g|0;g=e+i|0;l=g>>>0>>0?b+1|0:b;o=Ai(i,0,e<<1&-2,(k<<1|e>>>31)&1);g=o+g|0;b=W+l|0;l=g>>>0>>0?b+1|0:b;m=Ci(g^m,n^l,40);o=W;b=h+o|0;s=d+m|0;n=s>>>0>>0?b+1|0:b;d=Ai(m,0,d<<1&-2,(h<<1|d>>>31)&1);h=d+s|0;b=W+n|0;b=d>>>0>h>>>0?b+1|0:b;d=Ci(h^i,r^b,48);y[f+776>>2]=d;i=W;y[f+780>>2]=i;y[f+128>>2]=h;y[f+132>>2]=b;b=i+l|0;i=d+g|0;h=i>>>0>>0?b+1|0:b;g=Ai(d,0,g<<1&-2,(l<<1|g>>>31)&1);d=g+i|0;b=W+h|0;y[f+512>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+516>>2]=b;Y=f,Z=Ci(d^m,b^o,1),y[Y+392>>2]=Z;y[f+396>>2]=W;g=Ci(e^F,k^R,1);d=g+I|0;l=W;b=l+M|0;e=d>>>0>>0?b+1|0:b;k=Ai(I<<1&-2,(M<<1|I>>>31)&1,g,0);d=k+d|0;b=W+e|0;e=d>>>0>>0?b+1|0:b;k=Ci(d^B,J^e,32);m=W;b=E+m|0;i=j+k|0;h=i>>>0>>0?b+1|0:b;b=i;i=Ai(k,0,j<<1&-2,(E<<1|j>>>31)&1);j=b+i|0;b=W+h|0;h=g^j;g=i>>>0>j>>>0?b+1|0:b;h=Ci(h,l^g,40);i=W;b=e+i|0;n=d+h|0;l=n>>>0>>0?b+1|0:b;d=Ai(h,0,d<<1&-2,(e<<1|d>>>31)&1);e=d+n|0;b=W+l|0;b=d>>>0>e>>>0?b+1|0:b;d=Ci(e^k,m^b,48);y[f+896>>2]=d;k=W;y[f+900>>2]=k;y[f+136>>2]=e;y[f+140>>2]=b;b=g+k|0;k=d+j|0;e=k>>>0>>0?b+1|0:b;j=Ai(d,0,j<<1&-2,(g<<1|j>>>31)&1);d=j+k|0;b=W+e|0;y[f+520>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+524>>2]=b;Y=f,Z=Ci(d^h,b^i,1),y[Y+256>>2]=Z;y[f+260>>2]=W;a=a+1|0;if((a|0)!=8){continue}break}t(c,C,1024);a=0;while(1){b=a<<3;f=b+c|0;d=y[f>>2];i=C+1024|0;e=i;j=e+b|0;g=y[j>>2];j=y[f+4>>2]^y[j+4>>2];y[f>>2]=d^g;y[f+4>>2]=j;d=b|8;f=d+c|0;j=y[f>>2];d=d+e|0;e=y[d>>2];d=y[f+4>>2]^y[d+4>>2];y[f>>2]=e^j;y[f+4>>2]=d;d=b|16;f=d+c|0;e=y[f>>2];d=d+i|0;j=y[d>>2];d=y[f+4>>2]^y[d+4>>2];y[f>>2]=e^j;y[f+4>>2]=d;f=b|24;b=f+c|0;d=y[b>>2];f=f+i|0;e=y[f>>2];f=y[b+4>>2]^y[f+4>>2];y[b>>2]=d^e;y[b+4>>2]=f;a=a+4|0;if((a|0)!=128){continue}break}T=C+2048|0;}function Ie(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=T-800|0;T=d;g=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);i=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);j=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);k=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);l=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);m=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);n=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);p=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);q=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);r=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);s=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);t=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);u=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);v=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);o=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);b=c- -64|0;w=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[b>>2]=w^33620224;y[c+56>>2]=1496785429;y[c+60>>2]=1652156816;y[c+48>>2]=33620224;y[c+52>>2]=218629379;y[c+40>>2]=1110511904;y[c+44>>2]=-584534669;y[c+32>>2]=1427652059;y[c+36>>2]=-248528275;o=o^w;y[c>>2]=o;y[c+92>>2]=v^-584534669;y[c+88>>2]=u^1110511904;y[c+84>>2]=t^-248528275;y[c+80>>2]=s^1427652059;y[c+76>>2]=r^1652156816;y[c+72>>2]=q^1496785429;y[c+68>>2]=p^218629379;n=n^v;y[c+28>>2]=n;m=m^u;y[c+24>>2]=m;l=l^t;y[c+20>>2]=l;k=k^s;y[c+16>>2]=k;j=j^r;y[c+12>>2]=j;i=i^q;y[c+8>>2]=i;x=g^p;y[c+4>>2]=x;g=0;while(1){a=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=a;a=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=a;a=y[b+4>>2];y[d+752>>2]=y[b>>2];y[d+756>>2]=a;a=y[b+12>>2];y[d+760>>2]=y[b+8>>2];y[d+764>>2]=a;a=y[c+84>>2];y[d+736>>2]=y[c+80>>2];y[d+740>>2]=a;a=y[c+92>>2];y[d+744>>2]=y[c+88>>2];y[d+748>>2]=a;a=d+768|0;ia(a,d+752|0,d+736|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+720>>2]=y[c+48>>2];y[d+724>>2]=e;e=y[c+60>>2];y[d+728>>2]=y[c+56>>2];y[d+732>>2]=e;e=y[b+4>>2];y[d+704>>2]=y[b>>2];y[d+708>>2]=e;e=y[b+12>>2];y[d+712>>2]=y[b+8>>2];y[d+716>>2]=e;ia(a,d+720|0,d+704|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+688>>2]=y[c+32>>2];y[d+692>>2]=e;e=y[c+44>>2];y[d+696>>2]=y[c+40>>2];y[d+700>>2]=e;e=y[c+52>>2];y[d+672>>2]=y[c+48>>2];y[d+676>>2]=e;e=y[c+60>>2];y[d+680>>2]=y[c+56>>2];y[d+684>>2]=e;ia(a,d+688|0,d+672|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+656>>2]=y[c+16>>2];y[d+660>>2]=e;e=y[c+28>>2];y[d+664>>2]=y[c+24>>2];y[d+668>>2]=e;e=y[c+36>>2];y[d+640>>2]=y[c+32>>2];y[d+644>>2]=e;e=y[c+44>>2];y[d+648>>2]=y[c+40>>2];y[d+652>>2]=e;ia(a,d+656|0,d+640|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+624>>2]=y[c>>2];y[d+628>>2]=e;e=y[c+12>>2];y[d+632>>2]=y[c+8>>2];y[d+636>>2]=e;e=y[c+20>>2];y[d+608>>2]=y[c+16>>2];y[d+612>>2]=e;e=y[c+28>>2];y[d+616>>2]=y[c+24>>2];y[d+620>>2]=e;ia(a,d+624|0,d+608|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+592>>2]=y[d+784>>2];y[d+596>>2]=e;e=y[d+796>>2];y[d+600>>2]=y[d+792>>2];y[d+604>>2]=e;e=y[c+4>>2];y[d+576>>2]=y[c>>2];y[d+580>>2]=e;e=y[c+12>>2];y[d+584>>2]=y[c+8>>2];y[d+588>>2]=e;ia(a,d+592|0,d+576|0);e=y[d+768>>2];f=y[d+772>>2];h=y[d+776>>2];y[c+12>>2]=y[d+780>>2]^r;y[c+8>>2]=h^q;y[c+4>>2]=f^p;y[c>>2]=e^w;e=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=e;e=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=e;e=y[b+4>>2];y[d+560>>2]=y[b>>2];y[d+564>>2]=e;e=y[b+12>>2];y[d+568>>2]=y[b+8>>2];y[d+572>>2]=e;e=y[c+92>>2];y[d+552>>2]=y[c+88>>2];y[d+556>>2]=e;e=y[c+84>>2];y[d+544>>2]=y[c+80>>2];y[d+548>>2]=e;ia(a,d+560|0,d+544|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+528>>2]=y[c+48>>2];y[d+532>>2]=e;e=y[c+60>>2];y[d+536>>2]=y[c+56>>2];y[d+540>>2]=e;e=y[b+4>>2];y[d+512>>2]=y[b>>2];y[d+516>>2]=e;e=y[b+12>>2];y[d+520>>2]=y[b+8>>2];y[d+524>>2]=e;ia(a,d+528|0,d+512|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+496>>2]=y[c+32>>2];y[d+500>>2]=e;e=y[c+44>>2];y[d+504>>2]=y[c+40>>2];y[d+508>>2]=e;e=y[c+52>>2];y[d+480>>2]=y[c+48>>2];y[d+484>>2]=e;e=y[c+60>>2];y[d+488>>2]=y[c+56>>2];y[d+492>>2]=e;ia(a,d+496|0,d+480|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+464>>2]=y[c+16>>2];y[d+468>>2]=e;e=y[c+28>>2];y[d+472>>2]=y[c+24>>2];y[d+476>>2]=e;e=y[c+36>>2];y[d+448>>2]=y[c+32>>2];y[d+452>>2]=e;e=y[c+44>>2];y[d+456>>2]=y[c+40>>2];y[d+460>>2]=e;ia(a,d+464|0,d+448|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+432>>2]=y[c>>2];y[d+436>>2]=e;e=y[c+12>>2];y[d+440>>2]=y[c+8>>2];y[d+444>>2]=e;e=y[c+20>>2];y[d+416>>2]=y[c+16>>2];y[d+420>>2]=e;e=y[c+28>>2];y[d+424>>2]=y[c+24>>2];y[d+428>>2]=e;ia(a,d+432|0,d+416|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+400>>2]=y[d+784>>2];y[d+404>>2]=e;e=y[d+796>>2];y[d+408>>2]=y[d+792>>2];y[d+412>>2]=e;e=y[c+4>>2];y[d+384>>2]=y[c>>2];y[d+388>>2]=e;e=y[c+12>>2];y[d+392>>2]=y[c+8>>2];y[d+396>>2]=e;ia(a,d+400|0,d+384|0);e=y[d+768>>2];f=y[d+772>>2];h=y[d+776>>2];y[c+12>>2]=y[d+780>>2]^v;y[c+8>>2]=h^u;y[c+4>>2]=f^t;y[c>>2]=e^s;e=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=e;e=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=e;e=y[b+4>>2];y[d+368>>2]=y[b>>2];y[d+372>>2]=e;e=y[b+12>>2];y[d+376>>2]=y[b+8>>2];y[d+380>>2]=e;e=y[c+92>>2];y[d+360>>2]=y[c+88>>2];y[d+364>>2]=e;e=y[c+84>>2];y[d+352>>2]=y[c+80>>2];y[d+356>>2]=e;ia(a,d+368|0,d+352|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+336>>2]=y[c+48>>2];y[d+340>>2]=e;e=y[c+60>>2];y[d+344>>2]=y[c+56>>2];y[d+348>>2]=e;e=y[b+4>>2];y[d+320>>2]=y[b>>2];y[d+324>>2]=e;e=y[b+12>>2];y[d+328>>2]=y[b+8>>2];y[d+332>>2]=e;ia(a,d+336|0,d+320|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+304>>2]=y[c+32>>2];y[d+308>>2]=e;e=y[c+44>>2];y[d+312>>2]=y[c+40>>2];y[d+316>>2]=e;e=y[c+52>>2];y[d+288>>2]=y[c+48>>2];y[d+292>>2]=e;e=y[c+60>>2];y[d+296>>2]=y[c+56>>2];y[d+300>>2]=e;ia(a,d+304|0,d+288|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+272>>2]=y[c+16>>2];y[d+276>>2]=e;e=y[c+28>>2];y[d+280>>2]=y[c+24>>2];y[d+284>>2]=e;e=y[c+36>>2];y[d+256>>2]=y[c+32>>2];y[d+260>>2]=e;e=y[c+44>>2];y[d+264>>2]=y[c+40>>2];y[d+268>>2]=e;ia(a,d+272|0,d+256|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+240>>2]=y[c>>2];y[d+244>>2]=e;e=y[c+12>>2];y[d+248>>2]=y[c+8>>2];y[d+252>>2]=e;e=y[c+20>>2];y[d+224>>2]=y[c+16>>2];y[d+228>>2]=e;e=y[c+28>>2];y[d+232>>2]=y[c+24>>2];y[d+236>>2]=e;ia(a,d+240|0,d+224|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+208>>2]=y[d+784>>2];y[d+212>>2]=e;e=y[d+796>>2];y[d+216>>2]=y[d+792>>2];y[d+220>>2]=e;e=y[c+4>>2];y[d+192>>2]=y[c>>2];y[d+196>>2]=e;e=y[c+12>>2];y[d+200>>2]=y[c+8>>2];y[d+204>>2]=e;ia(a,d+208|0,d+192|0);e=y[d+768>>2];f=y[d+772>>2];h=y[d+776>>2];y[c+12>>2]=j^y[d+780>>2];y[c+8>>2]=h^i;y[c+4>>2]=f^x;y[c>>2]=e^o;e=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=e;e=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=e;e=y[b+4>>2];y[d+176>>2]=y[b>>2];y[d+180>>2]=e;e=y[b+12>>2];y[d+184>>2]=y[b+8>>2];y[d+188>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;ia(a,d+176|0,d+160|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[b+4>>2];y[d+128>>2]=y[b>>2];y[d+132>>2]=e;e=y[b+12>>2];y[d+136>>2]=y[b+8>>2];y[d+140>>2]=e;ia(a,d+144|0,d+128|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+16>>2]=y[d+784>>2];y[d+20>>2]=e;e=y[d+796>>2];y[d+24>>2]=y[d+792>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+768>>2];e=y[d+772>>2];f=y[d+776>>2];y[c+12>>2]=n^y[d+780>>2];y[c+8>>2]=f^m;y[c+4>>2]=e^l;y[c>>2]=a^k;g=g+1|0;if((g|0)!=4){continue}break}T=d+800|0;}function Da(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=T-16|0;T=k;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{if(a>>>0<=244){f=y[10173];g=a>>>0<11?16:a+11&504;a=g>>>3|0;b=f>>>a|0;if(b&3){e=a+((b^-1)&1)|0;b=e<<3;a=b+40732|0;c=y[b+40740>>2];d=y[c+8>>2];k:{if((a|0)==(d|0)){m=40692,n=Bi(-2,e)&f,y[m>>2]=n;break k}y[d+12>>2]=a;y[a+8>>2]=d;}a=c+8|0;y[c+4>>2]=b|3;b=b+c|0;y[b+4>>2]=y[b+4>>2]|1;break a}i=y[10175];if(i>>>0>=g>>>0){break j}if(b){c=2<>2];d=y[c+8>>2];l:{if((b|0)==(d|0)){f=Bi(-2,e)&f;y[10173]=f;break l}y[d+12>>2]=b;y[b+8>>2]=d;}y[c+4>>2]=g|3;h=c+g|0;e=a-g|0;y[h+4>>2]=e|1;y[a+c>>2]=e;if(i){a=(i&-8)+40732|0;d=y[10178];b=1<<(i>>>3);m:{if(!(b&f)){y[10173]=b|f;b=a;break m}b=y[a+8>>2];}y[a+8>>2]=d;y[b+12>>2]=d;y[d+12>>2]=a;y[d+8>>2]=b;}a=c+8|0;y[10178]=h;y[10175]=e;break a}l=y[10174];if(!l){break j}b=y[(zi(l)<<2)+40996>>2];e=(y[b+4>>2]&-8)-g|0;c=b;while(1){n:{a=y[b+16>>2];if(!a){a=y[b+20>>2];if(!a){break n}}d=(y[a+4>>2]&-8)-g|0;b=d>>>0>>0;e=b?d:e;c=b?a:c;b=a;continue}break}j=y[c+24>>2];a=y[c+12>>2];if((c|0)!=(a|0)){b=y[c+8>>2];y[b+12>>2]=a;y[a+8>>2]=b;break b}b=y[c+20>>2];if(b){d=c+20|0;}else {b=y[c+16>>2];if(!b){break i}d=c+16|0;}while(1){h=d;a=b;d=a+20|0;b=y[a+20>>2];if(b){continue}d=a+16|0;b=y[a+16>>2];if(b){continue}break}y[h>>2]=0;break b}g=-1;if(a>>>0>4294967231){break j}b=a+11|0;g=b&-8;h=y[10174];if(!h){break j}i=31;e=0-g|0;if(a>>>0<=16777204){a=H(b>>>8|0);i=((g>>>38-a&1)-(a<<1)|0)+62|0;}b=y[(i<<2)+40996>>2];o:{p:{q:{if(!b){a=0;break q}a=0;c=g<<((i|0)!=31?25-(i>>>1|0)|0:0);while(1){r:{f=(y[b+4>>2]&-8)-g|0;if(f>>>0>=e>>>0){break r}d=b;e=f;if(e){break r}e=0;a=b;break p}f=y[b+20>>2];b=y[((c>>>29&4)+b|0)+16>>2];a=f?(f|0)==(b|0)?a:f:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<>2];}if(!a){break o}}while(1){c=(y[a+4>>2]&-8)-g|0;b=c>>>0>>0;e=b?c:e;d=b?a:d;b=y[a+16>>2];if(b){a=b;}else {a=y[a+20>>2];}if(a){continue}break}}if(!d|y[10175]-g>>>0<=e>>>0){break j}i=y[d+24>>2];a=y[d+12>>2];if((d|0)!=(a|0)){b=y[d+8>>2];y[b+12>>2]=a;y[a+8>>2]=b;break c}b=y[d+20>>2];if(b){c=d+20|0;}else {b=y[d+16>>2];if(!b){break h}c=d+16|0;}while(1){f=c;a=b;c=a+20|0;b=y[a+20>>2];if(b){continue}c=a+16|0;b=y[a+16>>2];if(b){continue}break}y[f>>2]=0;break c}d=y[10175];if(d>>>0>=g>>>0){a=y[10178];b=d-g|0;s:{if(b>>>0>=16){c=a+g|0;y[c+4>>2]=b|1;y[a+d>>2]=b;y[a+4>>2]=g|3;break s}y[a+4>>2]=d|3;b=a+d|0;y[b+4>>2]=y[b+4>>2]|1;b=0;c=0;}y[10175]=b;y[10178]=c;a=a+8|0;break a}c=y[10176];if(c>>>0>g>>>0){b=c-g|0;y[10176]=b;a=y[10179];c=a+g|0;y[10179]=c;y[c+4>>2]=b|1;y[a+4>>2]=g|3;a=a+8|0;break a}a=0;e=g+47|0;if(y[10291]){b=y[10293];}else {y[10294]=-1;y[10295]=-1;y[10292]=4096;y[10293]=4096;y[10291]=k+12&-16^1431655768;y[10296]=0;y[10284]=0;b=4096;}f=e+b|0;h=0-b|0;b=f&h;if(b>>>0<=g>>>0){break a}i=y[10283];if(i){j=y[10281];d=j+b|0;if(d>>>0<=j>>>0|d>>>0>i>>>0){break a}}t:{if(!(z[41136]&4)){u:{v:{w:{x:{d=y[10179];if(d){a=41140;while(1){i=y[a>>2];if(i>>>0<=d>>>0&d>>>0>2]>>>0){break x}a=y[a+8>>2];if(a){continue}break}}c=lb(0);if((c|0)==-1){break u}f=b;a=y[10292];d=a-1|0;if(d&c){f=(b-c|0)+(c+d&0-a)|0;}if(f>>>0<=g>>>0){break u}d=y[10283];if(d){h=y[10281];a=h+f|0;if(a>>>0<=h>>>0|a>>>0>d>>>0){break u}}a=lb(f);if((c|0)!=(a|0)){break w}break t}f=h&f-c;c=lb(f);if((c|0)==(y[a>>2]+y[a+4>>2]|0)){break v}a=c;}if((a|0)==-1){break u}if(g+48>>>0<=f>>>0){c=a;break t}c=y[10293];c=c+(e-f|0)&0-c;if((lb(c)|0)==-1){break u}f=c+f|0;c=a;break t}if((c|0)!=-1){break t}}y[10284]=y[10284]|4;}c=lb(b);a=lb(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break e}f=a-c|0;if(f>>>0<=g+40>>>0){break e}}a=y[10281]+f|0;y[10281]=a;if(a>>>0>B[10282]){y[10282]=a;}y:{e=y[10179];if(e){a=41140;while(1){b=y[a>>2];d=y[a+4>>2];if((b+d|0)==(c|0)){break y}a=y[a+8>>2];if(a){continue}break}break g}a=y[10177];if(!(a>>>0<=c>>>0?a:0)){y[10177]=c;}a=0;y[10286]=f;y[10285]=c;y[10181]=-1;y[10182]=y[10291];y[10288]=0;while(1){b=a<<3;d=b+40732|0;y[b+40740>>2]=d;y[b+40744>>2]=d;a=a+1|0;if((a|0)!=32){continue}break}a=f-40|0;b=-8-c&7;d=a-b|0;y[10176]=d;b=b+c|0;y[10179]=b;y[b+4>>2]=d|1;y[(a+c|0)+4>>2]=40;y[10180]=y[10295];break f}if(y[a+12>>2]&8|(c>>>0<=e>>>0|b>>>0>e>>>0)){break g}y[a+4>>2]=d+f;a=-8-e&7;b=a+e|0;y[10179]=b;c=y[10176]+f|0;a=c-a|0;y[10176]=a;y[b+4>>2]=a|1;y[(c+e|0)+4>>2]=40;y[10180]=y[10295];break f}a=0;break b}a=0;break c}if(B[10177]>c>>>0){y[10177]=c;}d=c+f|0;a=41140;z:{while(1){b=y[a>>2];if((b|0)!=(d|0)){a=y[a+8>>2];if(a){continue}break z}break}if(!(z[a+12|0]&8)){break d}}a=41140;while(1){A:{b=y[a>>2];if(b>>>0<=e>>>0){d=b+y[a+4>>2]|0;if(d>>>0>e>>>0){break A}}a=y[a+8>>2];continue}break}a=f-40|0;b=-8-c&7;h=a-b|0;y[10176]=h;b=b+c|0;y[10179]=b;y[b+4>>2]=h|1;y[(a+c|0)+4>>2]=40;y[10180]=y[10295];a=(d+(39-d&7)|0)-47|0;b=a>>>0>>0?e:a;y[b+4>>2]=27;a=y[10288];y[b+16>>2]=y[10287];y[b+20>>2]=a;a=y[10286];y[b+8>>2]=y[10285];y[b+12>>2]=a;y[10287]=b+8;y[10286]=f;y[10285]=c;y[10288]=0;a=b+24|0;while(1){y[a+4>>2]=7;c=a+8|0;a=a+4|0;if(c>>>0>>0){continue}break}if((b|0)==(e|0)){break f}y[b+4>>2]=y[b+4>>2]&-2;c=b-e|0;y[e+4>>2]=c|1;y[b>>2]=c;B:{if(c>>>0<=255){a=(c&248)+40732|0;b=y[10173];c=1<<(c>>>3);C:{if(!(b&c)){y[10173]=b|c;b=a;break C}b=y[a+8>>2];}y[a+8>>2]=e;y[b+12>>2]=e;d=8;c=12;break B}a=31;if(c>>>0<=16777215){a=H(c>>>8|0);a=(c>>>38-a&1|a<<1)^62;}y[e+28>>2]=a;y[e+16>>2]=0;y[e+20>>2]=0;b=(a<<2)+40996|0;D:{d=y[10174];f=1<>2]=e;break E}a=c<<((a|0)!=31?25-(a>>>1|0)|0:0);d=y[b>>2];while(1){b=d;if((c|0)==(y[b+4>>2]&-8)){break D}d=a>>>29|0;a=a<<1;f=(d&4)+b|0;d=y[f+16>>2];if(d){continue}break}y[f+16>>2]=e;}y[e+24>>2]=b;b=e;a=b;d=12;c=8;break B}a=y[b+8>>2];y[a+12>>2]=e;y[b+8>>2]=e;y[e+8>>2]=a;a=0;d=12;c=24;}y[e+d>>2]=b;y[c+e>>2]=a;}a=y[10176];if(a>>>0<=g>>>0){break e}b=a-g|0;y[10176]=b;a=y[10179];c=a+g|0;y[10179]=c;y[c+4>>2]=b|1;y[a+4>>2]=g|3;a=a+8|0;break a}y[10172]=48;a=0;break a}y[a>>2]=c;y[a+4>>2]=y[a+4>>2]+f;i=(-8-c&7)+c|0;y[i+4>>2]=g|3;f=b+(-8-b&7)|0;e=g+i|0;h=f-e|0;F:{if(y[10179]==(f|0)){y[10179]=e;a=y[10176]+h|0;y[10176]=a;y[e+4>>2]=a|1;break F}if(y[10178]==(f|0)){y[10178]=e;a=y[10175]+h|0;y[10175]=a;y[e+4>>2]=a|1;y[a+e>>2]=a;break F}a=y[f+4>>2];if((a&3)==1){j=a&-8;c=y[f+12>>2];G:{if(a>>>0<=255){b=y[f+8>>2];if((b|0)==(c|0)){m=40692,n=y[10173]&Bi(-2,a>>>3|0),y[m>>2]=n;break G}y[b+12>>2]=c;y[c+8>>2]=b;break G}g=y[f+24>>2];H:{if((c|0)!=(f|0)){a=y[f+8>>2];y[a+12>>2]=c;y[c+8>>2]=a;break H}I:{a=y[f+20>>2];if(a){b=f+20|0;}else {a=y[f+16>>2];if(!a){break I}b=f+16|0;}while(1){d=b;c=a;b=a+20|0;a=y[a+20>>2];if(a){continue}b=c+16|0;a=y[c+16>>2];if(a){continue}break}y[d>>2]=0;break H}c=0;}if(!g){break G}a=y[f+28>>2];b=a<<2;J:{if(y[b+40996>>2]==(f|0)){y[b+40996>>2]=c;if(c){break J}m=40696,n=y[10174]&Bi(-2,a),y[m>>2]=n;break G}K:{if(y[g+16>>2]==(f|0)){y[g+16>>2]=c;break K}y[g+20>>2]=c;}if(!c){break G}}y[c+24>>2]=g;a=y[f+16>>2];if(a){y[c+16>>2]=a;y[a+24>>2]=c;}a=y[f+20>>2];if(!a){break G}y[c+20>>2]=a;y[a+24>>2]=c;}h=h+j|0;f=f+j|0;a=y[f+4>>2];}y[f+4>>2]=a&-2;y[e+4>>2]=h|1;y[e+h>>2]=h;if(h>>>0<=255){a=(h&248)+40732|0;b=y[10173];c=1<<(h>>>3);L:{if(!(b&c)){y[10173]=b|c;b=a;break L}b=y[a+8>>2];}y[a+8>>2]=e;y[b+12>>2]=e;y[e+12>>2]=a;y[e+8>>2]=b;break F}c=31;if(h>>>0<=16777215){a=H(h>>>8|0);c=(h>>>38-a&1|a<<1)^62;}y[e+28>>2]=c;y[e+16>>2]=0;y[e+20>>2]=0;a=(c<<2)+40996|0;M:{b=y[10174];d=1<>2]=e;break N}c=h<<((c|0)!=31?25-(c>>>1|0)|0:0);b=y[a>>2];while(1){a=b;if((y[a+4>>2]&-8)==(h|0)){break M}b=c>>>29|0;c=c<<1;d=(b&4)+a|0;b=y[d+16>>2];if(b){continue}break}y[d+16>>2]=e;}y[e+24>>2]=a;y[e+12>>2]=e;y[e+8>>2]=e;break F}b=y[a+8>>2];y[b+12>>2]=e;y[a+8>>2]=e;y[e+24>>2]=0;y[e+12>>2]=a;y[e+8>>2]=b;}a=i+8|0;break a}O:{if(!i){break O}b=y[d+28>>2];c=b<<2;P:{if(y[c+40996>>2]==(d|0)){y[c+40996>>2]=a;if(a){break P}h=Bi(-2,b)&h;y[10174]=h;break O}Q:{if(y[i+16>>2]==(d|0)){y[i+16>>2]=a;break Q}y[i+20>>2]=a;}if(!a){break O}}y[a+24>>2]=i;b=y[d+16>>2];if(b){y[a+16>>2]=b;y[b+24>>2]=a;}b=y[d+20>>2];if(!b){break O}y[a+20>>2]=b;y[b+24>>2]=a;}R:{if(e>>>0<=15){a=e+g|0;y[d+4>>2]=a|3;a=a+d|0;y[a+4>>2]=y[a+4>>2]|1;break R}y[d+4>>2]=g|3;f=d+g|0;y[f+4>>2]=e|1;y[e+f>>2]=e;if(e>>>0<=255){a=(e&248)+40732|0;b=y[10173];c=1<<(e>>>3);S:{if(!(b&c)){y[10173]=b|c;b=a;break S}b=y[a+8>>2];}y[a+8>>2]=f;y[b+12>>2]=f;y[f+12>>2]=a;y[f+8>>2]=b;break R}a=31;if(e>>>0<=16777215){a=H(e>>>8|0);a=(e>>>38-a&1|a<<1)^62;}y[f+28>>2]=a;y[f+16>>2]=0;y[f+20>>2]=0;b=(a<<2)+40996|0;T:{c=1<>2]=f;y[f+24>>2]=b;break U}a=e<<((a|0)!=31?25-(a>>>1|0)|0:0);b=y[b>>2];while(1){c=b;if((y[b+4>>2]&-8)==(e|0)){break T}h=a>>>29|0;a=a<<1;h=b+(h&4)|0;b=y[h+16>>2];if(b){continue}break}y[h+16>>2]=f;y[f+24>>2]=c;}y[f+12>>2]=f;y[f+8>>2]=f;break R}a=y[c+8>>2];y[a+12>>2]=f;y[c+8>>2]=f;y[f+24>>2]=0;y[f+12>>2]=c;y[f+8>>2]=a;}a=d+8|0;break a}V:{if(!j){break V}b=y[c+28>>2];d=b<<2;W:{if(y[d+40996>>2]==(c|0)){y[d+40996>>2]=a;if(a){break W}m=40696,n=Bi(-2,b)&l,y[m>>2]=n;break V}X:{if(y[j+16>>2]==(c|0)){y[j+16>>2]=a;break X}y[j+20>>2]=a;}if(!a){break V}}y[a+24>>2]=j;b=y[c+16>>2];if(b){y[a+16>>2]=b;y[b+24>>2]=a;}b=y[c+20>>2];if(!b){break V}y[a+20>>2]=b;y[b+24>>2]=a;}Y:{if(e>>>0<=15){a=e+g|0;y[c+4>>2]=a|3;a=a+c|0;y[a+4>>2]=y[a+4>>2]|1;break Y}y[c+4>>2]=g|3;h=c+g|0;y[h+4>>2]=e|1;y[e+h>>2]=e;if(i){a=(i&-8)+40732|0;d=y[10178];b=1<<(i>>>3);Z:{if(!(b&f)){y[10173]=b|f;b=a;break Z}b=y[a+8>>2];}y[a+8>>2]=d;y[b+12>>2]=d;y[d+12>>2]=a;y[d+8>>2]=b;}y[10178]=h;y[10175]=e;}a=c+8|0;}T=k+16|0;return a|0}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;m=T-48|0;T=m;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);d=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);d=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=e;w[a+21|0]=e>>>8;w[a+22|0]=e>>>16;w[a+23|0]=e>>>24;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);d=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;d=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;b=z[a+31|0];w[a+31|0]=b&127;cb(m,a);S=b&128;b=T-960|0;T=b;d=b+304|0;Oc(d,m);y[b+304>>2]=y[b+304>>2]+1;bb(d,d);d=y[b+340>>2];e=Ai(d,d>>31,486662,0);d=W;l=e+16777216|0;j=l>>>0<16777216?d+1|0:d;k=e-(l&-33554432)|0;d=y[b+336>>2];c=Ai(d,d>>31,486662,0);e=W;d=y[b+332>>2];f=Ai(d,d>>31,486662,0);d=W;i=c;h=f+16777216|0;d=h>>>0<16777216?d+1|0:d;c=d>>25;d=(d&33554431)<<7|h>>>25;g=i+d|0;c=c+e|0;d=d>>>0>g>>>0?c+1|0:c;e=g+33554432|0;d=e>>>0<33554432?d+1|0:d;n=((d&67108863)<<6|e>>>26)+k|0;o=0-n|0;y[b+292>>2]=o;p=g-(e&-67108864)|0;q=0-p|0;y[b+288>>2]=q;k=f-(h&-33554432)|0;d=y[b+328>>2];e=Ai(d,d>>31,486662,0);d=W;c=y[b+324>>2];h=Ai(c,c>>31,486662,0);c=W;i=e;g=h+16777216|0;c=g>>>0<16777216?c+1|0:c;e=c>>25;f=(c&33554431)<<7|g>>>25;c=i+f|0;d=d+e|0;d=c>>>0>>0?d+1|0:d;e=c+33554432|0;d=e>>>0<33554432?d+1|0:d;r=((d&67108863)<<6|e>>>26)+k|0;t=0-r|0;y[b+284>>2]=t;u=c-(e&-67108864)|0;v=0-u|0;y[b+280>>2]=v;k=h-(g&-33554432)|0;d=y[b+320>>2];c=Ai(d,d>>31,486662,0);d=W;e=y[b+316>>2];h=Ai(e,e>>31,486662,0);e=W;i=c;g=h+16777216|0;e=g>>>0<16777216?e+1|0:e;c=e>>25;f=(e&33554431)<<7|g>>>25;e=i+f|0;d=c+d|0;d=e>>>0>>0?d+1|0:d;c=d;f=e+33554432|0;c=f>>>0<33554432?c+1|0:c;x=((c&67108863)<<6|f>>>26)+k|0;A=0-x|0;y[b+276>>2]=A;B=e-(f&-67108864)|0;C=0-B|0;y[b+272>>2]=C;i=h-(g&-33554432)|0;d=y[b+312>>2];d=Ai(d,d>>31,486662,0);k=W;e=y[b+308>>2];f=Ai(e,e>>31,486662,0);c=W;h=f+16777216|0;c=h>>>0<16777216?c+1|0:c;e=(c&33554431)<<7|h>>>25;g=e+d|0;c=(c>>25)+k|0;e=e>>>0>g>>>0?c+1|0:c;d=g+33554432|0;e=d>>>0<33554432?e+1|0:e;D=((e&67108863)<<6|d>>>26)+i|0;E=0-D|0;y[b+268>>2]=E;F=g-(d&-67108864)|0;G=0-F|0;y[b+264>>2]=G;g=f-(h&-33554432)|0;e=Ai((j&33554431)<<7|l>>>25,j>>25,19,0);d=W;f=e;c=y[b+304>>2];e=Ai(c,c>>31,486662,0);c=f+e|0;d=W+d|0;e=c>>>0>>0?d+1|0:d;d=c+33554432|0;e=d>>>0<33554432?e+1|0:e;H=((e&67108863)<<6|d>>>26)+g|0;I=0-H|0;y[b+260>>2]=I;J=c-(d&-67108864)|0;K=0-J|0;y[b+256>>2]=K;e=b+208|0;d=b+256|0;fa(e,d);ga(b+160|0,d,e);U=y[b+196>>2];V=y[b+160>>2];M=y[b+208>>2];X=y[b+164>>2];Y=y[b+168>>2];N=y[b+212>>2];O=y[b+216>>2];Z=y[b+172>>2];_=y[b+176>>2];P=y[b+220>>2];Q=y[b+224>>2];$=y[b+180>>2];aa=y[b+184>>2];i=y[b+228>>2];k=y[b+232>>2];ba=y[b+188>>2];ca=y[b+192>>2];d=y[b+244>>2];e=Ai(d,d>>31,486662,0);d=W;l=e+16777216|0;j=l>>>0<16777216?d+1|0:d;da=e-(l&-33554432)|0;d=y[b+240>>2];d=Ai(d,d>>31,486662,0);L=W;e=y[b+236>>2];f=Ai(e,e>>31,486662,0);c=W;e=d;h=f+16777216|0;c=h>>>0<16777216?c+1|0:c;d=(c&33554431)<<7|h>>>25;g=e+d|0;c=(c>>25)+L|0;d=d>>>0>g>>>0?c+1|0:c;e=g+33554432|0;d=e>>>0<33554432?d+1|0:d;c=((d&67108863)<<6|e>>>26)+da|0;y[b+244>>2]=c;y[b+388>>2]=c+(U-n|0);d=g-(e&-67108864)|0;y[b+240>>2]=d;y[b+384>>2]=d+(ca-p|0);L=f-(h&-33554432)|0;d=Ai(k,k>>31,486662,0);f=W;h=Ai(i,i>>31,486662,0);e=W;i=d;g=h+16777216|0;e=g>>>0<16777216?e+1|0:e;d=e>>25;c=(e&33554431)<<7|g>>>25;e=i+c|0;d=d+f|0;d=c>>>0>e>>>0?d+1|0:d;c=d;f=e+33554432|0;c=f>>>0<33554432?c+1|0:c;d=f;f=((c&67108863)<<6|d>>>26)+L|0;y[b+236>>2]=f;y[b+380>>2]=f+(ba-r|0);d=e-(d&-67108864)|0;y[b+232>>2]=d;y[b+376>>2]=d+(aa-u|0);k=h-(g&-33554432)|0;c=Ai(Q,Q>>31,486662,0);e=W;f=Ai(P,P>>31,486662,0);d=W;i=c;h=f+16777216|0;d=h>>>0<16777216?d+1|0:d;c=d>>25;d=(d&33554431)<<7|h>>>25;g=i+d|0;c=c+e|0;e=d>>>0>g>>>0?c+1|0:c;d=g+33554432|0;e=d>>>0<33554432?e+1|0:e;c=((e&67108863)<<6|d>>>26)+k|0;y[b+228>>2]=c;y[b+372>>2]=c+($-x|0);d=g-(d&-67108864)|0;y[b+224>>2]=d;y[b+368>>2]=d+(_-B|0);k=f-(h&-33554432)|0;d=Ai(O,O>>31,486662,0);e=W;h=Ai(N,N>>31,486662,0);c=W;i=d;g=h+16777216|0;c=g>>>0<16777216?c+1|0:c;d=c>>25;f=(c&33554431)<<7|g>>>25;c=i+f|0;e=d+e|0;e=c>>>0>>0?e+1|0:e;d=e;f=c+33554432|0;d=f>>>0<33554432?d+1|0:d;e=f;f=((d&67108863)<<6|e>>>26)+k|0;y[b+220>>2]=f;y[b+364>>2]=f+(Z-D|0);d=c-(e&-67108864)|0;y[b+216>>2]=d;y[b+360>>2]=d+(Y-F|0);g=h-(g&-33554432)|0;e=Ai((j&33554431)<<7|l>>>25,j>>25,19,0);d=W;c=e;e=Ai(M,M>>31,486662,0);c=c+e|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;e=c+33554432|0;d=e>>>0<33554432?d+1|0:d;j=((d&67108863)<<6|e>>>26)+g|0;y[b+212>>2]=j;y[b+356>>2]=j+(X-H|0);d=c-(e&-67108864)|0;y[b+208>>2]=d;y[b+352>>2]=d+(V-J|0);d=b+624|0;e=b+352|0;ga(d,e,e);ga(b,e,d);e=b+784|0;fa(e,b);fa(e,e);d=b+912|0;ga(d,b,e);e=b+576|0;fa(e,d);fa(e,e);fa(e,e);fa(e,e);c=b+528|0;ga(c,d,e);fa(c,c);fa(c,c);ga(c,c,b);d=y[b+564>>2];y[b+512>>2]=y[b+560>>2];y[b+516>>2]=d;d=y[b+556>>2];y[b+504>>2]=y[b+552>>2];y[b+508>>2]=d;d=y[b+548>>2];y[b+496>>2]=y[b+544>>2];y[b+500>>2]=d;d=y[b+540>>2];y[b+488>>2]=y[b+536>>2];y[b+492>>2]=d;d=y[b+532>>2];y[b+480>>2]=y[b+528>>2];y[b+484>>2]=d;fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);d=b+480|0;ga(c,c,d);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,d);d=y[b+564>>2];y[b+464>>2]=y[b+560>>2];y[b+468>>2]=d;d=y[b+556>>2];y[b+456>>2]=y[b+552>>2];y[b+460>>2]=d;d=y[b+548>>2];y[b+448>>2]=y[b+544>>2];y[b+452>>2]=d;d=y[b+540>>2];y[b+440>>2]=y[b+536>>2];y[b+444>>2]=d;d=y[b+532>>2];y[b+432>>2]=y[b+528>>2];y[b+436>>2]=d;fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);e=b+432|0;ga(c,c,e);d=y[b+564>>2];y[b+464>>2]=y[b+560>>2];y[b+468>>2]=d;d=y[b+556>>2];y[b+456>>2]=y[b+552>>2];y[b+460>>2]=d;d=y[b+548>>2];y[b+448>>2]=y[b+544>>2];y[b+452>>2]=d;d=y[b+540>>2];y[b+440>>2]=y[b+536>>2];y[b+444>>2]=d;d=y[b+532>>2];y[b+432>>2]=y[b+528>>2];y[b+436>>2]=d;fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,e);d=y[b+564>>2];y[b+464>>2]=y[b+560>>2];y[b+468>>2]=d;d=y[b+556>>2];y[b+456>>2]=y[b+552>>2];y[b+460>>2]=d;d=y[b+548>>2];y[b+448>>2]=y[b+544>>2];y[b+452>>2]=d;d=y[b+540>>2];y[b+440>>2]=y[b+536>>2];y[b+444>>2]=d;d=y[b+532>>2];y[b+432>>2]=y[b+528>>2];y[b+436>>2]=d;while(1){d=b+528|0;fa(d,d);R=R+1|0;if((R|0)!=120){continue}break}ga(d,d,b+432|0);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);ga(d,d,b+480|0);fa(d,d);fa(d,d);fa(d,d);ga(d,d,b);fa(d,d);pa(b+400|0,d);d=0-(w[b+401|0]&1)|0;i=o^d&(n^o);y[b+660>>2]=i;k=q^d&(p^q);y[b+656>>2]=k;l=t^d&(r^t);y[b+652>>2]=l;f=d&(u^v)^v;y[b+648>>2]=f;h=d&(x^A)^A;y[b+644>>2]=h;g=d&(B^C)^C;y[b+640>>2]=g;j=d&(D^E)^E;y[b+636>>2]=j;c=d&(F^G)^G;y[b+632>>2]=c;e=d&(H^I)^I;y[b+628>>2]=e;d=(d&(J^K)^K)-(d&486662)|0;y[b+624>>2]=d+1;y[b+820>>2]=i;y[b+816>>2]=k;y[b+812>>2]=l;y[b+808>>2]=f;y[b+804>>2]=h;y[b+800>>2]=g;y[b+796>>2]=j;y[b+792>>2]=c;y[b+788>>2]=e;y[b+784>>2]=d-1;bb(b,b+624|0);d=b+912|0;ga(d,b+784|0,b);pa(a,d);w[a+31|0]=z[a+31|0]|S;if(ab(b,a)){Ic();s();}d=y[b+36>>2];y[b+816>>2]=y[b+32>>2];y[b+820>>2]=d;d=y[b+28>>2];y[b+808>>2]=y[b+24>>2];y[b+812>>2]=d;d=y[b+20>>2];y[b+800>>2]=y[b+16>>2];y[b+804>>2]=d;d=y[b+12>>2];y[b+792>>2]=y[b+8>>2];y[b+796>>2]=d;d=y[b+4>>2];y[b+784>>2]=y[b>>2];y[b+788>>2]=d;d=y[b+44>>2];y[b+824>>2]=y[b+40>>2];y[b+828>>2]=d;d=y[b+52>>2];y[b+832>>2]=y[b+48>>2];y[b+836>>2]=d;d=y[b+60>>2];y[b+840>>2]=y[b+56>>2];y[b+844>>2]=d;d=y[b+68>>2];y[b+848>>2]=y[b+64>>2];y[b+852>>2]=d;d=y[b+76>>2];y[b+856>>2]=y[b+72>>2];y[b+860>>2]=d;d=y[b+116>>2];y[b+896>>2]=y[b+112>>2];y[b+900>>2]=d;d=y[b+108>>2];y[b+888>>2]=y[b+104>>2];y[b+892>>2]=d;d=y[b+100>>2];y[b+880>>2]=y[b+96>>2];y[b+884>>2]=d;d=y[b+92>>2];y[b+872>>2]=y[b+88>>2];y[b+876>>2]=d;d=y[b+84>>2];y[b+864>>2]=y[b+80>>2];y[b+868>>2]=d;f=b+624|0;h=b+784|0;xa(f,h);g=b+744|0;ga(h,f,g);e=b+824|0;c=b+664|0;j=b+704|0;ga(e,c,j);d=b+864|0;ga(d,j,g);xa(f,h);ga(h,f,g);ga(e,c,j);ga(d,j,g);xa(f,h);ga(b,f,g);e=b+40|0;ga(e,c,j);d=b+80|0;ga(d,j,g);ga(b+120|0,f,c);bb(f,d);ga(h,b,f);d=b+912|0;ga(d,e,f);pa(a,d);pa(b+576|0,h);w[a+31|0]=z[a+31|0]^z[b+576|0]<<7;T=b+960|0;T=m+48|0;}function pc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0;I=T-592|0;T=I;j=-1;h=a+32|0;a:{if(!Jc(h)){break a}if(yb(a)){break a}if(!dc(e)){break a}if(yb(e)){break a}k=I+128|0;if(Qc(k,e)){break a}j=I+384|0;Za(j);if(f){va(j,39696,34,0);}va(j,a,32,0);va(j,e,32,0);va(j,b,c,d);d=I+320|0;Ca(j,d);Pa(d);j=I+8|0;c=h;e=0;b=0;g=T-2272|0;T=g;while(1){f=g+2016|0;h=z[d+(e>>>3|0)|0];w[f+e|0]=h>>>(e&6)&1;i=f;f=e|1;w[i+f|0]=h>>>(f&7)&1;e=e+2|0;if((e|0)!=256){continue}break}f=254;while(1){d=b;b=d+1|0;e=g+2016|0;n=e+d|0;b:{if(!z[n|0]|d>>>0>254){break b}l=b+e|0;e=w[l|0];c:{if(!e){break c}i=e<<1;h=w[n|0];e=i+h|0;if((e|0)<=15){w[n|0]=e;w[l|0]=0;break c}e=h-i|0;if((e|0)<-15){break b}w[n|0]=e;e=b;while(1){h=(g+2016|0)+e|0;if(!z[h|0]){w[h|0]=1;break c}w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break}}if(!f){break b}e=d+2|0;r=e+(g+2016|0)|0;h=w[r|0];d:{if(!h){break d}l=h<<2;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break d}break}w[h|0]=1;break d}w[n|0]=h;w[r|0]=0;}m=(f>>>0>=5?5:f)+1|0;if((m|0)==2){break b}e=d+3|0;r=e+(g+2016|0)|0;h=w[r|0];e:{if(!h){break e}l=h<<3;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break e}break}w[h|0]=1;break e}w[n|0]=h;w[r|0]=0;}if((m|0)==3){break b}e=d+4|0;r=e+(g+2016|0)|0;h=w[r|0];f:{if(!h){break f}l=h<<4;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break f}break}w[h|0]=1;break f}w[n|0]=h;w[r|0]=0;}if((m|0)==4){break b}e=d+5|0;r=e+(g+2016|0)|0;h=w[r|0];g:{if(!h){break g}l=h<<5;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break g}break}w[h|0]=1;break g}w[n|0]=h;w[r|0]=0;}if((m|0)==5){break b}e=d+6|0;l=e+(g+2016|0)|0;d=w[l|0];if(!d){break b}i=d<<6;h=w[n|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break b}w[n|0]=d;while(1){d=(g+2016|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break b}break}w[d|0]=1;break b}w[n|0]=d;w[l|0]=0;}f=f-1|0;if((b|0)!=256){continue}break}e=0;while(1){b=g+1760|0;d=z[c+(e>>>3|0)|0];w[b+e|0]=d>>>(e&6)&1;f=b;b=e|1;w[f+b|0]=d>>>(b&7)&1;e=e+2|0;if((e|0)!=256){continue}break}b=0;f=254;while(1){c=b;b=b+1|0;d=g+1760|0;m=d+c|0;h:{if(!z[m|0]|c>>>0>254){break h}i=b+d|0;d=w[i|0];i:{if(!d){break i}h=d<<1;e=w[m|0];d=h+e|0;if((d|0)<=15){w[m|0]=d;w[i|0]=0;break i}d=e-h|0;if((d|0)<-15){break h}w[m|0]=d;e=b;while(1){d=(g+1760|0)+e|0;if(!z[d|0]){w[d|0]=1;break i}w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break}}if(!f){break h}e=c+2|0;l=e+(g+1760|0)|0;d=w[l|0];j:{if(!d){break j}i=d<<2;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break j}break}w[d|0]=1;break j}w[m|0]=d;w[l|0]=0;}r=(f>>>0>=5?5:f)+1|0;if((r|0)==2){break h}e=c+3|0;l=e+(g+1760|0)|0;d=w[l|0];k:{if(!d){break k}i=d<<3;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break k}break}w[d|0]=1;break k}w[m|0]=d;w[l|0]=0;}if((r|0)==3){break h}e=c+4|0;l=e+(g+1760|0)|0;d=w[l|0];l:{if(!d){break l}i=d<<4;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break l}break}w[d|0]=1;break l}w[m|0]=d;w[l|0]=0;}if((r|0)==4){break h}e=c+5|0;l=e+(g+1760|0)|0;d=w[l|0];m:{if(!d){break m}i=d<<5;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break m}break}w[d|0]=1;break m}w[m|0]=d;w[l|0]=0;}if((r|0)==5){break h}e=c+6|0;i=e+(g+1760|0)|0;c=w[i|0];if(!c){break h}h=c<<6;d=w[m|0];c=h+d|0;if((c|0)>=16){c=d-h|0;if((c|0)<-15){break h}w[m|0]=c;while(1){c=(g+1760|0)+e|0;if(z[c|0]){w[c|0]=0;e=e+1|0;if((e|0)!=256){continue}break h}break}w[c|0]=1;break h}w[m|0]=c;w[i|0]=0;}f=f-1|0;if((b|0)!=256){continue}break}d=g+480|0;qa(d,k);b=y[k+36>>2];y[g+192>>2]=y[k+32>>2];y[g+196>>2]=b;b=y[k+28>>2];y[g+184>>2]=y[k+24>>2];y[g+188>>2]=b;b=y[k+20>>2];y[g+176>>2]=y[k+16>>2];y[g+180>>2]=b;b=y[k+12>>2];y[g+168>>2]=y[k+8>>2];y[g+172>>2]=b;b=y[k+4>>2];y[g+160>>2]=y[k>>2];y[g+164>>2]=b;b=y[k+44>>2];y[g+200>>2]=y[k+40>>2];y[g+204>>2]=b;b=y[k+52>>2];y[g+208>>2]=y[k+48>>2];y[g+212>>2]=b;b=y[k+60>>2];y[g+216>>2]=y[k+56>>2];y[g+220>>2]=b;c=k- -64|0;b=y[c+4>>2];y[g+224>>2]=y[c>>2];y[g+228>>2]=b;b=y[k+76>>2];y[g+232>>2]=y[k+72>>2];y[g+236>>2]=b;b=y[k+84>>2];y[g+240>>2]=y[k+80>>2];y[g+244>>2]=b;b=y[k+92>>2];y[g+248>>2]=y[k+88>>2];y[g+252>>2]=b;b=y[k+100>>2];y[g+256>>2]=y[k+96>>2];y[g+260>>2]=b;b=y[k+108>>2];y[g+264>>2]=y[k+104>>2];y[g+268>>2]=b;b=y[k+116>>2];y[g+272>>2]=y[k+112>>2];y[g+276>>2]=b;e=g+320|0;c=g+160|0;xa(e,c);o=g+440|0;ga(g,e,o);p=g+360|0;q=g+400|0;ga(g+40|0,p,q);ga(g+80|0,q,o);ga(g+120|0,e,p);sa(e,g,d);ga(c,e,o);t=g+200|0;ga(t,p,q);u=g+240|0;ga(u,q,o);s=g+280|0;ga(s,e,p);b=g+640|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+800|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+960|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+1120|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+1280|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+1440|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);qa(g+1600|0,c);y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;y[j+8>>2]=0;y[j+12>>2]=0;y[j>>2]=0;y[j+4>>2]=0;y[j+44>>2]=0;y[j+48>>2]=0;L=j+40|0;y[L>>2]=1;y[j+52>>2]=0;y[j+56>>2]=0;y[j+60>>2]=0;y[j+64>>2]=0;y[j+68>>2]=0;y[j+72>>2]=0;y[j+84>>2]=0;y[j+88>>2]=0;y[j+76>>2]=0;y[j+80>>2]=1;y[j+92>>2]=0;y[j+96>>2]=0;y[j+100>>2]=0;y[j+104>>2]=0;y[j+108>>2]=0;y[j+112>>2]=0;y[j+116>>2]=0;S=j+80|0;f=255;while(1){n:{o:{b=g+2016|0;p:{if(z[b+f|0]){break p}c=g+1760|0;if(z[c+f|0]){break p}d=b;b=f-1|0;if(!(z[d+b|0]|z[b+c|0])){break o}f=b;}if((f|0)<0){break n}while(1){d=g+320|0;xa(d,j);b=f;e=w[b+(g+2016|0)|0];q:{if((e|0)>0){c=g+160|0;ga(c,d,o);ga(t,p,q);ga(u,q,o);ga(s,d,p);sa(d,c,(g+480|0)+E((e&254)>>>1|0,160)|0);break q}if((e|0)>=0){break q}c=g+160|0;d=g+320|0;ga(c,d,o);ga(t,p,q);ga(u,q,o);ga(s,d,p);Hb(d,c,(g+480|0)+E((0-e&254)>>>1|0,160)|0);}J=w[b+(g+1760|0)|0];r:{if((J|0)>0){c=g+160|0;d=g+320|0;ga(c,d,o);ga(t,p,q);ga(u,q,o);ga(s,d,p);fc(d,c,E((J&254)>>>1|0,120)+1728|0);break r}if((J|0)>=0){break r}K=g+320|0;ga(g+160|0,K,o);ga(t,p,q);ga(u,q,o);ga(s,K,p);v=y[g+160>>2];x=y[g+200>>2];A=y[g+164>>2];B=y[g+204>>2];C=y[g+168>>2];D=y[g+208>>2];F=y[g+172>>2];G=y[g+212>>2];H=y[g+176>>2];k=y[g+216>>2];n=y[g+180>>2];m=y[g+220>>2];r=y[g+184>>2];l=y[g+224>>2];i=y[g+188>>2];h=y[g+228>>2];f=y[g+192>>2];e=y[g+232>>2];d=y[g+236>>2];c=y[g+196>>2];y[g+396>>2]=d-c;y[g+392>>2]=e-f;y[g+388>>2]=h-i;y[g+384>>2]=l-r;y[g+380>>2]=m-n;y[g+376>>2]=k-H;y[g+372>>2]=G-F;y[g+368>>2]=D-C;y[g+364>>2]=B-A;y[g+360>>2]=x-v;y[g+356>>2]=c+d;y[g+352>>2]=e+f;y[g+348>>2]=h+i;y[g+344>>2]=l+r;y[g+340>>2]=m+n;y[g+336>>2]=k+H;y[g+332>>2]=F+G;y[g+328>>2]=C+D;y[g+324>>2]=A+B;y[g+320>>2]=v+x;c=E((0-J&254)>>>1|0,120)+1728|0;ga(q,K,c+40|0);ga(p,p,c);ga(o,c+80|0,s);U=y[g+276>>2];V=y[g+272>>2];J=y[g+268>>2];K=y[g+264>>2];r=y[g+260>>2];l=y[g+256>>2];i=y[g+252>>2];h=y[g+248>>2];f=y[g+244>>2];e=y[g+240>>2];M=y[g+360>>2];N=y[g+400>>2];O=y[g+364>>2];P=y[g+404>>2];Q=y[g+368>>2];R=y[g+408>>2];v=y[g+372>>2];x=y[g+412>>2];A=y[g+376>>2];B=y[g+416>>2];C=y[g+380>>2];D=y[g+420>>2];F=y[g+384>>2];G=y[g+424>>2];H=y[g+388>>2];k=y[g+428>>2];n=y[g+392>>2];m=y[g+432>>2];d=y[g+396>>2];c=y[g+436>>2];y[g+396>>2]=d+c;y[g+392>>2]=m+n;y[g+388>>2]=k+H;y[g+384>>2]=F+G;y[g+380>>2]=C+D;y[g+376>>2]=A+B;y[g+372>>2]=v+x;y[g+368>>2]=Q+R;y[g+364>>2]=O+P;y[g+360>>2]=M+N;y[g+356>>2]=c-d;y[g+352>>2]=m-n;y[g+348>>2]=k-H;y[g+344>>2]=G-F;y[g+340>>2]=D-C;y[g+336>>2]=B-A;y[g+332>>2]=x-v;y[g+328>>2]=R-Q;y[g+324>>2]=P-O;y[g+320>>2]=N-M;v=e<<1;x=y[g+440>>2];y[g+400>>2]=v-x;A=f<<1;B=y[g+444>>2];y[g+404>>2]=A-B;C=h<<1;D=y[g+448>>2];y[g+408>>2]=C-D;F=i<<1;G=y[g+452>>2];y[g+412>>2]=F-G;H=l<<1;k=y[g+456>>2];y[g+416>>2]=H-k;n=r<<1;m=y[g+460>>2];y[g+420>>2]=n-m;r=K<<1;l=y[g+464>>2];y[g+424>>2]=r-l;i=J<<1;h=y[g+468>>2];y[g+428>>2]=i-h;f=V<<1;e=y[g+472>>2];y[g+432>>2]=f-e;d=U<<1;c=y[g+476>>2];y[g+436>>2]=d-c;y[g+440>>2]=v+x;y[g+444>>2]=A+B;y[g+448>>2]=C+D;y[g+452>>2]=F+G;y[g+456>>2]=k+H;y[g+460>>2]=m+n;y[g+464>>2]=l+r;y[g+468>>2]=h+i;y[g+472>>2]=e+f;y[g+476>>2]=c+d;}ga(j,g+320|0,o);ga(L,p,q);ga(S,q,o);f=b-1|0;if((b|0)>0){continue}break}break n}f=f-2|0;if(b){continue}}break}T=g+2272|0;b=I+288|0;Wa(b,j);j=(W=-1,X=kb(b,a),Y=(a|0)==(b|0),Y?W:X)|$a(a,b,32);}T=I+592|0;return j}function ph(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;g=T-256|0;T=g;za=-1;a:{if(yb(b)){break a}c=g+96|0;if(Qc(c,b)){break a}if(!ec(c)){break a}za=0;K=y[g+172>>2];y[g+36>>2]=0-K;s=y[g+168>>2];y[g+32>>2]=0-s;L=y[g+164>>2];y[g+28>>2]=0-L;t=y[g+160>>2];y[g+24>>2]=0-t;M=y[g+156>>2];y[g+20>>2]=0-M;u=y[g+152>>2];y[g+16>>2]=0-u;N=y[g+148>>2];y[g+12>>2]=0-N;v=y[g+144>>2];y[g+8>>2]=0-v;O=y[g+140>>2];y[g+4>>2]=0-O;e=y[g+136>>2];y[g>>2]=1-e;bb(g,g);w=y[g+4>>2];H=w>>31;x=M<<1;ba=x>>31;b=Ai(w,H,x,ba);c=W;q=y[g>>2];z=q>>31;A=t>>31;d=Ai(q,z,t,A);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;B=y[g+8>>2];P=B>>31;C=u>>31;f=Ai(B,P,u,C);d=f+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;I=y[g+12>>2];S=I>>31;X=N<<1;ca=X>>31;d=Ai(I,S,X,ca);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;Q=y[g+16>>2];Y=Q>>31;D=v>>31;d=Ai(Q,Y,v,D);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;f=y[g+20>>2];ta=f;da=f>>31;Z=O<<1;ea=Z>>31;o=Ai(f,da,Z,ea);c=o+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;l=y[g+24>>2];ua=l;qa=l>>31;o=e+1|0;F=o>>31;e=Ai(l,qa,o,F);b=e+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;fa=y[g+28>>2];r=E(fa,19);U=r>>31;_=K<<1;ga=_>>31;e=Ai(r,U,_,ga);d=e+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;Aa=y[g+32>>2];i=E(Aa,19);R=i>>31;G=s>>31;d=Ai(i,R,s,G);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;Ba=y[g+36>>2];n=E(Ba,19);J=n>>31;$=L<<1;ha=$>>31;d=Ai(n,J,$,ha);c=d+c|0;b=W+b|0;j=c;e=c>>>0>>0?b+1|0:b;b=Ai(u,C,w,H);c=W;ia=M>>31;h=Ai(q,z,M,ia);b=h+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;ja=N>>31;h=Ai(B,P,N,ja);b=h+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;h=Ai(v,D,I,S);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;ka=O>>31;d=Ai(Q,Y,O,ka);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(o,F,f,da);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;l=E(l,19);aa=l>>31;la=K>>31;h=Ai(l,aa,K,la);c=h+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;h=Ai(s,G,r,U);b=h+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;ma=L>>31;h=Ai(i,R,L,ma);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;d=Ai(n,J,t,A);c=c+d|0;b=W+b|0;va=c;V=c>>>0>>0?b+1|0:b;b=Ai(w,H,X,ca);d=W;h=Ai(q,z,u,C);c=h+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;h=Ai(v,D,B,P);c=h+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;h=Ai(I,S,Z,ea);b=h+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;h=Ai(o,F,Q,Y);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;h=E(f,19);na=h>>31;d=Ai(h,na,_,ga);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(s,G,l,aa);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;f=Ai(r,U,$,ha);c=f+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;f=Ai(i,R,t,A);b=f+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;f=Ai(n,J,x,ba);d=f+b|0;b=W+c|0;Ca=d;b=d>>>0>>0?b+1|0:b;Da=b;d=d+33554432|0;b=d>>>0<33554432?b+1|0:b;Ea=d;Fa=b;d=(b&67108863)<<6|d>>>26;f=d+va|0;b=(b>>26)+V|0;va=f;b=d>>>0>f>>>0?b+1|0:b;f=f+16777216|0;d=f>>>0<16777216?b+1|0:b;Ga=f;c=d>>25;f=(d&33554431)<<7|f>>>25;d=f+j|0;b=c+e|0;b=d>>>0>>0?b+1|0:b;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;p=c;f=b;y[g+72>>2]=d-(c&-67108864);b=Ai(w,H,Z,ea);c=W;e=Ai(q,z,v,D);b=e+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=Ai(o,F,B,P);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;e=E(I,19);oa=e>>31;d=Ai(e,oa,_,ga);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;V=E(Q,19);ra=V>>31;j=Ai(V,ra,s,G);d=j+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;j=Ai($,ha,h,na);d=j+d|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;j=Ai(t,A,l,aa);c=j+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;j=Ai(r,U,x,ba);c=j+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(i,R,u,C);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;j=Ai(n,J,X,ca);d=j+c|0;c=W+b|0;m=d;wa=d>>>0>>0?c+1|0:c;b=Ai(o,F,w,H);c=W;j=Ai(q,z,O,ka);d=j+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=E(B,19);j=c;sa=c>>31;k=Ai(c,sa,K,la);c=k+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;k=Ai(s,G,e,oa);c=k+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(V,ra,L,ma);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;k=Ai(t,A,h,na);d=k+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;k=Ai(l,aa,M,ia);d=k+d|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;k=Ai(u,C,r,U);c=k+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;k=Ai(i,R,N,ja);c=k+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(n,J,v,D);c=d+c|0;b=W+b|0;xa=c;k=c>>>0>>0?b+1|0:b;b=E(w,19);b=Ai(b,b>>31,_,ga);c=W;d=Ai(q,z,o,F);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;j=Ai(s,G,j,sa);d=j+b|0;b=W+c|0;e=Ai(e,oa,$,ha);c=e+d|0;d=W+(d>>>0>>0?b+1|0:b)|0;d=c>>>0>>0?d+1|0:d;e=Ai(t,A,V,ra);c=e+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(x,ba,h,na);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;e=Ai(u,C,l,aa);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;e=Ai(r,U,X,ca);d=e+d|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;e=Ai(i,R,v,D);c=e+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;e=Ai(n,J,Z,ea);c=e+c|0;b=W+d|0;j=c;b=c>>>0>>0?b+1|0:b;oa=b;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;sa=c;Ha=b;d=b>>26;b=(b&67108863)<<6|c>>>26;e=b+xa|0;c=d+k|0;k=e;c=b>>>0>e>>>0?c+1|0:c;b=c;e=e+16777216|0;b=e>>>0<16777216?b+1|0:b;xa=e;e=(b&33554431)<<7|e>>>25;c=e+m|0;b=(b>>25)+wa|0;b=c>>>0>>0?b+1|0:b;d=c;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;wa=c;e=b;y[g+56>>2]=d-(c&-67108864);b=Ai(t,A,w,H);d=W;m=Ai(q,z,L,ma);c=m+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(B,P,M,ia);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(u,C,I,S);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;m=Ai(Q,Y,N,ja);c=m+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;m=Ai(v,D,ta,da);b=m+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;m=Ai(O,ka,ua,qa);d=m+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;ya=fa>>31;d=Ai(fa,ya,o,F);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(i,R,K,la);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=c;c=Ai(n,J,s,G);m=d+c|0;d=W+b|0;c=c>>>0>m>>>0?d+1|0:d;b=f>>26;f=(f&67108863)<<6|p>>>26;d=f+m|0;c=b+c|0;p=d;c=d>>>0>>0?c+1|0:c;b=c;d=d+16777216|0;b=d>>>0<16777216?b+1|0:b;m=d;f=b;y[g+76>>2]=p-(d&-33554432);b=Ai(v,D,w,H);c=W;p=Ai(q,z,N,ja);b=p+b|0;d=W+c|0;d=b>>>0

>>0?d+1|0:d;p=Ai(B,P,O,ka);b=p+b|0;c=W+d|0;c=b>>>0

>>0?c+1|0:c;p=Ai(o,F,I,S);d=p+b|0;b=W+c|0;b=d>>>0

>>0?b+1|0:b;c=d;d=Ai(V,ra,K,la);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(s,G,h,na);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;l=Ai(l,aa,L,ma);c=l+c|0;d=W+b|0;r=Ai(t,A,r,U);b=r+c|0;c=W+(c>>>0>>0?d+1|0:d)|0;i=Ai(i,R,M,ia);d=i+b|0;b=W+(b>>>0>>0?c+1|0:c)|0;b=d>>>0>>0?b+1|0:b;c=d;d=Ai(n,J,u,C);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;p=c;c=e>>26;d=(e&67108863)<<6|wa>>>26;e=p+d|0;b=b+c|0;i=e;b=d>>>0>e>>>0?b+1|0:b;c=e+16777216|0;d=c>>>0<16777216?b+1|0:b;r=c;e=d;y[g+60>>2]=i-(c&-33554432);b=Ai(w,H,$,ha);d=W;i=Ai(q,z,s,G);c=i+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(t,A,B,P);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;i=Ai(I,S,x,ba);c=i+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;i=Ai(u,C,Q,Y);b=i+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;i=Ai(X,ca,ta,da);d=i+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;d=Ai(v,D,ua,qa);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=c;c=Ai(fa,ya,Z,ea);d=d+c|0;b=W+b|0;b=c>>>0>d>>>0?b+1|0:b;c=Aa;i=c;l=c>>31;x=Ai(c,l,o,F);c=x+d|0;d=W+b|0;n=Ai(n,J,_,ga);b=n+c|0;c=W+(c>>>0>>0?d+1|0:d)|0;d=b>>>0>>0?c+1|0:c;c=b;b=f>>25;f=(f&33554431)<<7|m>>>25;c=c+f|0;b=b+d|0;b=c>>>0>>0?b+1|0:b;d=c;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;n=c;f=b;y[g+80>>2]=d-(c&-67108864);x=va-(Ga&-33554432)|0;c=e>>25;e=(e&33554431)<<7|r>>>25;b=Ea&-67108864;d=e+(Ca-b|0)|0;b=c+(Da-((b>>>0>Ca>>>0)+Fa|0)|0)|0;b=d>>>0>>0?b+1|0:b;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+x|0;y[g+68>>2]=b;y[g+64>>2]=d-(c&-67108864);b=Ai(s,G,w,H);d=W;e=Ai(q,z,K,la);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;e=Ai(B,P,L,ma);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;e=Ai(t,A,I,S);b=e+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=Ai(Q,Y,M,ia);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(u,C,ta,da);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(N,ja,ua,qa);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;e=Ai(v,D,fa,ya);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;b=Ai(i,l,O,ka);e=b+d|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;c=e;b=Ba;e=Ai(b,b>>31,o,F);c=c+e|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=c;c=f>>26;f=(f&67108863)<<6|n>>>26;d=d+f|0;b=b+c|0;b=d>>>0>>0?b+1|0:b;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;y[g+84>>2]=d-(c&-33554432);f=k-(xa&-33554432)|0;d=sa&-67108864;e=j-d|0;q=oa-((d>>>0>j>>>0)+Ha|0)|0;d=b;b=b>>25;b=Ai((d&33554431)<<7|c>>>25,b,19,0);d=b+e|0;c=W+q|0;b=b>>>0>d>>>0?c+1|0:c;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+f|0;y[g+52>>2]=b;y[g+48>>2]=d-(c&-67108864);pa(a,g+48|0);}T=g+256|0;return za|0}function ui(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;j=T-544|0;T=j;Ie(i,h,j+432|0);i=0;if(g>>>0>31){h=32;while(1){He(f+i|0,j+432|0);i=h;h=h+32|0;if(h>>>0<=g>>>0){continue}break}}h=i|16;if(h>>>0<=g>>>0){while(1){i=f+i|0;l=z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24);m=z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24);p=z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24);n=z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24);i=y[j+524>>2];y[j+392>>2]=y[j+520>>2];y[j+396>>2]=i;i=y[j+516>>2];y[j+384>>2]=y[j+512>>2];y[j+388>>2]=i;i=y[j+500>>2];y[j+368>>2]=y[j+496>>2];y[j+372>>2]=i;i=y[j+508>>2];y[j+376>>2]=y[j+504>>2];y[j+380>>2]=i;i=y[j+516>>2];y[j+352>>2]=y[j+512>>2];y[j+356>>2]=i;i=y[j+524>>2];y[j+360>>2]=y[j+520>>2];y[j+364>>2]=i;i=j+528|0;ia(i,j+368|0,j+352|0);k=y[j+540>>2];y[j+520>>2]=y[j+536>>2];y[j+524>>2]=k;k=y[j+532>>2];y[j+512>>2]=y[j+528>>2];y[j+516>>2]=k;k=y[j+484>>2];y[j+336>>2]=y[j+480>>2];y[j+340>>2]=k;k=y[j+492>>2];y[j+344>>2]=y[j+488>>2];y[j+348>>2]=k;k=y[j+500>>2];y[j+320>>2]=y[j+496>>2];y[j+324>>2]=k;k=y[j+508>>2];y[j+328>>2]=y[j+504>>2];y[j+332>>2]=k;ia(i,j+336|0,j+320|0);k=y[j+540>>2];y[j+504>>2]=y[j+536>>2];y[j+508>>2]=k;k=y[j+532>>2];y[j+496>>2]=y[j+528>>2];y[j+500>>2]=k;k=y[j+468>>2];y[j+304>>2]=y[j+464>>2];y[j+308>>2]=k;k=y[j+476>>2];y[j+312>>2]=y[j+472>>2];y[j+316>>2]=k;k=y[j+484>>2];y[j+288>>2]=y[j+480>>2];y[j+292>>2]=k;k=y[j+492>>2];y[j+296>>2]=y[j+488>>2];y[j+300>>2]=k;ia(i,j+304|0,j+288|0);k=y[j+540>>2];y[j+488>>2]=y[j+536>>2];y[j+492>>2]=k;k=y[j+532>>2];y[j+480>>2]=y[j+528>>2];y[j+484>>2]=k;k=y[j+452>>2];y[j+272>>2]=y[j+448>>2];y[j+276>>2]=k;k=y[j+460>>2];y[j+280>>2]=y[j+456>>2];y[j+284>>2]=k;k=y[j+468>>2];y[j+256>>2]=y[j+464>>2];y[j+260>>2]=k;k=y[j+476>>2];y[j+264>>2]=y[j+472>>2];y[j+268>>2]=k;ia(i,j+272|0,j+256|0);k=y[j+540>>2];y[j+472>>2]=y[j+536>>2];y[j+476>>2]=k;k=y[j+532>>2];y[j+464>>2]=y[j+528>>2];y[j+468>>2]=k;k=y[j+436>>2];y[j+240>>2]=y[j+432>>2];y[j+244>>2]=k;k=y[j+444>>2];y[j+248>>2]=y[j+440>>2];y[j+252>>2]=k;k=y[j+452>>2];y[j+224>>2]=y[j+448>>2];y[j+228>>2]=k;k=y[j+460>>2];y[j+232>>2]=y[j+456>>2];y[j+236>>2]=k;ia(i,j+240|0,j+224|0);k=y[j+540>>2];y[j+456>>2]=y[j+536>>2];y[j+460>>2]=k;k=y[j+532>>2];y[j+448>>2]=y[j+528>>2];y[j+452>>2]=k;k=y[j+388>>2];y[j+208>>2]=y[j+384>>2];y[j+212>>2]=k;k=y[j+396>>2];y[j+216>>2]=y[j+392>>2];y[j+220>>2]=k;k=y[j+436>>2];y[j+192>>2]=y[j+432>>2];y[j+196>>2]=k;k=y[j+444>>2];y[j+200>>2]=y[j+440>>2];y[j+204>>2]=k;ia(i,j+208|0,j+192|0);y[j+444>>2]=n^y[j+540>>2];y[j+440>>2]=p^y[j+536>>2];y[j+436>>2]=m^y[j+532>>2];y[j+432>>2]=l^y[j+528>>2];i=h;h=h+16|0;if(h>>>0<=g>>>0){continue}break}}h=g&15;if(h){l=16-h|0;if(l){o(h|j+416,0,l);}if(h){t(j+416|0,f+i|0,h);}m=y[j+416>>2];p=y[j+420>>2];n=y[j+424>>2];k=y[j+428>>2];h=y[j+524>>2];i=y[j+520>>2];y[j+392>>2]=i;y[j+396>>2]=h;l=y[j+516>>2];f=y[j+512>>2];y[j+384>>2]=f;y[j+388>>2]=l;q=y[j+500>>2];y[j+176>>2]=y[j+496>>2];y[j+180>>2]=q;q=y[j+508>>2];y[j+184>>2]=y[j+504>>2];y[j+188>>2]=q;y[j+160>>2]=f;y[j+164>>2]=l;y[j+168>>2]=i;y[j+172>>2]=h;f=j+528|0;ia(f,j+176|0,j+160|0);h=y[j+540>>2];y[j+520>>2]=y[j+536>>2];y[j+524>>2]=h;h=y[j+532>>2];y[j+512>>2]=y[j+528>>2];y[j+516>>2]=h;h=y[j+484>>2];y[j+144>>2]=y[j+480>>2];y[j+148>>2]=h;h=y[j+492>>2];y[j+152>>2]=y[j+488>>2];y[j+156>>2]=h;h=y[j+500>>2];y[j+128>>2]=y[j+496>>2];y[j+132>>2]=h;h=y[j+508>>2];y[j+136>>2]=y[j+504>>2];y[j+140>>2]=h;ia(f,j+144|0,j+128|0);h=y[j+540>>2];y[j+504>>2]=y[j+536>>2];y[j+508>>2]=h;h=y[j+532>>2];y[j+496>>2]=y[j+528>>2];y[j+500>>2]=h;h=y[j+468>>2];y[j+112>>2]=y[j+464>>2];y[j+116>>2]=h;h=y[j+476>>2];y[j+120>>2]=y[j+472>>2];y[j+124>>2]=h;h=y[j+484>>2];y[j+96>>2]=y[j+480>>2];y[j+100>>2]=h;h=y[j+492>>2];y[j+104>>2]=y[j+488>>2];y[j+108>>2]=h;ia(f,j+112|0,j+96|0);h=y[j+540>>2];y[j+488>>2]=y[j+536>>2];y[j+492>>2]=h;h=y[j+532>>2];y[j+480>>2]=y[j+528>>2];y[j+484>>2]=h;h=y[j+452>>2];y[j+80>>2]=y[j+448>>2];y[j+84>>2]=h;h=y[j+460>>2];y[j+88>>2]=y[j+456>>2];y[j+92>>2]=h;h=y[j+468>>2];y[j+64>>2]=y[j+464>>2];y[j+68>>2]=h;h=y[j+476>>2];y[j+72>>2]=y[j+472>>2];y[j+76>>2]=h;ia(f,j+80|0,j- -64|0);h=y[j+540>>2];y[j+472>>2]=y[j+536>>2];y[j+476>>2]=h;h=y[j+532>>2];y[j+464>>2]=y[j+528>>2];y[j+468>>2]=h;h=y[j+436>>2];y[j+48>>2]=y[j+432>>2];y[j+52>>2]=h;h=y[j+444>>2];y[j+56>>2]=y[j+440>>2];y[j+60>>2]=h;h=y[j+452>>2];y[j+32>>2]=y[j+448>>2];y[j+36>>2]=h;h=y[j+460>>2];y[j+40>>2]=y[j+456>>2];y[j+44>>2]=h;ia(f,j+48|0,j+32|0);h=y[j+540>>2];y[j+456>>2]=y[j+536>>2];y[j+460>>2]=h;h=y[j+532>>2];y[j+448>>2]=y[j+528>>2];y[j+452>>2]=h;h=y[j+388>>2];y[j+16>>2]=y[j+384>>2];y[j+20>>2]=h;h=y[j+396>>2];y[j+24>>2]=y[j+392>>2];y[j+28>>2]=h;h=y[j+436>>2];y[j>>2]=y[j+432>>2];y[j+4>>2]=h;h=y[j+444>>2];y[j+8>>2]=y[j+440>>2];y[j+12>>2]=h;ia(f,j+16|0,j);y[j+444>>2]=k^y[j+540>>2];y[j+440>>2]=n^y[j+536>>2];y[j+436>>2]=p^y[j+532>>2];y[j+432>>2]=m^y[j+528>>2];}a:{if(!a){i=16;h=0;if(c>>>0<16){break a}while(1){Ee(j+528|0,b+h|0,j+432|0);h=i;i=h+16|0;if(i>>>0<=c>>>0){continue}break}break a}i=16;h=0;if(c>>>0<16){break a}while(1){Ee(a+h|0,b+h|0,j+432|0);h=i;i=h+16|0;if(i>>>0<=c>>>0){continue}break}}i=c&15;if(i){p=a?a+h|0:j+528|0;h=b+h|0;f=j+432|0;b=T-240|0;T=b;l=i+(b+192|0)|0;m=16-i|0;n=!m;if(!n){o(l,0,m);}k=!i;if(!k){t(b+192|0,h,i);}q=y[f+16>>2];h=f- -64|0;r=y[h>>2];s=y[f+80>>2];u=y[f+32>>2];v=y[f+48>>2];w=y[f+20>>2];x=y[f+68>>2];A=y[f+84>>2];B=y[f+36>>2];C=y[f+52>>2];D=y[f+24>>2];E=y[f+72>>2];F=y[f+88>>2];G=y[f+40>>2];H=y[f+56>>2];I=y[b+192>>2];J=y[b+196>>2];K=y[b+200>>2];y[b+204>>2]=y[f+44>>2]&y[f+60>>2]^(y[f+28>>2]^(y[f+76>>2]^(y[f+92>>2]^y[b+204>>2])));y[b+200>>2]=G&H^(E^(F^K)^D);y[b+196>>2]=B&C^(A^J^x^w);y[b+192>>2]=u&v^(s^I^r^q);if(!n){o(l,0,m);}if(!k){t(p,b+192|0,i);}l=y[b+192>>2];m=y[b+196>>2];p=y[b+200>>2];n=y[b+204>>2];i=y[f+92>>2];y[b+232>>2]=y[f+88>>2];y[b+236>>2]=i;i=y[f+84>>2];y[b+224>>2]=y[f+80>>2];y[b+228>>2]=i;i=y[h+4>>2];y[b+176>>2]=y[h>>2];y[b+180>>2]=i;i=y[f+76>>2];y[b+184>>2]=y[f+72>>2];y[b+188>>2]=i;i=y[f+84>>2];y[b+160>>2]=y[f+80>>2];y[b+164>>2]=i;i=y[f+92>>2];y[b+168>>2]=y[f+88>>2];y[b+172>>2]=i;i=b+208|0;ia(i,b+176|0,b+160|0);k=y[b+220>>2];y[f+88>>2]=y[b+216>>2];y[f+92>>2]=k;k=y[b+212>>2];y[f+80>>2]=y[b+208>>2];y[f+84>>2]=k;k=y[f+52>>2];y[b+144>>2]=y[f+48>>2];y[b+148>>2]=k;k=y[f+60>>2];y[b+152>>2]=y[f+56>>2];y[b+156>>2]=k;k=y[h+4>>2];y[b+128>>2]=y[h>>2];y[b+132>>2]=k;k=y[f+76>>2];y[b+136>>2]=y[f+72>>2];y[b+140>>2]=k;ia(i,b+144|0,b+128|0);k=y[b+220>>2];y[f+72>>2]=y[b+216>>2];y[f+76>>2]=k;k=y[b+212>>2];y[h>>2]=y[b+208>>2];y[h+4>>2]=k;h=y[f+36>>2];y[b+112>>2]=y[f+32>>2];y[b+116>>2]=h;h=y[f+44>>2];y[b+120>>2]=y[f+40>>2];y[b+124>>2]=h;h=y[f+52>>2];y[b+96>>2]=y[f+48>>2];y[b+100>>2]=h;h=y[f+60>>2];y[b+104>>2]=y[f+56>>2];y[b+108>>2]=h;ia(i,b+112|0,b+96|0);h=y[b+220>>2];y[f+56>>2]=y[b+216>>2];y[f+60>>2]=h;h=y[b+212>>2];y[f+48>>2]=y[b+208>>2];y[f+52>>2]=h;h=y[f+20>>2];y[b+80>>2]=y[f+16>>2];y[b+84>>2]=h;h=y[f+28>>2];y[b+88>>2]=y[f+24>>2];y[b+92>>2]=h;h=y[f+36>>2];y[b+64>>2]=y[f+32>>2];y[b+68>>2]=h;h=y[f+44>>2];y[b+72>>2]=y[f+40>>2];y[b+76>>2]=h;ia(i,b+80|0,b- -64|0);h=y[b+220>>2];y[f+40>>2]=y[b+216>>2];y[f+44>>2]=h;h=y[b+212>>2];y[f+32>>2]=y[b+208>>2];y[f+36>>2]=h;h=y[f+4>>2];y[b+48>>2]=y[f>>2];y[b+52>>2]=h;h=y[f+12>>2];y[b+56>>2]=y[f+8>>2];y[b+60>>2]=h;h=y[f+20>>2];y[b+32>>2]=y[f+16>>2];y[b+36>>2]=h;h=y[f+28>>2];y[b+40>>2]=y[f+24>>2];y[b+44>>2]=h;ia(i,b+48|0,b+32|0);h=y[b+220>>2];y[f+24>>2]=y[b+216>>2];y[f+28>>2]=h;h=y[b+212>>2];y[f+16>>2]=y[b+208>>2];y[f+20>>2]=h;h=y[b+228>>2];y[b+16>>2]=y[b+224>>2];y[b+20>>2]=h;h=y[b+236>>2];y[b+24>>2]=y[b+232>>2];y[b+28>>2]=h;h=y[f+4>>2];y[b>>2]=y[f>>2];y[b+4>>2]=h;h=y[f+12>>2];y[b+8>>2]=y[f+8>>2];y[b+12>>2]=h;ia(i,b+16|0,b);h=y[b+208>>2];i=y[b+212>>2];k=y[b+216>>2];y[f+12>>2]=n^y[b+220>>2];y[f+8>>2]=k^p;y[f+4>>2]=i^m;y[f>>2]=h^l;T=b+240|0;}Fe(j+384|0,e,g,c,j+432|0);h=-1;b:{c:{b=e-16|0;if(b){if((b|0)==16){break c}break b}h=db(j+384|0,d);break b}h=kb(j+384|0,d);}if(!(!c|(!a|!h))){o(a,0,c);}T=j+544|0;return h|0}function ga(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;s=y[c+4>>2];D=s>>31;L=y[b+20>>2];F=L<<1;ba=F>>31;d=Ai(s,D,F,ba);f=W;r=y[c>>2];v=r>>31;t=y[b+24>>2];w=t>>31;p=Ai(r,v,t,w);e=p+d|0;d=W+f|0;d=e>>>0

>>0?d+1|0:d;x=y[c+8>>2];I=x>>31;p=y[b+16>>2];z=p>>31;l=Ai(x,I,p,z);e=l+e|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;G=y[c+12>>2];M=G>>31;N=y[b+12>>2];U=N<<1;ca=U>>31;l=Ai(G,M,U,ca);d=l+e|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;J=y[c+16>>2];V=J>>31;l=y[b+8>>2];A=l>>31;q=Ai(J,V,l,A);f=q+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;O=y[c+20>>2];da=O>>31;P=y[b+4>>2];X=P<<1;ea=X>>31;f=Ai(O,da,X,ea);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;j=y[c+24>>2];ta=j;pa=j>>31;q=y[b>>2];B=q>>31;m=Ai(j,pa,q,B);f=m+e|0;e=W+d|0;e=f>>>0>>0?e+1|0:e;fa=y[c+28>>2];o=E(fa,19);Q=o>>31;R=y[b+36>>2];Y=R<<1;ga=Y>>31;m=Ai(o,Q,Y,ga);d=m+f|0;f=W+e|0;f=d>>>0>>0?f+1|0:f;qa=y[c+32>>2];g=E(qa,19);K=g>>31;m=y[b+32>>2];C=m>>31;k=Ai(g,K,m,C);e=k+d|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;ua=y[c+36>>2];k=E(ua,19);H=k>>31;S=y[b+28>>2];Z=S<<1;ha=Z>>31;c=Ai(k,H,Z,ha);b=c+e|0;d=W+d|0;h=b;c=b>>>0>>0?d+1|0:d;b=Ai(p,z,s,D);d=W;ia=L>>31;e=Ai(r,v,L,ia);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;ja=N>>31;d=Ai(x,I,N,ja);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;f=Ai(l,A,G,M);b=f+b|0;d=W+e|0;d=b>>>0>>0?d+1|0:d;ka=P>>31;e=Ai(J,V,P,ka);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(q,B,O,da);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;j=E(j,19);_=j>>31;la=R>>31;e=Ai(j,_,R,la);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;d=Ai(m,C,o,Q);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;ma=S>>31;f=Ai(g,K,S,ma);b=f+b|0;d=W+e|0;d=b>>>0>>0?d+1|0:d;e=Ai(k,H,t,w);b=e+b|0;d=W+d|0;va=b;T=b>>>0>>0?d+1|0:d;b=Ai(s,D,U,ca);d=W;e=Ai(r,v,p,z);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(l,A,x,I);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;d=Ai(G,M,X,ea);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;f=Ai(q,B,J,V);b=f+b|0;d=W+e|0;d=b>>>0>>0?d+1|0:d;$=E(O,19);na=$>>31;e=Ai($,na,Y,ga);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(m,C,j,_);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(o,Q,Z,ha);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;d=Ai(g,K,t,w);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;f=Ai(k,H,F,ba);b=f+b|0;d=W+e|0;ya=b;d=b>>>0>>0?d+1|0:d;za=d;b=b+33554432|0;d=b>>>0<33554432?d+1|0:d;Aa=b;Ba=d;f=(d&67108863)<<6|b>>>26;b=f+va|0;d=(d>>26)+T|0;va=b;d=b>>>0>>0?d+1|0:d;b=b+16777216|0;f=b>>>0<16777216?d+1|0:d;Ca=b;e=f>>25;f=(f&33554431)<<7|b>>>25;b=f+h|0;d=c+e|0;d=b>>>0>>0?d+1|0:d;e=b;c=e+33554432|0;d=c>>>0<33554432?d+1|0:d;aa=c;b=d;y[a+24>>2]=e-(c&-67108864);c=Ai(s,D,X,ea);d=W;e=Ai(r,v,l,A);c=e+c|0;f=W+d|0;f=c>>>0>>0?f+1|0:f;d=c;c=Ai(q,B,x,I);e=d+c|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=E(G,19);oa=c>>31;f=Ai(c,oa,Y,ga);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;T=E(J,19);ra=T>>31;h=Ai(m,C,T,ra);f=h+e|0;e=W+d|0;e=f>>>0>>0?e+1|0:e;h=Ai(Z,ha,$,na);f=h+f|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;h=Ai(t,w,j,_);e=h+f|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;h=Ai(o,Q,F,ba);e=h+e|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(g,K,p,z);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;h=Ai(k,H,U,ca);f=h+e|0;e=W+d|0;n=f;wa=f>>>0>>0?e+1|0:e;d=Ai(q,B,s,D);e=W;h=Ai(r,v,P,ka);f=h+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=E(x,19);h=e;sa=e>>31;i=Ai(e,sa,R,la);e=i+f|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;i=Ai(m,C,c,oa);e=i+e|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(T,ra,S,ma);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;i=Ai(t,w,$,na);f=i+e|0;e=W+d|0;e=f>>>0>>0?e+1|0:e;i=Ai(j,_,L,ia);f=i+f|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;i=Ai(p,z,o,Q);e=i+f|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;i=Ai(g,K,N,ja);e=i+e|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(k,H,l,A);e=f+e|0;d=W+d|0;xa=e;i=e>>>0>>0?d+1|0:d;d=E(s,19);d=Ai(d,d>>31,Y,ga);e=W;f=Ai(r,v,q,B);d=f+d|0;e=W+e|0;e=d>>>0>>0?e+1|0:e;h=Ai(m,C,h,sa);f=h+d|0;d=W+e|0;e=Ai(c,oa,Z,ha);c=e+f|0;f=W+(f>>>0>>0?d+1|0:d)|0;f=c>>>0>>0?f+1|0:f;e=Ai(t,w,T,ra);c=e+c|0;d=W+f|0;d=c>>>0>>0?d+1|0:d;e=Ai(F,ba,$,na);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;f=Ai(p,z,j,_);c=f+c|0;e=W+d|0;e=c>>>0>>0?e+1|0:e;f=Ai(o,Q,U,ca);c=f+c|0;d=W+e|0;d=c>>>0>>0?d+1|0:d;e=Ai(g,K,l,A);c=e+c|0;f=W+d|0;f=c>>>0>>0?f+1|0:f;e=Ai(k,H,X,ea);c=e+c|0;d=W+f|0;h=c;d=c>>>0>>0?d+1|0:d;oa=d;c=c+33554432|0;d=c>>>0<33554432?d+1|0:d;sa=c;Da=d;f=d>>26;d=(d&67108863)<<6|c>>>26;c=d+xa|0;e=f+i|0;i=c;d=c>>>0>>0?e+1|0:e;c=c+16777216|0;d=c>>>0<16777216?d+1|0:d;xa=c;e=(d&33554431)<<7|c>>>25;c=e+n|0;d=(d>>25)+wa|0;d=c>>>0>>0?d+1|0:d;f=c;e=f+33554432|0;d=e>>>0<33554432?d+1|0:d;wa=e;c=d;y[a+8>>2]=f-(e&-67108864);d=Ai(t,w,s,D);f=W;n=Ai(r,v,S,ma);e=n+d|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(x,I,L,ia);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(p,z,G,M);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;n=Ai(J,V,N,ja);e=n+e|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;n=Ai(l,A,O,da);d=n+e|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;n=Ai(P,ka,ta,pa);f=n+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;n=fa>>31;f=Ai(q,B,fa,n);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(g,K,R,la);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;u=Ai(k,H,m,C);e=u+e|0;f=W+d|0;d=b>>26;aa=(b&67108863)<<6|aa>>>26;b=aa+e|0;e=d+(e>>>0>>0?f+1|0:f)|0;f=b;d=f>>>0>>0?e+1|0:e;e=f+16777216|0;d=e>>>0<16777216?d+1|0:d;aa=e;b=d;y[a+28>>2]=f-(e&-33554432);d=Ai(l,A,s,D);e=W;u=Ai(r,v,N,ja);d=u+d|0;f=W+e|0;f=d>>>0>>0?f+1|0:f;u=Ai(x,I,P,ka);d=u+d|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;u=Ai(q,B,G,M);f=u+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;f=Ai(T,ra,R,la);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(m,C,$,na);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;j=Ai(j,_,S,ma);e=j+e|0;f=W+d|0;o=Ai(t,w,o,Q);d=o+e|0;e=W+(e>>>0>>0?f+1|0:f)|0;g=Ai(g,K,L,ia);f=g+d|0;d=W+(d>>>0>>0?e+1|0:e)|0;d=f>>>0>>0?d+1|0:d;e=f;f=Ai(k,H,p,z);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;g=e;e=c>>26;f=(c&67108863)<<6|wa>>>26;c=g+f|0;d=d+e|0;g=c;d=c>>>0>>0?d+1|0:d;e=c+16777216|0;f=e>>>0<16777216?d+1|0:d;o=e;c=f;y[a+12>>2]=g-(e&-33554432);d=Ai(s,D,Z,ha);f=W;g=Ai(r,v,m,C);e=g+d|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(t,w,x,I);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;g=Ai(G,M,F,ba);e=g+e|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;g=Ai(p,z,J,V);d=g+e|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;g=Ai(U,ca,O,da);f=g+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;f=Ai(l,A,ta,pa);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(fa,n,X,ea);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;g=qa;j=g>>31;F=Ai(q,B,g,j);e=F+e|0;f=W+d|0;k=Ai(k,H,Y,ga);d=k+e|0;e=W+(e>>>0>>0?f+1|0:f)|0;e=d>>>0>>0?e+1|0:e;qa=d;d=b>>25;f=(b&33554431)<<7|aa>>>25;b=qa+f|0;d=d+e|0;d=b>>>0>>0?d+1|0:d;f=b;e=f+33554432|0;d=e>>>0<33554432?d+1|0:d;k=e;b=d;y[a+32>>2]=f-(e&-67108864);f=va-(Ca&-33554432)|0;e=c>>25;o=(c&33554431)<<7|o>>>25;d=Aa&-67108864;c=o+(ya-d|0)|0;d=e+(za-((d>>>0>ya>>>0)+Ba|0)|0)|0;d=c>>>0>>0?d+1|0:d;e=c;c=e+33554432|0;d=c>>>0<33554432?d+1|0:d;d=((d&67108863)<<6|c>>>26)+f|0;y[a+20>>2]=d;y[a+16>>2]=e-(c&-67108864);c=Ai(m,C,s,D);d=W;e=Ai(r,v,R,la);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;f=Ai(x,I,S,ma);c=f+c|0;e=W+d|0;e=c>>>0>>0?e+1|0:e;d=Ai(t,w,G,M);c=d+c|0;f=W+e|0;f=c>>>0>>0?f+1|0:f;e=Ai(J,V,L,ia);c=e+c|0;d=W+f|0;d=c>>>0>>0?d+1|0:d;e=Ai(p,z,O,da);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;e=Ai(N,ja,ta,pa);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;f=Ai(l,A,fa,n);c=f+c|0;e=W+d|0;e=c>>>0>>0?e+1|0:e;d=Ai(g,j,P,ka);c=d+c|0;f=W+e|0;f=c>>>0>>0?f+1|0:f;e=Ai(q,B,ua,ua>>31);c=e+c|0;d=W+f|0;d=c>>>0>>0?d+1|0:d;e=b>>26;f=c;c=(b&67108863)<<6|k>>>26;b=f+c|0;d=d+e|0;d=b>>>0>>0?d+1|0:d;c=b;b=c+16777216|0;d=b>>>0<16777216?d+1|0:d;y[a+36>>2]=c-(b&-33554432);f=i-(xa&-33554432)|0;c=sa&-67108864;e=h-c|0;r=oa-((c>>>0>h>>>0)+Da|0)|0;c=d;d=d>>25;c=Ai((c&33554431)<<7|b>>>25,d,19,0);b=c+e|0;e=W+r|0;d=b>>>0>>0?e+1|0:e;c=b;b=c+33554432|0;d=b>>>0<33554432?d+1|0:d;d=((d&67108863)<<6|b>>>26)+f|0;y[a+4>>2]=d;y[a>>2]=c-(b&-67108864);}function Ue(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ka=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;d=T-368|0;T=d;while(1){e=z[c+B|0];j=B+34112|0;p=e^z[j|0]|p;q=e^z[j+192|0]|q;o=e^z[j+160|0]|o;i=e^z[j+128|0]|i;h=e^z[j+96|0]|h;g=e^z[j- -64|0]|g;f=e^z[j+32|0]|f;B=B+1|0;if((B|0)!=31){continue}break}e=-1;l=z[c+31|0]&127;j=l^127;if(!((((j|q)&255)-1|(((j|o)&255)-1|(((i|j)&255)-1|(((l^87|h)&255)-1|(((g|l)&255)-1|(((f|l)&255)-1|((l|p)&255)-1))))))&256)){e=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);f=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+336>>2]=f;y[d+340>>2]=e;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+360>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+364>>2]=e;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+352>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+356>>2]=e;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+344>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+348>>2]=e;w[d+336|0]=f&248;w[d+367|0]=z[d+367|0]&63|64;cb(d+288|0,c);y[d+244>>2]=0;y[d+248>>2]=0;y[d+240>>2]=1;y[d+252>>2]=0;y[d+256>>2]=0;y[d+260>>2]=0;y[d+264>>2]=0;y[d+268>>2]=0;y[d+272>>2]=0;y[d+276>>2]=0;y[d+192>>2]=0;y[d+196>>2]=0;y[d+200>>2]=0;y[d+204>>2]=0;y[d+208>>2]=0;y[d+212>>2]=0;y[d+216>>2]=0;y[d+220>>2]=0;y[d+224>>2]=0;y[d+228>>2]=0;b=y[d+292>>2];y[d+144>>2]=y[d+288>>2];y[d+148>>2]=b;b=y[d+300>>2];y[d+152>>2]=y[d+296>>2];y[d+156>>2]=b;b=y[d+308>>2];y[d+160>>2]=y[d+304>>2];y[d+164>>2]=b;b=y[d+316>>2];y[d+168>>2]=y[d+312>>2];y[d+172>>2]=b;b=y[d+324>>2];y[d+176>>2]=y[d+320>>2];y[d+180>>2]=b;y[d+100>>2]=0;y[d+104>>2]=0;y[d+96>>2]=1;y[d+108>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+120>>2]=0;y[d+124>>2]=0;y[d+128>>2]=0;y[d+132>>2]=0;c=254;B=0;while(1){P=y[d+144>>2];Q=y[d+240>>2];R=y[d+96>>2];S=y[d+192>>2];U=y[d+148>>2];V=y[d+244>>2];X=y[d+100>>2];Y=y[d+196>>2];Z=y[d+152>>2];_=y[d+248>>2];$=y[d+104>>2];aa=y[d+200>>2];ba=y[d+156>>2];ca=y[d+252>>2];da=y[d+108>>2];ea=y[d+204>>2];ha=y[d+160>>2];F=y[d+256>>2];ia=y[d+112>>2];k=y[d+208>>2];ka=y[d+164>>2];r=y[d+260>>2];la=y[d+116>>2];v=y[d+212>>2];ma=y[d+168>>2];x=y[d+264>>2];H=y[d+120>>2];n=y[d+216>>2];t=y[d+172>>2];s=y[d+268>>2];m=y[d+124>>2];l=y[d+220>>2];f=y[d+176>>2];j=y[d+272>>2];p=y[d+128>>2];q=y[d+224>>2];b=B;na=c;oa=d+336|0;B=z[oa+(c>>>3|0)|0]>>>(c&7)&1;u=0-(b^B)|0;e=y[d+180>>2];h=y[d+276>>2];o=u&(e^h);b=y[d+132>>2];g=y[d+228>>2];i=u&(b^g);qa=e^o;ra=b^i;y[d+84>>2]=qa-ra;b=f;f=u&(f^j);sa=b^f;e=u&(p^q);ta=e^p;y[d+80>>2]=sa-ta;c=u&(s^t);ua=c^t;b=u&(l^m);A=b^m;y[d+76>>2]=ua-A;C=h^o;G=g^i;y[d+36>>2]=C-G;J=f^j;K=e^q;y[d+32>>2]=J-K;va=c^s;wa=b^l;y[d+28>>2]=va-wa;I=u&(x^ma);L=I^x;i=u&(n^H);M=i^n;y[d+24>>2]=L-M;D=u&(r^ka);N=D^r;h=u&(v^la);O=h^v;y[d+20>>2]=N-O;E=u&(F^ha);F=E^F;g=u&(k^ia);k=g^k;y[d+16>>2]=F-k;r=u&(ba^ca);v=ca^r;f=u&(da^ea);x=ea^f;y[d+12>>2]=v-x;n=u&(Z^_);t=_^n;e=u&($^aa);s=aa^e;y[d+8>>2]=t-s;m=u&(U^V);l=V^m;c=u&(X^Y);j=Y^c;y[d+4>>2]=l-j;p=u&(P^Q);q=Q^p;b=u&(R^S);o=S^b;y[d>>2]=q-o;H=i^H;y[d+120>>2]=H;i=I^ma;y[d+72>>2]=i-H;I=h^la;y[d+116>>2]=I;h=D^ka;y[d+68>>2]=h-I;D=g^ia;y[d+112>>2]=D;g=E^ha;y[d+64>>2]=g-D;E=f^da;y[d+108>>2]=E;f=r^ba;y[d+60>>2]=f-E;r=e^$;y[d+104>>2]=r;e=n^Z;y[d+56>>2]=e-r;n=c^X;y[d+100>>2]=n;c=m^U;y[d+52>>2]=c-n;m=b^R;y[d+96>>2]=m;b=p^P;y[d+48>>2]=b-m;y[d+276>>2]=C+G;y[d+272>>2]=J+K;y[d+268>>2]=va+wa;y[d+264>>2]=L+M;y[d+260>>2]=N+O;y[d+256>>2]=k+F;y[d+252>>2]=v+x;y[d+248>>2]=s+t;y[d+244>>2]=j+l;y[d+240>>2]=o+q;y[d+228>>2]=qa+ra;y[d+224>>2]=sa+ta;y[d+220>>2]=A+ua;y[d+216>>2]=i+H;y[d+212>>2]=h+I;y[d+208>>2]=g+D;y[d+200>>2]=e+r;y[d+196>>2]=c+n;y[d+192>>2]=b+m;y[d+204>>2]=f+E;K=d+96|0;G=d+48|0;C=d+240|0;ga(K,G,C);A=d+192|0;ga(A,A,d);fa(G,d);fa(d,C);k=y[d+192>>2];r=y[d+96>>2];v=y[d+196>>2];x=y[d+100>>2];n=y[d+200>>2];t=y[d+104>>2];s=y[d+204>>2];m=y[d+108>>2];l=y[d+208>>2];j=y[d+112>>2];p=y[d+212>>2];q=y[d+116>>2];o=y[d+216>>2];i=y[d+120>>2];h=y[d+220>>2];g=y[d+124>>2];f=y[d+224>>2];e=y[d+128>>2];c=y[d+228>>2];b=y[d+132>>2];y[d+180>>2]=c+b;y[d+176>>2]=e+f;y[d+172>>2]=g+h;y[d+168>>2]=i+o;y[d+164>>2]=p+q;y[d+160>>2]=j+l;y[d+156>>2]=m+s;y[d+152>>2]=n+t;y[d+148>>2]=v+x;y[d+144>>2]=k+r;y[d+228>>2]=b-c;y[d+224>>2]=e-f;y[d+220>>2]=g-h;y[d+216>>2]=i-o;y[d+212>>2]=q-p;y[d+208>>2]=j-l;y[d+204>>2]=m-s;y[d+200>>2]=t-n;y[d+196>>2]=x-v;y[d+192>>2]=r-k;ga(C,d,G);m=y[d+72>>2];n=y[d+24>>2];L=y[d+68>>2];t=y[d+20>>2];l=y[d+64>>2];s=y[d+16>>2];M=y[d+60>>2];o=y[d+12>>2];j=y[d+56>>2];i=y[d+8>>2];D=y[d+52>>2];h=y[d+4>>2];N=y[d+84>>2];g=y[d+36>>2];J=y[d+48>>2];e=y[d>>2];O=y[d+76>>2];b=y[d+28>>2];f=y[d+80>>2];c=y[d+32>>2]-f|0;y[d+32>>2]=c;b=b-O|0;y[d+28>>2]=b;r=e-J|0;y[d>>2]=r;v=g-N|0;y[d+36>>2]=v;p=h-D|0;y[d+4>>2]=p;q=i-j|0;y[d+8>>2]=q;o=o-M|0;y[d+12>>2]=o;i=s-l|0;y[d+16>>2]=i;h=t-L|0;y[d+20>>2]=h;g=n-m|0;y[d+24>>2]=g;fa(A,A);e=d+144|0;fa(e,e);e=Ai(c,c>>31,121666,0);s=W;c=Ai(b,b>>31,121666,0);b=W;E=c;x=c+16777216|0;b=x>>>0<16777216?b+1|0:b;c=(b&33554431)<<7|x>>>25;e=c+e|0;b=(b>>25)+s|0;b=c>>>0>e>>>0?b+1|0:b;n=e+33554432|0;c=n>>>0<33554432?b+1|0:b;y[d+80>>2]=(e-(n&-67108864)|0)+f;f=m;g=Ai(g,g>>31,121666,0);m=W;e=Ai(h,h>>31,121666,0);b=W;h=g;F=e;t=e+16777216|0;b=t>>>0<16777216?b+1|0:b;g=(b&33554431)<<7|t>>>25;e=h+g|0;b=(b>>25)+m|0;b=e>>>0>>0?b+1|0:b;s=e+33554432|0;g=s>>>0<33554432?b+1|0:b;y[d+72>>2]=(e-(s&-67108864)|0)+f;h=l;f=Ai(i,i>>31,121666,0);i=W;e=Ai(o,o>>31,121666,0);b=W;l=f;k=e;m=e+16777216|0;b=m>>>0<16777216?b+1|0:b;f=(b&33554431)<<7|m>>>25;e=l+f|0;b=(b>>25)+i|0;b=e>>>0>>0?b+1|0:b;l=e+33554432|0;f=l>>>0<33554432?b+1|0:b;y[d+64>>2]=(e-(l&-67108864)|0)+h;i=j;e=Ai(q,q>>31,121666,0);o=W;j=Ai(p,p>>31,121666,0);b=W;h=e;p=j+16777216|0;b=p>>>0<16777216?b+1|0:b;e=(b&33554431)<<7|p>>>25;h=h+e|0;b=(b>>25)+o|0;b=e>>>0>h>>>0?b+1|0:b;q=h+33554432|0;e=q>>>0<33554432?b+1|0:b;y[d+56>>2]=(h-(q&-67108864)|0)+i;o=N;i=c;c=Ai(v,v>>31,121666,0);i=(i&67108863)<<6|n>>>26;n=c+i|0;h=W;b=h;i=c+16777216|0;c=i>>>0<16777216?b+1|0:b;y[d+84>>2]=(n-(i&-33554432)|0)+o;h=O;g=E+((g&67108863)<<6|s>>>26)|0;y[d+76>>2]=(g-(x&-33554432)|0)+h;g=L;f=F+((f&67108863)<<6|l>>>26)|0;y[d+68>>2]=(f-(t&-33554432)|0)+g;f=M;e=k+((e&67108863)<<6|q>>>26)|0;y[d+60>>2]=(e-(m&-33554432)|0)+f;f=D;g=j-(p&-33554432)|0;c=Ai((c&33554431)<<7|i>>>25,c>>25,19,0);b=W;e=c;c=Ai(r,r>>31,121666,0);e=e+c|0;b=W+b|0;b=c>>>0>e>>>0?b+1|0:b;c=e+33554432|0;b=c>>>0<33554432?b+1|0:b;g=((b&67108863)<<6|c>>>26)+g|0;y[d+52>>2]=f+g;y[d+48>>2]=(e-(c&-67108864)|0)+J;c=na-1|0;ga(K,d+288|0,A);ga(A,d,G);if(na){continue}break}p=y[d+144>>2];r=y[d+240>>2];q=y[d+148>>2];v=y[d+244>>2];o=y[d+152>>2];x=y[d+248>>2];i=y[d+156>>2];n=y[d+252>>2];h=y[d+160>>2];t=y[d+256>>2];g=y[d+164>>2];s=y[d+260>>2];f=y[d+168>>2];m=y[d+264>>2];e=y[d+172>>2];l=y[d+268>>2];c=y[d+176>>2];j=y[d+272>>2];k=0-B|0;b=y[d+276>>2];y[d+276>>2]=k&(b^y[d+180>>2])^b;y[d+272>>2]=j^k&(c^j);y[d+268>>2]=l^k&(e^l);y[d+264>>2]=m^k&(f^m);y[d+260>>2]=s^k&(g^s);y[d+256>>2]=t^k&(h^t);y[d+252>>2]=n^k&(i^n);y[d+248>>2]=x^k&(o^x);y[d+244>>2]=v^k&(q^v);y[d+240>>2]=r^k&(p^r);r=y[d+192>>2];p=y[d+96>>2];v=y[d+196>>2];q=y[d+100>>2];x=y[d+200>>2];o=y[d+104>>2];n=y[d+204>>2];i=y[d+108>>2];t=y[d+208>>2];h=y[d+112>>2];s=y[d+212>>2];g=y[d+116>>2];m=y[d+216>>2];f=y[d+120>>2];l=y[d+220>>2];e=y[d+124>>2];j=y[d+224>>2];c=y[d+128>>2];b=y[d+228>>2];y[d+228>>2]=k&(b^y[d+132>>2])^b;y[d+224>>2]=j^k&(c^j);y[d+220>>2]=l^k&(e^l);y[d+216>>2]=m^k&(f^m);y[d+212>>2]=s^k&(g^s);y[d+208>>2]=t^k&(h^t);y[d+204>>2]=n^k&(i^n);y[d+200>>2]=x^k&(o^x);y[d+196>>2]=v^k&(q^v);y[d+192>>2]=r^k&(p^r);bb(A,A);ga(C,C,A);pa(a,C);ja(oa,32);e=0;}T=d+368|0;return e|0}function Nc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=T-4032|0;T=d;qa(d+160|0,c);f=y[c+36>>2];y[d+3840>>2]=y[c+32>>2];y[d+3844>>2]=f;f=y[c+28>>2];y[d+3832>>2]=y[c+24>>2];y[d+3836>>2]=f;f=y[c+20>>2];y[d+3824>>2]=y[c+16>>2];y[d+3828>>2]=f;f=y[c+12>>2];y[d+3816>>2]=y[c+8>>2];y[d+3820>>2]=f;f=y[c+4>>2];y[d+3808>>2]=y[c>>2];y[d+3812>>2]=f;f=y[c+44>>2];y[d+3848>>2]=y[c+40>>2];y[d+3852>>2]=f;f=y[c+52>>2];y[d+3856>>2]=y[c+48>>2];y[d+3860>>2]=f;f=y[c+60>>2];y[d+3864>>2]=y[c+56>>2];y[d+3868>>2]=f;f=c- -64|0;e=y[f+4>>2];y[d+3872>>2]=y[f>>2];y[d+3876>>2]=e;f=y[c+76>>2];y[d+3880>>2]=y[c+72>>2];y[d+3884>>2]=f;f=y[c+84>>2];y[d+3888>>2]=y[c+80>>2];y[d+3892>>2]=f;f=y[c+92>>2];y[d+3896>>2]=y[c+88>>2];y[d+3900>>2]=f;f=y[c+100>>2];y[d+3904>>2]=y[c+96>>2];y[d+3908>>2]=f;f=y[c+108>>2];y[d+3912>>2]=y[c+104>>2];y[d+3916>>2]=f;f=y[c+116>>2];y[d+3920>>2]=y[c+112>>2];y[d+3924>>2]=f;e=d+3528|0;f=d+3808|0;xa(e,f);h=d+2408|0;g=d+3648|0;ga(h,e,g);i=d+3568|0;j=d+3608|0;ga(d+2448|0,i,j);ga(d+2488|0,j,g);ga(d+2528|0,e,i);g=d+320|0;qa(g,h);e=d+3368|0;sa(e,c,g);h=d+2248|0;g=d+3488|0;ga(h,e,g);i=d+3408|0;j=d+3448|0;ga(d+2288|0,i,j);ga(d+2328|0,j,g);ga(d+2368|0,e,i);qa(d+480|0,h);e=y[d+2444>>2];y[d+3840>>2]=y[d+2440>>2];y[d+3844>>2]=e;e=y[d+2436>>2];y[d+3832>>2]=y[d+2432>>2];y[d+3836>>2]=e;e=y[d+2428>>2];y[d+3824>>2]=y[d+2424>>2];y[d+3828>>2]=e;e=y[d+2420>>2];y[d+3816>>2]=y[d+2416>>2];y[d+3820>>2]=e;e=y[d+2412>>2];y[d+3808>>2]=y[d+2408>>2];y[d+3812>>2]=e;e=y[d+2452>>2];y[d+3848>>2]=y[d+2448>>2];y[d+3852>>2]=e;e=y[d+2460>>2];y[d+3856>>2]=y[d+2456>>2];y[d+3860>>2]=e;e=y[d+2468>>2];y[d+3864>>2]=y[d+2464>>2];y[d+3868>>2]=e;e=y[d+2476>>2];y[d+3872>>2]=y[d+2472>>2];y[d+3876>>2]=e;e=y[d+2484>>2];y[d+3880>>2]=y[d+2480>>2];y[d+3884>>2]=e;e=y[d+2524>>2];y[d+3920>>2]=y[d+2520>>2];y[d+3924>>2]=e;e=y[d+2516>>2];y[d+3912>>2]=y[d+2512>>2];y[d+3916>>2]=e;e=y[d+2508>>2];y[d+3904>>2]=y[d+2504>>2];y[d+3908>>2]=e;e=y[d+2500>>2];y[d+3896>>2]=y[d+2496>>2];y[d+3900>>2]=e;e=y[d+2492>>2];y[d+3888>>2]=y[d+2488>>2];y[d+3892>>2]=e;e=d+3208|0;xa(e,f);h=d+2088|0;g=d+3328|0;ga(h,e,g);i=d+3248|0;j=d+3288|0;ga(d+2128|0,i,j);ga(d+2168|0,j,g);ga(d+2208|0,e,i);g=d+640|0;qa(g,h);e=d+3048|0;sa(e,c,g);h=d+1928|0;g=d+3168|0;ga(h,e,g);i=d+3088|0;j=d+3128|0;ga(d+1968|0,i,j);ga(d+2008|0,j,g);ga(d+2048|0,e,i);qa(d+800|0,h);e=y[d+2284>>2];y[d+3840>>2]=y[d+2280>>2];y[d+3844>>2]=e;e=y[d+2276>>2];y[d+3832>>2]=y[d+2272>>2];y[d+3836>>2]=e;e=y[d+2268>>2];y[d+3824>>2]=y[d+2264>>2];y[d+3828>>2]=e;e=y[d+2260>>2];y[d+3816>>2]=y[d+2256>>2];y[d+3820>>2]=e;e=y[d+2252>>2];y[d+3808>>2]=y[d+2248>>2];y[d+3812>>2]=e;e=y[d+2292>>2];y[d+3848>>2]=y[d+2288>>2];y[d+3852>>2]=e;e=y[d+2300>>2];y[d+3856>>2]=y[d+2296>>2];y[d+3860>>2]=e;e=y[d+2308>>2];y[d+3864>>2]=y[d+2304>>2];y[d+3868>>2]=e;e=y[d+2316>>2];y[d+3872>>2]=y[d+2312>>2];y[d+3876>>2]=e;e=y[d+2324>>2];y[d+3880>>2]=y[d+2320>>2];y[d+3884>>2]=e;e=y[d+2364>>2];y[d+3920>>2]=y[d+2360>>2];y[d+3924>>2]=e;e=y[d+2356>>2];y[d+3912>>2]=y[d+2352>>2];y[d+3916>>2]=e;e=y[d+2348>>2];y[d+3904>>2]=y[d+2344>>2];y[d+3908>>2]=e;e=y[d+2340>>2];y[d+3896>>2]=y[d+2336>>2];y[d+3900>>2]=e;e=y[d+2332>>2];y[d+3888>>2]=y[d+2328>>2];y[d+3892>>2]=e;e=d+2888|0;xa(e,f);h=d+1768|0;g=d+3008|0;ga(h,e,g);i=d+2928|0;j=d+2968|0;ga(d+1808|0,i,j);ga(d+1848|0,j,g);ga(d+1888|0,e,i);g=d+960|0;qa(g,h);e=d+2728|0;sa(e,c,g);c=d+1608|0;h=d+2848|0;ga(c,e,h);g=d+2768|0;i=d+2808|0;ga(d+1648|0,g,i);ga(d+1688|0,i,h);ga(d+1728|0,e,g);qa(d+1120|0,c);c=y[d+2124>>2];y[d+3840>>2]=y[d+2120>>2];y[d+3844>>2]=c;c=y[d+2116>>2];y[d+3832>>2]=y[d+2112>>2];y[d+3836>>2]=c;c=y[d+2108>>2];y[d+3824>>2]=y[d+2104>>2];y[d+3828>>2]=c;c=y[d+2100>>2];y[d+3816>>2]=y[d+2096>>2];y[d+3820>>2]=c;c=y[d+2092>>2];y[d+3808>>2]=y[d+2088>>2];y[d+3812>>2]=c;c=y[d+2132>>2];y[d+3848>>2]=y[d+2128>>2];y[d+3852>>2]=c;c=y[d+2140>>2];y[d+3856>>2]=y[d+2136>>2];y[d+3860>>2]=c;c=y[d+2148>>2];y[d+3864>>2]=y[d+2144>>2];y[d+3868>>2]=c;c=y[d+2156>>2];y[d+3872>>2]=y[d+2152>>2];y[d+3876>>2]=c;c=y[d+2164>>2];y[d+3880>>2]=y[d+2160>>2];y[d+3884>>2]=c;c=y[d+2204>>2];y[d+3920>>2]=y[d+2200>>2];y[d+3924>>2]=c;c=y[d+2196>>2];y[d+3912>>2]=y[d+2192>>2];y[d+3916>>2]=c;c=y[d+2188>>2];y[d+3904>>2]=y[d+2184>>2];y[d+3908>>2]=c;c=y[d+2180>>2];y[d+3896>>2]=y[d+2176>>2];y[d+3900>>2]=c;c=y[d+2172>>2];y[d+3888>>2]=y[d+2168>>2];y[d+3892>>2]=c;c=d+2568|0;xa(c,f);f=d+1448|0;e=d+2688|0;ga(f,c,e);h=d+2608|0;g=d+2648|0;ga(d+1488|0,h,g);ga(d+1528|0,g,e);ga(d+1568|0,c,h);qa(d+1280|0,f);c=z[b|0];w[d+3969|0]=c>>>4;w[d+3968|0]=c&15;c=z[b+1|0];w[d+3971|0]=c>>>4;w[d+3970|0]=c&15;c=z[b+2|0];w[d+3973|0]=c>>>4;w[d+3972|0]=c&15;c=z[b+3|0];w[d+3975|0]=c>>>4;w[d+3974|0]=c&15;c=z[b+4|0];w[d+3977|0]=c>>>4;w[d+3976|0]=c&15;c=z[b+5|0];w[d+3979|0]=c>>>4;w[d+3978|0]=c&15;c=z[b+6|0];w[d+3981|0]=c>>>4;w[d+3980|0]=c&15;c=z[b+7|0];w[d+3983|0]=c>>>4;w[d+3982|0]=c&15;c=z[b+8|0];w[d+3985|0]=c>>>4;w[d+3984|0]=c&15;c=z[b+9|0];w[d+3987|0]=c>>>4;w[d+3986|0]=c&15;c=z[b+10|0];w[d+3989|0]=c>>>4;w[d+3988|0]=c&15;c=z[b+11|0];w[d+3991|0]=c>>>4;w[d+3990|0]=c&15;c=z[b+12|0];w[d+3993|0]=c>>>4;w[d+3992|0]=c&15;c=z[b+13|0];w[d+3995|0]=c>>>4;w[d+3994|0]=c&15;c=z[b+14|0];w[d+3997|0]=c>>>4;w[d+3996|0]=c&15;c=z[b+15|0];w[d+3999|0]=c>>>4;w[d+3998|0]=c&15;c=z[b+16|0];w[d+4001|0]=c>>>4;w[d+4e3|0]=c&15;c=z[b+17|0];w[d+4003|0]=c>>>4;w[d+4002|0]=c&15;c=z[b+18|0];w[d+4005|0]=c>>>4;w[d+4004|0]=c&15;c=z[b+19|0];w[d+4007|0]=c>>>4;w[d+4006|0]=c&15;c=z[b+20|0];w[d+4009|0]=c>>>4;w[d+4008|0]=c&15;c=z[b+21|0];w[d+4011|0]=c>>>4;w[d+4010|0]=c&15;c=z[b+22|0];w[d+4013|0]=c>>>4;w[d+4012|0]=c&15;c=z[b+23|0];w[d+4015|0]=c>>>4;w[d+4014|0]=c&15;c=z[b+24|0];w[d+4017|0]=c>>>4;w[d+4016|0]=c&15;c=z[b+25|0];w[d+4019|0]=c>>>4;w[d+4018|0]=c&15;c=z[b+26|0];w[d+4021|0]=c>>>4;w[d+4020|0]=c&15;c=z[b+27|0];w[d+4023|0]=c>>>4;w[d+4022|0]=c&15;c=z[b+28|0];w[d+4025|0]=c>>>4;w[d+4024|0]=c&15;c=z[b+29|0];w[d+4027|0]=c>>>4;w[d+4026|0]=c&15;c=z[b+30|0];w[d+4029|0]=c>>>4;w[d+4028|0]=c&15;b=z[b+31|0];w[d+4031|0]=b>>>4;w[d+4030|0]=b&15;b=0;c=0;while(1){e=b;b=(d+3968|0)+c|0;e=e+z[b|0]|0;f=e+8|0;w[b|0]=e-(f&240);e=z[b+1|0]+(f<<24>>24>>4)|0;f=e+8|0;w[b+1|0]=e-(f&240);e=z[b+2|0]+(f<<24>>24>>4)|0;f=e+8|0;w[b+2|0]=e-(f&240);b=f<<24>>24>>4;c=c+3|0;if((c|0)!=63){continue}break}w[d+4031|0]=z[d+4031|0]+b;y[a+32>>2]=0;y[a+36>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;k=a+40|0;y[k>>2]=1;y[a+52>>2]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=1;o(a+84|0,0,76);l=a+120|0;m=a+80|0;g=d+3768|0;c=d+3888|0;e=d+3848|0;i=d+3728|0;f=d+3928|0;j=63;while(1){n=d+160|0;Mc(d,n,w[(d+3968|0)+j|0]);b=d+3808|0;sa(b,a,d);h=d+3688|0;ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(a,b,f);ga(k,e,c);ga(m,c,f);ga(l,b,e);j=j-1|0;if(j){continue}break}Mc(d,n,w[d+3968|0]);sa(b,a,d);ga(a,b,f);ga(k,e,c);ga(m,c,f);ga(l,b,e);T=d+4032|0;}function Tb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0;e=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D>>2]=E;e=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+4>>2]=E;e=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+8>>2]=E;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+12>>2]=E;e=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+16>>2]=E;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+20>>2]=E;e=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+24>>2]=E;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+28>>2]=E;e=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+32>>2]=E;e=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+36>>2]=E;e=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+40>>2]=E;e=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+44>>2]=E;e=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+48>>2]=E;e=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+52>>2]=E;e=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+56>>2]=E;b=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);D=c,E=Di(b&16711935,8)|Di(b,24)&16711935,y[D+60>>2]=E;b=y[a+28>>2];y[d+24>>2]=y[a+24>>2];y[d+28>>2]=b;b=y[a+20>>2];y[d+16>>2]=y[a+16>>2];y[d+20>>2]=b;b=y[a+12>>2];y[d+8>>2]=y[a+8>>2];y[d+12>>2]=b;b=y[a+4>>2];y[d>>2]=y[a>>2];y[d+4>>2]=b;while(1){h=y[d+28>>2];e=s<<2;b=e+c|0;i=y[d+16>>2];g=y[b>>2]+(Bi(i,26)^Bi(i,21)^Bi(i,7))|0;f=y[e+39360>>2]+g|0;g=y[d+24>>2];n=y[d+20>>2];h=(f+(i&(g^n)^g)|0)+h|0;k=h+y[d+12>>2]|0;y[d+12>>2]=k;f=y[d>>2];l=h+(Bi(f,30)^Bi(f,19)^Bi(f,10))|0;m=y[d+8>>2];j=y[d+4>>2];h=l+(f&(m|j)|j&m)|0;y[d+28>>2]=h;l=m;m=e|4;q=m+c|0;g=(y[q>>2]+((g+(n^k&(i^n))|0)+(Bi(k,26)^Bi(k,21)^Bi(k,7))|0)|0)+y[m+39360>>2]|0;m=l+g|0;y[d+8>>2]=m;g=(g+(h&(f|j)|f&j)|0)+(Bi(h,30)^Bi(h,19)^Bi(h,10))|0;y[d+24>>2]=g;l=j;j=e|8;j=(((n+y[j+c>>2]|0)+y[j+39360>>2]|0)+(i^m&(i^k))|0)+(Bi(m,26)^Bi(m,21)^Bi(m,7))|0;n=l+j|0;y[d+4>>2]=n;j=j+((g&(f|h)|f&h)+(Bi(g,30)^Bi(g,19)^Bi(g,10))|0)|0;y[d+20>>2]=j;l=f;f=e|12;f=(((i+y[f+c>>2]|0)+y[f+39360>>2]|0)+(k^n&(m^k))|0)+(Bi(n,26)^Bi(n,21)^Bi(n,7))|0;i=l+f|0;y[d>>2]=i;f=f+((j&(g|h)|g&h)+(Bi(j,30)^Bi(j,19)^Bi(j,10))|0)|0;y[d+16>>2]=f;l=k;k=e|16;l=(((l+y[k+c>>2]|0)+y[k+39360>>2]|0)+(m^i&(m^n))|0)+(Bi(i,26)^Bi(i,21)^Bi(i,7))|0;k=l+((f&(g|j)|g&j)+(Bi(f,30)^Bi(f,19)^Bi(f,10))|0)|0;y[d+12>>2]=k;l=h+l|0;y[d+28>>2]=l;h=e|20;m=(((m+y[h+c>>2]|0)+y[h+39360>>2]|0)+(n^l&(i^n))|0)+(Bi(l,26)^Bi(l,21)^Bi(l,7))|0;h=m+((k&(f|j)|f&j)+(Bi(k,30)^Bi(k,19)^Bi(k,10))|0)|0;y[d+8>>2]=h;m=g+m|0;y[d+24>>2]=m;g=e|24;n=(((n+y[g+c>>2]|0)+y[g+39360>>2]|0)+(i^m&(i^l))|0)+(Bi(m,26)^Bi(m,21)^Bi(m,7))|0;g=n+((h&(f|k)|f&k)+(Bi(h,30)^Bi(h,19)^Bi(h,10))|0)|0;y[d+4>>2]=g;n=j+n|0;y[d+20>>2]=n;j=e|28;i=(((i+y[j+c>>2]|0)+y[j+39360>>2]|0)+(l^n&(m^l))|0)+(Bi(n,26)^Bi(n,21)^Bi(n,7))|0;j=i+((g&(h|k)|h&k)+(Bi(g,30)^Bi(g,19)^Bi(g,10))|0)|0;y[d>>2]=j;i=f+i|0;y[d+16>>2]=i;f=e|32;l=(((l+y[f+c>>2]|0)+y[f+39360>>2]|0)+(m^i&(m^n))|0)+(Bi(i,26)^Bi(i,21)^Bi(i,7))|0;f=l+((j&(g|h)|g&h)+(Bi(j,30)^Bi(j,19)^Bi(j,10))|0)|0;y[d+28>>2]=f;l=k+l|0;y[d+12>>2]=l;k=e|36;r=k+c|0;m=(((m+y[r>>2]|0)+y[k+39360>>2]|0)+(n^l&(i^n))|0)+(Bi(l,26)^Bi(l,21)^Bi(l,7))|0;k=m+((f&(g|j)|g&j)+(Bi(f,30)^Bi(f,19)^Bi(f,10))|0)|0;y[d+24>>2]=k;m=h+m|0;y[d+8>>2]=m;h=e|40;v=h+c|0;n=(((n+y[v>>2]|0)+y[h+39360>>2]|0)+(i^m&(i^l))|0)+(Bi(m,26)^Bi(m,21)^Bi(m,7))|0;h=n+((k&(f|j)|f&j)+(Bi(k,30)^Bi(k,19)^Bi(k,10))|0)|0;y[d+20>>2]=h;n=g+n|0;y[d+4>>2]=n;g=e|44;w=g+c|0;i=((i+(y[g+39360>>2]+y[w>>2]|0)|0)+(l^n&(m^l))|0)+(Bi(n,26)^Bi(n,21)^Bi(n,7))|0;g=i+((h&(f|k)|f&k)+(Bi(h,30)^Bi(h,19)^Bi(h,10))|0)|0;y[d+16>>2]=g;j=i+j|0;y[d>>2]=j;i=e|48;x=i+c|0;l=((l+(y[i+39360>>2]+y[x>>2]|0)|0)+(m^j&(m^n))|0)+(Bi(j,26)^Bi(j,21)^Bi(j,7))|0;i=l+((g&(h|k)|h&k)+(Bi(g,30)^Bi(g,19)^Bi(g,10))|0)|0;y[d+12>>2]=i;f=f+l|0;y[d+28>>2]=f;l=e|52;A=l+c|0;l=(((y[l+39360>>2]+y[A>>2]|0)+m|0)+(n^f&(j^n))|0)+(Bi(f,26)^Bi(f,21)^Bi(f,7))|0;m=l+((i&(g|h)|g&h)+(Bi(i,30)^Bi(i,19)^Bi(i,10))|0)|0;y[d+8>>2]=m;k=k+l|0;y[d+24>>2]=k;o=e|56;l=o+c|0;o=(((y[o+39360>>2]+y[l>>2]|0)+n|0)+(j^k&(f^j))|0)+(Bi(k,26)^Bi(k,21)^Bi(k,7))|0;n=o+((m&(g|i)|g&i)+(Bi(m,30)^Bi(m,19)^Bi(m,10))|0)|0;y[d+4>>2]=n;h=h+o|0;y[d+20>>2]=h;e=e|60;B=e+c|0;e=((j+(y[e+39360>>2]+y[B>>2]|0)|0)+(f^h&(f^k))|0)+(Bi(h,26)^Bi(h,21)^Bi(h,7))|0;h=e+((n&(i|m)|i&m)+(Bi(n,30)^Bi(n,19)^Bi(n,10))|0)|0;y[d>>2]=h;y[d+16>>2]=e+g;if((s|0)!=48){s=s+16|0;C=y[r>>2];r=y[l>>2];f=y[b>>2]+(C+(Bi(r,15)^Bi(r,13)^r>>>10)|0)|0;h=y[q>>2];e=f+(Bi(h,25)^Bi(h,14)^h>>>3)|0;y[(s<<2)+c>>2]=e;g=y[b+8>>2];j=y[b+44>>2];f=g+(j+(Bi(e,15)^Bi(e,13)^e>>>10)|0)|0;i=y[b+12>>2];f=f+(Bi(i,25)^Bi(i,14)^i>>>3)|0;y[b+72>>2]=f;q=y[b+40>>2];k=q+h|0;h=y[b+60>>2];g=(k+(Bi(h,15)^Bi(h,13)^h>>>10)|0)+(Bi(g,25)^Bi(g,14)^g>>>3)|0;y[b+68>>2]=g;k=y[b+16>>2];m=y[b+52>>2];l=k+(m+(Bi(f,15)^Bi(f,13)^f>>>10)|0)|0;o=y[b+20>>2];n=l+(Bi(o,25)^Bi(o,14)^o>>>3)|0;y[b+80>>2]=n;t=y[b+48>>2];k=(i+(t+(Bi(g,15)^Bi(g,13)^g>>>10)|0)|0)+(Bi(k,25)^Bi(k,14)^k>>>3)|0;y[b+76>>2]=k;i=y[b+24>>2];l=i+(h+(Bi(n,15)^Bi(n,13)^n>>>10)|0)|0;p=y[b+28>>2];l=l+(Bi(p,25)^Bi(p,14)^p>>>3)|0;y[b+88>>2]=l;u=y[b+56>>2];i=(o+(u+(Bi(k,15)^Bi(k,13)^k>>>10)|0)|0)+(Bi(i,25)^Bi(i,14)^i>>>3)|0;y[b+84>>2]=i;o=(e+p|0)+(Bi(i,15)^Bi(i,13)^i>>>10)|0;p=y[b+32>>2];o=o+(Bi(p,25)^Bi(p,14)^p>>>3)|0;y[b+92>>2]=o;p=(g+p|0)+(Bi(l,15)^Bi(l,13)^l>>>10)|0;g=y[b+36>>2];g=p+(Bi(g,25)^Bi(g,14)^g>>>3)|0;y[b+96>>2]=g;f=(f+((Bi(q,25)^Bi(q,14)^q>>>3)+C|0)|0)+(Bi(o,15)^Bi(o,13)^o>>>10)|0;y[b+100>>2]=f;j=(y[v>>2]+(k+(Bi(j,25)^Bi(j,14)^j>>>3)|0)|0)+(Bi(g,15)^Bi(g,13)^g>>>10)|0;y[b+104>>2]=j;f=(y[w>>2]+(n+(Bi(t,25)^Bi(t,14)^t>>>3)|0)|0)+(Bi(f,15)^Bi(f,13)^f>>>10)|0;y[b+108>>2]=f;j=(y[x>>2]+(i+(Bi(m,25)^Bi(m,14)^m>>>3)|0)|0)+(Bi(j,15)^Bi(j,13)^j>>>10)|0;y[b+112>>2]=j;f=(y[A>>2]+(l+(Bi(u,25)^Bi(u,14)^u>>>3)|0)|0)+(Bi(f,15)^Bi(f,13)^f>>>10)|0;y[b+116>>2]=f;D=b,E=(o+(r+(Bi(h,25)^Bi(h,14)^h>>>3)|0)|0)+(Bi(j,15)^Bi(j,13)^j>>>10)|0,y[D+120>>2]=E;D=b,E=(y[B>>2]+(g+(Bi(e,25)^Bi(e,14)^e>>>3)|0)|0)+(Bi(f,15)^Bi(f,13)^f>>>10)|0,y[D+124>>2]=E;continue}break}y[a>>2]=h+y[a>>2];y[a+4>>2]=y[a+4>>2]+y[d+4>>2];y[a+8>>2]=y[a+8>>2]+y[d+8>>2];y[a+12>>2]=y[a+12>>2]+y[d+12>>2];y[a+16>>2]=y[a+16>>2]+y[d+16>>2];y[a+20>>2]=y[a+20>>2]+y[d+20>>2];y[a+24>>2]=y[a+24>>2]+y[d+24>>2];y[a+28>>2]=y[a+28>>2]+y[d+28>>2];}function Pe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=T-544|0;T=c;g=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);h=z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24);i=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);j=z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24);k=z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24);l=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);m=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);n=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);d=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);o=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);p=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);q=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);r=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);s=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);t=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);u=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=y[b+124>>2];y[c+536>>2]=y[b+120>>2];y[c+540>>2]=a;a=y[b+116>>2];y[c+528>>2]=y[b+112>>2];y[c+532>>2]=a;a=y[b+100>>2];y[c+496>>2]=y[b+96>>2];y[c+500>>2]=a;a=y[b+108>>2];y[c+504>>2]=y[b+104>>2];y[c+508>>2]=a;a=y[b+116>>2];y[c+480>>2]=y[b+112>>2];y[c+484>>2]=a;a=y[b+124>>2];y[c+488>>2]=y[b+120>>2];y[c+492>>2]=a;a=c+512|0;ia(a,c+496|0,c+480|0);f=y[c+524>>2];y[b+120>>2]=y[c+520>>2];y[b+124>>2]=f;f=y[c+516>>2];y[b+112>>2]=y[c+512>>2];y[b+116>>2]=f;f=y[b+84>>2];y[c+464>>2]=y[b+80>>2];y[c+468>>2]=f;f=y[b+92>>2];y[c+472>>2]=y[b+88>>2];y[c+476>>2]=f;f=y[b+100>>2];y[c+448>>2]=y[b+96>>2];y[c+452>>2]=f;f=y[b+108>>2];y[c+456>>2]=y[b+104>>2];y[c+460>>2]=f;ia(a,c+464|0,c+448|0);f=y[c+524>>2];y[b+104>>2]=y[c+520>>2];y[b+108>>2]=f;f=y[c+516>>2];y[b+96>>2]=y[c+512>>2];y[b+100>>2]=f;f=b- -64|0;e=y[f+4>>2];y[c+432>>2]=y[f>>2];y[c+436>>2]=e;e=y[b+76>>2];y[c+440>>2]=y[b+72>>2];y[c+444>>2]=e;e=y[b+84>>2];y[c+416>>2]=y[b+80>>2];y[c+420>>2]=e;e=y[b+92>>2];y[c+424>>2]=y[b+88>>2];y[c+428>>2]=e;ia(a,c+432|0,c+416|0);e=y[c+524>>2];y[b+88>>2]=y[c+520>>2];y[b+92>>2]=e;e=y[c+516>>2];y[b+80>>2]=y[c+512>>2];y[b+84>>2]=e;e=y[b+52>>2];y[c+400>>2]=y[b+48>>2];y[c+404>>2]=e;e=y[b+60>>2];y[c+408>>2]=y[b+56>>2];y[c+412>>2]=e;e=y[f+4>>2];y[c+384>>2]=y[f>>2];y[c+388>>2]=e;e=y[b+76>>2];y[c+392>>2]=y[b+72>>2];y[c+396>>2]=e;ia(a,c+400|0,c+384|0);e=y[c+524>>2];y[b+72>>2]=y[c+520>>2];y[b+76>>2]=e;e=y[c+516>>2];y[f>>2]=y[c+512>>2];y[f+4>>2]=e;e=y[b+36>>2];y[c+368>>2]=y[b+32>>2];y[c+372>>2]=e;e=y[b+44>>2];y[c+376>>2]=y[b+40>>2];y[c+380>>2]=e;e=y[b+52>>2];y[c+352>>2]=y[b+48>>2];y[c+356>>2]=e;e=y[b+60>>2];y[c+360>>2]=y[b+56>>2];y[c+364>>2]=e;ia(a,c+368|0,c+352|0);e=y[c+524>>2];y[b+56>>2]=y[c+520>>2];y[b+60>>2]=e;e=y[c+516>>2];y[b+48>>2]=y[c+512>>2];y[b+52>>2]=e;e=y[b+20>>2];y[c+336>>2]=y[b+16>>2];y[c+340>>2]=e;e=y[b+28>>2];y[c+344>>2]=y[b+24>>2];y[c+348>>2]=e;e=y[b+36>>2];y[c+320>>2]=y[b+32>>2];y[c+324>>2]=e;e=y[b+44>>2];y[c+328>>2]=y[b+40>>2];y[c+332>>2]=e;ia(a,c+336|0,c+320|0);e=y[c+524>>2];y[b+40>>2]=y[c+520>>2];y[b+44>>2]=e;e=y[c+516>>2];y[b+32>>2]=y[c+512>>2];y[b+36>>2]=e;e=y[b+4>>2];y[c+304>>2]=y[b>>2];y[c+308>>2]=e;e=y[b+12>>2];y[c+312>>2]=y[b+8>>2];y[c+316>>2]=e;e=y[b+20>>2];y[c+288>>2]=y[b+16>>2];y[c+292>>2]=e;e=y[b+28>>2];y[c+296>>2]=y[b+24>>2];y[c+300>>2]=e;ia(a,c+304|0,c+288|0);e=y[c+524>>2];y[b+24>>2]=y[c+520>>2];y[b+28>>2]=e;e=y[c+516>>2];y[b+16>>2]=y[c+512>>2];y[b+20>>2]=e;e=y[c+532>>2];y[c+272>>2]=y[c+528>>2];y[c+276>>2]=e;e=y[c+540>>2];y[c+280>>2]=y[c+536>>2];y[c+284>>2]=e;e=y[b+4>>2];y[c+256>>2]=y[b>>2];y[c+260>>2]=e;e=y[b+12>>2];y[c+264>>2]=y[b+8>>2];y[c+268>>2]=e;ia(a,c+272|0,c+256|0);e=y[c+524>>2];y[b+8>>2]=y[c+520>>2];y[b+12>>2]=e;e=y[c+516>>2];y[b>>2]=y[c+512>>2];y[b+4>>2]=e;y[b+12>>2]=y[b+12>>2]^t;y[b+8>>2]=y[b+8>>2]^s;y[b+4>>2]=y[b+4>>2]^r;y[b>>2]=y[b>>2]^u;y[f>>2]=y[f>>2]^q;y[b+68>>2]=y[b+68>>2]^p;y[b+72>>2]=y[b+72>>2]^o;y[b+76>>2]=y[b+76>>2]^d;d=y[b+124>>2];y[c+536>>2]=y[b+120>>2];y[c+540>>2]=d;d=y[b+116>>2];y[c+528>>2]=y[b+112>>2];y[c+532>>2]=d;d=y[b+100>>2];y[c+240>>2]=y[b+96>>2];y[c+244>>2]=d;d=y[b+108>>2];y[c+248>>2]=y[b+104>>2];y[c+252>>2]=d;d=y[b+116>>2];y[c+224>>2]=y[b+112>>2];y[c+228>>2]=d;d=y[b+124>>2];y[c+232>>2]=y[b+120>>2];y[c+236>>2]=d;ia(a,c+240|0,c+224|0);d=y[c+524>>2];y[b+120>>2]=y[c+520>>2];y[b+124>>2]=d;d=y[c+516>>2];y[b+112>>2]=y[c+512>>2];y[b+116>>2]=d;d=y[b+84>>2];y[c+208>>2]=y[b+80>>2];y[c+212>>2]=d;d=y[b+92>>2];y[c+216>>2]=y[b+88>>2];y[c+220>>2]=d;d=y[b+100>>2];y[c+192>>2]=y[b+96>>2];y[c+196>>2]=d;d=y[b+108>>2];y[c+200>>2]=y[b+104>>2];y[c+204>>2]=d;ia(a,c+208|0,c+192|0);d=y[c+524>>2];y[b+104>>2]=y[c+520>>2];y[b+108>>2]=d;d=y[c+516>>2];y[b+96>>2]=y[c+512>>2];y[b+100>>2]=d;d=y[f+4>>2];y[c+176>>2]=y[f>>2];y[c+180>>2]=d;d=y[b+76>>2];y[c+184>>2]=y[b+72>>2];y[c+188>>2]=d;d=y[b+84>>2];y[c+160>>2]=y[b+80>>2];y[c+164>>2]=d;d=y[b+92>>2];y[c+168>>2]=y[b+88>>2];y[c+172>>2]=d;ia(a,c+176|0,c+160|0);d=y[c+524>>2];y[b+88>>2]=y[c+520>>2];y[b+92>>2]=d;d=y[c+516>>2];y[b+80>>2]=y[c+512>>2];y[b+84>>2]=d;d=y[b+52>>2];y[c+144>>2]=y[b+48>>2];y[c+148>>2]=d;d=y[b+60>>2];y[c+152>>2]=y[b+56>>2];y[c+156>>2]=d;d=y[f+4>>2];y[c+128>>2]=y[f>>2];y[c+132>>2]=d;d=y[b+76>>2];y[c+136>>2]=y[b+72>>2];y[c+140>>2]=d;ia(a,c+144|0,c+128|0);d=y[c+524>>2];y[b+72>>2]=y[c+520>>2];y[b+76>>2]=d;d=y[c+516>>2];y[f>>2]=y[c+512>>2];y[f+4>>2]=d;d=y[b+36>>2];y[c+112>>2]=y[b+32>>2];y[c+116>>2]=d;d=y[b+44>>2];y[c+120>>2]=y[b+40>>2];y[c+124>>2]=d;d=y[b+52>>2];y[c+96>>2]=y[b+48>>2];y[c+100>>2]=d;d=y[b+60>>2];y[c+104>>2]=y[b+56>>2];y[c+108>>2]=d;ia(a,c+112|0,c+96|0);d=y[c+524>>2];y[b+56>>2]=y[c+520>>2];y[b+60>>2]=d;d=y[c+516>>2];y[b+48>>2]=y[c+512>>2];y[b+52>>2]=d;d=y[b+20>>2];y[c+80>>2]=y[b+16>>2];y[c+84>>2]=d;d=y[b+28>>2];y[c+88>>2]=y[b+24>>2];y[c+92>>2]=d;d=y[b+36>>2];y[c+64>>2]=y[b+32>>2];y[c+68>>2]=d;d=y[b+44>>2];y[c+72>>2]=y[b+40>>2];y[c+76>>2]=d;ia(a,c+80|0,c- -64|0);d=y[c+524>>2];y[b+40>>2]=y[c+520>>2];y[b+44>>2]=d;d=y[c+516>>2];y[b+32>>2]=y[c+512>>2];y[b+36>>2]=d;d=y[b+4>>2];y[c+48>>2]=y[b>>2];y[c+52>>2]=d;d=y[b+12>>2];y[c+56>>2]=y[b+8>>2];y[c+60>>2]=d;d=y[b+20>>2];y[c+32>>2]=y[b+16>>2];y[c+36>>2]=d;d=y[b+28>>2];y[c+40>>2]=y[b+24>>2];y[c+44>>2]=d;ia(a,c+48|0,c+32|0);d=y[c+524>>2];y[b+24>>2]=y[c+520>>2];y[b+28>>2]=d;d=y[c+516>>2];y[b+16>>2]=y[c+512>>2];y[b+20>>2]=d;d=y[c+532>>2];y[c+16>>2]=y[c+528>>2];y[c+20>>2]=d;d=y[c+540>>2];y[c+24>>2]=y[c+536>>2];y[c+28>>2]=d;d=y[b+4>>2];y[c>>2]=y[b>>2];y[c+4>>2]=d;d=y[b+12>>2];y[c+8>>2]=y[b+8>>2];y[c+12>>2]=d;ia(a,c+16|0,c);a=y[c+524>>2];y[b+8>>2]=y[c+520>>2];y[b+12>>2]=a;a=y[c+516>>2];y[b>>2]=y[c+512>>2];y[b+4>>2]=a;y[b+12>>2]=y[b+12>>2]^n;y[b+8>>2]=y[b+8>>2]^m;y[b+4>>2]=y[b+4>>2]^l;y[b>>2]=y[b>>2]^k;y[f>>2]=y[f>>2]^j;y[b+68>>2]=y[b+68>>2]^i;y[b+72>>2]=y[b+72>>2]^h;y[b+76>>2]=y[b+76>>2]^g;T=c+544|0;}function Oc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;K=y[b+12>>2];u=K<<1;z=u>>31;f=y[b+4>>2];o=f<<1;v=o>>31;c=Ai(u,z,o,v);e=W;l=y[b+8>>2];R=l;L=l>>31;m=Ai(l,L,l,L);d=m+c|0;c=W+e|0;c=d>>>0>>0?c+1|0:c;h=y[b+16>>2];A=h>>31;g=y[b>>2];m=g<<1;w=m>>31;e=Ai(h,A,m,w);d=e+d|0;c=W+c|0;c=d>>>0>>0?c+1|0:c;G=y[b+28>>2];B=E(G,38);M=B>>31;S=G>>31;e=Ai(B,M,G,S);d=e+d|0;c=W+c|0;c=d>>>0>>0?c+1|0:c;e=d;H=y[b+32>>2];j=E(H,19);C=j>>31;p=y[b+24>>2];d=p<<1;i=Ai(j,C,d,d>>31);e=e+i|0;d=W+c|0;d=e>>>0>>0?d+1|0:d;$=y[b+36>>2];i=E($,38);x=i>>31;D=y[b+20>>2];q=D<<1;I=q>>31;c=Ai(i,x,q,I);e=c+e|0;b=W+d|0;c=(c>>>0>e>>>0?b+1|0:b)<<1|e>>>31;ba=c;T=e<<1;d=T+33554432|0;c=d>>>0<33554432?c+1|0:c;ca=d;da=c;b=c>>26;n=(c&67108863)<<6|d>>>26;c=Ai(o,v,h,A);e=W;l=l<<1;J=l>>31;U=K>>31;r=Ai(l,J,K,U);d=r+c|0;c=W+e|0;c=d>>>0>>0?c+1|0:c;O=D>>31;r=Ai(D,O,m,w);e=r+d|0;d=W+c|0;d=e>>>0>>0?d+1|0:d;r=G<<1;V=r>>31;P=Ai(j,C,r,V);e=P+e|0;c=W+d|0;c=e>>>0

>>0?c+1|0:c;F=p>>31;d=Ai(i,x,p,F);e=d+e|0;c=W+c|0;d=(d>>>0>e>>>0?c+1|0:c)<<1|e>>>31;c=e<<1;e=c+n|0;b=b+d|0;P=e;b=c>>>0>e>>>0?b+1|0:b;c=b;e=e+16777216|0;c=e>>>0<16777216?c+1|0:c;ea=e;n=(c&33554431)<<7|e>>>25;e=c>>25;b=Ai(u,z,K,U);c=W;d=Ai(h,A,l,J);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(o,v,q,I);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;s=Ai(m,w,p,F);d=s+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;Q=H>>31;s=Ai(j,C,H,Q);d=s+d|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;s=Ai(i,x,r,V);b=s+d|0;d=W+c|0;c=b;b=(c>>>0>>0?d+1|0:d)<<1|c>>>31;d=n;n=c<<1;d=d+n|0;c=b+e|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;s=b;e=c;y[a+24>>2]=d-(b&-67108864);b=E(D,38);d=Ai(b,b>>31,D,O);n=W;b=g;c=b>>31;c=Ai(b,c,b,c);b=c+d|0;d=W+n|0;d=b>>>0>>0?d+1|0:d;g=E(p,19);X=g>>31;n=h<<1;Y=n>>31;t=Ai(g,X,n,Y);b=t+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=Ai(u,z,B,M);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;t=Ai(j,C,l,J);d=t+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;t=Ai(o,v,i,x);d=t+d|0;c=W+b|0;Z=d<<1;c=(d>>>0>>0?c+1|0:c)<<1|d>>>31;t=c;b=Z+33554432|0;d=b>>>0<33554432?c+1|0:c;fa=b;ga=d;N=(d&67108863)<<6|b>>>26;_=d>>26;b=Ai(g,X,q,I);c=W;aa=f>>31;d=Ai(m,w,f,aa);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;k=Ai(h,A,B,M);d=k+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;k=Ai(j,C,u,z);d=k+d|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;b=Ai(i,x,R,L);k=b+d|0;d=W+c|0;b=(b>>>0>k>>>0?d+1|0:d)<<1|k>>>31;k=k<<1;d=k+N|0;c=b+_|0;c=d>>>0>>0?c+1|0:c;_=d;d=d+16777216|0;c=d>>>0<16777216?c+1|0:c;k=d;ha=(c&33554431)<<7|d>>>25;N=c>>25;b=Ai(m,w,R,L);c=W;d=Ai(o,v,f,aa);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;f=Ai(g,X,p,F);b=f+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;f=Ai(q,I,B,M);b=f+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=Ai(j,C,n,Y);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;f=Ai(i,x,u,z);d=f+b|0;b=W+c|0;c=(d>>>0>>0?b+1|0:b)<<1|d>>>31;d=d<<1;b=d+ha|0;c=c+N|0;g=b;c=b>>>0>>0?c+1|0:c;b=b+33554432|0;d=b>>>0<33554432?c+1|0:c;N=b;f=d;y[a+8>>2]=g-(b&-67108864);b=Ai(l,J,D,O);d=W;g=Ai(h,A,u,z);c=g+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;g=Ai(o,v,p,F);d=g+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;g=Ai(m,w,G,S);b=g+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;g=Ai(i,x,H,Q);b=g+b|0;c=W+d|0;c=(b>>>0>>0?c+1|0:c)<<1|b>>>31;d=e>>26;g=b<<1;b=(e&67108863)<<6|s>>>26;e=g+b|0;c=c+d|0;d=e;b=d>>>0>>0?c+1|0:c;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;g=c;e=b;y[a+28>>2]=d-(c&-33554432);b=Ai(m,w,K,U);c=W;d=Ai(o,v,R,L);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(p,F,B,M);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;j=Ai(j,C,q,I);d=j+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;j=Ai(i,x,h,A);c=j+d|0;d=W+b|0;b=c;c=(c>>>0>>0?d+1|0:d)<<1|c>>>31;d=b<<1;b=f>>26;f=(f&67108863)<<6|N>>>26;d=d+f|0;c=b+c|0;c=d>>>0>>0?c+1|0:c;b=d+16777216|0;c=b>>>0<16777216?c+1|0:c;j=b;f=c;y[a+12>>2]=d-(b&-33554432);b=Ai(p,F,l,J);c=W;d=Ai(h,A,h,A);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(u,z,q,I);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(o,v,r,V);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;h=Ai(m,w,H,Q);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=i;i=$;q=i>>31;h=Ai(c,x,i,q);c=h+d|0;d=W+b|0;b=c;c=(c>>>0>>0?d+1|0:d)<<1|c>>>31;d=b<<1;b=e>>25;e=(e&33554431)<<7|g>>>25;d=d+e|0;c=b+c|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;h=b;e=c;y[a+32>>2]=d-(b&-67108864);B=P-(ea&-33554432)|0;c=f>>25;f=(f&33554431)<<7|j>>>25;b=ca&-67108864;d=f+(T-b|0)|0;b=c+(ba-((b>>>0>T>>>0)+da|0)|0)|0;b=d>>>0>>0?b+1|0:b;f=d;c=b;d=d+33554432|0;c=d>>>0<33554432?c+1|0:c;b=((c&67108863)<<6|d>>>26)+B|0;y[a+20>>2]=b;y[a+16>>2]=f-(d&-67108864);b=Ai(u,z,p,F);d=W;f=Ai(D,O,n,Y);c=f+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;f=Ai(l,J,G,S);d=f+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;f=Ai(o,v,H,Q);b=f+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;f=Ai(m,w,i,q);b=f+b|0;c=W+d|0;c=(b>>>0>>0?c+1|0:c)<<1|b>>>31;d=e>>26;f=b<<1;b=(e&67108863)<<6|h>>>26;e=f+b|0;c=c+d|0;b=b>>>0>e>>>0?c+1|0:c;c=e+16777216|0;b=c>>>0<16777216?b+1|0:b;y[a+36>>2]=e-(c&-33554432);f=_-(k&-33554432)|0;d=fa&-67108864;e=Z-d|0;o=t-((d>>>0>Z>>>0)+ga|0)|0;b=Ai((b&33554431)<<7|c>>>25,b>>25,19,0);c=b+e|0;d=W+o|0;e=c;b=b>>>0>c>>>0?d+1|0:d;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+f|0;y[a+4>>2]=b;y[a>>2]=e-(c&-67108864);}function vi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0;j=T-528|0;T=j;Ie(i,h,j+400|0);i=0;if(g>>>0>31){h=32;while(1){He(f+i|0,j+400|0);i=h;h=h+32|0;if(h>>>0<=g>>>0){continue}break}}h=i|16;if(h>>>0<=g>>>0){while(1){i=f+i|0;l=z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24);m=z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24);n=z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24);p=z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24);i=y[j+492>>2];y[j+520>>2]=y[j+488>>2];y[j+524>>2]=i;i=y[j+484>>2];y[j+512>>2]=y[j+480>>2];y[j+516>>2]=i;i=y[j+468>>2];y[j+368>>2]=y[j+464>>2];y[j+372>>2]=i;i=y[j+476>>2];y[j+376>>2]=y[j+472>>2];y[j+380>>2]=i;i=y[j+484>>2];y[j+352>>2]=y[j+480>>2];y[j+356>>2]=i;i=y[j+492>>2];y[j+360>>2]=y[j+488>>2];y[j+364>>2]=i;i=j+496|0;ia(i,j+368|0,j+352|0);k=y[j+508>>2];y[j+488>>2]=y[j+504>>2];y[j+492>>2]=k;k=y[j+500>>2];y[j+480>>2]=y[j+496>>2];y[j+484>>2]=k;k=y[j+452>>2];y[j+336>>2]=y[j+448>>2];y[j+340>>2]=k;k=y[j+460>>2];y[j+344>>2]=y[j+456>>2];y[j+348>>2]=k;k=y[j+468>>2];y[j+320>>2]=y[j+464>>2];y[j+324>>2]=k;k=y[j+476>>2];y[j+328>>2]=y[j+472>>2];y[j+332>>2]=k;ia(i,j+336|0,j+320|0);k=y[j+508>>2];y[j+472>>2]=y[j+504>>2];y[j+476>>2]=k;k=y[j+500>>2];y[j+464>>2]=y[j+496>>2];y[j+468>>2]=k;k=y[j+436>>2];y[j+304>>2]=y[j+432>>2];y[j+308>>2]=k;k=y[j+444>>2];y[j+312>>2]=y[j+440>>2];y[j+316>>2]=k;k=y[j+452>>2];y[j+288>>2]=y[j+448>>2];y[j+292>>2]=k;k=y[j+460>>2];y[j+296>>2]=y[j+456>>2];y[j+300>>2]=k;ia(i,j+304|0,j+288|0);k=y[j+508>>2];y[j+456>>2]=y[j+504>>2];y[j+460>>2]=k;k=y[j+500>>2];y[j+448>>2]=y[j+496>>2];y[j+452>>2]=k;k=y[j+420>>2];y[j+272>>2]=y[j+416>>2];y[j+276>>2]=k;k=y[j+428>>2];y[j+280>>2]=y[j+424>>2];y[j+284>>2]=k;k=y[j+436>>2];y[j+256>>2]=y[j+432>>2];y[j+260>>2]=k;k=y[j+444>>2];y[j+264>>2]=y[j+440>>2];y[j+268>>2]=k;ia(i,j+272|0,j+256|0);k=y[j+508>>2];y[j+440>>2]=y[j+504>>2];y[j+444>>2]=k;k=y[j+500>>2];y[j+432>>2]=y[j+496>>2];y[j+436>>2]=k;k=y[j+404>>2];y[j+240>>2]=y[j+400>>2];y[j+244>>2]=k;k=y[j+412>>2];y[j+248>>2]=y[j+408>>2];y[j+252>>2]=k;k=y[j+420>>2];y[j+224>>2]=y[j+416>>2];y[j+228>>2]=k;k=y[j+428>>2];y[j+232>>2]=y[j+424>>2];y[j+236>>2]=k;ia(i,j+240|0,j+224|0);k=y[j+508>>2];y[j+424>>2]=y[j+504>>2];y[j+428>>2]=k;k=y[j+500>>2];y[j+416>>2]=y[j+496>>2];y[j+420>>2]=k;k=y[j+516>>2];y[j+208>>2]=y[j+512>>2];y[j+212>>2]=k;k=y[j+524>>2];y[j+216>>2]=y[j+520>>2];y[j+220>>2]=k;k=y[j+404>>2];y[j+192>>2]=y[j+400>>2];y[j+196>>2]=k;k=y[j+412>>2];y[j+200>>2]=y[j+408>>2];y[j+204>>2]=k;ia(i,j+208|0,j+192|0);y[j+412>>2]=p^y[j+508>>2];y[j+408>>2]=y[j+504>>2]^n;y[j+404>>2]=y[j+500>>2]^m;y[j+400>>2]=l^y[j+496>>2];i=h;h=h+16|0;if(h>>>0<=g>>>0){continue}break}}h=g&15;if(h){l=16-h|0;if(l){o(h|j+384,0,l);}if(h){t(j+384|0,f+i|0,h);}m=y[j+384>>2];n=y[j+388>>2];p=y[j+392>>2];k=y[j+396>>2];i=y[j+492>>2];f=y[j+488>>2];y[j+520>>2]=f;y[j+524>>2]=i;l=y[j+484>>2];h=y[j+480>>2];y[j+512>>2]=h;y[j+516>>2]=l;q=y[j+468>>2];y[j+176>>2]=y[j+464>>2];y[j+180>>2]=q;q=y[j+476>>2];y[j+184>>2]=y[j+472>>2];y[j+188>>2]=q;y[j+160>>2]=h;y[j+164>>2]=l;y[j+168>>2]=f;y[j+172>>2]=i;f=j+496|0;ia(f,j+176|0,j+160|0);h=y[j+508>>2];y[j+488>>2]=y[j+504>>2];y[j+492>>2]=h;h=y[j+500>>2];y[j+480>>2]=y[j+496>>2];y[j+484>>2]=h;h=y[j+452>>2];y[j+144>>2]=y[j+448>>2];y[j+148>>2]=h;h=y[j+460>>2];y[j+152>>2]=y[j+456>>2];y[j+156>>2]=h;h=y[j+468>>2];y[j+128>>2]=y[j+464>>2];y[j+132>>2]=h;h=y[j+476>>2];y[j+136>>2]=y[j+472>>2];y[j+140>>2]=h;ia(f,j+144|0,j+128|0);h=y[j+508>>2];y[j+472>>2]=y[j+504>>2];y[j+476>>2]=h;h=y[j+500>>2];y[j+464>>2]=y[j+496>>2];y[j+468>>2]=h;h=y[j+436>>2];y[j+112>>2]=y[j+432>>2];y[j+116>>2]=h;h=y[j+444>>2];y[j+120>>2]=y[j+440>>2];y[j+124>>2]=h;h=y[j+452>>2];y[j+96>>2]=y[j+448>>2];y[j+100>>2]=h;h=y[j+460>>2];y[j+104>>2]=y[j+456>>2];y[j+108>>2]=h;ia(f,j+112|0,j+96|0);h=y[j+508>>2];y[j+456>>2]=y[j+504>>2];y[j+460>>2]=h;h=y[j+500>>2];y[j+448>>2]=y[j+496>>2];y[j+452>>2]=h;h=y[j+420>>2];y[j+80>>2]=y[j+416>>2];y[j+84>>2]=h;h=y[j+428>>2];y[j+88>>2]=y[j+424>>2];y[j+92>>2]=h;h=y[j+436>>2];y[j+64>>2]=y[j+432>>2];y[j+68>>2]=h;h=y[j+444>>2];y[j+72>>2]=y[j+440>>2];y[j+76>>2]=h;ia(f,j+80|0,j- -64|0);h=y[j+508>>2];y[j+440>>2]=y[j+504>>2];y[j+444>>2]=h;h=y[j+500>>2];y[j+432>>2]=y[j+496>>2];y[j+436>>2]=h;h=y[j+404>>2];y[j+48>>2]=y[j+400>>2];y[j+52>>2]=h;h=y[j+412>>2];y[j+56>>2]=y[j+408>>2];y[j+60>>2]=h;h=y[j+420>>2];y[j+32>>2]=y[j+416>>2];y[j+36>>2]=h;h=y[j+428>>2];y[j+40>>2]=y[j+424>>2];y[j+44>>2]=h;ia(f,j+48|0,j+32|0);h=y[j+508>>2];y[j+424>>2]=y[j+504>>2];y[j+428>>2]=h;h=y[j+500>>2];y[j+416>>2]=y[j+496>>2];y[j+420>>2]=h;h=y[j+516>>2];y[j+16>>2]=y[j+512>>2];y[j+20>>2]=h;h=y[j+524>>2];y[j+24>>2]=y[j+520>>2];y[j+28>>2]=h;h=y[j+404>>2];y[j>>2]=y[j+400>>2];y[j+4>>2]=h;h=y[j+412>>2];y[j+8>>2]=y[j+408>>2];y[j+12>>2]=h;ia(f,j+16|0,j);y[j+412>>2]=k^y[j+508>>2];y[j+408>>2]=p^y[j+504>>2];y[j+404>>2]=n^y[j+500>>2];y[j+400>>2]=m^y[j+496>>2];}i=16;h=0;if(e>>>0>=16){while(1){Ge(a+h|0,d+h|0,j+400|0);h=i;i=h+16|0;if(i>>>0<=e>>>0){continue}break}}f=e&15;a:{if(!f){break a}i=16-f|0;if(i){o(f|j+384,0,i);}i=!f;if(!i){t(j+384|0,d+h|0,f);}d=j+512|0;Ge(d,j+384|0,j+400|0);if(i){break a}t(a+h|0,d,f);}Fe(b,c,g,e,j+400|0);T=j+528|0;return 0}function fa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;M=y[b+12>>2];q=M<<1;u=q>>31;S=M>>31;c=Ai(q,u,M,S);e=W;g=y[b+16>>2];v=g>>31;f=y[b+8>>2];x=f<<1;D=x>>31;k=Ai(g,v,x,D);d=k+c|0;c=W+e|0;c=d>>>0>>0?c+1|0:c;z=y[b+20>>2];o=z<<1;F=o>>31;h=y[b+4>>2];k=h<<1;r=k>>31;l=Ai(o,F,k,r);e=l+d|0;d=W+c|0;d=e>>>0>>0?d+1|0:d;p=y[b+24>>2];A=p>>31;G=y[b>>2];l=G<<1;s=l>>31;i=Ai(p,A,l,s);e=i+e|0;c=W+d|0;c=e>>>0>>0?c+1|0:c;d=e;H=y[b+32>>2];m=E(H,19);B=m>>31;P=H>>31;e=Ai(m,B,H,P);d=d+e|0;c=W+c|0;c=d>>>0>>0?c+1|0:c;_=y[b+36>>2];i=E(_,38);t=i>>31;I=y[b+28>>2];Q=I<<1;T=Q>>31;e=Ai(i,t,Q,T);d=e+d|0;b=W+c|0;C=d;e=d>>>0>>0?b+1|0:b;b=Ai(k,r,g,v);c=W;d=Ai(x,D,M,S);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;R=z>>31;j=Ai(z,R,l,s);b=j+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;j=Ai(m,B,Q,T);b=j+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=Ai(i,t,p,A);b=d+b|0;c=W+c|0;U=b;n=b>>>0>>0?c+1|0:c;c=Ai(k,r,q,u);d=W;b=f;w=b>>31;V=b;f=Ai(b,w,b,w);c=f+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;f=Ai(l,s,g,v);d=f+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;j=E(I,38);N=j>>31;X=I>>31;f=Ai(j,N,I,X);b=f+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;c=b;b=p<<1;f=Ai(m,B,b,b>>31);b=c+f|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=b;b=Ai(i,t,o,F);d=d+b|0;c=W+c|0;$=d;c=b>>>0>d>>>0?c+1|0:c;aa=c;b=c;d=d+33554432|0;b=d>>>0<33554432?b+1|0:b;ba=d;ca=b;c=b>>26;d=(b&67108863)<<6|d>>>26;b=d+U|0;c=c+n|0;U=b;c=b>>>0>>0?c+1|0:c;b=b+16777216|0;d=b>>>0<16777216?c+1|0:c;da=b;c=d>>25;b=(d&33554431)<<7|b>>>25;d=b+C|0;c=c+e|0;b=b>>>0>d>>>0?c+1|0:c;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;C=c;f=b;y[a+24>>2]=d-(c&-67108864);b=Ai(l,s,V,w);c=W;J=h>>31;e=Ai(k,r,h,J);b=e+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=E(p,19);O=e>>31;n=Ai(e,O,p,A);b=n+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;n=Ai(o,F,j,N);d=n+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;n=g<<1;Y=n>>31;K=Ai(m,B,n,Y);d=K+d|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;b=d;d=Ai(i,t,q,u);b=b+d|0;c=W+c|0;L=b;K=b>>>0>>0?c+1|0:c;b=Ai(o,F,e,O);c=W;h=Ai(l,s,h,J);b=h+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;h=Ai(g,v,j,N);b=h+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;h=Ai(m,B,q,u);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;h=Ai(i,t,V,w);d=h+d|0;c=W+b|0;Z=d;J=d>>>0>>0?c+1|0:c;b=E(z,38);d=Ai(b,b>>31,z,R);h=W;b=G;c=b>>31;G=d;d=Ai(b,c,b,c);b=G+d|0;c=W+h|0;c=b>>>0>>0?c+1|0:c;e=Ai(e,O,n,Y);b=e+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=Ai(q,u,j,N);b=e+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;e=Ai(m,B,x,D);d=e+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;e=Ai(k,r,i,t);d=e+d|0;c=W+b|0;h=d;c=d>>>0>>0?c+1|0:c;G=c;d=d+33554432|0;c=d>>>0<33554432?c+1|0:c;O=d;ea=c;b=c>>26;c=(c&67108863)<<6|d>>>26;e=c+Z|0;d=b+J|0;J=e;c=c>>>0>e>>>0?d+1|0:d;d=e+16777216|0;c=d>>>0<16777216?c+1|0:c;Z=d;e=(c&33554431)<<7|d>>>25;d=e+L|0;c=(c>>25)+K|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;K=b;e=c;y[a+8>>2]=d-(b&-67108864);b=Ai(x,D,z,R);c=W;d=Ai(g,v,q,u);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(k,r,p,A);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(l,s,I,X);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(i,t,H,P);L=d+b|0;b=W+c|0;d=d>>>0>L>>>0?b+1|0:b;c=f>>26;f=(f&67108863)<<6|C>>>26;b=f+L|0;d=c+d|0;C=b;c=b>>>0>>0?d+1|0:d;b=b+16777216|0;c=b>>>0<16777216?c+1|0:c;L=b;f=c;y[a+28>>2]=C-(b&-33554432);b=Ai(l,s,M,S);d=W;w=Ai(k,r,V,w);c=w+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;j=Ai(p,A,j,N);c=j+c|0;d=W+b|0;m=Ai(m,B,o,F);b=m+c|0;c=W+(c>>>0>>0?d+1|0:d)|0;c=b>>>0>>0?c+1|0:c;d=Ai(i,t,g,v);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=e>>26;C=b;b=(e&67108863)<<6|K>>>26;e=C+b|0;c=c+d|0;d=e;b=d>>>0>>0?c+1|0:c;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;m=c;e=b;y[a+12>>2]=d-(c&-33554432);b=Ai(p,A,x,D);c=W;d=Ai(g,v,g,v);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(q,u,o,F);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;g=Ai(k,r,Q,T);d=g+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;g=Ai(l,s,H,P);c=g+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;b=i;i=_;o=i>>31;g=Ai(b,t,i,o);b=g+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=b;b=f>>25;f=(f&33554431)<<7|L>>>25;d=d+f|0;c=b+c|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;g=b;f=c;y[a+32>>2]=d-(b&-67108864);j=U-(da&-33554432)|0;c=e>>25;e=(e&33554431)<<7|m>>>25;b=ba&-67108864;d=e+($-b|0)|0;b=c+(aa-((b>>>0>$>>>0)+ca|0)|0)|0;b=d>>>0>>0?b+1|0:b;e=d;d=d+33554432|0;c=d>>>0<33554432?b+1|0:b;b=((c&67108863)<<6|d>>>26)+j|0;y[a+20>>2]=b;y[a+16>>2]=e-(d&-67108864);b=Ai(q,u,p,A);d=W;e=Ai(z,R,n,Y);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;e=Ai(x,D,I,X);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;e=Ai(k,r,H,P);b=e+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;c=b;b=Ai(l,s,i,o);e=c+b|0;c=W+d|0;b=b>>>0>e>>>0?c+1|0:c;c=f>>26;f=(f&67108863)<<6|g>>>26;d=f+e|0;c=b+c|0;b=d>>>0>>0?c+1|0:c;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;y[a+36>>2]=d-(c&-33554432);f=J-(Z&-33554432)|0;d=O&-67108864;e=h-d|0;k=G-((d>>>0>h>>>0)+ea|0)|0;b=Ai((b&33554431)<<7|c>>>25,b>>25,19,0);d=b+e|0;c=W+k|0;b=b>>>0>d>>>0?c+1|0:c;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+f|0;y[a+4>>2]=b;y[a>>2]=d-(c&-67108864);}function af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);s=f^1886610805;g=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);q=g^1936682341;f=f^1852142177;h=g^1819895653;o=c;v=c&7;g=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);t=g^1852075907;c=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);r=c^1685025377;i=g^2037671283;g=c^1952801890;c=o&-8;if(c){n=b+c|0;while(1){u=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);p=g^u;c=p+h|0;k=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);d=i^k;e=f+d|0;i=e;c=e>>>0>>0?c+1|0:c;l=c;c=q+r|0;h=s+t|0;c=h>>>0>>0?c+1|0:c;f=Ci(t,r,13)^h;j=i+f|0;g=c;e=c^W;c=l+e|0;c=f>>>0>j>>>0?c+1|0:c;f=Ci(f,e,17)^j;m=c;e=c^W;r=Ci(f,e,13);q=W;c=Ci(d,p,16);d=l^W;p=c^i;g=Ci(h,g,32);h=p+g|0;c=W+d|0;g=g>>>0>h>>>0?c+1|0:c;c=g+e|0;i=f+h|0;c=i>>>0>>0?c+1|0:c;f=i^r;l=c;e=c^q;r=Ci(f,e,17);q=W;c=Ci(p,d,21);d=g^W;p=c^h;g=Ci(j,m,32);h=p+g|0;c=W+d|0;g=g>>>0>h>>>0?c+1|0:c;c=g+e|0;f=f+h|0;c=f>>>0>>0?c+1|0:c;t=f^r;e=c;r=c^q;c=Ci(p,d,16);g=g^W;j=g;c=c^h;m=Ci(c,g,21);h=W;g=Ci(i,l,32);l=g+c|0;c=W+j|0;i=m^l;c=g>>>0>l>>>0?c+1|0:c;g=c^h;f=Ci(f,e,32);h=W;s=k^l;q=c^u;b=b+8|0;if((n|0)!=(b|0)){continue}break}b=n;}j=0;d=o<<24;a:{switch(v-1|0){case 6:d=d|z[b+6|0]<<16;case 5:d=d|z[b+5|0]<<8;case 4:d=d|z[b+4|0];case 3:e=z[b+3|0];c=0;j=j|e<<24;d=c|d;case 2:e=z[b+2|0];c=0;j=j|e<<16;d=c|d;case 1:e=z[b+1|0];c=0;j=j|e<<8;d=c|d;case 0:j=z[b|0]|j;break;default:break a}}m=d;b=d^g;d=b;e=j^i;c=Ci(e,b,16);b=W;d=d+h|0;i=e+f|0;d=i>>>0>>0?d+1|0:d;e=c^i;l=d;d=d^b;k=Ci(e,d,21);g=W;c=q+r|0;f=s+t|0;c=f>>>0>>0?c+1|0:c;b=c;h=e;e=Ci(f,c,32);h=h+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;e=h^k;d=g;g=c;d=d^c;q=Ci(e,d,16);o=W;c=i;n=Ci(t,r,13)^f;i=n;f=c+i|0;k=W^b;c=k+l|0;l=e;b=f;c=b>>>0>>0?c+1|0:c;e=Ci(b,c,32);i=l+e|0;d=W+d|0;f=e>>>0>i>>>0?d+1|0:d;e=f^o;p=e;o=i^q;l=o;k=Ci(n,k,17)^b;b=k;d=b+h|0;h=W^c;c=h+g|0;c=b>>>0>d>>>0?c+1|0:c;b=c;g=Ci(d,c,32);l=g+l|0;c=W+e|0;j=j^l;g=g>>>0>l>>>0?c+1|0:c;m=g^m;c=Ci(k,h,13);b=b^W;h=b;e=c^d;c=Ci(e,b,17);b=W;d=f+h|0;f=e+i|0;d=f>>>0>>0?d+1|0:d;e=c^f;i=e+j|0;b=b^d;c=b+m|0;c=e>>>0>i>>>0?c+1|0:c;e=Ci(e,b,13)^i;h=c;b=c^W;n=Ci(e,b,17);j=W;m=Ci(o,p,21);o=g^W;k=m^l;d=Ci(f,d,32)^238;f=k+d|0;c=W+o|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;l=e+f|0;c=l>>>0>>0?c+1|0:c;e=l^n;g=c;b=c^j;j=Ci(e,b,13);m=W;c=Ci(k,o,16);n=d^W;k=c^f;c=Ci(i,h,32);f=k+c|0;d=W+n|0;d=c>>>0>f>>>0?d+1|0:d;c=d+b|0;i=e+f|0;c=i>>>0>>0?c+1|0:c;e=j^i;h=c;b=c^m;j=Ci(e,b,17);m=W;c=Ci(k,n,21);n=d^W;k=c^f;d=Ci(l,g,32);f=k+d|0;c=W+n|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;l=e+f|0;c=l>>>0>>0?c+1|0:c;e=j^l;g=c;b=c^m;j=Ci(e,b,13);m=W;c=Ci(k,n,16);n=d^W;k=c^f;d=Ci(i,h,32);f=k+d|0;c=W+n|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;i=e+f|0;c=i>>>0>>0?c+1|0:c;e=j^i;h=c;b=c^m;j=Ci(e,b,17);m=W;c=Ci(k,n,21);n=d^W;k=c^f;d=Ci(l,g,32);f=k+d|0;c=W+n|0;c=d>>>0>f>>>0?c+1|0:c;d=c+b|0;l=e+f|0;d=l>>>0>>0?d+1|0:d;e=j^l;g=d;b=d^m;j=Ci(e,b,13);m=W;d=Ci(k,n,16);n=c^W;k=d^f;d=Ci(i,h,32);f=k+d|0;c=W+n|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;i=e+f|0;c=i>>>0>>0?c+1|0:c;e=j^i;h=c;b=c^m;j=Ci(e,b,17);m=W;c=Ci(k,n,21);n=d^W;k=c^f;c=Ci(l,g,32);g=k+c|0;d=W+n|0;f=c>>>0>g>>>0?d+1|0:d;c=f+b|0;e=e+g|0;b=e>>>0>>0?c+1|0:c;d=b^m;l=d;j=e^j;c=Ci(k,n,16);k=f^W;g=c^g;f=Ci(i,h,32);h=g+f|0;c=W+k|0;b=Ci(e,b,32);i=W;c=f>>>0>h>>>0?c+1|0:c;e=c;f=a;g=Ci(g,k,21)^h;m=g^(b^(h^j));w[f|0]=m;w[f+1|0]=m>>>8;w[f+2|0]=m>>>16;w[f+3|0]=m>>>24;k=i^(c^d);d=c^W;c=k^d;w[f+4|0]=c;w[f+5|0]=c>>>8;w[f+6|0]=c>>>16;w[f+7|0]=c>>>24;c=d+i|0;f=b;b=b+g|0;c=f>>>0>b>>>0?c+1|0:c;m=b;f=Ci(g,d,16)^b;g=c;d=c^W;k=d;b=e;e=l;c=b+e|0;b=h;j=j^221;h=j;b=b+h|0;c=b>>>0>>0?c+1|0:c;h=Ci(b,c,32);i=h+f|0;d=W+d|0;f=Ci(f,k,21)^i;h=h>>>0>i>>>0?d+1|0:d;d=h^W;o=Ci(f,d,16);k=W;e=Ci(j,e,13);n=c^W;c=g+n|0;j=b^e;e=m+j|0;c=e>>>0>>0?c+1|0:c;b=c;g=f;f=Ci(e,c,32);l=g+f|0;c=W+d|0;g=f>>>0>l>>>0?c+1|0:c;c=g^k;k=c;o=l^o;m=Ci(o,c,21);f=W;c=Ci(j,n,17);n=b^W;d=h+n|0;j=c^e;e=i+j|0;d=e>>>0>>0?d+1|0:d;b=Ci(e,d,32);c=k+W|0;h=f;b=b+o|0;f=b>>>0>>0?c+1|0:c;c=h^f;k=c;h=b;o=m^b;m=Ci(o,c,16);i=W;b=Ci(j,n,13);n=d^W;c=g+n|0;j=b^e;e=l+j|0;c=e>>>0>>0?c+1|0:c;d=c;b=Ci(e,c,32);c=k+W|0;b=b+o|0;g=b>>>0>>0?c+1|0:c;c=g^i;k=c;l=b;o=m^b;m=Ci(o,c,21);i=W;b=Ci(j,n,17);n=d^W;c=f+n|0;j=b^e;e=h+j|0;c=e>>>0>>0?c+1|0:c;d=c;b=Ci(e,c,32);c=k+W|0;b=b+o|0;f=b>>>0>>0?c+1|0:c;c=f^i;k=c;h=b;o=m^b;m=Ci(o,c,16);i=W;b=Ci(j,n,13);j=d^W;c=g+j|0;g=b^e;e=l+g|0;c=e>>>0>>0?c+1|0:c;b=Ci(e,c,32);d=k+W|0;b=b+o|0;d=b>>>0>>0?d+1|0:d;m=Ci(b^m,d^i,21);i=W;e=Ci(g,j,17)^e;c=c^W;l=Ci(e,c,13);c=c+f|0;e=e+h|0;c=W^(e>>>0>>0?c+1|0:c);g=e^l;f=Ci(g,c,17)^m;e=W^i;c=c+d|0;d=b;b=b+g|0;c=d>>>0>b>>>0?c+1|0:c;b=Ci(b,c,32)^f^b;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=c^(W^e);w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;return 0}function Ne(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,z=0,A=0,B=0,C=0;f=T-288|0;T=f;i=y[e+44>>2]^d>>>29;j=y[e+40>>2]^d<<3;k=y[e+36>>2]^c>>>29;d=y[e+32>>2]^c<<3;g=e- -64|0;while(1){c=y[e+124>>2];y[f+280>>2]=y[e+120>>2];y[f+284>>2]=c;c=y[e+116>>2];y[f+272>>2]=y[e+112>>2];y[f+276>>2]=c;c=y[e+100>>2];y[f+240>>2]=y[e+96>>2];y[f+244>>2]=c;c=y[e+108>>2];y[f+248>>2]=y[e+104>>2];y[f+252>>2]=c;c=y[e+116>>2];y[f+224>>2]=y[e+112>>2];y[f+228>>2]=c;c=y[e+124>>2];y[f+232>>2]=y[e+120>>2];y[f+236>>2]=c;h=f+256|0;ia(h,f+240|0,f+224|0);c=y[f+268>>2];y[e+120>>2]=y[f+264>>2];y[e+124>>2]=c;c=y[f+260>>2];y[e+112>>2]=y[f+256>>2];y[e+116>>2]=c;c=y[e+84>>2];y[f+208>>2]=y[e+80>>2];y[f+212>>2]=c;c=y[e+92>>2];y[f+216>>2]=y[e+88>>2];y[f+220>>2]=c;c=y[e+100>>2];y[f+192>>2]=y[e+96>>2];y[f+196>>2]=c;c=y[e+108>>2];y[f+200>>2]=y[e+104>>2];y[f+204>>2]=c;ia(h,f+208|0,f+192|0);c=y[f+268>>2];y[e+104>>2]=y[f+264>>2];y[e+108>>2]=c;c=y[f+260>>2];y[e+96>>2]=y[f+256>>2];y[e+100>>2]=c;c=y[g+4>>2];y[f+176>>2]=y[g>>2];y[f+180>>2]=c;c=y[g+12>>2];y[f+184>>2]=y[g+8>>2];y[f+188>>2]=c;c=y[e+84>>2];y[f+160>>2]=y[e+80>>2];y[f+164>>2]=c;c=y[e+92>>2];y[f+168>>2]=y[e+88>>2];y[f+172>>2]=c;ia(h,f+176|0,f+160|0);c=y[f+268>>2];y[e+88>>2]=y[f+264>>2];y[e+92>>2]=c;c=y[f+260>>2];y[e+80>>2]=y[f+256>>2];y[e+84>>2]=c;c=y[e+52>>2];y[f+144>>2]=y[e+48>>2];y[f+148>>2]=c;c=y[e+60>>2];y[f+152>>2]=y[e+56>>2];y[f+156>>2]=c;c=y[g+4>>2];y[f+128>>2]=y[g>>2];y[f+132>>2]=c;c=y[g+12>>2];y[f+136>>2]=y[g+8>>2];y[f+140>>2]=c;ia(h,f+144|0,f+128|0);c=y[f+268>>2];y[g+8>>2]=y[f+264>>2];y[g+12>>2]=c;c=y[f+260>>2];y[g>>2]=y[f+256>>2];y[g+4>>2]=c;c=y[e+36>>2];y[f+112>>2]=y[e+32>>2];y[f+116>>2]=c;c=y[e+44>>2];y[f+120>>2]=y[e+40>>2];y[f+124>>2]=c;c=y[e+52>>2];y[f+96>>2]=y[e+48>>2];y[f+100>>2]=c;c=y[e+60>>2];y[f+104>>2]=y[e+56>>2];y[f+108>>2]=c;ia(h,f+112|0,f+96|0);c=y[f+268>>2];y[e+56>>2]=y[f+264>>2];y[e+60>>2]=c;c=y[f+260>>2];y[e+48>>2]=y[f+256>>2];y[e+52>>2]=c;c=y[e+20>>2];y[f+80>>2]=y[e+16>>2];y[f+84>>2]=c;c=y[e+28>>2];y[f+88>>2]=y[e+24>>2];y[f+92>>2]=c;c=y[e+36>>2];y[f+64>>2]=y[e+32>>2];y[f+68>>2]=c;c=y[e+44>>2];y[f+72>>2]=y[e+40>>2];y[f+76>>2]=c;ia(h,f+80|0,f- -64|0);c=y[f+268>>2];y[e+40>>2]=y[f+264>>2];y[e+44>>2]=c;c=y[f+260>>2];y[e+32>>2]=y[f+256>>2];y[e+36>>2]=c;c=y[e+4>>2];y[f+48>>2]=y[e>>2];y[f+52>>2]=c;c=y[e+12>>2];y[f+56>>2]=y[e+8>>2];y[f+60>>2]=c;c=y[e+20>>2];y[f+32>>2]=y[e+16>>2];y[f+36>>2]=c;c=y[e+28>>2];y[f+40>>2]=y[e+24>>2];y[f+44>>2]=c;ia(h,f+48|0,f+32|0);c=y[f+268>>2];y[e+24>>2]=y[f+264>>2];y[e+28>>2]=c;c=y[f+260>>2];y[e+16>>2]=y[f+256>>2];y[e+20>>2]=c;c=y[f+276>>2];y[f+16>>2]=y[f+272>>2];y[f+20>>2]=c;c=y[f+284>>2];y[f+24>>2]=y[f+280>>2];y[f+28>>2]=c;c=y[e+4>>2];y[f>>2]=y[e>>2];y[f+4>>2]=c;c=y[e+12>>2];y[f+8>>2]=y[e+8>>2];y[f+12>>2]=c;ia(h,f+16|0,f);c=y[f+268>>2];y[e+8>>2]=y[f+264>>2];y[e+12>>2]=c;c=y[f+260>>2];y[e>>2]=y[f+256>>2];y[e+4>>2]=c;n=i^y[e+12>>2];y[e+12>>2]=n;p=j^y[e+8>>2];y[e+8>>2]=p;q=k^y[e+4>>2];y[e+4>>2]=q;r=d^y[e>>2];y[e>>2]=r;u=d^y[g>>2];y[g>>2]=u;v=k^y[e+68>>2];y[e+68>>2]=v;x=j^y[e+72>>2];y[e+72>>2]=x;z=i^y[e+76>>2];y[e+76>>2]=z;l=l+1|0;if((l|0)!=7){continue}break}a:{b:{c:{c=b-16|0;if(c){if((c|0)==16){break c}break b}A=y[e+16>>2];B=y[e+48>>2];C=y[e+32>>2];s=y[e+96>>2];t=y[e+80>>2];m=y[e+20>>2];g=y[e+52>>2];h=y[e+36>>2];i=y[e+100>>2];j=y[e+84>>2];k=y[e+24>>2];l=y[e+56>>2];d=y[e+40>>2];c=y[e+104>>2];b=y[e+88>>2];e=n^(y[e+28>>2]^(y[e+60>>2]^(y[e+44>>2]^(y[e+92>>2]^y[e+108>>2])))^z);w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;b=p^(b^c^d^l^k^x);w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(v^(m^(g^(i^j^h))));w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(u^(A^(B^(C^(s^t)))));w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;break a}g=y[e+16>>2];h=y[e+48>>2];i=y[e+32>>2];j=y[e+20>>2];k=y[e+52>>2];l=y[e+36>>2];d=y[e+24>>2];c=y[e+56>>2];b=y[e+40>>2];m=n^(y[e+28>>2]^(y[e+60>>2]^y[e+44>>2]));w[a+12|0]=m;w[a+13|0]=m>>>8;w[a+14|0]=m>>>16;w[a+15|0]=m>>>24;b=p^(d^(b^c));w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(j^(k^l));w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(g^(h^i));w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;s=y[e+80>>2];t=y[e- -64>>2];m=y[e+112>>2];g=y[e+96>>2];h=y[e+84>>2];i=y[e+68>>2];j=y[e+116>>2];k=y[e+100>>2];l=y[e+88>>2];d=y[e+72>>2];c=y[e+120>>2];b=y[e+104>>2];e=y[e+92>>2]^(y[e+76>>2]^(y[e+124>>2]^y[e+108>>2]));w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;b=l^(d^(b^c));w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=h^(i^(j^k));w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=s^(t^(g^m));w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;break a}if(!b){break a}o(a,0,b);}T=f+288|0;}function wi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0;k=T;z=k;k=k-224&-32;T=k;Qe(i,h,k+96|0);h=0;if(g>>>0>63){i=64;while(1){Pe(f+h|0,k+96|0);h=i;i=h- -64|0;if(i>>>0<=g>>>0){continue}break}}i=h|32;if(i>>>0<=g>>>0){while(1){$b(f+h|0,k+96|0);h=i;i=h+32|0;if(i>>>0<=g>>>0){continue}break}}i=g&31;if(i){l=32-i|0;if(l){o(i|k- -64,0,l);}if(i){t(k- -64|0,f+h|0,i);}$b(k- -64|0,k+96|0);}a:{if(!a){f=32;h=0;if(c>>>0<32){break a}while(1){Me(k+32|0,b+h|0,k+96|0);h=f;f=f+32|0;if(f>>>0<=c>>>0){continue}break}break a}f=32;h=0;if(c>>>0<32){break a}while(1){Me(a+h|0,b+h|0,k+96|0);h=f;f=f+32|0;if(f>>>0<=c>>>0){continue}break}}i=c&31;if(i){u=a?a+h|0:k+32|0;m=b+h|0;f=k+96|0;b=T-320|0;T=b;h=i+(b+256|0)|0;l=32-i|0;j=!l;if(!j){o(h,0,l);}v=!i;if(!v){t(b+256|0,m,i);}A=y[f+16>>2];B=y[f+48>>2];C=y[f+20>>2];D=y[f+52>>2];E=y[f+24>>2];F=y[f+56>>2];G=y[f+28>>2];H=y[f+60>>2];m=y[f+32>>2];I=y[f+80>>2];J=y[f+112>>2];n=y[f+96>>2];p=y[f+36>>2];K=y[f+84>>2];L=y[f+116>>2];q=y[f+100>>2];r=y[f+40>>2];M=y[f+88>>2];N=y[f+120>>2];s=y[f+104>>2];O=y[b+256>>2];P=y[b+260>>2];Q=y[b+264>>2];R=y[b+268>>2];S=y[b+272>>2];U=y[b+276>>2];V=y[b+280>>2];w=y[f+44>>2];x=y[f+108>>2];y[b+284>>2]=w^(x&y[f+124>>2]^(y[f+92>>2]^y[b+284>>2]));y[b+280>>2]=s&N^(M^V)^r;y[b+276>>2]=q&L^(K^U)^p;y[b+272>>2]=n&J^(I^S)^m;y[b+268>>2]=x^(H&w^(G^R));y[b+264>>2]=r&F^(E^Q)^s;y[b+260>>2]=p&D^(C^P)^q;y[b+256>>2]=m&B^(A^O)^n;if(!j){o(h,0,l);}if(!v){t(u,b+256|0,i);}l=y[b+284>>2];m=y[b+280>>2];n=y[b+276>>2];p=y[b+272>>2];q=y[b+256>>2];r=y[b+260>>2];s=y[b+264>>2];u=y[b+268>>2];h=y[f+124>>2];y[b+312>>2]=y[f+120>>2];y[b+316>>2]=h;h=y[f+116>>2];y[b+304>>2]=y[f+112>>2];y[b+308>>2]=h;h=y[f+100>>2];y[b+240>>2]=y[f+96>>2];y[b+244>>2]=h;h=y[f+108>>2];y[b+248>>2]=y[f+104>>2];y[b+252>>2]=h;h=y[f+116>>2];y[b+224>>2]=y[f+112>>2];y[b+228>>2]=h;h=y[f+124>>2];y[b+232>>2]=y[f+120>>2];y[b+236>>2]=h;h=b+288|0;ia(h,b+240|0,b+224|0);i=y[b+300>>2];y[f+120>>2]=y[b+296>>2];y[f+124>>2]=i;i=y[b+292>>2];y[f+112>>2]=y[b+288>>2];y[f+116>>2]=i;i=y[f+84>>2];y[b+208>>2]=y[f+80>>2];y[b+212>>2]=i;i=y[f+92>>2];y[b+216>>2]=y[f+88>>2];y[b+220>>2]=i;i=y[f+100>>2];y[b+192>>2]=y[f+96>>2];y[b+196>>2]=i;i=y[f+108>>2];y[b+200>>2]=y[f+104>>2];y[b+204>>2]=i;ia(h,b+208|0,b+192|0);i=y[b+300>>2];y[f+104>>2]=y[b+296>>2];y[f+108>>2]=i;i=y[b+292>>2];y[f+96>>2]=y[b+288>>2];y[f+100>>2]=i;i=f- -64|0;j=y[i+4>>2];y[b+176>>2]=y[i>>2];y[b+180>>2]=j;j=y[f+76>>2];y[b+184>>2]=y[f+72>>2];y[b+188>>2]=j;j=y[f+84>>2];y[b+160>>2]=y[f+80>>2];y[b+164>>2]=j;j=y[f+92>>2];y[b+168>>2]=y[f+88>>2];y[b+172>>2]=j;ia(h,b+176|0,b+160|0);j=y[b+300>>2];y[f+88>>2]=y[b+296>>2];y[f+92>>2]=j;j=y[b+292>>2];y[f+80>>2]=y[b+288>>2];y[f+84>>2]=j;j=y[f+52>>2];y[b+144>>2]=y[f+48>>2];y[b+148>>2]=j;j=y[f+60>>2];y[b+152>>2]=y[f+56>>2];y[b+156>>2]=j;j=y[i+4>>2];y[b+128>>2]=y[i>>2];y[b+132>>2]=j;j=y[f+76>>2];y[b+136>>2]=y[f+72>>2];y[b+140>>2]=j;ia(h,b+144|0,b+128|0);j=y[b+300>>2];y[f+72>>2]=y[b+296>>2];y[f+76>>2]=j;j=y[b+292>>2];y[i>>2]=y[b+288>>2];y[i+4>>2]=j;j=y[f+36>>2];y[b+112>>2]=y[f+32>>2];y[b+116>>2]=j;j=y[f+44>>2];y[b+120>>2]=y[f+40>>2];y[b+124>>2]=j;j=y[f+52>>2];y[b+96>>2]=y[f+48>>2];y[b+100>>2]=j;j=y[f+60>>2];y[b+104>>2]=y[f+56>>2];y[b+108>>2]=j;ia(h,b+112|0,b+96|0);j=y[b+300>>2];y[f+56>>2]=y[b+296>>2];y[f+60>>2]=j;j=y[b+292>>2];y[f+48>>2]=y[b+288>>2];y[f+52>>2]=j;j=y[f+20>>2];y[b+80>>2]=y[f+16>>2];y[b+84>>2]=j;j=y[f+28>>2];y[b+88>>2]=y[f+24>>2];y[b+92>>2]=j;j=y[f+36>>2];y[b+64>>2]=y[f+32>>2];y[b+68>>2]=j;j=y[f+44>>2];y[b+72>>2]=y[f+40>>2];y[b+76>>2]=j;ia(h,b+80|0,b- -64|0);j=y[b+300>>2];y[f+40>>2]=y[b+296>>2];y[f+44>>2]=j;j=y[b+292>>2];y[f+32>>2]=y[b+288>>2];y[f+36>>2]=j;j=y[f+4>>2];y[b+48>>2]=y[f>>2];y[b+52>>2]=j;j=y[f+12>>2];y[b+56>>2]=y[f+8>>2];y[b+60>>2]=j;j=y[f+20>>2];y[b+32>>2]=y[f+16>>2];y[b+36>>2]=j;j=y[f+28>>2];y[b+40>>2]=y[f+24>>2];y[b+44>>2]=j;ia(h,b+48|0,b+32|0);j=y[b+300>>2];y[f+24>>2]=y[b+296>>2];y[f+28>>2]=j;j=y[b+292>>2];y[f+16>>2]=y[b+288>>2];y[f+20>>2]=j;j=y[b+308>>2];y[b+16>>2]=y[b+304>>2];y[b+20>>2]=j;j=y[b+316>>2];y[b+24>>2]=y[b+312>>2];y[b+28>>2]=j;j=y[f+4>>2];y[b>>2]=y[f>>2];y[b+4>>2]=j;j=y[f+12>>2];y[b+8>>2]=y[f+8>>2];y[b+12>>2]=j;ia(h,b+16|0,b);h=y[b+300>>2];y[f+8>>2]=y[b+296>>2];y[f+12>>2]=h;h=y[b+292>>2];y[f>>2]=y[b+288>>2];y[f+4>>2]=h;y[f+12>>2]=u^y[f+12>>2];y[f+8>>2]=s^y[f+8>>2];y[f+4>>2]=r^y[f+4>>2];y[f>>2]=q^y[f>>2];y[i>>2]=p^y[i>>2];y[f+68>>2]=n^y[f+68>>2];y[f+72>>2]=m^y[f+72>>2];y[f+76>>2]=l^y[f+76>>2];T=b+320|0;}Ne(k,e,g,c,k+96|0);h=-1;b:{c:{b=e-16|0;if(b){if((b|0)==16){break c}break b}h=db(k,d);break b}h=kb(k,d);}if(!(!c|(!a|!h))){o(a,0,c);}T=z;return h|0}function He(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=T-416|0;T=c;g=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);h=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);i=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);j=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);f=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);k=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);l=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);m=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=y[b+92>>2];y[c+408>>2]=y[b+88>>2];y[c+412>>2]=a;a=y[b+84>>2];y[c+400>>2]=y[b+80>>2];y[c+404>>2]=a;e=b- -64|0;a=e;d=y[a+4>>2];y[c+368>>2]=y[a>>2];y[c+372>>2]=d;a=y[b+76>>2];y[c+376>>2]=y[b+72>>2];y[c+380>>2]=a;a=y[b+84>>2];y[c+352>>2]=y[b+80>>2];y[c+356>>2]=a;a=y[b+92>>2];y[c+360>>2]=y[b+88>>2];y[c+364>>2]=a;a=c+384|0;ia(a,c+368|0,c+352|0);d=y[c+396>>2];y[b+88>>2]=y[c+392>>2];y[b+92>>2]=d;d=y[c+388>>2];y[b+80>>2]=y[c+384>>2];y[b+84>>2]=d;d=y[b+52>>2];y[c+336>>2]=y[b+48>>2];y[c+340>>2]=d;d=y[b+60>>2];y[c+344>>2]=y[b+56>>2];y[c+348>>2]=d;d=y[e+4>>2];y[c+320>>2]=y[e>>2];y[c+324>>2]=d;d=y[b+76>>2];y[c+328>>2]=y[b+72>>2];y[c+332>>2]=d;ia(a,c+336|0,c+320|0);d=y[c+396>>2];y[b+72>>2]=y[c+392>>2];y[b+76>>2]=d;d=y[c+388>>2];y[e>>2]=y[c+384>>2];y[e+4>>2]=d;d=y[b+36>>2];y[c+304>>2]=y[b+32>>2];y[c+308>>2]=d;d=y[b+44>>2];y[c+312>>2]=y[b+40>>2];y[c+316>>2]=d;d=y[b+52>>2];y[c+288>>2]=y[b+48>>2];y[c+292>>2]=d;d=y[b+60>>2];y[c+296>>2]=y[b+56>>2];y[c+300>>2]=d;ia(a,c+304|0,c+288|0);d=y[c+396>>2];y[b+56>>2]=y[c+392>>2];y[b+60>>2]=d;d=y[c+388>>2];y[b+48>>2]=y[c+384>>2];y[b+52>>2]=d;d=y[b+20>>2];y[c+272>>2]=y[b+16>>2];y[c+276>>2]=d;d=y[b+28>>2];y[c+280>>2]=y[b+24>>2];y[c+284>>2]=d;d=y[b+36>>2];y[c+256>>2]=y[b+32>>2];y[c+260>>2]=d;d=y[b+44>>2];y[c+264>>2]=y[b+40>>2];y[c+268>>2]=d;ia(a,c+272|0,c+256|0);d=y[c+396>>2];y[b+40>>2]=y[c+392>>2];y[b+44>>2]=d;d=y[c+388>>2];y[b+32>>2]=y[c+384>>2];y[b+36>>2]=d;d=y[b+4>>2];y[c+240>>2]=y[b>>2];y[c+244>>2]=d;d=y[b+12>>2];y[c+248>>2]=y[b+8>>2];y[c+252>>2]=d;d=y[b+20>>2];y[c+224>>2]=y[b+16>>2];y[c+228>>2]=d;d=y[b+28>>2];y[c+232>>2]=y[b+24>>2];y[c+236>>2]=d;ia(a,c+240|0,c+224|0);d=y[c+396>>2];y[b+24>>2]=y[c+392>>2];y[b+28>>2]=d;d=y[c+388>>2];y[b+16>>2]=y[c+384>>2];y[b+20>>2]=d;d=y[c+404>>2];y[c+208>>2]=y[c+400>>2];y[c+212>>2]=d;d=y[c+412>>2];y[c+216>>2]=y[c+408>>2];y[c+220>>2]=d;d=y[b+4>>2];y[c+192>>2]=y[b>>2];y[c+196>>2]=d;d=y[b+12>>2];y[c+200>>2]=y[b+8>>2];y[c+204>>2]=d;ia(a,c+208|0,c+192|0);d=y[c+384>>2];n=y[c+388>>2];o=y[c+392>>2];y[b+12>>2]=y[c+396>>2]^l;y[b+8>>2]=k^o;y[b+4>>2]=f^n;y[b>>2]=d^m;f=y[b+92>>2];y[c+408>>2]=y[b+88>>2];y[c+412>>2]=f;f=y[b+84>>2];y[c+400>>2]=y[b+80>>2];y[c+404>>2]=f;f=y[e+4>>2];y[c+176>>2]=y[e>>2];y[c+180>>2]=f;f=y[b+76>>2];y[c+184>>2]=y[b+72>>2];y[c+188>>2]=f;f=y[b+84>>2];y[c+160>>2]=y[b+80>>2];y[c+164>>2]=f;f=y[b+92>>2];y[c+168>>2]=y[b+88>>2];y[c+172>>2]=f;ia(a,c+176|0,c+160|0);f=y[c+396>>2];y[b+88>>2]=y[c+392>>2];y[b+92>>2]=f;f=y[c+388>>2];y[b+80>>2]=y[c+384>>2];y[b+84>>2]=f;f=y[b+52>>2];y[c+144>>2]=y[b+48>>2];y[c+148>>2]=f;f=y[b+60>>2];y[c+152>>2]=y[b+56>>2];y[c+156>>2]=f;f=y[e+4>>2];y[c+128>>2]=y[e>>2];y[c+132>>2]=f;f=y[b+76>>2];y[c+136>>2]=y[b+72>>2];y[c+140>>2]=f;ia(a,c+144|0,c+128|0);f=y[c+396>>2];y[b+72>>2]=y[c+392>>2];y[b+76>>2]=f;f=y[c+388>>2];y[e>>2]=y[c+384>>2];y[e+4>>2]=f;e=y[b+36>>2];y[c+112>>2]=y[b+32>>2];y[c+116>>2]=e;e=y[b+44>>2];y[c+120>>2]=y[b+40>>2];y[c+124>>2]=e;e=y[b+52>>2];y[c+96>>2]=y[b+48>>2];y[c+100>>2]=e;e=y[b+60>>2];y[c+104>>2]=y[b+56>>2];y[c+108>>2]=e;ia(a,c+112|0,c+96|0);e=y[c+396>>2];y[b+56>>2]=y[c+392>>2];y[b+60>>2]=e;e=y[c+388>>2];y[b+48>>2]=y[c+384>>2];y[b+52>>2]=e;e=y[b+20>>2];y[c+80>>2]=y[b+16>>2];y[c+84>>2]=e;e=y[b+28>>2];y[c+88>>2]=y[b+24>>2];y[c+92>>2]=e;e=y[b+36>>2];y[c+64>>2]=y[b+32>>2];y[c+68>>2]=e;e=y[b+44>>2];y[c+72>>2]=y[b+40>>2];y[c+76>>2]=e;ia(a,c+80|0,c- -64|0);e=y[c+396>>2];y[b+40>>2]=y[c+392>>2];y[b+44>>2]=e;e=y[c+388>>2];y[b+32>>2]=y[c+384>>2];y[b+36>>2]=e;e=y[b+4>>2];y[c+48>>2]=y[b>>2];y[c+52>>2]=e;e=y[b+12>>2];y[c+56>>2]=y[b+8>>2];y[c+60>>2]=e;e=y[b+20>>2];y[c+32>>2]=y[b+16>>2];y[c+36>>2]=e;e=y[b+28>>2];y[c+40>>2]=y[b+24>>2];y[c+44>>2]=e;ia(a,c+48|0,c+32|0);e=y[c+396>>2];y[b+24>>2]=y[c+392>>2];y[b+28>>2]=e;e=y[c+388>>2];y[b+16>>2]=y[c+384>>2];y[b+20>>2]=e;e=y[c+404>>2];y[c+16>>2]=y[c+400>>2];y[c+20>>2]=e;e=y[c+412>>2];y[c+24>>2]=y[c+408>>2];y[c+28>>2]=e;e=y[b+4>>2];y[c>>2]=y[b>>2];y[c+4>>2]=e;e=y[b+12>>2];y[c+8>>2]=y[b+8>>2];y[c+12>>2]=e;ia(a,c+16|0,c);a=y[c+384>>2];e=y[c+388>>2];f=y[c+392>>2];y[b+12>>2]=y[c+396>>2]^j;y[b+8>>2]=f^i;y[b+4>>2]=e^h;y[b>>2]=a^g;T=c+416|0;}function Me(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;d=T-288|0;T=d;r=y[c+16>>2];s=y[c+48>>2];t=y[c+20>>2];u=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);v=y[c+52>>2];x=y[c+24>>2];A=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);B=y[c+56>>2];i=y[c+28>>2];C=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);D=y[c+60>>2];f=y[c+32>>2];j=y[c+80>>2];E=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);F=y[c+112>>2];e=y[c+96>>2];g=y[c+36>>2];k=y[c+84>>2];G=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);H=y[c+116>>2];n=y[c+100>>2];h=y[c+40>>2];l=y[c+88>>2];I=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);J=y[c+120>>2];o=y[c+104>>2];K=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);p=y[c+44>>2];q=y[c+108>>2];m=p^(q&y[c+124>>2]^(y[c+92>>2]^(z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24))));w[a+28|0]=m;w[a+29|0]=m>>>8;w[a+30|0]=m>>>16;w[a+31|0]=m>>>24;l=h^(o&J^(l^I));w[a+24|0]=l;w[a+25|0]=l>>>8;w[a+26|0]=l>>>16;w[a+27|0]=l>>>24;k=g^(n&H^(k^G));w[a+20|0]=k;w[a+21|0]=k>>>8;w[a+22|0]=k>>>16;w[a+23|0]=k>>>24;j=f^(e&F^(j^E));w[a+16|0]=j;w[a+17|0]=j>>>8;w[a+18|0]=j>>>16;w[a+19|0]=j>>>24;i=D&p^(i^C)^q;w[a+12|0]=i;w[a+13|0]=i>>>8;w[a+14|0]=i>>>16;w[a+15|0]=i>>>24;h=h&B^(x^A)^o;w[a+8|0]=h;w[a+9|0]=h>>>8;w[a+10|0]=h>>>16;w[a+11|0]=h>>>24;g=g&v^(t^u)^n;w[a+4|0]=g;w[a+5|0]=g>>>8;w[a+6|0]=g>>>16;w[a+7|0]=g>>>24;f=e^(f&s^(r^K));w[a|0]=f;w[a+1|0]=f>>>8;w[a+2|0]=f>>>16;w[a+3|0]=f>>>24;a=y[c+124>>2];y[d+280>>2]=y[c+120>>2];y[d+284>>2]=a;a=y[c+116>>2];y[d+272>>2]=y[c+112>>2];y[d+276>>2]=a;a=y[c+100>>2];y[d+240>>2]=y[c+96>>2];y[d+244>>2]=a;a=y[c+108>>2];y[d+248>>2]=y[c+104>>2];y[d+252>>2]=a;a=y[c+116>>2];y[d+224>>2]=y[c+112>>2];y[d+228>>2]=a;a=y[c+124>>2];y[d+232>>2]=y[c+120>>2];y[d+236>>2]=a;a=d+256|0;ia(a,d+240|0,d+224|0);b=y[d+268>>2];y[c+120>>2]=y[d+264>>2];y[c+124>>2]=b;b=y[d+260>>2];y[c+112>>2]=y[d+256>>2];y[c+116>>2]=b;b=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=b;b=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=b;b=y[c+100>>2];y[d+192>>2]=y[c+96>>2];y[d+196>>2]=b;b=y[c+108>>2];y[d+200>>2]=y[c+104>>2];y[d+204>>2]=b;ia(a,d+208|0,d+192|0);b=y[d+268>>2];y[c+104>>2]=y[d+264>>2];y[c+108>>2]=b;b=y[d+260>>2];y[c+96>>2]=y[d+256>>2];y[c+100>>2]=b;b=c- -64|0;e=y[b+4>>2];y[d+176>>2]=y[b>>2];y[d+180>>2]=e;e=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;ia(a,d+176|0,d+160|0);e=y[d+268>>2];y[c+88>>2]=y[d+264>>2];y[c+92>>2]=e;e=y[d+260>>2];y[c+80>>2]=y[d+256>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[b+4>>2];y[d+128>>2]=y[b>>2];y[d+132>>2]=e;e=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=e;ia(a,d+144|0,d+128|0);e=y[d+268>>2];y[c+72>>2]=y[d+264>>2];y[c+76>>2]=e;e=y[d+260>>2];y[b>>2]=y[d+256>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+268>>2];y[c+56>>2]=y[d+264>>2];y[c+60>>2]=e;e=y[d+260>>2];y[c+48>>2]=y[d+256>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+268>>2];y[c+40>>2]=y[d+264>>2];y[c+44>>2]=e;e=y[d+260>>2];y[c+32>>2]=y[d+256>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+268>>2];y[c+24>>2]=y[d+264>>2];y[c+28>>2]=e;e=y[d+260>>2];y[c+16>>2]=y[d+256>>2];y[c+20>>2]=e;e=y[d+276>>2];y[d+16>>2]=y[d+272>>2];y[d+20>>2]=e;e=y[d+284>>2];y[d+24>>2]=y[d+280>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+268>>2];y[c+8>>2]=y[d+264>>2];y[c+12>>2]=a;a=y[d+260>>2];y[c>>2]=y[d+256>>2];y[c+4>>2]=a;y[c+12>>2]=i^y[c+12>>2];y[c+8>>2]=h^y[c+8>>2];y[c+4>>2]=g^y[c+4>>2];y[c>>2]=f^y[c>>2];y[b>>2]=j^y[b>>2];y[c+68>>2]=k^y[c+68>>2];y[c+72>>2]=l^y[c+72>>2];y[c+76>>2]=m^y[c+76>>2];T=d+288|0;}function Oe(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;d=T-288|0;T=d;u=y[c+16>>2];v=y[c+48>>2];f=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);x=y[c+20>>2];A=y[c+52>>2];g=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);B=y[c+24>>2];C=y[c+56>>2];h=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);D=y[c+28>>2];E=y[c+60>>2];e=y[c+32>>2];i=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);F=y[c+80>>2];G=y[c+112>>2];j=y[c+96>>2];k=y[c+36>>2];l=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);H=y[c+84>>2];I=y[c+116>>2];m=y[c+100>>2];n=y[c+40>>2];o=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);J=y[c+88>>2];K=y[c+120>>2];p=y[c+104>>2];q=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);r=y[c+44>>2];s=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);t=y[c+108>>2];b=r^(s^(y[c+92>>2]^t&y[c+124>>2]));w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=p&K^J^o^n;w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=m&I^H^l^k;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=e^(j&G^F^i);w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;b=E&r^D^h^t;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=n&C^B^g^p;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=k&A^x^f^m;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=e&v^u^q^j;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;a=y[c+124>>2];y[d+280>>2]=y[c+120>>2];y[d+284>>2]=a;a=y[c+116>>2];y[d+272>>2]=y[c+112>>2];y[d+276>>2]=a;a=y[c+100>>2];y[d+240>>2]=y[c+96>>2];y[d+244>>2]=a;a=y[c+108>>2];y[d+248>>2]=y[c+104>>2];y[d+252>>2]=a;a=y[c+116>>2];y[d+224>>2]=y[c+112>>2];y[d+228>>2]=a;a=y[c+124>>2];y[d+232>>2]=y[c+120>>2];y[d+236>>2]=a;a=d+256|0;ia(a,d+240|0,d+224|0);b=y[d+268>>2];y[c+120>>2]=y[d+264>>2];y[c+124>>2]=b;b=y[d+260>>2];y[c+112>>2]=y[d+256>>2];y[c+116>>2]=b;b=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=b;b=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=b;b=y[c+100>>2];y[d+192>>2]=y[c+96>>2];y[d+196>>2]=b;b=y[c+108>>2];y[d+200>>2]=y[c+104>>2];y[d+204>>2]=b;ia(a,d+208|0,d+192|0);b=y[d+268>>2];y[c+104>>2]=y[d+264>>2];y[c+108>>2]=b;b=y[d+260>>2];y[c+96>>2]=y[d+256>>2];y[c+100>>2]=b;b=c- -64|0;e=y[b+4>>2];y[d+176>>2]=y[b>>2];y[d+180>>2]=e;e=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;ia(a,d+176|0,d+160|0);e=y[d+268>>2];y[c+88>>2]=y[d+264>>2];y[c+92>>2]=e;e=y[d+260>>2];y[c+80>>2]=y[d+256>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[b+4>>2];y[d+128>>2]=y[b>>2];y[d+132>>2]=e;e=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=e;ia(a,d+144|0,d+128|0);e=y[d+268>>2];y[c+72>>2]=y[d+264>>2];y[c+76>>2]=e;e=y[d+260>>2];y[b>>2]=y[d+256>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+268>>2];y[c+56>>2]=y[d+264>>2];y[c+60>>2]=e;e=y[d+260>>2];y[c+48>>2]=y[d+256>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+268>>2];y[c+40>>2]=y[d+264>>2];y[c+44>>2]=e;e=y[d+260>>2];y[c+32>>2]=y[d+256>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+268>>2];y[c+24>>2]=y[d+264>>2];y[c+28>>2]=e;e=y[d+260>>2];y[c+16>>2]=y[d+256>>2];y[c+20>>2]=e;e=y[d+276>>2];y[d+16>>2]=y[d+272>>2];y[d+20>>2]=e;e=y[d+284>>2];y[d+24>>2]=y[d+280>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+268>>2];y[c+8>>2]=y[d+264>>2];y[c+12>>2]=a;a=y[d+260>>2];y[c>>2]=y[d+256>>2];y[c+4>>2]=a;y[c+12>>2]=y[c+12>>2]^h;y[c+8>>2]=y[c+8>>2]^g;y[c+4>>2]=y[c+4>>2]^f;y[c>>2]=y[c>>2]^q;y[b>>2]=y[b>>2]^i;y[c+68>>2]=y[c+68>>2]^l;y[c+72>>2]=y[c+72>>2]^o;y[c+76>>2]=s^y[c+76>>2];T=d+288|0;}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=T-48|0;T=l;c=nc(a);a:{if(c){break a}c=-26;if(b-3>>>0<4294967294){break a}e=y[a+44>>2];c=y[a+48>>2];y[l+4>>2]=0;d=y[a+40>>2];y[l+32>>2]=c;y[l+16>>2]=-1;y[l+12>>2]=d;d=c<<3;i=d>>>0>>0?e:d;e=c<<2;c=(i>>>0)/(e>>>0)|0;y[l+24>>2]=c;y[l+28>>2]=c<<2;y[l+20>>2]=E(c,e);c=y[a+52>>2];y[l+40>>2]=b;y[l+36>>2]=c;b=T;k=b;c=b-1152&-64;T=c;e=l+4|0;b=-25;b:{c:{if(!e|!a){break c}d=Da(y[e+20>>2]<<3);y[e+4>>2]=d;b=-22;if(!d){break c}d:{b=y[e+16>>2];e:{if(!b){break e}d=b<<10;if(((d>>>0)/(b>>>0)|0)!=1024){break e}b=Da(12);y[e>>2]=b;if(!b){break e}y[b>>2]=0;y[b+4>>2]=0;b=Pc(c+128|0,d);y[10172]=b;f:{if(b){y[c+128>>2]=0;break f}b=y[c+128>>2];if(b){break d}}ta(y[e>>2]);y[e>>2]=0;}Rd(e,y[a+56>>2]);T=k;b=-22;break b}y[y[e>>2]>>2]=b;y[y[e>>2]+4>>2]=b;y[y[e>>2]+8>>2]=d;m=y[e+36>>2];b=c+128|0;Ja(b,0,0,64);y[c+124>>2]=y[a+48>>2];d=c+124|0;oa(b,d,4,0);y[c+124>>2]=y[a+4>>2];oa(b,d,4,0);y[c+124>>2]=y[a+44>>2];oa(b,d,4,0);y[c+124>>2]=y[a+40>>2];oa(b,d,4,0);y[c+124>>2]=19;oa(b,d,4,0);y[c+124>>2]=m;oa(b,d,4,0);y[c+124>>2]=y[a+12>>2];oa(b,d,4,0);d=y[a+8>>2];g:{if(!d){break g}oa(b,d,y[a+12>>2],0);if(!(w[a+56|0]&1)){break g}ja(y[a+8>>2],y[a+12>>2]);y[a+12>>2]=0;}y[c+124>>2]=y[a+20>>2];b=c+128|0;oa(b,c+124|0,4,0);d=y[a+16>>2];if(d){oa(b,d,y[a+20>>2],0);}y[c+124>>2]=y[a+28>>2];b=c+128|0;oa(b,c+124|0,4,0);d=y[a+24>>2];h:{if(!d){break h}oa(b,d,y[a+28>>2],0);if(!(z[a+56|0]&2)){break h}ja(y[a+24>>2],y[a+28>>2]);y[a+28>>2]=0;}y[c+124>>2]=y[a+36>>2];b=c+128|0;oa(b,c+124|0,4,0);d=y[a+32>>2];if(d){oa(b,d,y[a+36>>2],0);}Ia(c+128|0,c+48|0,64);ja(c+112|0,8);if(y[e+28>>2]){d=0;while(1){y[c+112>>2]=0;y[c+116>>2]=d;sc(c+128|0,1024,c+48|0,72);m=y[y[e>>2]+4>>2]+(E(y[e+24>>2],d)<<10)|0;b=0;while(1){h=b<<3;f=h+m|0;i=c+128|0;j=i+h|0;g=y[j+4>>2];y[f>>2]=y[j>>2];y[f+4>>2]=g;f=h|8;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;f=h|16;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;h=h|24;f=h+m|0;h=h+i|0;j=y[h+4>>2];y[f>>2]=y[h>>2];y[f+4>>2]=j;b=b+4|0;if((b|0)!=128){continue}break}y[c+112>>2]=1;sc(i,1024,c+48|0,72);m=(y[y[e>>2]+4>>2]+(E(y[e+24>>2],d)<<10)|0)+1024|0;b=0;while(1){h=b<<3;f=h+m|0;i=c+128|0;j=i+h|0;g=y[j+4>>2];y[f>>2]=y[j>>2];y[f+4>>2]=g;f=h|8;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;f=h|16;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;h=h|24;f=h+m|0;h=h+i|0;i=y[h+4>>2];y[f>>2]=y[h>>2];y[f+4>>2]=i;b=b+4|0;if((b|0)!=128){continue}break}d=d+1|0;if(d>>>0>2]){continue}break}}ja(c+128|0,1024);ja(c+48|0,72);b=0;}T=k;}c=b;if(b){break a}if(y[l+12>>2]){while(1){b=T-80|0;T=b;e=l+4|0;i:{if(!e|!y[e+28>>2]){break i}w[b+72|0]=0;y[b+64>>2]=o;c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b+48>>2]=y[b+64>>2];y[b+52>>2]=d;d=y[b+76>>2];y[b+56>>2]=y[b+72>>2];y[b+60>>2]=d;Pb(e,b+48|0);c=c+1|0;d=y[e+28>>2];if(c>>>0>>0){continue}break}w[b+72|0]=1;if(!d){break i}c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b+32>>2]=y[b+64>>2];y[b+36>>2]=d;d=y[b+76>>2];y[b+40>>2]=y[b+72>>2];y[b+44>>2]=d;Pb(e,b+32|0);c=c+1|0;d=y[e+28>>2];if(c>>>0>>0){continue}break}w[b+72|0]=2;if(!d){break i}c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b+16>>2]=y[b+64>>2];y[b+20>>2]=d;d=y[b+76>>2];y[b+24>>2]=y[b+72>>2];y[b+28>>2]=d;Pb(e,b+16|0);c=c+1|0;d=y[e+28>>2];if(c>>>0>>0){continue}break}w[b+72|0]=3;if(!d){break i}c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b>>2]=y[b+64>>2];y[b+4>>2]=d;d=y[b+76>>2];y[b+8>>2]=y[b+72>>2];y[b+12>>2]=d;Pb(e,b);c=c+1|0;if(c>>>0>2]){continue}break}}T=b+80|0;o=o+1|0;if(o>>>0>2]){continue}break}}b=T-2048|0;T=b;c=l+4|0;if(!(!a|!c)){o=y[c+24>>2];f=y[y[c>>2]+4>>2]+(o<<10)|0;t(b+1024|0,f-1024|0,1024);j=y[c+28>>2];if(j>>>0>=2){m=1;while(1){e=(f+(E(m,o)<<10)|0)-1024|0;h=0;while(1){d=h<<3;i=b+1024|0;k=d+i|0;g=y[k>>2];n=d+e|0;p=y[n>>2];n=y[k+4>>2]^y[n+4>>2];y[k>>2]=g^p;y[k+4>>2]=n;g=d|8;k=g+i|0;n=y[k>>2];g=e+g|0;p=y[g>>2];g=y[k+4>>2]^y[g+4>>2];y[k>>2]=n^p;y[k+4>>2]=g;g=d|16;k=g+i|0;n=y[k>>2];g=e+g|0;p=y[g>>2];g=y[k+4>>2]^y[g+4>>2];y[k>>2]=n^p;y[k+4>>2]=g;k=i;i=d|24;d=k+i|0;k=y[d>>2];i=e+i|0;g=y[i>>2];i=y[d+4>>2]^y[i+4>>2];y[d>>2]=g^k;y[d+4>>2]=i;h=h+4|0;if((h|0)!=128){continue}break}m=m+1|0;if((j|0)!=(m|0)){continue}break}}e=b+1024|0;t(b,e,1024);sc(y[a>>2],y[a+4>>2],b,1024);ja(e,1024);ja(b,1024);Rd(c,y[a+56>>2]);}T=b+2048|0;c=0;}T=l+48|0;return c}function Qe(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=T-288|0;T=d;k=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);l=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);m=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);g=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);h=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);i=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);n=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);j=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=j^33620224;y[c+112>>2]=a;y[c+96>>2]=j^1427652059;y[c+80>>2]=a;a=c- -64|0;b=j^n;y[a>>2]=b;y[c+56>>2]=1110511904;y[c+60>>2]=-584534669;y[c+48>>2]=1427652059;y[c+52>>2]=-248528275;y[c+40>>2]=1496785429;y[c+44>>2]=1652156816;y[c+32>>2]=33620224;y[c+36>>2]=218629379;y[c+24>>2]=1110511904;y[c+28>>2]=-584534669;y[c+16>>2]=1427652059;y[c+20>>2]=-248528275;y[c>>2]=b;b=i^1652156816;y[c+124>>2]=b;f=h^1496785429;y[c+120>>2]=f;e=g^218629379;y[c+116>>2]=e;y[c+108>>2]=i^-584534669;y[c+104>>2]=h^1110511904;y[c+100>>2]=g^-248528275;y[c+92>>2]=b;y[c+88>>2]=f;y[c+84>>2]=e;b=i^m;y[c+76>>2]=b;f=h^l;y[c+72>>2]=f;e=g^k;y[c+68>>2]=e;y[c+12>>2]=b;y[c+8>>2]=f;y[c+4>>2]=e;f=0;while(1){b=y[c+124>>2];y[d+280>>2]=y[c+120>>2];y[d+284>>2]=b;b=y[c+116>>2];y[d+272>>2]=y[c+112>>2];y[d+276>>2]=b;b=y[c+100>>2];y[d+240>>2]=y[c+96>>2];y[d+244>>2]=b;b=y[c+108>>2];y[d+248>>2]=y[c+104>>2];y[d+252>>2]=b;b=y[c+116>>2];y[d+224>>2]=y[c+112>>2];y[d+228>>2]=b;b=y[c+124>>2];y[d+232>>2]=y[c+120>>2];y[d+236>>2]=b;b=d+256|0;ia(b,d+240|0,d+224|0);e=y[d+268>>2];y[c+120>>2]=y[d+264>>2];y[c+124>>2]=e;e=y[d+260>>2];y[c+112>>2]=y[d+256>>2];y[c+116>>2]=e;e=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=e;e=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=e;e=y[c+100>>2];y[d+192>>2]=y[c+96>>2];y[d+196>>2]=e;e=y[c+108>>2];y[d+200>>2]=y[c+104>>2];y[d+204>>2]=e;ia(b,d+208|0,d+192|0);e=y[d+268>>2];y[c+104>>2]=y[d+264>>2];y[c+108>>2]=e;e=y[d+260>>2];y[c+96>>2]=y[d+256>>2];y[c+100>>2]=e;e=y[a+4>>2];y[d+176>>2]=y[a>>2];y[d+180>>2]=e;e=y[a+12>>2];y[d+184>>2]=y[a+8>>2];y[d+188>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;ia(b,d+176|0,d+160|0);e=y[d+268>>2];y[c+88>>2]=y[d+264>>2];y[c+92>>2]=e;e=y[d+260>>2];y[c+80>>2]=y[d+256>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[a+4>>2];y[d+128>>2]=y[a>>2];y[d+132>>2]=e;e=y[a+12>>2];y[d+136>>2]=y[a+8>>2];y[d+140>>2]=e;ia(b,d+144|0,d+128|0);e=y[d+268>>2];y[a+8>>2]=y[d+264>>2];y[a+12>>2]=e;e=y[d+260>>2];y[a>>2]=y[d+256>>2];y[a+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(b,d+112|0,d+96|0);e=y[d+268>>2];y[c+56>>2]=y[d+264>>2];y[c+60>>2]=e;e=y[d+260>>2];y[c+48>>2]=y[d+256>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(b,d+80|0,d- -64|0);e=y[d+268>>2];y[c+40>>2]=y[d+264>>2];y[c+44>>2]=e;e=y[d+260>>2];y[c+32>>2]=y[d+256>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(b,d+48|0,d+32|0);e=y[d+268>>2];y[c+24>>2]=y[d+264>>2];y[c+28>>2]=e;e=y[d+260>>2];y[c+16>>2]=y[d+256>>2];y[c+20>>2]=e;e=y[d+276>>2];y[d+16>>2]=y[d+272>>2];y[d+20>>2]=e;e=y[d+284>>2];y[d+24>>2]=y[d+280>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(b,d+16|0,d);b=y[d+268>>2];y[c+8>>2]=y[d+264>>2];y[c+12>>2]=b;b=y[d+260>>2];y[c>>2]=y[d+256>>2];y[c+4>>2]=b;y[c+12>>2]=y[c+12>>2]^m;y[c+8>>2]=y[c+8>>2]^l;y[c+4>>2]=y[c+4>>2]^k;y[c>>2]=y[c>>2]^n;y[a>>2]=j^y[a>>2];y[c+68>>2]=y[c+68>>2]^g;y[c+72>>2]=y[c+72>>2]^h;y[c+76>>2]=y[c+76>>2]^i;f=f+1|0;if((f|0)!=10){continue}break}T=d+288|0;}function _b(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;j=T+-64|0;H=y[a+60>>2];I=y[a+56>>2];C=y[a+52>>2];B=y[a+48>>2];J=y[a+44>>2];K=y[a+40>>2];L=y[a+36>>2];M=y[a+32>>2];N=y[a+28>>2];O=y[a+24>>2];P=y[a+20>>2];Q=y[a+16>>2];R=y[a+12>>2];S=y[a+8>>2];U=y[a+4>>2];V=y[a>>2];while(1){a:{if(!e&d>>>0>63|e){f=c;break a}y[j+56>>2]=0;y[j+60>>2]=0;y[j+48>>2]=0;y[j+52>>2]=0;y[j+40>>2]=0;y[j+44>>2]=0;y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;y[j+8>>2]=0;y[j+12>>2]=0;y[j>>2]=0;y[j+4>>2]=0;h=0;while(1){w[h+j|0]=z[b+h|0];h=h+1|0;if(!e&d>>>0>h>>>0|e){continue}break}f=j;b=f;W=c;}D=20;g=V;p=U;q=S;t=R;h=Q;c=P;k=O;l=N;m=M;v=L;r=K;i=H;x=I;u=C;s=B;n=J;while(1){o=h;h=g+h|0;g=Bi(h^s,16);m=g+m|0;s=Bi(o^m,12);o=s;A=h+s|0;s=Bi(A^g,8);m=s+m|0;h=Bi(o^m,7);g=l+t|0;i=Bi(g^i,16);n=i+n|0;l=Bi(n^l,12);q=k+q|0;t=Bi(q^x,16);r=t+r|0;k=Bi(r^k,12);E=g+l|0;x=E+h|0;q=k+q|0;F=Bi(q^t,8);g=Bi(x^F,16);p=c+p|0;t=Bi(p^u,16);v=t+v|0;c=Bi(v^c,12);o=h;p=c+p|0;u=Bi(p^t,8);G=u+v|0;h=G+g|0;o=Bi(o^h,12);t=o+x|0;x=Bi(g^t,8);v=x+h|0;h=Bi(v^o,7);o=m;m=q;g=Bi(i^E,8);i=g+n|0;q=Bi(i^l,7);m=m+q|0;u=Bi(m^u,16);l=o+u|0;n=Bi(l^q,12);q=n+m|0;u=Bi(u^q,8);m=l+u|0;l=Bi(m^n,7);n=i;i=p;r=r+F|0;p=Bi(r^k,7);i=i+p|0;s=Bi(i^s,16);k=n+s|0;n=i;i=Bi(k^p,12);p=n+i|0;s=Bi(s^p,8);n=k+s|0;k=Bi(n^i,7);o=r;i=g;g=Bi(c^G,7);r=g+A|0;i=Bi(i^r,16);c=o+i|0;A=Bi(c^g,12);g=A+r|0;i=Bi(i^g,8);r=c+i|0;c=Bi(r^A,7);D=D-2|0;if(D){continue}break}D=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);A=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);E=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);F=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);G=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);o=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);X=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);Y=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);Z=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);_=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);$=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);aa=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);ba=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);ca=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);da=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);g=g+V^(z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24));w[f|0]=g;w[f+1|0]=g>>>8;w[f+2|0]=g>>>16;w[f+3|0]=g>>>24;g=i+H^da;w[f+60|0]=g;w[f+61|0]=g>>>8;w[f+62|0]=g>>>16;w[f+63|0]=g>>>24;g=x+I^ca;w[f+56|0]=g;w[f+57|0]=g>>>8;w[f+58|0]=g>>>16;w[f+59|0]=g>>>24;g=u+C^ba;w[f+52|0]=g;w[f+53|0]=g>>>8;w[f+54|0]=g>>>16;w[f+55|0]=g>>>24;g=s+B^aa;w[f+48|0]=g;w[f+49|0]=g>>>8;w[f+50|0]=g>>>16;w[f+51|0]=g>>>24;g=n+J^$;w[f+44|0]=g;w[f+45|0]=g>>>8;w[f+46|0]=g>>>16;w[f+47|0]=g>>>24;g=r+K^_;w[f+40|0]=g;w[f+41|0]=g>>>8;w[f+42|0]=g>>>16;w[f+43|0]=g>>>24;g=v+L^Z;w[f+36|0]=g;w[f+37|0]=g>>>8;w[f+38|0]=g>>>16;w[f+39|0]=g>>>24;g=m+M^Y;w[f+32|0]=g;w[f+33|0]=g>>>8;w[f+34|0]=g>>>16;w[f+35|0]=g>>>24;l=l+N^X;w[f+28|0]=l;w[f+29|0]=l>>>8;w[f+30|0]=l>>>16;w[f+31|0]=l>>>24;k=o^k+O;w[f+24|0]=k;w[f+25|0]=k>>>8;w[f+26|0]=k>>>16;w[f+27|0]=k>>>24;c=G^c+P;w[f+20|0]=c;w[f+21|0]=c>>>8;w[f+22|0]=c>>>16;w[f+23|0]=c>>>24;c=F^h+Q;w[f+16|0]=c;w[f+17|0]=c>>>8;w[f+18|0]=c>>>16;w[f+19|0]=c>>>24;c=E^t+R;w[f+12|0]=c;w[f+13|0]=c>>>8;w[f+14|0]=c>>>16;w[f+15|0]=c>>>24;c=A^q+S;w[f+8|0]=c;w[f+9|0]=c>>>8;w[f+10|0]=c>>>16;w[f+11|0]=c>>>24;c=D^p+U;w[f+4|0]=c;w[f+5|0]=c>>>8;w[f+6|0]=c>>>16;w[f+7|0]=c>>>24;B=B+1|0;C=!B+C|0;if(!e&d>>>0<=64){if(!e&d>>>0<=63){h=0;while(1){w[h+W|0]=z[f+h|0];h=h+1|0;if(d>>>0>h>>>0){continue}break}}y[a+52>>2]=C;y[a+48>>2]=B;}else {b=b- -64|0;c=f- -64|0;e=e-1|0;d=d+-64|0;e=d>>>0<4294967232?e+1|0:e;continue}break}}function xb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0;c=T-800|0;T=c;e=b+40|0;d=y[e>>2];f=y[b+80>>2];g=y[b+44>>2];h=y[b+84>>2];i=y[b+48>>2];n=y[b+88>>2];j=y[b+52>>2];q=y[b+92>>2];o=y[b+56>>2];r=y[b+96>>2];s=y[b+60>>2];t=y[b+100>>2];k=b- -64|0;u=y[k>>2];v=y[b+104>>2];x=y[b+68>>2];A=y[b+108>>2];B=y[b+72>>2];C=y[b+112>>2];l=y[b+76>>2];m=y[b+116>>2];y[c+324>>2]=l+m;y[c+320>>2]=B+C;y[c+316>>2]=x+A;y[c+312>>2]=u+v;y[c+308>>2]=s+t;y[c+304>>2]=o+r;y[c+300>>2]=j+q;y[c+296>>2]=i+n;y[c+292>>2]=g+h;y[c+288>>2]=d+f;y[c+36>>2]=m-l;y[c+32>>2]=C-B;y[c+28>>2]=A-x;y[c+24>>2]=v-u;y[c+20>>2]=t-s;y[c+16>>2]=r-o;y[c+12>>2]=q-j;y[c+8>>2]=n-i;y[c+4>>2]=h-g;y[c>>2]=f-d;d=c+288|0;ga(d,d,c);g=c+240|0;ga(g,b,e);f=c+192|0;fa(f,g);ga(f,d,f);y[c+436>>2]=0;y[c+440>>2]=0;y[c+444>>2]=0;y[c+448>>2]=0;y[c+452>>2]=0;y[c+456>>2]=0;y[c+460>>2]=0;y[c+464>>2]=0;y[c+468>>2]=0;y[c+432>>2]=1;h=c+576|0;cc(h,c+432|0,f);f=c+720|0;ga(f,h,d);q=c+672|0;ga(q,h,g);j=c+48|0;ga(j,f,q);d=b+120|0;ga(j,j,d);ga(c+528|0,b,1632);ga(c+480|0,e,1632);ga(c+624|0,f,2944);f=c+336|0;ga(f,d,j);n=c+384|0;pa(n,f);F=z[c+384|0];f=y[b+36>>2];d=y[b+32>>2];y[c+176>>2]=d;y[c+180>>2]=f;g=y[b+28>>2];f=y[b+24>>2];y[c+168>>2]=f;y[c+172>>2]=g;h=y[b+20>>2];g=y[b+16>>2];y[c+160>>2]=g;y[c+164>>2]=h;i=y[b+12>>2];h=y[b+8>>2];y[c+152>>2]=h;y[c+156>>2]=i;o=y[b+4>>2];i=y[b>>2];y[c+144>>2]=i;y[c+148>>2]=o;o=y[e>>2];r=y[b+44>>2];s=y[b+48>>2];t=y[b+52>>2];u=y[b+56>>2];v=y[b+60>>2];x=y[k>>2];A=y[b+68>>2];B=y[b+72>>2];C=y[b+76>>2];G=y[c+484>>2];k=y[c+148>>2];H=y[c+492>>2];l=y[c+156>>2];I=y[c+500>>2];m=y[c+164>>2];J=y[c+508>>2];p=y[c+172>>2];K=y[c+516>>2];E=y[c+180>>2];L=y[c+480>>2];M=y[c+488>>2];N=y[c+496>>2];D=y[c+504>>2];e=0-(F&1)|0;y[c+176>>2]=d^e&(d^y[c+512>>2]);y[c+168>>2]=f^e&(f^D);y[c+160>>2]=g^e&(g^N);y[c+152>>2]=h^e&(h^M);y[c+144>>2]=i^e&(i^L);y[c+180>>2]=E^e&(E^K);y[c+172>>2]=p^e&(p^J);y[c+164>>2]=m^e&(m^I);y[c+156>>2]=l^e&(l^H);y[c+148>>2]=k^e&(k^G);E=y[c+528>>2];F=y[c+532>>2];G=y[c+536>>2];H=y[c+540>>2];I=y[c+544>>2];J=y[c+548>>2];K=y[c+552>>2];L=y[c+556>>2];M=y[c+560>>2];N=y[c+564>>2];d=y[c+672>>2];D=y[c+624>>2];f=y[c+676>>2];P=y[c+628>>2];g=y[c+680>>2];Q=y[c+632>>2];h=y[c+684>>2];R=y[c+636>>2];i=y[c+688>>2];S=y[c+640>>2];k=y[c+692>>2];U=y[c+644>>2];l=y[c+696>>2];V=y[c+648>>2];m=y[c+700>>2];W=y[c+652>>2];p=y[c+704>>2];X=y[c+656>>2];O=y[c+708>>2];y[c+708>>2]=O^e&(y[c+660>>2]^O);y[c+704>>2]=p^e&(p^X);y[c+700>>2]=m^e&(m^W);y[c+696>>2]=l^e&(l^V);y[c+692>>2]=k^e&(k^U);y[c+688>>2]=i^e&(i^S);y[c+684>>2]=h^e&(h^R);y[c+680>>2]=g^e&(g^Q);y[c+676>>2]=f^e&(f^P);y[c+672>>2]=d^e&(d^D);d=c+96|0;ga(d,c+144|0,j);pa(n,d);f=y[b+80>>2];g=y[b+84>>2];h=y[b+88>>2];i=y[b+92>>2];j=y[b+96>>2];k=y[b+100>>2];l=y[b+104>>2];m=y[b+108>>2];p=y[b+112>>2];D=y[b+116>>2];b=0-(w[c+384|0]&1)|0;d=C^e&(C^N);y[c+420>>2]=D-(b&(0-d^d)^d);d=B^e&(B^M);y[c+416>>2]=p-(b&(0-d^d)^d);d=A^e&(A^L);y[c+412>>2]=m-(b&(0-d^d)^d);d=x^e&(x^K);y[c+408>>2]=l-(b&(0-d^d)^d);d=v^e&(v^J);y[c+404>>2]=k-(b&(0-d^d)^d);d=u^e&(u^I);y[c+400>>2]=j-(b&(0-d^d)^d);d=t^e&(t^H);y[c+396>>2]=i-(b&(0-d^d)^d);d=s^e&(s^G);y[c+392>>2]=h-(b&(0-d^d)^d);d=r^e&(r^F);y[c+388>>2]=g-(b&(0-d^d)^d);d=b;b=o^e&(o^E);y[c+384>>2]=f-(d&(0-b^b)^b);ga(n,q,n);pa(c+768|0,n);b=0-(w[c+768|0]&1)|0;d=y[c+384>>2];y[c+384>>2]=b&(0-d^d)^d;d=y[c+388>>2];y[c+388>>2]=b&(0-d^d)^d;d=y[c+392>>2];y[c+392>>2]=b&(0-d^d)^d;d=y[c+396>>2];y[c+396>>2]=b&(0-d^d)^d;d=y[c+400>>2];y[c+400>>2]=b&(0-d^d)^d;d=y[c+404>>2];y[c+404>>2]=b&(0-d^d)^d;d=y[c+408>>2];y[c+408>>2]=b&(0-d^d)^d;d=y[c+412>>2];y[c+412>>2]=b&(0-d^d)^d;d=y[c+416>>2];y[c+416>>2]=b&(0-d^d)^d;d=b;b=y[c+420>>2];y[c+420>>2]=d&(0-b^b)^b;pa(a,n);T=c+800|0;}function Fe(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;f=T-224|0;T=f;l=y[e+60>>2]^d>>>29;m=y[e+56>>2]^d<<3;h=y[e+52>>2]^c>>>29;j=y[e+48>>2]^c<<3;g=e- -64|0;while(1){c=y[e+92>>2];y[f+216>>2]=y[e+88>>2];y[f+220>>2]=c;c=y[e+84>>2];y[f+208>>2]=y[e+80>>2];y[f+212>>2]=c;c=y[g+4>>2];y[f+176>>2]=y[g>>2];y[f+180>>2]=c;c=y[g+12>>2];y[f+184>>2]=y[g+8>>2];y[f+188>>2]=c;c=y[e+84>>2];y[f+160>>2]=y[e+80>>2];y[f+164>>2]=c;c=y[e+92>>2];y[f+168>>2]=y[e+88>>2];y[f+172>>2]=c;d=f+192|0;ia(d,f+176|0,f+160|0);c=y[f+204>>2];y[e+88>>2]=y[f+200>>2];y[e+92>>2]=c;c=y[f+196>>2];y[e+80>>2]=y[f+192>>2];y[e+84>>2]=c;c=y[e+52>>2];y[f+144>>2]=y[e+48>>2];y[f+148>>2]=c;c=y[e+60>>2];y[f+152>>2]=y[e+56>>2];y[f+156>>2]=c;c=y[g+4>>2];y[f+128>>2]=y[g>>2];y[f+132>>2]=c;c=y[g+12>>2];y[f+136>>2]=y[g+8>>2];y[f+140>>2]=c;ia(d,f+144|0,f+128|0);c=y[f+204>>2];y[g+8>>2]=y[f+200>>2];y[g+12>>2]=c;c=y[f+196>>2];y[g>>2]=y[f+192>>2];y[g+4>>2]=c;c=y[e+36>>2];y[f+112>>2]=y[e+32>>2];y[f+116>>2]=c;c=y[e+44>>2];y[f+120>>2]=y[e+40>>2];y[f+124>>2]=c;c=y[e+52>>2];y[f+96>>2]=y[e+48>>2];y[f+100>>2]=c;c=y[e+60>>2];y[f+104>>2]=y[e+56>>2];y[f+108>>2]=c;ia(d,f+112|0,f+96|0);c=y[f+204>>2];y[e+56>>2]=y[f+200>>2];y[e+60>>2]=c;c=y[f+196>>2];y[e+48>>2]=y[f+192>>2];y[e+52>>2]=c;c=y[e+20>>2];y[f+80>>2]=y[e+16>>2];y[f+84>>2]=c;c=y[e+28>>2];y[f+88>>2]=y[e+24>>2];y[f+92>>2]=c;c=y[e+36>>2];y[f+64>>2]=y[e+32>>2];y[f+68>>2]=c;c=y[e+44>>2];y[f+72>>2]=y[e+40>>2];y[f+76>>2]=c;ia(d,f+80|0,f- -64|0);c=y[f+204>>2];y[e+40>>2]=y[f+200>>2];y[e+44>>2]=c;c=y[f+196>>2];y[e+32>>2]=y[f+192>>2];y[e+36>>2]=c;c=y[e+4>>2];y[f+48>>2]=y[e>>2];y[f+52>>2]=c;c=y[e+12>>2];y[f+56>>2]=y[e+8>>2];y[f+60>>2]=c;c=y[e+20>>2];y[f+32>>2]=y[e+16>>2];y[f+36>>2]=c;c=y[e+28>>2];y[f+40>>2]=y[e+24>>2];y[f+44>>2]=c;ia(d,f+48|0,f+32|0);c=y[f+204>>2];y[e+24>>2]=y[f+200>>2];y[e+28>>2]=c;c=y[f+196>>2];y[e+16>>2]=y[f+192>>2];y[e+20>>2]=c;c=y[f+212>>2];y[f+16>>2]=y[f+208>>2];y[f+20>>2]=c;c=y[f+220>>2];y[f+24>>2]=y[f+216>>2];y[f+28>>2]=c;c=y[e+4>>2];y[f>>2]=y[e>>2];y[f+4>>2]=c;c=y[e+12>>2];y[f+8>>2]=y[e+8>>2];y[f+12>>2]=c;ia(d,f+16|0,f);k=y[f+192>>2];d=y[f+196>>2];c=y[f+200>>2];n=l^y[f+204>>2];y[e+12>>2]=n;p=c^m;y[e+8>>2]=p;q=d^h;y[e+4>>2]=q;r=j^k;y[e>>2]=r;i=i+1|0;if((i|0)!=7){continue}break}a:{b:{c:{c=b-16|0;if(c){if((c|0)==16){break c}break b}s=y[e+16>>2];t=y[e+48>>2];u=y[e+32>>2];v=y[e+80>>2];x=y[e- -64>>2];g=y[e+20>>2];l=y[e+52>>2];m=y[e+36>>2];h=y[e+84>>2];j=y[e+68>>2];k=y[e+24>>2];i=y[e+56>>2];d=y[e+40>>2];c=y[e+88>>2];b=y[e+72>>2];e=n^(y[e+28>>2]^(y[e+60>>2]^(y[e+44>>2]^(y[e+92>>2]^y[e+76>>2]))));w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;b=p^(b^c^d^i^k);w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(g^(l^(h^j^m)));w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(s^(t^(u^(v^x))));w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;break a}j=y[e+32>>2];k=y[e+16>>2];i=y[e+36>>2];d=y[e+20>>2];c=y[e+40>>2];b=y[e+24>>2];h=n^(y[e+44>>2]^y[e+28>>2]);w[a+12|0]=h;w[a+13|0]=h>>>8;w[a+14|0]=h>>>16;w[a+15|0]=h>>>24;b=p^(b^c);w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(d^i);w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(j^k);w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;l=y[e+48>>2];m=y[e+80>>2];h=y[e- -64>>2];j=y[e+52>>2];k=y[e+84>>2];i=y[e+68>>2];d=y[e+56>>2];c=y[e+88>>2];b=y[e+72>>2];e=y[e+60>>2]^(y[e+92>>2]^y[e+76>>2]);w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;b=d^(b^c);w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=j^(k^i);w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=l^(h^m);w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;break a}if(!b){break a}o(a,0,b);}T=f+224|0;}function xh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=-1;h=d-65|0;if(!(h>>>0<4294967232|c>>>0>64)){a:{if(!(c?b:0)){if((h&255)>>>0>191){b:{if(!e){i=725511199;h=-1694144372;c=-1377402159;b=1359893119;break b}i=(z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24))^725511199;h=(z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24))^-1694144372;c=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))^-1377402159;b=(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))^1359893119;}c:{if(!f){j=327033209;f=1541459225;g=-79577749;e=528734635;break c}e=f;j=(z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24))^327033209;f=(z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24))^1541459225;g=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))^-79577749;e=(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))^528734635;}o(a- -64|0,0,293);w[a+56|0]=j;w[a+57|0]=j>>>8;w[a+58|0]=j>>>16;w[a+59|0]=j>>>24;w[a+60|0]=f;w[a+61|0]=f>>>8;w[a+62|0]=f>>>16;w[a+63|0]=f>>>24;w[a+48|0]=g;w[a+49|0]=g>>>8;w[a+50|0]=g>>>16;w[a+51|0]=g>>>24;w[a+52|0]=e;w[a+53|0]=e>>>8;w[a+54|0]=e>>>16;w[a+55|0]=e>>>24;w[a+40|0]=i;w[a+41|0]=i>>>8;w[a+42|0]=i>>>16;w[a+43|0]=i>>>24;w[a+44|0]=h;w[a+45|0]=h>>>8;w[a+46|0]=h>>>16;w[a+47|0]=h>>>24;w[a+32|0]=c;w[a+33|0]=c>>>8;w[a+34|0]=c>>>16;w[a+35|0]=c>>>24;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;b=d^-222443256;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=103;w[a+5|0]=230;w[a+6|0]=9;w[a+7|0]=106;break a}na();s();}k=T-128|0;T=k;d:{if(!(!b|(d-65&255)>>>0<=191|(c-65&255)>>>0<=191)){e:{if(!e){i=725511199;h=-1694144372;g=-1377402159;e=1359893119;break e}i=(z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24))^725511199;h=(z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24))^-1694144372;g=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))^-1377402159;e=(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))^1359893119;}m=g;f:{if(!f){j=327033209;f=1541459225;l=-79577749;g=528734635;break f}g=f;j=(z[g+8|0]|z[g+9|0]<<8|(z[g+10|0]<<16|z[g+11|0]<<24))^327033209;f=(z[g+12|0]|z[g+13|0]<<8|(z[g+14|0]<<16|z[g+15|0]<<24))^1541459225;l=(z[g|0]|z[g+1|0]<<8|(z[g+2|0]<<16|z[g+3|0]<<24))^-79577749;g=(z[g+4|0]|z[g+5|0]<<8|(z[g+6|0]<<16|z[g+7|0]<<24))^528734635;}o(a- -64|0,0,293);w[a+56|0]=j;w[a+57|0]=j>>>8;w[a+58|0]=j>>>16;w[a+59|0]=j>>>24;w[a+60|0]=f;w[a+61|0]=f>>>8;w[a+62|0]=f>>>16;w[a+63|0]=f>>>24;w[a+48|0]=l;w[a+49|0]=l>>>8;w[a+50|0]=l>>>16;w[a+51|0]=l>>>24;w[a+52|0]=g;w[a+53|0]=g>>>8;w[a+54|0]=g>>>16;w[a+55|0]=g>>>24;w[a+40|0]=i;w[a+41|0]=i>>>8;w[a+42|0]=i>>>16;w[a+43|0]=i>>>24;w[a+44|0]=h;w[a+45|0]=h>>>8;w[a+46|0]=h>>>16;w[a+47|0]=h>>>24;w[a+32|0]=m;w[a+33|0]=m>>>8;w[a+34|0]=m>>>16;w[a+35|0]=m>>>24;w[a+36|0]=e;w[a+37|0]=e>>>8;w[a+38|0]=e>>>16;w[a+39|0]=e>>>24;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;e=(c<<8|d)^-222443256;w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;d=c>>>24^1779033703;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;o(k,0,128);if(c){t(k,b,c);}t(a+96|0,k,128);w[a+352|0]=128;w[a+353|0]=0;w[a+354|0]=0;w[a+355|0]=0;ja(k,128);T=k+128|0;break d}na();s();}}g=0;}return g|0}function Ca(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=T-704|0;T=j;g=a+80|0;e=y[a+72>>2]>>>3&127;c=g+e|0;a:{if(e>>>0>=112){e=128-e|0;if(e){t(c,39152,e);}Xb(a,g,j,j+640|0);o(g,0,112);break a}e=112-e|0;if(!e){break a}t(c,39152,e);}e=a- -64|0;d=y[e>>2];c=y[e+4>>2];i=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;k=f<<24;h=d&-16777216;f=h>>>24|0;y[a+192>>2]=k|h<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));c=e|f|i;y[a+196>>2]=c;d=y[a+72>>2];i=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+76>>2];k=f<<24;h=d&-16777216;f=h>>>24|0;y[a+200>>2]=k|h<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));c=e|f|i;y[a+204>>2]=c;Xb(a,g,j,j+640|0);d=y[a>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+4>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b|0]=c;w[b+1|0]=c>>>8;w[b+2|0]=c>>>16;w[b+3|0]=c>>>24;c=e|f|h;e=c|0;w[b+4|0]=e;w[b+5|0]=e>>>8;w[b+6|0]=e>>>16;w[b+7|0]=e>>>24;d=y[a+8>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+12>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+8|0]=c;w[b+9|0]=c>>>8;w[b+10|0]=c>>>16;w[b+11|0]=c>>>24;c=e|f|h;e=c|0;w[b+12|0]=e;w[b+13|0]=e>>>8;w[b+14|0]=e>>>16;w[b+15|0]=e>>>24;d=y[a+16>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+20>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+16|0]=c;w[b+17|0]=c>>>8;w[b+18|0]=c>>>16;w[b+19|0]=c>>>24;c=e|f|h;e=c|0;w[b+20|0]=e;w[b+21|0]=e>>>8;w[b+22|0]=e>>>16;w[b+23|0]=e>>>24;d=y[a+24>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+28>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+24|0]=c;w[b+25|0]=c>>>8;w[b+26|0]=c>>>16;w[b+27|0]=c>>>24;c=e|f|h;e=c|0;w[b+28|0]=e;w[b+29|0]=e>>>8;w[b+30|0]=e>>>16;w[b+31|0]=e>>>24;d=y[a+32>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+36>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+32|0]=c;w[b+33|0]=c>>>8;w[b+34|0]=c>>>16;w[b+35|0]=c>>>24;c=e|f|h;e=c|0;w[b+36|0]=e;w[b+37|0]=e>>>8;w[b+38|0]=e>>>16;w[b+39|0]=e>>>24;d=y[a+40>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+44>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+40|0]=c;w[b+41|0]=c>>>8;w[b+42|0]=c>>>16;w[b+43|0]=c>>>24;c=e|f|h;e=c|0;w[b+44|0]=e;w[b+45|0]=e>>>8;w[b+46|0]=e>>>16;w[b+47|0]=e>>>24;d=y[a+48>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+52>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+48|0]=c;w[b+49|0]=c>>>8;w[b+50|0]=c>>>16;w[b+51|0]=c>>>24;c=e|f|h;e=c|0;w[b+52|0]=e;w[b+53|0]=e>>>8;w[b+54|0]=e>>>16;w[b+55|0]=e>>>24;d=y[a+56>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=b;i=f<<24;g=d&-16777216;f=g>>>24|0;b=y[a+60>>2];b=i|g<<8|(((b&255)<<24|d>>>8)&-16777216|((b&16777215)<<8|d>>>24)&16711680|(b>>>8&65280|b>>>24));w[c+56|0]=b;w[c+57|0]=b>>>8;w[c+58|0]=b>>>16;w[c+59|0]=b>>>24;b=e|f|h;b=b|0;w[c+60|0]=b;w[c+61|0]=b>>>8;w[c+62|0]=b>>>16;w[c+63|0]=b>>>24;ja(j,704);ja(a,208);T=j+704|0;return 0}function ec(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0;b=T-2048|0;T=b;i=b+640|0;qa(i,a);c=y[a+36>>2];y[b+352>>2]=y[a+32>>2];y[b+356>>2]=c;c=y[a+28>>2];y[b+344>>2]=y[a+24>>2];y[b+348>>2]=c;c=y[a+20>>2];y[b+336>>2]=y[a+16>>2];y[b+340>>2]=c;c=y[a+12>>2];y[b+328>>2]=y[a+8>>2];y[b+332>>2]=c;c=y[a+4>>2];y[b+320>>2]=y[a>>2];y[b+324>>2]=c;c=y[a+44>>2];y[b+360>>2]=y[a+40>>2];y[b+364>>2]=c;c=y[a+52>>2];y[b+368>>2]=y[a+48>>2];y[b+372>>2]=c;c=y[a+60>>2];y[b+376>>2]=y[a+56>>2];y[b+380>>2]=c;d=a- -64|0;c=y[d+4>>2];y[b+384>>2]=y[d>>2];y[b+388>>2]=c;c=y[a+76>>2];y[b+392>>2]=y[a+72>>2];y[b+396>>2]=c;c=y[a+84>>2];y[b+400>>2]=y[a+80>>2];y[b+404>>2]=c;c=y[a+92>>2];y[b+408>>2]=y[a+88>>2];y[b+412>>2]=c;c=y[a+100>>2];y[b+416>>2]=y[a+96>>2];y[b+420>>2]=c;c=y[a+108>>2];y[b+424>>2]=y[a+104>>2];y[b+428>>2]=c;c=y[a+116>>2];y[b+432>>2]=y[a+112>>2];y[b+436>>2]=c;e=b+480|0;d=b+320|0;xa(e,d);c=b+160|0;f=b+600|0;ga(c,e,f);g=b+520|0;h=b+560|0;ga(b+200|0,g,h);ga(b+240|0,h,f);ga(b+280|0,e,g);sa(e,c,i);ga(d,e,f);l=b+360|0;ga(l,g,h);m=b+400|0;ga(m,h,f);n=b+440|0;ga(n,e,g);a=b+800|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+960|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1120|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1280|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1440|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1600|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);qa(b+1760|0,d);y[b+32>>2]=0;y[b+36>>2]=0;y[b+24>>2]=0;y[b+28>>2]=0;y[b+16>>2]=0;y[b+20>>2]=0;y[b+8>>2]=0;y[b+12>>2]=0;y[b>>2]=0;y[b+4>>2]=0;y[b+44>>2]=0;y[b+48>>2]=0;y[b+40>>2]=1;y[b+52>>2]=0;y[b+56>>2]=0;y[b+60>>2]=0;y[b+64>>2]=0;y[b+68>>2]=0;y[b+72>>2]=0;y[b+76>>2]=0;y[b+80>>2]=1;o(b+84|0,0,76);e=b+120|0;j=b+2008|0;k=b+1968|0;i=b+80|0;d=b+40|0;a=252;while(1){c=y[b+36>>2];y[b+1960>>2]=y[b+32>>2];y[b+1964>>2]=c;c=y[b+28>>2];y[b+1952>>2]=y[b+24>>2];y[b+1956>>2]=c;c=y[b+20>>2];y[b+1944>>2]=y[b+16>>2];y[b+1948>>2]=c;c=y[b+12>>2];y[b+1936>>2]=y[b+8>>2];y[b+1940>>2]=c;c=y[b+4>>2];y[b+1928>>2]=y[b>>2];y[b+1932>>2]=c;c=y[d+36>>2];y[k+32>>2]=y[d+32>>2];y[k+36>>2]=c;c=y[d+28>>2];y[k+24>>2]=y[d+24>>2];y[k+28>>2]=c;c=y[d+20>>2];y[k+16>>2]=y[d+16>>2];y[k+20>>2]=c;c=y[d+12>>2];y[k+8>>2]=y[d+8>>2];y[k+12>>2]=c;c=y[d+4>>2];y[k>>2]=y[d>>2];y[k+4>>2]=c;c=y[i+36>>2];y[j+32>>2]=y[i+32>>2];y[j+36>>2]=c;c=y[i+28>>2];y[j+24>>2]=y[i+24>>2];y[j+28>>2]=c;c=y[i+20>>2];y[j+16>>2]=y[i+16>>2];y[j+20>>2]=c;c=y[i+12>>2];y[j+8>>2]=y[i+8>>2];y[j+12>>2]=c;c=y[i+4>>2];y[j>>2]=y[i>>2];y[j+4>>2]=c;c=a;q=w[a+33712|0];p=b+480|0;xa(p,b+1928|0);a:{if((q|0)>0){a=b+320|0;ga(a,p,f);ga(l,g,h);ga(m,h,f);ga(n,p,g);sa(p,a,(b+640|0)+E((q&254)>>>1|0,160)|0);break a}if((q|0)>=0){break a}a=b+320|0;p=b+480|0;ga(a,p,f);ga(l,g,h);ga(m,h,f);ga(n,p,g);Hb(p,a,(b+640|0)+E((0-q&254)>>>1|0,160)|0);}r=b+480|0;ga(b,r,f);ga(d,g,h);ga(i,h,f);ga(e,r,g);a=c-1|0;if(c){continue}break}s=y[b+40>>2];t=y[b+80>>2];u=y[b+44>>2];f=y[b+84>>2];g=y[b+48>>2];h=y[b+88>>2];j=y[b+52>>2];k=y[b+92>>2];l=y[b+56>>2];m=y[b+96>>2];n=y[b+60>>2];q=y[b+100>>2];p=y[b+64>>2];e=y[b+104>>2];i=y[b+68>>2];d=y[b+108>>2];c=y[b+72>>2];a=y[b+112>>2];y[b+676>>2]=y[b+76>>2]-y[b+116>>2];y[b+672>>2]=c-a;y[b+668>>2]=i-d;y[b+664>>2]=p-e;y[b+660>>2]=n-q;y[b+656>>2]=l-m;y[b+652>>2]=j-k;y[b+648>>2]=g-h;y[b+644>>2]=u-f;y[b+640>>2]=s-t;pa(r,b);c=ya(r,32);pa(r,b+640|0);a=ya(r,32);T=b+2048|0;return a&c}function $b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=T-288|0;T=c;f=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);g=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);h=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);i=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);j=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);k=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);l=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);m=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=y[b+124>>2];y[c+280>>2]=y[b+120>>2];y[c+284>>2]=a;a=y[b+116>>2];y[c+272>>2]=y[b+112>>2];y[c+276>>2]=a;a=y[b+100>>2];y[c+240>>2]=y[b+96>>2];y[c+244>>2]=a;a=y[b+108>>2];y[c+248>>2]=y[b+104>>2];y[c+252>>2]=a;a=y[b+116>>2];y[c+224>>2]=y[b+112>>2];y[c+228>>2]=a;a=y[b+124>>2];y[c+232>>2]=y[b+120>>2];y[c+236>>2]=a;a=c+256|0;ia(a,c+240|0,c+224|0);e=y[c+268>>2];y[b+120>>2]=y[c+264>>2];y[b+124>>2]=e;e=y[c+260>>2];y[b+112>>2]=y[c+256>>2];y[b+116>>2]=e;e=y[b+84>>2];y[c+208>>2]=y[b+80>>2];y[c+212>>2]=e;e=y[b+92>>2];y[c+216>>2]=y[b+88>>2];y[c+220>>2]=e;e=y[b+100>>2];y[c+192>>2]=y[b+96>>2];y[c+196>>2]=e;e=y[b+108>>2];y[c+200>>2]=y[b+104>>2];y[c+204>>2]=e;ia(a,c+208|0,c+192|0);e=y[c+268>>2];y[b+104>>2]=y[c+264>>2];y[b+108>>2]=e;e=y[c+260>>2];y[b+96>>2]=y[c+256>>2];y[b+100>>2]=e;e=b- -64|0;d=y[e+4>>2];y[c+176>>2]=y[e>>2];y[c+180>>2]=d;d=y[b+76>>2];y[c+184>>2]=y[b+72>>2];y[c+188>>2]=d;d=y[b+84>>2];y[c+160>>2]=y[b+80>>2];y[c+164>>2]=d;d=y[b+92>>2];y[c+168>>2]=y[b+88>>2];y[c+172>>2]=d;ia(a,c+176|0,c+160|0);d=y[c+268>>2];y[b+88>>2]=y[c+264>>2];y[b+92>>2]=d;d=y[c+260>>2];y[b+80>>2]=y[c+256>>2];y[b+84>>2]=d;d=y[b+52>>2];y[c+144>>2]=y[b+48>>2];y[c+148>>2]=d;d=y[b+60>>2];y[c+152>>2]=y[b+56>>2];y[c+156>>2]=d;d=y[e+4>>2];y[c+128>>2]=y[e>>2];y[c+132>>2]=d;d=y[b+76>>2];y[c+136>>2]=y[b+72>>2];y[c+140>>2]=d;ia(a,c+144|0,c+128|0);d=y[c+268>>2];y[b+72>>2]=y[c+264>>2];y[b+76>>2]=d;d=y[c+260>>2];y[e>>2]=y[c+256>>2];y[e+4>>2]=d;d=y[b+36>>2];y[c+112>>2]=y[b+32>>2];y[c+116>>2]=d;d=y[b+44>>2];y[c+120>>2]=y[b+40>>2];y[c+124>>2]=d;d=y[b+52>>2];y[c+96>>2]=y[b+48>>2];y[c+100>>2]=d;d=y[b+60>>2];y[c+104>>2]=y[b+56>>2];y[c+108>>2]=d;ia(a,c+112|0,c+96|0);d=y[c+268>>2];y[b+56>>2]=y[c+264>>2];y[b+60>>2]=d;d=y[c+260>>2];y[b+48>>2]=y[c+256>>2];y[b+52>>2]=d;d=y[b+20>>2];y[c+80>>2]=y[b+16>>2];y[c+84>>2]=d;d=y[b+28>>2];y[c+88>>2]=y[b+24>>2];y[c+92>>2]=d;d=y[b+36>>2];y[c+64>>2]=y[b+32>>2];y[c+68>>2]=d;d=y[b+44>>2];y[c+72>>2]=y[b+40>>2];y[c+76>>2]=d;ia(a,c+80|0,c- -64|0);d=y[c+268>>2];y[b+40>>2]=y[c+264>>2];y[b+44>>2]=d;d=y[c+260>>2];y[b+32>>2]=y[c+256>>2];y[b+36>>2]=d;d=y[b+4>>2];y[c+48>>2]=y[b>>2];y[c+52>>2]=d;d=y[b+12>>2];y[c+56>>2]=y[b+8>>2];y[c+60>>2]=d;d=y[b+20>>2];y[c+32>>2]=y[b+16>>2];y[c+36>>2]=d;d=y[b+28>>2];y[c+40>>2]=y[b+24>>2];y[c+44>>2]=d;ia(a,c+48|0,c+32|0);d=y[c+268>>2];y[b+24>>2]=y[c+264>>2];y[b+28>>2]=d;d=y[c+260>>2];y[b+16>>2]=y[c+256>>2];y[b+20>>2]=d;d=y[c+276>>2];y[c+16>>2]=y[c+272>>2];y[c+20>>2]=d;d=y[c+284>>2];y[c+24>>2]=y[c+280>>2];y[c+28>>2]=d;d=y[b+4>>2];y[c>>2]=y[b>>2];y[c+4>>2]=d;d=y[b+12>>2];y[c+8>>2]=y[b+8>>2];y[c+12>>2]=d;ia(a,c+16|0,c);a=y[c+268>>2];y[b+8>>2]=y[c+264>>2];y[b+12>>2]=a;a=y[c+260>>2];y[b>>2]=y[c+256>>2];y[b+4>>2]=a;y[b+12>>2]=y[b+12>>2]^l;y[b+8>>2]=y[b+8>>2]^k;y[b+4>>2]=y[b+4>>2]^j;y[b>>2]=y[b>>2]^m;y[e>>2]=y[e>>2]^i;y[b+68>>2]=y[b+68>>2]^h;y[b+72>>2]=y[b+72>>2]^g;y[b+76>>2]=y[b+76>>2]^f;T=c+288|0;}function jb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-480|0;T=d;c=z[b|0];w[d+289|0]=c>>>4;w[d+288|0]=c&15;c=z[b+1|0];w[d+291|0]=c>>>4;w[d+290|0]=c&15;c=z[b+2|0];w[d+293|0]=c>>>4;w[d+292|0]=c&15;c=z[b+3|0];w[d+295|0]=c>>>4;w[d+294|0]=c&15;c=z[b+4|0];w[d+297|0]=c>>>4;w[d+296|0]=c&15;c=z[b+5|0];w[d+299|0]=c>>>4;w[d+298|0]=c&15;c=z[b+6|0];w[d+301|0]=c>>>4;w[d+300|0]=c&15;c=z[b+7|0];w[d+303|0]=c>>>4;w[d+302|0]=c&15;c=z[b+8|0];w[d+305|0]=c>>>4;w[d+304|0]=c&15;c=z[b+9|0];w[d+307|0]=c>>>4;w[d+306|0]=c&15;c=z[b+10|0];w[d+309|0]=c>>>4;w[d+308|0]=c&15;c=z[b+11|0];w[d+311|0]=c>>>4;w[d+310|0]=c&15;c=z[b+12|0];w[d+313|0]=c>>>4;w[d+312|0]=c&15;c=z[b+13|0];w[d+315|0]=c>>>4;w[d+314|0]=c&15;c=z[b+14|0];w[d+317|0]=c>>>4;w[d+316|0]=c&15;c=z[b+15|0];w[d+319|0]=c>>>4;w[d+318|0]=c&15;c=z[b+16|0];w[d+321|0]=c>>>4;w[d+320|0]=c&15;c=z[b+17|0];w[d+323|0]=c>>>4;w[d+322|0]=c&15;c=z[b+18|0];w[d+325|0]=c>>>4;w[d+324|0]=c&15;c=z[b+19|0];w[d+327|0]=c>>>4;w[d+326|0]=c&15;c=z[b+20|0];w[d+329|0]=c>>>4;w[d+328|0]=c&15;c=z[b+21|0];w[d+331|0]=c>>>4;w[d+330|0]=c&15;c=z[b+22|0];w[d+333|0]=c>>>4;w[d+332|0]=c&15;c=z[b+23|0];w[d+335|0]=c>>>4;w[d+334|0]=c&15;c=z[b+24|0];w[d+337|0]=c>>>4;w[d+336|0]=c&15;c=z[b+25|0];w[d+339|0]=c>>>4;w[d+338|0]=c&15;c=z[b+26|0];w[d+341|0]=c>>>4;w[d+340|0]=c&15;c=z[b+27|0];w[d+343|0]=c>>>4;w[d+342|0]=c&15;c=z[b+28|0];w[d+345|0]=c>>>4;w[d+344|0]=c&15;c=z[b+29|0];w[d+347|0]=c>>>4;w[d+346|0]=c&15;c=z[b+30|0];w[d+349|0]=c>>>4;w[d+348|0]=c&15;b=z[b+31|0];w[d+351|0]=b>>>4;w[d+350|0]=b&15;b=0;while(1){e=(d+288|0)+f|0;b=z[e|0]+b|0;c=b+8|0;w[e|0]=b-(c&240);b=z[e+1|0]+(c<<24>>24>>4)|0;c=b+8|0;w[e+1|0]=b-(c&240);b=z[e+2|0]+(c<<24>>24>>4)|0;c=b+8|0;w[e+2|0]=b-(c&240);b=c<<24>>24>>4;f=f+3|0;if((f|0)!=63){continue}break}w[d+351|0]=z[d+351|0]+b;y[a+32>>2]=0;y[a+36>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;f=a+40|0;y[f>>2]=1;y[a+52>>2]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=1;o(a+84|0,0,76);l=a+120|0;c=a+80|0;g=d+208|0;k=d+168|0;h=d+248|0;b=1;while(1){e=d+8|0;Kc(e,b>>>1|0,w[(d+288|0)+b|0]);i=d+128|0;fc(i,a,e);ga(a,i,h);ga(f,k,g);ga(c,g,h);ga(l,i,k);e=b>>>0<62;b=b+2|0;if(e){continue}break}b=y[a+36>>2];y[d+392>>2]=y[a+32>>2];y[d+396>>2]=b;b=y[a+28>>2];y[d+384>>2]=y[a+24>>2];y[d+388>>2]=b;b=y[a+20>>2];y[d+376>>2]=y[a+16>>2];y[d+380>>2]=b;b=y[a+12>>2];y[d+368>>2]=y[a+8>>2];y[d+372>>2]=b;b=y[a+4>>2];y[d+360>>2]=y[a>>2];y[d+364>>2]=b;b=y[f+4>>2];y[d+400>>2]=y[f>>2];y[d+404>>2]=b;b=y[f+12>>2];y[d+408>>2]=y[f+8>>2];y[d+412>>2]=b;b=y[f+20>>2];y[d+416>>2]=y[f+16>>2];y[d+420>>2]=b;b=y[f+28>>2];y[d+424>>2]=y[f+24>>2];y[d+428>>2]=b;b=y[f+36>>2];y[d+432>>2]=y[f+32>>2];y[d+436>>2]=b;b=y[c+4>>2];y[d+440>>2]=y[c>>2];y[d+444>>2]=b;b=y[c+12>>2];y[d+448>>2]=y[c+8>>2];y[d+452>>2]=b;b=y[c+20>>2];y[d+456>>2]=y[c+16>>2];y[d+460>>2]=b;b=y[c+28>>2];y[d+464>>2]=y[c+24>>2];y[d+468>>2]=b;b=y[c+36>>2];y[d+472>>2]=y[c+32>>2];y[d+476>>2]=b;j=d+360|0;xa(i,j);ga(j,i,h);e=d+400|0;ga(e,k,g);b=d+440|0;ga(b,g,h);xa(i,j);ga(j,i,h);ga(e,k,g);ga(b,g,h);xa(i,j);ga(j,i,h);ga(e,k,g);ga(b,g,h);xa(i,j);ga(a,i,h);ga(f,k,g);ga(c,g,h);ga(l,i,k);b=0;while(1){e=d+8|0;Kc(e,b>>>1|0,w[(d+288|0)+b|0]);j=d+128|0;fc(j,a,e);ga(a,j,h);ga(f,k,g);ga(c,g,h);ga(l,j,k);e=b>>>0<62;b=b+2|0;if(e){continue}break}T=d+480|0;}function gd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);h=d^1886610805;f=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);g=f^1936682341;i=d^1852142177;j=f^1819895653;d=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);f=d^1852075885;e=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);l=e^1685025377;k=d^2037671283;m=e^1952801890;d=c&-8;if(d){d=b+d|0;while(1){p=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);e=k^p;i=i+e|0;t=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);m=m^t;j=j+m|0;j=e>>>0>i>>>0?j+1|0:j;g=g+l|0;o=g+1|0;k=g;g=f+h|0;k=h>>>0>g>>>0?o:k;f=Ci(f,l,13)^g;h=i+f|0;n=W^k;l=j+n|0;n=Ci(f,n,17)^h;l=f>>>0>h>>>0?l+1|0:l;q=l^W;s=Ci(n,q,13);r=W;e=Ci(e,m,16);f=j^W;j=e^i;i=Ci(g,k,32);e=j+i|0;g=W+f|0;k=e>>>0>>0?g+1|0:g;i=q+k|0;o=i+1|0;g=i;i=e+n|0;g=i>>>0>>0?o:g;m=i^s;n=g^r;q=Ci(m,n,17);s=W;f=Ci(j,f,21);j=k^W;k=e^f;h=Ci(h,l,32);e=k+h|0;f=W+j|0;r=e>>>0>>0?f+1|0:f;h=r+n|0;o=h+1|0;f=h;h=e+m|0;n=h>>>0>>0?o:f;f=h^q;l=n^s;j=Ci(k,j,16);k=r^W;m=k;e=e^j;j=Ci(e,k,21);q=W;i=Ci(i,g,32);e=i+e|0;k=e^j;g=W+m|0;g=e>>>0>>0?g+1|0:g;m=g^q;i=Ci(h,n,32);j=W;h=e^p;g=g^t;b=b+8|0;if((d|0)!=(b|0)){continue}break}b=d;}e=c<<24;d=0;a:{switch((c&7)-1|0){case 6:e=e|z[b+6|0]<<16;case 5:e=e|z[b+5|0]<<8;case 4:e=e|z[b+4|0];case 3:d=z[b+3|0]<<24;case 2:d=d|z[b+2|0]<<16;case 1:d=d|z[b+1|0]<<8;case 0:d=z[b|0]|d;break;default:break a}}b=d^k;c=e^m;k=Ci(b,c,16);c=c+j|0;b=b+i|0;c=b>>>0>>0?c+1|0:c;j=b^k;k=c^W;m=Ci(j,k,21);n=W;i=g+l|0;o=i+1|0;g=i;i=f+h|0;h=h>>>0>i>>>0?o:g;g=h;p=Ci(i,h,32);h=j+p|0;j=m^h;k=W+k|0;k=h>>>0

>>0?k+1|0:k;m=n^k;n=Ci(j,m,16);p=W;f=Ci(f,l,13)^i;b=b+f|0;l=W^g;c=l+c|0;i=b>>>0>>0?c+1|0:c;g=Ci(b,i,32);c=j+g|0;j=n^c;m=W+m|0;g=c>>>0>>0?m+1|0:m;m=g^p;n=Ci(j,m,21);p=W;l=Ci(f,l,17)^b;f=l;b=h+f|0;i=W^i;h=i+k|0;h=b>>>0>>0?h+1|0:h;k=h;f=n;n=Ci(b,h,32);h=j+n|0;f=f^h;j=W+m|0;j=h>>>0>>0?j+1|0:j;m=j^p;n=Ci(f,m,16);p=W;o=c;i=Ci(l,i,13)^b;c=i;b=o+c|0;o=g;g=k^W;l=o+g|0;c=b>>>0>>0?l+1|0:l;k=c;c=Ci(b,c,32);l=m+W|0;c=f+(c^255)|0;m=c>>>0>>0?l+1|0:l;f=p^m;l=c^n;n=Ci(l,f,21);p=W;i=Ci(i,g,17)^b;d=d^h;b=i+d|0;g=k^W;e=g+(e^j)|0;d=b>>>0>>0?e+1|0:e;j=d;d=Ci(b,d,32);e=f+W|0;d=d+l|0;f=d>>>0>>0?e+1|0:e;e=f^p;h=d^n;l=Ci(h,e,16);k=W;i=Ci(i,g,13)^b;b=c+i|0;g=W^j;j=m+g|0;c=b>>>0>>0?j+1|0:j;j=c;c=Ci(b,c,32);o=k;e=e+W|0;c=c+h|0;k=c>>>0>>0?e+1|0:e;e=o^k;h=c^l;l=Ci(h,e,21);m=W;i=Ci(i,g,17);g=j^W;f=f+g|0;n=f+1|0;o=f;j=d;f=b^i;d=d+f|0;b=j>>>0>d>>>0?n:o;i=b;b=Ci(d,b,32);e=e+W|0;b=b+h|0;j=b>>>0>>0?e+1|0:e;e=j^m;h=b^l;l=Ci(h,e,16);m=W;f=Ci(f,g,13);i=i^W;g=k+i|0;f=d^f;d=c+f|0;c=d>>>0>>0?g+1|0:g;g=c;c=Ci(d,c,32);e=e+W|0;c=c+h|0;k=c>>>0>>0?e+1|0:e;e=k^m;h=c^l;l=Ci(h,e,21);m=W;f=Ci(f,i,17);i=g^W;g=j+i|0;o=g+1|0;j=g;g=d^f;d=b+g|0;f=d>>>0>>0?o:j;b=Ci(d,f,32);e=e+W|0;b=b+h|0;j=b>>>0>>0?e+1|0:e;e=j^m;h=b^l;l=Ci(h,e,16);m=W;i=Ci(g,i,13);f=f^W;g=k+f|0;i=d^i;d=c+i|0;c=d>>>0>>0?g+1|0:g;g=c;c=Ci(d,c,32);e=e+W|0;c=c+h|0;e=c>>>0>>0?e+1|0:e;h=Ci(c^l,e^m,21);l=W;d=Ci(i,f,17)^d;f=g^W;i=Ci(d,f,13);f=f+j|0;d=b+d|0;b=W^(b>>>0>d>>>0?f+1|0:f);d=d^i;h=Ci(d,b,17)^h;f=W^l;b=b+e|0;g=b+1|0;e=b;b=c+d|0;c=c>>>0>b>>>0?g:e;b=Ci(b,c,32)^h^b;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;b=c^(W^f);w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;return 0}function Fc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;c=T-624|0;T=c;d=c+480|0;fa(d,b);ga(d,1632,d);f=y[c+516>>2];y[c+276>>2]=f;g=y[c+512>>2];y[c+272>>2]=g;h=y[c+508>>2];y[c+268>>2]=h;i=y[c+504>>2];y[c+264>>2]=i;j=y[c+500>>2];y[c+260>>2]=j;k=y[c+496>>2];y[c+256>>2]=k;l=y[c+492>>2];y[c+252>>2]=l;m=y[c+488>>2];y[c+248>>2]=m;n=y[c+484>>2];y[c+244>>2]=n;p=y[c+480>>2];y[c+240>>2]=p+1;e=c+240|0;ga(e,e,33968);y[c+468>>2]=f-12055116;y[c+464>>2]=g-18696448;y[c+460>>2]=h-3247719;y[c+456>>2]=i-6275908;y[c+452>>2]=j-8787816;y[c+448>>2]=k+114729;y[c+444>>2]=l+6949391;y[c+440>>2]=m-15372611;y[c+436>>2]=n+13857413;y[c+432>>2]=p-10913610;o=c+192|0;ga(o,d,1584);y[c+228>>2]=0-y[c+228>>2];y[c+224>>2]=0-y[c+224>>2];y[c+220>>2]=0-y[c+220>>2];y[c+216>>2]=0-y[c+216>>2];y[c+212>>2]=0-y[c+212>>2];y[c+208>>2]=0-y[c+208>>2];y[c+204>>2]=0-y[c+204>>2];y[c+200>>2]=0-y[c+200>>2];y[c+196>>2]=0-y[c+196>>2];y[c+192>>2]=y[c+192>>2]^-1;ga(o,o,c+432|0);K=c+384|0;d=cc(K,e,o);e=c+336|0;ga(e,K,b);L=c+576|0;pa(L,e);N=z[c+576|0];B=y[c+420>>2];e=y[c+372>>2];C=y[c+416>>2];q=y[c+368>>2];D=y[c+412>>2];r=y[c+364>>2];E=y[c+408>>2];s=y[c+360>>2];F=y[c+404>>2];t=y[c+356>>2];G=y[c+400>>2];u=y[c+352>>2];H=y[c+396>>2];v=y[c+348>>2];I=y[c+392>>2];w=y[c+344>>2];J=y[c+388>>2];x=y[c+340>>2];M=y[c+384>>2];A=y[c+336>>2];b=d-1|0;y[c+612>>2]=b&f;y[c+608>>2]=b&g;y[c+604>>2]=b&h;y[c+600>>2]=b&i;y[c+596>>2]=b&j;y[c+592>>2]=b&k;y[c+588>>2]=b&l;y[c+584>>2]=b&m;y[c+580>>2]=b&n;y[c+576>>2]=p|0-d;d=0-(N&1)|0;A=b&(0-(A^d&(A^0-A))^M)^M;y[c+384>>2]=A;x=J^b&(J^0-(x^d&(x^0-x)));y[c+388>>2]=x;w=I^b&(I^0-(w^d&(w^0-w)));y[c+392>>2]=w;v=H^b&(H^0-(v^d&(v^0-v)));y[c+396>>2]=v;u=G^b&(G^0-(u^d&(u^0-u)));y[c+400>>2]=u;t=F^b&(F^0-(t^d&(t^0-t)));y[c+404>>2]=t;s=E^b&(E^0-(s^d&(s^0-s)));y[c+408>>2]=s;r=D^b&(D^0-(r^d&(r^0-r)));y[c+412>>2]=r;q=C^b&(C^0-(q^d&(q^0-q)));y[c+416>>2]=q;d=B^b&(B^0-(e^d&(e^0-e)));y[c+420>>2]=d;y[c+564>>2]=f;y[c+560>>2]=g;y[c+556>>2]=h;y[c+552>>2]=i;y[c+548>>2]=j;y[c+544>>2]=k;y[c+540>>2]=l;y[c+536>>2]=m;y[c+532>>2]=n;y[c+528>>2]=p-1;b=c+528|0;ga(b,b,L);ga(b,b,34016);f=y[c+192>>2];g=y[c+528>>2];h=y[c+196>>2];i=y[c+532>>2];j=y[c+200>>2];k=y[c+536>>2];l=y[c+204>>2];m=y[c+540>>2];n=y[c+208>>2];p=y[c+544>>2];e=y[c+212>>2];B=y[c+548>>2];C=y[c+216>>2];D=y[c+552>>2];E=y[c+220>>2];F=y[c+556>>2];G=y[c+224>>2];H=y[c+560>>2];I=y[c+228>>2];J=y[c+564>>2];y[c+180>>2]=d<<1;y[c+176>>2]=q<<1;y[c+172>>2]=r<<1;y[c+168>>2]=s<<1;y[c+164>>2]=t<<1;y[c+160>>2]=u<<1;y[c+156>>2]=v<<1;y[c+152>>2]=w<<1;y[c+148>>2]=x<<1;y[c+144>>2]=A<<1;y[c+564>>2]=J-I;y[c+560>>2]=H-G;y[c+556>>2]=F-E;y[c+552>>2]=D-C;y[c+548>>2]=B-e;y[c+544>>2]=p-n;y[c+540>>2]=m-l;y[c+536>>2]=k-j;y[c+532>>2]=i-h;y[c+528>>2]=g-f;d=c+144|0;ga(d,d,o);o=c+96|0;ga(o,b,34064);fa(c+288|0,K);b=y[c+324>>2];y[c+84>>2]=0-b;f=y[c+320>>2];y[c+80>>2]=0-f;g=y[c+316>>2];y[c+76>>2]=0-g;h=y[c+312>>2];y[c+72>>2]=0-h;i=y[c+308>>2];y[c+68>>2]=0-i;j=y[c+304>>2];y[c+64>>2]=0-j;k=y[c+300>>2];y[c+60>>2]=0-k;l=y[c+296>>2];y[c+56>>2]=0-l;m=y[c+292>>2];y[c+52>>2]=0-m;n=y[c+288>>2];y[c+48>>2]=1-n;y[c+36>>2]=b;y[c+32>>2]=f;y[c+28>>2]=g;y[c+24>>2]=h;y[c+20>>2]=i;y[c+16>>2]=j;y[c+12>>2]=k;y[c+8>>2]=l;y[c+4>>2]=m;y[c>>2]=n+1;ga(a,d,c);b=c+48|0;ga(a+40|0,b,o);ga(a+80|0,o,c);ga(a+120|0,d,b);T=c+624|0;}function Cc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=T+-64|0;T=g;a:{if((c-65&255)>>>0>191){f=-1;if(!(z[a+80|0]|z[a+81|0]<<8|(z[a+82|0]<<16|z[a+83|0]<<24)|(z[a+84|0]|z[a+85|0]<<8|(z[a+86|0]<<16|z[a+87|0]<<24)))){h=z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24);if(h>>>0>=129){d=a- -64|0;e=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);f=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);i=f;h=e+128|0;f=h>>>0<128?f+1|0:f;w[d|0]=h;w[d+1|0]=h>>>8;w[d+2|0]=h>>>16;w[d+3|0]=h>>>24;w[d+4|0]=f;w[d+5|0]=f>>>8;w[d+6|0]=f>>>16;w[d+7|0]=f>>>24;f=z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24);d=(i|0)==-1&e>>>0>4294967167;e=d+(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))|0;f=d>>>0>e>>>0?f+1|0:f;w[a+72|0]=e;w[a+73|0]=e>>>8;w[a+74|0]=e>>>16;w[a+75|0]=e>>>24;w[a+76|0]=f;w[a+77|0]=f>>>8;w[a+78|0]=f>>>16;w[a+79|0]=f>>>24;f=a+96|0;Eb(a,f);d=(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))-128|0;w[a+352|0]=d;w[a+353|0]=d>>>8;w[a+354|0]=d>>>16;w[a+355|0]=d>>>24;if(d>>>0>=129){break a}if(d){t(f,a+224|0,d);}h=z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24);}d=a- -64|0;f=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);j=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);e=j;i=f+h|0;e=i>>>0>>0?e+1|0:e;w[d|0]=i;w[d+1|0]=i>>>8;w[d+2|0]=i>>>16;w[d+3|0]=i>>>24;w[d+4|0]=e;w[d+5|0]=e>>>8;w[d+6|0]=e>>>16;w[d+7|0]=e>>>24;d=(e|0)==(j|0)&f>>>0>i>>>0|e>>>0>>0;f=z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24);e=d+(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))|0;f=e>>>0>>0?f+1|0:f;w[a+72|0]=e;w[a+73|0]=e>>>8;w[a+74|0]=e>>>16;w[a+75|0]=e>>>24;w[a+76|0]=f;w[a+77|0]=f>>>8;w[a+78|0]=f>>>16;w[a+79|0]=f>>>24;if(z[a+356|0]){w[a+88|0]=255;w[a+89|0]=255;w[a+90|0]=255;w[a+91|0]=255;w[a+92|0]=255;w[a+93|0]=255;w[a+94|0]=255;w[a+95|0]=255;}w[a+80|0]=255;w[a+81|0]=255;w[a+82|0]=255;w[a+83|0]=255;w[a+84|0]=255;w[a+85|0]=255;w[a+86|0]=255;w[a+87|0]=255;d=a+96|0;f=0;e=256-h|0;if(e){o(d+h|0,0,e);}Eb(a,d);e=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[g>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[g+4>>2]=e;e=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[g+8>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[g+12>>2]=e;e=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[g+16>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[g+20>>2]=e;e=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[g+24>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[g+28>>2]=e;e=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[g+32>>2]=z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24);y[g+36>>2]=e;e=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);y[g+40>>2]=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[g+44>>2]=e;e=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);y[g+48>>2]=z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24);y[g+52>>2]=e;e=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);y[g+56>>2]=z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24);y[g+60>>2]=e;if(c){t(b,g,c);}ja(a,64);ja(d,256);}T=g- -64|0;return f}na();s();}Q(1386,1234,306,1142);s();}function se(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-192|0;T=d;y[d+128>>2]=0;y[d+132>>2]=0;y[d+136>>2]=0;y[d+140>>2]=0;y[d+144>>2]=0;y[d+148>>2]=0;y[d+152>>2]=0;y[d+156>>2]=0;y[d+96>>2]=0;y[d+100>>2]=0;y[d+104>>2]=0;y[d+108>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+120>>2]=0;y[d+124>>2]=0;e=y[9821];y[d+160>>2]=y[9820];y[d+164>>2]=e;e=y[9823];y[d+168>>2]=y[9822];y[d+172>>2]=e;e=y[9825];y[d+176>>2]=y[9824];y[d+180>>2]=e;e=y[9827];y[d+184>>2]=y[9826];y[d+188>>2]=e;e=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);y[d+64>>2]=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);y[d+68>>2]=e;e=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);y[d+72>>2]=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);y[d+76>>2]=e;e=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);y[d+80>>2]=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);y[d+84>>2]=e;e=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);y[d+88>>2]=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);y[d+92>>2]=e;f=d+128|0;e=d- -64|0;Ec(f,e);Pa(f);c=y[d+156>>2];y[d+24>>2]=y[d+152>>2];y[d+28>>2]=c;c=y[d+148>>2];y[d+16>>2]=y[d+144>>2];y[d+20>>2]=c;c=y[d+140>>2];y[d+8>>2]=y[d+136>>2];y[d+12>>2]=c;c=y[d+132>>2];y[d>>2]=y[d+128>>2];y[d+4>>2]=c;y[d+120>>2]=0;y[d+124>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+104>>2]=0;y[d+108>>2]=0;y[d+96>>2]=0;y[d+100>>2]=0;c=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[d+64>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+68>>2]=c;c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+72>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+76>>2]=c;c=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+80>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+84>>2]=c;c=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+88>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+92>>2]=c;y[d+56>>2]=0;y[d+60>>2]=0;y[d+48>>2]=0;y[d+52>>2]=0;y[d+40>>2]=0;y[d+44>>2]=0;y[d+32>>2]=0;y[d+36>>2]=0;De(e,d);b=y[d+124>>2];y[d+184>>2]=y[d+120>>2];y[d+188>>2]=b;b=y[d+116>>2];y[d+176>>2]=y[d+112>>2];y[d+180>>2]=b;b=y[d+108>>2];y[d+168>>2]=y[d+104>>2];y[d+172>>2]=b;b=y[d+100>>2];y[d+160>>2]=y[d+96>>2];y[d+164>>2]=b;b=y[d+92>>2];y[d+152>>2]=y[d+88>>2];y[d+156>>2]=b;b=y[d+84>>2];y[d+144>>2]=y[d+80>>2];y[d+148>>2]=b;b=y[d+76>>2];y[d+136>>2]=y[d+72>>2];y[d+140>>2]=b;b=y[d+68>>2];y[d+128>>2]=y[d+64>>2];y[d+132>>2]=b;Pa(f);c=y[d+156>>2];b=y[d+152>>2];w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;w[a+28|0]=c;w[a+29|0]=c>>>8;w[a+30|0]=c>>>16;w[a+31|0]=c>>>24;c=y[d+148>>2];b=y[d+144>>2];w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+20|0]=c;w[a+21|0]=c>>>8;w[a+22|0]=c>>>16;w[a+23|0]=c>>>24;c=y[d+140>>2];b=y[d+136>>2];w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;c=y[d+132>>2];b=y[d+128>>2];w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=c;w[a+5|0]=c>>>8;w[a+6|0]=c>>>16;w[a+7|0]=c>>>24;ja(f,64);T=d+192|0;}function ta(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{if(!a){break a}d=a-8|0;b=y[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&2)){break a}b=y[d>>2];d=d-b|0;if(d>>>0>2];if(b>>>0<=255){e=y[d+8>>2];if((e|0)!=(c|0)){break e}j=40692,k=y[10173]&Bi(-2,b>>>3|0),y[j>>2]=k;break b}h=y[d+24>>2];if((c|0)!=(d|0)){b=y[d+8>>2];y[b+12>>2]=c;y[c+8>>2]=b;break c}e=y[d+20>>2];if(e){b=d+20|0;}else {e=y[d+16>>2];if(!e){break d}b=d+16|0;}while(1){g=b;c=e;b=c+20|0;e=y[c+20>>2];if(e){continue}b=c+16|0;e=y[c+16>>2];if(e){continue}break}y[g>>2]=0;break c}b=y[f+4>>2];if((b&3)!=3){break b}y[10175]=a;y[f+4>>2]=b&-2;y[d+4>>2]=a|1;y[f>>2]=a;return}y[e+12>>2]=c;y[c+8>>2]=e;break b}c=0;}if(!h){break b}b=y[d+28>>2];e=b<<2;f:{if(y[e+40996>>2]==(d|0)){y[e+40996>>2]=c;if(c){break f}j=40696,k=y[10174]&Bi(-2,b),y[j>>2]=k;break b}g:{if(y[h+16>>2]==(d|0)){y[h+16>>2]=c;break g}y[h+20>>2]=c;}if(!c){break b}}y[c+24>>2]=h;b=y[d+16>>2];if(b){y[c+16>>2]=b;y[b+24>>2]=c;}b=y[d+20>>2];if(!b){break b}y[c+20>>2]=b;y[b+24>>2]=c;}if(d>>>0>=f>>>0){break a}b=y[f+4>>2];if(!(b&1)){break a}h:{i:{j:{k:{if(!(b&2)){if(y[10179]==(f|0)){y[10179]=d;a=y[10176]+a|0;y[10176]=a;y[d+4>>2]=a|1;if(y[10178]!=(d|0)){break a}y[10175]=0;y[10178]=0;return}i=y[10178];if((i|0)==(f|0)){y[10178]=d;a=y[10175]+a|0;y[10175]=a;y[d+4>>2]=a|1;y[a+d>>2]=a;return}a=(b&-8)+a|0;c=y[f+12>>2];if(b>>>0<=255){e=y[f+8>>2];if((e|0)==(c|0)){j=40692,k=y[10173]&Bi(-2,b>>>3|0),y[j>>2]=k;break i}y[e+12>>2]=c;y[c+8>>2]=e;break i}h=y[f+24>>2];if((c|0)!=(f|0)){b=y[f+8>>2];y[b+12>>2]=c;y[c+8>>2]=b;break j}e=y[f+20>>2];if(e){b=f+20|0;}else {e=y[f+16>>2];if(!e){break k}b=f+16|0;}while(1){g=b;c=e;b=c+20|0;e=y[c+20>>2];if(e){continue}b=c+16|0;e=y[c+16>>2];if(e){continue}break}y[g>>2]=0;break j}y[f+4>>2]=b&-2;y[d+4>>2]=a|1;y[a+d>>2]=a;break h}c=0;}if(!h){break i}b=y[f+28>>2];e=b<<2;l:{if(y[e+40996>>2]==(f|0)){y[e+40996>>2]=c;if(c){break l}j=40696,k=y[10174]&Bi(-2,b),y[j>>2]=k;break i}m:{if(y[h+16>>2]==(f|0)){y[h+16>>2]=c;break m}y[h+20>>2]=c;}if(!c){break i}}y[c+24>>2]=h;b=y[f+16>>2];if(b){y[c+16>>2]=b;y[b+24>>2]=c;}b=y[f+20>>2];if(!b){break i}y[c+20>>2]=b;y[b+24>>2]=c;}y[d+4>>2]=a|1;y[a+d>>2]=a;if((d|0)!=(i|0)){break h}y[10175]=a;return}if(a>>>0<=255){b=(a&248)+40732|0;e=y[10173];a=1<<(a>>>3);n:{if(!(e&a)){y[10173]=a|e;a=b;break n}a=y[b+8>>2];}y[b+8>>2]=d;y[a+12>>2]=d;y[d+12>>2]=b;y[d+8>>2]=a;return}c=31;if(a>>>0<=16777215){b=H(a>>>8|0);c=(a>>>38-b&1|b<<1)^62;}y[d+28>>2]=c;y[d+16>>2]=0;y[d+20>>2]=0;b=(c<<2)+40996|0;o:{p:{e=y[10174];g=1<>2]=d;c=24;break q}c=a<<((c|0)!=31?25-(c>>>1|0)|0:0);b=y[b>>2];while(1){e=b;if((y[b+4>>2]&-8)==(a|0)){break p}b=c>>>29|0;c=c<<1;g=(b&4)+e|0;b=y[g+16>>2];if(b){continue}break}y[g+16>>2]=d;b=e;c=24;}e=d;g=d;a=8;break o}b=y[e+8>>2];y[b+12>>2]=d;y[e+8>>2]=d;c=8;g=0;a=24;}y[c+d>>2]=b;y[d+12>>2]=e;y[a+d>>2]=g;a=y[10181]-1|0;y[10181]=a?a:-1;}}function Ge(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0;d=T-224|0;T=d;j=y[c+16>>2];e=c- -64|0;k=y[e>>2];l=y[c+80>>2];m=y[c+32>>2];n=y[c+48>>2];f=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);o=y[c+20>>2];p=y[c+68>>2];q=y[c+84>>2];r=y[c+36>>2];s=y[c+52>>2];g=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);t=y[c+24>>2];u=y[c+72>>2];v=y[c+88>>2];x=y[c+40>>2];A=y[c+56>>2];h=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);i=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);b=i^(y[c+44>>2]&y[c+60>>2]^(y[c+28>>2]^(y[c+92>>2]^y[c+76>>2])));w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=x&A^(u^v^t)^g;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=r&s^(p^q^o)^f;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=m&n^(j^(k^l))^h;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;a=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=a;a=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=a;a=y[e+4>>2];y[d+176>>2]=y[e>>2];y[d+180>>2]=a;a=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=a;a=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=a;a=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=a;a=d+192|0;ia(a,d+176|0,d+160|0);b=y[d+204>>2];y[c+88>>2]=y[d+200>>2];y[c+92>>2]=b;b=y[d+196>>2];y[c+80>>2]=y[d+192>>2];y[c+84>>2]=b;b=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=b;b=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=b;b=y[e+4>>2];y[d+128>>2]=y[e>>2];y[d+132>>2]=b;b=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=b;ia(a,d+144|0,d+128|0);b=y[d+204>>2];y[c+72>>2]=y[d+200>>2];y[c+76>>2]=b;b=y[d+196>>2];y[e>>2]=y[d+192>>2];y[e+4>>2]=b;b=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=b;b=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=b;b=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=b;b=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=b;ia(a,d+112|0,d+96|0);b=y[d+204>>2];y[c+56>>2]=y[d+200>>2];y[c+60>>2]=b;b=y[d+196>>2];y[c+48>>2]=y[d+192>>2];y[c+52>>2]=b;b=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=b;b=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=b;b=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=b;b=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=b;ia(a,d+80|0,d- -64|0);b=y[d+204>>2];y[c+40>>2]=y[d+200>>2];y[c+44>>2]=b;b=y[d+196>>2];y[c+32>>2]=y[d+192>>2];y[c+36>>2]=b;b=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=b;b=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=b;b=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=b;b=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=b;ia(a,d+48|0,d+32|0);b=y[d+204>>2];y[c+24>>2]=y[d+200>>2];y[c+28>>2]=b;b=y[d+196>>2];y[c+16>>2]=y[d+192>>2];y[c+20>>2]=b;b=y[d+212>>2];y[d+16>>2]=y[d+208>>2];y[d+20>>2]=b;b=y[d+220>>2];y[d+24>>2]=y[d+216>>2];y[d+28>>2]=b;b=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=b;b=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=b;ia(a,d+16|0,d);a=y[d+192>>2];b=y[d+196>>2];e=y[d+200>>2];y[c+12>>2]=i^y[d+204>>2];y[c+8>>2]=e^g;y[c+4>>2]=b^f;y[c>>2]=a^h;T=d+224|0;}function Ee(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;d=T-224|0;T=d;g=y[c+16>>2];e=c- -64|0;f=y[e>>2];j=y[c+80>>2];k=y[c+32>>2];l=y[c+48>>2];h=y[c+20>>2];m=y[c+68>>2];n=y[c+84>>2];o=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);p=y[c+36>>2];q=y[c+52>>2];i=y[c+24>>2];r=y[c+72>>2];s=y[c+88>>2];t=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);u=y[c+40>>2];v=y[c+56>>2];x=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);b=y[c+44>>2]&y[c+60>>2]^(y[c+28>>2]^(y[c+76>>2]^(y[c+92>>2]^(z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24)))));w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;i=u&v^(i^(s^t^r));w[a+8|0]=i;w[a+9|0]=i>>>8;w[a+10|0]=i>>>16;w[a+11|0]=i>>>24;h=p&q^(h^(n^o^m));w[a+4|0]=h;w[a+5|0]=h>>>8;w[a+6|0]=h>>>16;w[a+7|0]=h>>>24;g=k&l^(g^(f^(j^x)));w[a|0]=g;w[a+1|0]=g>>>8;w[a+2|0]=g>>>16;w[a+3|0]=g>>>24;a=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=a;a=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=a;a=y[e+4>>2];y[d+176>>2]=y[e>>2];y[d+180>>2]=a;a=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=a;a=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=a;a=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=a;a=d+192|0;ia(a,d+176|0,d+160|0);f=y[d+204>>2];y[c+88>>2]=y[d+200>>2];y[c+92>>2]=f;f=y[d+196>>2];y[c+80>>2]=y[d+192>>2];y[c+84>>2]=f;f=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=f;f=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=f;f=y[e+4>>2];y[d+128>>2]=y[e>>2];y[d+132>>2]=f;f=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=f;ia(a,d+144|0,d+128|0);f=y[d+204>>2];y[c+72>>2]=y[d+200>>2];y[c+76>>2]=f;f=y[d+196>>2];y[e>>2]=y[d+192>>2];y[e+4>>2]=f;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+204>>2];y[c+56>>2]=y[d+200>>2];y[c+60>>2]=e;e=y[d+196>>2];y[c+48>>2]=y[d+192>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+204>>2];y[c+40>>2]=y[d+200>>2];y[c+44>>2]=e;e=y[d+196>>2];y[c+32>>2]=y[d+192>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+204>>2];y[c+24>>2]=y[d+200>>2];y[c+28>>2]=e;e=y[d+196>>2];y[c+16>>2]=y[d+192>>2];y[c+20>>2]=e;e=y[d+212>>2];y[d+16>>2]=y[d+208>>2];y[d+20>>2]=e;e=y[d+220>>2];y[d+24>>2]=y[d+216>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+192>>2];e=y[d+196>>2];f=y[d+200>>2];y[c+12>>2]=b^y[d+204>>2];y[c+8>>2]=f^i;y[c+4>>2]=e^h;y[c>>2]=a^g;T=d+224|0;}function bc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;a:{if(!d){x=1634760805;y=2036477234;A=857760878;B=1797285236;break a}y=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);A=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);x=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);B=z[d+12|0]|z[d+13|0]<<8|(z[d+14|0]<<16|z[d+15|0]<<24);}d=x;E=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);k=E;F=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);o=F;G=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);g=G;H=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);f=H;h=A;I=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);l=I;J=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);i=J;K=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);p=K;L=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);m=L;b=y;M=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);n=M;q=B;N=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);s=N;O=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);r=O;P=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);c=P;while(1){t=Bi(h+k|0,7)^m;C=Bi(t+h|0,9)^r;u=Bi(c+d|0,7)^f;D=Bi(u+d|0,9)^p;Q=Bi(D+u|0,13)^c;v=Bi(n+q|0,7)^g;i=Bi(v+q|0,9)^i;g=Bi(i+v|0,13)^n;f=Bi(i+g|0,18)^q;j=Bi(b+l|0,7)^s;c=Q^Bi(f+j|0,7);r=C^Bi(c+f|0,9);s=Bi(c+r|0,13)^j;q=Bi(r+s|0,18)^f;m=j;j=Bi(b+j|0,9)^o;f=Bi(m+j|0,13)^l;b=Bi(f+j|0,18)^b;n=Bi(b+t|0,7)^g;p=Bi(n+b|0,9)^D;m=Bi(n+p|0,13)^t;b=Bi(p+m|0,18)^b;g=Bi(t+C|0,13)^k;h=Bi(g+C|0,18)^h;l=Bi(h+u|0,7)^f;i=Bi(l+h|0,9)^i;f=Bi(i+l|0,13)^u;h=Bi(i+f|0,18)^h;d=Bi(D+Q|0,18)^d;k=Bi(d+v|0,7)^g;o=Bi(k+d|0,9)^j;g=Bi(k+o|0,13)^v;d=Bi(o+g|0,18)^d;R=R+2|0;if(R>>>0>>0){continue}break}e=q+B|0;w[a+60|0]=e;w[a+61|0]=e>>>8;w[a+62|0]=e>>>16;w[a+63|0]=e>>>24;e=s+N|0;w[a+56|0]=e;w[a+57|0]=e>>>8;w[a+58|0]=e>>>16;w[a+59|0]=e>>>24;e=r+O|0;w[a+52|0]=e;w[a+53|0]=e>>>8;w[a+54|0]=e>>>16;w[a+55|0]=e>>>24;c=c+P|0;w[a+48|0]=c;w[a+49|0]=c>>>8;w[a+50|0]=c>>>16;w[a+51|0]=c>>>24;c=n+M|0;w[a+44|0]=c;w[a+45|0]=c>>>8;w[a+46|0]=c>>>16;w[a+47|0]=c>>>24;b=b+y|0;w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;b=m+L|0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;b=p+K|0;w[a+32|0]=b;w[a+33|0]=b>>>8;w[a+34|0]=b>>>16;w[a+35|0]=b>>>24;b=i+J|0;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=l+I|0;w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=h+A|0;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=f+H|0;w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;b=g+G|0;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=o+F|0;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=k+E|0;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=d+x|0;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;}function qe(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0;if(b-65>>>0<4294967232|g>>>0>64){a=-1;}else {j=T;r=j;j=j-512&-64;T=j;a:{b:{if(!(!(d|e)|c)|(!a|(b-65&255)>>>0<=191)|(!(g?f:1)|g>>>0>=65)){break b}c:{if(g){if(!f){break b}d:{if(!h){m=725511199;n=-1694144372;l=-1377402159;h=1359893119;break d}m=(z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24))^725511199;n=(z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24))^-1694144372;l=(z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24))^-1377402159;h=(z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24))^1359893119;}e:{if(!i){k=327033209;p=1541459225;q=-79577749;i=528734635;break e}k=(z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24))^327033209;p=(z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24))^1541459225;q=(z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24))^-79577749;i=(z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24))^528734635;}o(j- -64|0,0,293);y[j+56>>2]=k;y[j+60>>2]=p;y[j+48>>2]=q;y[j+52>>2]=i;y[j+40>>2]=m;y[j+44>>2]=n;y[j+32>>2]=l;y[j+36>>2]=h;y[j+24>>2]=1595750129;y[j+28>>2]=-1521486534;y[j+16>>2]=-23791573;y[j+20>>2]=1013904242;y[j+8>>2]=-2067093701;y[j+12>>2]=-1150833019;y[j>>2]=(g<<8|b)^-222443256;y[j+4>>2]=g>>>24^1779033703;h=128;i=128-g|0;if(i){o((j+384|0)+g|0,0,i);}if(g){t(j+384|0,f,g);}f=j+384|0;t(j+96|0,f,128);y[j+352>>2]=128;ja(f,128);break c}f:{if(!h){m=725511199;n=-1694144372;g=1359893119;f=-1377402159;break f}m=(z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24))^725511199;n=(z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24))^-1694144372;g=(z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24))^1359893119;f=(z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24))^-1377402159;}g:{if(!i){k=327033209;p=1541459225;l=-79577749;i=528734635;break g}k=(z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24))^327033209;p=(z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24))^1541459225;l=(z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24))^-79577749;i=(z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24))^528734635;}h=0;o(j- -64|0,0,293);y[j+56>>2]=k;y[j+60>>2]=p;y[j+48>>2]=l;y[j+52>>2]=i;y[j+40>>2]=m;y[j+44>>2]=n;y[j+32>>2]=f;y[j+36>>2]=g;y[j+24>>2]=1595750129;y[j+28>>2]=-1521486534;y[j+16>>2]=-23791573;y[j+20>>2]=1013904242;y[j+8>>2]=-2067093701;y[j+12>>2]=-1150833019;y[j>>2]=b^-222443256;y[j+4>>2]=1779033703;}if(d|e){l=j+96|0;f=256-h|0;m=f;if(!e&d>>>0>f>>>0|e){n=j+224|0;while(1){if(f){t(h+l|0,c,f);}y[j+352>>2]=y[j+352>>2]+f;g=y[j+68>>2];i=g;h=y[j+64>>2];k=h+128|0;g=k>>>0<128?i+1|0:i;y[j+64>>2]=k;y[j+68>>2]=g;g=y[j+76>>2];h=(i|0)==-1&h>>>0>4294967167;i=h;h=h+y[j+72>>2]|0;g=i>>>0>h>>>0?g+1|0:g;y[j+72>>2]=h;y[j+76>>2]=g;Eb(j,l);t(l,n,128);k=y[j+352>>2];h=k-128|0;y[j+352>>2]=h;c=c+f|0;g=m;i=d-g|0;f=384-k|0;m=f;e=e-(d>>>0>>0)|0;d=i;if(!e&i>>>0>f>>>0|e){continue}break}}if(d){t(h+l|0,c,d);}y[j+352>>2]=d+y[j+352>>2];}Cc(j,a,b);T=r;break a}na();s();}a=0;}return a}function Lc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=a+b|0;c=y[a+4>>2];a:{b:{if(c&1){break b}if(!(c&2)){break a}c=y[a>>2];b=c+b|0;c:{d:{e:{a=a-c|0;if((a|0)!=y[10178]){d=y[a+12>>2];if(c>>>0<=255){e=y[a+8>>2];if((e|0)!=(d|0)){break e}j=40692,k=y[10173]&Bi(-2,c>>>3|0),y[j>>2]=k;break b}g=y[a+24>>2];if((a|0)!=(d|0)){c=y[a+8>>2];y[c+12>>2]=d;y[d+8>>2]=c;break c}e=y[a+20>>2];if(e){c=a+20|0;}else {e=y[a+16>>2];if(!e){break d}c=a+16|0;}while(1){h=c;d=e;c=d+20|0;e=y[d+20>>2];if(e){continue}c=d+16|0;e=y[d+16>>2];if(e){continue}break}y[h>>2]=0;break c}c=y[f+4>>2];if((c&3)!=3){break b}y[10175]=b;y[f+4>>2]=c&-2;y[a+4>>2]=b|1;y[f>>2]=b;return}y[e+12>>2]=d;y[d+8>>2]=e;break b}d=0;}if(!g){break b}c=y[a+28>>2];e=c<<2;f:{if(y[e+40996>>2]==(a|0)){y[e+40996>>2]=d;if(d){break f}j=40696,k=y[10174]&Bi(-2,c),y[j>>2]=k;break b}g:{if(y[g+16>>2]==(a|0)){y[g+16>>2]=d;break g}y[g+20>>2]=d;}if(!d){break b}}y[d+24>>2]=g;c=y[a+16>>2];if(c){y[d+16>>2]=c;y[c+24>>2]=d;}c=y[a+20>>2];if(!c){break b}y[d+20>>2]=c;y[c+24>>2]=d;}h:{i:{j:{k:{c=y[f+4>>2];if(!(c&2)){if(y[10179]==(f|0)){y[10179]=a;b=y[10176]+b|0;y[10176]=b;y[a+4>>2]=b|1;if(y[10178]!=(a|0)){break a}y[10175]=0;y[10178]=0;return}i=y[10178];if((i|0)==(f|0)){y[10178]=a;b=y[10175]+b|0;y[10175]=b;y[a+4>>2]=b|1;y[a+b>>2]=b;return}b=(c&-8)+b|0;d=y[f+12>>2];if(c>>>0<=255){e=y[f+8>>2];if((e|0)==(d|0)){j=40692,k=y[10173]&Bi(-2,c>>>3|0),y[j>>2]=k;break i}y[e+12>>2]=d;y[d+8>>2]=e;break i}g=y[f+24>>2];if((d|0)!=(f|0)){c=y[f+8>>2];y[c+12>>2]=d;y[d+8>>2]=c;break j}e=y[f+20>>2];if(e){c=f+20|0;}else {e=y[f+16>>2];if(!e){break k}c=f+16|0;}while(1){h=c;d=e;c=d+20|0;e=y[d+20>>2];if(e){continue}c=d+16|0;e=y[d+16>>2];if(e){continue}break}y[h>>2]=0;break j}y[f+4>>2]=c&-2;y[a+4>>2]=b|1;y[a+b>>2]=b;break h}d=0;}if(!g){break i}c=y[f+28>>2];e=c<<2;l:{if(y[e+40996>>2]==(f|0)){y[e+40996>>2]=d;if(d){break l}j=40696,k=y[10174]&Bi(-2,c),y[j>>2]=k;break i}m:{if(y[g+16>>2]==(f|0)){y[g+16>>2]=d;break m}y[g+20>>2]=d;}if(!d){break i}}y[d+24>>2]=g;c=y[f+16>>2];if(c){y[d+16>>2]=c;y[c+24>>2]=d;}c=y[f+20>>2];if(!c){break i}y[d+20>>2]=c;y[c+24>>2]=d;}y[a+4>>2]=b|1;y[a+b>>2]=b;if((a|0)!=(i|0)){break h}y[10175]=b;return}if(b>>>0<=255){c=(b&248)+40732|0;d=y[10173];b=1<<(b>>>3);n:{if(!(d&b)){y[10173]=b|d;b=c;break n}b=y[c+8>>2];}y[c+8>>2]=a;y[b+12>>2]=a;y[a+12>>2]=c;y[a+8>>2]=b;return}d=31;if(b>>>0<=16777215){c=H(b>>>8|0);d=(b>>>38-c&1|c<<1)^62;}y[a+28>>2]=d;y[a+16>>2]=0;y[a+20>>2]=0;c=(d<<2)+40996|0;o:{e=y[10174];h=1<>2]=a;y[a+24>>2]=c;break p}d=b<<((d|0)!=31?25-(d>>>1|0)|0:0);c=y[c>>2];while(1){e=c;if((y[c+4>>2]&-8)==(b|0)){break o}c=d>>>29|0;d=d<<1;h=e+(c&4)|0;c=y[h+16>>2];if(c){continue}break}y[h+16>>2]=a;y[a+24>>2]=e;}y[a+12>>2]=a;y[a+8>>2]=a;return}b=y[e+8>>2];y[b+12>>2]=a;y[e+8>>2]=a;y[a+24>>2]=0;y[a+12>>2]=e;y[a+8>>2]=b;}}function Bf(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=T-400|0;T=k;if(c){y[c>>2]=0;y[c+4>>2]=0;}if(d){w[d|0]=255;}p=i;i=j;j=-1;m=f;a:{b:{l=m>>>0<17;f=g;c:{if(l&!g){break c}l=g-l|0;q=l;g=m-17|0;if(!l&g>>>0>=4294967279|l){break b}n=k+32|0;o=a+32|0;_a(n,64,0,o,a);l=k+96|0;Ga(l,n);ja(n,64);la(l,h,p,i);la(l,39312,0-p&15,0);y[k+88>>2]=0;y[k+92>>2]=0;y[k+80>>2]=0;y[k+84>>2]=0;y[k+72>>2]=0;y[k+76>>2]=0;y[k+64>>2]=0;y[k+68>>2]=0;y[k+56>>2]=0;y[k+60>>2]=0;y[k+48>>2]=0;y[k+52>>2]=0;y[k+40>>2]=0;y[k+44>>2]=0;y[k+32>>2]=0;y[k+36>>2]=0;w[k+32|0]=z[e|0];gb(n,n,64,0,o,1,a);h=z[k+32|0];w[k+32|0]=z[e|0];la(l,n,64,0);e=e+1|0;la(l,e,g,q);la(l,39312,m-1&15,0);y[k+24>>2]=p;y[k+28>>2]=i;i=k+24|0;la(l,i,8,0);m=m+47|0;f=m>>>0<47?f+1|0:f;y[k+24>>2]=m;y[k+28>>2]=f;la(l,i,8,0);Fa(l,k);ja(l,256);if($a(k,e+g|0,16)){ja(k,16);break c}gb(b,e,g,q,o,2,a);w[a+36|0]=z[a+36|0]^z[k|0];w[a+37|0]=z[a+37|0]^z[k+1|0];w[a+38|0]=z[a+38|0]^z[k+2|0];w[a+39|0]=z[a+39|0]^z[k+3|0];w[a+40|0]=z[a+40|0]^z[k+4|0];w[a+41|0]=z[a+41|0]^z[k+5|0];w[a+42|0]=z[a+42|0]^z[k+6|0];w[a+43|0]=z[a+43|0]^z[k+7|0];Ke(o);d:{if(!(h&2)){if(!ya(o,4)){break d}}b=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[k+376>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[k+380>>2]=b;b=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[k+368>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[k+372>>2]=b;b=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[k+360>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[k+364>>2]=b;b=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[k+352>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[k+356>>2]=b;b=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[k+384>>2]=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[k+388>>2]=b;b=k+352|0;Yb(b,b,40,0,o,a);b=y[k+380>>2];e=y[k+376>>2];w[a+24|0]=e;w[a+25|0]=e>>>8;w[a+26|0]=e>>>16;w[a+27|0]=e>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[k+372>>2];e=y[k+368>>2];w[a+16|0]=e;w[a+17|0]=e>>>8;w[a+18|0]=e>>>16;w[a+19|0]=e>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[k+364>>2];e=y[k+360>>2];w[a+8|0]=e;w[a+9|0]=e>>>8;w[a+10|0]=e>>>16;w[a+11|0]=e>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[k+356>>2];e=y[k+352>>2];w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=y[k+384>>2];e=y[k+388>>2];w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+40|0]=e;w[a+41|0]=e>>>8;w[a+42|0]=e>>>16;w[a+43|0]=e>>>24;}if(c){y[c>>2]=g;y[c+4>>2]=q;}j=0;if(!d){break c}w[d|0]=h;}T=k+400|0;break a}na();s();}return j|0}function ne(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0;h=T+-64|0;T=h;l=Da(32);a:{if(!l){a=-22;break a}y[h+28>>2]=0;y[h+32>>2]=0;y[h+24>>2]=16;y[h+20>>2]=e;y[h+16>>2]=d;y[h+12>>2]=c;y[h+8>>2]=32;y[h+4>>2]=l;y[h+36>>2]=0;y[h+40>>2]=0;y[h+60>>2]=0;y[h+56>>2]=1;y[h+52>>2]=1;y[h+48>>2]=b;y[h+44>>2]=a;a=Sb(h+4|0,g);b:{if(a){ja(l,32);break b}c:{if(!f){break c}i=h+4|0;e=T-32|0;T=e;a=-31;d:{e:{f:{switch(g-1|0){case 1:a=z[1439]|z[1440]<<8|(z[1441]<<16|z[1442]<<24);b=z[1435]|z[1436]<<8|(z[1437]<<16|z[1438]<<24);w[f+5|0]=b;w[f+6|0]=b>>>8;w[f+7|0]=b>>>16;w[f+8|0]=b>>>24;w[f+9|0]=a;w[f+10|0]=a>>>8;w[f+11|0]=a>>>16;w[f+12|0]=a>>>24;a=z[1434]|z[1435]<<8|(z[1436]<<16|z[1437]<<24);b=z[1430]|z[1431]<<8|(z[1432]<<16|z[1433]<<24);w[f|0]=b;w[f+1|0]=b>>>8;w[f+2|0]=b>>>16;w[f+3|0]=b>>>24;w[f+4|0]=a;w[f+5|0]=a>>>8;w[f+6|0]=a>>>16;w[f+7|0]=a>>>24;c=-12;b=12;break e;case 0:break f;default:break d}}a=z[1426]|z[1427]<<8|(z[1428]<<16|z[1429]<<24);w[f+8|0]=a;w[f+9|0]=a>>>8;w[f+10|0]=a>>>16;w[f+11|0]=a>>>24;a=z[1422]|z[1423]<<8|(z[1424]<<16|z[1425]<<24);b=z[1418]|z[1419]<<8|(z[1420]<<16|z[1421]<<24);w[f|0]=b;w[f+1|0]=b>>>8;w[f+2|0]=b>>>16;w[f+3|0]=b>>>24;w[f+4|0]=a;w[f+5|0]=a>>>8;w[f+6|0]=a>>>16;w[f+7|0]=a>>>24;c=-11;b=11;}a=nc(i);if(a){break d}w[e+13|0]=0;w[e+11|0]=49;w[e+12|0]=57;g:{c=c+128|0;d=e+11|0;a=Ha(d);if(c>>>0<=a>>>0){break g}b=b+f|0;g=a+1|0;if(g){t(b,d,g);}j=c-a|0;if(j>>>0<4){break g}g=a+b|0;w[g|0]=36;w[g+1|0]=109;w[g+2|0]=61;w[g+3|0]=0;a=y[i+44>>2];b=10;while(1){h:{c=b;b=b-1|0;k=b+(e+22|0)|0;d=(a>>>0)/10|0;w[k|0]=a-E(d,10)|48;if(a>>>0<10){break h}a=d;if(b){continue}}break}a=11-c|0;if(a){t(e+11|0,k,a);}b=e+11|0;w[b+a|0]=0;d=j-3|0;a=Ha(b);if(d>>>0<=a>>>0){break g}c=g+3|0;g=a+1|0;if(g){t(c,b,g);}j=d-a|0;if(j>>>0<4){break g}g=a+c|0;w[g|0]=44;w[g+1|0]=116;w[g+2|0]=61;w[g+3|0]=0;a=y[i+40>>2];b=10;while(1){i:{c=b;b=b-1|0;k=b+(e+22|0)|0;d=(a>>>0)/10|0;w[k|0]=a-E(d,10)|48;if(a>>>0<10){break i}a=d;if(b){continue}}break}a=11-c|0;if(a){t(e+11|0,k,a);}b=e+11|0;w[b+a|0]=0;d=j-3|0;a=Ha(b);if(d>>>0<=a>>>0){break g}c=g+3|0;g=a+1|0;if(g){t(c,b,g);}j=d-a|0;if(j>>>0<4){break g}g=a+c|0;w[g|0]=44;w[g+1|0]=112;w[g+2|0]=61;w[g+3|0]=0;a=y[i+48>>2];b=10;while(1){j:{c=b;b=b-1|0;k=b+(e+22|0)|0;d=(a>>>0)/10|0;w[k|0]=a-E(d,10)|48;if(a>>>0<10){break j}a=d;if(b){continue}}break}a=11-c|0;if(a){t(e+11|0,k,a);}b=e+11|0;w[b+a|0]=0;d=j-3|0;a=Ha(b);if(d>>>0<=a>>>0){break g}c=g+3|0;g=a+1|0;if(g){t(c,b,g);}d=d-a|0;if(d>>>0<2){break g}a=a+c|0;w[a|0]=36;w[a+1|0]=0;b=a+1|0;c=d-1|0;if(!Bc(b,c,y[i+16>>2],y[i+20>>2],3)){break g}a=-31;d=c;c=Ha(b);d=d-c|0;if(d>>>0<2){break d}a=b+c|0;w[a|0]=36;w[a+1|0]=0;a=Bc(a+1|0,d-1|0,y[i>>2],y[i+4>>2],3)?0:-31;break d}a=-31;}T=e+32|0;if(!a){break c}ja(l,32);ja(f,128);a=-31;break b}ja(l,32);a=0;}ta(l);}T=h- -64|0;return a}function ib(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0;c=T-512|0;T=c;d=-1;f=z[b+31|0];e=z[b|0];if(!((((((f^-1)&127|z[b+1|0]&(z[b+2|0]&(z[b+3|0]&(z[b+4|0]&(z[b+5|0]&(z[b+6|0]&(z[b+7|0]&(z[b+8|0]&(z[b+9|0]&(z[b+10|0]&(z[b+11|0]&(z[b+12|0]&(z[b+13|0]&(z[b+14|0]&(z[b+15|0]&(z[b+16|0]&(z[b+17|0]&(z[b+18|0]&(z[b+19|0]&(z[b+20|0]&(z[b+21|0]&(z[b+22|0]&(z[b+23|0]&(z[b+24|0]&(z[b+25|0]&(z[b+26|0]&(z[b+27|0]&(z[b+28|0]&(z[b+29|0]&z[b+30|0]))))))))))))))))))))))))))))^-1)&255)-1&236-e)>>>8|(e|z[41218]>>>2^f>>>7))&1)){f=c+336|0;cb(f,b);fa(c+288|0,f);b=y[c+324>>2];y[c+276>>2]=0-b;d=y[c+320>>2];y[c+272>>2]=0-d;e=y[c+316>>2];y[c+268>>2]=0-e;g=y[c+312>>2];y[c+264>>2]=0-g;h=y[c+308>>2];y[c+260>>2]=0-h;i=y[c+304>>2];y[c+256>>2]=0-i;j=y[c+300>>2];y[c+252>>2]=0-j;k=y[c+296>>2];y[c+248>>2]=0-k;l=y[c+292>>2];y[c+244>>2]=0-l;m=y[c+288>>2];y[c+240>>2]=1-m;n=c+144|0;q=c+240|0;fa(n,q);y[c+228>>2]=b;y[c+224>>2]=d;y[c+220>>2]=e;y[c+216>>2]=g;y[c+212>>2]=h;y[c+208>>2]=i;y[c+204>>2]=j;y[c+200>>2]=k;y[c+196>>2]=l;y[c+192>>2]=m+1;d=c+96|0;g=c+192|0;fa(d,g);b=c+48|0;ga(b,1584,n);e=y[c+96>>2];h=y[c+48>>2];i=y[c+100>>2];j=y[c+52>>2];k=y[c+104>>2];l=y[c+56>>2];m=y[c+108>>2];n=y[c+60>>2];o=y[c+112>>2];p=y[c+64>>2];r=y[c+116>>2];s=y[c+68>>2];t=y[c+120>>2];u=y[c+72>>2];v=y[c+124>>2];x=y[c+76>>2];A=y[c+128>>2];B=y[c+80>>2];y[c+84>>2]=0-(y[c+84>>2]+y[c+132>>2]|0);y[c+80>>2]=0-(A+B|0);y[c+76>>2]=0-(v+x|0);y[c+72>>2]=0-(t+u|0);y[c+68>>2]=0-(r+s|0);y[c+64>>2]=0-(o+p|0);y[c+60>>2]=0-(m+n|0);y[c+56>>2]=0-(k+l|0);y[c+52>>2]=0-(i+j|0);y[c+48>>2]=0-(e+h|0);ga(c,b,d);y[c+388>>2]=0;y[c+392>>2]=0;y[c+384>>2]=1;y[c+396>>2]=0;y[c+400>>2]=0;y[c+404>>2]=0;y[c+408>>2]=0;y[c+412>>2]=0;y[c+416>>2]=0;y[c+420>>2]=0;e=c+432|0;p=cc(e,c+384|0,c);ga(a,e,g);d=a+40|0;ga(d,e,a);ga(d,d,b);ga(a,a,f);f=y[a+36>>2]<<1;y[a+36>>2]=f;e=y[a+32>>2]<<1;y[a+32>>2]=e;g=y[a+28>>2]<<1;y[a+28>>2]=g;h=y[a+24>>2]<<1;y[a+24>>2]=h;i=y[a+20>>2]<<1;y[a+20>>2]=i;j=y[a+16>>2]<<1;y[a+16>>2]=j;k=y[a+12>>2]<<1;y[a+12>>2]=k;l=y[a+8>>2]<<1;y[a+8>>2]=l;m=y[a+4>>2]<<1;y[a+4>>2]=m;n=y[a>>2]<<1;y[a>>2]=n;o=c+480|0;pa(o,a);b=0-(w[c+480|0]&1)|0;y[a+36>>2]=f^b&(f^0-f);y[a+32>>2]=e^b&(e^0-e);y[a+28>>2]=g^b&(g^0-g);y[a+24>>2]=h^b&(h^0-h);y[a+20>>2]=i^b&(i^0-i);y[a+16>>2]=j^b&(j^0-j);y[a+12>>2]=k^b&(k^0-k);y[a+8>>2]=l^b&(l^0-l);y[a+4>>2]=m^b&(m^0-m);y[a>>2]=n^b&(n^0-n);ga(d,q,d);y[a+84>>2]=0;y[a+88>>2]=0;y[a+80>>2]=1;y[a+92>>2]=0;y[a+96>>2]=0;y[a+100>>2]=0;y[a+104>>2]=0;y[a+108>>2]=0;y[a+112>>2]=0;y[a+116>>2]=0;b=a+120|0;ga(b,a,d);pa(o,b);a=z[c+480|0];pa(o,d);d=0-(ya(o,32)|(1-p|a&1))|0;}T=c+512|0;return d}function Cf(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=T-384|0;T=k;if(c){y[c>>2]=0;y[c+4>>2]=0;}a:{m=0|e;if(!f&m>>>0<4294967279){n=k+16|0;e=a+32|0;_a(n,64,0,e,a);l=k+80|0;Ga(l,n);ja(n,64);o=g;g=h|p;la(l,o,g,i);la(l,39312,0-g&15,0);y[k+16>>2]=0;y[k+20>>2]=0;y[k+72>>2]=0;y[k+76>>2]=0;y[k+64>>2]=0;y[k+68>>2]=0;y[k+56>>2]=0;y[k+60>>2]=0;y[k+48>>2]=0;y[k+52>>2]=0;y[k+40>>2]=0;y[k+44>>2]=0;y[k+32>>2]=0;y[k+36>>2]=0;y[k+24>>2]=0;y[k+28>>2]=0;w[k+16|0]=j;gb(n,n,64,0,e,1,a);la(l,n,64,0);w[b|0]=z[k+16|0];b=b+1|0;gb(b,d,m,f,e,2,a);la(l,b,m,f);la(l,39312,m&15,0);y[k+8>>2]=g;y[k+12>>2]=i;d=k+8|0;la(l,d,8,0);y[k+8>>2]=m- -64;y[k+12>>2]=f-((m>>>0<4294967232)-1|0);la(l,d,8,0);b=b+m|0;Fa(l,b);ja(l,256);w[a+36|0]=z[a+36|0]^z[b|0];w[a+37|0]=z[a+37|0]^z[b+1|0];w[a+38|0]=z[a+38|0]^z[b+2|0];w[a+39|0]=z[a+39|0]^z[b+3|0];w[a+40|0]=z[a+40|0]^z[b+4|0];w[a+41|0]=z[a+41|0]^z[b+5|0];w[a+42|0]=z[a+42|0]^z[b+6|0];w[a+43|0]=z[a+43|0]^z[b+7|0];Ke(e);b:{if(!(j&2)){if(!ya(e,4)){break b}}b=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[k+360>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[k+364>>2]=b;b=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[k+352>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[k+356>>2]=b;b=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[k+344>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[k+348>>2]=b;b=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[k+336>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[k+340>>2]=b;b=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[k+368>>2]=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[k+372>>2]=b;b=k+336|0;Yb(b,b,40,0,e,a);b=y[k+364>>2];d=y[k+360>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[k+356>>2];d=y[k+352>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[k+348>>2];d=y[k+344>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[k+340>>2];d=y[k+336>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=y[k+368>>2];d=y[k+372>>2];w[e|0]=1;w[e+1|0]=0;w[e+2|0]=0;w[e+3|0]=0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+40|0]=d;w[a+41|0]=d>>>8;w[a+42|0]=d>>>16;w[a+43|0]=d>>>24;}if(c){a=m+17|0;f=a>>>0<17?f+1|0:f;y[c>>2]=a;y[c+4>>2]=f;}T=k+384|0;break a}na();s();}return 0}function sc(a,b,c,d){var e=0,f=0,g=0;e=T;g=e;e=e-576&-64;T=e;y[e+188>>2]=b;a:{if(b>>>0<=64){f=e+192|0;if((Ja(f,0,0,b)|0)<0){break a}if((oa(f,e+188|0,4,0)|0)<0);if((oa(f,c,d,0)|0)<0);Ia(f,a,b);break a}f=e+192|0;if((Ja(f,0,0,64)|0)<0){break a}if((oa(f,e+188|0,4,0)|0)<0);if((oa(f,c,d,0)|0)<0);if((Ia(f,e+112|0,64)|0)<0){break a}c=y[e+140>>2];d=y[e+136>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=c;w[a+29|0]=c>>>8;w[a+30|0]=c>>>16;w[a+31|0]=c>>>24;c=y[e+132>>2];d=y[e+128>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=c;w[a+21|0]=c>>>8;w[a+22|0]=c>>>16;w[a+23|0]=c>>>24;c=y[e+124>>2];d=y[e+120>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;c=y[e+116>>2];d=y[e+112>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=c;w[a+5|0]=c>>>8;w[a+6|0]=c>>>16;w[a+7|0]=c>>>24;a=a+32|0;b=b-32|0;if(b>>>0>=65){while(1){c=y[e+172>>2];y[e+104>>2]=y[e+168>>2];y[e+108>>2]=c;c=y[e+164>>2];y[e+96>>2]=y[e+160>>2];y[e+100>>2]=c;c=y[e+156>>2];y[e+88>>2]=y[e+152>>2];y[e+92>>2]=c;c=y[e+148>>2];y[e+80>>2]=y[e+144>>2];y[e+84>>2]=c;c=y[e+140>>2];y[e+72>>2]=y[e+136>>2];y[e+76>>2]=c;c=y[e+132>>2];y[e+64>>2]=y[e+128>>2];y[e+68>>2]=c;c=y[e+124>>2];y[e+56>>2]=y[e+120>>2];y[e+60>>2]=c;c=y[e+116>>2];y[e+48>>2]=y[e+112>>2];y[e+52>>2]=c;if((Wb(e+112|0,64,e+48|0,64,0,0,0)|0)<0){break a}c=y[e+140>>2];d=y[e+136>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=c;w[a+29|0]=c>>>8;w[a+30|0]=c>>>16;w[a+31|0]=c>>>24;c=y[e+132>>2];d=y[e+128>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=c;w[a+21|0]=c>>>8;w[a+22|0]=c>>>16;w[a+23|0]=c>>>24;c=y[e+124>>2];d=y[e+120>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;c=y[e+116>>2];d=y[e+112>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=c;w[a+5|0]=c>>>8;w[a+6|0]=c>>>16;w[a+7|0]=c>>>24;a=a+32|0;b=b-32|0;if(b>>>0>64){continue}break}}c=y[e+172>>2];y[e+104>>2]=y[e+168>>2];y[e+108>>2]=c;c=y[e+164>>2];y[e+96>>2]=y[e+160>>2];y[e+100>>2]=c;c=y[e+156>>2];y[e+88>>2]=y[e+152>>2];y[e+92>>2]=c;c=y[e+148>>2];y[e+80>>2]=y[e+144>>2];y[e+84>>2]=c;c=y[e+140>>2];y[e+72>>2]=y[e+136>>2];y[e+76>>2]=c;c=y[e+132>>2];y[e+64>>2]=y[e+128>>2];y[e+68>>2]=c;c=y[e+124>>2];y[e+56>>2]=y[e+120>>2];y[e+60>>2]=c;c=y[e+116>>2];y[e+48>>2]=y[e+112>>2];y[e+52>>2]=c;c=e+112|0;if(!b|(Wb(c,b,e+48|0,64,0,0,0)|0)<0){break a}t(a,c,b);}ja(e+192|0,384);T=g;}function Id(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,u=0,v=0,x=0,A=0,C=0,D=0,F=0,G=0,H=0;m=Ai(i,0,h,0);p=W;if(!p&m>>>0>=1073741824|p){y[10172]=22;return -1}if((g|0)==1|g>>>0>1){y[10172]=22;return -1}m=f;o=g;while(1){if(m|o){p=m;m=m&m-1;o=o-!p&o;r=r+1|0;q=r?q:q+1|0;continue}break}W=q;if(!(!W&r>>>0<2&(!g&f>>>0>=2|(g|0)!=0))){y[10172]=28;return -1}if(!(i?h:0)){y[10172]=28;return -1}a:{b:{if(!(33554431/(i>>>0)>>>0>>0|h>>>0>16777215)){if(!g&33554431/(h>>>0)>>>0>=f>>>0){break b}}break a}r=h<<7;x=E(r,i);v=E(f,r);m=v+x|0;if(x>>>0>m>>>0){break a}q=h<<8;m=(q+m|0)- -64|0;if(m>>>0<=q>>>0){break a}c:{if(m>>>0>B[a+8>>2]){u=-1;if(Ob(a));p=T-16|0;T=p;o=Pc(p+12|0,m);y[10172]=o;o=o?0:y[p+12>>2];y[a+4>>2]=o;y[a>>2]=o;y[a+8>>2]=o?m:0;T=p+16|0;if(!o){break c}}A=y[a+4>>2];Jd(b,c,d,e,A,x);u=x+A|0;m=u+v|0;p=m+(h<<7)|0;G=(p+r|0)+-64|0;F=f-1|0;o=h<<5;v=m+q|0;H=(m+r|0)+-64|0;while(1){q=E(r,D)+A|0;d=0;while(1){a=d<<2;e=a+q|0;y[a+m>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=a|4;l=e+m|0;e=e+q|0;y[l>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=a|8;l=e+m|0;e=e+q|0;y[l>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);a=a|12;e=a+m|0;a=a+q|0;y[e>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);d=d+4|0;if((o|0)!=(d|0)){continue}break}a=0;d=0;while(1){e=!r;if(!e){t(u+(E(a,o)<<2)|0,m,r);}Nb(m,p,v,h);if(!e){t(u+(E(o,a|1)<<2)|0,p,r);}Nb(p,m,v,h);C=0;e=0;a=a+2|0;d=a>>>0<2?d+1|0:d;if((g|0)==(d|0)&a>>>0>>0|d>>>0>>0){continue}break}while(1){a=u+(E(o,F&y[H>>2])<<2)|0;d=0;while(1){l=d<<2;n=l+m|0;y[n>>2]=y[n>>2]^y[a+l>>2];n=l|4;s=n+m|0;y[s>>2]=y[s>>2]^y[a+n>>2];n=l|8;s=n+m|0;y[s>>2]=y[s>>2]^y[a+n>>2];l=l|12;n=l+m|0;y[n>>2]=y[n>>2]^y[a+l>>2];d=d+4|0;if((o|0)!=(d|0)){continue}break}Nb(m,p,v,h);a=u+(E(o,F&y[G>>2])<<2)|0;d=0;while(1){l=d<<2;n=l+p|0;y[n>>2]=y[n>>2]^y[a+l>>2];n=l|4;s=n+p|0;y[s>>2]=y[s>>2]^y[a+n>>2];n=l|8;s=n+p|0;y[s>>2]=y[s>>2]^y[a+n>>2];l=l|12;n=l+p|0;y[n>>2]=y[n>>2]^y[a+l>>2];d=d+4|0;if((o|0)!=(d|0)){continue}break}Nb(p,m,v,h);d=0;C=C+2|0;a=C>>>0<2?e+1|0:e;e=a;if((g|0)==(a|0)&f>>>0>C>>>0|a>>>0>>0){continue}break}while(1){a=d<<2;e=a+q|0;l=y[a+m>>2];w[e|0]=l;w[e+1|0]=l>>>8;w[e+2|0]=l>>>16;w[e+3|0]=l>>>24;l=a|4;e=l+q|0;l=y[m+l>>2];w[e|0]=l;w[e+1|0]=l>>>8;w[e+2|0]=l>>>16;w[e+3|0]=l>>>24;l=a|8;e=l+q|0;l=y[m+l>>2];w[e|0]=l;w[e+1|0]=l>>>8;w[e+2|0]=l>>>16;w[e+3|0]=l>>>24;e=a|12;a=e+q|0;e=y[e+m>>2];w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;d=d+4|0;if((o|0)!=(d|0)){continue}break}D=D+1|0;if((D|0)!=(i|0)){continue}break}Jd(b,c,A,x,j,k);u=0;}return u}y[10172]=48;return -1}function ue(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-192|0;T=d;y[d+96>>2]=0;y[d+100>>2]=0;y[d+104>>2]=0;y[d+108>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+120>>2]=0;y[d+124>>2]=0;e=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[d+64>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+68>>2]=e;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+72>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+76>>2]=e;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+80>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+84>>2]=e;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+88>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+92>>2]=e;y[d+32>>2]=0;y[d+36>>2]=0;y[d+40>>2]=0;y[d+44>>2]=0;y[d+48>>2]=0;y[d+52>>2]=0;y[d+56>>2]=0;y[d+60>>2]=0;b=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);y[d>>2]=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);y[d+4>>2]=b;b=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);y[d+8>>2]=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);y[d+12>>2]=b;b=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);y[d+16>>2]=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);y[d+20>>2]=b;b=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);y[d+24>>2]=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);y[d+28>>2]=b;De(d- -64|0,d);c=y[d+124>>2];y[d+184>>2]=y[d+120>>2];y[d+188>>2]=c;b=y[d+116>>2];y[d+176>>2]=y[d+112>>2];y[d+180>>2]=b;b=y[d+108>>2];y[d+168>>2]=y[d+104>>2];y[d+172>>2]=b;b=y[d+100>>2];y[d+160>>2]=y[d+96>>2];y[d+164>>2]=b;b=y[d+92>>2];y[d+152>>2]=y[d+88>>2];y[d+156>>2]=b;b=y[d+84>>2];y[d+144>>2]=y[d+80>>2];y[d+148>>2]=b;b=y[d+76>>2];y[d+136>>2]=y[d+72>>2];y[d+140>>2]=b;b=y[d+68>>2];y[d+128>>2]=y[d+64>>2];y[d+132>>2]=b;b=d+128|0;Pa(b);e=y[d+156>>2];c=y[d+152>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;e=y[d+148>>2];c=y[d+144>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=e;w[a+21|0]=e>>>8;w[a+22|0]=e>>>16;w[a+23|0]=e>>>24;e=y[d+140>>2];c=y[d+136>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;e=y[d+132>>2];c=y[d+128>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=e;w[a+5|0]=e>>>8;w[a+6|0]=e>>>16;w[a+7|0]=e>>>24;ja(b,64);T=d+192|0;}function Nb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;e=((d<<7)+a|0)+-64|0;f=y[e+60>>2];y[c+56>>2]=y[e+56>>2];y[c+60>>2]=f;f=y[e+52>>2];y[c+48>>2]=y[e+48>>2];y[c+52>>2]=f;f=y[e+44>>2];y[c+40>>2]=y[e+40>>2];y[c+44>>2]=f;f=y[e+36>>2];y[c+32>>2]=y[e+32>>2];y[c+36>>2]=f;f=y[e+28>>2];y[c+24>>2]=y[e+24>>2];y[c+28>>2]=f;f=y[e+20>>2];y[c+16>>2]=y[e+16>>2];y[c+20>>2]=f;f=y[e+12>>2];y[c+8>>2]=y[e+8>>2];y[c+12>>2]=f;f=y[e+4>>2];y[c>>2]=y[e>>2];y[c+4>>2]=f;f=d<<6;i=d<<1;while(1){d=(h<<6)+a|0;y[c>>2]=y[c>>2]^y[d>>2];y[c+4>>2]=y[c+4>>2]^y[d+4>>2];y[c+8>>2]=y[c+8>>2]^y[d+8>>2];y[c+12>>2]=y[c+12>>2]^y[d+12>>2];y[c+16>>2]=y[c+16>>2]^y[d+16>>2];y[c+20>>2]=y[c+20>>2]^y[d+20>>2];y[c+24>>2]=y[c+24>>2]^y[d+24>>2];y[c+28>>2]=y[c+28>>2]^y[d+28>>2];y[c+32>>2]=y[c+32>>2]^y[d+32>>2];y[c+36>>2]=y[c+36>>2]^y[d+36>>2];y[c+40>>2]=y[c+40>>2]^y[d+40>>2];y[c+44>>2]=y[c+44>>2]^y[d+44>>2];y[c+48>>2]=y[c+48>>2]^y[d+48>>2];y[c+52>>2]=y[c+52>>2]^y[d+52>>2];y[c+56>>2]=y[c+56>>2]^y[d+56>>2];y[c+60>>2]=y[c+60>>2]^y[d+60>>2];Hd(c);g=y[c+60>>2];e=(h<<5)+b|0;y[e+56>>2]=y[c+56>>2];y[e+60>>2]=g;g=y[c+52>>2];y[e+48>>2]=y[c+48>>2];y[e+52>>2]=g;g=y[c+44>>2];y[e+40>>2]=y[c+40>>2];y[e+44>>2]=g;g=y[c+36>>2];y[e+32>>2]=y[c+32>>2];y[e+36>>2]=g;g=y[c+28>>2];y[e+24>>2]=y[c+24>>2];y[e+28>>2]=g;g=y[c+20>>2];y[e+16>>2]=y[c+16>>2];y[e+20>>2]=g;g=y[c+12>>2];y[e+8>>2]=y[c+8>>2];y[e+12>>2]=g;g=y[c+4>>2];y[e>>2]=y[c>>2];y[e+4>>2]=g;y[c>>2]=y[c>>2]^y[d- -64>>2];y[c+4>>2]=y[c+4>>2]^y[d+68>>2];y[c+8>>2]=y[c+8>>2]^y[d+72>>2];y[c+12>>2]=y[c+12>>2]^y[d+76>>2];y[c+16>>2]=y[c+16>>2]^y[d+80>>2];y[c+20>>2]=y[c+20>>2]^y[d+84>>2];y[c+24>>2]=y[c+24>>2]^y[d+88>>2];y[c+28>>2]=y[c+28>>2]^y[d+92>>2];y[c+32>>2]=y[c+32>>2]^y[d+96>>2];y[c+36>>2]=y[c+36>>2]^y[d+100>>2];y[c+40>>2]=y[c+40>>2]^y[d+104>>2];y[c+44>>2]=y[c+44>>2]^y[d+108>>2];y[c+48>>2]=y[c+48>>2]^y[d+112>>2];y[c+52>>2]=y[c+52>>2]^y[d+116>>2];y[c+56>>2]=y[c+56>>2]^y[d+120>>2];y[c+60>>2]=y[c+60>>2]^y[d+124>>2];Hd(c);d=e+f|0;e=y[c+60>>2];y[d+56>>2]=y[c+56>>2];y[d+60>>2]=e;e=y[c+52>>2];y[d+48>>2]=y[c+48>>2];y[d+52>>2]=e;e=y[c+44>>2];y[d+40>>2]=y[c+40>>2];y[d+44>>2]=e;e=y[c+36>>2];y[d+32>>2]=y[c+32>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+24>>2]=y[c+24>>2];y[d+28>>2]=e;e=y[c+20>>2];y[d+16>>2]=y[c+16>>2];y[d+20>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;h=h+2|0;if(i>>>0>h>>>0){continue}break}}function hc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,F=0;A=z[a+80|0]?0:16777216;o=y[a+36>>2];m=y[a+32>>2];n=y[a+28>>2];k=y[a+24>>2];l=y[a+20>>2];q=y[a+4>>2];B=E(q,5);s=y[a+8>>2];w=E(s,5);u=y[a+12>>2];v=E(u,5);x=y[a+16>>2];t=E(x,5);r=y[a>>2];while(1){g=((z[b+3|0]|z[b+4|0]<<8|(z[b+5|0]<<16|z[b+6|0]<<24))>>>2&67108863)+k|0;e=Ai(g,0,u,0);i=W;k=((z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24))&67108863)+l|0;h=Ai(k,0,x,0);l=h+e|0;e=W+i|0;e=h>>>0>l>>>0?e+1|0:e;n=((z[b+6|0]|z[b+7|0]<<8|(z[b+8|0]<<16|z[b+9|0]<<24))>>>4&67108863)+n|0;i=Ai(n,0,s,0);l=i+l|0;e=W+e|0;e=i>>>0>l>>>0?e+1|0:e;m=((z[b+9|0]|z[b+10|0]<<8|(z[b+11|0]<<16|z[b+12|0]<<24))>>>6|0)+m|0;i=Ai(m,0,q,0);l=i+l|0;e=W+e|0;e=i>>>0>l>>>0?e+1|0:e;o=o+A+((z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24))>>>8)|0;i=Ai(o,0,r,0);l=i+l|0;e=W+e|0;C=l;l=i>>>0>l>>>0?e+1|0:e;e=Ai(g,0,s,0);i=W;h=Ai(k,0,u,0);e=h+e|0;f=W+i|0;f=e>>>0>>0?f+1|0:f;h=Ai(n,0,q,0);i=h+e|0;e=W+f|0;e=h>>>0>i>>>0?e+1|0:e;h=Ai(m,0,r,0);i=h+i|0;e=W+e|0;e=h>>>0>i>>>0?e+1|0:e;h=Ai(o,0,t,0);i=h+i|0;e=W+e|0;D=i;i=h>>>0>i>>>0?e+1|0:e;e=Ai(g,0,q,0);j=W;f=Ai(k,0,s,0);h=f+e|0;e=W+j|0;e=f>>>0>h>>>0?e+1|0:e;j=Ai(n,0,r,0);h=j+h|0;f=W+e|0;f=h>>>0>>0?f+1|0:f;j=Ai(m,0,t,0);h=j+h|0;e=W+f|0;e=h>>>0>>0?e+1|0:e;j=Ai(o,0,v,0);h=j+h|0;e=W+e|0;F=h;h=h>>>0>>0?e+1|0:e;e=Ai(g,0,r,0);f=W;p=Ai(k,0,q,0);j=p+e|0;e=W+f|0;e=j>>>0

>>0?e+1|0:e;f=Ai(n,0,t,0);j=f+j|0;e=W+e|0;e=f>>>0>j>>>0?e+1|0:e;p=Ai(m,0,v,0);j=p+j|0;f=W+e|0;f=j>>>0

>>0?f+1|0:f;p=Ai(o,0,w,0);j=p+j|0;e=W+f|0;e=j>>>0

>>0?e+1|0:e;p=j;j=e;e=Ai(g,0,t,0);f=W;k=Ai(k,0,r,0);g=k+e|0;e=W+f|0;e=g>>>0>>0?e+1|0:e;k=Ai(n,0,v,0);g=k+g|0;e=W+e|0;e=g>>>0>>0?e+1|0:e;k=Ai(m,0,w,0);g=k+g|0;e=W+e|0;e=g>>>0>>0?e+1|0:e;k=Ai(o,0,B,0);g=k+g|0;f=W+e|0;f=g>>>0>>0?f+1|0:f;k=g;n=(f&67108863)<<6|g>>>26;g=n+p|0;e=j;e=g>>>0>>0?e+1|0:e;n=g;m=(e&67108863)<<6|g>>>26;g=m+F|0;e=h;e=g>>>0>>0?e+1|0:e;m=g;f=i;g=(e&67108863)<<6|g>>>26;e=g+D|0;o=e;f=e>>>0>>0?f+1|0:f;i=(f&67108863)<<6|e>>>26;g=i+C|0;e=l;e=E(((g>>>0>>0?e+1|0:e)&67108863)<<6|g>>>26,5)+(k&67108863)|0;k=(n&67108863)+(e>>>26|0)|0;n=m&67108863;m=o&67108863;o=g&67108863;l=e&67108863;b=b+16|0;d=d-(c>>>0<16)|0;c=c-16|0;if(!d&c>>>0>15|d){continue}break}y[a+36>>2]=o;y[a+32>>2]=m;y[a+28>>2]=n;y[a+24>>2]=k;y[a+20>>2]=l;}function Aa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;a:{if(!d){f=2036477234;g=857760878;e=1634760805;k=1797285236;break a}f=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);g=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);e=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);k=z[d+12|0]|z[d+13|0]<<8|(z[d+14|0]<<16|z[d+15|0]<<24);}h=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);m=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);i=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);n=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);j=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);t=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);o=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);d=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);p=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);q=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);c=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);while(1){l=c;r=b;b=c+e|0;c=Bi(r^b,16);e=c+o|0;o=Bi(l^e,12);l=o;r=b+o|0;s=Bi(r^c,8);o=s+e|0;b=Bi(l^o,7);c=d+k|0;h=Bi(c^h,16);n=h+n|0;d=Bi(n^d,12);l=p;k=f+p|0;f=Bi(k^m,16);p=f+j|0;e=Bi(l^p,12);j=f;f=e+k|0;j=Bi(j^f,8);u=c+d|0;k=u+b|0;c=Bi(j^k,16);g=g+q|0;m=Bi(g^i,16);i=m+t|0;q=Bi(i^q,12);g=q+g|0;l=b;b=Bi(g^m,8);v=b+i|0;i=v+c|0;l=Bi(l^i,12);k=l+k|0;m=Bi(c^k,8);t=m+i|0;c=Bi(t^l,7);h=Bi(h^u,8);n=h+n|0;d=Bi(n^d,7);f=d+f|0;i=Bi(f^b,16);b=i+o|0;d=Bi(b^d,12);f=d+f|0;i=Bi(i^f,8);o=b+i|0;d=Bi(o^d,7);j=j+p|0;b=Bi(j^e,7);g=b+g|0;p=Bi(g^s,16);e=p+n|0;s=Bi(b^e,12);g=s+g|0;b=Bi(p^g,8);n=e+b|0;p=Bi(n^s,7);l=j;j=h;e=Bi(q^v,7);h=e+r|0;j=Bi(j^h,16);q=l+j|0;r=Bi(e^q,12);e=r+h|0;h=Bi(j^e,8);j=q+h|0;q=Bi(j^r,7);x=x+1|0;if((x|0)!=10){continue}break}w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;w[a+28|0]=h;w[a+29|0]=h>>>8;w[a+30|0]=h>>>16;w[a+31|0]=h>>>24;w[a+24|0]=m;w[a+25|0]=m>>>8;w[a+26|0]=m>>>16;w[a+27|0]=m>>>24;w[a+20|0]=i;w[a+21|0]=i>>>8;w[a+22|0]=i>>>16;w[a+23|0]=i>>>24;w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+12|0]=k;w[a+13|0]=k>>>8;w[a+14|0]=k>>>16;w[a+15|0]=k>>>24;w[a+8|0]=f;w[a+9|0]=f>>>8;w[a+10|0]=f>>>16;w[a+11|0]=f>>>24;w[a+4|0]=g;w[a+5|0]=g>>>8;w[a+6|0]=g>>>16;w[a+7|0]=g>>>24;return 0}function sa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=y[b+40>>2];e=y[b+4>>2];g=y[b+44>>2];h=y[b+8>>2];i=y[b+48>>2];j=y[b+12>>2];k=y[b+52>>2];l=y[b+16>>2];m=y[b+56>>2];n=y[b+20>>2];o=y[b+60>>2];p=y[b+24>>2];f=b- -64|0;q=y[f>>2];r=y[b+28>>2];s=y[b+68>>2];t=y[b+32>>2];u=y[b+72>>2];v=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=t+u;y[a+28>>2]=r+s;y[a+24>>2]=p+q;y[a+20>>2]=n+o;y[a+16>>2]=l+m;y[a+12>>2]=j+k;y[a+8>>2]=h+i;y[a+4>>2]=e+g;y[a>>2]=d+v;g=y[b+40>>2];d=y[b+4>>2];h=y[b+44>>2];i=y[b+8>>2];j=y[b+48>>2];k=y[b+12>>2];l=y[b+52>>2];m=y[b+16>>2];n=y[b+56>>2];o=y[b+20>>2];p=y[b+60>>2];q=y[b+24>>2];f=y[f>>2];e=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=t-s;y[a+68>>2]=r-e;e=a- -64|0;y[e>>2]=f-q;y[a+60>>2]=p-o;y[a+56>>2]=n-m;y[a+52>>2]=l-k;y[a+48>>2]=j-i;y[a+44>>2]=h-d;d=a+40|0;y[d>>2]=g-u;ga(a+80|0,a,c);ga(d,d,c+40|0);ga(a+120|0,c+120|0,b+120|0);ga(a,b+80|0,c+80|0);v=y[a+4>>2];z=y[a+8>>2];A=y[a+12>>2];B=y[a+16>>2];C=y[a+20>>2];D=y[a+24>>2];E=y[a+28>>2];F=y[a+32>>2];G=y[a+36>>2];b=y[d>>2];c=y[a+80>>2];g=y[a+44>>2];h=y[a+84>>2];i=y[a+48>>2];j=y[a+88>>2];k=y[a+52>>2];l=y[a+92>>2];m=y[a+56>>2];n=y[a+96>>2];o=y[a+60>>2];p=y[a+100>>2];f=y[e>>2];q=y[a+104>>2];r=y[a+68>>2];s=y[a+108>>2];t=y[a+72>>2];u=y[a+112>>2];H=y[a>>2];w=y[a+76>>2];x=y[a+116>>2];y[a+76>>2]=w+x;y[a+72>>2]=t+u;y[a+68>>2]=r+s;y[e>>2]=f+q;y[a+60>>2]=o+p;y[a+56>>2]=m+n;y[a+52>>2]=k+l;y[a+48>>2]=i+j;y[a+44>>2]=g+h;y[d>>2]=b+c;y[a+36>>2]=x-w;y[a+32>>2]=u-t;y[a+28>>2]=s-r;y[a+24>>2]=q-f;y[a+20>>2]=p-o;y[a+16>>2]=n-m;y[a+12>>2]=l-k;y[a+8>>2]=j-i;y[a+4>>2]=h-g;y[a>>2]=c-b;b=G<<1;c=y[a+156>>2];y[a+156>>2]=b-c;d=F<<1;e=y[a+152>>2];y[a+152>>2]=d-e;g=E<<1;h=y[a+148>>2];y[a+148>>2]=g-h;i=D<<1;j=y[a+144>>2];y[a+144>>2]=i-j;k=C<<1;l=y[a+140>>2];y[a+140>>2]=k-l;m=B<<1;n=y[a+136>>2];y[a+136>>2]=m-n;o=A<<1;p=y[a+132>>2];y[a+132>>2]=o-p;f=z<<1;q=y[a+128>>2];y[a+128>>2]=f-q;r=v<<1;s=y[a+124>>2];y[a+124>>2]=r-s;t=H<<1;u=y[a+120>>2];y[a+120>>2]=t-u;y[a+112>>2]=d+e;y[a+108>>2]=g+h;y[a+104>>2]=i+j;y[a+100>>2]=k+l;y[a+96>>2]=m+n;y[a+92>>2]=o+p;y[a+88>>2]=f+q;y[a+84>>2]=r+s;y[a+80>>2]=t+u;y[a+116>>2]=b+c;}function Hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=y[b+40>>2];e=y[b+4>>2];g=y[b+44>>2];h=y[b+8>>2];i=y[b+48>>2];j=y[b+12>>2];k=y[b+52>>2];l=y[b+16>>2];m=y[b+56>>2];n=y[b+20>>2];o=y[b+60>>2];p=y[b+24>>2];f=b- -64|0;q=y[f>>2];r=y[b+28>>2];s=y[b+68>>2];t=y[b+32>>2];u=y[b+72>>2];v=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=t+u;y[a+28>>2]=r+s;y[a+24>>2]=p+q;y[a+20>>2]=n+o;y[a+16>>2]=l+m;y[a+12>>2]=j+k;y[a+8>>2]=h+i;y[a+4>>2]=e+g;y[a>>2]=d+v;g=y[b+40>>2];d=y[b+4>>2];h=y[b+44>>2];i=y[b+8>>2];j=y[b+48>>2];k=y[b+12>>2];l=y[b+52>>2];m=y[b+16>>2];n=y[b+56>>2];o=y[b+20>>2];p=y[b+60>>2];q=y[b+24>>2];f=y[f>>2];e=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=t-s;y[a+68>>2]=r-e;e=a- -64|0;y[e>>2]=f-q;y[a+60>>2]=p-o;y[a+56>>2]=n-m;y[a+52>>2]=l-k;y[a+48>>2]=j-i;y[a+44>>2]=h-d;d=a+40|0;y[d>>2]=g-u;ga(a+80|0,a,c+40|0);ga(d,d,c);ga(a+120|0,c+120|0,b+120|0);ga(a,b+80|0,c+80|0);v=y[a+4>>2];z=y[a+8>>2];A=y[a+12>>2];B=y[a+16>>2];C=y[a+20>>2];D=y[a+24>>2];E=y[a+28>>2];F=y[a+32>>2];G=y[a+36>>2];b=y[d>>2];c=y[a+80>>2];g=y[a+44>>2];h=y[a+84>>2];i=y[a+48>>2];j=y[a+88>>2];k=y[a+52>>2];l=y[a+92>>2];m=y[a+56>>2];n=y[a+96>>2];o=y[a+60>>2];p=y[a+100>>2];f=y[e>>2];q=y[a+104>>2];r=y[a+68>>2];s=y[a+108>>2];t=y[a+72>>2];u=y[a+112>>2];H=y[a>>2];w=y[a+76>>2];x=y[a+116>>2];y[a+76>>2]=w+x;y[a+72>>2]=t+u;y[a+68>>2]=r+s;y[e>>2]=f+q;y[a+60>>2]=o+p;y[a+56>>2]=m+n;y[a+52>>2]=k+l;y[a+48>>2]=i+j;y[a+44>>2]=g+h;y[d>>2]=b+c;y[a+36>>2]=x-w;y[a+32>>2]=u-t;y[a+28>>2]=s-r;y[a+24>>2]=q-f;y[a+20>>2]=p-o;y[a+16>>2]=n-m;y[a+12>>2]=l-k;y[a+8>>2]=j-i;y[a+4>>2]=h-g;y[a>>2]=c-b;b=y[a+156>>2];c=G<<1;y[a+156>>2]=b+c;d=y[a+152>>2];e=F<<1;y[a+152>>2]=d+e;g=y[a+148>>2];h=E<<1;y[a+148>>2]=g+h;i=y[a+144>>2];j=D<<1;y[a+144>>2]=i+j;k=y[a+140>>2];l=C<<1;y[a+140>>2]=k+l;m=y[a+136>>2];n=B<<1;y[a+136>>2]=m+n;o=y[a+132>>2];p=A<<1;y[a+132>>2]=o+p;f=y[a+128>>2];q=z<<1;y[a+128>>2]=f+q;r=y[a+124>>2];s=v<<1;y[a+124>>2]=r+s;t=y[a+120>>2];u=H<<1;y[a+120>>2]=t+u;y[a+112>>2]=e-d;y[a+108>>2]=h-g;y[a+104>>2]=j-i;y[a+100>>2]=l-k;y[a+96>>2]=n-m;y[a+92>>2]=p-o;y[a+88>>2]=q-f;y[a+84>>2]=s-r;y[a+80>>2]=u-t;y[a+116>>2]=c-b;}function fc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=y[b+40>>2];e=y[b+4>>2];g=y[b+44>>2];h=y[b+8>>2];i=y[b+48>>2];j=y[b+12>>2];k=y[b+52>>2];l=y[b+16>>2];m=y[b+56>>2];n=y[b+20>>2];o=y[b+60>>2];p=y[b+24>>2];f=b- -64|0;q=y[f>>2];r=y[b+28>>2];s=y[b+68>>2];t=y[b+32>>2];u=y[b+72>>2];v=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=t+u;y[a+28>>2]=r+s;y[a+24>>2]=p+q;y[a+20>>2]=n+o;y[a+16>>2]=l+m;y[a+12>>2]=j+k;y[a+8>>2]=h+i;y[a+4>>2]=e+g;y[a>>2]=d+v;g=y[b+40>>2];d=y[b+4>>2];h=y[b+44>>2];i=y[b+8>>2];j=y[b+48>>2];k=y[b+12>>2];l=y[b+52>>2];m=y[b+16>>2];n=y[b+56>>2];o=y[b+20>>2];p=y[b+60>>2];q=y[b+24>>2];f=y[f>>2];e=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=t-s;y[a+68>>2]=r-e;e=a- -64|0;y[e>>2]=f-q;y[a+60>>2]=p-o;y[a+56>>2]=n-m;y[a+52>>2]=l-k;y[a+48>>2]=j-i;y[a+44>>2]=h-d;d=a+40|0;y[d>>2]=g-u;ga(a+80|0,a,c);ga(d,d,c+40|0);ga(a+120|0,c+80|0,b+120|0);v=y[b+80>>2];z=y[b+84>>2];A=y[b+88>>2];B=y[b+92>>2];C=y[b+96>>2];D=y[b+100>>2];E=y[b+104>>2];F=y[b+108>>2];G=y[b+112>>2];H=y[b+116>>2];b=y[d>>2];c=y[a+80>>2];g=y[a+44>>2];h=y[a+84>>2];i=y[a+48>>2];j=y[a+88>>2];k=y[a+52>>2];l=y[a+92>>2];m=y[a+56>>2];n=y[a+96>>2];o=y[a+60>>2];p=y[a+100>>2];f=y[e>>2];q=y[a+104>>2];r=y[a+68>>2];s=y[a+108>>2];t=y[a+72>>2];u=y[a+112>>2];w=y[a+76>>2];x=y[a+116>>2];y[a+76>>2]=w+x;y[a+72>>2]=t+u;y[a+68>>2]=r+s;y[e>>2]=f+q;y[a+60>>2]=o+p;y[a+56>>2]=m+n;y[a+52>>2]=k+l;y[a+48>>2]=i+j;y[a+44>>2]=g+h;y[d>>2]=b+c;y[a+36>>2]=x-w;y[a+32>>2]=u-t;y[a+28>>2]=s-r;y[a+24>>2]=q-f;y[a+20>>2]=p-o;y[a+16>>2]=n-m;y[a+12>>2]=l-k;y[a+8>>2]=j-i;y[a+4>>2]=h-g;y[a>>2]=c-b;b=H<<1;c=y[a+156>>2];y[a+156>>2]=b-c;d=G<<1;e=y[a+152>>2];y[a+152>>2]=d-e;g=F<<1;h=y[a+148>>2];y[a+148>>2]=g-h;i=E<<1;j=y[a+144>>2];y[a+144>>2]=i-j;k=D<<1;l=y[a+140>>2];y[a+140>>2]=k-l;m=C<<1;n=y[a+136>>2];y[a+136>>2]=m-n;o=B<<1;p=y[a+132>>2];y[a+132>>2]=o-p;f=A<<1;q=y[a+128>>2];y[a+128>>2]=f-q;r=z<<1;s=y[a+124>>2];y[a+124>>2]=r-s;t=v<<1;u=y[a+120>>2];y[a+120>>2]=t-u;y[a+112>>2]=d+e;y[a+108>>2]=g+h;y[a+104>>2]=i+j;y[a+100>>2]=k+l;y[a+96>>2]=m+n;y[a+92>>2]=o+p;y[a+88>>2]=f+q;y[a+84>>2]=r+s;y[a+80>>2]=t+u;y[a+116>>2]=b+c;}function Ja(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=-1;f=d-65|0;if(!(f>>>0<4294967232|c>>>0>64)){a:{if(!(c?b:0)){if((f&255)>>>0<=191){na();s();}o(a- -64|0,0,293);w[a+56|0]=121;w[a+57|0]=33;w[a+58|0]=126;w[a+59|0]=19;w[a+60|0]=25;w[a+61|0]=205;w[a+62|0]=224;w[a+63|0]=91;w[a+48|0]=107;w[a+49|0]=189;w[a+50|0]=65;w[a+51|0]=251;w[a+52|0]=171;w[a+53|0]=217;w[a+54|0]=131;w[a+55|0]=31;w[a+40|0]=31;w[a+41|0]=108;w[a+42|0]=62;w[a+43|0]=43;w[a+44|0]=140;w[a+45|0]=104;w[a+46|0]=5;w[a+47|0]=155;w[a+32|0]=209;w[a+33|0]=130;w[a+34|0]=230;w[a+35|0]=173;w[a+36|0]=127;w[a+37|0]=82;w[a+38|0]=14;w[a+39|0]=81;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;b=d^-222443256;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=103;w[a+5|0]=230;w[a+6|0]=9;w[a+7|0]=106;break a}e=T-128|0;T=e;b:{if(!(!b|(d-65&255)>>>0<=191|(c-65&255)>>>0<=191)){o(a- -64|0,0,293);w[a+56|0]=121;w[a+57|0]=33;w[a+58|0]=126;w[a+59|0]=19;w[a+60|0]=25;w[a+61|0]=205;w[a+62|0]=224;w[a+63|0]=91;w[a+48|0]=107;w[a+49|0]=189;w[a+50|0]=65;w[a+51|0]=251;w[a+52|0]=171;w[a+53|0]=217;w[a+54|0]=131;w[a+55|0]=31;w[a+40|0]=31;w[a+41|0]=108;w[a+42|0]=62;w[a+43|0]=43;w[a+44|0]=140;w[a+45|0]=104;w[a+46|0]=5;w[a+47|0]=155;w[a+32|0]=209;w[a+33|0]=130;w[a+34|0]=230;w[a+35|0]=173;w[a+36|0]=127;w[a+37|0]=82;w[a+38|0]=14;w[a+39|0]=81;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;d=(c<<8|d)^-222443256;w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;d=c>>>24^1779033703;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;o(e,0,128);if(c){t(e,b,c);}t(a+96|0,e,128);w[a+352|0]=128;w[a+353|0]=0;w[a+354|0]=0;w[a+355|0]=0;ja(e,128);T=e+128|0;break b}na();s();}}e=0;}return e|0}function Sa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;a:{if(!d){e=1797285236;i=2036477234;j=857760878;d=1634760805;break a}e=z[d+12|0]|z[d+13|0]<<8|(z[d+14|0]<<16|z[d+15|0]<<24);i=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);j=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);d=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);}f=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);h=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);g=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);r=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);q=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);s=20;o=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);p=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);l=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);m=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);n=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);c=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);while(1){k=Bi(c+j|0,7)^f;t=Bi(k+j|0,9)^q;l=Bi(d+o|0,7)^l;u=Bi(l+d|0,9)^h;v=Bi(u+l|0,13)^o;m=Bi(e+p|0,7)^m;g=Bi(m+e|0,9)^g;h=Bi(g+m|0,13)^p;e=Bi(g+h|0,18)^e;f=Bi(b+i|0,7)^r;o=v^Bi(e+f|0,7);q=t^Bi(o+e|0,9);r=Bi(o+q|0,13)^f;e=Bi(q+r|0,18)^e;n=Bi(f+i|0,9)^n;x=Bi(n+f|0,13)^b;b=Bi(x+n|0,18)^i;p=Bi(b+k|0,7)^h;h=Bi(p+b|0,9)^u;f=Bi(h+p|0,13)^k;i=Bi(f+h|0,18)^b;k=Bi(k+t|0,13)^c;c=Bi(k+t|0,18)^j;b=Bi(c+l|0,7)^x;g=Bi(b+c|0,9)^g;l=Bi(b+g|0,13)^l;j=Bi(g+l|0,18)^c;d=Bi(u+v|0,18)^d;c=Bi(d+m|0,7)^k;n=Bi(c+d|0,9)^n;m=Bi(c+n|0,13)^m;d=Bi(n+m|0,18)^d;k=s>>>0>2;s=s-2|0;if(k){continue}break}w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+28|0]=f;w[a+29|0]=f>>>8;w[a+30|0]=f>>>16;w[a+31|0]=f>>>24;w[a+24|0]=h;w[a+25|0]=h>>>8;w[a+26|0]=h>>>16;w[a+27|0]=h>>>24;w[a+20|0]=g;w[a+21|0]=g>>>8;w[a+22|0]=g>>>16;w[a+23|0]=g>>>24;w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;w[a+8|0]=i;w[a+9|0]=i>>>8;w[a+10|0]=i>>>16;w[a+11|0]=i>>>24;w[a+4|0]=j;w[a+5|0]=j>>>8;w[a+6|0]=j>>>16;w[a+7|0]=j>>>24;return 0}function cb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0;r=z[b+31|0];s=z[b+30|0];t=z[b+29|0];u=z[b+6|0];v=z[b+5|0];w=z[b+4|0];x=z[b+9|0];A=z[b+8|0];B=z[b+7|0];C=z[b+12|0];l=z[b+11|0];m=z[b+10|0];p=z[b+15|0];n=z[b+14|0];D=z[b+13|0];i=z[b+28|0];k=z[b+27|0];j=z[b+26|0];h=z[b+25|0];f=z[b+24|0];e=z[b+23|0];E=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);d=z[b+21|0];g=d<<15;d=c;c=g;g=z[b+20|0];o=c|g<<7;g=d|d;c=z[b+22|0];c=c<<23|o;d=d|g;q=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);b=0;g=c;o=q+16777216|0;b=o>>>0<16777216?1:b;c=(b&33554431)<<7|o>>>25;g=g+c|0;b=(b>>>25|0)+d|0;d=g;c=d>>>0>>0?b+1|0:b;g=d+33554432|0;b=g>>>0<33554432?c+1|0:c;y[a+24>>2]=d-(g&-67108864);d=e>>>27|0;e=f<<13|e<<5;c=d|f>>>19|h>>>11;d=b;f=h<<21|e;d=(d&67108863)<<6|g>>>26;e=f+d|0;d=e;b=c;e=f+16777216|0;c=e>>>0<16777216?b+1|0:b;y[a+28>>2]=d-(e&1040187392);d=k>>>20|j>>>28|i>>>12;b=c;c=b>>>25|0;b=(b&33554431)<<7|e>>>25;e=b+(k<<12|j<<4|i<<20)|0;d=c+d|0;c=e;d=c>>>0>>0?d+1|0:d;b=d;i=c+33554432|0;e=i>>>0<33554432?b+1|0:b;y[a+32>>2]=c-(i&-67108864);j=q-(o&-33554432)|0;f=n<<10|D<<2|p<<18;h=n>>>22|p>>>14;c=l>>>21|m>>>29;l=l<<11|m<<3|C<<19;k=l+16777216|0;d=k>>>0<16777216?c+1|0:c;b=d>>>25|0;c=f;f=(d&33554431)<<7|k>>>25;d=c+f|0;c=b+h|0;c=d>>>0>>0?c+1|0:c;b=c;f=d+33554432|0;b=f>>>0<33554432?b+1|0:b;c=f;f=((b&67108863)<<6|c>>>26)+j|0;y[a+20>>2]=f;y[a+16>>2]=d-(c&-67108864);f=A<<13|B<<5|x<<21;h=0;m=v<<14|w<<6|u<<22;c=0;j=m+16777216|0;c=j>>>0<16777216?c+1|0:c;d=c>>>25|0;b=f;f=(c&33554431)<<7|j>>>25;c=b+f|0;b=d+h|0;b=c>>>0>>0?b+1|0:b;h=c+33554432|0;d=h>>>0<33554432?b+1|0:b;y[a+8>>2]=c-(h&-67108864);n=r<<18&33292288|(s<<10|t<<2);c=0;e=(e&67108863)<<6|i>>>26;i=e+n|0;b=c;e=n+16777216|0;c=e>>>0<16777216?b+1|0:b;y[a+36>>2]=i-(e&33554432);d=l+((d&67108863)<<6|h>>>26)|0;y[a+12>>2]=d-(k&234881024);f=m-(j&2113929216)|0;b=c;c=b>>>25|0;d=Ai((b&33554431)<<7|e>>>25,c,19,0);c=d+E|0;b=W;d=c>>>0>>0?b+1|0:b;b=c+33554432|0;d=b>>>0<33554432?d+1|0:d;e=((d&67108863)<<6|b>>>26)+f|0;y[a+4>>2]=e;y[a>>2]=c-(b&-67108864);}function va(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=T-704|0;T=o;a:{if(!(c|d)){break a}g=y[a+76>>2];f=g;g=(d<<3|c>>>29)+f|0;k=y[a+72>>2];i=c<<3;h=k+i|0;y[a+72>>2]=h;g=h>>>0>>0?g+1|0:g;y[a+76>>2]=g;e=a- -64|0;i=e;h=(f|0)==(g|0)&h>>>0>>0|f>>>0>g>>>0;g=y[e+4>>2];r=h;h=h+y[e>>2]|0;e=r>>>0>h>>>0?g+1|0:g;j=d>>>29|0;h=j+h|0;y[i>>2]=h;y[i+4>>2]=h>>>0>>0?e+1|0:e;h=a+80|0;i=((f&7)<<29|k>>>3)&127;g=i;e=128-g|0;k=e;j=0;r=0-(j+(g>>>0>128)|0)|0;g=r;if((d|0)==(g|0)&c>>>0>=e>>>0|d>>>0>g>>>0){s=e&3;f=0;g=0;b:{if(!j&(i^127)>>>0>=3|j){j=e&252;while(1){e=f+i|0;w[e+h|0]=z[b+f|0];e=f|1;q=i+e|0;w[h+q|0]=z[b+e|0];e=f|2;q=i+e|0;w[h+q|0]=z[b+e|0];e=f|3;q=i+e|0;w[h+q|0]=z[b+e|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((j|0)!=(m|0)|(n|0)!=(e|0)){continue}break}if(!(s|t)){break b}}while(1){e=f+i|0;w[e+h|0]=z[b+f|0];e=g;f=f+1|0;g=f?e:e+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((l|0)!=(s|0)|(t|0)!=(e|0)){continue}break}}f=o+640|0;Xb(a,h,o,f);b=b+k|0;d=d-((c>>>0>>0)+r|0)|0;c=c-k|0;if(!d&c>>>0>127|d){while(1){Xb(a,b,o,f);b=b+128|0;d=d-(c>>>0<128)|0;c=c-128|0;if(!d&c>>>0>127|d){continue}break}}c:{if(!(c|d)){break c}a=c&3;p=0;l=0;n=0;f=0;g=0;if(!d&c>>>0>=4|d){m=c&124;k=0;c=0;d=0;while(1){w[f+h|0]=z[b+f|0];e=f|1;w[e+h|0]=z[b+e|0];e=f|2;w[e+h|0]=z[b+e|0];e=f|3;w[e+h|0]=z[b+e|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;e=d;c=c+4|0;e=c>>>0<4?e+1|0:e;d=e;if((c|0)!=(m|0)|(k|0)!=(e|0)){continue}break}if(!(a|p)){break c}}while(1){w[f+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((a|0)!=(l|0)|(p|0)!=(e|0)){continue}break}}ja(o,704);break a}a=c&3;k=0;f=0;g=0;if(!d&c>>>0>=4|d){c=c&-4;while(1){e=f+i|0;w[e+h|0]=z[b+f|0];e=f|1;j=i+e|0;w[h+j|0]=z[b+e|0];e=f|2;j=i+e|0;w[h+j|0]=z[b+e|0];e=f|3;j=i+e|0;w[h+j|0]=z[b+e|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((c|0)!=(m|0)|(d|0)!=(e|0)){continue}break}if(!(a|k)){break a}}while(1){c=f+i|0;w[c+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((a|0)!=(l|0)|(k|0)!=(e|0)){continue}break}}T=o+704|0;return 0}function xe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=T-736|0;T=c;h=c+704|0;ha(h,b,b);e=c+224|0;ha(e,b,h);g=c+672|0;ha(g,b,e);f=c+640|0;ha(f,g,g);j=c+416|0;ha(j,h,f);h=c+320|0;ha(h,b,j);d=c+608|0;ha(d,f,f);f=c+288|0;ha(f,h,h);i=c+576|0;ha(i,j,f);m=c+448|0;ha(m,d,f);k=c+544|0;ha(k,i,i);i=c+384|0;ha(i,d,k);l=c+352|0;ha(l,e,i);e=c+192|0;ha(e,d,l);d=c+160|0;ha(d,g,e);ha(c+96|0,g,d);e=c+512|0;ha(e,k,l);d=c+480|0;ha(d,g,e);e=c+256|0;ha(e,m,d);ha(c+128|0,f,e);f=c- -64|0;ha(f,i,d);d=c+32|0;ha(d,g,f);ha(c,j,d);ha(a,h,c);g=0;while(1){ha(a,a,a);g=g+1|0;if((g|0)!=126){continue}break}ha(a,a,c+352|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+704|0);ha(a,a,c);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+160|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+256|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c- -64|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+96|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+320|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+512|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+192|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+480|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+128|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+32|0);T=c+736|0;return 0-ya(b,32)|0}function Yd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=T-160|0;T=k;rb(b,c,32,0);w[b|0]=z[b|0]&248;w[b+31|0]=z[b+31|0]&63|64;jb(k,b);Wa(a,k);f=c;g=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);e=z[f+4|0]|z[f+5|0]<<8|(z[f+6|0]<<16|z[f+7|0]<<24);h=z[f+8|0]|z[f+9|0]<<8|(z[f+10|0]<<16|z[f+11|0]<<24);i=z[f+12|0]|z[f+13|0]<<8|(z[f+14|0]<<16|z[f+15|0]<<24);j=z[f+16|0]|z[f+17|0]<<8|(z[f+18|0]<<16|z[f+19|0]<<24);c=z[f+20|0]|z[f+21|0]<<8|(z[f+22|0]<<16|z[f+23|0]<<24);l=z[f+28|0]|z[f+29|0]<<8|(z[f+30|0]<<16|z[f+31|0]<<24);d=b;b=z[f+24|0]|z[f+25|0]<<8|(z[f+26|0]<<16|z[f+27|0]<<24);w[d+24|0]=b;w[d+25|0]=b>>>8;w[d+26|0]=b>>>16;w[d+27|0]=b>>>24;w[d+28|0]=l;w[d+29|0]=l>>>8;w[d+30|0]=l>>>16;w[d+31|0]=l>>>24;w[d+16|0]=j;w[d+17|0]=j>>>8;w[d+18|0]=j>>>16;w[d+19|0]=j>>>24;w[d+20|0]=c;w[d+21|0]=c>>>8;w[d+22|0]=c>>>16;w[d+23|0]=c>>>24;w[d+8|0]=h;w[d+9|0]=h>>>8;w[d+10|0]=h>>>16;w[d+11|0]=h>>>24;w[d+12|0]=i;w[d+13|0]=i>>>8;w[d+14|0]=i>>>16;w[d+15|0]=i>>>24;w[d|0]=g;w[d+1|0]=g>>>8;w[d+2|0]=g>>>16;w[d+3|0]=g>>>24;w[d+4|0]=e;w[d+5|0]=e>>>8;w[d+6|0]=e>>>16;w[d+7|0]=e>>>24;e=a;h=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);i=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);j=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);c=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);b=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);a=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);g=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);e=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);w[d+56|0]=e;w[d+57|0]=e>>>8;w[d+58|0]=e>>>16;w[d+59|0]=e>>>24;w[d+60|0]=g;w[d+61|0]=g>>>8;w[d+62|0]=g>>>16;w[d+63|0]=g>>>24;w[d+48|0]=b;w[d+49|0]=b>>>8;w[d+50|0]=b>>>16;w[d+51|0]=b>>>24;w[d+52|0]=a;w[d+53|0]=a>>>8;w[d+54|0]=a>>>16;w[d+55|0]=a>>>24;w[d+40|0]=j;w[d+41|0]=j>>>8;w[d+42|0]=j>>>16;w[d+43|0]=j>>>24;w[d+44|0]=c;w[d+45|0]=c>>>8;w[d+46|0]=c>>>16;w[d+47|0]=c>>>24;w[d+32|0]=h;w[d+33|0]=h>>>8;w[d+34|0]=h>>>16;w[d+35|0]=h>>>24;w[d+36|0]=i;w[d+37|0]=i>>>8;w[d+38|0]=i>>>16;w[d+39|0]=i>>>24;T=k+160|0;return 0}function Ra(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;o=y[b+4>>2];d=y[a+4>>2];p=y[b+8>>2];e=y[a+8>>2];q=y[b+12>>2];f=y[a+12>>2];r=y[b+16>>2];g=y[a+16>>2];s=y[b+20>>2];h=y[a+20>>2];t=y[b+24>>2];i=y[a+24>>2];n=y[b+28>>2];j=y[a+28>>2];u=y[b+32>>2];k=y[a+32>>2];v=y[b+36>>2];l=y[a+36>>2];c=0-c|0;m=y[a>>2];y[a>>2]=c&(m^y[b>>2])^m;y[a+36>>2]=l^c&(l^v);y[a+32>>2]=k^c&(k^u);y[a+28>>2]=j^c&(j^n);y[a+24>>2]=i^c&(i^t);y[a+20>>2]=h^c&(h^s);y[a+16>>2]=g^c&(g^r);y[a+12>>2]=f^c&(f^q);y[a+8>>2]=e^c&(e^p);y[a+4>>2]=d^c&(d^o);d=y[a+40>>2];o=y[b+40>>2];e=y[a+44>>2];p=y[b+44>>2];f=y[a+48>>2];q=y[b+48>>2];g=y[a+52>>2];r=y[b+52>>2];h=y[a+56>>2];s=y[b+56>>2];i=y[a+60>>2];t=y[b+60>>2];n=a- -64|0;j=y[n>>2];u=y[b- -64>>2];k=y[a+68>>2];v=y[b+68>>2];l=y[a+72>>2];m=y[b+72>>2];w=y[a+76>>2];y[a+76>>2]=w^c&(y[b+76>>2]^w);y[a+72>>2]=l^c&(l^m);y[a+68>>2]=k^c&(k^v);y[n>>2]=j^c&(j^u);y[a+60>>2]=i^c&(i^t);y[a+56>>2]=h^c&(h^s);y[a+52>>2]=g^c&(g^r);y[a+48>>2]=f^c&(f^q);y[a+44>>2]=e^c&(e^p);y[a+40>>2]=d^c&(d^o);d=y[a+80>>2];o=y[b+80>>2];e=y[a+84>>2];p=y[b+84>>2];f=y[a+88>>2];q=y[b+88>>2];g=y[a+92>>2];r=y[b+92>>2];h=y[a+96>>2];s=y[b+96>>2];i=y[a+100>>2];t=y[b+100>>2];j=y[a+104>>2];n=y[b+104>>2];k=y[a+108>>2];u=y[b+108>>2];l=y[a+112>>2];v=y[b+112>>2];m=y[a+116>>2];y[a+116>>2]=c&(m^y[b+116>>2])^m;y[a+112>>2]=l^c&(l^v);y[a+108>>2]=k^c&(k^u);y[a+104>>2]=j^c&(j^n);y[a+100>>2]=i^c&(i^t);y[a+96>>2]=h^c&(h^s);y[a+92>>2]=g^c&(g^r);y[a+88>>2]=f^c&(f^q);y[a+84>>2]=e^c&(e^p);y[a+80>>2]=d^c&(d^o);d=y[a+120>>2];o=y[b+120>>2];e=y[a+124>>2];p=y[b+124>>2];f=y[a+128>>2];q=y[b+128>>2];g=y[a+132>>2];r=y[b+132>>2];h=y[a+136>>2];s=y[b+136>>2];i=y[a+140>>2];t=y[b+140>>2];j=y[a+144>>2];n=y[b+144>>2];k=y[a+148>>2];u=y[b+148>>2];l=y[a+152>>2];v=y[b+152>>2];m=y[b+156>>2];b=y[a+156>>2];y[a+156>>2]=c&(m^b)^b;y[a+152>>2]=l^c&(l^v);y[a+148>>2]=k^c&(k^u);y[a+144>>2]=j^c&(j^n);y[a+140>>2]=i^c&(i^t);y[a+136>>2]=h^c&(h^s);y[a+132>>2]=g^c&(g^r);y[a+128>>2]=f^c&(f^q);y[a+124>>2]=e^c&(e^p);y[a+120>>2]=d^c&(d^o);}function Ac(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((h&-7)==1){a:{b:{c:{d:{e:{f:{g:{if(d){h:{i:{if(h>>>0<=3){while(1){l=i;j:{k:{l:{m:{while(1){k=w[c+l|0];j=k-65|0;j=j&(k-91&(j^-1))>>>8&255|(k+4&(k-58&(k+65488^-1))>>>8&255|(k+185&(k-123&(k+65439^-1))>>>8&255|(((k^16336)+1^-1)>>>8&63|((k^16340)+1^-1)>>>8&62)));j=(j-1&(k^65470)+1)>>>8&255|j;if((j|0)!=255){break m}j=0;if(!e){break h}if(ob(e,k)){l=l+1|0;if(l>>>0>=d>>>0){break l}continue}break}i=l;break h}o=j+(o<<6)|0;if(m>>>0>1){break k}m=m+6|0;break j}a=i+1|0;i=a>>>0>>0?d:a;break h}m=m-2|0;if(b>>>0<=n>>>0){break i}w[a+n|0]=o>>>m;n=n+1|0;}j=0;i=l+1|0;if(i>>>0>>0){continue}break}break h}while(1){n:{k=w[c+l|0];j=k-65|0;j=j&(k-91&(j^-1))>>>8&255|(k+4&(k-58&(k+65488^-1))>>>8&255|(k+185&(k-123&(k+65439^-1))>>>8&255|(((k^16288)+1^-1)>>>8&63|((k^16338)+1^-1)>>>8&62)));j=(j-1&(k^65470)+1)>>>8&255|j;if((j|0)==255){j=0;if(!e){break h}if(ob(e,k)){l=l+1|0;if(l>>>0>=d>>>0){break n}continue}i=l;break h}o=j+(o<<6)|0;o:{if(m>>>0<2){m=m+6|0;break o}m=m-2|0;if(b>>>0<=n>>>0){break i}w[a+n|0]=o>>>m;n=n+1|0;}j=0;i=l+1|0;if(i>>>0>=d>>>0){break h}l=i;continue}break}a=i+1|0;i=a>>>0>>0?d:a;break h}i=l;y[10172]=68;j=1;}if(m>>>0>4){break g}a=i;}else {a=0;}l=-1;if(j){i=a;break a}if((-1<>>1|0;if(!j){break p}if(!e){break e}i=a>>>0>d>>>0?a:d;while(1){if((a|0)==(i|0)){e=68;break d}q:{b=w[a+c|0];if((b|0)==61){j=j-1|0;break q}if(ob(e,b)){break q}e=28;i=a;break d}a=a+1|0;if(j){continue}break}}l=0;if(!e|a>>>0>=d>>>0){break f}while(1){if(!ob(e,w[a+c|0])){break f}a=a+1|0;if((d|0)!=(a|0)){continue}break}i=d;break b}l=-1;break a}i=a;break b}e=68;if(a>>>0>=d>>>0){i=a;break d}e=28;if(z[a+c|0]!=61){i=a;break d}i=a+1|0;if((j|0)==1){l=0;break b}if((d|0)==(i|0)){i=a>>>0>d>>>0?a:d;e=68;break d}if(z[c+i|0]==61){break c}}y[10172]=e;break a}i=a+2|0;l=0;}p=n;}r:{if(g){y[g>>2]=c+i;break r}if((d|0)==(i|0)){break r}y[10172]=28;l=-1;}if(f){y[f>>2]=p;}return l|0}na();s();}function cc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,z=0;d=T-320|0;T=d;e=d+240|0;fa(e,c);ga(e,e,c);fa(a,e);ga(a,a,c);ga(a,a,b);gc(a,a);ga(a,a,e);ga(a,a,b);e=d+192|0;fa(e,a);ga(e,e,c);f=y[b+4>>2];n=y[b+8>>2];p=y[b+12>>2];q=y[b+16>>2];r=y[b+20>>2];s=y[b+24>>2];t=y[b+28>>2];u=y[b+32>>2];v=y[b>>2];c=y[d+192>>2];e=y[d+196>>2];g=y[d+200>>2];h=y[d+204>>2];i=y[d+208>>2];j=y[d+212>>2];k=y[d+216>>2];l=y[d+220>>2];m=y[d+224>>2];o=y[d+228>>2];x=y[b+36>>2];y[d+180>>2]=o-x;y[d+176>>2]=m-u;y[d+172>>2]=l-t;y[d+168>>2]=k-s;y[d+164>>2]=j-r;y[d+160>>2]=i-q;y[d+156>>2]=h-p;y[d+152>>2]=g-n;y[d+148>>2]=e-f;y[d+144>>2]=c-v;y[d+132>>2]=o+x;y[d+128>>2]=m+u;y[d+124>>2]=l+t;y[d+120>>2]=k+s;y[d+116>>2]=j+r;y[d+112>>2]=i+q;y[d+108>>2]=h+p;y[d+104>>2]=g+n;y[d+100>>2]=e+f;y[d+96>>2]=c+v;f=d+48|0;ga(f,b,1632);y[d+84>>2]=o+y[d+84>>2];y[d+80>>2]=m+y[d+80>>2];y[d+76>>2]=l+y[d+76>>2];y[d+72>>2]=k+y[d+72>>2];y[d+68>>2]=j+y[d+68>>2];y[d+64>>2]=i+y[d+64>>2];y[d+60>>2]=h+y[d+60>>2];y[d+56>>2]=g+y[d+56>>2];y[d+52>>2]=e+y[d+52>>2];y[d+48>>2]=c+y[d+48>>2];pa(d,d+144|0);p=ya(d,32);pa(d,d+96|0);n=ya(d,32);pa(d,f);b=ya(d,32);ga(d,a,1632);m=y[a+4>>2];l=y[a+8>>2];k=y[a+12>>2];j=y[a+16>>2];i=y[a+20>>2];h=y[a+24>>2];g=y[a+28>>2];e=y[a+32>>2];f=y[a>>2];q=y[d>>2];r=y[d+4>>2];s=y[d+8>>2];t=y[d+12>>2];u=y[d+16>>2];v=y[d+20>>2];o=y[d+24>>2];x=y[d+28>>2];z=y[d+32>>2];b=0-(b|n)|0;c=y[a+36>>2];c=b&(c^y[d+36>>2])^c;y[a+36>>2]=c;e=e^b&(e^z);y[a+32>>2]=e;g=g^b&(g^x);y[a+28>>2]=g;h=h^b&(h^o);y[a+24>>2]=h;i=i^b&(i^v);y[a+20>>2]=i;j=j^b&(j^u);y[a+16>>2]=j;k=k^b&(k^t);y[a+12>>2]=k;l=l^b&(l^s);y[a+8>>2]=l;m=m^b&(m^r);y[a+4>>2]=m;f=f^b&(f^q);y[a>>2]=f;pa(d+288|0,a);b=0-(w[d+288|0]&1)|0;y[a+36>>2]=c^b&(c^0-c);y[a+32>>2]=e^b&(e^0-e);y[a+28>>2]=g^b&(g^0-g);y[a+24>>2]=h^b&(h^0-h);y[a+20>>2]=i^b&(i^0-i);y[a+16>>2]=j^b&(j^0-j);y[a+12>>2]=k^b&(k^0-k);y[a+8>>2]=l^b&(l^0-l);y[a+4>>2]=m^b&(m^0-m);y[a>>2]=f^b&(f^0-f);T=d+320|0;return n|p}function ab(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0;c=T-320|0;T=c;A=a+40|0;cb(A,b);y[a+84>>2]=0;y[a+88>>2]=0;y[a+80>>2]=1;y[a+92>>2]=0;y[a+96>>2]=0;y[a+100>>2]=0;y[a+104>>2]=0;y[a+108>>2]=0;y[a+112>>2]=0;y[a+116>>2]=0;d=c+240|0;fa(d,A);e=c+192|0;ga(e,d,1584);y[c+192>>2]=y[c+192>>2]+1;f=y[c+240>>2]-1|0;y[c+240>>2]=f;g=y[c+244>>2];h=y[c+248>>2];i=y[c+252>>2];j=y[c+256>>2];k=y[c+260>>2];l=y[c+264>>2];m=y[c+268>>2];n=y[c+272>>2];o=y[c+276>>2];ga(a,d,e);gc(a,a);ga(a,d,a);d=c+144|0;fa(d,a);ga(d,d,e);d=y[c+180>>2];y[c+132>>2]=d-o;e=y[c+176>>2];y[c+128>>2]=e-n;p=y[c+172>>2];y[c+124>>2]=p-m;q=y[c+168>>2];y[c+120>>2]=q-l;r=y[c+164>>2];y[c+116>>2]=r-k;s=y[c+160>>2];y[c+112>>2]=s-j;t=y[c+156>>2];y[c+108>>2]=t-i;u=y[c+152>>2];y[c+104>>2]=u-h;v=y[c+148>>2];y[c+100>>2]=v-g;x=y[c+144>>2];y[c+96>>2]=x-f;y[c+84>>2]=d+o;y[c+80>>2]=e+n;y[c+76>>2]=m+p;y[c+72>>2]=l+q;y[c+68>>2]=k+r;y[c+64>>2]=j+s;y[c+60>>2]=i+t;y[c+56>>2]=h+u;y[c+52>>2]=g+v;y[c+48>>2]=f+x;pa(c,c+96|0);n=ya(c,32);pa(c,c+48|0);p=ya(c,32);ga(c,a,1632);m=y[a+4>>2];l=y[a+8>>2];k=y[a+12>>2];j=y[a+16>>2];i=y[a+20>>2];h=y[a+24>>2];g=y[a+28>>2];f=y[a+32>>2];o=y[a>>2];q=y[c>>2];r=y[c+4>>2];s=y[c+8>>2];t=y[c+12>>2];u=y[c+16>>2];v=y[c+20>>2];x=y[c+24>>2];B=y[c+28>>2];C=y[c+32>>2];d=n-1|0;e=y[a+36>>2];e=d&(e^y[c+36>>2])^e;y[a+36>>2]=e;f=f^d&(f^C);y[a+32>>2]=f;g=g^d&(g^B);y[a+28>>2]=g;h=h^d&(h^x);y[a+24>>2]=h;i=i^d&(i^v);y[a+20>>2]=i;j=j^d&(j^u);y[a+16>>2]=j;k=k^d&(k^t);y[a+12>>2]=k;l=l^d&(l^s);y[a+8>>2]=l;m=m^d&(m^r);y[a+4>>2]=m;d=o^d&(o^q);y[a>>2]=d;pa(c+288|0,a);b=0-(w[c+288|0]&1^z[b+31|0]>>>7^z[41218]>>>2)|0;y[a+36>>2]=e^b&(e^0-e);y[a+32>>2]=f^b&(f^0-f);y[a+28>>2]=g^b&(g^0-g);y[a+24>>2]=h^b&(h^0-h);y[a+20>>2]=i^b&(i^0-i);y[a+16>>2]=j^b&(j^0-j);y[a+12>>2]=k^b&(k^0-k);y[a+8>>2]=l^b&(l^0-l);y[a+4>>2]=m^b&(m^0-m);y[a>>2]=d^b&(d^0-d);ga(a+120|0,a,A);T=c+320|0;return (n|p)-1|0}function xa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;c=T-48|0;T=c;fa(a,b);fa(a+80|0,b+40|0);Oc(a+120|0,b+80|0);i=y[b+40>>2];e=y[b+44>>2];d=y[b+4>>2];f=y[b+48>>2];j=y[b+8>>2];g=y[b+52>>2];k=y[b+12>>2];h=y[b+56>>2];p=y[b+16>>2];l=y[b+60>>2];q=y[b+20>>2];m=y[b- -64>>2];r=y[b+24>>2];n=y[b+68>>2];s=y[b+28>>2];o=y[b+72>>2];t=y[b+32>>2];v=y[b>>2];y[a+76>>2]=y[b+76>>2]+y[b+36>>2];y[a+72>>2]=o+t;y[a+68>>2]=n+s;w=a- -64|0;y[w>>2]=m+r;y[a+60>>2]=l+q;y[a+56>>2]=h+p;y[a+52>>2]=g+k;y[a+48>>2]=f+j;y[a+44>>2]=e+d;b=a+40|0;y[b>>2]=i+v;fa(c,b);i=y[a+80>>2];e=y[a+4>>2];d=y[a+84>>2];f=y[a+8>>2];j=y[a+88>>2];g=y[a+12>>2];k=y[a+92>>2];h=y[a+16>>2];p=y[a+96>>2];l=y[a+20>>2];q=y[a+100>>2];m=y[a+24>>2];r=y[a+104>>2];n=y[a+28>>2];s=y[a+108>>2];o=y[a+32>>2];t=y[a+112>>2];v=y[a>>2];u=y[a+116>>2];x=y[a+36>>2];z=u-x|0;y[a+116>>2]=z;A=t-o|0;y[a+112>>2]=A;B=s-n|0;y[a+108>>2]=B;C=r-m|0;y[a+104>>2]=C;D=q-l|0;y[a+100>>2]=D;E=p-h|0;y[a+96>>2]=E;F=k-g|0;y[a+92>>2]=F;G=j-f|0;y[a+88>>2]=G;H=d-e|0;y[a+84>>2]=H;I=i-v|0;y[a+80>>2]=I;u=u+x|0;y[a+76>>2]=u;o=o+t|0;y[a+72>>2]=o;n=n+s|0;y[a+68>>2]=n;m=m+r|0;y[w>>2]=m;l=l+q|0;y[a+60>>2]=l;h=h+p|0;y[a+56>>2]=h;g=g+k|0;y[a+52>>2]=g;f=f+j|0;y[a+48>>2]=f;e=e+d|0;y[a+44>>2]=e;d=b;b=i+v|0;y[d>>2]=b;i=y[c>>2];d=y[c+4>>2];j=y[c+8>>2];k=y[c+12>>2];p=y[c+16>>2];q=y[c+20>>2];r=y[c+24>>2];s=y[c+28>>2];t=y[c+32>>2];y[a+36>>2]=y[c+36>>2]-u;y[a+32>>2]=t-o;y[a+28>>2]=s-n;y[a+24>>2]=r-m;y[a+20>>2]=q-l;y[a+16>>2]=p-h;y[a+12>>2]=k-g;y[a+8>>2]=j-f;y[a+4>>2]=d-e;y[a>>2]=i-b;b=y[a+120>>2];i=y[a+124>>2];e=y[a+128>>2];d=y[a+132>>2];f=y[a+136>>2];j=y[a+140>>2];g=y[a+144>>2];k=y[a+148>>2];h=y[a+152>>2];y[a+156>>2]=y[a+156>>2]-z;y[a+152>>2]=h-A;y[a+148>>2]=k-B;y[a+144>>2]=g-C;y[a+140>>2]=j-D;y[a+136>>2]=f-E;y[a+132>>2]=d-F;y[a+128>>2]=e-G;y[a+124>>2]=i-H;y[a+120>>2]=b-I;T=c+48|0;}function La(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=T-288|0;T=o;a:{if(!(c|d)){break a}h=y[a+36>>2];f=h;e=(d<<3|c>>>29)+f|0;g=y[a+32>>2];j=c<<3;i=g+j|0;y[a+32>>2]=i;y[a+36>>2]=j>>>0>i>>>0?e+1|0:e;h=a+40|0;k=((f&7)<<29|g>>>3)&63;g=k;j=64-g|0;e=0;r=0-(e+(g>>>0>64)|0)|0;g=r;if((d|0)==(g|0)&c>>>0>=j>>>0|d>>>0>g>>>0){s=j&3;f=0;g=0;b:{if(!e&(k^63)>>>0>=3|e){t=j&124;while(1){e=f+k|0;w[e+h|0]=z[b+f|0];i=f|1;e=k+i|0;w[e+h|0]=z[b+i|0];i=f|2;e=k+i|0;w[e+h|0]=z[b+i|0];i=f|3;e=k+i|0;w[e+h|0]=z[b+i|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((m|0)!=(t|0)|(q|0)!=(e|0)){continue}break}if(!(s|q)){break b}}while(1){e=f+k|0;w[e+h|0]=z[b+f|0];e=g;f=f+1|0;g=f?e:e+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((l|0)!=(s|0)|(q|0)!=(e|0)){continue}break}}n=o+256|0;Tb(a,h,o,n);b=b+j|0;d=d-((c>>>0>>0)+r|0)|0;c=c-j|0;if(!d&c>>>0>63|d){while(1){Tb(a,b,o,n);b=b- -64|0;g=d-1|0;c=c+-64|0;d=c>>>0<4294967232?g+1|0:g;if(!d&c>>>0>63|d){continue}break}}c:{if(!(c|d)){break c}i=c&3;j=0;l=0;n=0;f=0;g=0;if(!d&c>>>0>=4|d){m=c&60;p=0;c=0;d=0;while(1){w[f+h|0]=z[b+f|0];a=f|1;w[a+h|0]=z[a+b|0];a=f|2;w[a+h|0]=z[a+b|0];a=f|3;w[a+h|0]=z[a+b|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;e=d;c=c+4|0;e=c>>>0<4?e+1|0:e;d=e;if((c|0)!=(m|0)|(p|0)!=(e|0)){continue}break}if(!(j|i)){break c}}while(1){w[f+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((i|0)!=(l|0)|(j|0)!=(e|0)){continue}break}}ja(o,288);break a}q=c&3;i=0;f=0;g=0;if(!d&c>>>0>=4|d){j=c&-4;while(1){a=f+k|0;w[a+h|0]=z[b+f|0];c=f|1;a=k+c|0;w[a+h|0]=z[b+c|0];c=f|2;a=k+c|0;w[a+h|0]=z[b+c|0];c=f|3;a=k+c|0;w[a+h|0]=z[b+c|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((j|0)!=(m|0)|(d|0)!=(e|0)){continue}break}if(!(i|q)){break a}}while(1){a=f+k|0;w[a+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((l|0)!=(q|0)|(i|0)!=(e|0)){continue}break}}T=o+288|0;return 0}function Mc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-160|0;T=d;e=z[41218];y[a+4>>2]=0;y[a+8>>2]=0;y[a>>2]=1;y[a+12>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;y[a+36>>2]=0;y[a+40>>2]=1;y[a+52>>2]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=1;o(a+84|0,0,76);e=e>>>2^(c&128)>>>7;c=c-((0-e&c)<<1)|0;Ra(a,b,z[41218]>>>2^((c^1)&255)-1>>>31);Ra(a,b+160|0,z[41218]>>>2^((c^2)&255)-1>>>31);Ra(a,b+320|0,z[41218]>>>2^((c^3)&255)-1>>>31);Ra(a,b+480|0,z[41218]>>>2^((c^4)&255)-1>>>31);Ra(a,b+640|0,z[41218]>>>2^((c^5)&255)-1>>>31);Ra(a,b+800|0,z[41218]>>>2^((c^6)&255)-1>>>31);Ra(a,b+960|0,z[41218]>>>2^((c^7)&255)-1>>>31);Ra(a,b+1120|0,z[41218]>>>2^((c^8)&255)-1>>>31);b=y[a+76>>2];y[d+32>>2]=y[a+72>>2];y[d+36>>2]=b;b=a- -64|0;c=y[b+4>>2];y[d+24>>2]=y[b>>2];y[d+28>>2]=c;b=y[a+60>>2];y[d+16>>2]=y[a+56>>2];y[d+20>>2]=b;b=y[a+52>>2];y[d+8>>2]=y[a+48>>2];y[d+12>>2]=b;b=y[a+44>>2];y[d>>2]=y[a+40>>2];y[d+4>>2]=b;b=y[a+36>>2];y[d+72>>2]=y[a+32>>2];y[d+76>>2]=b;b=y[a+28>>2];y[d+64>>2]=y[a+24>>2];y[d+68>>2]=b;b=y[a+20>>2];y[d+56>>2]=y[a+16>>2];y[d+60>>2]=b;b=y[a+12>>2];y[d+48>>2]=y[a+8>>2];y[d+52>>2]=b;b=y[a+4>>2];y[d+40>>2]=y[a>>2];y[d+44>>2]=b;b=y[a+92>>2];y[d+88>>2]=y[a+88>>2];y[d+92>>2]=b;b=y[a+84>>2];y[d+80>>2]=y[a+80>>2];y[d+84>>2]=b;b=y[a+100>>2];y[d+96>>2]=y[a+96>>2];y[d+100>>2]=b;b=y[a+108>>2];y[d+104>>2]=y[a+104>>2];y[d+108>>2]=b;b=y[a+116>>2];y[d+112>>2]=y[a+112>>2];y[d+116>>2]=b;b=y[a+120>>2];c=y[a+124>>2];f=y[a+128>>2];g=y[a+132>>2];h=y[a+136>>2];i=y[a+140>>2];j=y[a+144>>2];k=y[a+148>>2];l=y[a+152>>2];y[d+156>>2]=0-y[a+156>>2];y[d+152>>2]=0-l;y[d+148>>2]=0-k;y[d+144>>2]=0-j;y[d+140>>2]=0-i;y[d+136>>2]=0-h;y[d+132>>2]=0-g;y[d+128>>2]=0-f;y[d+124>>2]=0-c;y[d+120>>2]=0-b;Ra(a,d,e);T=d+160|0;}function lc(a,b,c,d,e,f){var g=0;y[f>>2]=8;a:{b:{g=a;a=!b&a>>>0<=32768;g=a?32768:g;c:{d:{a=a?0:b;if(!a&c>>>5>>>0<=g>>>0|a){if(c>>>0>=4096){break d}b=1;break c}y[e>>2]=1;b=(g>>>0)/(y[f>>2]<<2>>>0)|0;a=1;if(b>>>0<4){break a}a=2;if(b>>>0<8){break a}if(b>>>0<16){y[d>>2]=3;return}if(b>>>0<32){y[d>>2]=4;return}if(b>>>0<64){y[d>>2]=5;return}if(b>>>0<128){y[d>>2]=6;return}if(b>>>0<256){y[d>>2]=7;return}if(b>>>0<512){y[d>>2]=8;return}if(b>>>0<1024){y[d>>2]=9;return}if(b>>>0<2048){y[d>>2]=10;return}if(b>>>0<4096){y[d>>2]=11;return}if(b>>>0<8192){y[d>>2]=12;return}if(b>>>0<16384){y[d>>2]=13;return}if(b>>>0<32768){y[d>>2]=14;return}if(b>>>0<65536){y[d>>2]=15;return}if(b>>>0<131072){y[d>>2]=16;return}if(b>>>0<262144){y[d>>2]=17;return}if(b>>>0<524288){y[d>>2]=18;return}if(b>>>0<1048576){y[d>>2]=19;return}if(b>>>0<2097152){y[d>>2]=20;return}if(b>>>0<4194304){y[d>>2]=21;return}if(b>>>0<8388608){y[d>>2]=22;return}if(b>>>0<16777216){y[d>>2]=23;return}if(b>>>0>=33554432){break b}y[d>>2]=24;return}b=2;if(c>>>0<8192){break c}b=3;if(c>>>0<16384){break c}b=4;if(c>>>0<32768){break c}b=5;if(c>>>0<65536){break c}b=6;if(c>>>0<131072){break c}b=7;if(c>>>0<262144){break c}b=8;if(c>>>0<524288){break c}b=9;if(c>>>0<1048576){break c}b=10;if(c>>>0<2097152){break c}b=11;if(c>>>0<4194304){break c}b=12;if(c>>>0<8388608){break c}b=13;if(c>>>0<16777216){break c}b=14;if(c>>>0<33554432){break c}b=15;if(c>>>0<67108864){break c}b=16;if(c>>>0<134217728){break c}b=17;if(c>>>0<268435456){break c}b=18;if(c>>>0<536870912){break c}b=19;if(c>>>0<1073741824){break c}b=(c|0)>=0?20:21;}c=b;y[d>>2]=c;b=a;a=b>>>2|0;b=(b&3)<<30|g>>>2;d=c&31;if((c&63)>>>0>=32){c=0;a=a>>>d|0;}else {c=a>>>d|0;a=((1<>>d;}y[e>>2]=((!c&a>>>0>=1073741823|c?1073741823:a)>>>0)/B[f>>2];return}a=b>>>0<67108864?25:26;}y[d>>2]=a;}function Re(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=T-112|0;T=i;if(c|d){j=z[h+28|0]|z[h+29|0]<<8|(z[h+30|0]<<16|z[h+31|0]<<24);y[i+24>>2]=z[h+24|0]|z[h+25|0]<<8|(z[h+26|0]<<16|z[h+27|0]<<24);y[i+28>>2]=j;j=z[h+20|0]|z[h+21|0]<<8|(z[h+22|0]<<16|z[h+23|0]<<24);y[i+16>>2]=z[h+16|0]|z[h+17|0]<<8|(z[h+18|0]<<16|z[h+19|0]<<24);y[i+20>>2]=j;j=z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24);y[i+8>>2]=z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24);y[i+12>>2]=j;j=z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24);y[i>>2]=z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24);y[i+4>>2]=j;h=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[i+96>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[i+100>>2]=h;w[i+104|0]=f;w[i+111|0]=g>>>24;w[i+110|0]=g>>>16;w[i+109|0]=g>>>8;w[i+108|0]=g;w[i+107|0]=(g&16777215)<<8|f>>>24;w[i+106|0]=(g&65535)<<16|f>>>16;w[i+105|0]=(g&255)<<24|f>>>8;a:{if(!d&c>>>0>=64|d){while(1){h=0;vb(i+32|0,i+96|0,i,0);while(1){f=i+32|0;w[a+h|0]=z[f+h|0]^z[b+h|0];e=h|1;w[e+a|0]=z[e+f|0]^z[b+e|0];h=h+2|0;if((h|0)!=64){continue}break}e=z[i+104|0]+1|0;w[i+104|0]=e;e=z[i+105|0]+(e>>>8|0)|0;w[i+105|0]=e;e=z[i+106|0]+(e>>>8|0)|0;w[i+106|0]=e;e=z[i+107|0]+(e>>>8|0)|0;w[i+107|0]=e;e=z[i+108|0]+(e>>>8|0)|0;w[i+108|0]=e;e=z[i+109|0]+(e>>>8|0)|0;w[i+109|0]=e;e=z[i+110|0]+(e>>>8|0)|0;w[i+110|0]=e;w[i+111|0]=z[i+111|0]+(e>>>8|0);b=b- -64|0;a=a- -64|0;d=d-1|0;c=c+-64|0;d=c>>>0<4294967232?d+1|0:d;if(!d&c>>>0>63|d){continue}break}if(!(c|d)){break a}}h=0;vb(i+32|0,i+96|0,i,0);if((c|0)!=1|d){d=c&1;f=c&62;e=0;while(1){g=i+32|0;w[a+h|0]=z[g+h|0]^z[b+h|0];c=h|1;w[c+a|0]=z[c+g|0]^z[b+c|0];h=h+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}if(!d){break a}}w[a+h|0]=z[(i+32|0)+h|0]^z[b+h|0];}ja(i+32|0,64);ja(i,32);}T=i+112|0;return 0}function Xd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=T-192|0;T=d;za(d,32);rb(b,d,32,0);w[b|0]=z[b|0]&248;w[b+31|0]=z[b+31|0]&63|64;e=d+32|0;jb(e,b);Wa(a,e);f=d;e=y[d+28>>2];d=y[d+24>>2];w[b+24|0]=d;w[b+25|0]=d>>>8;w[b+26|0]=d>>>16;w[b+27|0]=d>>>24;w[b+28|0]=e;w[b+29|0]=e>>>8;w[b+30|0]=e>>>16;w[b+31|0]=e>>>24;e=y[f+20>>2];d=y[f+16>>2];w[b+16|0]=d;w[b+17|0]=d>>>8;w[b+18|0]=d>>>16;w[b+19|0]=d>>>24;w[b+20|0]=e;w[b+21|0]=e>>>8;w[b+22|0]=e>>>16;w[b+23|0]=e>>>24;e=y[f+12>>2];d=y[f+8>>2];w[b+8|0]=d;w[b+9|0]=d>>>8;w[b+10|0]=d>>>16;w[b+11|0]=d>>>24;w[b+12|0]=e;w[b+13|0]=e>>>8;w[b+14|0]=e>>>16;w[b+15|0]=e>>>24;e=y[f+4>>2];d=y[f>>2];w[b|0]=d;w[b+1|0]=d>>>8;w[b+2|0]=d>>>16;w[b+3|0]=d>>>24;w[b+4|0]=e;w[b+5|0]=e>>>8;w[b+6|0]=e>>>16;w[b+7|0]=e>>>24;c=a;g=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);h=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);i=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);e=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);d=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);a=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);j=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);c=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);w[b+56|0]=c;w[b+57|0]=c>>>8;w[b+58|0]=c>>>16;w[b+59|0]=c>>>24;w[b+60|0]=j;w[b+61|0]=j>>>8;w[b+62|0]=j>>>16;w[b+63|0]=j>>>24;w[b+48|0]=d;w[b+49|0]=d>>>8;w[b+50|0]=d>>>16;w[b+51|0]=d>>>24;w[b+52|0]=a;w[b+53|0]=a>>>8;w[b+54|0]=a>>>16;w[b+55|0]=a>>>24;w[b+40|0]=i;w[b+41|0]=i>>>8;w[b+42|0]=i>>>16;w[b+43|0]=i>>>24;w[b+44|0]=e;w[b+45|0]=e>>>8;w[b+46|0]=e>>>16;w[b+47|0]=e>>>24;w[b+32|0]=g;w[b+33|0]=g>>>8;w[b+34|0]=g>>>16;w[b+35|0]=g>>>24;w[b+36|0]=h;w[b+37|0]=h>>>8;w[b+38|0]=h>>>16;w[b+39|0]=h>>>24;ja(f,32);T=f+192|0;return 0}function te(a,b){a=a|0;b=b|0;var c=0,d=0;d=T+-64|0;T=d;c=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);y[d+56>>2]=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);y[d+60>>2]=c;c=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);y[d+48>>2]=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);y[d+52>>2]=c;c=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);y[d+40>>2]=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);y[d+44>>2]=c;c=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);y[d+32>>2]=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);y[d+36>>2]=c;c=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+24>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+28>>2]=c;c=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+16>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+20>>2]=c;c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+8>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+12>>2]=c;c=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[d>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+4>>2]=c;Pa(d);b=y[d+28>>2];c=y[d+24>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[d+20>>2];c=y[d+16>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[d+12>>2];c=y[d+8>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[d+4>>2];c=y[d>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;ja(d,64);T=d- -64|0;}function Xa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-96|0;T=d;if(c>>>0>=65){Ub(a);La(a,b,c,0);Ua(a,d);c=32;b=d;}Ub(a);y[d+88>>2]=909522486;y[d+92>>2]=909522486;y[d+80>>2]=909522486;y[d+84>>2]=909522486;y[d+72>>2]=909522486;y[d+76>>2]=909522486;y[d+64>>2]=909522486;y[d+68>>2]=909522486;y[d+56>>2]=909522486;y[d+60>>2]=909522486;y[d+48>>2]=909522486;y[d+52>>2]=909522486;y[d+40>>2]=909522486;y[d+44>>2]=909522486;y[d+32>>2]=909522486;y[d+36>>2]=909522486;a:{if(!c){break a}k=c&3;if(c>>>0>=4){g=c&124;while(1){h=d+32|0;f=h+e|0;w[f|0]=z[f|0]^z[b+e|0];f=e|1;l=f+h|0;w[l|0]=z[l|0]^z[b+f|0];f=e|2;l=f+h|0;w[l|0]=z[l|0]^z[b+f|0];f=h;h=e|3;f=f+h|0;w[f|0]=z[f|0]^z[b+h|0];e=e+4|0;i=i+4|0;if((g|0)!=(i|0)){continue}break}if(!k){break a}}while(1){i=(d+32|0)+e|0;w[i|0]=z[i|0]^z[b+e|0];e=e+1|0;j=j+1|0;if((k|0)!=(j|0)){continue}break}}La(a,d+32|0,64,0);k=a+104|0;Ub(k);y[d+88>>2]=1549556828;y[d+92>>2]=1549556828;y[d+80>>2]=1549556828;y[d+84>>2]=1549556828;y[d+72>>2]=1549556828;y[d+76>>2]=1549556828;y[d+64>>2]=1549556828;y[d+68>>2]=1549556828;y[d+56>>2]=1549556828;y[d+60>>2]=1549556828;y[d+48>>2]=1549556828;y[d+52>>2]=1549556828;y[d+40>>2]=1549556828;y[d+44>>2]=1549556828;y[d+32>>2]=1549556828;y[d+36>>2]=1549556828;b:{if(!c){break b}h=c&3;j=0;e=0;if(c>>>0>=4){c=c&124;i=0;while(1){a=d+32|0;g=a+e|0;w[g|0]=z[g|0]^z[b+e|0];g=e|1;f=g+a|0;w[f|0]=z[f|0]^z[b+g|0];g=e|2;f=g+a|0;w[f|0]=z[f|0]^z[b+g|0];f=a;a=e|3;g=f+a|0;w[g|0]=z[g|0]^z[a+b|0];e=e+4|0;i=i+4|0;if((c|0)!=(i|0)){continue}break}if(!h){break b}}while(1){a=(d+32|0)+e|0;w[a|0]=z[a|0]^z[b+e|0];e=e+1|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}a=d+32|0;La(k,a,64,0);ja(a,64);ja(d,32);T=d+96|0;return 0}function Wb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(b-65>>>0<4294967232|g>>>0>64){a=-1;}else {h=T;m=h;h=h-512&-64;T=h;a:{b:{if(!(!(d|e)|c)|(!a|(b-65&255)>>>0<=191)|(!(g?f:1)|g>>>0>=65)){break b}c:{if(g){if(!f){break b}o(h- -64|0,0,293);y[h+56>>2]=327033209;y[h+60>>2]=1541459225;y[h+48>>2]=-79577749;y[h+52>>2]=528734635;y[h+40>>2]=725511199;y[h+44>>2]=-1694144372;y[h+32>>2]=-1377402159;y[h+36>>2]=1359893119;y[h+24>>2]=1595750129;y[h+28>>2]=-1521486534;y[h+16>>2]=-23791573;y[h+20>>2]=1013904242;y[h+8>>2]=-2067093701;y[h+12>>2]=-1150833019;y[h>>2]=(g<<8|b)^-222443256;y[h+4>>2]=g>>>24^1779033703;j=128;i=128-g|0;if(i){o((h+384|0)+g|0,0,i);}if(g){t(h+384|0,f,g);}f=h+384|0;t(h+96|0,f,128);y[h+352>>2]=128;ja(f,128);break c}o(h- -64|0,0,293);y[h+56>>2]=327033209;y[h+60>>2]=1541459225;y[h+48>>2]=-79577749;y[h+52>>2]=528734635;y[h+40>>2]=725511199;y[h+44>>2]=-1694144372;y[h+32>>2]=-1377402159;y[h+36>>2]=1359893119;y[h+24>>2]=1595750129;y[h+28>>2]=-1521486534;y[h+16>>2]=-23791573;y[h+20>>2]=1013904242;y[h+8>>2]=-2067093701;y[h+12>>2]=-1150833019;y[h>>2]=b^-222443256;y[h+4>>2]=1779033703;}if(d|e){l=h+96|0;f=256-j|0;if(!e&d>>>0>f>>>0|e){n=h+224|0;while(1){if(f){t(j+l|0,c,f);}y[h+352>>2]=y[h+352>>2]+f;g=y[h+68>>2];j=g;i=y[h+64>>2];k=i+128|0;g=k>>>0<128?g+1|0:g;y[h+64>>2]=k;y[h+68>>2]=g;g=y[h+76>>2];i=(j|0)==-1&i>>>0>4294967167;j=i;i=i+y[h+72>>2]|0;g=j>>>0>i>>>0?g+1|0:g;y[h+72>>2]=i;y[h+76>>2]=g;Eb(h,l);t(l,n,128);k=y[h+352>>2];j=k-128|0;y[h+352>>2]=j;c=c+f|0;g=f;i=d-g|0;e=e-(d>>>0>>0)|0;f=384-k|0;d=i;if(!e&f>>>0>>0|e){continue}break}}if(d){t(j+l|0,c,d);}y[h+352>>2]=d+y[h+352>>2];}Cc(h,a,b);T=m;break a}na();s();}a=0;}return a}function _e(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T-112|0;T=g;h=c;if(d|c){c=z[f+28|0]|z[f+29|0]<<8|(z[f+30|0]<<16|z[f+31|0]<<24);y[g+24>>2]=z[f+24|0]|z[f+25|0]<<8|(z[f+26|0]<<16|z[f+27|0]<<24);y[g+28>>2]=c;c=z[f+20|0]|z[f+21|0]<<8|(z[f+22|0]<<16|z[f+23|0]<<24);y[g+16>>2]=z[f+16|0]|z[f+17|0]<<8|(z[f+18|0]<<16|z[f+19|0]<<24);y[g+20>>2]=c;c=z[f+12|0]|z[f+13|0]<<8|(z[f+14|0]<<16|z[f+15|0]<<24);y[g+8>>2]=z[f+8|0]|z[f+9|0]<<8|(z[f+10|0]<<16|z[f+11|0]<<24);y[g+12>>2]=c;c=z[f+4|0]|z[f+5|0]<<8|(z[f+6|0]<<16|z[f+7|0]<<24);y[g>>2]=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);y[g+4>>2]=c;c=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[g+104>>2]=0;y[g+108>>2]=0;y[g+96>>2]=c;y[g+100>>2]=e;a:{if(!d&h>>>0>=64|d){while(1){c=0;ub(g+32|0,g+96|0,g,0);while(1){f=g+32|0;w[a+c|0]=z[f+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+f|0]^z[b+e|0];c=c+2|0;if((c|0)!=64){continue}break}c=z[g+104|0]+1|0;w[g+104|0]=c;c=z[g+105|0]+(c>>>8|0)|0;w[g+105|0]=c;c=z[g+106|0]+(c>>>8|0)|0;w[g+106|0]=c;c=z[g+107|0]+(c>>>8|0)|0;w[g+107|0]=c;c=z[g+108|0]+(c>>>8|0)|0;w[g+108|0]=c;c=z[g+109|0]+(c>>>8|0)|0;w[g+109|0]=c;c=z[g+110|0]+(c>>>8|0)|0;w[g+110|0]=c;w[g+111|0]=z[g+111|0]+(c>>>8|0);b=b- -64|0;a=a- -64|0;d=d-1|0;h=h+-64|0;d=h>>>0<4294967232?d+1|0:d;if(!d&h>>>0>63|d){continue}break}if(!(d|h)){break a}}c=0;ub(g+32|0,g+96|0,g,0);if((h|0)!=1|d){f=h&1;h=h&62;d=0;while(1){i=g+32|0;w[a+c|0]=z[i+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+i|0]^z[b+e|0];c=c+2|0;d=d+2|0;if((h|0)!=(d|0)){continue}break}if(!f){break a}}w[a+c|0]=z[(g+32|0)+c|0]^z[b+c|0];}ja(g+32|0,64);ja(g,32);}T=g+112|0;return 0}function Ye(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T-112|0;T=g;h=c;if(d|c){c=z[f+28|0]|z[f+29|0]<<8|(z[f+30|0]<<16|z[f+31|0]<<24);y[g+24>>2]=z[f+24|0]|z[f+25|0]<<8|(z[f+26|0]<<16|z[f+27|0]<<24);y[g+28>>2]=c;c=z[f+20|0]|z[f+21|0]<<8|(z[f+22|0]<<16|z[f+23|0]<<24);y[g+16>>2]=z[f+16|0]|z[f+17|0]<<8|(z[f+18|0]<<16|z[f+19|0]<<24);y[g+20>>2]=c;c=z[f+12|0]|z[f+13|0]<<8|(z[f+14|0]<<16|z[f+15|0]<<24);y[g+8>>2]=z[f+8|0]|z[f+9|0]<<8|(z[f+10|0]<<16|z[f+11|0]<<24);y[g+12>>2]=c;c=z[f+4|0]|z[f+5|0]<<8|(z[f+6|0]<<16|z[f+7|0]<<24);y[g>>2]=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);y[g+4>>2]=c;c=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[g+104>>2]=0;y[g+108>>2]=0;y[g+96>>2]=c;y[g+100>>2]=e;a:{if(!d&h>>>0>=64|d){while(1){c=0;tb(g+32|0,g+96|0,g,0);while(1){f=g+32|0;w[a+c|0]=z[f+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+f|0]^z[b+e|0];c=c+2|0;if((c|0)!=64){continue}break}c=z[g+104|0]+1|0;w[g+104|0]=c;c=z[g+105|0]+(c>>>8|0)|0;w[g+105|0]=c;c=z[g+106|0]+(c>>>8|0)|0;w[g+106|0]=c;c=z[g+107|0]+(c>>>8|0)|0;w[g+107|0]=c;c=z[g+108|0]+(c>>>8|0)|0;w[g+108|0]=c;c=z[g+109|0]+(c>>>8|0)|0;w[g+109|0]=c;c=z[g+110|0]+(c>>>8|0)|0;w[g+110|0]=c;w[g+111|0]=z[g+111|0]+(c>>>8|0);b=b- -64|0;a=a- -64|0;d=d-1|0;h=h+-64|0;d=h>>>0<4294967232?d+1|0:d;if(!d&h>>>0>63|d){continue}break}if(!(d|h)){break a}}c=0;tb(g+32|0,g+96|0,g,0);if((h|0)!=1|d){f=h&1;h=h&62;d=0;while(1){i=g+32|0;w[a+c|0]=z[i+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+i|0]^z[b+e|0];c=c+2|0;d=d+2|0;if((h|0)!=(d|0)){continue}break}if(!f){break a}}w[a+c|0]=z[(g+32|0)+c|0]^z[b+c|0];}ja(g+32|0,64);ja(g,32);}T=g+112|0;return 0}function ve(a,b){a=a|0;b=b|0;var c=0,d=0;c=T-128|0;T=c;y[c+64>>2]=0;y[c+68>>2]=0;y[c+72>>2]=0;y[c+76>>2]=0;y[c+80>>2]=0;y[c+84>>2]=0;y[c+88>>2]=0;y[c+92>>2]=0;w[c+64|0]=1;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;y[c+56>>2]=0;y[c+60>>2]=0;d=y[9821];y[c+96>>2]=y[9820];y[c+100>>2]=d;d=y[9823];y[c+104>>2]=y[9822];y[c+108>>2]=d;d=y[9825];y[c+112>>2]=y[9824];y[c+116>>2]=d;d=y[9827];y[c+120>>2]=y[9826];y[c+124>>2]=d;d=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[c+24>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[c+28>>2]=d;d=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[c+16>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[c+20>>2]=d;d=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[c+8>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[c+12>>2]=d;d=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[c>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[c+4>>2]=d;b=c- -64|0;Ec(b,c);Pa(b);d=y[c+92>>2];b=y[c+88>>2];w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;w[a+28|0]=d;w[a+29|0]=d>>>8;w[a+30|0]=d>>>16;w[a+31|0]=d>>>24;d=y[c+84>>2];b=y[c+80>>2];w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+20|0]=d;w[a+21|0]=d>>>8;w[a+22|0]=d>>>16;w[a+23|0]=d>>>24;d=y[c+76>>2];b=y[c+72>>2];w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;w[a+12|0]=d;w[a+13|0]=d>>>8;w[a+14|0]=d>>>16;w[a+15|0]=d>>>24;d=y[c+68>>2];b=y[c+64>>2];w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;T=c+128|0;} +function Ze(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-112|0;T=f;h=b;g=c;if(b|g){b=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+24>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);y[f+28>>2]=b;b=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+16>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+20>>2]=b;b=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+8>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+12>>2]=b;b=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+4>>2]=b;b=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);c=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+104>>2]=0;y[f+108>>2]=0;y[f+96>>2]=b;y[f+100>>2]=c;a:{if(!g&h>>>0>=64|g){while(1){tb(a,f+96|0,f,0);b=z[f+104|0]+1|0;w[f+104|0]=b;b=z[f+105|0]+(b>>>8|0)|0;w[f+105|0]=b;b=z[f+106|0]+(b>>>8|0)|0;w[f+106|0]=b;b=z[f+107|0]+(b>>>8|0)|0;w[f+107|0]=b;b=z[f+108|0]+(b>>>8|0)|0;w[f+108|0]=b;b=z[f+109|0]+(b>>>8|0)|0;w[f+109|0]=b;b=z[f+110|0]+(b>>>8|0)|0;w[f+110|0]=b;w[f+111|0]=z[f+111|0]+(b>>>8|0);a=a- -64|0;g=g-1|0;h=h+-64|0;g=h>>>0<4294967232?g+1|0:g;if(!g&h>>>0>63|g){continue}break}if(!(g|h)){break a}}c=0;tb(f+32|0,f+96|0,f,0);d=h&3;b=0;if(!g&h>>>0>=4|g){h=h&60;e=0;while(1){g=f+32|0;w[a+b|0]=z[g+b|0];i=b|1;w[i+a|0]=z[g+i|0];i=b|2;w[i+a|0]=z[g+i|0];i=b|3;w[i+a|0]=z[g+i|0];b=b+4|0;e=e+4|0;if((h|0)!=(e|0)){continue}break}if(!d){break a}}while(1){w[a+b|0]=z[(f+32|0)+b|0];b=b+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}ja(f+32|0,64);ja(f,32);}T=f+112|0;return 0}function Se(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=T-112|0;T=f;if(b|c){g=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+24>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);y[f+28>>2]=g;g=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+16>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+20>>2]=g;g=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+8>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+12>>2]=g;g=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+4>>2]=g;e=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);d=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+104>>2]=0;y[f+108>>2]=0;y[f+96>>2]=e;y[f+100>>2]=d;a:{if(!c&b>>>0>=64|c){while(1){vb(a,f+96|0,f,0);d=z[f+104|0]+1|0;w[f+104|0]=d;d=z[f+105|0]+(d>>>8|0)|0;w[f+105|0]=d;d=z[f+106|0]+(d>>>8|0)|0;w[f+106|0]=d;d=z[f+107|0]+(d>>>8|0)|0;w[f+107|0]=d;d=z[f+108|0]+(d>>>8|0)|0;w[f+108|0]=d;d=z[f+109|0]+(d>>>8|0)|0;w[f+109|0]=d;d=z[f+110|0]+(d>>>8|0)|0;w[f+110|0]=d;w[f+111|0]=z[f+111|0]+(d>>>8|0);a=a- -64|0;c=c-1|0;b=b+-64|0;c=b>>>0<4294967232?c+1|0:c;if(!c&b>>>0>63|c){continue}break}if(!(b|c)){break a}}d=0;vb(f+32|0,f+96|0,f,0);g=b&3;e=0;if(!c&b>>>0>=4|c){c=b&60;b=0;while(1){j=f+32|0;h=j;w[a+e|0]=z[h+e|0];i=e|1;w[i+a|0]=z[h+i|0];i=e|2;w[i+a|0]=z[h+i|0];h=e|3;w[h+a|0]=z[h+j|0];e=e+4|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!g){break a}}while(1){w[a+e|0]=z[(f+32|0)+e|0];e=e+1|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}}ja(f+32|0,64);ja(f,32);}T=f+112|0;return 0}function $e(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-112|0;T=f;h=b;g=c;if(b|g){b=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+24>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);y[f+28>>2]=b;b=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+16>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+20>>2]=b;b=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+8>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+12>>2]=b;b=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+4>>2]=b;b=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);c=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+104>>2]=0;y[f+108>>2]=0;y[f+96>>2]=b;y[f+100>>2]=c;a:{if(!g&h>>>0>=64|g){while(1){ub(a,f+96|0,f,0);b=z[f+104|0]+1|0;w[f+104|0]=b;b=z[f+105|0]+(b>>>8|0)|0;w[f+105|0]=b;b=z[f+106|0]+(b>>>8|0)|0;w[f+106|0]=b;b=z[f+107|0]+(b>>>8|0)|0;w[f+107|0]=b;b=z[f+108|0]+(b>>>8|0)|0;w[f+108|0]=b;b=z[f+109|0]+(b>>>8|0)|0;w[f+109|0]=b;b=z[f+110|0]+(b>>>8|0)|0;w[f+110|0]=b;w[f+111|0]=z[f+111|0]+(b>>>8|0);a=a- -64|0;g=g-1|0;h=h+-64|0;g=h>>>0<4294967232?g+1|0:g;if(!g&h>>>0>63|g){continue}break}if(!(g|h)){break a}}c=0;ub(f+32|0,f+96|0,f,0);d=h&3;b=0;if(!g&h>>>0>=4|g){h=h&60;e=0;while(1){g=f+32|0;w[a+b|0]=z[g+b|0];i=b|1;w[i+a|0]=z[g+i|0];i=b|2;w[i+a|0]=z[g+i|0];i=b|3;w[i+a|0]=z[g+i|0];b=b+4|0;e=e+4|0;if((h|0)!=(e|0)){continue}break}if(!d){break a}}while(1){w[a+b|0]=z[(f+32|0)+b|0];b=b+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}ja(f+32|0,64);ja(f,32);}T=f+112|0;return 0}function we(a,b){a=a|0;b=b|0;var c=0,d=0;c=T-128|0;T=c;y[c+64>>2]=0;y[c+68>>2]=0;y[c+72>>2]=0;y[c+76>>2]=0;y[c+80>>2]=0;y[c+84>>2]=0;y[c+88>>2]=0;y[c+92>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;y[c+56>>2]=0;y[c+60>>2]=0;d=y[9821];y[c+96>>2]=y[9820];y[c+100>>2]=d;d=y[9823];y[c+104>>2]=y[9822];y[c+108>>2]=d;d=y[9825];y[c+112>>2]=y[9824];y[c+116>>2]=d;d=y[9827];y[c+120>>2]=y[9826];y[c+124>>2]=d;d=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[c>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[c+4>>2]=d;d=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[c+8>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[c+12>>2]=d;d=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[c+16>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[c+20>>2]=d;d=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[c+24>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[c+28>>2]=d;b=c- -64|0;Ec(b,c);Pa(b);d=y[c+92>>2];b=y[c+88>>2];w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;w[a+28|0]=d;w[a+29|0]=d>>>8;w[a+30|0]=d>>>16;w[a+31|0]=d>>>24;d=y[c+84>>2];b=y[c+80>>2];w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+20|0]=d;w[a+21|0]=d>>>8;w[a+22|0]=d>>>16;w[a+23|0]=d>>>24;d=y[c+76>>2];b=y[c+72>>2];w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;w[a+12|0]=d;w[a+13|0]=d>>>8;w[a+14|0]=d>>>16;w[a+15|0]=d>>>24;d=y[c+68>>2];b=y[c+64>>2];w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;T=c+128|0;}function kc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:{g=y[a+56>>2];e=y[a+60>>2];if(g|e){h=16-g|0;k=h;f=0-((g>>>0>16)+e|0)|0;h=(f|0)==(d|0)&c>>>0>h>>>0|d>>>0>f>>>0;j=h?k:c;h=h?f:d;k=h;if(h|j){p=j&3;h=a- -64|0;f=0;g=0;b:{if(!k&j>>>0>=4|k){l=j&-4;while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];m=f|1;e=m+y[a+56>>2]|0;w[e+h|0]=z[b+m|0];m=f|2;e=m+y[a+56>>2]|0;w[e+h|0]=z[b+m|0];m=f|3;e=m+y[a+56>>2]|0;w[e+h|0]=z[b+m|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;n=n+4|0;i=n>>>0<4?i+1|0:i;if((l|0)!=(n|0)|(i|0)!=(k|0)){continue}break}if(!(p|r)){break b}}while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];e=g;f=f+1|0;g=f?e:e+1|0;e=q;o=o+1|0;e=o?e:e+1|0;q=e;if((o|0)!=(p|0)|(r|0)!=(e|0)){continue}break}}g=y[a+56>>2];e=y[a+60>>2];}i=e+k|0;g=g+j|0;i=g>>>0>>0?i+1|0:i;y[a+56>>2]=g;y[a+60>>2]=i;if(!i&g>>>0<16){break a}hc(a,a- -64|0,16,0);y[a+56>>2]=0;y[a+60>>2]=0;g=c;c=g-j|0;d=d-((g>>>0>>0)+k|0)|0;b=b+j|0;}if(!d&c>>>0>=16|d){g=c&-16;hc(a,b,g,d);c=c&15;d=0;b=b+g|0;}if(!(c|d)){break a}j=c&3;k=0;h=a- -64|0;o=0;q=0;f=0;g=0;c:{if(!d&c>>>0>=4|d){p=c&12;n=0;i=0;while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];l=f|1;e=l+y[a+56>>2]|0;w[e+h|0]=z[b+l|0];l=f|2;e=l+y[a+56>>2]|0;w[e+h|0]=z[b+l|0];l=f|3;e=l+y[a+56>>2]|0;w[e+h|0]=z[b+l|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;n=n+4|0;i=n>>>0<4?i+1|0:i;if((n|0)!=(p|0)|(i|0)!=(r|0)){continue}break}if(!(j|k)){break c}}while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=q;o=o+1|0;e=o?e:e+1|0;q=e;if((j|0)!=(o|0)|(k|0)!=(e|0)){continue}break}}i=d+y[a+60>>2]|0;b=c+y[a+56>>2]|0;i=b>>>0>>0?i+1|0:i;y[a+56>>2]=b;y[a+60>>2]=i;}}function Ua(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=T-288|0;T=e;f=a+40|0;c=y[a+32>>2]>>>3&63;d=f+c|0;a:{if(c>>>0>=56){c=64-c|0;if(c){t(d,39616,c);}Tb(a,f,e,e+256|0);c=f;y[c+48>>2]=0;y[c+52>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+24>>2]=0;y[c+28>>2]=0;y[c+16>>2]=0;y[c+20>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;y[c>>2]=0;y[c+4>>2]=0;break a}c=56-c|0;if(!c){break a}t(d,39616,c);}d=y[a+32>>2];c=d&16711680;h=c>>>8|0;g=c<<24;c=d&-16777216;i=c>>>24|0;g=g|c<<8;c=y[a+36>>2];y[a+96>>2]=g|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));c=h|i|(d<<24|(d&65280)<<8);y[a+100>>2]=c;Tb(a,f,e,e+256|0);c=y[a>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b|0]=c;w[b+1|0]=c>>>8;w[b+2|0]=c>>>16;w[b+3|0]=c>>>24;c=y[a+4>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;c=y[a+8>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+8|0]=c;w[b+9|0]=c>>>8;w[b+10|0]=c>>>16;w[b+11|0]=c>>>24;c=y[a+12>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+12|0]=c;w[b+13|0]=c>>>8;w[b+14|0]=c>>>16;w[b+15|0]=c>>>24;c=y[a+16>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+16|0]=c;w[b+17|0]=c>>>8;w[b+18|0]=c>>>16;w[b+19|0]=c>>>24;c=y[a+20>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;c=y[a+24>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+24|0]=c;w[b+25|0]=c>>>8;w[b+26|0]=c>>>16;w[b+27|0]=c>>>24;c=y[a+28>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+28|0]=c;w[b+29|0]=c>>>8;w[b+30|0]=c>>>16;w[b+31|0]=c>>>24;ja(e,288);ja(a,104);T=e+288|0;return 0}function Fg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=T;j=f;f=f-512&-64;T=f;g=a?a:b;if(g){i=-1;h=f+96|0;if(!Ea(h,d,e)){d=f+128|0;Ja(d,0,0,64);oa(d,h,32,0);ja(h,32);oa(d,c,32,0);oa(d,e,32,0);c=f+32|0;Ia(d,c,64);ja(d,384);w[g|0]=z[f+32|0];a=b?b:a;w[a|0]=z[f+64|0];w[g+1|0]=z[f+33|0];w[a+1|0]=z[f+65|0];w[g+2|0]=z[f+34|0];w[a+2|0]=z[f+66|0];w[g+3|0]=z[f+35|0];w[a+3|0]=z[f+67|0];w[g+4|0]=z[f+36|0];w[a+4|0]=z[f+68|0];w[g+5|0]=z[f+37|0];w[a+5|0]=z[f+69|0];w[g+6|0]=z[f+38|0];w[a+6|0]=z[f+70|0];w[g+7|0]=z[f+39|0];w[a+7|0]=z[f+71|0];w[g+8|0]=z[f+40|0];w[a+8|0]=z[f+72|0];w[g+9|0]=z[f+41|0];w[a+9|0]=z[f+73|0];w[g+10|0]=z[f+42|0];w[a+10|0]=z[f+74|0];w[g+11|0]=z[f+43|0];w[a+11|0]=z[f+75|0];w[g+12|0]=z[f+44|0];w[a+12|0]=z[f+76|0];w[g+13|0]=z[f+45|0];w[a+13|0]=z[f+77|0];w[g+14|0]=z[f+46|0];w[a+14|0]=z[f+78|0];w[g+15|0]=z[f+47|0];w[a+15|0]=z[f+79|0];w[g+16|0]=z[f+48|0];w[a+16|0]=z[f+80|0];w[g+17|0]=z[f+49|0];w[a+17|0]=z[f+81|0];w[g+18|0]=z[f+50|0];w[a+18|0]=z[f+82|0];w[g+19|0]=z[f+51|0];w[a+19|0]=z[f+83|0];w[g+20|0]=z[f+52|0];w[a+20|0]=z[f+84|0];w[g+21|0]=z[f+53|0];w[a+21|0]=z[f+85|0];w[g+22|0]=z[f+54|0];w[a+22|0]=z[f+86|0];w[g+23|0]=z[f+55|0];w[a+23|0]=z[f+87|0];w[g+24|0]=z[f+56|0];w[a+24|0]=z[f+88|0];w[g+25|0]=z[f+57|0];w[a+25|0]=z[f+89|0];w[g+26|0]=z[f+58|0];w[a+26|0]=z[f+90|0];w[g+27|0]=z[f+59|0];w[a+27|0]=z[f+91|0];w[g+28|0]=z[f+60|0];w[a+28|0]=z[f+92|0];w[g+29|0]=z[f+61|0];w[a+29|0]=z[f+93|0];w[g+30|0]=z[f+62|0];w[a+30|0]=z[f+94|0];w[g+31|0]=z[f+63|0];w[a+31|0]=z[f+95|0];ja(c,64);i=0;}T=j;return i|0}na();s();}function Eg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=T;j=f;f=f-512&-64;T=f;g=a?a:b;if(g){i=-1;h=f+96|0;if(!Ea(h,d,e)){d=f+128|0;Ja(d,0,0,64);oa(d,h,32,0);ja(h,32);oa(d,e,32,0);oa(d,c,32,0);c=f+32|0;Ia(d,c,64);ja(d,384);a=b?b:a;w[a|0]=z[f+32|0];w[g|0]=z[f+64|0];w[a+1|0]=z[f+33|0];w[g+1|0]=z[f+65|0];w[a+2|0]=z[f+34|0];w[g+2|0]=z[f+66|0];w[a+3|0]=z[f+35|0];w[g+3|0]=z[f+67|0];w[a+4|0]=z[f+36|0];w[g+4|0]=z[f+68|0];w[a+5|0]=z[f+37|0];w[g+5|0]=z[f+69|0];w[a+6|0]=z[f+38|0];w[g+6|0]=z[f+70|0];w[a+7|0]=z[f+39|0];w[g+7|0]=z[f+71|0];w[a+8|0]=z[f+40|0];w[g+8|0]=z[f+72|0];w[a+9|0]=z[f+41|0];w[g+9|0]=z[f+73|0];w[a+10|0]=z[f+42|0];w[g+10|0]=z[f+74|0];w[a+11|0]=z[f+43|0];w[g+11|0]=z[f+75|0];w[a+12|0]=z[f+44|0];w[g+12|0]=z[f+76|0];w[a+13|0]=z[f+45|0];w[g+13|0]=z[f+77|0];w[a+14|0]=z[f+46|0];w[g+14|0]=z[f+78|0];w[a+15|0]=z[f+47|0];w[g+15|0]=z[f+79|0];w[a+16|0]=z[f+48|0];w[g+16|0]=z[f+80|0];w[a+17|0]=z[f+49|0];w[g+17|0]=z[f+81|0];w[a+18|0]=z[f+50|0];w[g+18|0]=z[f+82|0];w[a+19|0]=z[f+51|0];w[g+19|0]=z[f+83|0];w[a+20|0]=z[f+52|0];w[g+20|0]=z[f+84|0];w[a+21|0]=z[f+53|0];w[g+21|0]=z[f+85|0];w[a+22|0]=z[f+54|0];w[g+22|0]=z[f+86|0];w[a+23|0]=z[f+55|0];w[g+23|0]=z[f+87|0];w[a+24|0]=z[f+56|0];w[g+24|0]=z[f+88|0];w[a+25|0]=z[f+57|0];w[g+25|0]=z[f+89|0];w[a+26|0]=z[f+58|0];w[g+26|0]=z[f+90|0];w[a+27|0]=z[f+59|0];w[g+27|0]=z[f+91|0];w[a+28|0]=z[f+60|0];w[g+28|0]=z[f+92|0];w[a+29|0]=z[f+61|0];w[g+29|0]=z[f+93|0];w[a+30|0]=z[f+62|0];w[g+30|0]=z[f+94|0];w[a+31|0]=z[f+63|0];w[g+31|0]=z[f+95|0];ja(c,64);i=0;}T=j;return i|0}na();s();}function ef(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0;n=b;b=e;e=0;b=b|e;h=T-128|0;T=h;p=a;o(a,0,102);l=22;q=c|e;a:{{c:{if(d){break c}lc(b,f,g,h+16|0,h+12|0,h+8|0);i=h+96|0;za(i,32);l=28;b=h+32|0;d=y[h+16>>2];a=y[h+12>>2];c=y[h+8>>2];f=Ai(a,0,c,0);g=W;d:{if(!g&f>>>0>1073741823|g|d>>>0>63){break d}w[b|0]=36;w[b+1|0]=55;w[b+2|0]=36;w[b+4|0]=z[(c&63)+1024|0];w[b+3|0]=z[d+1024|0];w[b+8|0]=z[(c>>>24&63)+1024|0];w[b+7|0]=z[(c>>>18&63)+1024|0];w[b+6|0]=z[(c>>>12&63)+1024|0];w[b+5|0]=z[(c>>>6&63)+1024|0];c=b+9|0;if(!c){break d}j=b+58|0;if((c|0)==(j|0)){break d}w[c|0]=z[(a&63)+1024|0];c=j-c|0;if((c|0)==1){break d}w[b+10|0]=z[(a>>>6&63)+1024|0];if((c|0)==2){break d}w[b+11|0]=z[(a>>>12&63)+1024|0];if((c|0)==3){break d}w[b+12|0]=z[(a>>>18&63)+1024|0];if((c|0)==4){break d}w[b+13|0]=z[(a>>>24&63)+1024|0];c=b+14|0;if(!c){break d}g=j-c|0;a=0;while(1){e:{d=c;if(a>>>0>=32){break e}c=z[a+i|0];f=a+1|0;m=f>>>0>=32;f:{if(m){k=0;break f}c=z[f+i|0]<<8|c;f=a+2|0;if(f>>>0>=32){k=0;break f}c=z[f+i|0]<<16|c;k=1;f=a+3|0;}a=f;if(!g){break d}w[d|0]=z[(c&63)+1024|0];if((g|0)==1){break d}w[d+1|0]=z[(c>>>6&63)+1024|0];r=d+g|0;f=d+2|0;g:{if(m){break g}if((g|0)==2){break d}w[d+2|0]=z[(c>>>12&63)+1024|0];f=d+3|0;if(!k){break g}if((g|0)==3){break d}w[d+3|0]=z[(c>>>18|0)+1024|0];f=d+4|0;}c=f;g=r-c|0;if(c){continue}break d}break}if(d>>>0>=j>>>0){break d}w[d|0]=0;e=b;}if(!e){break c}a=h+20|0;if(mc(a));b=Gd(a,n,q,b,p);Ob(a);if(!b){break c}a=0;break a}y[10172]=l;}a=-1;}T=h+128|0;return a|0}function Qa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;o=y[b+4>>2];d=y[a+4>>2];p=y[b+8>>2];e=y[a+8>>2];q=y[b+12>>2];f=y[a+12>>2];r=y[b+16>>2];g=y[a+16>>2];s=y[b+20>>2];h=y[a+20>>2];t=y[b+24>>2];i=y[a+24>>2];m=y[b+28>>2];j=y[a+28>>2];u=y[b+32>>2];k=y[a+32>>2];v=y[b+36>>2];l=y[a+36>>2];c=0-c|0;n=y[a>>2];y[a>>2]=c&(n^y[b>>2])^n;y[a+36>>2]=l^c&(l^v);y[a+32>>2]=k^c&(k^u);y[a+28>>2]=j^c&(j^m);y[a+24>>2]=i^c&(i^t);y[a+20>>2]=h^c&(h^s);y[a+16>>2]=g^c&(g^r);y[a+12>>2]=f^c&(f^q);y[a+8>>2]=e^c&(e^p);y[a+4>>2]=d^c&(d^o);d=y[a+40>>2];o=y[b+40>>2];e=y[a+44>>2];p=y[b+44>>2];f=y[a+48>>2];q=y[b+48>>2];g=y[a+52>>2];r=y[b+52>>2];h=y[a+56>>2];s=y[b+56>>2];i=y[a+60>>2];t=y[b+60>>2];m=a- -64|0;j=y[m>>2];u=y[b- -64>>2];k=y[a+68>>2];v=y[b+68>>2];l=y[a+72>>2];n=y[b+72>>2];w=y[a+76>>2];y[a+76>>2]=w^c&(y[b+76>>2]^w);y[a+72>>2]=l^c&(l^n);y[a+68>>2]=k^c&(k^v);y[m>>2]=j^c&(j^u);y[a+60>>2]=i^c&(i^t);y[a+56>>2]=h^c&(h^s);y[a+52>>2]=g^c&(g^r);y[a+48>>2]=f^c&(f^q);y[a+44>>2]=e^c&(e^p);y[a+40>>2]=d^c&(d^o);d=y[a+80>>2];o=y[b+80>>2];e=y[a+84>>2];p=y[b+84>>2];f=y[a+88>>2];q=y[b+88>>2];g=y[a+92>>2];r=y[b+92>>2];h=y[a+96>>2];s=y[b+96>>2];i=y[a+100>>2];t=y[b+100>>2];j=y[a+104>>2];m=y[b+104>>2];k=y[a+108>>2];u=y[b+108>>2];l=y[a+112>>2];v=y[b+112>>2];n=y[b+116>>2];b=y[a+116>>2];y[a+116>>2]=c&(n^b)^b;y[a+112>>2]=l^c&(l^v);y[a+108>>2]=k^c&(k^u);y[a+104>>2]=j^c&(j^m);y[a+100>>2]=i^c&(i^t);y[a+96>>2]=h^c&(h^s);y[a+92>>2]=g^c&(g^r);y[a+88>>2]=f^c&(f^q);y[a+84>>2]=e^c&(e^p);y[a+80>>2]=d^c&(d^o);}function bb(a,b){var c=0,d=0,e=0;c=T-192|0;T=c;e=c+144|0;fa(e,b);d=c+96|0;fa(d,e);fa(d,d);ga(d,b,d);ga(e,e,d);b=c+48|0;fa(b,e);ga(d,d,b);fa(b,d);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(d,b,d);fa(b,d);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(b,b,d);fa(c,b);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(b,c,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(d,b,d);fa(b,d);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(b,b,d);fa(c,b);b=1;while(1){fa(c,c);b=b+1|0;if((b|0)!=100){continue}break}b=c+48|0;ga(b,c,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);d=c+96|0;ga(d,b,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);ga(a,d,c+144|0);T=c+192|0;}function Kh(a){a=a|0;var b=0,c=0,d=0;c=T-48|0;T=c;b=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[c+24>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[c+28>>2]=b;b=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[c+16>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[c+20>>2]=b;b=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[c+8>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[c+12>>2]=b;b=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[c>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[c+4>>2]=b;b=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[c+32>>2]=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[c+36>>2]=b;Yb(c,c,40,0,a+32|0,a);b=y[c+28>>2];d=y[c+24>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[c+20>>2];d=y[c+16>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[c+12>>2];d=y[c+8>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[c+4>>2];d=y[c>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;d=y[c+36>>2];b=y[c+32>>2];w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+40|0]=d;w[a+41|0]=d>>>8;w[a+42|0]=d>>>16;w[a+43|0]=d>>>24;T=c+48|0;}function gc(a,b){var c=0,d=0,e=0;d=T-144|0;T=d;e=d+96|0;fa(e,b);c=d+48|0;fa(c,e);fa(c,c);ga(c,b,c);ga(e,e,c);fa(e,e);ga(e,c,e);fa(c,e);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(e,c,e);fa(c,e);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,e);fa(d,c);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);ga(c,d,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(e,c,e);fa(c,e);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,e);fa(d,c);c=1;while(1){fa(d,d);c=c+1|0;if((c|0)!=100){continue}break}c=d+48|0;ga(c,d,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);e=d+96|0;ga(e,c,e);fa(e,e);fa(e,e);ga(a,e,b);T=d+144|0;}function Qc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0;c=T-320|0;T=c;g=a+40|0;cb(g,b);y[a+84>>2]=0;y[a+88>>2]=0;y[a+80>>2]=1;y[a+92>>2]=0;y[a+96>>2]=0;y[a+100>>2]=0;y[a+104>>2]=0;y[a+108>>2]=0;y[a+112>>2]=0;y[a+116>>2]=0;f=c+240|0;fa(f,g);e=c+192|0;ga(e,f,1584);i=-1;h=y[c+240>>2]-1|0;y[c+240>>2]=h;y[c+192>>2]=y[c+192>>2]+1;j=y[c+244>>2];k=y[c+248>>2];l=y[c+252>>2];m=y[c+256>>2];n=y[c+260>>2];o=y[c+264>>2];p=y[c+268>>2];q=y[c+272>>2];r=y[c+276>>2];d=c+144|0;fa(d,e);ga(d,d,e);fa(a,d);ga(a,a,e);ga(a,a,f);gc(a,a);ga(a,a,d);ga(a,a,f);d=c+96|0;fa(d,a);ga(d,d,e);e=y[c+132>>2];y[c+84>>2]=e-r;d=y[c+128>>2];y[c+80>>2]=d-q;f=y[c+124>>2];y[c+76>>2]=f-p;s=y[c+120>>2];y[c+72>>2]=s-o;t=y[c+116>>2];y[c+68>>2]=t-n;u=y[c+112>>2];y[c+64>>2]=u-m;v=y[c+108>>2];y[c+60>>2]=v-l;x=y[c+104>>2];y[c+56>>2]=x-k;A=y[c+100>>2];y[c+52>>2]=A-j;B=y[c+96>>2];y[c+48>>2]=B-h;pa(c,c+48|0);a:{if(!ya(c,32)){y[c+36>>2]=e+r;y[c+32>>2]=d+q;y[c+28>>2]=f+p;y[c+24>>2]=o+s;y[c+20>>2]=n+t;y[c+16>>2]=m+u;y[c+12>>2]=l+v;y[c+8>>2]=k+x;y[c+4>>2]=j+A;y[c>>2]=h+B;e=c+288|0;pa(e,c);if(!ya(e,32)){break a}ga(a,a,1632);}pa(c+288|0,a);if((w[c+288|0]&1)==(z[b+31|0]>>>7|0)){y[a>>2]=0-y[a>>2];y[a+36>>2]=0-y[a+36>>2];y[a+32>>2]=0-y[a+32>>2];y[a+28>>2]=0-y[a+28>>2];y[a+24>>2]=0-y[a+24>>2];y[a+20>>2]=0-y[a+20>>2];y[a+16>>2]=0-y[a+16>>2];y[a+12>>2]=0-y[a+12>>2];y[a+8>>2]=0-y[a+8>>2];y[a+4>>2]=0-y[a+4>>2];}ga(a+120|0,a,g);i=0;}T=c+320|0;return i}function Kc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-128|0;T=d;e=z[41218];y[a+4>>2]=0;y[a+8>>2]=0;y[a>>2]=1;y[a+12>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=1;o(a+44|0,0,76);b=E(b,960)+2992|0;e=e>>>2^(c&128)>>>7;c=c-((0-e&c)<<1)|0;Qa(a,b,z[41218]>>>2^((c^1)&255)-1>>>31);Qa(a,b+120|0,z[41218]>>>2^((c^2)&255)-1>>>31);Qa(a,b+240|0,z[41218]>>>2^((c^3)&255)-1>>>31);Qa(a,b+360|0,z[41218]>>>2^((c^4)&255)-1>>>31);Qa(a,b+480|0,z[41218]>>>2^((c^5)&255)-1>>>31);Qa(a,b+600|0,z[41218]>>>2^((c^6)&255)-1>>>31);Qa(a,b+720|0,z[41218]>>>2^((c^7)&255)-1>>>31);Qa(a,b+840|0,z[41218]>>>2^((c^8)&255)-1>>>31);b=y[a+76>>2];y[d+40>>2]=y[a+72>>2];y[d+44>>2]=b;b=a- -64|0;c=y[b+4>>2];y[d+32>>2]=y[b>>2];y[d+36>>2]=c;b=y[a+60>>2];y[d+24>>2]=y[a+56>>2];y[d+28>>2]=b;b=y[a+52>>2];y[d+16>>2]=y[a+48>>2];y[d+20>>2]=b;b=y[a+44>>2];y[d+8>>2]=y[a+40>>2];y[d+12>>2]=b;b=y[a+4>>2];y[d+48>>2]=y[a>>2];y[d+52>>2]=b;b=y[a+12>>2];y[d+56>>2]=y[a+8>>2];y[d+60>>2]=b;b=y[a+20>>2];y[d+64>>2]=y[a+16>>2];y[d+68>>2]=b;b=y[a+28>>2];y[d+72>>2]=y[a+24>>2];y[d+76>>2]=b;b=y[a+36>>2];y[d+80>>2]=y[a+32>>2];y[d+84>>2]=b;b=y[a+80>>2];c=y[a+84>>2];f=y[a+88>>2];g=y[a+92>>2];h=y[a+96>>2];i=y[a+100>>2];j=y[a+104>>2];k=y[a+108>>2];l=y[a+112>>2];y[d+124>>2]=0-y[a+116>>2];y[d+120>>2]=0-l;y[d+116>>2]=0-k;y[d+112>>2]=0-j;y[d+108>>2]=0-i;y[d+104>>2]=0-h;y[d+100>>2]=0-g;y[d+96>>2]=0-f;y[d+92>>2]=0-c;y[d+88>>2]=0-b;Qa(a,d+8|0,e);T=d+128|0;}function Te(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=T-304|0;T=c;w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];b=z[b+31|0];w[a|0]=z[a|0]&248;w[a+31|0]=b&63|64;jb(c+48|0,a);b=y[c+128>>2];d=y[c+88>>2];e=y[c+132>>2];f=y[c+92>>2];g=y[c+136>>2];h=y[c+96>>2];i=y[c+140>>2];j=y[c+100>>2];k=y[c+144>>2];l=y[c+104>>2];m=y[c+148>>2];n=y[c+108>>2];o=y[c+152>>2];p=y[c+112>>2];q=y[c+156>>2];r=y[c+116>>2];s=y[c+160>>2];t=y[c+120>>2];u=y[c+124>>2];v=y[c+164>>2];y[c+292>>2]=u+v;y[c+288>>2]=s+t;y[c+284>>2]=q+r;y[c+280>>2]=o+p;y[c+276>>2]=m+n;y[c+272>>2]=k+l;y[c+268>>2]=i+j;y[c+264>>2]=g+h;y[c+260>>2]=e+f;y[c+256>>2]=b+d;y[c+244>>2]=v-u;y[c+240>>2]=s-t;y[c+236>>2]=q-r;y[c+232>>2]=o-p;y[c+228>>2]=m-n;y[c+224>>2]=k-l;y[c+220>>2]=i-j;y[c+216>>2]=g-h;y[c+212>>2]=e-f;y[c+208>>2]=b-d;b=c+208|0;bb(b,b);ga(c,c+256|0,b);pa(a,c);T=c+304|0;return 0}function zb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;b=T-320|0;T=b;d=b+240|0;fa(d,a);e=b+192|0;fa(e,a+40|0);c=b+144|0;fa(c,a+80|0);a=y[b+240>>2];f=y[b+192>>2];g=y[b+244>>2];h=y[b+196>>2];i=y[b+248>>2];j=y[b+200>>2];k=y[b+252>>2];l=y[b+204>>2];m=y[b+256>>2];n=y[b+208>>2];o=y[b+260>>2];p=y[b+212>>2];q=y[b+264>>2];r=y[b+216>>2];s=y[b+268>>2];t=y[b+220>>2];u=y[b+272>>2];v=y[b+224>>2];y[b+84>>2]=y[b+228>>2]-y[b+276>>2];y[b+80>>2]=v-u;y[b+76>>2]=t-s;y[b+72>>2]=r-q;y[b+68>>2]=p-o;y[b+64>>2]=n-m;y[b+60>>2]=l-k;y[b+56>>2]=j-i;y[b+52>>2]=h-g;y[b+48>>2]=f-a;a=b+48|0;ga(a,a,c);ga(b,d,e);ga(b,b,1584);fa(b+96|0,c);c=y[b+48>>2];d=y[b+96>>2];e=y[b>>2];f=y[b+52>>2];g=y[b+100>>2];h=y[b+4>>2];i=y[b+56>>2];j=y[b+104>>2];k=y[b+8>>2];l=y[b+60>>2];m=y[b+108>>2];n=y[b+12>>2];o=y[b+64>>2];p=y[b+112>>2];q=y[b+16>>2];r=y[b+68>>2];s=y[b+116>>2];t=y[b+20>>2];u=y[b+72>>2];v=y[b+120>>2];w=y[b+24>>2];x=y[b+76>>2];z=y[b+124>>2];A=y[b+28>>2];B=y[b+80>>2];C=y[b+128>>2];D=y[b+32>>2];y[b+84>>2]=y[b+84>>2]-(y[b+132>>2]+y[b+36>>2]|0);y[b+80>>2]=B-(C+D|0);y[b+76>>2]=x-(z+A|0);y[b+72>>2]=u-(v+w|0);y[b+68>>2]=r-(s+t|0);y[b+64>>2]=o-(p+q|0);y[b+60>>2]=l-(m+n|0);y[b+56>>2]=i-(j+k|0);y[b+52>>2]=f-(g+h|0);y[b+48>>2]=c-(d+e|0);c=b+288|0;pa(c,a);a=ya(c,32);T=b+320|0;return a}function Bc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{f:{if((e&-7)!=1){break f}f=(d>>>0)/3|0;h=f<<2;f=E(f,-3)+d|0;g:{if(!f){break g}if(!(e&2)){h=h+4|0;break g}h=((f>>>1|0)+h|0)+2|0;}if(b>>>0<=h>>>0){break f}h:{if(e>>>0>=4){if(!d){e=0;break b}f=0;e=0;break h}if(!d){e=0;break b}f=0;e=0;break e}while(1){j=z[c+i|0]|j<<8;f=f|8;while(1){f=f-6|0;g=j>>>f&63;k=g+65510>>>8|0;l=g+65484>>>8|0;w[a+e|0]=((g^16321)+1^-1)>>>8&45|((g+32705^-1)>>>8&95|(l&(g+71&(k^-1))|k&g+65)|g+252&g+65474>>>8&(l^-1));e=e+1|0;if(f>>>0>5){continue}break}i=i+1|0;if((i|0)!=(d|0)){continue}break}if(!f){break c}i=45;g=95;d=32705;break d}na();s();}while(1){j=z[c+i|0]|j<<8;f=f|8;while(1){f=f-6|0;g=j>>>f&63;k=g+65510>>>8|0;l=g+65484>>>8|0;w[a+e|0]=((g^16321)+1^-1)>>>8&43|((g+16321^-1)>>>8&47|(l&(g+71&(k^-1))|k&g+65)|g+252&g+65474>>>8&(l^-1));e=e+1|0;if(f>>>0>5){continue}break}i=i+1|0;if((i|0)!=(d|0)){continue}break}if(!f){break c}i=43;g=47;d=16321;}c=j<<6-f&63;f=c+65510>>>8|0;j=c+65484>>>8|0;w[a+e|0]=((c^16321)+1^-1)>>>8&i|(g&(c+d^-1)>>>8|(j&(c+71&(f^-1))|f&c+65)|c+252&c+65474>>>8&(j^-1));e=e+1|0;}if(e>>>0>h>>>0){break a}}i:{if(e>>>0>=h>>>0){h=e;break i}c=h-e|0;if(!c){break i}o(a+e|0,61,c);}c=h+1|0;b=(b>>>0>c>>>0?b:c)-h|0;if(b){o(a+h|0,0,b);}return a|0}Q(1104,1218,231,1503);s();}function oa(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c|d){a:{l=a+224|0;k=a+96|0;f=z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24);g=a- -64|0;while(1){e=f+k|0;i=256-f|0;if(!d&c>>>0<=i>>>0){if(c){t(e,b,c);}b=c+(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))|0;w[a+352|0]=b;w[a+353|0]=b>>>8;w[a+354|0]=b>>>16;w[a+355|0]=b>>>24;break a}if(i){t(e,b,i);}e=i+(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))|0;w[a+352|0]=e;w[a+353|0]=e>>>8;w[a+354|0]=e>>>16;w[a+355|0]=e>>>24;f=z[g+4|0]|z[g+5|0]<<8|(z[g+6|0]<<16|z[g+7|0]<<24);m=f;h=z[g|0]|z[g+1|0]<<8|(z[g+2|0]<<16|z[g+3|0]<<24);j=h+128|0;f=j>>>0<128?f+1|0:f;e=g;w[e|0]=j;w[e+1|0]=j>>>8;w[e+2|0]=j>>>16;w[e+3|0]=j>>>24;w[e+4|0]=f;w[e+5|0]=f>>>8;w[e+6|0]=f>>>16;w[e+7|0]=f>>>24;f=z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24);e=(m|0)==-1&h>>>0>4294967167;h=e+(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))|0;f=e>>>0>h>>>0?f+1|0:f;w[a+72|0]=h;w[a+73|0]=h>>>8;w[a+74|0]=h>>>16;w[a+75|0]=h>>>24;w[a+76|0]=f;w[a+77|0]=f>>>8;w[a+78|0]=f>>>16;w[a+79|0]=f>>>24;Eb(a,k);t(k,l,128);f=(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))-128|0;e=f;w[a+352|0]=e;w[a+353|0]=e>>>8;w[a+354|0]=e>>>16;w[a+355|0]=e>>>24;b=b+i|0;d=d-(c>>>0>>0)|0;c=c-i|0;if(d|c){continue}break}}}return 0}function zh(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(d){if(e){break i}i=1;e=0;while(1){l=z[c+h|0];j=(l&223)-55&255;n=(j+65526^j+65520)>>>8|0;l=l^48;o=l+65526>>>8|0;if(!((n|o)&255)){break g}if(b>>>0<=m>>>0){break h}j=j&n|l&o;j:{if(!(k&255)){e=j<<4;break j}w[a+m|0]=e|j;m=m+1|0;}k=k^-1;h=h+1|0;if((h|0)!=(d|0)){continue}break}h=d;break g}a=0;if(!g){break a}break c}while(1){k:{l:{m:{n:{o:{j=z[c+h|0];i=(j&223)-55&255;l=(i+65526^i+65520)>>>8|0;n=j^48;o=n+65526>>>8|0;if(!((l|o)&255)){if(k&255){break f}i=0;if(!ob(e,j)){break d}k=h+1|0;h=k;if(h>>>0>>0){break o}break d}if(b>>>0<=m>>>0){break h}i=i&l|n&o;if(!(k&255)){break n}w[a+m|0]=i|p;k=k^-1;m=m+1|0;break k}while(1){j=z[c+h|0];l=(j&223)-55&255;n=(l+65526^l+65520)>>>8|0;o=j^48;p=o+65526>>>8|0;if(!((n|p)&255)){if(!ob(e,j)){break d}h=h+1|0;if(h>>>0>>0){continue}break m}break}if(b>>>0<=m>>>0){break l}i=l&n|o&p;}p=i<<4;k=255;break k}h=d>>>0>k>>>0?d:k;break d}k=0;break h}i=1;h=h+1|0;if(h>>>0>>0){continue}break}break g}y[10172]=68;i=0;}if(!(k&255)){break e}}y[10172]=28;i=-1;h=h-1|0;m=0;break d}m=i?m:0;i=i-1|0;}if(g){break c}if((d|0)!=(h|0)){break b}a=i;break a}y[g>>2]=c+h;a=i;break a}y[10172]=28;a=-1;}if(f){y[f>>2]=m;}return a|0}function oe(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=T-16|0;T=e;j=y[a+20>>2];y[a+20>>2]=0;k=y[a+4>>2];y[a+4>>2]=0;h=-26;a:{b:{c:{d:{switch(c-1|0){case 1:if(pb(b,1182,9)){break b}b=b+9|0;break c;case 0:break d;default:break a}}if(pb(b,1173,8)){break b}b=b+8|0;}if(z[b|0]!=36|z[b+1|0]!=118|z[b+2|0]!=61){break b}f=b+3|0;i=z[f|0];if((i-58&255)>>>0<246){break b}b=0;g=i;c=f;while(1){d=c;if(b>>>0>429496729){break b}c=(g&255)-48|0;b=E(b,10);if(c>>>0>(b^-1)>>>0){break b}b=b+c|0;c=d+1|0;g=z[c|0];if((g-58&255)>>>0>245){continue}break}if((i|0)==48&(d|0)!=(f|0)|(c|0)==(f|0)){break b}if((b|0)!=19){break a}if((g&255)!=36|z[d+2|0]!=109|z[d+3|0]!=61){break b}b=e+12|0;c=zc(d+4|0,b);if(!c){break b}y[a+44>>2]=y[e+12>>2];if(z[c|0]!=44|z[c+1|0]!=116|z[c+2|0]!=61){break b}c=zc(c+3|0,b);if(!c){break b}y[a+40>>2]=y[e+12>>2];if(z[c|0]!=44|z[c+1|0]!=112|z[c+2|0]!=61){break b}c=zc(c+3|0,b);if(!c){break b}d=y[e+12>>2];y[a+48>>2]=d;y[a+52>>2]=d;if(z[c|0]!=36){break b}y[e+12>>2]=j;f=y[a+16>>2];c=c+1|0;d=c;g=Ha(c);c=e+8|0;if(Ac(f,j,d,g,0,b,c,3)){break b}y[a+20>>2]=y[e+12>>2];d=y[e+8>>2];if(z[d|0]!=36){break b}y[e+12>>2]=k;d=d+1|0;if(Ac(y[a>>2],k,d,Ha(d),0,b,c,3)){break b}y[a+4>>2]=y[e+12>>2];b=y[e+8>>2];h=nc(a);if(h){break a}h=z[b|0]?-32:0;break a}h=-32;}T=e+16|0;return h}function Hd(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=y[a+60>>2];q=y[a+56>>2];p=y[a+52>>2];n=y[a+48>>2];b=y[a+44>>2];d=y[a+40>>2];r=y[a+36>>2];m=y[a+32>>2];e=y[a+28>>2];f=y[a+24>>2];g=y[a+20>>2];h=y[a+16>>2];i=y[a+12>>2];j=y[a+8>>2];k=y[a+4>>2];l=y[a>>2];while(1){o=Bi(g+k|0,7)^r;s=Bi(o+g|0,9)^p;h=Bi(l+n|0,7)^h;t=Bi(h+l|0,9)^m;u=Bi(t+h|0,13)^n;i=Bi(b+c|0,7)^i;e=Bi(i+c|0,9)^e;m=Bi(e+i|0,13)^b;c=Bi(e+m|0,18)^c;b=Bi(d+f|0,7)^q;n=u^Bi(c+b|0,7);p=s^Bi(n+c|0,9);q=Bi(n+p|0,13)^b;c=Bi(p+q|0,18)^c;j=Bi(b+d|0,9)^j;f=Bi(j+b|0,13)^f;d=Bi(f+j|0,18)^d;b=Bi(d+o|0,7)^m;m=Bi(b+d|0,9)^t;r=Bi(b+m|0,13)^o;d=Bi(m+r|0,18)^d;k=Bi(o+s|0,13)^k;g=Bi(k+s|0,18)^g;f=Bi(g+h|0,7)^f;e=Bi(f+g|0,9)^e;h=Bi(e+f|0,13)^h;g=Bi(h+e|0,18)^g;l=Bi(t+u|0,18)^l;k=Bi(l+i|0,7)^k;j=Bi(k+l|0,9)^j;i=Bi(j+k|0,13)^i;l=Bi(i+j|0,18)^l;o=v>>>0<6;v=v+2|0;if(o){continue}break}y[a>>2]=y[a>>2]+l;y[a+4>>2]=y[a+4>>2]+k;y[a+8>>2]=y[a+8>>2]+j;y[a+12>>2]=y[a+12>>2]+i;y[a+16>>2]=y[a+16>>2]+h;y[a+20>>2]=y[a+20>>2]+g;y[a+24>>2]=y[a+24>>2]+f;y[a+28>>2]=y[a+28>>2]+e;y[a+32>>2]=y[a+32>>2]+m;y[a+36>>2]=y[a+36>>2]+r;y[a+40>>2]=y[a+40>>2]+d;y[a+44>>2]=y[a+44>>2]+b;y[a+48>>2]=y[a+48>>2]+n;y[a+52>>2]=y[a+52>>2]+p;y[a+56>>2]=y[a+56>>2]+q;y[a+60>>2]=y[a+60>>2]+c;}function Dd(a,b,c,d){var e=0,f=0;e=T-320|0;T=e;f=-1;a:{if(!dc(c)){break a}if(yb(c)){break a}if(ab(e,c)){break a}if(!ec(e)){break a}w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];c=z[b+31|0];if(d){w[a|0]=z[a|0]&248;c=c|64;}w[a+31|0]=c&127;c=e+160|0;Nc(c,a,e);Wa(a,c);if((z[a+31|0]&127|(z[a+30|0]|(z[a+29|0]|(z[a+28|0]|(z[a+27|0]|(z[a+26|0]|(z[a+25|0]|(z[a+24|0]|(z[a+23|0]|(z[a+22|0]|(z[a+21|0]|(z[a+20|0]|(z[a+19|0]|(z[a+18|0]|(z[a+17|0]|(z[a+16|0]|(z[a+15|0]|(z[a+14|0]|(z[a+13|0]|(z[a+12|0]|(z[a+11|0]|(z[a+10|0]|(z[a+9|0]|(z[a+8|0]|(z[a+7|0]|(z[a+6|0]|(z[a+5|0]|(z[a+4|0]|(z[a+3|0]|(z[a+2|0]|(z[a+1|0]|z[a|0]^1)))))))))))))))))))))))))))))))-1&256){break a}f=ya(b,32)?-1:0;}T=e+320|0;return f}function Gd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=T-48|0;T=k;if(e){za(e,102);}a:{if(z[d|0]!=36|z[d+1|0]!=55|z[d+2|0]!=36){break a}l=eb(z[d+3|0]);if(!l){break a}g=Mb(k+12|0,d+4|0);if(!g){break a}j=Mb(k+8|0,g);if(!j){break a}h=Ha(j)+1|0;while(1){b:{g=0;if(!h){break b}h=h-1|0;g=j+h|0;if(z[g|0]!=36){continue}}break}i=g-j|0;c:{if(g){break c}i=Ha(j);}g=i;h=g+(j-d|0)|0;i=h+45|0;if(i>>>0>102|g>>>0>i>>>0){break a}i=a;m=b;n=c;l=l-1024|0;a=l&31;if((l&63)>>>0>=32){b=1<>>32-a;}if(Id(i,m,n,j,g,c,b,y[k+12>>2],y[k+8>>2],k+16|0,32)){break a}if(h){t(e,d,h);}a=e+h|0;w[a|0]=36;c=(h^-1)+102|0;f=a+1|0;a=0;while(1){d:{b=f;d=a;if(d>>>0>31){g=f;break d}h=d+1|0;a=31-d|0;i=a>>>0>=2?2:a;a=h+i|0;g=0;j=0;l=k+16|0;f=z[l+d|0];e:{if(!i){break e}f=z[h+l|0]<<8|f;d=d+2|0;if((d|0)==(a|0)){break e}j=1;f=z[d+l|0]<<16|f;}if(!c){break d}w[b|0]=z[(f&63)+1024|0];if((c|0)==1){break d}w[b+1|0]=z[(f>>>6&63)+1024|0];i=b+c|0;d=b+2|0;f:{if((a|0)==(h|0)){break f}if((c|0)==2){break d}w[b+2|0]=z[(f>>>12&63)+1024|0];d=b+3|0;if(!j){break f}if((c|0)==3){break d}w[b+3|0]=z[(f>>>18|0)+1024|0];d=b+4|0;}f=d;c=i-f|0;if(f){continue}}break}ja(k+16|0,32);f=0;if(!g|e+102>>>0<=g>>>0){break a}w[g|0]=0;f=e;}T=k+48|0;return f}function qa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=y[b+40>>2];e=y[b+4>>2];f=y[b+44>>2];g=y[b+8>>2];h=y[b+48>>2];i=y[b+12>>2];j=y[b+52>>2];k=y[b+16>>2];l=y[b+56>>2];m=y[b+20>>2];n=y[b+60>>2];o=y[b+24>>2];d=b- -64|0;p=y[d>>2];q=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=s+t;y[a+28>>2]=q+r;y[a+24>>2]=o+p;y[a+20>>2]=m+n;y[a+16>>2]=k+l;y[a+12>>2]=i+j;y[a+8>>2]=g+h;y[a+4>>2]=e+f;y[a>>2]=c+u;c=y[b+40>>2];e=y[b+4>>2];f=y[b+44>>2];g=y[b+8>>2];h=y[b+48>>2];i=y[b+12>>2];j=y[b+52>>2];k=y[b+16>>2];l=y[b+56>>2];m=y[b+20>>2];n=y[b+60>>2];o=y[b+24>>2];d=y[d>>2];p=y[b+28>>2];q=y[b+68>>2];r=y[b+32>>2];s=y[b+72>>2];t=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=s-r;y[a+68>>2]=q-p;y[a- -64>>2]=d-o;y[a+60>>2]=n-m;y[a+56>>2]=l-k;y[a+52>>2]=j-i;y[a+48>>2]=h-g;y[a+44>>2]=f-e;y[a+40>>2]=c-t;c=y[b+84>>2];y[a+80>>2]=y[b+80>>2];y[a+84>>2]=c;c=y[b+92>>2];y[a+88>>2]=y[b+88>>2];y[a+92>>2]=c;c=y[b+100>>2];y[a+96>>2]=y[b+96>>2];y[a+100>>2]=c;c=y[b+108>>2];y[a+104>>2]=y[b+104>>2];y[a+108>>2]=c;c=y[b+116>>2];y[a+112>>2]=y[b+112>>2];y[a+116>>2]=c;ga(a+120|0,b+120|0,1680);}function jc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0;c=y[a+56>>2];d=y[a+60>>2];if(c|d){f=a- -64|0;w[f+c|0]=1;l=c+1|0;d=l?d:d+1|0;a:{if(!d&l>>>0>15|d){break a}d=15-c|0;if(!d){break a}o((a+c|0)+65|0,0,d);}w[a+80|0]=1;hc(a,f,16,0);}l=y[a+52>>2];j=y[a+48>>2];f=y[a+44>>2];c=y[a+24>>2];g=y[a+28>>2]+(c>>>26|0)|0;e=y[a+32>>2]+(g>>>26|0)|0;m=y[a+36>>2]+(e>>>26|0)|0;h=y[a+20>>2]+E(m>>>26|0,5)|0;i=h&67108863;d=i+5|0;p=e&67108863;k=g&67108863;c=(c&67108863)+(h>>>26|0)|0;h=c+(d>>>26|0)|0;q=k+(h>>>26|0)|0;r=p+(q>>>26|0)|0;s=(m&67108863)+(r>>>26|0)|0;e=s-67108864|0;g=e>>31;n=h;h=(e>>>31|0)-1|0;e=h&67108863;c=c&g|n&e;i=c<<26|(d&e|g&i);d=i+y[a+40>>2]|0;w[b|0]=d;w[b+1|0]=d>>>8;w[b+2|0]=d>>>16;w[b+3|0]=d>>>24;i=d>>>0>>0;d=0;k=g&k|e&q;c=k<<20|c>>>6;n=c;c=c+f|0;d=n>>>0>c>>>0?1:d;f=c;c=c+i|0;d=f>>>0>c>>>0?d+1|0:d;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;c=0;e=g&p|e&r;f=e<<14|k>>>12;j=f+j|0;f=f>>>0>j>>>0?1:c;c=j;j=d;c=c+d|0;d=f;d=c>>>0>>0?d+1|0:d;w[b+8|0]=c;w[b+9|0]=c>>>8;w[b+10|0]=c>>>16;w[b+11|0]=c>>>24;c=(h&s|g&m)<<8|e>>>18;c=c+l|0;d=c+d|0;w[b+12|0]=d;w[b+13|0]=d>>>8;w[b+14|0]=d>>>16;w[b+15|0]=d>>>24;ja(a,88);}function Cd(a,b,c){var d=0,e=0;d=T-160|0;T=d;w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];e=z[b+31|0];if(c){w[a|0]=z[a|0]&248;e=e|64;}w[a+31|0]=e&127;jb(d,a);Wa(a,d);c=-1;if(!((z[a+31|0]&127|(z[a+30|0]|(z[a+29|0]|(z[a+28|0]|(z[a+27|0]|(z[a+26|0]|(z[a+25|0]|(z[a+24|0]|(z[a+23|0]|(z[a+22|0]|(z[a+21|0]|(z[a+20|0]|(z[a+19|0]|(z[a+18|0]|(z[a+17|0]|(z[a+16|0]|(z[a+15|0]|(z[a+14|0]|(z[a+13|0]|(z[a+12|0]|(z[a+11|0]|(z[a+10|0]|(z[a+9|0]|(z[a+8|0]|(z[a+7|0]|(z[a+6|0]|(z[a+5|0]|(z[a+4|0]|(z[a+3|0]|(z[a+2|0]|(z[a+1|0]|z[a|0]^1)))))))))))))))))))))))))))))))-1&256)){c=ya(b,32)?-1:0;}T=d+160|0;return c}function Ea(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-16|0;T=d;w[d+15|0]=0;e=-1;if(!(X[y[9954]](a,b,c)|0)){w[d+15|0]=z[a|0]|z[d+15|0];w[d+15|0]=z[a+1|0]|z[d+15|0];w[d+15|0]=z[a+2|0]|z[d+15|0];w[d+15|0]=z[a+3|0]|z[d+15|0];w[d+15|0]=z[a+4|0]|z[d+15|0];w[d+15|0]=z[a+5|0]|z[d+15|0];w[d+15|0]=z[a+6|0]|z[d+15|0];w[d+15|0]=z[a+7|0]|z[d+15|0];w[d+15|0]=z[a+8|0]|z[d+15|0];w[d+15|0]=z[a+9|0]|z[d+15|0];w[d+15|0]=z[a+10|0]|z[d+15|0];w[d+15|0]=z[a+11|0]|z[d+15|0];w[d+15|0]=z[a+12|0]|z[d+15|0];w[d+15|0]=z[a+13|0]|z[d+15|0];w[d+15|0]=z[a+14|0]|z[d+15|0];w[d+15|0]=z[a+15|0]|z[d+15|0];w[d+15|0]=z[a+16|0]|z[d+15|0];w[d+15|0]=z[a+17|0]|z[d+15|0];w[d+15|0]=z[a+18|0]|z[d+15|0];w[d+15|0]=z[a+19|0]|z[d+15|0];w[d+15|0]=z[a+20|0]|z[d+15|0];w[d+15|0]=z[a+21|0]|z[d+15|0];w[d+15|0]=z[a+22|0]|z[d+15|0];w[d+15|0]=z[a+23|0]|z[d+15|0];w[d+15|0]=z[a+24|0]|z[d+15|0];w[d+15|0]=z[a+25|0]|z[d+15|0];w[d+15|0]=z[a+26|0]|z[d+15|0];w[d+15|0]=z[a+27|0]|z[d+15|0];w[d+15|0]=z[a+28|0]|z[d+15|0];w[d+15|0]=z[a+29|0]|z[d+15|0];w[d+15|0]=z[a+30|0]|z[d+15|0];w[d+15|0]=z[a+31|0]|z[d+15|0];e=(z[d+15|0]<<23)-8388608>>31;}T=d+16|0;return e|0}function Xc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if((d|0)==1|d>>>0>1){y[10172]=22;break b}d=T-128|0;T=d;y[d+64>>2]=0;y[d+56>>2]=0;y[d+60>>2]=0;y[d+48>>2]=0;y[d+52>>2]=0;y[d+40>>2]=0;y[d+44>>2]=0;y[d+32>>2]=0;y[d+36>>2]=0;y[d+24>>2]=0;y[d+28>>2]=0;y[d+16>>2]=0;y[d+20>>2]=0;f=Ha(a);y[d+28>>2]=f;y[d+44>>2]=f;y[d+12>>2]=f;g=Da(f);y[d+40>>2]=g;h=Da(f);y[d+24>>2]=h;i=Da(f);y[d+8>>2]=i;c:{d:{if(!i|(!g|!h)){break d}f=Da(f);if(!f){break d}a=oe(d+8|0,a,e);if(a){ta(y[d+40>>2]);ta(y[d+24>>2]);ta(y[d+8>>2]);ta(f);break c}i=y[d+28>>2];j=y[d+24>>2];a=y[d+60>>2];k=y[d+52>>2];l=y[d+48>>2];g=y[d+12>>2];za(f,g);h=Da(g);e:{if(!h){a=-22;break e}y[d+92>>2]=0;y[d+96>>2]=0;y[d+88>>2]=i;y[d+84>>2]=j;y[d+80>>2]=c;y[d+76>>2]=b;y[d+72>>2]=g;y[d+68>>2]=h;y[d+100>>2]=0;y[d+104>>2]=0;y[d+124>>2]=0;y[d+120>>2]=a;y[d+116>>2]=a;y[d+112>>2]=k;y[d+108>>2]=l;a=Sb(d+68|0,e);if(!(a|!g)){t(f,h,g);}ja(h,g);ta(h);}ta(y[d+40>>2]);ta(y[d+24>>2]);if(!a){a=$a(f,y[d+8>>2],y[d+12>>2])?-35:0;}ta(f);ta(y[d+8>>2]);break c}ta(g);ta(h);ta(i);a=-22;}T=d+128|0;b=a;if(!a){break a}if((a|0)!=-35){break b}y[10172]=28;}b=-1;}return b}function db(a,b){a=a|0;b=b|0;var c=0;c=T-16|0;y[c+12>>2]=a;y[c+8>>2]=b;x[c+6>>1]=0;x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]]^z[y[c+8>>2]];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+1|0]^z[y[c+8>>2]+1|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+2|0]^z[y[c+8>>2]+2|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+3|0]^z[y[c+8>>2]+3|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+4|0]^z[y[c+8>>2]+4|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+5|0]^z[y[c+8>>2]+5|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+6|0]^z[y[c+8>>2]+6|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+7|0]^z[y[c+8>>2]+7|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+8|0]^z[y[c+8>>2]+8|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+9|0]^z[y[c+8>>2]+9|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+10|0]^z[y[c+8>>2]+10|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+11|0]^z[y[c+8>>2]+11|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+12|0]^z[y[c+8>>2]+12|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+13|0]^z[y[c+8>>2]+13|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+14|0]^z[y[c+8>>2]+14|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+15|0]^z[y[c+8>>2]+15|0];x[c+6>>1]=A[c+6>>1];x[c+6>>1]=A[c+6>>1]-1;x[c+6>>1]=A[20608]>>>2^A[c+6>>1]>>>15;return A[c+6>>1]-1|0}function pa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=y[b+32>>2];g=y[b+28>>2];h=y[b+24>>2];i=y[b+20>>2];j=y[b+16>>2];k=y[b+12>>2];c=y[b+4>>2];d=y[b>>2];e=y[b+36>>2];b=y[b+8>>2];d=E((f+(g+(h+(i+(j+(k+((c+(d+(E(e,19)+16777216>>>25|0)>>26)>>25)+b>>26)>>25)>>26)>>25)>>26)>>25)>>26)+e>>25,19)+d|0;w[a|0]=d;w[a+2|0]=d>>>16;w[a+1|0]=d>>>8;c=c+(d>>26)|0;w[a+5|0]=c>>>14;w[a+4|0]=c>>>6;w[a+3|0]=d>>>24&3|c<<2;b=b+(c>>25)|0;w[a+8|0]=b>>>13;w[a+7|0]=b>>>5;w[a+6|0]=b<<3|(c&29360128)>>>22;d=(b>>26)+k|0;w[a+11|0]=d>>>11;w[a+10|0]=d>>>3;w[a+9|0]=d<<5|(b&65011712)>>>21;c=(d>>25)+j|0;w[a+15|0]=c>>>18;w[a+14|0]=c>>>10;w[a+13|0]=c>>>2;b=(c>>26)+i|0;w[a+16|0]=b;w[a+12|0]=c<<6|(d&33030144)>>>19;w[a+18|0]=b>>>16;w[a+17|0]=b>>>8;c=(b>>25)+h|0;w[a+21|0]=c>>>15;w[a+20|0]=c>>>7;w[a+19|0]=b>>>24&1|c<<1;b=(c>>26)+g|0;w[a+24|0]=b>>>13;w[a+23|0]=b>>>5;w[a+22|0]=b<<3|(c&58720256)>>>23;c=(b>>25)+f|0;w[a+27|0]=c>>>12;w[a+26|0]=c>>>4;w[a+25|0]=c<<4|(b&31457280)>>>21;b=e+(c>>26)|0;w[a+30|0]=b>>>10;w[a+29|0]=b>>>2;w[a+31|0]=(b&33292288)>>>18;w[a+28|0]=b<<6|(c&66060288)>>>20;}function Va(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=T-192|0;T=g;if(c>>>0>=129){Za(a);va(a,b,c,0);Ca(a,g);c=64;b=g;}Za(a);o(g- -64|0,54,128);a:{if(!c){break a}k=c&3;if(c>>>0>=4){f=c&252;while(1){h=g- -64|0;e=h+d|0;w[e|0]=z[e|0]^z[b+d|0];e=d|1;l=e+h|0;w[l|0]=z[l|0]^z[b+e|0];e=d|2;l=e+h|0;w[l|0]=z[l|0]^z[b+e|0];e=h;h=d|3;e=e+h|0;w[e|0]=z[e|0]^z[b+h|0];d=d+4|0;i=i+4|0;if((f|0)!=(i|0)){continue}break}if(!k){break a}}while(1){i=(g- -64|0)+d|0;w[i|0]=z[i|0]^z[b+d|0];d=d+1|0;j=j+1|0;if((k|0)!=(j|0)){continue}break}}d=g- -64|0;va(a,d,128,0);k=a+208|0;Za(k);o(d,92,128);b:{if(!c){break b}h=c&3;j=0;d=0;if(c>>>0>=4){c=c&252;i=0;while(1){a=g- -64|0;f=a+d|0;w[f|0]=z[f|0]^z[b+d|0];f=d|1;e=f+a|0;w[e|0]=z[e|0]^z[b+f|0];f=d|2;e=f+a|0;w[e|0]=z[e|0]^z[b+f|0];e=a;a=d|3;f=e+a|0;w[f|0]=z[f|0]^z[a+b|0];d=d+4|0;i=i+4|0;if((c|0)!=(i|0)){continue}break}if(!h){break b}}while(1){a=(g- -64|0)+d|0;w[a|0]=z[a|0]^z[b+d|0];d=d+1|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}a=g- -64|0;va(k,a,128,0);ja(a,128);ja(g,64);T=g+192|0;return 0}function mh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b;d=z[c+32|0]|z[c+33|0]<<8|(z[c+34|0]<<16|z[c+35|0]<<24);e=z[c+36|0]|z[c+37|0]<<8|(z[c+38|0]<<16|z[c+39|0]<<24);f=z[c+40|0]|z[c+41|0]<<8|(z[c+42|0]<<16|z[c+43|0]<<24);g=z[c+44|0]|z[c+45|0]<<8|(z[c+46|0]<<16|z[c+47|0]<<24);h=z[c+48|0]|z[c+49|0]<<8|(z[c+50|0]<<16|z[c+51|0]<<24);b=z[c+52|0]|z[c+53|0]<<8|(z[c+54|0]<<16|z[c+55|0]<<24);i=z[c+60|0]|z[c+61|0]<<8|(z[c+62|0]<<16|z[c+63|0]<<24);c=z[c+56|0]|z[c+57|0]<<8|(z[c+58|0]<<16|z[c+59|0]<<24);w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=i;w[a+29|0]=i>>>8;w[a+30|0]=i>>>16;w[a+31|0]=i>>>24;w[a+16|0]=h;w[a+17|0]=h>>>8;w[a+18|0]=h>>>16;w[a+19|0]=h>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;w[a+8|0]=f;w[a+9|0]=f>>>8;w[a+10|0]=f>>>16;w[a+11|0]=f>>>24;w[a+12|0]=g;w[a+13|0]=g>>>8;w[a+14|0]=g>>>16;w[a+15|0]=g>>>24;w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=e;w[a+5|0]=e>>>8;w[a+6|0]=e>>>16;w[a+7|0]=e>>>24;return 0}function nh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b;d=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);e=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);f=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);g=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);h=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);b=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);i=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);c=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=i;w[a+29|0]=i>>>8;w[a+30|0]=i>>>16;w[a+31|0]=i>>>24;w[a+16|0]=h;w[a+17|0]=h>>>8;w[a+18|0]=h>>>16;w[a+19|0]=h>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;w[a+8|0]=f;w[a+9|0]=f>>>8;w[a+10|0]=f>>>16;w[a+11|0]=f>>>24;w[a+12|0]=g;w[a+13|0]=g>>>8;w[a+14|0]=g>>>16;w[a+15|0]=g>>>24;w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=e;w[a+5|0]=e>>>8;w[a+6|0]=e>>>16;w[a+7|0]=e>>>24;return 0}function pi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=T+-64|0;T=h;if(c|d){y[h+8>>2]=2036477234;y[h+12>>2]=1797285236;y[h>>2]=1634760805;y[h+4>>2]=857760878;y[h+16>>2]=z[g|0]|z[g+1|0]<<8|(z[g+2|0]<<16|z[g+3|0]<<24);y[h+20>>2]=z[g+4|0]|z[g+5|0]<<8|(z[g+6|0]<<16|z[g+7|0]<<24);y[h+24>>2]=z[g+8|0]|z[g+9|0]<<8|(z[g+10|0]<<16|z[g+11|0]<<24);y[h+28>>2]=z[g+12|0]|z[g+13|0]<<8|(z[g+14|0]<<16|z[g+15|0]<<24);y[h+32>>2]=z[g+16|0]|z[g+17|0]<<8|(z[g+18|0]<<16|z[g+19|0]<<24);y[h+36>>2]=z[g+20|0]|z[g+21|0]<<8|(z[g+22|0]<<16|z[g+23|0]<<24);y[h+40>>2]=z[g+24|0]|z[g+25|0]<<8|(z[g+26|0]<<16|z[g+27|0]<<24);g=z[g+28|0]|z[g+29|0]<<8|(z[g+30|0]<<16|z[g+31|0]<<24);y[h+48>>2]=f;y[h+44>>2]=g;y[h+52>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[h+56>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[h+60>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);_b(h,b,a,c,d);ja(h,64);}T=h- -64|0;return 0}function ri(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T+-64|0;T=f;if(b|c){y[f+8>>2]=2036477234;y[f+12>>2]=1797285236;y[f>>2]=1634760805;y[f+4>>2]=857760878;y[f+16>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+20>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f+24>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+28>>2]=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+32>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+36>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+40>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+48>>2]=0;y[f+44>>2]=e;y[f+52>>2]=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);y[f+56>>2]=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+60>>2]=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);if(b){o(a,0,b);}_b(f,a,a,b,c);ja(f,64);}T=f- -64|0;return 0}function Vf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=T;f=g-192&-64;T=f;y[f+64>>2]=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))&67108863;y[f+68>>2]=(z[e+3|0]|z[e+4|0]<<8|(z[e+5|0]<<16|z[e+6|0]<<24))>>>2&67108611;y[f+72>>2]=(z[e+6|0]|z[e+7|0]<<8|(z[e+8|0]<<16|z[e+9|0]<<24))>>>4&67092735;y[f+76>>2]=(z[e+9|0]|z[e+10|0]<<8|(z[e+11|0]<<16|z[e+12|0]<<24))>>>6&66076671;h=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+80>>2]=h>>>8&1048575;y[f+104>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+108>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+112>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);w[f+144|0]=0;y[f+120>>2]=0;y[f+124>>2]=0;y[f+116>>2]=e;e=f- -64|0;kc(e,b,c,d);b=f+48|0;jc(e,b);a=db(a,b);T=g;return a|0}function jf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=c;c=d;k=g|0;d=T;g=d;f=d-512&-64;T=f;d=-1;h=f- -64|0;i=f+32|0;if(!nb(h,i)){d=f+128|0;Ja(d,0,0,24);oa(d,h,32,0);oa(d,e,32,0);j=f+96|0;Ia(d,j,24);d=$d(a+32|0,b,k,c,j,e,i);b=y[f+92>>2];c=y[f+88>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[f+84>>2];c=y[f+80>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[f+76>>2];c=y[f+72>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[f+68>>2];c=y[f+64>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;ja(i,32);ja(h,32);ja(j,24);}T=g;return d|0}function Wf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=c;c=d;k=g|0;d=T;g=d;f=d-512&-64;T=f;d=-1;h=f- -64|0;i=f+32|0;if(!nb(h,i)){d=f+128|0;Ja(d,0,0,24);oa(d,h,32,0);oa(d,e,32,0);j=f+96|0;Ia(d,j,24);d=Bd(a+32|0,b,k,c,j,e,i);b=y[f+92>>2];c=y[f+88>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[f+84>>2];c=y[f+80>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[f+76>>2];c=y[f+72>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[f+68>>2];c=y[f+64>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;ja(i,32);ja(h,32);ja(j,24);}T=g;return d|0}function qi(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=T+-64|0;T=i;if(c|d){y[i+8>>2]=2036477234;y[i+12>>2]=1797285236;y[i>>2]=1634760805;y[i+4>>2]=857760878;y[i+16>>2]=z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24);y[i+20>>2]=z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24);y[i+24>>2]=z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24);y[i+28>>2]=z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24);y[i+32>>2]=z[h+16|0]|z[h+17|0]<<8|(z[h+18|0]<<16|z[h+19|0]<<24);y[i+36>>2]=z[h+20|0]|z[h+21|0]<<8|(z[h+22|0]<<16|z[h+23|0]<<24);y[i+40>>2]=z[h+24|0]|z[h+25|0]<<8|(z[h+26|0]<<16|z[h+27|0]<<24);h=z[h+28|0]|z[h+29|0]<<8|(z[h+30|0]<<16|z[h+31|0]<<24);y[i+48>>2]=f;y[i+52>>2]=g;y[i+44>>2]=h;y[i+56>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[i+60>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);_b(i,b,a,c,d);ja(i,64);}T=i- -64|0;return 0}function si(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T+-64|0;T=f;if(b|c){y[f+8>>2]=2036477234;y[f+12>>2]=1797285236;y[f>>2]=1634760805;y[f+4>>2]=857760878;y[f+16>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+20>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f+24>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+28>>2]=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+32>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+36>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+40>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+48>>2]=0;y[f+52>>2]=0;y[f+44>>2]=e;y[f+56>>2]=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);y[f+60>>2]=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);if(b){o(a,0,b);}_b(f,a,a,b,c);ja(f,64);}T=f- -64|0;return 0}function og(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=T;f=g-128&-64;T=f;y[f>>2]=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))&67108863;y[f+4>>2]=(z[e+3|0]|z[e+4|0]<<8|(z[e+5|0]<<16|z[e+6|0]<<24))>>>2&67108611;y[f+8>>2]=(z[e+6|0]|z[e+7|0]<<8|(z[e+8|0]<<16|z[e+9|0]<<24))>>>4&67092735;y[f+12>>2]=(z[e+9|0]|z[e+10|0]<<8|(z[e+11|0]<<16|z[e+12|0]<<24))>>>6&66076671;h=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+20>>2]=0;y[f+24>>2]=0;y[f+28>>2]=0;y[f+32>>2]=0;y[f+36>>2]=0;y[f+16>>2]=h>>>8&1048575;y[f+40>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+44>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+48>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);w[f+80|0]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+52>>2]=e;kc(f,b,c,d);jc(f,a);T=g;return 0}function Bb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=T-352|0;T=h;Aa(h,f,g,0);a:{b:{if(!(!((!e&a-c>>>0>>0|(e|0)!=0)&a>>>0>c>>>0)&(!e&c-a>>>0>=d>>>0|a>>>0>=c>>>0))){if(d){t(a,c,d);}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;g=(e|0)!=0;c=g|!e&d>>>0>=32;i=c?32:d;k=c?0:e;g=g|!e&d>>>0>32;c=a;break b}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;j=(e|0)!=0;g=j|!e&d>>>0>=32;i=g?32:d;k=g?0:e;g=j|!e&d>>>0>32;if(d|e){break b}m=1;break a}if(i){t(h- -64|0,c,i);}m=0;}l=h+32|0;j=k;n=i+32|0;j=n>>>0<32?j+1|0:j;o=j;j=f+16|0;Zb(l,l,n,o,j,h);Ga(h+96|0,l);if(!(!i|m)){t(a,h- -64|0,i);}ja(h+32|0,64);if(g){hb(a+i|0,c+i|0,d-i|0,e-(k+(d>>>0>>0)|0)|0,j,1,0,h);}ja(h,32);c=h+96|0;la(c,a,d,e);Fa(c,b);ja(c,256);T=h+352|0;return 0}function Ab(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=T-352|0;T=h;Sa(h,f,g,0);a:{b:{if(!(!((!e&a-c>>>0>>0|(e|0)!=0)&a>>>0>c>>>0)&(!e&c-a>>>0>=d>>>0|a>>>0>=c>>>0))){if(d){t(a,c,d);}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;g=(e|0)!=0;c=g|!e&d>>>0>=32;i=c?32:d;k=c?0:e;g=g|!e&d>>>0>32;c=a;break b}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;j=(e|0)!=0;g=j|!e&d>>>0>=32;i=g?32:d;k=g?0:e;g=j|!e&d>>>0>32;if(d|e){break b}m=1;break a}if(i){t(h- -64|0,c,i);}m=0;}l=h+32|0;j=k;n=i+32|0;j=n>>>0<32?j+1|0:j;o=j;j=f+16|0;Gb(l,l,n,o,j,h);Ga(h+96|0,l);if(!(!i|m)){t(a,h- -64|0,i);}ja(h+32|0,64);if(g){sb(a+i|0,c+i|0,d-i|0,e-(k+(d>>>0>>0)|0)|0,j,1,0,h);}ja(h,32);c=h+96|0;la(c,a,d,e);Fa(c,b);ja(c,256);T=h+352|0;return 0}function Qf(a,b){a=a|0;b=b|0;var c=0;y[a>>2]=(z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24))&67108863;y[a+4>>2]=(z[b+3|0]|z[b+4|0]<<8|(z[b+5|0]<<16|z[b+6|0]<<24))>>>2&67108611;y[a+8>>2]=(z[b+6|0]|z[b+7|0]<<8|(z[b+8|0]<<16|z[b+9|0]<<24))>>>4&67092735;y[a+12>>2]=(z[b+9|0]|z[b+10|0]<<8|(z[b+11|0]<<16|z[b+12|0]<<24))>>>6&66076671;c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+16>>2]=c>>>8&1048575;y[a+40>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[a+44>>2]=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[a+48>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);b=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);w[a+80|0]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+52>>2]=b;return 0}function Pg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-320|0;T=d;e=-1;if(!ib(d,c)){w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];w[a+31|0]=z[b+31|0]&127;b=d+160|0;Nc(b,a,d);xb(a,b);e=ya(a,32)?-1:0;}T=d+320|0;return e|0}function wd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-480|0;T=f;Va(f,e,32);Na(f,b,c,d);Ya(f,f+416|0);b=y[f+444>>2];c=y[f+440>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[f+436>>2];c=y[f+432>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[f+428>>2];c=y[f+424>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[f+420>>2];c=y[f+416>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;T=f+480|0;return 0}function Og(a,b){a=a|0;b=b|0;var c=0;c=T-160|0;T=c;w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];w[a+31|0]=z[b+31|0]&127;jb(c,a);xb(a,c);a=ya(a,32);T=c+160|0;return (a?-1:0)|0}function oh(a,b){a=a|0;b=b|0;var c=0,d=0;d=T+-64|0;T=d;rb(d,b,32,0);w[d|0]=z[d|0]&248;w[d+31|0]=z[d+31|0]&63|64;b=y[d+20>>2];c=y[d+16>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[d+12>>2];c=y[d+8>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[d+4>>2];c=y[d>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=y[d+28>>2];c=y[d+24>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;ja(d,64);T=d- -64|0;return 0}function tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=T+-64|0;T=e;rb(e,c,32,0);c=y[e+28>>2];d=y[e+24>>2];w[b+24|0]=d;w[b+25|0]=d>>>8;w[b+26|0]=d>>>16;w[b+27|0]=d>>>24;w[b+28|0]=c;w[b+29|0]=c>>>8;w[b+30|0]=c>>>16;w[b+31|0]=c>>>24;c=y[e+20>>2];d=y[e+16>>2];w[b+16|0]=d;w[b+17|0]=d>>>8;w[b+18|0]=d>>>16;w[b+19|0]=d>>>24;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;c=y[e+12>>2];d=y[e+8>>2];w[b+8|0]=d;w[b+9|0]=d>>>8;w[b+10|0]=d>>>16;w[b+11|0]=d>>>24;w[b+12|0]=c;w[b+13|0]=c>>>8;w[b+14|0]=c>>>16;w[b+15|0]=c>>>24;c=y[e+4>>2];d=y[e>>2];w[b|0]=d;w[b+1|0]=d>>>8;w[b+2|0]=d>>>16;w[b+3|0]=d>>>24;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;ja(e,64);a=wb(a,b);T=e- -64|0;return a|0}function xi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0;j=T;l=j;j=j-192&-32;T=j;Qe(i,h,j- -64|0);h=0;if(g>>>0>63){i=64;while(1){Pe(f+h|0,j- -64|0);h=i;i=i- -64|0;if(i>>>0<=g>>>0){continue}break}}i=h|32;if(i>>>0<=g>>>0){while(1){$b(f+h|0,j- -64|0);h=i;i=i+32|0;if(i>>>0<=g>>>0){continue}break}}i=g&31;if(i){k=32-i|0;if(k){o(i|j+32,0,k);}if(i){t(j+32|0,f+h|0,i);}$b(j+32|0,j- -64|0);}f=32;h=0;if(e>>>0>=32){while(1){Oe(a+h|0,d+h|0,j- -64|0);h=f;f=f+32|0;if(f>>>0<=e>>>0){continue}break}}f=e&31;a:{if(!f){break a}i=32-f|0;if(i){o(f|j+32,0,i);}i=!f;if(!i){t(j+32|0,d+h|0,f);}Oe(j,j+32|0,j- -64|0);if(i){break a}t(a+h|0,j,f);}Ne(b,c,g,e,j- -64|0);T=l;return 0}function Ng(a,b){a=a|0;b=b|0;var c=0,d=0;d=T+-64|0;T=d;Ya(a,d);c=y[d+28>>2];a=y[d+24>>2];w[b+24|0]=a;w[b+25|0]=a>>>8;w[b+26|0]=a>>>16;w[b+27|0]=a>>>24;w[b+28|0]=c;w[b+29|0]=c>>>8;w[b+30|0]=c>>>16;w[b+31|0]=c>>>24;c=y[d+20>>2];a=y[d+16>>2];w[b+16|0]=a;w[b+17|0]=a>>>8;w[b+18|0]=a>>>16;w[b+19|0]=a>>>24;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;c=y[d+12>>2];a=y[d+8>>2];w[b+8|0]=a;w[b+9|0]=a>>>8;w[b+10|0]=a>>>16;w[b+11|0]=a>>>24;w[b+12|0]=c;w[b+13|0]=c>>>8;w[b+14|0]=c>>>16;w[b+15|0]=c>>>24;c=y[d+4>>2];a=y[d>>2];w[b|0]=a;w[b+1|0]=a>>>8;w[b+2|0]=a>>>16;w[b+3|0]=a>>>24;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;T=d- -64|0;return 0}function Pc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(b>>>0>4294967168){return 48}a:{if(b>>>0>=4294967168){y[10172]=48;c=0;break a}f=b>>>0<11?16:b+11&-8;b=Da(f+76|0);c=0;if(!b){break a}c=b-8|0;b:{if(!(b&63)){b=c;break b}g=b-4|0;h=y[g>>2];b=(b+63&-64)-8|0;b=(b-c>>>0<=15?64:0)+b|0;d=b-c|0;e=(h&-8)-d|0;if(!(h&3)){c=y[c>>2];y[b+4>>2]=e;y[b>>2]=c+d;break b}y[b+4>>2]=e|y[b+4>>2]&1|2;e=b+e|0;y[e+4>>2]=y[e+4>>2]|1;y[g>>2]=d|y[g>>2]&1|2;e=c+d|0;y[e+4>>2]=y[e+4>>2]|1;Lc(c,d);}c=y[b+4>>2];c:{if(!(c&3)){break c}d=c&-8;if(d>>>0<=f+16>>>0){break c}y[b+4>>2]=f|c&1|2;c=b+f|0;f=d-f|0;y[c+4>>2]=f|3;d=b+d|0;y[d+4>>2]=y[d+4>>2]|1;Lc(c,f);}c=b+8|0;}if(!c){return 48}y[a>>2]=c;return 0}function le(a,b,c,d,e,f,g,h,i,j,k){if(b){o(a,0,b);}if((c|0)==1|c>>>0>1){y[10172]=22;return -1}a:{if(!c&b>>>0<=15){break a}if(!(!(f|i)&j>>>0<2147483649)){y[10172]=22;return -1}if(!((!i&h>>>0>=3|(i|0)!=0)&j>>>0>8191)|(a|0)==(d|0)){break a}if((k|0)==1){c=T+-64|0;T=c;if(a){za(a,b);}i=j>>>10|0;f=Da(b);b:{if(!f){d=-22;break b}y[c+28>>2]=0;y[c+32>>2]=0;y[c+24>>2]=16;y[c+20>>2]=g;y[c+16>>2]=e;y[c+12>>2]=d;y[c+8>>2]=b;y[c+4>>2]=f;y[c+36>>2]=0;y[c+40>>2]=0;y[c+60>>2]=0;y[c+56>>2]=1;y[c+52>>2]=1;y[c+48>>2]=i;y[c+44>>2]=h;d=Sb(c+4|0,1);if(!(!b|(d|!a))){t(a,f,b);}ja(f,b);ta(f);}T=c- -64|0;return d?-1:0}y[10172]=28;return -1}y[10172]=28;return -1}function cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=a;e=T-32|0;T=e;lc(b,c,d,e+28|0,e+20|0,e+12|0);a=0;a:{b:{c:{while(1){d:{if(!z[a+f|0]){b=a;break d}b=a+1|0;if(!z[f+b|0]){break d}b=a+2|0;if(!z[f+b|0]){break d}a=a+3|0;if((a|0)!=102){continue}break c}break}if((b|0)!=101){break c}c=e+8|0;d=e+16|0;a=0;e:{if(z[f|0]!=36|z[f+1|0]!=55|z[f+2|0]!=36){break e}b=eb(z[f+3|0]);y[e+24>>2]=b?b-1024|0:0;if(!b){break e}b=Mb(c,f+4|0);if(!b){break e}a=Mb(d,b);}if(a){break b}y[10172]=28;a=-1;break a}y[10172]=28;a=-1;break a}a=1;if(y[e+28>>2]!=y[e+24>>2]|y[e+12>>2]!=y[e+8>>2]){break a}a=y[e+20>>2]!=y[e+16>>2];}T=e+32|0;return a|0}function Qb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0;h=T-96|0;T=h;Sa(h,f,g,0);g=h+32|0;i=f+16|0;ac(g,32,0,i,h);f=-1;a:{b:{if(Jb(c,b,d,e,g)){break b}f=0;if(!a){break a}c:{d:{if(!(!((!e&b-a>>>0>>0|(e|0)!=0)&a>>>0>>0)&(!e&a-b>>>0>=d>>>0|a>>>0<=b>>>0))){if(d){t(a,b,d);}b=a;break d}if(!(d|e)){break c}}j=h- -64|0;f=!e&d>>>0>=32|(e|0)!=0;c=f?32:d;g=f?0:e;k=!c;if(!k){t(j,b,c);}f=h+32|0;l=f;f=g;m=c+32|0;f=m>>>0<32?f+1|0:f;Gb(l,l,m,f,i,h);if(!k){t(a,j,c);}ja(h+32|0,64);f=0;if(!e&d>>>0<33){break b}sb(a+c|0,b+c|0,d-c|0,e-(g+(c>>>0>d>>>0)|0)|0,i,1,0,h);break b}a=h+32|0;Gb(a,a,32,0,i,h);ja(a,64);}ja(h,32);}T=h+96|0;return f}function ce(a,b,c,d,e,f,g,h,i,j,k){if(b){o(a,0,b);}if((c|0)==1|c>>>0>1){y[10172]=22;return -1}a:{if(!c&b>>>0<=15){break a}if(!(!(f|i)&j>>>0<2147483649)){y[10172]=22;return -1}if(!(!!(h|i)&j>>>0>8191)|(a|0)==(d|0)){break a}if((k|0)==2){c=T+-64|0;T=c;if(a){za(a,b);}i=j>>>10|0;f=Da(b);b:{if(!f){d=-22;break b}y[c+28>>2]=0;y[c+32>>2]=0;y[c+24>>2]=16;y[c+20>>2]=g;y[c+16>>2]=e;y[c+12>>2]=d;y[c+8>>2]=b;y[c+4>>2]=f;y[c+36>>2]=0;y[c+40>>2]=0;y[c+60>>2]=0;y[c+56>>2]=1;y[c+52>>2]=1;y[c+48>>2]=i;y[c+44>>2]=h;d=Sb(c+4|0,2);if(!(!b|(d|!a))){t(a,f,b);}ja(f,b);ta(f);}T=c- -64|0;return d?-1:0}y[10172]=28;return -1}y[10172]=28;return -1}function Rb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0;h=T-96|0;T=h;Aa(h,f,g,0);g=h+32|0;i=f+16|0;Fb(g,32,0,i,h);f=-1;a:{b:{if(Jb(c,b,d,e,g)){break b}f=0;if(!a){break a}c:{d:{if(!(!((!e&b-a>>>0>>0|(e|0)!=0)&a>>>0>>0)&(!e&a-b>>>0>=d>>>0|a>>>0<=b>>>0))){if(d){t(a,b,d);}b=a;break d}if(!(d|e)){break c}}j=h- -64|0;f=!e&d>>>0>=32|(e|0)!=0;c=f?32:d;g=f?0:e;k=!c;if(!k){t(j,b,c);}f=h+32|0;l=f;f=g;m=c+32|0;f=m>>>0<32?f+1|0:f;Zb(l,l,m,f,i,h);if(!k){t(a,j,c);}f=0;if(!e&d>>>0<33){break b}hb(a+c|0,b+c|0,d-c|0,e-(g+(c>>>0>d>>>0)|0)|0,i,1,0,h);break b}a=h+32|0;Zb(a,a,32,0,i,h);}ja(h,32);}T=h+96|0;return f} +function ia(a,b,c){var d=0,e=0,f=0;d=y[b+12>>2];e=y[b+8>>2];f=y[b+4>>2];b=y[b>>2];y[a>>2]=y[c>>2]^(y[(d>>>22&1020)+37408>>2]^(y[(e>>>14&1020)+36384>>2]^(y[(f>>>6&1020)+35360>>2]^y[((b&255)<<2)+34336>>2])));y[a+4>>2]=y[c+4>>2]^(y[(b>>>22&1020)+37408>>2]^(y[(d>>>14&1020)+36384>>2]^(y[(e>>>6&1020)+35360>>2]^y[((f&255)<<2)+34336>>2])));y[a+8>>2]=y[c+8>>2]^(y[(f>>>22&1020)+37408>>2]^(y[(b>>>14&1020)+36384>>2]^(y[(d>>>6&1020)+35360>>2]^y[((e&255)<<2)+34336>>2])));y[a+12>>2]=y[c+12>>2]^(y[(e>>>22&1020)+37408>>2]^(y[(f>>>14&1020)+36384>>2]^(y[(b>>>6&1020)+35360>>2]^y[((d&255)<<2)+34336>>2])));}function yd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0;k=T-400|0;T=k;y[k+4>>2]=0;l=k+16|0;Aa(l,i,j,0);j=z[i+20|0]|z[i+21|0]<<8|(z[i+22|0]<<16|z[i+23|0]<<24);y[k+8>>2]=z[i+16|0]|z[i+17|0]<<8|(z[i+18|0]<<16|z[i+19|0]<<24);y[k+12>>2]=j;j=k+80|0;_a(j,64,0,k+4|0,l);i=k+144|0;Ga(i,j);ja(j,64);la(i,f,g,h);la(i,39776,0-g&15,0);la(i,b,c,d);la(i,39776,0-c&15,0);y[k+72>>2]=g;y[k+76>>2]=h;f=k+72|0;la(i,f,8,0);y[k+72>>2]=c;y[k+76>>2]=d;la(i,f,8,0);f=k+48|0;Fa(i,f);ja(i,256);i=db(f,e);ja(f,16);a:{if(!a){break a}if(i){if(c){o(a,0,c);}i=-1;break a}Be(a,b,c,d,k+4|0,k+16|0);i=0;}ja(k+16|0,32);T=k+400|0;return i}function Jd(a,b,c,d,e,f){var g=0,h=0;g=T-496|0;T=g;h=g+288|0;Xa(h,a,b);Ka(h,c,d,0);if(f){a=0;b=0;while(1){b=b+1|0;c=Di(b&16711935,8)|Di(b,24)&16711935;w[g+76|0]=c;w[g+77|0]=c>>>8;w[g+78|0]=c>>>16;w[g+79|0]=c>>>24;c=g+80|0;t(c,g+288|0,208);Ka(c,g+76|0,4,0);qb(c,g+32|0);c=y[g+60>>2];y[g+24>>2]=y[g+56>>2];y[g+28>>2]=c;c=y[g+52>>2];y[g+16>>2]=y[g+48>>2];y[g+20>>2]=c;c=y[g+44>>2];y[g+8>>2]=y[g+40>>2];y[g+12>>2]=c;c=y[g+36>>2];y[g>>2]=y[g+32>>2];y[g+4>>2]=c;c=f-a|0;c=c>>>0>=32?32:c;if(c){t(a+e|0,g,c);}a=b<<5;if(f>>>0>a>>>0){continue}break}}ja(g+288|0,208);T=g+496|0;}function Kd(a,b,c,d,e,f){var g=0,h=0,i=0;g=T-32|0;T=g;h=-1;i=c>>>0<32;a:{if(i&!d){break a}Zd(g,32,0,e,f);if(Jb(b+16|0,b+32|0,c-32|0,d-i|0,g)){break a}rc(a,b,c,d,e,f);w[a+24|0]=0;w[a+25|0]=0;w[a+26|0]=0;w[a+27|0]=0;w[a+28|0]=0;w[a+29|0]=0;w[a+30|0]=0;w[a+31|0]=0;w[a+16|0]=0;w[a+17|0]=0;w[a+18|0]=0;w[a+19|0]=0;w[a+20|0]=0;w[a+21|0]=0;w[a+22|0]=0;w[a+23|0]=0;w[a+8|0]=0;w[a+9|0]=0;w[a+10|0]=0;w[a+11|0]=0;w[a+12|0]=0;w[a+13|0]=0;w[a+14|0]=0;w[a+15|0]=0;w[a|0]=0;w[a+1|0]=0;w[a+2|0]=0;w[a+3|0]=0;w[a+4|0]=0;w[a+5|0]=0;w[a+6|0]=0;w[a+7|0]=0;h=0;}T=g+32|0;return h}function di(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-496|0;T=f;w[f+15|0]=1;a:{if(b>>>0<=16320){if(b>>>0>=64){g=64;while(1){i=g;g=f+80|0;Va(g,e,64);if(h){Na(g,(a+h|0)+-64|0,64,0);}g=f+80|0;Na(g,c,d,0);Na(g,f+15|0,1,0);Ya(g,a+h|0);w[f+15|0]=z[f+15|0]+1;h=i;g=h- -64|0;if(g>>>0<=b>>>0){continue}break}}b=b&63;if(b){h=f+80|0;Va(h,e,64);if(i){Na(h,(a+i|0)+-64|0,64,0);}e=f+80|0;Na(e,c,d,0);Na(e,f+15|0,1,0);c=f+16|0;Ya(e,c);if(b){t(a+i|0,c,b);}ja(f+16|0,64);}ja(f+80|0,416);a=0;break a}y[10172]=28;a=-1;}T=f+496|0;return a|0}function zd(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=T-384|0;T=l;y[l+4>>2]=0;m=l+16|0;Aa(m,j,k,0);k=z[j+20|0]|z[j+21|0]<<8|(z[j+22|0]<<16|z[j+23|0]<<24);y[l+8>>2]=z[j+16|0]|z[j+17|0]<<8|(z[j+18|0]<<16|z[j+19|0]<<24);y[l+12>>2]=k;k=l- -64|0;n=l+4|0;_a(k,64,0,n,m);j=l+128|0;Ga(j,k);ja(k,64);la(j,g,h,i);la(j,39776,0-h&15,0);Be(a,d,e,f,n,m);la(j,a,e,f);la(j,39776,0-e&15,0);y[l+56>>2]=h;y[l+60>>2]=i;a=l+56|0;la(j,a,8,0);y[l+56>>2]=e;y[l+60>>2]=f;la(j,a,8,0);Fa(j,b);ja(j,256);if(c){y[c>>2]=16;y[c+4>>2]=0;}ja(l+16|0,32);T=l+384|0;return 0}function Ch(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-256|0;T=f;w[f+15|0]=1;a:{if(b>>>0<=8160){if(b>>>0>=32){g=32;while(1){i=g;g=f+48|0;Xa(g,e,32);if(h){Ka(g,(a+h|0)-32|0,32,0);}g=f+48|0;Ka(g,c,d,0);Ka(g,f+15|0,1,0);qb(g,a+h|0);w[f+15|0]=z[f+15|0]+1;h=i;g=h+32|0;if(g>>>0<=b>>>0){continue}break}}b=b&31;if(b){h=f+48|0;Xa(h,e,32);if(i){Ka(h,(a+i|0)-32|0,32,0);}e=f+48|0;Ka(e,c,d,0);Ka(e,f+15|0,1,0);c=f+16|0;qb(e,c);if(b){t(a+i|0,c,b);}ja(f+16|0,32);}ja(f+48|0,208);a=0;break a}y[10172]=28;a=-1;}T=f+256|0;return a|0}function nc(a){var b=0,c=0,d=0;if(!a){return -25}if(!y[a>>2]){return -1}if(B[a+4>>2]<16){return -2}if(!(y[a+8>>2]|!y[a+12>>2])){return -18}b=y[a+20>>2];if(!y[a+16>>2]){return b?-19:-6}if(b>>>0<8){return -6}if(!(y[a+24>>2]|!y[a+28>>2])){return -20}if(!(y[a+32>>2]|!y[a+36>>2])){return -21}b=y[a+48>>2];if(!b){return -16}if(b>>>0>16777215){return -17}d=-14;c=y[a+44>>2];a:{if(c>>>0<8){break a}if(c>>>0>2097152){return -15}if(b<<3>>>0>c>>>0){break a}if(!y[a+40>>2]){return -12}a=y[a+52>>2];if(!a){return -28}d=a>>>0>16777215?-29:0;}return d}function ob(a,b){var c=0,d=0,e=0;d=b;a:{b:{c:{b=b&255;if(b){if(a&3){while(1){c=z[a|0];if(!c|(b|0)==(c|0)){break a}a=a+1|0;if(a&3){continue}break}}c=y[a>>2];if(((c|16843008-c)&-2139062144)!=-2139062144){break c}e=E(b,16843009);while(1){b=c^e;if(((16843008-b|b)&-2139062144)!=-2139062144){break c}c=y[a+4>>2];b=a+4|0;a=b;if(((16843008-c|c)&-2139062144)==-2139062144){continue}break}break b}a=Ha(a)+a|0;break a}b=a;}while(1){a=b;c=z[a|0];if(!c){break a}b=a+1|0;if((c|0)!=(d&255)){continue}break}}return z[a|0]==(d&255)?a:0}function he(a,b,c,d,e){var f=0,g=0,h=0;f=T+-64|0;T=f;h=Ha(a);a:{if(!(!c&h>>>0<128)){y[10172]=28;a=-1;break a}y[f+60>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;y[f+44>>2]=0;y[f+48>>2]=0;c=0;b:{if(!h){break b}c=h;}g=Da(c);if(!(!g|!(z[g-4|0]&3))){ja(g,c);}if(!g){a=-1;break a}y[f+12>>2]=g;y[f+20>>2]=g;y[f+24>>2]=h;y[f+4>>2]=g;y[f+16>>2]=h;y[f+28>>2]=0;y[f+32>>2]=0;y[f+8>>2]=h;y[f+36>>2]=0;y[f+40>>2]=0;c:{if(oe(f+4|0,a,e)){y[10172]=28;a=-1;break c}a=y[f+44>>2]!=(b|0)|y[f+48>>2]!=(d>>>10|0);}ta(g);}T=f- -64|0;return a}function rb(a,b,c,d){var e=0,f=0;e=T-208|0;T=e;y[e+72>>2]=0;y[e+76>>2]=0;y[e+64>>2]=0;y[e+68>>2]=0;f=y[9613];y[e>>2]=y[9612];y[e+4>>2]=f;f=y[9615];y[e+8>>2]=y[9614];y[e+12>>2]=f;f=y[9617];y[e+16>>2]=y[9616];y[e+20>>2]=f;f=y[9619];y[e+24>>2]=y[9618];y[e+28>>2]=f;f=y[9621];y[e+32>>2]=y[9620];y[e+36>>2]=f;f=y[9623];y[e+40>>2]=y[9622];y[e+44>>2]=f;f=y[9625];y[e+48>>2]=y[9624];y[e+52>>2]=f;f=y[9627];y[e+56>>2]=y[9626];y[e+60>>2]=f;va(e,b,c,d);Ca(e,a);T=e+208|0;return 0}function ff(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=0|e;h=h|l;e=T-16|0;T=e;b=b|l;if(b){o(a,0,b);}f=c|f;a:{if((f|0)==1|f>>>0>1){y[10172]=22;a=-1;break a}if(!c&b>>>0>=16|c){lc(h,i,j,e+12|0,e+8|0,e+4|0);if((a|0)==(d|0)){y[10172]=28;a=-1;break a}h=d;d=y[e+12>>2];c=d&31;if((d&63)>>>0>=32){d=1<>>32-c;}a=Fd(h,k,g,32,f,d,y[e+4>>2],y[e+8>>2],a,b);break a}y[10172]=28;a=-1;}T=e+16|0;return a|0}function ji(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=T-16|0;T=g;a:{b:{if(!d){b=-1;break b}f=d-1|0;c:{if(!(f&d)){h=c^-1;f=f&h;break c}h=c^-1;f=f-((c>>>0)%(d>>>0)|0)|0;}if(f>>>0>=h>>>0){break a}c=c+f|0;if(c>>>0>=e>>>0){b=-1;break b}if(a){y[a>>2]=c+1;}a=b+c|0;b=0;w[g+15|0]=0;c=0;while(1){e=a-c|0;h=e;i=z[e|0]&z[g+15|0];e=(c^f)-1>>>24|0;w[h|0]=i|e&128;w[g+15|0]=e|z[g+15|0];c=c+1|0;if((d|0)!=(c|0)){continue}break}}T=g+16|0;return b|0}na();s();}function Mh(a,b,c){a=a|0;b=b|0;c=c|0;za(b,24);Aa(a,b,c,0);w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;c=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);b=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);w[a+44|0]=0;w[a+45|0]=0;w[a+46|0]=0;w[a+47|0]=0;w[a+48|0]=0;w[a+49|0]=0;w[a+50|0]=0;w[a+51|0]=0;w[a+36|0]=c;w[a+37|0]=c>>>8;w[a+38|0]=c>>>16;w[a+39|0]=c>>>24;w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;return 0}function Lh(a,b,c){a=a|0;b=b|0;c=c|0;Aa(a,b,c,0);w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;c=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);b=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);w[a+44|0]=0;w[a+45|0]=0;w[a+46|0]=0;w[a+47|0]=0;w[a+48|0]=0;w[a+49|0]=0;w[a+50|0]=0;w[a+51|0]=0;w[a+36|0]=c;w[a+37|0]=c>>>8;w[a+38|0]=c>>>16;w[a+39|0]=c>>>24;w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;return 0}function Za(a){a=a|0;var b=0;y[a+72>>2]=0;y[a+76>>2]=0;b=a- -64|0;y[b>>2]=0;y[b+4>>2]=0;b=y[9613];y[a>>2]=y[9612];y[a+4>>2]=b;b=y[9615];y[a+8>>2]=y[9614];y[a+12>>2]=b;b=y[9617];y[a+16>>2]=y[9616];y[a+20>>2]=b;b=y[9619];y[a+24>>2]=y[9618];y[a+28>>2]=b;b=y[9621];y[a+32>>2]=y[9620];y[a+36>>2]=b;b=y[9623];y[a+40>>2]=y[9622];y[a+44>>2]=b;b=y[9625];y[a+48>>2]=y[9624];y[a+52>>2]=b;b=y[9627];y[a+56>>2]=y[9626];y[a+60>>2]=b;return 0}function ya(a,b){var c=0,d=0,e=0,f=0,g=0;c=T-16|0;w[c+15|0]=0;a:{if(!b){break a}e=b&3;if(b>>>0>=4){g=b&-4;while(1){b=a+d|0;w[c+15|0]=z[b|0]|z[c+15|0];w[c+15|0]=z[b+1|0]|z[c+15|0];w[c+15|0]=z[b+2|0]|z[c+15|0];w[c+15|0]=z[b+3|0]|z[c+15|0];d=d+4|0;f=f+4|0;if((g|0)!=(f|0)){continue}break}if(!e){break a}}b=0;while(1){w[c+15|0]=z[a+d|0]|z[c+15|0];d=d+1|0;b=b+1|0;if((e|0)!=(b|0)){continue}break}}return z[c+15|0]-1>>>31|0}function dc(a){return (((z[a+31|0]^-1)&127|z[a+1|0]&(z[a+2|0]&(z[a+3|0]&(z[a+4|0]&(z[a+5|0]&(z[a+6|0]&(z[a+7|0]&(z[a+8|0]&(z[a+9|0]&(z[a+10|0]&(z[a+11|0]&(z[a+12|0]&(z[a+13|0]&(z[a+14|0]&(z[a+15|0]&(z[a+16|0]&(z[a+17|0]&(z[a+18|0]&(z[a+19|0]&(z[a+20|0]&(z[a+21|0]&(z[a+22|0]&(z[a+23|0]&(z[a+24|0]&(z[a+25|0]&(z[a+26|0]&(z[a+27|0]&(z[a+28|0]&(z[a+30|0]&z[a+29|0]))))))))))))))))))))))))))))^255)-1&236-z[a|0]^-1)>>>8&1}function $a(a,b,c){var d=0,e=0,f=0;d=T-16|0;y[d+12>>2]=a;y[d+8>>2]=b;a=0;w[d+7|0]=0;a:{if(!c){break a}if((c|0)!=1){b=c&1;f=c&-2;c=0;while(1){w[d+7|0]=z[d+7|0]|z[y[d+12>>2]+a|0]^z[y[d+8>>2]+a|0];e=a|1;w[d+7|0]=z[d+7|0]|z[e+y[d+12>>2]|0]^z[y[d+8>>2]+e|0];a=a+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}if(!b){break a}}w[d+7|0]=z[d+7|0]|z[y[d+12>>2]+a|0]^z[y[d+8>>2]+a|0];}return (z[d+7|0]-1>>>31|0)-1|0}function df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=a;g=c;c=0;d=T-128|0;T=d;a:{b:{while(1){if(!z[c+e|0]){a=c;break b}a=c+1|0;if(!z[e+a|0]){break b}a=c+2|0;if(!z[e+a|0]){break b}c=c+3|0;if((c|0)!=102){continue}break}c=-1;break a}c=-1;if((a|0)!=101){break a}f=d+4|0;if(mc(f));a=d+16|0;o(a,0,102);b=Gd(f,b,g,e,a);Ob(f);if(!b){break a}c=$a(a,e,102);ja(a,102);}T=d+128|0;return c|0}function Od(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0;k=T-352|0;T=k;m=k+32|0;_a(m,64,0,i,j);l=k+96|0;Ga(l,m);ja(m,64);la(l,f,g,h);la(l,39744,0-g&15,0);la(l,b,c,d);la(l,39744,0-c&15,0);y[k+24>>2]=g;y[k+28>>2]=h;f=k+24|0;la(l,f,8,0);y[k+24>>2]=c;y[k+28>>2]=d;la(l,f,8,0);Fa(l,k);ja(l,256);f=db(k,e);ja(k,16);a:{if(!a){break a}if(f){if(c){o(a,0,c);}f=-1;break a}gb(a,b,c,d,i,1,j);f=0;}T=k+352|0;return f}function yb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;while(1){c=z[a+d|0];b=d+2688|0;e=c^z[b|0]|e;f=c^z[b+192|0]|f;g=c^z[b+160|0]|g;h=c^z[b+128|0]|h;i=c^z[b+96|0]|i;j=c^z[b- -64|0]|j;k=c^z[b+32|0]|k;d=d+1|0;if((d|0)!=31){continue}break}a=z[a+31|0]&127;b=a^127;return (((b|f)&255)-1|(((b|g)&255)-1|(((b|h)&255)-1|(((a^122|i)&255)-1|(((a^5|j)&255)-1|(((a|k)&255)-1|((a|e)&255)-1))))))>>>8&1}function ed(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:{b:{c:{d:{if(!e&d>>>0<64){break d}e=e-1|0;h=e+1|0;g=e;e=d+-64|0;d=e>>>0<4294967232?h:g;if(!d&e>>>0>4294967231|d){break d}g=c;c=c- -64|0;if(!pc(g,c,e,d,f,0)){break c}if(!a|!e){break d}o(a,0,e);}d=-1;if(!b){break b}y[b>>2]=0;y[b+4>>2]=0;d=-1;break a}if(b){y[b>>2]=e;y[b+4>>2]=d;}d=0;if(!a|!e){break b}t(a,c,e);}}return d|0}function Ci(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0;}else {d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d;}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0;}else {c=b>>>d|0;a=((1<>>d;}a=a|g;W=c|f;return a}function ld(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=T-32|0;T=g;h=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[g+24>>2]=0;y[g+28>>2]=0;y[g+16>>2]=h;y[g+20>>2]=e;y[g+8>>2]=0;y[g+12>>2]=0;y[g>>2]=c;y[g+4>>2]=d;a:{if(b-65>>>0<=4294967246){y[10172]=28;a=-1;break a}a=qe(a,b,0,0,0,f,32,g,g+16|0);}T=g+32|0;return a|0}function vd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=T-512|0;T=f;g=f+32|0;Va(g,e,32);Na(g,b,c,d);Ya(g,f+448|0);b=y[f+476>>2];y[f+24>>2]=y[f+472>>2];y[f+28>>2]=b;b=y[f+468>>2];y[f+16>>2]=y[f+464>>2];y[f+20>>2]=b;b=y[f+460>>2];y[f+8>>2]=y[f+456>>2];y[f+12>>2]=b;b=y[f+452>>2];y[f>>2]=y[f+448>>2];y[f+4>>2]=b;b=kb(a,f);c=$a(f,a,32);T=f+512|0;return ((a|0)==(f|0)?-1:b)|c}function Pd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0;k=T-352|0;T=k;m=k+32|0;Fb(m,64,0,i,j);l=k+96|0;Ga(l,m);ja(m,64);la(l,f,g,h);y[k+24>>2]=g;y[k+28>>2]=h;f=k+24|0;la(l,f,8,0);la(l,b,c,d);y[k+24>>2]=c;y[k+28>>2]=d;la(l,f,8,0);Fa(l,k);ja(l,256);f=db(k,e);ja(k,16);a:{if(!a){break a}if(f){if(c){o(a,0,c);}f=-1;break a}hb(a,b,c,d,i,1,0,j);f=0;}T=k+352|0;return f}function Qd(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=T-336|0;T=l;n=l+16|0;_a(n,64,0,j,k);m=l+80|0;Ga(m,n);ja(n,64);la(m,g,h,i);la(m,39744,0-h&15,0);gb(a,d,e,f,j,1,k);la(m,a,e,f);la(m,39744,0-e&15,0);y[l+8>>2]=h;y[l+12>>2]=i;a=l+8|0;la(m,a,8,0);y[l+8>>2]=e;y[l+12>>2]=f;la(m,a,8,0);Fa(m,b);ja(m,256);if(c){y[c>>2]=16;y[c+4>>2]=0;}T=l+336|0;return 0}function Wc(a,b,c){var d=0;d=T-16|0;y[d+12>>2]=a;y[d+8>>2]=b;a=0;x[d+6>>1]=0;while(1){x[d+6>>1]=A[d+6>>1]|z[y[d+12>>2]+a|0]^z[y[d+8>>2]+a|0];b=a|1;x[d+6>>1]=A[d+6>>1]|z[b+y[d+12>>2]|0]^z[b+y[d+8>>2]|0];a=a+2|0;if((c|0)!=(a|0)){continue}break}x[d+6>>1]=A[d+6>>1];x[d+6>>1]=A[d+6>>1]-1;x[d+6>>1]=A[20608]>>>2^A[d+6>>1]>>>15;return A[d+6>>1]-1|0}function ii(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=T-16|0;y[e+12>>2]=0;if(d-1>>>0>>0){f=c-1|0;j=f+b|0;c=0;b=0;while(1){g=z[j-c|0];i=((g^128)-1&(y[e+12>>2]-1&h-1))>>>8&1;y[e+12>>2]=y[e+12>>2]|0-i&c;b=b|i;h=h|g;c=c+1|0;if((d|0)!=(c|0)){continue}break}y[a>>2]=f-y[e+12>>2];a=(b&255)-1|0;}else {a=-1;}return a|0}function Ah(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(!(d>>>0>2147483646|d<<1>>>0>=b>>>0)){b=0;if(d){while(1){e=(b<<1)+a|0;g=z[b+c|0];f=g&15;w[e+1|0]=((f<<8)+(f+65526&55552)|0)+22272>>>8;f=e;e=g>>>4|0;w[f|0]=((e+65526>>>8&217)+e|0)+87;b=b+1|0;if((d|0)!=(b|0)){continue}break}b=d<<1;}else {b=0;}w[b+a|0]=0;return a|0}na();s();}function zc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;f=z[a|0];a:{if((f-58&255)>>>0<246){break a}c=f;d=a;while(1){g=d;if(e>>>0>429496729){break a}c=(c&255)-48|0;e=E(e,10);if(c>>>0>(e^-1)>>>0){break a}e=e+c|0;d=d+1|0;c=z[d|0];if((c-58&255)>>>0>245){continue}break}if((f|0)==48&(a|0)!=(g|0)|(a|0)==(d|0)){break a}y[b>>2]=e;h=d;}return h}function fd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=T-16|0;T=g;h=a- -64|0;if(d){t(h,c,d);}c=0;qc(a,g+8|0,h,d,e,f,0);a:{if(y[g+12>>2]|y[g+8>>2]!=64){if(b){y[b>>2]=0;y[b+4>>2]=0;}b=d- -64|0;if(b){o(a,0,b);}c=-1;break a}if(!b){break a}y[b>>2]=d- -64;y[b+4>>2]=e-((d>>>0<4294967232)-1|0);}T=g+16|0;return c|0}function eb(a){var b=0,c=0,d=0,e=0;b=65;c=1024;d=a&255;a:{b:{if((d|0)!=z[1024]){d=E(d,16843009);while(1){e=d^y[c>>2];if(((e|16843008-e)&-2139062144)!=-2139062144){break b}c=c+4|0;b=b-4|0;if(b>>>0>3){continue}break}}if(!b){break a}}a=a&255;while(1){if((a|0)==z[c|0]){return c}c=c+1|0;b=b-1|0;if(b){continue}break}}return 0}function Rf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=T-112|0;T=e;y[e+40>>2]=0;y[e+44>>2]=0;f=y[9833];y[e+8>>2]=y[9832];y[e+12>>2]=f;f=y[9835];y[e+16>>2]=y[9834];y[e+20>>2]=f;f=y[9837];y[e+24>>2]=y[9836];y[e+28>>2]=f;f=y[9839];y[e+32>>2]=y[9838];y[e+36>>2]=f;f=e+8|0;La(f,b,c,d);Ua(f,a);T=e+112|0;return 0}function Sd(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=T-336|0;T=l;n=l+16|0;Fb(n,64,0,j,k);m=l+80|0;Ga(m,n);ja(n,64);la(m,g,h,i);y[l+8>>2]=h;y[l+12>>2]=i;g=l+8|0;la(m,g,8,0);hb(a,d,e,f,j,1,0,k);la(m,a,e,f);y[l+8>>2]=e;y[l+12>>2]=f;la(m,g,8,0);Fa(m,b);ja(m,256);if(c){y[c>>2]=16;y[c+4>>2]=0;}T=l+336|0;return 0}function Ld(a,b,c,d,e,f){if(!d&c>>>0>=32|d){rc(a,b,c,d,e,f);Zc(a+16|0,a+32|0,c-32|0,d-(c>>>0<32)|0,a);w[a+8|0]=0;w[a+9|0]=0;w[a+10|0]=0;w[a+11|0]=0;w[a+12|0]=0;w[a+13|0]=0;w[a+14|0]=0;w[a+15|0]=0;w[a|0]=0;w[a+1|0]=0;w[a+2|0]=0;w[a+3|0]=0;w[a+4|0]=0;w[a+5|0]=0;w[a+6|0]=0;w[a+7|0]=0;a=0;}else {a=-1;}return a}function Ha(a){var b=0,c=0,d=0;a:{b:{b=a;if(!(b&3)){break b}if(!z[b|0]){return 0}while(1){b=b+1|0;if(!(b&3)){break b}if(z[b|0]){continue}break}break a}while(1){c=b;b=b+4|0;d=y[c>>2];if(((d|16843008-d)&-2139062144)==-2139062144){continue}break}while(1){b=c;c=b+1|0;if(z[b|0]){continue}break}}return b-a|0}function Mb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{c=eb(z[b|0]);if(!c){break a}d=eb(z[b+1|0]);if(!d){break a}e=eb(z[b+2|0]);if(!e){break a}f=eb(z[b+3|0]);if(!f){break a}g=eb(z[b+4|0]);if(!g){break a}y[a>>2]=c-1024|d-1024<<6|e-1024<<12|f-1024<<18|g-1024<<24;return b+5|0}y[a>>2]=0;return 0}function Hf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;b=0|b;e=e|l;h=h|l;a:{b:{switch(k-1|0){case 0:a=le(a,b,c,d,e,f,g,h,i,j,1);break a;case 1:a=ce(a,b,c,d,e,f,g,h,i,j,2);break a;default:break b}}y[10172]=28;a=-1;}return a|0}function Tc(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;m=-1;l=d>>>0<32;a:{if(l&!e){break a}l=e-l|0;n=d-32|0;if(!l&n>>>0>4294967263|l|(!h&g>>>0>4294967263|h)){break a}m=X[y[k>>2]](a,c,n,(c+d|0)-32|0,32,f,g,i,j)|0;}if(b){y[b>>2]=m?0:d-32|0;y[b+4>>2]=m?0:e-(d>>>0<32)|0;}return m}function Gc(a,b){var c=0,d=0,e=0,f=0;c=T-896|0;T=c;d=c+848|0;cb(d,b);e=c+800|0;cb(e,b+32|0);f=c+320|0;Fc(f,d);b=c+160|0;Fc(b,e);d=c+640|0;qa(d,b);b=c+480|0;sa(b,f,d);d=c+600|0;ga(c,b,d);e=c+520|0;f=c+560|0;ga(c+40|0,e,f);ga(c+80|0,f,d);ga(c+120|0,b,e);xb(a,c);T=c+896|0;}function lg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;h=0|h;c=-1;e=e|l;if(!f&e>>>0>=16|f){c=Pd(a,d,e-16|0,f-(e>>>0<16)|0,(d+e|0)-16|0,g,h,i,j,k);}if(b){y[b>>2]=c?0:e-16|0;y[b+4>>2]=c?0:f-(e>>>0<16)|0;}return c|0}function jg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;h=0|h;c=-1;e=e|l;if(!f&e>>>0>=16|f){c=Od(a,d,e-16|0,f-(e>>>0<16)|0,(d+e|0)-16|0,g,h,i,j,k);}if(b){y[b>>2]=c?0:e-16|0;y[b+4>>2]=c?0:f-(e>>>0<16)|0;}return c|0}function fg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;h=0|h;c=-1;e=e|l;if(!f&e>>>0>=16|f){c=yd(a,d,e-16|0,f-(e>>>0<16)|0,(d+e|0)-16|0,g,h,i,j,k);}if(b){y[b>>2]=c?0:e-16|0;y[b+4>>2]=c?0:f-(e>>>0<16)|0;}return c|0}function qg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;i=0;g=i|g;a:{d=d|i;if(!e&d>>>0<4294967280){Sd(a,a+d|0,0,c,d,e,f,g,h,j,k);if(b){a=d+16|0;e=a>>>0<16?e+1|0:e;y[b>>2]=a;y[b+4>>2]=e;}break a}na();s();}return 0}function ng(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;i=0;g=i|g;a:{d=d|i;if(!e&d>>>0<4294967280){Qd(a,a+d|0,0,c,d,e,f,g,h,j,k);if(b){a=d+16|0;e=a>>>0<16?e+1|0:e;y[b>>2]=a;y[b+4>>2]=e;}break a}na();s();}return 0}function hg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;i=0;g=i|g;a:{d=d|i;if(!e&d>>>0<4294967280){zd(a,a+d|0,0,c,d,e,f,g,h,j,k);if(b){a=d+16|0;e=a>>>0<16?e+1|0:e;y[b>>2]=a;y[b+4>>2]=e;}break a}na();s();}return 0}function hf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T;i=g;h=g-448&-64;T=h;g=-1;if(!d&c>>>0>=48|d){g=h- -64|0;Ja(g,0,0,24);oa(g,b,32,0);oa(g,e,32,0);e=h+32|0;Ia(g,e,24);g=_d(a,b+32|0,c-32|0,d-(c>>>0<32)|0,e,b,f);}T=i;return g|0}function Uf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T;i=g;h=g-448&-64;T=h;g=-1;if(!d&c>>>0>=48|d){g=h- -64|0;Ja(g,0,0,24);oa(g,b,32,0);oa(g,e,32,0);e=h+32|0;Ia(g,e,24);g=Ad(a,b+32|0,c-32|0,d-(c>>>0<32)|0,e,b,f);}T=i;return g|0}function ai(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;f=-1;e=d+640|0;a:{if(ab(e,b)){break a}if(!zb(e)){break a}b=d+480|0;if(ab(b,c)){break a}if(!zb(b)){break a}qa(d,b);b=d+160|0;sa(b,e,d);c=d+320|0;Ib(c,b);Wa(a,c);f=0;}T=d+800|0;return f|0}function $h(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;f=-1;e=d+640|0;a:{if(ab(e,b)){break a}if(!zb(e)){break a}b=d+480|0;if(ab(b,c)){break a}if(!zb(b)){break a}qa(d,b);b=d+160|0;Hb(b,e,d);c=d+320|0;Ib(c,b);Wa(a,c);f=0;}T=d+800|0;return f|0}function Ke(a){var b=0,c=0,d=0,e=0,f=0;b=1;while(1){d=b;b=a+e|0;c=d+z[b|0]|0;w[b|0]=c;c=z[b+1|0]+(c>>>8|0)|0;w[b+1|0]=c;c=z[b+2|0]+(c>>>8|0)|0;w[b+2|0]=c;d=b;b=z[b+3|0]+(c>>>8|0)|0;w[d+3|0]=b;b=b>>>8|0;e=e+4|0;f=f+4|0;if((f|0)!=4){continue}break}}function ke(a,b,c,d,e,f,g){var h=0;h=T-16|0;T=h;o(a,0,128);a:{if(!(!(d|f)&g>>>0<2147483649)){y[10172]=22;a=-1;break a}if(!((!f&e>>>0>=3|(f|0)!=0)&g>>>0>8191)){y[10172]=28;a=-1;break a}za(h,16);a=ne(e,g>>>10|0,b,c,h,a,1)?-1:0;}T=h+16|0;return a}function Rd(a,b){var c=0;a:{if(!(b&4)){break a}b=y[a>>2];if(b){ja(y[b+4>>2],y[a+16>>2]<<10);}b=y[a+4>>2];if(!b){break a}ja(b,y[a+20>>2]<<3);}ta(y[a+4>>2]);y[a+4>>2]=0;b=y[a>>2];b:{if(!b){break b}c=y[b>>2];if(!c){break b}ta(c);}ta(b);y[a>>2]=0;}function of(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;j=d;d=e;i=T+-64|0;T=i;a:{if(Ea(i+32|0,h,g)){e=-1;break a}e=-1;if(Aa(i,39680,i+32|0,0));e=Bb(a,b,c,j,d,f,i);ja(i,32);}T=i- -64|0;return e|0}function lf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;j=d;d=e;i=T+-64|0;T=i;a:{if(Ea(i+32|0,h,g)){e=-1;break a}e=-1;if(Aa(i,39680,i+32|0,0));e=Rb(a,b,c,j,d,f,i);ja(i,32);}T=i- -64|0;return e|0}function Vc(a,b,c,d,e,f,g,h,i,j,k){a:{if(!(!e&d>>>0>4294967263|(e|0)!=0|(!h&g>>>0>=4294967264|(h|0)!=0))){a=X[y[k>>2]](a,a+d|0,32,c,d,f,g,i,j)|0;if(b){c=d+32|0;d=c>>>0<32?e+1|0:e;y[b>>2]=a?0:c;y[b+4>>2]=a?0:d;}break a}na();s();}return a}function pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a:{d=T-16|0;T=d;if(!c){if(b|c){while(1){w[d+15|0]=0;f=a+e|0,g=P(39864,d+15|0,0)|0,w[f|0]=g;e=e+1|0;if((b|0)!=(e|0)){continue}break}}T=d+16|0;break a}Q(1346,1192,198,1092);s();}}function ag(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=T-544|0;T=f;g=f- -64|0;Va(g,e,32);va(g,b,c,d);b=f+480|0;Ca(g,b);c=f+272|0;va(c,b,64,0);Ca(c,f);ja(b,64);b=xd(a,f);c=$a(f,a,64);T=f+544|0;return ((a|0)==(f|0)?-1:b)|c}function cg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=T-272|0;T=f;g=f+32|0;Xa(g,e,32);La(g,b,c,d);b=f+240|0;Ua(g,b);c=f+136|0;La(c,b,32,0);Ua(c,f);ja(b,32);b=kb(a,f);c=$a(f,a,32);T=f+272|0;return ((a|0)==(f|0)?-1:b)|c}function Jc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;b=32;c=1;while(1){d=b-2|0;e=z[d+a|0];f=z[d+2912|0];b=b-1|0;g=z[b+2912|0];h=z[a+b|0];b=(g^h)-1>>8&c;i=e-f>>8&b|(h-g>>8&c|i);c=b&(e^f)-1>>8;b=d;if(b){continue}break}return (i|0)!=0}function be(a,b,c,d,e,f,g){var h=0;h=T-16|0;T=h;o(a,0,128);a:{if(!(!(d|f)&g>>>0<2147483649)){y[10172]=22;a=-1;break a}if(!(!!(e|f)&g>>>0>8191)){y[10172]=28;a=-1;break a}za(h,16);a=ne(e,g>>>10|0,b,c,h,a,2)?-1:0;}T=h+16|0;return a}function Ub(a){a=a|0;var b=0;y[a+32>>2]=0;y[a+36>>2]=0;b=y[9833];y[a>>2]=y[9832];y[a+4>>2]=b;b=y[9835];y[a+8>>2]=y[9834];y[a+12>>2]=b;b=y[9837];y[a+16>>2]=y[9836];y[a+20>>2]=b;b=y[9839];y[a+24>>2]=y[9838];y[a+28>>2]=b;return 0}function _d(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0;h=T+-64|0;T=h;i=-1;j=c>>>0<16;a:{if(j&!d){break a}k=h+32|0;if(Ea(k,g,f)){break a}if(Aa(h,39680,k,0));i=Rb(a,b+16|0,b,c-16|0,d-j|0,e,h);ja(h,32);}T=h- -64|0;return i}function Gf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;c=0|c;e=e|i;a:{b:{switch(h-1|0){case 1:a=be(a,b,c,d,e,f,g);break a;default:na();s();case 0:break b}}a=ke(a,b,c,d,e,f,g);}return a|0}function Ai(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=E(e,f);g=c&65535;h=a&65535;i=E(g,h);f=(i>>>16|0)+E(f,g)|0;e=(f&65535)+E(e,h)|0;W=(E(b,c)+j|0)+E(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function pb(a,b,c){var d=0,e=0;if(!c){return 0}d=z[a|0];if(d){a:{while(1){e=z[b|0];if((e|0)!=(d|0)|!e){break a}c=c-1|0;if(!c){break a}b=b+1|0;d=z[a+1|0];a=a+1|0;if(d){continue}break}d=0;}}else {d=0;}return d-z[b|0]|0}function gb(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=d;i=c+63|0;h=i>>>0<63?h+1|0:h;j=h>>>6|0;h=(h&63)<<26|i>>>6;i=0-h|0;if(!((j+((h|0)!=0)|0)==1&f>>>0>i>>>0|((d|0)==1|d>>>0>1))){return X[y[9965]](a,b,c,d,e,f,g)|0}na();s();}function Xh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;e=-1;f=d+640|0;a:{if(ib(f,b)){break a}b=d+480|0;if(ib(b,c)){break a}qa(d,b);b=d+160|0;sa(b,f,d);c=d+320|0;Ib(c,b);xb(a,c);e=0;}T=d+800|0;return e|0}function Wh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;e=-1;f=d+640|0;a:{if(ib(f,b)){break a}b=d+480|0;if(ib(b,c)){break a}qa(d,b);b=d+160|0;Hb(b,f,d);c=d+320|0;Ib(c,b);xb(a,c);e=0;}T=d+800|0;return e|0}function td(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=T+-64|0;T=h;a:{if(Ea(h+32|0,g,f)){f=-1;break a}f=-1;if(Sa(h,39760,h+32|0,0));f=Ld(a,b,c,d,e,h);ja(h,32);}T=h- -64|0;return f|0}function sd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=T+-64|0;T=h;a:{if(Ea(h+32|0,g,f)){f=-1;break a}f=-1;if(Sa(h,39760,h+32|0,0));f=Kd(a,b,c,d,e,h);ja(h,32);}T=h- -64|0;return f|0}function $d(a,b,c,d,e,f,g){var h=0;h=T+-64|0;T=h;if(!d&c>>>0<4294967280){a:{if(Ea(h+32|0,g,f)){g=-1;break a}g=-1;if(Aa(h,39680,h+32|0,0));g=Bb(a+16|0,a,b,c,d,e,h);ja(h,32);}T=h- -64|0;return g}na();s();}function Ec(a,b){var c=0,d=0,e=0,f=0,g=0;while(1){d=a+e|0;c=z[d|0]-(z[b+e|0]+c|0)|0;w[d|0]=c;d=e|1;f=d+a|0;c=z[f|0]-(z[b+d|0]+(c>>>8&1)|0)|0;w[f|0]=c;c=c>>>8&1;e=e+2|0;g=g+2|0;if((g|0)!=64){continue}break}}function De(a,b){var c=0,d=0,e=0,f=0,g=0;while(1){d=a+e|0;c=z[b+e|0]+(z[d|0]+c|0)|0;w[d|0]=c;d=e|1;f=d+a|0;c=z[b+d|0]+(z[f|0]+(c>>>8|0)|0)|0;w[f|0]=c;c=c>>>8|0;e=e+2|0;g=g+2|0;if((g|0)!=32){continue}break}}function lb(a){var b=0,c=0,d=0;c=y[9948];a=a+7|0;b=a>>>0<7?1:b;d=a&-8;a=d+c|0;a:{if(!(a>>>0>>0?b+1|0:b)){if(a>>>0<=Y()<<16>>>0){break a}if(S(a|0)|0){break a}}y[10172]=48;return -1}y[9948]=a;return c}function mi(a){a=a|0;var b=0,c=0,d=0;b=T-16|0;T=b;if(a>>>0>=2){c=(0-a>>>0)%(a>>>0)|0;while(1){w[b+15|0]=0;d=P(39864,b+15|0,0)|0;if(c>>>0>d>>>0){continue}break}c=(d>>>0)%(a>>>0)|0;}T=b+16|0;return c|0}function Yf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=d;d=e;j=i|0;i=T-32|0;T=i;e=-1;if(!mb(i,g,h)){e=Qb(a,b,c,j,d,f,i);ja(i,32);}T=i+32|0;return e|0}function $f(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=d;d=e;j=i|0;i=T-32|0;T=i;e=-1;if(!mb(i,g,h)){e=Ab(a,b,c,j,d,f,i);ja(i,32);}T=i+32|0;return e|0}function za(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=T-16|0;T=c;if(b){while(1){w[c+15|0]=0;e=a+d|0,f=P(39864,c+15|0,0)|0,w[e|0]=f;d=d+1|0;if((d|0)!=(b|0)){continue}break}}T=c+16|0;}function qf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=T-32|0;T=i;Sa(i,e,h,0);h=a;a=0;a=sb(h,b,a|c,d,e+16|0,a|f,g,i);ja(i,32);T=i+32|0;return a|0}function dg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-240|0;T=f;Xa(f,e,32);La(f,b,c,d);b=f+208|0;Ua(f,b);c=f+104|0;La(c,b,32,0);Ua(c,a);ja(b,32);T=f+240|0;return 0}function bg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-480|0;T=f;Va(f,e,32);va(f,b,c,d);b=f+416|0;Ca(f,b);c=f+208|0;va(c,b,64,0);Ca(c,a);ja(b,64);T=f+480|0;return 0}function Ad(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=T-32|0;T=h;i=-1;j=c>>>0<16;a:{if(j&!d){break a}if(mb(h,f,g)){break a}i=Qb(a,b+16|0,b,c-16|0,d-j|0,e,h);ja(h,32);}T=h+32|0;return i}function We(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=T-32|0;T=i;Aa(i,e,h,0);h=a;a=0;a=hb(h,b,a|c,d,e+16|0,a|f,g,i);T=i+32|0;return a|0}function Wa(a,b){var c=0,d=0,e=0;c=T-176|0;T=c;d=c+96|0;bb(d,b+80|0);e=c+48|0;ga(e,b,d);ga(c,b+40|0,d);pa(a,c);pa(c+144|0,e);w[a+31|0]=z[a+31|0]^z[c+144|0]<<7;T=c+176|0;}function Fd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;k=T-16|0;T=k;m=-1;l=k+4|0;if(!mc(l)){m=(n=-1,o=Id(l,a,b,c,d,e,f,g,h,i,j),p=Ob(l),p?n:o);}T=k+16|0;return m}function Uc(a,b,c,d,e,f,g,h,i,j,k,l){if(c){y[c>>2]=32;y[c+4>>2]=0;}if(!(!i&h>>>0<4294967264&(!f&e>>>0<=4294967263))){na();s();}return X[y[l>>2]](a,b,32,d,e,g,h,j,k)|0}function bi(a){a=a|0;var b=0,c=0;b=T-160|0;T=b;a:{if(!dc(a)){break a}if(yb(a)){break a}if(ab(b,a)){break a}if(!zb(b)){break a}c=(ec(b)|0)!=0;}T=b+160|0;return c|0}function Pf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;l=a;a=0;return le(l,a|b,c,d,a|e,f,g,a|h,i,j,k)|0}function Kf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;l=a;a=0;return ce(l,a|b,c,d,a|e,f,g,a|h,i,j,k)|0}function Ff(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a:{if(!pb(a,1564,10)){a=ae(a,b,c,d);break a}if(!pb(a,1554,9)){a=je(a,b,c,d);break a}y[10172]=28;a=-1;}return a|0}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a:{if(!pb(a,1564,10)){a=ge(a,b,c,d);break a}if(!pb(a,1554,9)){a=ie(a,b,c,d);break a}y[10172]=28;a=-1;}return a|0}function Bd(a,b,c,d,e,f,g){var h=0,i=0;h=T-32|0;T=h;if(!d&c>>>0<4294967280){i=-1;if(!mb(h,f,g)){i=Ab(a+16|0,a,b,c,d,e,h);ja(h,32);}T=h+32|0;return i}na();s();}function rg(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;j=a;a=0;return Sd(j,b,c,d,a|e,f,g,a|h,i,k,l)|0}function pg(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;j=a;a=0;return Qd(j,b,c,d,a|e,f,g,a|h,i,k,l)|0}function ig(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;j=a;a=0;return zd(j,b,c,d,a|e,f,g,a|h,i,k,l)|0}function yg(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;k=k|0;l=l|0;return Uc(a,b,c,d,e,f,g,h,i,k,l,39832)|0}function ug(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;k=k|0;l=l|0;return Uc(a,b,c,d,e,f,g,h,i,k,l,39840)|0}function mg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;b=a;a=0;return Pd(b,c,a|d,e,f,g,a|h,i,j,k)|0}function kg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;b=a;a=0;return Od(b,c,a|d,e,f,g,a|h,i,j,k)|0}function gg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;b=a;a=0;return yd(b,c,a|d,e,f,g,a|h,i,j,k)|0}function pd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=16|d){a=Qb(a,b+16|0,b,c-16|0,d-(c>>>0<16)|0,e,f);}else {a=-1;}return a|0}function Yc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=16|d){a=Rb(a,b+16|0,b,c-16|0,d-(c>>>0<16)|0,e,f);}else {a=-1;}return a|0}function Ve(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=T-32|0;T=g;Aa(g,e,f,0);a=hb(a,b,c,d,e+16|0,0,0,g);T=g+32|0;return a|0}function zg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;return Vc(a,b,c,d,e,f,g,h,j,k,39832)|0}function xg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Tc(a,b,d,e,f,g,h,i,j,k,39836)|0}function wg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Sc(a,c,d,e,f,g,h,i,j,k,39836)|0}function vg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;return Vc(a,b,c,d,e,f,g,h,j,k,39840)|0}function tg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Tc(a,b,d,e,f,g,h,i,j,k,39844)|0}function sg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Sc(a,c,d,e,f,g,h,i,j,k,39844)|0}function Sc(a,b,c,d,e,f,g,h,i,j,k){if(!d&c>>>0>4294967263|d|(!h&g>>>0>4294967263|h)){a=-1;}else {a=X[y[k>>2]](a,b,c,e,32,f,g,i,j)|0;}return a}function yh(a,b){a=a|0;b=b|0;var c=0;if((b&-7)!=1){na();s();}c=a;a=(a>>>0)/3|0;c=c+E(a,-3)|0;return ((c&3?b&2?c+1|0:4:0)+(a<<2)|0)+1|0}function fi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-416|0;T=f;Va(f,b,c);Na(f,d,e,0);Ya(f,a);ja(f,4);T=f+416|0;return 0}function Dh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-208|0;T=f;Xa(f,b,c);Ka(f,d,e,0);qb(f,a);ja(f,4);T=f+208|0;return 0}function nf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}return Bb(a+16|0,a,b,c,d,e,f)|0}function bf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}Bb(a+16|0,a,b,c,d,e,f);return 0}function _f(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}return Ab(a+16|0,a,b,c,d,e,f)|0}function Df(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}Ab(a+16|0,a,b,c,d,e,f);return 0}function Xe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-32|0;T=f;Aa(f,d,e,0);a=Fb(a,b,c,d+16|0,f);T=f+32|0;return a|0}function yf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=a;a=0;return hb(i,b,a|c,d,e,a|f,g,h)|0}function sf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=a;a=0;return sb(i,b,a|c,d,e,a|f,g,h)|0}function gf(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return Fd(a,b,c,d,e,f,g,h,i,j)|0}function rh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-32|0;T=d;e=-1;if(!Ea(d,c,b)){e=Aa(a,39680,d,0);}T=d+32|0;return e|0}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-32|0;T=d;e=-1;if(!Ea(d,c,b)){e=Sa(a,39760,d,0);}T=d+32|0;return e|0}function Ya(a,b){a=a|0;b=b|0;var c=0;c=T+-64|0;T=c;Ca(a,c);a=a+208|0;va(a,c,64,0);Ca(a,b);ja(c,64);T=c- -64|0;return 0}function Ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=T+-64|0;T=e;Ca(a,e);a=qc(b,c,e,64,0,d,1);T=e- -64|0;return a|0}function Ib(a,b){var c=0,d=0,e=0;c=b+120|0;ga(a,b,c);d=b+40|0;e=b+80|0;ga(a+40|0,d,e);ga(a+80|0,e,c);ga(a+120|0,b,d);}function qb(a,b){a=a|0;b=b|0;var c=0;c=T-32|0;T=c;Ua(a,c);a=a+104|0;La(a,c,32,0);Ua(a,b);ja(c,32);T=c+32|0;return 0}function hd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=a;a=0;return be(h,b,a|c,d,a|e,f,g)|0}function Tf(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return qe(a,b,c,d,e,f,g,h,i)|0}function Of(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=a;a=0;return ke(h,b,a|c,d,a|e,f,g)|0}function rc(a,b,c,d,e,f){var g=0;g=T-32|0;T=g;Sa(g,e,f,0);a=sb(a,b,c,d,e+16|0,0,0,g);ja(g,32);T=g+32|0;return a}function ye(a){a=a|0;while(1){za(a,32);w[a+31|0]=z[a+31|0]&31;if(!Jc(a)){continue}if(ya(a,32)){continue}break}}function Td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=T+-64|0;T=d;Ca(a,d);a=pc(b,d,64,0,c,1);T=d- -64|0;return a|0}function ki(){var a=0,b=0;a=y[10307];a:{if(!a){break a}a=y[a+20>>2];if(!a){break a}b=X[a|0]()|0;}return b|0}function Zd(a,b,c,d,e){var f=0;f=T-32|0;T=f;Sa(f,d,e,0);a=ac(a,b,c,d+16|0,f);ja(f,32);T=f+32|0;return a}function Ia(a,b,c){a=a|0;b=b|0;c=c|0;if(c>>>0>=256){Q(1366,1279,107,1123);s();}return Cc(a,b,c)|0}function vf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return gb(a,b,c,d,e,f,g)|0}function rd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ab(a,b,c,d,e,f,g)|0}function qd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Qb(a,b,c,d,e,f,g)|0}function od(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Wb(a,b,c,d,e,f,g)|0}function mf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return $d(a,b,c,d,e,f,g)|0}function kf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return _d(a,b,c,d,e,f,g)|0}function hb(a,b,c,d,e,f,g,h){if((d|0)==1|d>>>0>1){na();s();}return X[y[9964]](a,b,c,d,e,f,g,h)|0}function _c(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Rb(a,b,c,d,e,f,g)|0}function Zf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Bd(a,b,c,d,e,f,g)|0}function Xf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ad(a,b,c,d,e,f,g)|0}function $c(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Bb(a,b,c,d,e,f,g)|0}function ni(){var a=0,b=0;a=T-16|0;T=a;w[a+15|0]=0;b=P(39864,a+15|0,0)|0;T=a+16|0;return b|0}function Zb(a,b,c,d,e,f){if((d|0)==1|d>>>0>1){na();s();}return X[y[9964]](a,b,c,d,e,0,0,f)|0}function Di(a,b){var c=0,d=0;c=b&31;d=(-1<>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<>>0>1){na();s();}return X[y[9965]](a,b,c,d,e,0,f)|0}function ti(){var a=0;if(y[10305]){a=1;}else {Ae();za(41200,16);y[10305]=1;a=0;}return a|0}function dd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;qc(a,b,c,d,e,f,0);return 0}function Ob(a){var b=0;b=y[a>>2];if(b){ta(b);}y[a>>2]=0;y[a+4>>2]=0;y[a+8>>2]=0;return 0}function Bi(a,b){var c=0,d=0;c=b&31;d=(-1>>>c&a)<>>a}function xf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Zb(a,b,c,d,e,f)|0}function uf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Yb(a,b,c,d,e,f)|0}function rf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gb(a,b,c,d,e,f)|0}function ad(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return rc(a,b,c,d,e,f)|0}function Lb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Ld(a,b,c,d,e,f)|0}function Kb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Kd(a,b,c,d,e,f)|0}function _a(a,b,c,d,e){if((c|0)==1|c>>>0>1){na();s();}return X[y[9963]](a,b,c,d,e)|0}function Fb(a,b,c,d,e){if((c|0)==1|c>>>0>1){na();s();}return X[y[9962]](a,b,c,d,e)|0}function Be(a,b,c,d,e,f){if((d|0)==1|d>>>0>1){na();s();}X[y[9965]](a,b,c,d,e,1,f)|0;}function cd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return pc(a,b,c,d,e,0)|0}function zf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Fb(a,b,c,d,e)|0}function wf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return _a(a,b,c,d,e)|0}function tf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ac(a,b,c,d,e)|0}function kd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Zc(a,b,c,d,e)|0}function jd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Jb(a,b,c,d,e)|0}function bd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Zd(a,b,c,d,e)|0}function Ae(){var a=0;a=T-16|0;T=a;w[a+15|0]=0;P(39900,a+15|0,0)|0;T=a+16|0;}function Yh(a){a=a|0;var b=0;b=T-160|0;T=b;a=ib(b,a);T=b+160|0;return !a|0}function Gg(a,b,c){a=a|0;b=b|0;c=c|0;Wb(b,32,c,32,0,0,0);return wb(a,b)|0}function Uh(a){a=a|0;var b=0;b=T+-64|0;T=b;za(b,64);Gc(a,b);T=b- -64|0;}function vb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bc(a,b,c,d,20);return 0}function ub(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bc(a,b,c,d,12);return 0}function tb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bc(a,b,c,d,8);return 0}function Zh(a){a=a|0;var b=0;b=T-32|0;T=b;za(b,32);Hc(a,b);T=b+32|0;}function ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Na(a,b,c,d)|0}function sb(a,b,c,d,e,f,g,h){return X[y[9957]](a,b,c,d,e,f,g,h)|0}function nd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return oa(a,b,c,d)|0}function md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return rb(a,b,c,d)|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return la(a,b,c,d)|0}function ic(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return va(a,b,c,d)|0}function hh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ud(a,b,c,d)|0}function fh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ja(a,b,c,d)|0}function eg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ka(a,b,c,d)|0}function Sf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return La(a,b,c,d)|0}function Nf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return je(a,b,c,d)|0}function Mf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ie(a,b,c,d)|0}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ge(a,b,c,d)|0}function Jf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ae(a,b,c,d)|0}function If(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;kc(a,b,c,d);return 0}function Gb(a,b,c,d,e,f){return X[y[9957]](a,b,c,d,e,0,0,f)|0}function mc(a){y[a>>2]=0;y[a+4>>2]=0;y[a+8>>2]=0;return 0}function hi(a,b,c){a=a|0;b=b|0;c=c|0;return Na(a,b,c,0)|0}function Xg(a,b,c){a=a|0;b=b|0;c=c|0;return Dd(a,b,c,1)|0}function Wg(a,b,c){a=a|0;b=b|0;c=c|0;return Dd(a,b,c,0)|0}function Fh(a,b,c){a=a|0;b=b|0;c=c|0;return Ka(a,b,c,0)|0}function na(){var a=0;a=y[10306];if(a){X[a|0]();}Ic();s();}function ze(a,b,c){a=a|0;b=b|0;c=c|0;return Va(a,b,c)|0}function kh(a,b,c){a=a|0;b=b|0;c=c|0;return Yd(a,b,c)|0}function gh(a,b,c){a=a|0;b=b|0;c=c|0;return Td(a,b,c)|0}function eh(a,b,c){a=a|0;b=b|0;c=c|0;return Ia(a,b,c)|0}function ch(a,b,c){a=a|0;b=b|0;c=c|0;return tc(a,b,c)|0}function ah(a,b,c){a=a|0;b=b|0;c=c|0;return mb(a,b,c)|0}function Hg(a,b,c){a=a|0;b=b|0;c=c|0;return Ea(a,b,c)|0}function Gh(a,b,c){a=a|0;b=b|0;c=c|0;return Xa(a,b,c)|0}function nb(a,b){a=a|0;b=b|0;za(b,32);return wb(a,b)|0}function li(a,b,c){a=a|0;b=b|0;c=c|0;_a(a,b,0,38432,c);}function wb(a,b){a=a|0;b=b|0;return X[y[9955]](a,b)|0}function gi(a,b){a=a|0;b=b|0;Ya(a,b);ja(a,4);return 0}function ac(a,b,c,d,e){return X[y[9956]](a,b,c,d,e)|0}function Zc(a,b,c,d,e){return X[y[9949]](a,b,c,d,e)|0}function Jb(a,b,c,d,e){return X[y[9950]](a,b,c,d,e)|0}function Ga(a,b){a=a|0;b=b|0;return X[y[9951]](a,b)|0}function Fa(a,b){a=a|0;b=b|0;return X[y[9953]](a,b)|0}function Eh(a,b){a=a|0;b=b|0;qb(a,b);ja(a,4);return 0}function zi(a){if(a){return 31-H(a-1^a)|0}return 32}function la(a,b,c,d){return X[y[9952]](a,b,c,d)|0}function xd(a,b){a=a|0;b=b|0;return Wc(a,b,64)|0}function kb(a,b){a=a|0;b=b|0;return Wc(a,b,32)|0}function Vg(a,b){a=a|0;b=b|0;return Cd(a,b,1)|0}function Ug(a,b){a=a|0;b=b|0;return Cd(a,b,0)|0}function re(a,b,c){a=a|0;b=b|0;c=c|0;ha(a,b,c);}function Ph(a,b,c){a=a|0;b=b|0;c=c|0;ue(a,b,c);}function Oh(a,b,c){a=a|0;b=b|0;c=c|0;se(a,b,c);}function jh(a,b){a=a|0;b=b|0;return Xd(a,b)|0}function bh(a,b){a=a|0;b=b|0;return nb(a,b)|0}function _h(a,b){a=a|0;b=b|0;Hc(a,b);return 0}function Vh(a,b){a=a|0;b=b|0;Gc(a,b);return 0}function Sh(a,b){a=a|0;b=b|0;return xe(a,b)|0}function Sg(a,b){a=a|0;b=b|0;return Ga(a,b)|0}function Rg(a,b){a=a|0;b=b|0;return Fa(a,b)|0}function Ig(a,b){a=a|0;b=b|0;return wb(a,b)|0}function Af(a,b){a=a|0;b=b|0;jc(a,b);return 0}function je(a,b,c,d){return Xc(a,b,c,d,1)}function ie(a,b,c,d){return he(a,b,c,d,1)}function ge(a,b,c,d){return he(a,b,c,d,2)}function ae(a,b,c,d){return Xc(a,b,c,d,2)}function Na(a,b,c,d){va(a,b,c,d);return 0}function Ka(a,b,c,d){La(a,b,c,d);return 0}function Rh(a,b){a=a|0;b=b|0;we(a,b);}function Qh(a,b){a=a|0;b=b|0;ve(a,b);}function Nh(a,b){a=a|0;b=b|0;te(a,b);}function ih(a){a=a|0;return Vd(a)|0}function Vd(a){a=a|0;Za(a);return 0}function ja(a,b){if(b){o(a,0,b);}}function wc(){return -2147483648}function uc(){return 1073741824}function uh(){return 134217728}function th(){return 536870912}function de(){return 268435456}function ra(a){a=a|0;za(a,32);}function me(){return 33554432}function ei(a){a=a|0;za(a,64);}function ee(){return 67108864}function Je(a){a=a|0;za(a,16);}function Ed(){return 16777216}function Yg(){return 524288}function ci(){return 16320}function Zg(){return 32768}function Th(a){a=a|0;ye(a);}function xc(){return 8192}function wh(){return 1554}function sh(){return 1156}function qh(){return 1538}function oi(){return 1089}function lh(){return 1454}function fe(){return 1564}function dh(){return 1476}function _g(){return 1575}function Tg(){return 1521}function Qg(){return 1494}function Nd(){return 1338}function Mg(){return 1486}function Lg(){return 1531}function Kg(){return 1462}function Jg(){return 1443}function Dg(){return 1332}function Cg(){return 1547}function Bh(){return 8160}function yc(){return 128}function pe(){return 384}function Rc(){return 256}function Dc(){return 416}function Cb(){return 208}function Ag(){return 104}function $g(){return 102}function ua(){return 64}function ma(){return 16}function ka(){return 32}function Wd(){return -65}function Ta(){return -17}function Md(){return 48}function Ma(){return 24}function Le(){return -33}function Jh(){return 52}function Ih(){return 17}function Hh(){return -18}function Ce(){return 12}function Bg(){return 26}function wa(){return -1}function vh(){return 6}function vc(){return 4}function fb(){return 2}function Vb(){return 3}function Oa(){return 8}function Db(){return 1}function Ba(){return 0}function Ic(){R();s();}function yi(){} +// EMSCRIPTEN_END_FUNCS +a=z;m();var X=[null,og,Vf,Qf,If,Af,Ue,Te,Se,Re,xi,wi,vi,ui,si,ri,qi,pi];function Y(){return v.byteLength/65536|0}function ba(ca){ca=ca|0;var Z=Y()|0;var _=Z+ca|0;if(Z<_&&_<65536){var $=new ArrayBuffer(E(_,65536));var aa=new Int8Array($);aa.set(w);w=new Int8Array($);x=new Int16Array($);y=new Int32Array($);z=new Uint8Array($);A=new Uint16Array($);B=new Uint32Array($);v=$;a=z;}return Z}return {e:Object.create(Object.prototype,{grow:{value:ba},buffer:{get:function(){return v}}}),f:yi,g:ma,h:Ba,i:ma,j:ka,k:Le,l:Je,m:zg,n:yg,o:xg,p:wg,q:ka,r:Ba,s:ka,t:ka,u:Le,v:ra,w:vg,x:ug,y:tg,z:sg,A:Ba,B:rg,C:qg,D:pg,E:ng,F:mg,G:lg,H:kg,I:jg,J:ka,K:Ce,L:Ba,M:ma,N:Ta,O:ra,P:ka,Q:Oa,R:Ba,S:ma,T:Ta,U:ra,V:ig,W:hg,X:gg,Y:fg,Z:ka,_:Ma,$:Ba,aa:ma,ba:Ta,ca:ra,da:ka,ea:ka,fa:Kg,ga:wd,ha:vd,ia:ra,ja:ka,ka,la:Cb,ma:ra,na:Xa,oa:eg,pa:qb,qa:dg,ra:cg,sa:ua,ta:ka,ua:Dc,va:ra,wa:Va,xa:ud,ya:Ya,za:bg,Aa:ag,Ba:ka,Ca:ka,Da:Dc,Ea:ra,Fa:ze,Ga:ud,Ha:Ng,Ia:wd,Ja:vd,Ka:ka,La:ka,Ma:ka,Na:ka,Oa:Ma,Pa:ka,Qa:ma,Ra:ma,Sa:Ta,Ta:dh,Ua:ch,Va:bh,Wa:ah,Xa:Lb,Ya:Kb,Za:td,_a:sd,$a:rd,ab:$f,bb:_f,cb:Zf,db:qd,eb:Yf,fb:pd,gb:Xf,hb:Wf,ib:Uf,jb:Md,kb:tc,lb:nb,mb,nb:Lb,ob:Kb,pb:td,qb:sd,rb:ka,sb:ka,tb:ka,ub:ka,vb:Ma,wb:ka,xb:ma,yb:ma,zb:Ta,Ab:Aa,Bb:ka,Cb:ma,Db:ka,Eb:ma,Fb:Sa,Gb:ka,Hb:ma,Ib:ka,Jb:ma,Kb:vb,Lb:ua,Mb:ma,Nb:ka,Ob:ma,Pb:ub,Qb:ua,Rb:ma,Sb:ka,Tb:ma,Ub:tb,Vb:ua,Wb:ma,Xb:ka,Yb:ma,Zb:ma,_b:ua,$b:ka,ac:ma,bc:ua,cc:ka,dc:Nd,ec:pe,fc:od,gc:fh,hc:nd,ic:eh,jc:ra,kc:ma,lc:ua,mc:ka,nc:ma,oc:ua,pc:ka,qc:ma,rc:ma,sc:pe,tc:ra,uc:od,vc:Tf,wc:Ja,xc:xh,yc:nd,zc:Ia,Ac:ua,Bc:md,Cc:Lg,Dc:ka,Ec:Ag,Fc:Ub,Gc:Sf,Hc:Ua,Ic:Rf,Jc:ua,Kc:Cb,Lc:Za,Mc:ic,Nc:Ca,Oc:md,Pc:ma,Qc:ua,Rc:Oa,Sc:ka,Tc:ld,Uc:Nd,Vc:ma,Wc:ua,Xc:Oa,Yc:ka,Zc:ld,_c:ra,$c:Gh,ad:Fh,bd:Eh,cd:Dh,dd:ra,ed:Ch,fd:ka,gd:Ba,hd:Bh,id:Cb,jd:ze,kd:hi,ld:gi,md:fi,nd:ei,od:di,pd:ua,qd:Ba,rd:ci,sd:Dc,td:Gg,ud:nb,vd:Fg,wd:Eg,xd:ka,yd:ka,zd:ka,Ad:ka,Bd:Dg,Cd:Rc,Dd:ma,Ed:ka,Fd:kd,Gd:jd,Hd:Sg,Id:id,Jd:Rg,Kd:Qg,Ld:ra,Md:kd,Nd:jd,Od:Ga,Pd:id,Qd:Fa,Rd:ma,Sd:ka,Td:Rc,Ud:ra,Vd:Db,Wd:ma,Xd:wa,Yd:Ba,Zd:wa,_d:ma,$d:yc,ae:wh,be:Vb,ce:wa,de:xc,ee:wc,fe:vc,ge:me,he:vh,ie:uh,je:Oa,ke:th,le:Pf,me:Of,ne:Nf,oe:Mf,pe:Lf,qe:fb,re:ma,se:wa,te:Ba,ue:wa,ve:ma,we:yc,xe:fe,ye:Db,ze:wa,Ae:xc,Be:wc,Ce:fb,De:ee,Ee:Vb,Fe:de,Ge:vc,He:uc,Ie:Kf,Je:hd,Ke:Jf,Le:Db,Me:fb,Ne:fb,Oe:ma,Pe:wa,Qe:Ba,Re:wa,Se:ma,Te:yc,Ue:fe,Ve:Db,We:wa,Xe:xc,Ye:wc,Ze:fb,_e:ee,$e:Vb,af:de,bf:vc,cf:uc,df:Hf,ef:hd,ff:Gf,gf:Ff,hf:Ef,jf:sh,kf:Jg,lf:Ig,mf:Hg,nf:ka,of:ka,pf:Ea,qf:wb,rf:ka,sf:ka,tf:ka,uf:Ma,vf:ka,wf:ma,xf:ma,yf:Ta,zf:Mg,Af:Lb,Bf:Kb,Cf:ra,Df:rd,Ef:Df,Ff:qd,Gf:pd,Hf:Lb,If:Kb,Jf:ka,Kf:Ma,Lf:ka,Mf:ma,Nf:ma,Of:Ta,Pf:ra,Qf:ra,Rf:Mh,Sf:Lh,Tf:Kh,Uf:Cf,Vf:Bf,Wf:Jh,Xf:Ih,Yf:Ma,Zf:ka,_f:Hh,$f:Ba,ag:Db,bg:fb,cg:Vb,dg:Oa,eg:ma,fg:Tg,gg:gd,hg:Je,ig:Oa,jg:ma,kg:gd,lg:Cb,mg:ua,ng:ka,og:ka,pg:ua,qg:Wd,rg:lh,sg:kh,tg:jh,ug:fd,vg:ed,wg:dd,xg:cd,yg:ih,zg:ic,Ag:hh,Bg:gh,Cg:Cb,Dg:ua,Eg:ka,Fg:ka,Gg:ua,Hg:Wd,Ig:nh,Jg:mh,Kg:Vd,Lg:ic,Mg:Ud,Ng:Td,Og:Yd,Pg:Xd,Qg:ph,Rg:oh,Sg:cd,Tg:ed,Ug:dd,Vg:fd,Wg:ka,Xg:Oa,Yg:wa,Zg:ka,_g:Ce,$g:wa,ah:zf,bh:yf,ch:xf,dh:wf,eh:vf,fh:uf,gh:ra,hh:ra,ih:ka,jh:Ma,kh:wa,lh:qh,mh:bd,nh:ad,oh:ra,ph:ka,qh:Oa,rh:wa,sh:tf,th:sf,uh:rf,vh:ra,wh:bd,xh:qf,yh:ad,zh:ka,Ah:Ma,Bh:wa,Ch:ra,Dh:ma,Eh:ka,Fh:ua,Gh:db,Hh:kb,Ih:xd,Jh:oi,Kh:ni,Lh:Ae,Mh:mi,Nh:za,Oh:li,Ph:ka,Qh:ki,Rh:pf,Sh:Ah,Th:zh,Uh:yh,Vh:Bc,Wh:Ac,Xh:ti,Yh:ji,Zh:ii,_h:Cg,$h:Bg,ai:fb,bi:Ba,ci:tc,di:nb,ei:rh,fi:$c,gi:of,hi:nf,ii:mf,ji:_c,ki:lf,li:Yc,mi:kf,ni:ka,oi:ka,pi:ka,qi:ka,ri:Ma,si:ma,ti:Ta,ui:jf,vi:hf,wi:Md,xi:bi,yi:ai,zi:$h,Ai:_h,Bi:Zh,Ci:ye,Di:xe,Ei:we,Fi:ve,Gi:ue,Hi:te,Ii:se,Ji:re,Ki:ka,Li:ua,Mi:ka,Ni:ua,Oi:ka,Pi:Yh,Qi:Xh,Ri:Wh,Si:Vh,Ti:Uh,Ui:Th,Vi:Sh,Wi:Rh,Xi:Qh,Yi:Ph,Zi:Oh,_i:re,$i:Nh,aj:ka,bj:ua,cj:ua,dj:ka,ej:gf,fj:ma,gj:wa,hj:Ba,ij:wa,jj:ka,kj:$g,lj:_g,mj:Zg,nj:wa,oj:Ed,pj:wa,qj:Yg,rj:Ed,sj:me,tj:uc,uj:ff,vj:ef,wj:df,xj:cf,yj:Xg,zj:Wg,Aj:Vg,Bj:Ug,Cj:ka,Dj:ka,Ej:Pg,Fj:Og,Gj:ka,Hj:ka,Ij:$c,Jj:bf,Kj:_c,Lj:Yc,Mj:ka,Nj:Ma,Oj:ma,Pj:Ta,Qj:ma,Rj:ma,Sj:af,Tj:$e,Uj:_e,Vj:ka,Wj:Oa,Xj:wa,Yj:ra,Zj:Ze,_j:Ye,$j:ka,ak:Oa,bk:wa,ck:ra,dk:ka,ek:Ma,fk:wa,gk:Xe,hk:We,ik:Ve,jk:ra,kk:Da,lk:ta}}return da(ea)} +// EMSCRIPTEN_END_ASM + + +)(info);},instantiate:function(binary,info){return {then:function(ok){var module=new WebAssembly.Module(binary);ok({instance:new WebAssembly.Instance(module,info)});}}},RuntimeError:Error,isWasm2js:true};{wasmBinary=[];}var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(onPreRuns);}function initRuntime(){wasmExports["f"]();}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(onPostRuns);}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(file){}function getWasmBinary(file){}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason);}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency();return wasmExports}addRunDependency();function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst));});})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports$1=receiveInstantiationResult(result);return exports$1}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module);}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies);};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":return HEAP8[ptr];case "i8":return HEAP8[ptr];case "i16":return HEAP16[ptr>>1];case "i32":return HEAP32[ptr>>2];case "i64":abort("to do getValue(i64) use WASM_BIGINT");case "float":return HEAPF32[ptr>>2];case "double":return HEAPF64[ptr>>3];case "*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`);}}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":HEAP8[ptr]=value;break;case "i8":HEAP8[ptr]=value;break;case "i16":HEAP16[ptr>>1]=value;break;case "i32":HEAP32[ptr>>2]=value;break;case "i64":abort("to do setValue(i64) use WASM_BIGINT");case "float":HEAPF32[ptr>>2]=value;break;case "double":HEAPF64[ptr>>3]=value;break;case "*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`);}}var UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return "";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var __abort_js=()=>abort("");var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4;}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};{if(Module["noExitRuntime"])Module["noExitRuntime"];if(Module["print"])Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])Module["arguments"];if(Module["thisProgram"])Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()();}}}Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;var ASM_CONSTS={39864:()=>Module.getRandomValue(),39900:()=>{if(Module.getRandomValue===undefined){try{var window_="object"===typeof window?window:self;var crypto_=typeof window_.crypto!=="undefined"?window_.crypto:window_.msCrypto;crypto_=crypto_===undefined?crypto:crypto_;var randomValuesStandard=function(){var buf=new Uint32Array(1);crypto_.getRandomValues(buf);return buf[0]>>>0};randomValuesStandard();Module.getRandomValue=randomValuesStandard;}catch(e){try{var crypto=null;var randomValueNodeJS=function(){var buf=crypto["randomBytes"](4);return (buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0};randomValueNodeJS();Module.getRandomValue=randomValueNodeJS;}catch(e){throw "No secure random number generator found"}}}}};var wasmMemory;function assignWasmExports(wasmExports){Module["_crypto_aead_aegis128l_keybytes"]=wasmExports["g"];Module["_crypto_aead_aegis128l_nsecbytes"]=wasmExports["h"];Module["_crypto_aead_aegis128l_npubbytes"]=wasmExports["i"];Module["_crypto_aead_aegis128l_abytes"]=wasmExports["j"];Module["_crypto_aead_aegis128l_messagebytes_max"]=wasmExports["k"];Module["_crypto_aead_aegis128l_keygen"]=wasmExports["l"];Module["_crypto_aead_aegis128l_encrypt"]=wasmExports["m"];Module["_crypto_aead_aegis128l_encrypt_detached"]=wasmExports["n"];Module["_crypto_aead_aegis128l_decrypt"]=wasmExports["o"];Module["_crypto_aead_aegis128l_decrypt_detached"]=wasmExports["p"];Module["_crypto_aead_aegis256_keybytes"]=wasmExports["q"];Module["_crypto_aead_aegis256_nsecbytes"]=wasmExports["r"];Module["_crypto_aead_aegis256_npubbytes"]=wasmExports["s"];Module["_crypto_aead_aegis256_abytes"]=wasmExports["t"];Module["_crypto_aead_aegis256_messagebytes_max"]=wasmExports["u"];Module["_crypto_aead_aegis256_keygen"]=wasmExports["v"];Module["_crypto_aead_aegis256_encrypt"]=wasmExports["w"];Module["_crypto_aead_aegis256_encrypt_detached"]=wasmExports["x"];Module["_crypto_aead_aegis256_decrypt"]=wasmExports["y"];Module["_crypto_aead_aegis256_decrypt_detached"]=wasmExports["z"];Module["_crypto_aead_aes256gcm_is_available"]=wasmExports["A"];Module["_crypto_aead_chacha20poly1305_encrypt_detached"]=wasmExports["B"];Module["_crypto_aead_chacha20poly1305_encrypt"]=wasmExports["C"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt_detached"]=wasmExports["D"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt"]=wasmExports["E"];Module["_crypto_aead_chacha20poly1305_decrypt_detached"]=wasmExports["F"];Module["_crypto_aead_chacha20poly1305_decrypt"]=wasmExports["G"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt_detached"]=wasmExports["H"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt"]=wasmExports["I"];Module["_crypto_aead_chacha20poly1305_ietf_keybytes"]=wasmExports["J"];Module["_crypto_aead_chacha20poly1305_ietf_npubbytes"]=wasmExports["K"];Module["_crypto_aead_chacha20poly1305_ietf_nsecbytes"]=wasmExports["L"];Module["_crypto_aead_chacha20poly1305_ietf_abytes"]=wasmExports["M"];Module["_crypto_aead_chacha20poly1305_ietf_messagebytes_max"]=wasmExports["N"];Module["_crypto_aead_chacha20poly1305_ietf_keygen"]=wasmExports["O"];Module["_crypto_aead_chacha20poly1305_keybytes"]=wasmExports["P"];Module["_crypto_aead_chacha20poly1305_npubbytes"]=wasmExports["Q"];Module["_crypto_aead_chacha20poly1305_nsecbytes"]=wasmExports["R"];Module["_crypto_aead_chacha20poly1305_abytes"]=wasmExports["S"];Module["_crypto_aead_chacha20poly1305_messagebytes_max"]=wasmExports["T"];Module["_crypto_aead_chacha20poly1305_keygen"]=wasmExports["U"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt_detached"]=wasmExports["V"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt"]=wasmExports["W"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt_detached"]=wasmExports["X"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt"]=wasmExports["Y"];Module["_crypto_aead_xchacha20poly1305_ietf_keybytes"]=wasmExports["Z"];Module["_crypto_aead_xchacha20poly1305_ietf_npubbytes"]=wasmExports["_"];Module["_crypto_aead_xchacha20poly1305_ietf_nsecbytes"]=wasmExports["$"];Module["_crypto_aead_xchacha20poly1305_ietf_abytes"]=wasmExports["aa"];Module["_crypto_aead_xchacha20poly1305_ietf_messagebytes_max"]=wasmExports["ba"];Module["_crypto_aead_xchacha20poly1305_ietf_keygen"]=wasmExports["ca"];Module["_crypto_auth_bytes"]=wasmExports["da"];Module["_crypto_auth_keybytes"]=wasmExports["ea"];Module["_crypto_auth_primitive"]=wasmExports["fa"];Module["_crypto_auth"]=wasmExports["ga"];Module["_crypto_auth_verify"]=wasmExports["ha"];Module["_crypto_auth_keygen"]=wasmExports["ia"];Module["_crypto_auth_hmacsha256_bytes"]=wasmExports["ja"];Module["_crypto_auth_hmacsha256_keybytes"]=wasmExports["ka"];Module["_crypto_auth_hmacsha256_statebytes"]=wasmExports["la"];Module["_crypto_auth_hmacsha256_keygen"]=wasmExports["ma"];Module["_crypto_auth_hmacsha256_init"]=wasmExports["na"];Module["_crypto_auth_hmacsha256_update"]=wasmExports["oa"];Module["_crypto_auth_hmacsha256_final"]=wasmExports["pa"];Module["_crypto_auth_hmacsha256"]=wasmExports["qa"];Module["_crypto_auth_hmacsha256_verify"]=wasmExports["ra"];Module["_crypto_auth_hmacsha512_bytes"]=wasmExports["sa"];Module["_crypto_auth_hmacsha512_keybytes"]=wasmExports["ta"];Module["_crypto_auth_hmacsha512_statebytes"]=wasmExports["ua"];Module["_crypto_auth_hmacsha512_keygen"]=wasmExports["va"];Module["_crypto_auth_hmacsha512_init"]=wasmExports["wa"];Module["_crypto_auth_hmacsha512_update"]=wasmExports["xa"];Module["_crypto_auth_hmacsha512_final"]=wasmExports["ya"];Module["_crypto_auth_hmacsha512"]=wasmExports["za"];Module["_crypto_auth_hmacsha512_verify"]=wasmExports["Aa"];Module["_crypto_auth_hmacsha512256_bytes"]=wasmExports["Ba"];Module["_crypto_auth_hmacsha512256_keybytes"]=wasmExports["Ca"];Module["_crypto_auth_hmacsha512256_statebytes"]=wasmExports["Da"];Module["_crypto_auth_hmacsha512256_keygen"]=wasmExports["Ea"];Module["_crypto_auth_hmacsha512256_init"]=wasmExports["Fa"];Module["_crypto_auth_hmacsha512256_update"]=wasmExports["Ga"];Module["_crypto_auth_hmacsha512256_final"]=wasmExports["Ha"];Module["_crypto_auth_hmacsha512256"]=wasmExports["Ia"];Module["_crypto_auth_hmacsha512256_verify"]=wasmExports["Ja"];Module["_crypto_box_seedbytes"]=wasmExports["Ka"];Module["_crypto_box_publickeybytes"]=wasmExports["La"];Module["_crypto_box_secretkeybytes"]=wasmExports["Ma"];Module["_crypto_box_beforenmbytes"]=wasmExports["Na"];Module["_crypto_box_noncebytes"]=wasmExports["Oa"];Module["_crypto_box_zerobytes"]=wasmExports["Pa"];Module["_crypto_box_boxzerobytes"]=wasmExports["Qa"];Module["_crypto_box_macbytes"]=wasmExports["Ra"];Module["_crypto_box_messagebytes_max"]=wasmExports["Sa"];Module["_crypto_box_primitive"]=wasmExports["Ta"];Module["_crypto_box_seed_keypair"]=wasmExports["Ua"];Module["_crypto_box_keypair"]=wasmExports["Va"];Module["_crypto_box_beforenm"]=wasmExports["Wa"];Module["_crypto_box_afternm"]=wasmExports["Xa"];Module["_crypto_box_open_afternm"]=wasmExports["Ya"];Module["_crypto_box"]=wasmExports["Za"];Module["_crypto_box_open"]=wasmExports["_a"];Module["_crypto_box_detached_afternm"]=wasmExports["$a"];Module["_crypto_box_detached"]=wasmExports["ab"];Module["_crypto_box_easy_afternm"]=wasmExports["bb"];Module["_crypto_box_easy"]=wasmExports["cb"];Module["_crypto_box_open_detached_afternm"]=wasmExports["db"];Module["_crypto_box_open_detached"]=wasmExports["eb"];Module["_crypto_box_open_easy_afternm"]=wasmExports["fb"];Module["_crypto_box_open_easy"]=wasmExports["gb"];Module["_crypto_box_seal"]=wasmExports["hb"];Module["_crypto_box_seal_open"]=wasmExports["ib"];Module["_crypto_box_sealbytes"]=wasmExports["jb"];Module["_crypto_box_curve25519xsalsa20poly1305_seed_keypair"]=wasmExports["kb"];Module["_crypto_box_curve25519xsalsa20poly1305_keypair"]=wasmExports["lb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenm"]=wasmExports["mb"];Module["_crypto_box_curve25519xsalsa20poly1305_afternm"]=wasmExports["nb"];Module["_crypto_box_curve25519xsalsa20poly1305_open_afternm"]=wasmExports["ob"];Module["_crypto_box_curve25519xsalsa20poly1305"]=wasmExports["pb"];Module["_crypto_box_curve25519xsalsa20poly1305_open"]=wasmExports["qb"];Module["_crypto_box_curve25519xsalsa20poly1305_seedbytes"]=wasmExports["rb"];Module["_crypto_box_curve25519xsalsa20poly1305_publickeybytes"]=wasmExports["sb"];Module["_crypto_box_curve25519xsalsa20poly1305_secretkeybytes"]=wasmExports["tb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenmbytes"]=wasmExports["ub"];Module["_crypto_box_curve25519xsalsa20poly1305_noncebytes"]=wasmExports["vb"];Module["_crypto_box_curve25519xsalsa20poly1305_zerobytes"]=wasmExports["wb"];Module["_crypto_box_curve25519xsalsa20poly1305_boxzerobytes"]=wasmExports["xb"];Module["_crypto_box_curve25519xsalsa20poly1305_macbytes"]=wasmExports["yb"];Module["_crypto_box_curve25519xsalsa20poly1305_messagebytes_max"]=wasmExports["zb"];Module["_crypto_core_hchacha20"]=wasmExports["Ab"];Module["_crypto_core_hchacha20_outputbytes"]=wasmExports["Bb"];Module["_crypto_core_hchacha20_inputbytes"]=wasmExports["Cb"];Module["_crypto_core_hchacha20_keybytes"]=wasmExports["Db"];Module["_crypto_core_hchacha20_constbytes"]=wasmExports["Eb"];Module["_crypto_core_hsalsa20"]=wasmExports["Fb"];Module["_crypto_core_hsalsa20_outputbytes"]=wasmExports["Gb"];Module["_crypto_core_hsalsa20_inputbytes"]=wasmExports["Hb"];Module["_crypto_core_hsalsa20_keybytes"]=wasmExports["Ib"];Module["_crypto_core_hsalsa20_constbytes"]=wasmExports["Jb"];Module["_crypto_core_salsa20"]=wasmExports["Kb"];Module["_crypto_core_salsa20_outputbytes"]=wasmExports["Lb"];Module["_crypto_core_salsa20_inputbytes"]=wasmExports["Mb"];Module["_crypto_core_salsa20_keybytes"]=wasmExports["Nb"];Module["_crypto_core_salsa20_constbytes"]=wasmExports["Ob"];Module["_crypto_core_salsa2012"]=wasmExports["Pb"];Module["_crypto_core_salsa2012_outputbytes"]=wasmExports["Qb"];Module["_crypto_core_salsa2012_inputbytes"]=wasmExports["Rb"];Module["_crypto_core_salsa2012_keybytes"]=wasmExports["Sb"];Module["_crypto_core_salsa2012_constbytes"]=wasmExports["Tb"];Module["_crypto_core_salsa208"]=wasmExports["Ub"];Module["_crypto_core_salsa208_outputbytes"]=wasmExports["Vb"];Module["_crypto_core_salsa208_inputbytes"]=wasmExports["Wb"];Module["_crypto_core_salsa208_keybytes"]=wasmExports["Xb"];Module["_crypto_core_salsa208_constbytes"]=wasmExports["Yb"];Module["_crypto_generichash_bytes_min"]=wasmExports["Zb"];Module["_crypto_generichash_bytes_max"]=wasmExports["_b"];Module["_crypto_generichash_bytes"]=wasmExports["$b"];Module["_crypto_generichash_keybytes_min"]=wasmExports["ac"];Module["_crypto_generichash_keybytes_max"]=wasmExports["bc"];Module["_crypto_generichash_keybytes"]=wasmExports["cc"];Module["_crypto_generichash_primitive"]=wasmExports["dc"];Module["_crypto_generichash_statebytes"]=wasmExports["ec"];Module["_crypto_generichash"]=wasmExports["fc"];Module["_crypto_generichash_init"]=wasmExports["gc"];Module["_crypto_generichash_update"]=wasmExports["hc"];Module["_crypto_generichash_final"]=wasmExports["ic"];Module["_crypto_generichash_keygen"]=wasmExports["jc"];Module["_crypto_generichash_blake2b_bytes_min"]=wasmExports["kc"];Module["_crypto_generichash_blake2b_bytes_max"]=wasmExports["lc"];Module["_crypto_generichash_blake2b_bytes"]=wasmExports["mc"];Module["_crypto_generichash_blake2b_keybytes_min"]=wasmExports["nc"];Module["_crypto_generichash_blake2b_keybytes_max"]=wasmExports["oc"];Module["_crypto_generichash_blake2b_keybytes"]=wasmExports["pc"];Module["_crypto_generichash_blake2b_saltbytes"]=wasmExports["qc"];Module["_crypto_generichash_blake2b_personalbytes"]=wasmExports["rc"];Module["_crypto_generichash_blake2b_statebytes"]=wasmExports["sc"];Module["_crypto_generichash_blake2b_keygen"]=wasmExports["tc"];Module["_crypto_generichash_blake2b"]=wasmExports["uc"];Module["_crypto_generichash_blake2b_salt_personal"]=wasmExports["vc"];Module["_crypto_generichash_blake2b_init"]=wasmExports["wc"];Module["_crypto_generichash_blake2b_init_salt_personal"]=wasmExports["xc"];Module["_crypto_generichash_blake2b_update"]=wasmExports["yc"];Module["_crypto_generichash_blake2b_final"]=wasmExports["zc"];Module["_crypto_hash_bytes"]=wasmExports["Ac"];Module["_crypto_hash"]=wasmExports["Bc"];Module["_crypto_hash_primitive"]=wasmExports["Cc"];Module["_crypto_hash_sha256_bytes"]=wasmExports["Dc"];Module["_crypto_hash_sha256_statebytes"]=wasmExports["Ec"];Module["_crypto_hash_sha256_init"]=wasmExports["Fc"];Module["_crypto_hash_sha256_update"]=wasmExports["Gc"];Module["_crypto_hash_sha256_final"]=wasmExports["Hc"];Module["_crypto_hash_sha256"]=wasmExports["Ic"];Module["_crypto_hash_sha512_bytes"]=wasmExports["Jc"];Module["_crypto_hash_sha512_statebytes"]=wasmExports["Kc"];Module["_crypto_hash_sha512_init"]=wasmExports["Lc"];Module["_crypto_hash_sha512_update"]=wasmExports["Mc"];Module["_crypto_hash_sha512_final"]=wasmExports["Nc"];Module["_crypto_hash_sha512"]=wasmExports["Oc"];Module["_crypto_kdf_blake2b_bytes_min"]=wasmExports["Pc"];Module["_crypto_kdf_blake2b_bytes_max"]=wasmExports["Qc"];Module["_crypto_kdf_blake2b_contextbytes"]=wasmExports["Rc"];Module["_crypto_kdf_blake2b_keybytes"]=wasmExports["Sc"];Module["_crypto_kdf_blake2b_derive_from_key"]=wasmExports["Tc"];Module["_crypto_kdf_primitive"]=wasmExports["Uc"];Module["_crypto_kdf_bytes_min"]=wasmExports["Vc"];Module["_crypto_kdf_bytes_max"]=wasmExports["Wc"];Module["_crypto_kdf_contextbytes"]=wasmExports["Xc"];Module["_crypto_kdf_keybytes"]=wasmExports["Yc"];Module["_crypto_kdf_derive_from_key"]=wasmExports["Zc"];Module["_crypto_kdf_keygen"]=wasmExports["_c"];Module["_crypto_kdf_hkdf_sha256_extract_init"]=wasmExports["$c"];Module["_crypto_kdf_hkdf_sha256_extract_update"]=wasmExports["ad"];Module["_crypto_kdf_hkdf_sha256_extract_final"]=wasmExports["bd"];Module["_crypto_kdf_hkdf_sha256_extract"]=wasmExports["cd"];Module["_crypto_kdf_hkdf_sha256_keygen"]=wasmExports["dd"];Module["_crypto_kdf_hkdf_sha256_expand"]=wasmExports["ed"];Module["_crypto_kdf_hkdf_sha256_keybytes"]=wasmExports["fd"];Module["_crypto_kdf_hkdf_sha256_bytes_min"]=wasmExports["gd"];Module["_crypto_kdf_hkdf_sha256_bytes_max"]=wasmExports["hd"];Module["_crypto_kdf_hkdf_sha256_statebytes"]=wasmExports["id"];Module["_crypto_kdf_hkdf_sha512_extract_init"]=wasmExports["jd"];Module["_crypto_kdf_hkdf_sha512_extract_update"]=wasmExports["kd"];Module["_crypto_kdf_hkdf_sha512_extract_final"]=wasmExports["ld"];Module["_crypto_kdf_hkdf_sha512_extract"]=wasmExports["md"];Module["_crypto_kdf_hkdf_sha512_keygen"]=wasmExports["nd"];Module["_crypto_kdf_hkdf_sha512_expand"]=wasmExports["od"];Module["_crypto_kdf_hkdf_sha512_keybytes"]=wasmExports["pd"];Module["_crypto_kdf_hkdf_sha512_bytes_min"]=wasmExports["qd"];Module["_crypto_kdf_hkdf_sha512_bytes_max"]=wasmExports["rd"];Module["_crypto_kdf_hkdf_sha512_statebytes"]=wasmExports["sd"];Module["_crypto_kx_seed_keypair"]=wasmExports["td"];Module["_crypto_kx_keypair"]=wasmExports["ud"];Module["_crypto_kx_client_session_keys"]=wasmExports["vd"];Module["_crypto_kx_server_session_keys"]=wasmExports["wd"];Module["_crypto_kx_publickeybytes"]=wasmExports["xd"];Module["_crypto_kx_secretkeybytes"]=wasmExports["yd"];Module["_crypto_kx_seedbytes"]=wasmExports["zd"];Module["_crypto_kx_sessionkeybytes"]=wasmExports["Ad"];Module["_crypto_kx_primitive"]=wasmExports["Bd"];Module["_crypto_onetimeauth_statebytes"]=wasmExports["Cd"];Module["_crypto_onetimeauth_bytes"]=wasmExports["Dd"];Module["_crypto_onetimeauth_keybytes"]=wasmExports["Ed"];Module["_crypto_onetimeauth"]=wasmExports["Fd"];Module["_crypto_onetimeauth_verify"]=wasmExports["Gd"];Module["_crypto_onetimeauth_init"]=wasmExports["Hd"];Module["_crypto_onetimeauth_update"]=wasmExports["Id"];Module["_crypto_onetimeauth_final"]=wasmExports["Jd"];Module["_crypto_onetimeauth_primitive"]=wasmExports["Kd"];Module["_crypto_onetimeauth_keygen"]=wasmExports["Ld"];Module["_crypto_onetimeauth_poly1305"]=wasmExports["Md"];Module["_crypto_onetimeauth_poly1305_verify"]=wasmExports["Nd"];Module["_crypto_onetimeauth_poly1305_init"]=wasmExports["Od"];Module["_crypto_onetimeauth_poly1305_update"]=wasmExports["Pd"];Module["_crypto_onetimeauth_poly1305_final"]=wasmExports["Qd"];Module["_crypto_onetimeauth_poly1305_bytes"]=wasmExports["Rd"];Module["_crypto_onetimeauth_poly1305_keybytes"]=wasmExports["Sd"];Module["_crypto_onetimeauth_poly1305_statebytes"]=wasmExports["Td"];Module["_crypto_onetimeauth_poly1305_keygen"]=wasmExports["Ud"];Module["_crypto_pwhash_argon2i_alg_argon2i13"]=wasmExports["Vd"];Module["_crypto_pwhash_argon2i_bytes_min"]=wasmExports["Wd"];Module["_crypto_pwhash_argon2i_bytes_max"]=wasmExports["Xd"];Module["_crypto_pwhash_argon2i_passwd_min"]=wasmExports["Yd"];Module["_crypto_pwhash_argon2i_passwd_max"]=wasmExports["Zd"];Module["_crypto_pwhash_argon2i_saltbytes"]=wasmExports["_d"];Module["_crypto_pwhash_argon2i_strbytes"]=wasmExports["$d"];Module["_crypto_pwhash_argon2i_strprefix"]=wasmExports["ae"];Module["_crypto_pwhash_argon2i_opslimit_min"]=wasmExports["be"];Module["_crypto_pwhash_argon2i_opslimit_max"]=wasmExports["ce"];Module["_crypto_pwhash_argon2i_memlimit_min"]=wasmExports["de"];Module["_crypto_pwhash_argon2i_memlimit_max"]=wasmExports["ee"];Module["_crypto_pwhash_argon2i_opslimit_interactive"]=wasmExports["fe"];Module["_crypto_pwhash_argon2i_memlimit_interactive"]=wasmExports["ge"];Module["_crypto_pwhash_argon2i_opslimit_moderate"]=wasmExports["he"];Module["_crypto_pwhash_argon2i_memlimit_moderate"]=wasmExports["ie"];Module["_crypto_pwhash_argon2i_opslimit_sensitive"]=wasmExports["je"];Module["_crypto_pwhash_argon2i_memlimit_sensitive"]=wasmExports["ke"];Module["_crypto_pwhash_argon2i"]=wasmExports["le"];Module["_crypto_pwhash_argon2i_str"]=wasmExports["me"];Module["_crypto_pwhash_argon2i_str_verify"]=wasmExports["ne"];Module["_crypto_pwhash_argon2i_str_needs_rehash"]=wasmExports["oe"];Module["_crypto_pwhash_argon2id_str_needs_rehash"]=wasmExports["pe"];Module["_crypto_pwhash_argon2id_alg_argon2id13"]=wasmExports["qe"];Module["_crypto_pwhash_argon2id_bytes_min"]=wasmExports["re"];Module["_crypto_pwhash_argon2id_bytes_max"]=wasmExports["se"];Module["_crypto_pwhash_argon2id_passwd_min"]=wasmExports["te"];Module["_crypto_pwhash_argon2id_passwd_max"]=wasmExports["ue"];Module["_crypto_pwhash_argon2id_saltbytes"]=wasmExports["ve"];Module["_crypto_pwhash_argon2id_strbytes"]=wasmExports["we"];Module["_crypto_pwhash_argon2id_strprefix"]=wasmExports["xe"];Module["_crypto_pwhash_argon2id_opslimit_min"]=wasmExports["ye"];Module["_crypto_pwhash_argon2id_opslimit_max"]=wasmExports["ze"];Module["_crypto_pwhash_argon2id_memlimit_min"]=wasmExports["Ae"];Module["_crypto_pwhash_argon2id_memlimit_max"]=wasmExports["Be"];Module["_crypto_pwhash_argon2id_opslimit_interactive"]=wasmExports["Ce"];Module["_crypto_pwhash_argon2id_memlimit_interactive"]=wasmExports["De"];Module["_crypto_pwhash_argon2id_opslimit_moderate"]=wasmExports["Ee"];Module["_crypto_pwhash_argon2id_memlimit_moderate"]=wasmExports["Fe"];Module["_crypto_pwhash_argon2id_opslimit_sensitive"]=wasmExports["Ge"];Module["_crypto_pwhash_argon2id_memlimit_sensitive"]=wasmExports["He"];Module["_crypto_pwhash_argon2id"]=wasmExports["Ie"];Module["_crypto_pwhash_argon2id_str"]=wasmExports["Je"];Module["_crypto_pwhash_argon2id_str_verify"]=wasmExports["Ke"];Module["_crypto_pwhash_alg_argon2i13"]=wasmExports["Le"];Module["_crypto_pwhash_alg_argon2id13"]=wasmExports["Me"];Module["_crypto_pwhash_alg_default"]=wasmExports["Ne"];Module["_crypto_pwhash_bytes_min"]=wasmExports["Oe"];Module["_crypto_pwhash_bytes_max"]=wasmExports["Pe"];Module["_crypto_pwhash_passwd_min"]=wasmExports["Qe"];Module["_crypto_pwhash_passwd_max"]=wasmExports["Re"];Module["_crypto_pwhash_saltbytes"]=wasmExports["Se"];Module["_crypto_pwhash_strbytes"]=wasmExports["Te"];Module["_crypto_pwhash_strprefix"]=wasmExports["Ue"];Module["_crypto_pwhash_opslimit_min"]=wasmExports["Ve"];Module["_crypto_pwhash_opslimit_max"]=wasmExports["We"];Module["_crypto_pwhash_memlimit_min"]=wasmExports["Xe"];Module["_crypto_pwhash_memlimit_max"]=wasmExports["Ye"];Module["_crypto_pwhash_opslimit_interactive"]=wasmExports["Ze"];Module["_crypto_pwhash_memlimit_interactive"]=wasmExports["_e"];Module["_crypto_pwhash_opslimit_moderate"]=wasmExports["$e"];Module["_crypto_pwhash_memlimit_moderate"]=wasmExports["af"];Module["_crypto_pwhash_opslimit_sensitive"]=wasmExports["bf"];Module["_crypto_pwhash_memlimit_sensitive"]=wasmExports["cf"];Module["_crypto_pwhash"]=wasmExports["df"];Module["_crypto_pwhash_str"]=wasmExports["ef"];Module["_crypto_pwhash_str_alg"]=wasmExports["ff"];Module["_crypto_pwhash_str_verify"]=wasmExports["gf"];Module["_crypto_pwhash_str_needs_rehash"]=wasmExports["hf"];Module["_crypto_pwhash_primitive"]=wasmExports["jf"];Module["_crypto_scalarmult_primitive"]=wasmExports["kf"];Module["_crypto_scalarmult_base"]=wasmExports["lf"];Module["_crypto_scalarmult"]=wasmExports["mf"];Module["_crypto_scalarmult_bytes"]=wasmExports["nf"];Module["_crypto_scalarmult_scalarbytes"]=wasmExports["of"];Module["_crypto_scalarmult_curve25519"]=wasmExports["pf"];Module["_crypto_scalarmult_curve25519_base"]=wasmExports["qf"];Module["_crypto_scalarmult_curve25519_bytes"]=wasmExports["rf"];Module["_crypto_scalarmult_curve25519_scalarbytes"]=wasmExports["sf"];Module["_crypto_secretbox_keybytes"]=wasmExports["tf"];Module["_crypto_secretbox_noncebytes"]=wasmExports["uf"];Module["_crypto_secretbox_zerobytes"]=wasmExports["vf"];Module["_crypto_secretbox_boxzerobytes"]=wasmExports["wf"];Module["_crypto_secretbox_macbytes"]=wasmExports["xf"];Module["_crypto_secretbox_messagebytes_max"]=wasmExports["yf"];Module["_crypto_secretbox_primitive"]=wasmExports["zf"];Module["_crypto_secretbox"]=wasmExports["Af"];Module["_crypto_secretbox_open"]=wasmExports["Bf"];Module["_crypto_secretbox_keygen"]=wasmExports["Cf"];Module["_crypto_secretbox_detached"]=wasmExports["Df"];Module["_crypto_secretbox_easy"]=wasmExports["Ef"];Module["_crypto_secretbox_open_detached"]=wasmExports["Ff"];Module["_crypto_secretbox_open_easy"]=wasmExports["Gf"];Module["_crypto_secretbox_xsalsa20poly1305"]=wasmExports["Hf"];Module["_crypto_secretbox_xsalsa20poly1305_open"]=wasmExports["If"];Module["_crypto_secretbox_xsalsa20poly1305_keybytes"]=wasmExports["Jf"];Module["_crypto_secretbox_xsalsa20poly1305_noncebytes"]=wasmExports["Kf"];Module["_crypto_secretbox_xsalsa20poly1305_zerobytes"]=wasmExports["Lf"];Module["_crypto_secretbox_xsalsa20poly1305_boxzerobytes"]=wasmExports["Mf"];Module["_crypto_secretbox_xsalsa20poly1305_macbytes"]=wasmExports["Nf"];Module["_crypto_secretbox_xsalsa20poly1305_messagebytes_max"]=wasmExports["Of"];Module["_crypto_secretbox_xsalsa20poly1305_keygen"]=wasmExports["Pf"];Module["_crypto_secretstream_xchacha20poly1305_keygen"]=wasmExports["Qf"];Module["_crypto_secretstream_xchacha20poly1305_init_push"]=wasmExports["Rf"];Module["_crypto_secretstream_xchacha20poly1305_init_pull"]=wasmExports["Sf"];Module["_crypto_secretstream_xchacha20poly1305_rekey"]=wasmExports["Tf"];Module["_crypto_secretstream_xchacha20poly1305_push"]=wasmExports["Uf"];Module["_crypto_secretstream_xchacha20poly1305_pull"]=wasmExports["Vf"];Module["_crypto_secretstream_xchacha20poly1305_statebytes"]=wasmExports["Wf"];Module["_crypto_secretstream_xchacha20poly1305_abytes"]=wasmExports["Xf"];Module["_crypto_secretstream_xchacha20poly1305_headerbytes"]=wasmExports["Yf"];Module["_crypto_secretstream_xchacha20poly1305_keybytes"]=wasmExports["Zf"];Module["_crypto_secretstream_xchacha20poly1305_messagebytes_max"]=wasmExports["_f"];Module["_crypto_secretstream_xchacha20poly1305_tag_message"]=wasmExports["$f"];Module["_crypto_secretstream_xchacha20poly1305_tag_push"]=wasmExports["ag"];Module["_crypto_secretstream_xchacha20poly1305_tag_rekey"]=wasmExports["bg"];Module["_crypto_secretstream_xchacha20poly1305_tag_final"]=wasmExports["cg"];Module["_crypto_shorthash_bytes"]=wasmExports["dg"];Module["_crypto_shorthash_keybytes"]=wasmExports["eg"];Module["_crypto_shorthash_primitive"]=wasmExports["fg"];Module["_crypto_shorthash"]=wasmExports["gg"];Module["_crypto_shorthash_keygen"]=wasmExports["hg"];Module["_crypto_shorthash_siphash24_bytes"]=wasmExports["ig"];Module["_crypto_shorthash_siphash24_keybytes"]=wasmExports["jg"];Module["_crypto_shorthash_siphash24"]=wasmExports["kg"];Module["_crypto_sign_statebytes"]=wasmExports["lg"];Module["_crypto_sign_bytes"]=wasmExports["mg"];Module["_crypto_sign_seedbytes"]=wasmExports["ng"];Module["_crypto_sign_publickeybytes"]=wasmExports["og"];Module["_crypto_sign_secretkeybytes"]=wasmExports["pg"];Module["_crypto_sign_messagebytes_max"]=wasmExports["qg"];Module["_crypto_sign_primitive"]=wasmExports["rg"];Module["_crypto_sign_seed_keypair"]=wasmExports["sg"];Module["_crypto_sign_keypair"]=wasmExports["tg"];Module["_crypto_sign"]=wasmExports["ug"];Module["_crypto_sign_open"]=wasmExports["vg"];Module["_crypto_sign_detached"]=wasmExports["wg"];Module["_crypto_sign_verify_detached"]=wasmExports["xg"];Module["_crypto_sign_init"]=wasmExports["yg"];Module["_crypto_sign_update"]=wasmExports["zg"];Module["_crypto_sign_final_create"]=wasmExports["Ag"];Module["_crypto_sign_final_verify"]=wasmExports["Bg"];Module["_crypto_sign_ed25519ph_statebytes"]=wasmExports["Cg"];Module["_crypto_sign_ed25519_bytes"]=wasmExports["Dg"];Module["_crypto_sign_ed25519_seedbytes"]=wasmExports["Eg"];Module["_crypto_sign_ed25519_publickeybytes"]=wasmExports["Fg"];Module["_crypto_sign_ed25519_secretkeybytes"]=wasmExports["Gg"];Module["_crypto_sign_ed25519_messagebytes_max"]=wasmExports["Hg"];Module["_crypto_sign_ed25519_sk_to_seed"]=wasmExports["Ig"];Module["_crypto_sign_ed25519_sk_to_pk"]=wasmExports["Jg"];Module["_crypto_sign_ed25519ph_init"]=wasmExports["Kg"];Module["_crypto_sign_ed25519ph_update"]=wasmExports["Lg"];Module["_crypto_sign_ed25519ph_final_create"]=wasmExports["Mg"];Module["_crypto_sign_ed25519ph_final_verify"]=wasmExports["Ng"];Module["_crypto_sign_ed25519_seed_keypair"]=wasmExports["Og"];Module["_crypto_sign_ed25519_keypair"]=wasmExports["Pg"];Module["_crypto_sign_ed25519_pk_to_curve25519"]=wasmExports["Qg"];Module["_crypto_sign_ed25519_sk_to_curve25519"]=wasmExports["Rg"];Module["_crypto_sign_ed25519_verify_detached"]=wasmExports["Sg"];Module["_crypto_sign_ed25519_open"]=wasmExports["Tg"];Module["_crypto_sign_ed25519_detached"]=wasmExports["Ug"];Module["_crypto_sign_ed25519"]=wasmExports["Vg"];Module["_crypto_stream_chacha20_keybytes"]=wasmExports["Wg"];Module["_crypto_stream_chacha20_noncebytes"]=wasmExports["Xg"];Module["_crypto_stream_chacha20_messagebytes_max"]=wasmExports["Yg"];Module["_crypto_stream_chacha20_ietf_keybytes"]=wasmExports["Zg"];Module["_crypto_stream_chacha20_ietf_noncebytes"]=wasmExports["_g"];Module["_crypto_stream_chacha20_ietf_messagebytes_max"]=wasmExports["$g"];Module["_crypto_stream_chacha20"]=wasmExports["ah"];Module["_crypto_stream_chacha20_xor_ic"]=wasmExports["bh"];Module["_crypto_stream_chacha20_xor"]=wasmExports["ch"];Module["_crypto_stream_chacha20_ietf"]=wasmExports["dh"];Module["_crypto_stream_chacha20_ietf_xor_ic"]=wasmExports["eh"];Module["_crypto_stream_chacha20_ietf_xor"]=wasmExports["fh"];Module["_crypto_stream_chacha20_ietf_keygen"]=wasmExports["gh"];Module["_crypto_stream_chacha20_keygen"]=wasmExports["hh"];Module["_crypto_stream_keybytes"]=wasmExports["ih"];Module["_crypto_stream_noncebytes"]=wasmExports["jh"];Module["_crypto_stream_messagebytes_max"]=wasmExports["kh"];Module["_crypto_stream_primitive"]=wasmExports["lh"];Module["_crypto_stream"]=wasmExports["mh"];Module["_crypto_stream_xor"]=wasmExports["nh"];Module["_crypto_stream_keygen"]=wasmExports["oh"];Module["_crypto_stream_salsa20_keybytes"]=wasmExports["ph"];Module["_crypto_stream_salsa20_noncebytes"]=wasmExports["qh"];Module["_crypto_stream_salsa20_messagebytes_max"]=wasmExports["rh"];Module["_crypto_stream_salsa20"]=wasmExports["sh"];Module["_crypto_stream_salsa20_xor_ic"]=wasmExports["th"];Module["_crypto_stream_salsa20_xor"]=wasmExports["uh"];Module["_crypto_stream_salsa20_keygen"]=wasmExports["vh"];Module["_crypto_stream_xsalsa20"]=wasmExports["wh"];Module["_crypto_stream_xsalsa20_xor_ic"]=wasmExports["xh"];Module["_crypto_stream_xsalsa20_xor"]=wasmExports["yh"];Module["_crypto_stream_xsalsa20_keybytes"]=wasmExports["zh"];Module["_crypto_stream_xsalsa20_noncebytes"]=wasmExports["Ah"];Module["_crypto_stream_xsalsa20_messagebytes_max"]=wasmExports["Bh"];Module["_crypto_stream_xsalsa20_keygen"]=wasmExports["Ch"];Module["_crypto_verify_16_bytes"]=wasmExports["Dh"];Module["_crypto_verify_32_bytes"]=wasmExports["Eh"];Module["_crypto_verify_64_bytes"]=wasmExports["Fh"];Module["_crypto_verify_16"]=wasmExports["Gh"];Module["_crypto_verify_32"]=wasmExports["Hh"];Module["_crypto_verify_64"]=wasmExports["Ih"];Module["_randombytes_implementation_name"]=wasmExports["Jh"];Module["_randombytes_random"]=wasmExports["Kh"];Module["_randombytes_stir"]=wasmExports["Lh"];Module["_randombytes_uniform"]=wasmExports["Mh"];Module["_randombytes_buf"]=wasmExports["Nh"];Module["_randombytes_buf_deterministic"]=wasmExports["Oh"];Module["_randombytes_seedbytes"]=wasmExports["Ph"];Module["_randombytes_close"]=wasmExports["Qh"];Module["_randombytes"]=wasmExports["Rh"];Module["_sodium_bin2hex"]=wasmExports["Sh"];Module["_sodium_hex2bin"]=wasmExports["Th"];Module["_sodium_base64_encoded_len"]=wasmExports["Uh"];Module["_sodium_bin2base64"]=wasmExports["Vh"];Module["_sodium_base642bin"]=wasmExports["Wh"];Module["_sodium_init"]=wasmExports["Xh"];Module["_sodium_pad"]=wasmExports["Yh"];Module["_sodium_unpad"]=wasmExports["Zh"];Module["_sodium_version_string"]=wasmExports["_h"];Module["_sodium_library_version_major"]=wasmExports["$h"];Module["_sodium_library_version_minor"]=wasmExports["ai"];Module["_sodium_library_minimal"]=wasmExports["bi"];Module["_crypto_box_curve25519xchacha20poly1305_seed_keypair"]=wasmExports["ci"];Module["_crypto_box_curve25519xchacha20poly1305_keypair"]=wasmExports["di"];Module["_crypto_box_curve25519xchacha20poly1305_beforenm"]=wasmExports["ei"];Module["_crypto_box_curve25519xchacha20poly1305_detached_afternm"]=wasmExports["fi"];Module["_crypto_box_curve25519xchacha20poly1305_detached"]=wasmExports["gi"];Module["_crypto_box_curve25519xchacha20poly1305_easy_afternm"]=wasmExports["hi"];Module["_crypto_box_curve25519xchacha20poly1305_easy"]=wasmExports["ii"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached_afternm"]=wasmExports["ji"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached"]=wasmExports["ki"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy_afternm"]=wasmExports["li"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy"]=wasmExports["mi"];Module["_crypto_box_curve25519xchacha20poly1305_seedbytes"]=wasmExports["ni"];Module["_crypto_box_curve25519xchacha20poly1305_publickeybytes"]=wasmExports["oi"];Module["_crypto_box_curve25519xchacha20poly1305_secretkeybytes"]=wasmExports["pi"];Module["_crypto_box_curve25519xchacha20poly1305_beforenmbytes"]=wasmExports["qi"];Module["_crypto_box_curve25519xchacha20poly1305_noncebytes"]=wasmExports["ri"];Module["_crypto_box_curve25519xchacha20poly1305_macbytes"]=wasmExports["si"];Module["_crypto_box_curve25519xchacha20poly1305_messagebytes_max"]=wasmExports["ti"];Module["_crypto_box_curve25519xchacha20poly1305_seal"]=wasmExports["ui"];Module["_crypto_box_curve25519xchacha20poly1305_seal_open"]=wasmExports["vi"];Module["_crypto_box_curve25519xchacha20poly1305_sealbytes"]=wasmExports["wi"];Module["_crypto_core_ed25519_is_valid_point"]=wasmExports["xi"];Module["_crypto_core_ed25519_add"]=wasmExports["yi"];Module["_crypto_core_ed25519_sub"]=wasmExports["zi"];Module["_crypto_core_ed25519_from_uniform"]=wasmExports["Ai"];Module["_crypto_core_ed25519_random"]=wasmExports["Bi"];Module["_crypto_core_ed25519_scalar_random"]=wasmExports["Ci"];Module["_crypto_core_ed25519_scalar_invert"]=wasmExports["Di"];Module["_crypto_core_ed25519_scalar_negate"]=wasmExports["Ei"];Module["_crypto_core_ed25519_scalar_complement"]=wasmExports["Fi"];Module["_crypto_core_ed25519_scalar_add"]=wasmExports["Gi"];Module["_crypto_core_ed25519_scalar_reduce"]=wasmExports["Hi"];Module["_crypto_core_ed25519_scalar_sub"]=wasmExports["Ii"];Module["_crypto_core_ed25519_scalar_mul"]=wasmExports["Ji"];Module["_crypto_core_ed25519_bytes"]=wasmExports["Ki"];Module["_crypto_core_ed25519_nonreducedscalarbytes"]=wasmExports["Li"];Module["_crypto_core_ed25519_uniformbytes"]=wasmExports["Mi"];Module["_crypto_core_ed25519_hashbytes"]=wasmExports["Ni"];Module["_crypto_core_ed25519_scalarbytes"]=wasmExports["Oi"];Module["_crypto_core_ristretto255_is_valid_point"]=wasmExports["Pi"];Module["_crypto_core_ristretto255_add"]=wasmExports["Qi"];Module["_crypto_core_ristretto255_sub"]=wasmExports["Ri"];Module["_crypto_core_ristretto255_from_hash"]=wasmExports["Si"];Module["_crypto_core_ristretto255_random"]=wasmExports["Ti"];Module["_crypto_core_ristretto255_scalar_random"]=wasmExports["Ui"];Module["_crypto_core_ristretto255_scalar_invert"]=wasmExports["Vi"];Module["_crypto_core_ristretto255_scalar_negate"]=wasmExports["Wi"];Module["_crypto_core_ristretto255_scalar_complement"]=wasmExports["Xi"];Module["_crypto_core_ristretto255_scalar_add"]=wasmExports["Yi"];Module["_crypto_core_ristretto255_scalar_sub"]=wasmExports["Zi"];Module["_crypto_core_ristretto255_scalar_mul"]=wasmExports["_i"];Module["_crypto_core_ristretto255_scalar_reduce"]=wasmExports["$i"];Module["_crypto_core_ristretto255_bytes"]=wasmExports["aj"];Module["_crypto_core_ristretto255_nonreducedscalarbytes"]=wasmExports["bj"];Module["_crypto_core_ristretto255_hashbytes"]=wasmExports["cj"];Module["_crypto_core_ristretto255_scalarbytes"]=wasmExports["dj"];Module["_crypto_pwhash_scryptsalsa208sha256_ll"]=wasmExports["ej"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_min"]=wasmExports["fj"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_max"]=wasmExports["gj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_min"]=wasmExports["hj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_max"]=wasmExports["ij"];Module["_crypto_pwhash_scryptsalsa208sha256_saltbytes"]=wasmExports["jj"];Module["_crypto_pwhash_scryptsalsa208sha256_strbytes"]=wasmExports["kj"];Module["_crypto_pwhash_scryptsalsa208sha256_strprefix"]=wasmExports["lj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_min"]=wasmExports["mj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_max"]=wasmExports["nj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_min"]=wasmExports["oj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_max"]=wasmExports["pj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"]=wasmExports["qj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"]=wasmExports["rj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"]=wasmExports["sj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"]=wasmExports["tj"];Module["_crypto_pwhash_scryptsalsa208sha256"]=wasmExports["uj"];Module["_crypto_pwhash_scryptsalsa208sha256_str"]=wasmExports["vj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_verify"]=wasmExports["wj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_needs_rehash"]=wasmExports["xj"];Module["_crypto_scalarmult_ed25519"]=wasmExports["yj"];Module["_crypto_scalarmult_ed25519_noclamp"]=wasmExports["zj"];Module["_crypto_scalarmult_ed25519_base"]=wasmExports["Aj"];Module["_crypto_scalarmult_ed25519_base_noclamp"]=wasmExports["Bj"];Module["_crypto_scalarmult_ed25519_bytes"]=wasmExports["Cj"];Module["_crypto_scalarmult_ed25519_scalarbytes"]=wasmExports["Dj"];Module["_crypto_scalarmult_ristretto255"]=wasmExports["Ej"];Module["_crypto_scalarmult_ristretto255_base"]=wasmExports["Fj"];Module["_crypto_scalarmult_ristretto255_bytes"]=wasmExports["Gj"];Module["_crypto_scalarmult_ristretto255_scalarbytes"]=wasmExports["Hj"];Module["_crypto_secretbox_xchacha20poly1305_detached"]=wasmExports["Ij"];Module["_crypto_secretbox_xchacha20poly1305_easy"]=wasmExports["Jj"];Module["_crypto_secretbox_xchacha20poly1305_open_detached"]=wasmExports["Kj"];Module["_crypto_secretbox_xchacha20poly1305_open_easy"]=wasmExports["Lj"];Module["_crypto_secretbox_xchacha20poly1305_keybytes"]=wasmExports["Mj"];Module["_crypto_secretbox_xchacha20poly1305_noncebytes"]=wasmExports["Nj"];Module["_crypto_secretbox_xchacha20poly1305_macbytes"]=wasmExports["Oj"];Module["_crypto_secretbox_xchacha20poly1305_messagebytes_max"]=wasmExports["Pj"];Module["_crypto_shorthash_siphashx24_bytes"]=wasmExports["Qj"];Module["_crypto_shorthash_siphashx24_keybytes"]=wasmExports["Rj"];Module["_crypto_shorthash_siphashx24"]=wasmExports["Sj"];Module["_crypto_stream_salsa2012"]=wasmExports["Tj"];Module["_crypto_stream_salsa2012_xor"]=wasmExports["Uj"];Module["_crypto_stream_salsa2012_keybytes"]=wasmExports["Vj"];Module["_crypto_stream_salsa2012_noncebytes"]=wasmExports["Wj"];Module["_crypto_stream_salsa2012_messagebytes_max"]=wasmExports["Xj"];Module["_crypto_stream_salsa2012_keygen"]=wasmExports["Yj"];Module["_crypto_stream_salsa208"]=wasmExports["Zj"];Module["_crypto_stream_salsa208_xor"]=wasmExports["_j"];Module["_crypto_stream_salsa208_keybytes"]=wasmExports["$j"];Module["_crypto_stream_salsa208_noncebytes"]=wasmExports["ak"];Module["_crypto_stream_salsa208_messagebytes_max"]=wasmExports["bk"];Module["_crypto_stream_salsa208_keygen"]=wasmExports["ck"];Module["_crypto_stream_xchacha20_keybytes"]=wasmExports["dk"];Module["_crypto_stream_xchacha20_noncebytes"]=wasmExports["ek"];Module["_crypto_stream_xchacha20_messagebytes_max"]=wasmExports["fk"];Module["_crypto_stream_xchacha20"]=wasmExports["gk"];Module["_crypto_stream_xchacha20_xor_ic"]=wasmExports["hk"];Module["_crypto_stream_xchacha20_xor"]=wasmExports["ik"];Module["_crypto_stream_xchacha20_keygen"]=wasmExports["jk"];Module["_malloc"]=wasmExports["kk"];Module["_free"]=wasmExports["lk"];wasmExports["dynCall_iiiji"];wasmExports["dynCall_iiij"];wasmExports["dynCall_iijii"];wasmExports["dynCall_iiijiji"];wasmExports["dynCall_iiijiii"];wasmMemory=wasmExports["e"];wasmExports["__indirect_function_table"];}var wasmImports={b:___assert_fail,c:__abort_js,a:_emscripten_asm_const_int,d:_emscripten_resize_heap};function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun();},1);}else {doRun();}}var wasmExports;createWasm();run(); + }); + }; +var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename$1!="undefined"){_scriptName=__filename$1;}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href;}var scriptDirectory="";if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname$1+"/";if(process.argv.length>1){process.argv[1].replace(/\\/g,"/");}process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module;}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href;}catch{}}else;console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;function binaryDecode(bin){for(var i=0,l=bin.length,o=new Uint8Array(l),c;i>8&c;}return o}var HEAP8,HEAPU8,HEAP16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(onPreRuns);}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(onPostRuns);}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return binaryDecode('asmî(```~```````` ``~~` ``~`~`~``~`~``` `\n`~~` ~~`~`~`~~`~~`~~~`~``~` ~`\n~``~`~aaabacad ¼º          ! "      #$%  &\'\r     \n\n \n\r  \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n      \r\r\rp@€€AÂ ¡Øef\ngh\ni jñkðlÎmÍnÌoËp qr s tñuvÊwÉxÈyÇzAÆBÅCÄDÃEÂFÁGÀH¾I JéKL\nM)NO P$QR\nS)TU½V¼W»XºY Z"_$\naa)baca da eaØfa¯ga®haia ja kaLlama-na¹oaBpa¸qa·rasa ta€uava+wa­xa.ya¶zaµAa Ba Ca€DaEaæFa­GaÝHa¯Ia®Ja Ka La Ma Na"Oa Pa\nQa\nRa)SaïTaîUaíVaìWaTXaSYa¬Za«_aª$a´ab³bb²cb©db±eb¨fb°gb¯hb®ib¿jbukb>lb=mbTnbSob¬pb«qb rb sb tb ub"vb wb\nxb\nyb)zbAb Bb\nCb Db\nEb(Fb Gb\nHb Ib\nJbFKbLb\nMb Nb\nObEPbQb\nRb Sb\nTbDUbVb\nWb Xb\nYb\nZb_b $b\nacbc ccÀdcÜec§fcógc¦hcòicjc\nkclc mc\nncoc pc\nqc\nrcÜsctc§uc­vcwcˆxc¦yczcAc¥BcÙCc DcÏEc^Fc«Gc*HcªIcJcLKc/LclMcNc¥Oc\nPcQc$Rc Sc¤TcÀUc\nVcWc$Xc Yc¤Zc_c‘$cadbdŽcddded fdgdŒhdLidæjd®kd­ld¬md«ndªodpdqd©rd€sdÕtd>udÔvdÓwd xd yd zd AdÒBd“Cd\nDd Ed£Fd¢Gd•Hd¡Id”JdàKdLd£Md¢Nd•Od¡Pd”Qd\nRd Sd“TdUdMVd\nWdXdYdZd\n_d{$d‡ae_becezdeyeexfeØge†he…ie$je„ke©le¨me¦ne¥oe¤pe7qe\nreseteue\nve{weÔxeMyezezAeyBe7CeÓDe_EeÒFexGewHe£Ie Je¢KeMLe7Me7Ne\nOePeQeRe\nSe{TeÔUeMVeWezXeyYe7ZeÓ_e_$eÒafxbfwcf¡df ef ffŸgfžhfƒjf×kf†lfÖmf nf ofpf†qf rf sf tf"uf vf\nwf\nxf)yfÚzfTAfSBfCfªDfœEf©Ff¨GfTHfSIf Jf"Kf Lf\nMf\nNf)OfPfQf—Rf–Sf•Tf›UfšVf”Wf“Xf"Yf Zf’_f$fMag7bg_cg$dg\negáfgŸggðhg$ig\njgŸkgLlgmg ng ogpgÉqgùrgøsg÷tgžugvgœwg›xgöyglzgõAgôBgLCgDg Eg FgGgÉHgûIgúJgÈKglLgÇMgÆNgËOgÊPg€QgÿRg›SgTgœUgžVg Wg$XgYg Zgé_g$g™ah˜bh–ch•dh”eh“fhghhh ih"jhkhlhšmh™nhoh ph$qhrh’sh‘thuhvhšwhxh™yh zh"AhBhCh\nDh EhFh5Gh<Hh°IhµJh´KhçLh³MhNh±Oh Ph°QhŽRh‹ShŠTh‰Uh~Vh}WhºXh²Yh¯ZhÑ_hÐ$h7aibiuci>di‚ei˜figiŒhi‹ii—jiŠki–li‰mi ni oi pi qi"ri\nsi)tiˆui‡vi¿wi¨xi§yi¦zi¥Ai¤BiåCiäDiãEiâFiáGiàHißIiÞJi KiLi MiNi Oi£Pi¢Qi¡Ri SiŸTižUiViœWi›XišYi™ZiÞ_i˜$i ajbjcj dj†ej\nfjgjhjij jjëkjêljémjnj·ojpjèqj·rjØsjwtj…uj„vjƒwj‚xjçyjæzjåAjäBj Cj DjßEjÞFj Gj Hj˜IjJj—Kj–Lj Mj"Nj\nOj)Pj\nQj\nRj€SjÿTjþUj Vj$WjXjYjýZjü_j $j$akbkck dk"ekfkûgkúhkùikjkkk (A ¿¬§—ø÷öõô½¼»¹¸·¶ \nݔ\nºË~ ( "At¬" ¬"~ (" ¬" ("!At¬" ~| ("At¬" (""At¬"~| ("¬" ("#At¬"~| ( "Al¬" ¬"~| ($"A&l¬" ("At¬"~|  ~ ~| ¬" ~|  ~|  ~|  ~ !¬" ~|  ~| A&l¬" ¬"~|  At¬~|  ~|"B€€€|"B‡|"B€€€|"B‡|"\n \nB€€€|" B€€€àƒ}>  ~  "¬"\r~| Al¬"\n ~|  ~|  At¬"~|  ~|  \n~  \r~|  ~|  ~|  ~| A&l¬ ~ #¬"\r \r~| \n ~|  ~|  ~|  ~|"\nB€€€|"\rB‡|"B€€€|"B‡|" B€€€|"B€€€àƒ}> ~  ~|  ~|  ~|  ~| B‡|" B€€€|" B€€€ðƒ}>  ~  ~| ~|  ~|  ~| B‡|" B€€€|"B€€€ðƒ}> ~  ~|  ~|  ~|  ~|  ¬"~| B‡|" B€€€|"B€€€àƒ}>  B€€€ðƒ}  B€€€`ƒ} B‡|"B€€€|"Bˆ|>  B€€€àƒ}>  ~  ~| ~|  ~|  ~| B‡|" B€€€|"B€€€ðƒ}>$  B€€€ðƒ} \n \rB€€€`ƒ} B‡B~|"B€€€|"Bˆ|>  B€€€àƒ}>  \'~  ("*¬" ("+At¬"~ 4" 4"~| (",¬"\r 4"~| ( "-¬" ( ".At¬"~| ("/¬" 4"~| ("0¬" ("1At¬"~| ("2¬" 4" ~| ("3Al¬" ($"4At¬"~| ( "5Al¬" 4 "\n~| ($"Al¬" ("At¬"~|  ~  +¬"~| \r .¬"~|  ~|  1¬"~| ~| 2Al¬" 4¬"~| \n ~|  ¬"~|  ~| ~  ~|  \r~|  ~| ~| 0Al¬" ~| \n ~| ~|  ~|  ~|""B€€€|"#B‡|"$B€€€|"%B‡|" B€€€|"B€€€àƒ}> ~  ~| \r~| -Al¬" ~| \n /Al¬"~|  ~|  ~| ~|  ~|  ~| ~  ~| ,Al¬"! ~| \n ~|  ~|  ~|  ~|  ~|  ~|  ~| *Al¬ ~  ~| \n !~|  ~|  ~|  ~|  ~| ~|  ~|  ~|"!B€€€|"&B‡|"\'B€€€|"(B‡|" B€€€|")B€€€àƒ}>  ~  ~| \r ~|  ~|  ~|  ~|  ~| 3¬"~|  ~|  \n~| B‡|" B€€€|"B€€€ðƒ}>  ~  ~| \r ~| ~|  ~| \n ~|  ~|  ~|  ~|  ~| )B‡|" B€€€|"B€€€ðƒ}> ~  \n~|  \r~|  ~|  ~|  ~|  ~|  ~| 5¬" ~|  ~| B‡|" B€€€|"B€€€àƒ}> $ %B€€€ðƒ} " #B€€€`ƒ} B‡|"B€€€|"Bˆ|>  B€€€àƒ}> \n ~  ~| \r ~|  ~|  ~|  ~|  ~|  ~| ~| ¬~| B‡|" B€€€|"B€€€ðƒ}>$ \' (B€€€ðƒ} ! &B€€€`ƒ} B‡B~|"B€€€|"Bˆ|>  B€€€àƒ}> ñ6~ 3 1B†B€€üƒ„" (":AvAÿÿÿq­"~ 3 1B†B€€üƒ„" ("9AvAÿÿÿq­" ~| 5BˆBÿÿÿƒ" (";AvAÿÿÿq­"~| (\n"s!  6 B7 AtA¤Àj!@Aø½("A t"qE@Aø½  r6  6A!A  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6A! !A ! "  (" 6  6A!A!A !  j 6  6 j 6A”¾A”¾(Ak"A 6 AÀ ’~#AÀk" $@ P\r )H" B†|"7H A@k" )  V­| B=ˆ|7 AÐj! B€ BˆBÿƒ"}" X@ Bƒ!B!@ Bÿ…BZ@ Büƒ!\n@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" \nR\r P\r @  |§j  §j-: B|! B|" R\r A€j"\ra  §j!  }"BÿV@@  \ra A€j! B€}"BÿV\r @ P\r Bƒ!B!B! BZ@ Büƒ!B!@ §"j j-: Ar"\rj  \rj-: Ar"\rj  \rj-: Ar"j j-: B|! B|" R\r P\r @ §"j j-: B|! B|" R\r AÀ  Bƒ!B! BZ@ B|ƒ!@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" R\r P\r @  |§j  §j-: B|! B|" R\r AÀj$A A Æ#Ak"A:@ E\r Aq! AO@ A|q!@  j"- -r:  - -r:  - -r:  - -r: Aj! Aj" G\r E\r A!@  j- -r: Aj! Aj" G\r -AkAv … #A0k"$  AÐj A(j Aøj AÐj ((! (,! (! (0! (! (4! ( ! (8!\n (! (j! @@@ At(¤À"E@A!  A! A AvkA AGt!@@ (Axq k" O\r ! "\rA! !  ("   AvAqj("F ! At! \r rE@A!A t"A kr q"E\r hAt(¤À! E\r @ (Axq k" I!   !  ! ("  ( "\r E\r Aü½( kO\r (!  ( "G@ (" 6 6  (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6  Aü½("M@Aˆ¾(!@  k"AO@ j" Ar6 j 6 Ar6  Ar6 j" (Ar6A!A! Aü½ 6Aˆ¾ 6 Aj! A€¾("I@A€¾  k"6AŒ¾AŒ¾(" j"6  Ar6 Ar6 Aj! A! A/j"AÌÁ(@AÔÁ(  AØÁB7AÐÁB€ €€€€7AÌÁ \nA jApqAتժs6AàÁA6A°ÁA6A€ "j"A k"q" M\rA¬Á("@A¤Á(" j" M\r  I\r @A°Á-AqE@@@@@AŒ¾("@A´Á!@ (" M@   (jI\r ("\r AA"AF\r !AÐÁ("Ak" q@  k  jA kqj!  M\rA¬Á("@A¤Á(" j" M\r I\r A" G\r   k q"A" ( (jF\r ! AF\r A0j M@ !  AÔÁ("  kjA kq"AAF\r  j! !  AG\r A°ÁA°Á(Ar6 A!AA! AF\r AF\r M\r k" A(jM\r A¤ÁA¤Á( j"6A¨Á( I@A¨Á 6 @AŒ¾("@A´Á!@  (" ("jF\r ("\r  A„¾("A ME@A„¾ 6 A!A¸Á 6A´Á 6A”¾A6A˜¾AÌÁ(6AÀÁA6@ At" Aœ¾j"6¤¾  6¨¾ Aj"A G\r A€¾ A(k"Ax kAq"k"6AŒ¾  j"6  Ar6 jA(6A¾AÜÁ(6   M\r  K\r ( Aq\r  j6AŒ¾ Ax kAq"j"6A€¾A€¾( j" k"6  Ar6  jA(6A¾AÜÁ(6  A!  A!  A„¾( K@A„¾ 6  j!A´Á!@@  ("G@ ("\r  - AqE\r A´Á!@@ (" M@   (j"I\r (!  A€¾ A(k"Ax kAq"k"6AŒ¾  j"6  Ar6 jA(6A¾AÜÁ(6  A\' kAqjA/k" AjI"A6 A¼Á)7 A´Á)7A¼Á Aj6A¸Á 6A´Á 6AÀÁA6 Aj!@ A6 Aj Aj! I\r  F\r  (A~q6   k"Ar6  6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6  ( ! 6  6 A !A  A! AÿÿÿM@ A& Avg"kvAq AtrA>s!  6 B7 AtA¤Àj!@@Aø½("A t"qE@Aø½  r6  6  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6  6A! "!A  (" 6  6  6A!A!A j 6  j 6 A€¾(" M\rA€¾ k"6AŒ¾AŒ¾(" j"6  Ar6 Ar6 Aj!  Að½A06A!  6 ( j6 Ax kAqj" Ar6 Ax kAqj"  j"k!@AŒ¾( F@AŒ¾ 6A€¾A€¾( j"6  Ar6  Aˆ¾( F@Aˆ¾ 6Aü½Aü½( j"6  Ar6 j 6  ("AqAF@ Axq! ( !@ AÿM@ (" F@Aô½Aô½(A~ Avwq6   6  6  (!@  G@ (" 6  6  @ (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6  A! E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½Aø½(A~ wq6  @  (F@  6   6 E\r  6 ("@  6 6 ("E\r  6 6  j!  j"(!  A~q6  Ar6  j 6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6  ( ! 6  6  6  6  A! AÿÿÿM@ A& Avg"kvAq AtrA>s!  6 B7 AtA¤Àj!@@Aø½("A t"qE@Aø½  r6 6  A AvkA AGt! (!@ "(Axq F\r Av! At! Aqj"("\r  6  6  6  6  (" 6 6 A6  6  6 Aj!  @ E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½ A~ wq"6  @  (F@  6   6 E\r 6 ("@ 6  6 ("E\r 6  6 @ AM@   j"Ar6 j" (Ar6   Ar6  j" Ar6  j 6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6  ( ! 6  6  6  6  A! AÿÿÿM@ A& Avg"kvAq AtrA>s!  6 B7 AtA¤Àj!@@ A t"qE@Aø½  r6  6  6  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6  6  6  6  (" 6  6 A6  6  6 Aj!  @ E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½ A~ wq6  @  (F@ 6  6 E\r 6 ("@ 6  6 ("E\r 6  6 @ AM@   j"Ar6 j" (Ar6   Ar6  j" Ar6  j 6 @ AxqAœ¾j!Aˆ¾(!A Avt" qE@Aô½  r6  ( ! 6  6  6  6 Aˆ¾ 6Aü½ 6 Aj! \nAj$ È#Ak"$ A:A!  Aˆ·(E@  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  -\n -r:  - -r:  - -r:  -\r -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r: -AtA€€€kAu! Aj$  }@@ "AqE\r -E@A @ Aj"AqE\r -\r  @ "Aj!A€‚„ ("k rA€‚„xqA€‚„xF\r @ "Aj! -\r  k " A€O@AÖ\nAÿ AëAã   éA!@ AÀK\r AÁk"A@I\r@ A E@ AÿqA¿M@ A@kAA¥ü BùÂø›‘£³ðÛ78 Bëú†Ú¿µöÁ70 BŸØùÙ‘ڂ›7( Bхšïúϔ‡Ñ7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­Bˆ’÷•ÿÌù„ê…7  #A€k"$@ AÁkAÿqA¿M\r E\r AÁkAÿqA¿M\r A@kAA¥ü BùÂø›‘£³ðÛ78 Bëú†Ú¿µöÁ70 BŸØùÙ‘ڂ›7( Bхšïúϔ‡Ñ7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­ ­B†„Bˆ’÷•ÿÌù„ê…7 AA€ü @   ü\n Aàj A€ü\n A€6à A€ A€j$A   \r A!  \r  !A ì~#A k" $@ P\r ) " B†|7 A(j! BÀ BˆB?ƒ"}" X@ Bƒ!B!@ B?…BZ@ Büƒ!\n@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" \nR\r P\r @  |§j  §j-: B|! B|" R\r A€j"\r]  §j!  }"B?V@@  \r] A@k! B@|"B?V\r @ P\r Bƒ!B!B! BZ@ B<ƒ!B!@ §"j j-: Ar"\rj  \rj-: Ar"\rj  \rj-: Ar"j j-: B|! B|" R\r P\r @ §"j j-: B|! B|" R\r A   Bƒ!B! BZ@ B|ƒ!@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" R\r P\r @  |§j  §j-: B|! B|" R\r A j$A A \r  A A ÷~ (,"AvAÿÿÿq­ ( B\r† B†„ B†„" \rBˆ| B€€€|"B€€€ðƒ}> B † B†„ B†„ Bˆ|" B€€€|"B€€€àƒ}>  B€€€ðƒ} B\n† B†„ B†„ \nB † B†„ B†„" B€€€|"\nBˆ|" B€€€|" Bˆ|> B€€€àƒ}> B\r† B†„ B†„ B† B†„ B†„"B€€€|"Bˆ|" B€€€|"B€€€àƒ}> B†B€€ðƒ B\n† B†„„" Bˆ| B€€€|"B€€€ƒ}>$ Bˆ | \nB€€€ðƒ}>  B€€€ðƒ}  BˆB~|"B€€€|"Bˆ|>  B€€€àƒ}> •#Ak" 6  6 A;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (- sr;  / ( -\n (-\nsr;  / ( - (- sr;  / ( - (- sr;  / ( -\r (-\rsr;  / ( - (-sr;  / ( - (-sr;  /;  /Ak; A€Â/Av /Avs; /Ak ™AÁ!A€!@@ Aÿq"A€-G@ A‚„l!@A€‚„ ( s"k rA€‚„xqA€‚„xG\r Aj! Ak"AK\r E\r Aÿq!@ -F@  Aj! Ak"\r A A ?@ ­B€€€€ B?|Bˆ}V\r B€€€€Z\r     A´·(  \' B€€€€Z@     A°·( § #A€k"$A! -"AsAÿq - - - - - - - - - -\n - - -\r - - - - - - - - - - - - - - - - -qqqqqqqqqqqqqqqqqqqqqqqqqqqqqAsrAÿqAkAì -"kqAv A‚Â-Av AvsrrAqE@ AÐj"\r 4 A j \r A (Ä"k6” A (À"k6 A (¼"k6Œ A (¸"k6ˆ A (´"k6„ A (°"k6€ A (¬"k6ü A (¨" k6ø A (¤"\nk6ô A ( " k6ð Aj" Aðj"  6ä  6à  6Ü  6Ø  6Ô  6Ð  6Ì  6È  \n6Ä  Aj6À Aàj" AÀj" A0j"A°  (`! (0! (d! (4! (h! (8! (l! (I Aj!\r  ) 7ˆ  )7€  )7ø  )7ð  )7è  )7  )7˜  )7   )7¨  ) 7°  )7¸  )7À  )7È  )7Ð  ) 7Ø  Aèj"\n \n   Aj"   A¸j"    \n \n          \n \n          \n         A!@ Aj" Av A j j,Œ A€j" i          A>I Aj!\r Aàj$ ±#Ak" 6  6A! A;@  / ( j- ( j-sr;  / Ar" ( j- ( j-sr; Aj"A G\r  /;  /Ak; A€Â/Av /Avs; /Ak 4#A k"$A!   E@ Aж A(! A j$   A  AŒ·( €@@@ "Aÿq"@ Aq@@ -"E\r  F\r Aj"Aq\r A€‚„ ("k rA€‚„xqA€‚„xG\r A‚„l!@A€‚„  s"k rA€‚„xqA€‚„xG\r (! Aj"! A€‚„ krA€‚„xqA€‚„xF\r   j  ! @ "-"E\r Aj!  AÿqG\r "A - AÿqF ` E@A -"@@  -"G\r E\r Ak"E\r Aj! -! Aj! \r A! A -k W~@Að¶("­ ­B|Bøÿÿÿƒ|"BÿÿÿÿX@ §"?AtM\r \r Að½A06A Að¶ 6  9#A k"$ * Aèj" B ! * A  A j$A –#AÐk"$ B7H B7@ A°¬)7 A¸¬)7 AÀ¬)7 AȬ)7 AЬ)7 Aج)7( Aà¬)70 Aè¬)78      AÐj$A    AeA    A eA    AeA ¡,~#A k"$ A(j"(! (P! (,!\r (T! (0! (X! (4! (\\! (8! (`! (    q  qr"At A vr­| B ˆ|">    \rq  qrAt Avr­| B ˆ|> AØ Ý~@ )8"BR@ B }"   V"BR~ Bƒ! A@k!\nB!@ BZ@ B|ƒ!@ \n )8 |§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: B|! B|" R\r P\r @ \n )8 |§j  §j-: B|! B|" R\r )8  |"78 BT\r A@kBk B78  }!  §j! BZ@  Bpƒ"k Bƒ!  §j! P\r Bƒ! A@k!\nB!B!@ BZ@ B ƒ! B!@ \n )8 |§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: B|! B|" R\r P\r @ \n )8 |§j  §j-: B|! B|" R\r )8 |78 š A6 @ @B€€ B€€X" Av­Z@ A€ O\rA  A6A § (Atn"AI\rA AI\r AI@ A6 A I@ A6 AÀI@ A6 A€I@ A6 A€I@ A6 A€I@ A6 A€I@ A 6 A€I@ A\n6 A€ I@ A 6 A€ÀI@ A 6 A€€I@ A\r6 A€€I@ A6 A€€I@ A6 A€€I@ A6 A€€I@ A6 A€€ I@ A6 A€€ÀI@ A6 A€€€I@ A6 A€€€I@ A6 A€€€I@ A6 A€€€I@ A6 A€€€O\r A6 A A€ÀI\rA A€€I\rA A€€I\rA A€€I\rA A€€I\rA A€€I\rA A€€ I\rA A€€ÀI\rA\n A€€€I\rA A€€€I\rA A€€€I\rA\r A€€€I\rA A€€€I\rA A€€€ I\rA A€€€ÀI\rA A€€€€I\rA A€€€€I\rA A€€€€I\rAA AN "6 Bÿÿÿÿ Bˆ ­ˆ" BÿÿÿÿZ§ (n6 AA A€€€ I 6 û E@Ag (E@A (AI@A~ @ (\r ( E\rAn (! (E@AmAz  AI@Az @ (\r (E\rAl @ ( \r ($E\rAk (0"E@Ap AÿÿÿK@Ao Ar!@ (,"AI\r A€€€K@Aq  AtI\r ((E@At (4"E@Ad AcA AÿÿÿK!  ¨~#A€k"$ A€j A€ü\nA!@ At" A€j"j" ) j)…7  Ar"j" ) j)…7  Ar"j" ) j)…7  Ar"j" ) j)…7 Aj"A€G\r  A€ü\nA!A!@  At"j" )  j)…7  Ar"j" )  j)…7  Ar"j" )  j)…7  Ar"j" )  j)…7 Aj"A€G\r @ A€j Atj" )8" )"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )x…B ‰" )X"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" )(" )"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )h…B ‰" )H" | B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B‰" ) " )"\n| \nB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\n )`…B ‰" A@k")"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|"\n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|" …B ‰" )0" )"\r| \rB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\r )p…B ‰" )P"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|"\r …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7  …B0‰" 7x  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7P   …B‰7(   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"  …B‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n …B0‰"…B ‰"\n| B†Bþÿÿÿƒ \nBÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n…B0‰"7`  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7X   …B‰70   …B‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|" …B ‰"  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7h  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7   …B‰78    …B‰"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B ‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7p  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7H   …B‰7 Aj"AG\r A!@ A€j Atj" )ˆ" )ˆ"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )ˆ…B ‰" )ˆ"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" )ˆ" )"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )ˆ…B ‰" )ˆ" | B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B‰" )€" )"\n| \nB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\n )€…B ‰" )€"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|"\n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|" …B ‰" )€" )€"\r| \rB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\r )€…B ‰" )€"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|"\r …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7  …B0‰" 7ˆ  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7€   …B‰7ˆ   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"  …B‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n …B0‰"…B ‰"\n| B†Bþÿÿÿƒ \nBÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n…B0‰"7€  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7ˆ   …B‰7€   …B‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|" …B ‰"  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7ˆ  7€   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7€   …B‰7ˆ    …B‰"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B ‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7€  7ˆ   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7ˆ   …B‰7€ Aj"AG\r  A€ü\nA!@  At"j" ) A€j" j)…7  Ar"j" )  j)…7  Ar"j" ) A€j j)…7  Ar"j" ) A€j j)…7 Aj"A€G\r A€j$ ¨$\'#AÐk"$A!\n@ A j"ŠE\r H\r gE\r H\r A€j" ‘\r A€j"\n/ @ \nA¶B" \n B  \n B  \n   \n AÀj" % Aj! ! !\nA!A!#Aàk"$@ Aàj" j  Avj-" AqvAq:  Ar"j AqvAq: Aj"A€G\r Aþ!@ "Aj!@  Aàj"j" -E\r AþK\r@  j","E\r At" ,"j" AL@ : A:   k"AqH\r : !@ Aàj j"-E@ A:  A: Aj"A€G\r E\r@ Aj" Aàjj","E\r At" ," j"\rAN@ k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  \r: A: A  AOAj"AF\r@ Aj" Aàjj"," E\r At" ,"\rj"AN@ \r k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: AF\r@ Aj" Aàjj"," E\r At" ,"\rj"AN@ \r k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: AF\r@ Aj" Aàjj"," E\r At" ,"\rj"AN@ \r k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: AF\r Aj" Aàjj","E\r At" ,"j" AN@  k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: Ak! A€G\r A!@ Aà\rj" j \n Avj-" AqvAq:  Ar"j  AqvAq: Aj"A€G\r A!Aþ!@ "Aj!@  Aà\rj"j"\n-E\r AþK\r@  j"," E\r At" \n,"j"AL@ \n : A:   k"AqH\r \n : !@ Aà\rj j" -E@ A:  A: Aj"A€G\r E\r@ Aj" Aà\rjj" ,"E\r At" \n,"j" AN@  k" AqH\r \n :@ Aà\rj j" -@ A: Aj"A€G\r  A:  \n : A: A  AOAj" AF\r@ Aj" Aà\rjj","E\r At" \n," j"\rAN@ k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n \r: A: AF\r@ Aj" Aà\rjj","E\r At" \n," j"\rAN@ k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n \r: A: AF\r@ Aj" Aà\rjj","E\r At" \n," j"\rAN@ k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n \r: A: AF\r Aj" Aà\rjj"," E\r At" \n,"j"AN@  k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n : A: Ak! A€G\r Aàj"\n   ) 7À  )7¸  )7°  )7¨  )7   )(7È  )07Ð  )87Ø  A@k)7à  )H7è  )P7ð  )X7ø  )`7€  )h7ˆ  )p7 AÀj" A j"   A¸j" A(j Aèj" Aj" AÐj   Aøj     \n    AÈj"  Aðj"   A˜j"\n   A€j"            \n   A j"            \n   AÀj"            \n   Aàj"            \n   A€\nj"            \n   A  j"            \n   AÀ j  B7 B7 B7 B7 B7 B7, A(j""A6 B74 B7< B7D B7T B€€€€7L B7\\ B7d B7l A6t AÐj!#Aÿ!@@@@ Aàj" j-\r Aà\rj" j-\r  Ak"j-E@  j-E\r ! AH\r@ AÀj" @ " Aàjj,"AJ@ A j"       \n    Aàj AþqAvA lj  AN\r A j" AÀj"      \n    AàjA kAþqAvA ljQ @ Aà\rj j,"AJ@ A j" AÀj"      \n    AþqAvAølAÀ\rji  AN\r A j AÀj"      \n   ( ! (È!\r (¤! (Ì! (¨! (Ð! (¬! (Ô! (°! (Ø! (´! (Ü! (¸! (à! (¼! (ä! (À! (è!  (ì" (Ä"!k6Œ   k6ˆ   k6„   k6€   k6ü   k6ø   k6ô   k6ð   k6ì  \r k6è  !j6ä   j6à   j6Ü   j6Ø   j6Ô   j6Ð   j6Ì   j6È   j6Ä  \rj6À  A kAþqAvAølAÀ\rj"A(j   AÐj \n (”! (! (Œ! (ˆ!! („!$ (€!% (ü!& (ø!\' (ô!( (ð!) (è! (! (ì! (”!\r (ð! (˜! (ô! (œ! (ø! ( ! (ü! (¤! (€! (¨! („! (¬! (ˆ! (°!  (Œ"* (´"+j6Œ   j6ˆ   j6„   j6€   j6ü   j6ø   j6ô   j6ð  \rj6ì   j6è  + *k6ä   k6à   k6Ü   k6Ø   k6Ô   k6Ð   k6Ì   k6È  \r k6Ä   k6À  )At" (¸"k6  (At" (¼"\rk6”  \'At" (À"k6˜  &At" (Ä"k6œ  %At" (È"k6   $At" (Ì"k6¤  !At" (Ð"k6¨  At" (Ô"k6¬  At" (Ø"k6°  At" (Ü"k6´   j6¸  \rj6¼   j6À   j6Ä   j6È   j6Ì   j6Ð   j6Ô   j6Ø   j6Ü  AÀj  "  #   Ak! AJ\r  Ak! \r Aàj$ A j" ,A  < F A 1r!\n AÐj$ \n ª"5~#A°k";$ ;Aàj"</ @ AvAÿÿÿq­ 3 1B†B€€üƒ„" ~  ("?AvAÿÿÿq­"~| 5BˆBÿÿÿƒ" ~|  Av­ 1B†„ 1B†„BˆBÿÿÿƒ|") #B˜Ú~  0B€€€ÿÿÿÿƒ} Bˆ|"B“Ø(~| "Bçö\'~| $BӌC~| %BÑ«~| (Bˆ|| )B€€@}"(B€€€ƒ}"| B€€@}"0B€€€ƒ}") . 4 5B€€€ƒ} Bƒ¡V~ !BÑ«~| 2| 3B€€€ƒ}  !BӌC~| BÑ«~| #Bƒ¡V~| 1B€€€ƒ} ~  ~|  ~| \r ~|  ~| ~|  ~|  ~| ~| \n ~| ~  ~|  ~|  ~|  ~| \r ~| ~|  ~|  ~| ~| \n ~|"1B€€@}"2Bˆ|"3B€€@}"4Bˆ|"5B€€@}"7B‡|"B€€@}"6B‡|"Bƒ¡V~ BÑ«~|| /B€€€ƒ} & BÑ«~ BӌC~|  6B€€€ƒ}"Bƒ¡V~| %B˜Ú~ $B“Ø(~| ,| * %B“Ø(~| +B€€€ƒ}  ~  ~|  ~|  ~|  ~|  ~| (\n"Av­ 1B†„ 1B†„BˆBÿÿÿƒ| AvAÿÿÿq­  ~  ~|  ~|  ~|  ~||"*B€€@}"+Bˆ|",B€€@}".Bˆ|"/B€€@}"6B‡| -B€€€ƒ}"-B€€@}"8B‡|| \'B€€€ƒ}"&B€€@}"\'B‡|"9B€€@}":B‡| )B€€@}")B€€€ƒ} 9 :B€€€ƒ} & \'B€€€ƒ} BӌC~ Bçö\'~| BÑ«~| -| 8B€€€ƒ} 5 7B€€€ƒ} BӌC~ !Bçö\'~| #BÑ«~| "Bƒ¡V~| 3| 4B€€€ƒ} Bçö\'~ !B˜Ú~| #BӌC~| 1| "BÑ«~| $Bƒ¡V~| 2B€€€ƒ} (Av­  ~  ~|  ~| \r ~| ~|  ~|  ~| ~|  ~|  ~| ~| \n ~|| (Bˆ|"B€€@}"Bˆ|"B€€@}" B‡|"B€€@}"\nB‡|"Bƒ¡V~| / B˜Ú~| 6B€€€ƒ} Bçö\'~| BӌC~| BÑ«~|  \nB€€€ƒ}"Bƒ¡V~|"\nB€€@}" B‡|" B€€@}"\rB‡| \rB€€€ƒ} \n B€€€ƒ} B“Ø(~ ,| .B€€€ƒ} B˜Ú~| Bçö\'~|  B€€€ƒ} B˜Ú~ !B“Ø(~| #Bçö\'~| "BӌC~| $BÑ«~| %Bƒ¡V~| | B€€€ƒ} 0B‡|"B€€@}"B‡|"Bƒ¡V~| BӌC~| BÑ«~| * +B€€€ƒ}  ~  ~|  ~|  ~| 5BˆBÿÿÿƒ|  ~  ~|  ~| ("Av­ 1B†„ 1B†„BˆBÿÿÿƒ|" B€€@}"\nBˆ|" B€€@}" Bˆ| B“Ø(~| B˜Ú~| BÑ«~| Bçö\'~| BӌC~|"\rB€€@}"B‡|"B€€@}"B‡|   B€€€ƒ} )B‡|"B€€@}"B‡"Bƒ¡V~| B€€€ƒ} \r BÑ«~| B€€€ƒ} B€€€ƒ} B“Ø(~| BӌC~| B˜Ú~| Bçö\'~| AvAÿÿÿq­  ~  ~||  ~ 3 1B†B€€üƒ„|" B€€@}" Bˆ|"\rB€€@}"Bˆ| \nB€€€ƒ} Bçö\'~| B“Ø(~| B˜Ú~|"B€€@}" B‡|"\nB€€@}"B‡| \n BӌC~| B€€€ƒ}  Bçö\'~| B€€€ƒ} \r B€€€ƒ} B˜Ú~| B“Ø(~| B€€€ÿÿÿƒ} B“Ø(~|"B€€@}"B‡|"B€€@}" B‡|  B˜Ú~| B€€€ƒ}  B€€€ƒ} B“Ø(~|"B‡|" B‡|"\nB‡|" B‡|" B‡|"\rB‡|"B‡|"B‡|"B‡|"B‡|"B‡  B€€€ƒ}|"B‡"B“Ø(~ Bÿÿÿƒ|"< Bˆ<! B˜Ú~ Bÿÿÿƒ| B‡|"B ˆ<$ Bˆ<# BˆBƒ B†„<" Bçö\'~ \nBÿÿÿƒ| B‡|"Bˆ<& B† B€€àƒBˆ„<% BӌC~ Bÿÿÿƒ| B‡|"B ˆ<) Bˆ<( B† B€€ÿƒBˆ„<\' BÑ«~ Bÿÿÿƒ| B‡|"B ˆ<, Bˆ<+ B† B€€øƒBˆ„<* Bƒ¡V~ \rBÿÿÿƒ| B‡|"Bˆ<. B† B€€ÀƒBˆ„<- Bÿÿÿƒ B‡|"B\nˆ<1 Bˆ<0 B† B€€þƒBˆ„</ Bÿÿÿƒ B‡|"B\rˆ<4 Bˆ<3 Bÿÿÿƒ B‡|"<5 B† B€€ðƒBˆ„<2 Bˆ<6 Bÿÿÿƒ B‡|"B ˆ<9 Bˆ<8 BˆBƒ B†„<7 Bÿÿÿƒ B‡|"Bˆ<; B† B€€àƒBˆ„<: B‡" Bÿÿÿƒ|"Bˆ<? B ˆ<> B† B€€ÿƒBˆ„<< § §jAv­<= AÀ AÀ @ BÀ7 ;A°j$A >#A k"$   A(   AjB A”·( A  A j$ Z#A@j"$  B C  )7  )7  )7  )7 AÀ AŒ·( A@k$ °#" AÀkA@q"$  6¼@ AÀM@ AÀj"AA AH\r  A¼jB AH\r   ­ AH\r    AÀj"AAAÀAH\r  A¼jB AH\r   ­ AH\r  AðjAÀAH\r )ˆ7 )€7 )x7 )p7 A j! A k"AÁO@@  )¨7h  ) 7`  )˜7X  )7P  )ˆ7H  )€7@  )x78  )p70 AðjAÀ A0jBÀAA`AH\r )ˆ7 )€7 )x7 )p7 A j! A k"AÀK\r  )¨7h  ) 7`  )˜7X  )7P  )ˆ7H  )€7@  )x78  )p70 Aðj"  A0jBÀAA`AH\r E\r  ü\n AÀjA€$ A€€€€ A A€€€€x A€À A€ Ž@ -"A:kAÿqAöI\r ! !@ ! A™³æÌK\r AÿqA0k" A\nl"AsK\r  j! Aj"-"A:kAÿqAõK\r F\r A0F Gq\r  6 !  ñ AyqAF@@@@@@@@ @@ AM@@ ! @@@@@  j," AÐÿsAjAsAvA?q AÔÿsAjAsAvA>qr A¹j Aûk AŸÿjAsqAvqAÿqr Aj A:k AÐÿjAsqAvqAÿqr AÛk AÁk"\nAsqAv \nqAÿqr"\nAk A¾ÿsAjqAvAÿq \nr"\nAÿG\rA!\n E\r  ?@ Aj" O\r  !  \n Atj! AK\r Aj!   Aj" I!  Ak!  \rM\r \rj  v: \rAj!\r A!\n Aj" I\r  @@  j," A ÿsAjAsAvA?q AÒÿsAjAsAvA>qr A¹j Aûk AŸÿjAsqAvqAÿqr Aj A:k AÐÿjAsqAvqAÿqr AÛk AÁk"\nAsqAv \nqAÿqr"\nAk A¾ÿsAjqAvAÿq \nr"\nAÿF@A!\n E\r  ?@ Aj" O\r  !  \n Atj!@ AI@ Aj!  Ak!  \rM\r \rj  v: \rAj!\r A!\n Aj" O\r !   Aj" I!  !Að½AÄ6A!\n AK\r A !A! \n@ !  A tAsq@ !  @ Aq\r Av"\nE\r E\r  K!@ F@AÄ!  @ j,"A=F@ \nAk!\n   ?\rA! !  Aj! \n\r A! E\r O\r@  j,?E\r Aj" G\r !  A!  !  AÄ! O@ !  A! j-A=G@ !  Aj! \nAF@A!   F@  K!AÄ!   j-A=F\r Að½ 6  Aj!A! \r! @ @   j6   F\rAð½A6A! @  6   •@@@@@ AyqAG\r An"At!@ A}l j"E\r AqE@ Aj!  Av jAj!  M\r@ AO@ E@A!  A!A!  E@A!  A!A!  @  j- Atr! Ar!@ j  Ak"vA?q"AÇj AæÿjAv"\nAsq AÌÿjAv" q \n AÁjqr AÁÿjAsAvAßqr Aüj AÂÿjAvq Asqr AÁÿsAjAsAvA-qr: Aj! AK\r Aj" G\r E\rAÁÿ!A-! Aß   @  j- Atr! Ar!@ j  Ak"vA?q"AÇj AæÿjAv"\nAsq AÌÿjAv" q \n AÁjqr AÁÿjAsAvA/qr Aüj AÂÿjAvq Asqr AÁÿsAjAsAvA+qr: Aj! AK\r Aj" G\r E\rAÁÿ!A+! A/ ! j A ktA?q"AÇj AæÿjAv"Asq AÌÿjAv"q  AÁjqr   jAsAvqr Aüj AÂÿjAvq Asqr AÁÿsAjAsAvqr: Aj!  K\r @  O@ !   k"E\r jA= ü  Aj"  K k"@ jA ü  AÐA AçAß  ˜~#A@j"$@ AÁkAÿqA¿K@A! )PP@ (à"AO@ A@k" )"B€|7 )H Bÿ~V­|7H Aàj"N (àA€k"6à AO\r @  Aàj ü\n (à! A@k" )" ­|" 7 )H  V­|7H -ä@ B7X B7P Aàj!A!A€ k"@  jA ü N  )7  )7  )7  )7  ) 7  )(7(  )070  )878 @   ü\n AÀ A€ A@k$   Aê\nAÒ A²Aö A  j@ j" -   j-jk": Ar"j" -  j- AvAqjk": AvAq! Aj! Aj"AÀG\r ° #A k"$ (, Bˆ§s! (( §Ats! ($ Bˆ§s!\n ( §Ats! A@k!@  )x7˜  )p7  )`7ð  )h7ø  )p7à  )x7è A€j" Aðj Aàj  )ˆ7x  )€7p  )P7Ð  )X7Ø  )`7À  )h7È  AÐj AÀj  )ˆ7h  )€7`  )7°  )7¸  )P7   )X7¨  A°j A j  )ˆ7X  )€7P  )07  )87˜  )7€  )7ˆ  Aj A€j  )ˆ7  )€7  ) 7p  )(7x  )07`  )87h  Aðj Aàj  )ˆ78  )€70  )7P  )7X  ) 7@  )(7H  AÐj A@k  )ˆ7(  )€7  )70  )78  )7  )7(  A0j A j  )ˆ7  )€7  )7  )˜7  )7  )7  Aj   )ˆ7  )€7  ( s"\r6  ( s"6  ( \ns"6  ( s"6  ( s"6  (D \ns"6D  (H s"6H  (L s"6L Aj" AG\r @@@@ Ak (! (0! ( ! (`! (P!\n (! (4! ($! (d! (T! (! (8! ((! (h! (X! ( (< (, (\\ (lssss s \rs6     ssss s s6   ssss s s6    \nssss s s6  (! (0! ( ! (! (4!\n ($! (! (8! ((! ( (< (,ss \rs6  ss s6 \n ss s6   ss s6 (P! A@k(! (p! (`! (T!\n (D! (t! (d!\r (X! (H! (x! (h! (\\ (L (| (lsss6    sss6 \n \rsss6    sss6  E\r A ü A j$ ƒ #A k"$ (! (0! (! (! (4! (! (! (8! ( ! (! ( A&l¬ ~ $¬" ~| Al¬" #At¬"~|  ~|  ~|  ~|B†"B€€€|"B‡  ~  !¬"~|  ~|  ~|  \r~|B†|"B€€€|"B‡  \r~  ~|  \n~| ~|  ~|  ~|B†|" B€€€|"B€€€àƒ}> ~  ~|  \n~|  ~|  ~|B† B‡|" B€€€|" B€€€ðƒ}>  ~  \r~| \n ~|  ~|  ~|B† B‡|" B€€€|"B€€€ðƒ}> \n ~  ~|  ~|  ~|  ~|  &¬"~|B† B‡|" B€€€|"B€€€àƒ}>  B€€€ðƒ}  B€€€`ƒ} B‡|"B€€€|" Bˆ|>  B€€€àƒ}>  \n~  ~| ~|  ~|  ~|B† B‡|" B€€€|"B€€€ðƒ}>$  B€€€ðƒ}  B€€€`ƒ} B‡B~|"B€€€|"Bˆ|>  B€€€àƒ}> ­  j!@@ ("Aq\r AqE\r (" j!@@@ k"Aˆ¾(G@ ( ! AÿM@  ("G\rAô½Aô½(A~ Avwq6  (! G@ (" 6  6  (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6  ("AqAG\rAü½ 6  A~q6 Ar6  6  6  6  A! E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½Aø½(A~ wq6  @ (F@  6   6 E\r  6 ("@  6  6 ("E\r  6  6 @@@@ ("AqE@AŒ¾( F@AŒ¾ 6A€¾A€¾( j"6 Ar6 Aˆ¾(G\rAü½A6Aˆ¾A6 Aˆ¾(" F@Aˆ¾ 6Aü½Aü½( j"6 Ar6 j 6 Axq j! ( ! AÿM@ (" F@Aô½Aô½(A~ Avwq6   6  6  (!  G@ (" 6  6  (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6   A~q6 Ar6 j 6  A! E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½Aø½(A~ wq6  @  (F@  6   6 E\r  6 ("@  6  6 ("E\r  6  6 Ar6 j 6 G\rAü½ 6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6   ( !  6  6 6 6 A! AÿÿÿM@ A& Avg"kvAq AtrA>s! 6 B7 AtA¤Àj!@@Aø½("A t"qE@Aø½  r6  6 6  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6 6 6 6 (" 6  6 A6 6 6 ‰#AÀk"$ A(j" 4 B7T A6P B7\\ B7d B7l A6t Aðj"  AÀj" A° A!  (ðAk"6ð  (ÀAj6À (ô! (ø!\n (ü! (€! („!\r (ˆ! (Œ! (! (”! Aj"        j   Aàj"      („" k6T  (€" k6P  (|" k6L  (x" k6H  (t" \rk6D  (p" k6@  (l" k6<  (h" \nk68  (d" k64  (`" k60  A0j\r@ A E@   j6$   j6   j6   j6  \r j6  j6  j6  \n j6  j6   j6 A j" \r A E\r Aà  A j \r - Aq -AvF@ A (k6 A ($k6$ A ( k6 A (k6 A (k6 A (k6 A (k6 A ( k6 A (k6 A (k6 Aøj A! AÀj$  þ A€K@A0  A€O@Að½A06A  AA A jAxq A I"AÌj"E\r Ak!@ A?qE@ !  Ak"("Axq A?jA@qAk"AÀA  kAMj" k"k! AqE@ (!  6   j6    (AqrAr6  j" (Ar6   (AqrAr6  j" (Ar6   @ ("AqE\r Axq" AjM\r   AqrAr6  j"  k"Ar6  j" (Ar6   Aj "E@A0 6A A€  A„·(  Aü¶( -~ ­ ­B †„"BZ Aj  B}  ZA    ­ ­B †„  Z    ­ ­B †„  K   ­ ­B †„  t  ­ ­B †„  Ì   ­ ­B †„ Ar    ­ ­B †„ þ    ­ ­B †„ ü    ­ ­B †„ ý   ­ ­B †„ â   ­ ­B †„ ­ ­B †„ Ð   ­ ­B †„A€·(   ­ ­B †„ Aø¶(   ­ ­B †„ Aô¶(   ­ ­B †„  ã   ­ ­B †„C   ­ ­B †„    ­ ­B †„  ` -~ ­ ­B †„"BZ Aj  B}  YA    ­ ­B †„  Y    ­ ­B †„  J   ­ ­B †„   ð   ­ ­B †„   ñ   ­ ­B †„#   ­ ­B †„ Û   ­ ­B †„ Ü ²#Ak" 6  6A! A;@  / ( j- ( j-sr;  / Ar" ( j- ( j-sr; Aj"AÀG\r  /;  /Ak; A€Â/Av /Avs; /Ak á#Ak"$ A6 Aj"  A  )7 AÐj"BÀ Aj 0 Aj" Aü¶( AÀ   A€·( Aà¶B }BƒA€·(   A€·( Aà¶B }BƒA€·(  7H  AÈj"BA€·(  7H  BA€·(  A0j"A„·( A€  5! A@ E\r @ §"@ A ü A!    Aj AjèA! AjA  Aj$  ¬#A€k" $ A6 Aj"\n  A )7 A@k"BÀ Aj" \n0 A€j" Aü¶( AÀ   A€·( Aà¶B }BƒA€·(   \nè  A€·( Aà¶B }BƒA€·( 78  A8j"BA€·( 78  BA€·(  A„·( A€ @ B7 AjA  A€j$A J#A k"$A!@ BT\r   =\r Aj  B}  Y! A  A j$  O#A k"$ BðÿÿÿT@A!   =E@ Aj    J! A  A j$   è#A k"$ -: -: -: -: -: -: -: -: -: - : -\n:\n - : - : -\r:\r -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -!  -Aøq: AÀr  Aÿq:  ; ,A! -Aÿq - - - - - - - - - - - - - - - - - -\r - - -\n - - - - - - - - - -AsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrAkA€qE@AA A ! A j$  Ž#AÀk"$A!@ gE\r H\r  2\r hE\r -: -: -: -: -: -: -: -: -: - : -\n:\n - : - : -\r:\r -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -!  -Aøq: AÀr  Aÿq: A j" Ž , -Aÿq - - - - - - - - - - - - - - - - - -\r - - -\n - - - - - - - - - -AsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrAkA€q\rAA A ! AÀj$  A€€€ I#Ak" $A! Aj"\nB7 \nA6A \n        » \nW Aj$ å#A0k"$ @ Aæ @ -A$G\r -A7G\r -A$G\r -6"\nE\r A j AjU"E\r Aj U"E\r  k Aj!@A E\r  Ak"j" -A$G\r "@  k   " j"A-j" AæK\r K\r    B \nA€k­† ( ( AjA »\r @   ü\n  j"A$: AsAæj! Aj!A!@@ ! "AK@ !  Aj"AA k" AO" j! Aj"\n j-!A!A E\r  \nj-At r!A Aj"F\r  \nj-At r!A ! E\r  A?qA€j-: AF\r  AvA?qA€j-:  j Aj F\r AF\r  A vA?qA€j-: Aj E\r AF\r  AvA€j-: Aj "k! \r AjA A! E\r  AæjO\r A: ! A0j$  ½ (q! A!@ j A j"\n j-  j-s: Ar"j  \nj-  j-s: Aj! Aj" G\r E\r j A j j-  j-s: A jAÀ A  Aðj$A „~#Aðk"$ BR@  )7  )7  )7  )7 )! B7h  7`@ BÀZ@@ Aàj AF  -hAj":h  -i Avj":i  -j Avj":j  -k Avj":k  -l Avj":l  -m Avj":m  -n Avj":n  -o Avj:o A@k! B@|"B?V\r P\r A! A j Aàj AF §"Aq!A! BZ@ As"?k6  - 2s"6x   ,s" k6H   /s"6t   .s" k6D   1s"6p   0s" k6@   5s"6l   4s" k6<   7s" 6h  6s" k68   :s"6d  \n 8s"\n k64  >s" 6`   q!A!@ j A j" j-  j-s: Ar"j  j-  j-s: Aj! Aj" G\r E\r j A j j-  j-s: A jAÀ A  Aðj$A ‹~#Aðk"$ ­ ­B †„"\nBR@  )7  )7  )7  )7 )! B7h  7`@ \nBÀZ@@ Aàj AD  -hAj":h  -i Avj":i  -j Avj":j  -k Avj":k  -l Avj":l  -m Avj":m  -n Avj":n  -o Avj:o A@k! \nB@|"\nB?V\r \nP\r A! A j Aàj AD \n§"Aq!A! \nBZ@ Aq!A!@ j A j" j-  j-s: Ar"j  j-  j-s: Aj! Aj" G\r E\r j A j j-  j-s: A jAÀ A  Aðj$A ‹~#Aðk"$ ­ ­B †„"\nBR@  )7  )7  )7  )7 )! B7h  7`@ \nBÀZ@@ Aàj AE  -hAj":h  -i Avj":i  -j Avj":j  -k Avj":k  -l Avj":l  -m Avj":m  -n Avj":n  -o Avj:o A@k! \nB@|"\nB?V\r \nP\r A! A j Aàj AE \n§"Aq!A! \nBZ@ AE@ A€j"AAA  B    B    Aàj"A A j    Î! )X7 )P7 )H7 )@7 A  A  A $    ­ ­B †„   Í d~ ­ ­B †„!#A@j"$@ A j  @A!  A! A€¶ A jA\r     Z! A  A@k$    ­ ­B †„   Î .~ ­ ­B †„"BðÿÿÿZ@ Aj    K d~ ­ ­B †„!#A@j"$@ A j  @A!  A! A€¶ A jA\r     K! A  A@k$  x~@#Ak"$ ­ ­B †„"B€€€€T@ BR@ §!@ A: jA¸· AjA: Aj" G\r Aj$  AÂ\nA¨ AÆAÄ N#A k"$   A(  ­ ­B †„ Aj ­ ­B †„ A”·( A  A j$  ­ ­B †„ B A”·( (  ­ ­B †„  ­ ­B †„ A”·(  ­ ­B †„  A·(   ­ ­B †„  b   ­ ­B †„   8  ­ ­B †„  0   ­ ­B †„  c \n mA  ­ ­B †„  ­ ­B †„ 9  ­ ­B †„  O ª~ ­ ­B †„!\n ­ ­B †„! #Ak"$ @ B7 @ Aÿ: A!\r@@ \nBT\r \nB}" BïÿÿÿZ\r A j"BÀ A j" 0 Aàj" Aü¶( AÀ   A€·( A³B }BƒA€·( B7X B7P B7H B7@ B78 B70 B7( B7  -:  BÀ A 8 - !  -:  BÀA€·(  Aj" A€·( A³ \nB}BƒA€·(  7  Aj"BA€·(  \nB/|7  BA€·(  A„·( A€   §jA1@ A    A 8 -$ -s:$ -% -s:% -& -s:& -\' -s:\' -( -s:( -) -s:) -* -s:* -+ -s:+ ó@ AqE@ AE\r  )7ø  )7ð  )7è  )7à  )$7€ Aàj" B( b )ø7 )ð7 )è7 )à7 )€!\n A6 \n7$ @  7 A!\r E\r  : Aj$ \r   Û~ ­ ­B †„!\n ­ ­B †„! #A€k"$ @ B7 \nBïÿÿÿT@ Aj"BÀ A j" 0 AÐj" Aü¶( AÀ   A€·( A³B }BƒA€·( B7 B7H B7@ B78 B70 B7( B7 B7  :  BÀ A 8  BÀA€·(  -: Aj"  \n A 8   \nA€·( A³ \nBƒA€·(  7  Aj"BA€·(  \nB@}7  BA€·(   \n§j"A„·( A€ -$ -s:$ -% -s:% -& -s:& -\' -s:\' -( -s:( -) -s:) -* -s:* -+ -s:+ ó@ AqE@ AE\r  )7è  )7à  )7Ø  )7Ð  )$7ð AÐj" B(  b )è7 )à7 )Ø7 )Ð7 )ð! A6 7$ @  \nB|7 A€j$A   1~ ­ ­B †„"BðÿÿÿZ@ Aj    JA  nA P~ ­ ­B †„! Aœ A\n@E@  A[  A’ A @E@  A[  Að½A6A N~ ­ ­B †„! Aœ A\n@E@  Ï  A’ A @E@  Õ  Að½A6A Q~ ­ ­B †„! ­ ­B †„! @@@ Ak   Ð     Ö s~ ­ ­B †„! ­ ­B †„! ­ ­B †„!\r@@@ \nAk   \r A×    \r AÑ  Að½A6A   ­ ­B †„Ï - ­ ­B †„  ­ ­B †„  ­ ­B †„ \nÑ  ­ ­B †„ A[  ­ ­B †„ A[   ­ ­B †„Õ ´ (Aÿÿÿq6 (AvAƒþÿq6 (AvAÿÿq6 ( AvAÿÿÀq6 ( ! B7 B7 A6$ AvAÿÿ?q6 (6( (6, (60 (! A:P B78 64A   ­ ­B †„ ­ ­B †„ Ö - ­ ­B †„  ­ ­B †„  ­ ­B †„ \n× l#Aðk"$ B7( A ³)7 A¨³)7 A°³)7 A¸³)7 Aj"  ­ ­B †„!  * Aðj$A   ­ ­B †„! ä#"AÀkA@q"$  (Aÿÿÿq6@  (AvAƒþÿq6D  (AvAÿÿq6H  ( AvAÿÿÀq6L ( ! B7T B7\\ A6d  AvAÿÿ?q6P  (6h  (6l  (6p (! A: B7x  6t A@k"  n  A0j"m 5 $    ­ ­B †„    Ý x~#" AÀkA@q"$A! ­ ­B †„" B0Z@ A@k"AAA  B    B    A j"A A j B }   ³! $  ¿~ ­ ­B †„! #" A€kA@q"$A! A@k" A j">E@ A€j"AAA  B    B    Aàj"A A j    ´! )X7 )P7 )H7 )@7 A  A  A $    ­ ­B †„   ³ H~ ­ ­B †„!#A k"$A!   =E@     Y! A  A j$    ­ ­B †„   ´ .~ ­ ­B †„"BðÿÿÿZ@ Aj    J H~ ­ ­B †„!#A k"$A!   =E@     J! A  A j$  }#A k"$ A@k" A +   ­ ­B †„  Aàj" Aj" BÀ   AÀ °!  AÀ1 A j$A  Fr ]#Aàk"$  A +   ­ ­B †„  A j" AÐj" BÀ   AÀ Aàj$A y#Ak"$ A j" A -   ­ ­B †„!  Aðj"* Aˆj" B !  * A  :  -^: -?:  -_: AÀA! $   ž#"! A€kA@q"$  "@A! Aàj"  E@ A€j"AAAÀ  B   A   B    B    A j"AÀ A€  - :  " -@:  -!: -A:  -": -B:  -#: -C:  -$: -D:  -%: -E:  -&: -F:  -\': -G:  -(: -H:  -): -I:  -*:\n -J:\n  -+: -K:  -,: -L:  --:\r -M:\r  -.: -N:  -/: -O:  -0: -P:  -1: -Q:  -2: -R:  -3: -S:  -4: -T:  -5: -U:  -6: -V:  -7: -W:  -8: -X:  -9: -Y:  -:: -Z:  -;: -[:  -<: -\\:  -=: -]:  ->: -^:  -?: -_: AÀA! $    A B AA` AŒ·( \n   A£ A¶ Aû AÎ #A€k"$ A j" A +   #  AÀj.  )Ø7  )Ð7  )È7  )À7  \n  u AÄ W#A@j"$@ A j  @A!  A! Aж A jA(\r    ½! A  A@k$  W#A@j"$@ A j  @A!  A! Aж A jA(\r    ¾! A  A@k$  \n       Æ \r   Ç  È Ê  Ë A® :~ ) ! )(! )0! )87 7 7 7A :~ )! )! )! )7 7 7 7A ‹@@@ BÀT\r B@|"B¿ÿÿÿV\r  A@k"  ArE\r E\r §"E\r A ü A! E\r B7A @  7 A! E\r §"E\r  ü\n  ˆ#Ak"$ A@k! §"@   ü\n A! Aj   As@ )BÀR@ @ B7 A@k"@ A ü A!  E\r  B@}7 Aj$      AsA m#A@j"$  B C  -Aøq:  -A?qAÀr: )7 )7 )7 )7 AÀ A@k$A ç\n\'~#A€k"$A!@ H\r Aàj" ‘\r hE\rA! A (¬"k6$ A (¨"k6 A (¤" k6 A ( "k6 A (œ"\nk6 A (˜"k6 A (”" k6 A ("k6 A (Œ" k6 A (ˆ"k6  3  ("\r¬" \nAt¬""~ 4" ¬"~| ("¬" ¬"~| ( "¬" At¬"#~| ("¬" ¬"~| ("¬"$ At¬"%~| ("¬". Aj¬"~| ("Al¬" At¬"&~| ( "Al¬" ¬"~| ($"Al¬" At¬"\'~|  ~  \n¬"(~|  ¬")~|  ~|  ¬"*~|  $~| Al¬" ¬"+~|  ~|  ¬",~|  ~|  #~  ~|  ~|  %~|  ~| Al¬"- &~|  ~|  \'~|  ~|  "~|"0B€€€|"1B‡|"2B€€€|"3B‡|" B€€€|"!B€€€àƒ}>H   %~  ~|  ~| Al¬" &~| Al¬" ~| \' -~|  ~|  "~|  ~|  #~|  ~  *~| Al¬"/ +~|  ~| ,~|  -~|  (~|  ~|  )~|  ~| \rAl¬ &~  ~|  /~|  \'~|  ~| " -~|  ~|  #~|  ~|  %~|"/B€€€|"4B‡|"5B€€€|"6B‡|" B€€€|"7B€€€àƒ}>8   ~  ,~|  (~|  ~|  )~|  $~| * .~| ¬" ~|  +~|  ~| !B‡|"! !B€€€|"!B€€€ðƒ}>L   ~  )~|  *~|  ~| +~|  -~|  ,~|  ~|  (~|  ~| 7B‡|" B€€€|"B€€€ðƒ}><   \'~  ~|  ~|  "~|  ~| # $~|  .~|  %~| ¬" ~|  &~| !B‡|" B€€€|"B€€€àƒ}>P  2 3B€€€ðƒ} 0 1B€€€`ƒ} B‡|"B€€€|"Bˆ|>D   B€€€àƒ}>@   ~  +~|  ,~|  ~|  (~|  $~| ) .~|  ~|  *~| ¬ ~| B‡|" B€€€|"B€€€ðƒ}>T  5 6B€€€ðƒ} / 4B€€€`ƒ} B‡B~|"B€€€|"Bˆ|>4   B€€€àƒ}>0 A0j\r A€j$  A‚ 4#A k"$A!   E@ A€¶ A! A j$  A„ A€€€€ A€€€À A A’ Ï~A!@ AÀK\r AÁk"A@I\r@ A E@ AÿqA¿K@~ E@BŸØùÙ‘ڂ›!Bхšïúϔ‡Ñ  )BŸØùÙ‘ڂ›…! )Bхšïúϔ‡Ñ… !\n~ E@BùÂø›‘£³ðÛ! Bëú†Ú¿µöÁ  )BùÂø›‘£³ðۅ! )Bëú†Ú¿µöÁ… ! A@kAA¥ü 78 70 7( \n7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­Bˆ’÷•ÿÌù„ê…7A   E\r  #A€k"$@ AÁkAÿqA¿M\r E\r AÁkAÿqA¿M\r~ E@BŸØùÙ‘ڂ›!Bхšïúϔ‡Ñ  )BŸØùÙ‘ڂ›…! )Bхšïúϔ‡Ñ… !\n~ E@BùÂø›‘£³ðÛ! Bëú†Ú¿µöÁ  )BùÂø›‘£³ðۅ! )Bëú†Ú¿µöÁ… ! A@kAA¥ü 78 70 7( \n7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­ ­B†„Bˆ’÷•ÿÌù„ê…7 AA€ü @   ü\n Aàj A€ü\n A€6à A€ A€j$A   \r A!  = AyqAG@ An"A}lj"AjA AqA Aq AtjAj £ @@@@@@@@ @ \rA!A!@  j-" AßqA7kAÿq" Aöÿj AðÿjsAv"\r A0s" AöÿjAv"rAÿqE\r  \nM\r \rq qr! @ AÿqE@ At!  \nj  r: \nAj!\n As! Aj" G\r !  A E\r  @@@@@  j-" AßqA7kAÿq"Aöÿj AðÿjsAv" A0s"\rAöÿjAv"rAÿqE@ Aÿq\r A!  ?E\r Aj" !  K\r  \nM\r  q \r qr" AÿqE\r \nj  r: As! \nAj!\n  @  j-" AßqA7kAÿq" Aöÿj AðÿjsAv"\r A0s"AöÿjAv"rAÿqE@  ?E\r  Aj"K\r   \nM\r \rq  qr At!Aÿ!    K!  A!  A! Aj" I\r  Að½AÄ6A! AÿqE\r Að½A6A! Ak!A!\n  \nA !\n Ak! \r  G\r     j6   Að½A6A @  \n6 @ AþÿÿÿK\r  AtM\rA! @ Atj"  j-"Aq"At AöÿjA€²qjA€®jAv:  Av" AöÿjAvAÙqjA×j: Aj" G\r AtA jA:   Aà? ­~#A€k"$ A: Aà?M@ A O@ ­! A !@ ! A0j" A - @  jA kB   A0j"     AjB   jB  -Aj: ! A j" M\r Aq"@ A0j" A - @  jA kB   A0j"  ­   AjB   Aj"B @ j  ü\n AjA  A0jAÐA  Að½A6A A€j$ 8#AÐk"$   -   ­   B A AÐj$A  B AA  ­ \n  - An A A4 •~#A0k"$  )7  )7  )7  )7  )$7  B( A j b )7 )7 )7 )7 ) ! A6 7$ A0j$ -~  A A6 )! B7, 7$A 3~ A  A A6 )! B7, 7$A à  ß  á â ã ä  å "#A@j"$ AÀ ˆ A@k$ ˆA e#A k"$A!@ A€j" :\r Aàj" :\r   A j"  Q AÀj" R GA! A j$  e#A k"$A!@ A€j" :\r Aàj" :\r   A j"   AÀj" R GA! A j$  #A k"$  : A j$E !#A k"$ A  ‰ A j$ ‰A s#A k"$A!@ A€j" 2\r IE\r Aàj" 2\r IE\r   A j"  Q AÀj" R ,A! A j$  s#A k"$A!@ A€j" 2\r IE\r Aàj" 2\r IE\r   A j"   AÀj" R ,A! A j$  @#A k"$@ gE\r H\r  2\r IE\r hAG! A j$  AÀÿ º~#Aðk"$ A: AÀÿM@ AÀO@ ­! AÀ!@ ! AÐj" AÀ+ @  jA@jBÀ# AÐj"  #  AjB#  j.  -Aj: ! A@k" M\r A?q"@ AÐj" AÀ+ @  jA@jBÀ# AÐj"  ­#  AjB#  Aj". @ j  ü\n AjAÀ AÐjA A  Að½A6A Aðj$ AÀ 8#A k"$   +   ­#  . A A j$A  . AA  ­# ¥#Ak"A6 A!  AkK  Ak"j!A!A!A!@  ( "A  k-" A€sAk Ak AkqqAvAq"k qr6  r!  r! Aj" G\r  ( k6 AÿqAkA &@AŒÂ("E\r ("E\r !   ­A ¬ 0 Ú#Ak"$@@ E@A!    Ak"qE@  As"q  As!   pk " O\r   j"M@A!  @ Aj6  j!A! A:A!@ k" - -q  sAkAv"A€qr:  - r: Aj" G\r Aj$   M#Ak"$ AO@A k p!@ A:A¸· AjA" I\r  p! Aj$  (#Ak"$ A:A¸· AjA Aj$ AÁ Ç#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (!  60  6,  (64  (68  (6<   d AÀ A@k$A ½#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (!  70  6,  (68  (6<   d AÀ A@k$A Ø#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (! A60  6,  (64  (68  (6< §"@ A ü  d AÀ A@k$A Î#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (! B70  6,  (68  (6< §"@ A ü  d AÀ A@k$A %A„Â(AçAðÁAA„ÂA6A §~#A k" $   A°jïA! AK@A !@  j A°jî "A j" M\r  Ar"O@@  j"(! (!\r (! ( ! )ˆ7ˆ )€7€ )ð7ð )ø7ø )€7à )ˆ7è Aj" Aðj Aàj )˜7ˆ )7€ )à7Ð )è7Ø )ð7À )ø7È  AÐj AÀj )˜7ø )7ð )Ð7° )Ø7¸ )à7  )è7¨  A°j A j )˜7è )7à )À7 )È7˜ )Ð7€ )Ø7ˆ  Aj A€j )˜7Ø )7Ð )°7ð )¸7ø )À7à )È7è  Aðj Aàj )˜7È )7À )€7Ð )ˆ7Ø )°7À )¸7È  AÐj AÀj  (œs6¼ (˜s6¸ \r (”s6´  (s6° "Aj" M\r Aq" @A k"@ A j rA ü @ A j  j ü\n ( ! (¤! (¨! (¬! )ˆ"!7ˆ )€""7€ )ð7° )ø7¸ "7  !7¨ Aj"\r A°j A j )˜7ˆ )7€ )à7 )è7˜ )ð7€ )ø7ˆ \r Aj A€j )˜7ø )7ð )Ð7p )Ø7x )à7` )è7h \r Aðj Aàj )˜7è )7à )À7P )È7X )Ð7@ )Ø7H \r AÐj A@k )˜7Ø )7Ð )°70 )¸78 )À7 )È7( \r A0j A j )˜7È )7À )€7 )ˆ7 )°7 )¸7 \r Aj   (œs6¼  (˜s6¸  (”s6´ (s6° @ E@A!A! AI\r@ Aj  j A°jê "Aj" M\r  A!A! AI\r@ j  j A°jê "Aj" M\r Aq"@ j Aj !  j! A°j! #Aðk"\n$ \nAÀj j!A k"E"E@ A ü E"E@ \nAÀj  ü\n (! A@k"(! (P! ( ! (0! (! (D! (T! ($! (4! (! (H! (X! ((!\r (8! \n(À! \n(Ä! \n(È! \n (, (buflen <= BLAKE2B_BLOCKBYTES$argon2i$v=$argon2id$v=curve25519ed25519hmacsha512256curve25519xsalsa20poly1305sodium_bin2base64siphash24sha512xsalsa201.0.20$argon2i$$argon2id$$7$¶xYÿ…rÓ½nÿ\nj)À˜èyÿ¼< ÿ™qÎÿ·âþ´\rHÿ° þÓɆÿži5` ½§×ûÿŸL€þjeáÿü’ ®A\r \'Yñ²þ\nå¦ÿ{Ý*þÔR€0Ñówy@ÿ2ãœÿnÅgAÀ\r À…;Œ½ñ$ÿø%Ã`Ü7·L>ÿÃB=2L¤á¤LÿL=£ÿu>Q‘@ÿvA¢sÖÿŠ.|æôÿ\nŠ4¸ôL)¾ôÿ{ªzÿbDyՓVeÿ¡g›ŒYCÿïå¾C µÆð‰þîE¼ÿC—î*lÿåUq2D‡ÿj 2gÿP¨#˜ÿ¨¹8YèÿeÒü)úG̪Oÿ.ïÿPMï½ÖKÿù&PLÿ¾UuV䪜ØÐÃϤÿ–BLÿ¯áÿPbLÛòÆ¢r.ژ›+ñþ› hÿ3»¥¯BT ÷:#A5þEì¿-†õ£{Ý nÿ4¥ºÖGé°`òï69YŠSTÿˆ d\\Žxþh|¾µ±>ÿú)U˜‚*`üö——?þï…> 8œ-§½ÿŽ…³ƒVÓ»³–þúªÿÒ£N%4—cMîœÕÿÕÀÑI.TA)6ÎOɃ’þªoÿ±!2þ«&ËÿN÷tÑݙ…€²:,É\';½ü1åÒu»uµ³¸rÛ0^“õ)8}\rÌþô­w,Ý þTêù Æì~êÿ/c¨þªâ™ÿf³ØâzÿzB™þ¶õ†ãäÖ9ëÿØ­8ÿµçÒw€ÿ_ˆÿn~3©·ÿ‚bþE°^ÿtãÙò‘ÿÊ­i\'ÿ.¯Eä/:ÿ×àEþÏ8Eÿþ‹ÿÏÔÿÊ~ÿ_Õ`ÿ °!ÈÏÿñ*€þ#!Àÿøåāxûg—ÿ4pÿŒ8Bÿ(âõÿÙF%þ¬Ö ÿHC†’ÀÖÿ,&pD¸KÿÎZû•덵ª:tôï\\f­bé‰`1Ë›”” ÿÓz "†ÿÛ̈†)ÿàS+þU÷mþ©ˆ0îwÛÿç­ÕÎþþºÿ~ o*Ho4ìþ`?“¿þÍNÀÿjí»ÛL¯ó»þiY­UY¢ó”vÑþ!ž ‹£.ÿ]F(l*ŽþoüŽÿ›ß3å§ÿIü›ÿ^t ÿ˜ Úÿœî%ÿ³êÏÿųÿš¤áÄh\n#þÑÔòÿaýÞþ¸eåÞ¤ˆ‡ÿόþ’aóÀþÉT!ÿo\nNÿ“Q²ÿ¡î×ÿ!5×ÿ)µÐÿ狝³ËÝÿÿ¹q½â¬ÿqBÖÿÊ>-ÿf@ÿN®þ…uDÿA  AÀ °&蕏²\'°EÃô‰òï˜ðÕ߬ÓÆ39±8ˆmSüÇjp=MØOº< v\rg* Sú,9ÌÆNÇýw’¬zìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÓõ\\cX֜÷¢ÞùÞAÿ ¬ñý@] j?9ÓWþ ÒºX¼tþAØÿÈ=ØB”ÿû\\$²áÿ…;Œ½ñ$ÿø%Ã`Ü7·L>ÿÃB=2L¤á¤LÿL=£ÿu>Q‘@ÿvA¢sÖÿŠ.|æôÿ\nŠ4¸ôL)¾ôÿ{ªzÿbDyՓVeÿ¡g›ŒYCÿïå¾C µÆð‰þîE¼ÿêq<ÿ%ÿ9ÿE²¶þ€Ð³v}þÖÿñ2MÿUËÅÿӇúÿ0dÿ»Õ´þXiSўsb®<þ«7nÿÙµÿ¼ª’œfþWÖ®ÿrz›é,ªïÖìê¯Û1j=ÿBÐÿjnÿQêÿ×kÀÿC—î*lÿåUq2D‡ÿj 2gÿP¨#˜ÿ¨¹8YèÿeÒü)úG̪Oÿ.ïÿPMï½ÖKÿù&PLÿ¾UuV䪜ØÐÃϤÿ–BLÿ¯áÿPbLÛòÆ¢r.ژ›+ñþ› hÿ² üþdnÔ§éï£ÿ—e’\nÿþžFþGùäX2D: ÿ¿hBÿÀ2Uÿ³Šÿ&úÉsP ƒæq}X“ZDÇýLžÿvqúþBK.æÚ+åxº”D+ˆ|î»kÅÿT5öÿ3tþÿ3»¥¯BT ÷:#A5þEì¿-†õ£{Ý nÿ4¥ºÖGé°`òï69YŠSTÿˆ d\\Žxþh|¾µ±>ÿú)U˜‚*`üö——?þï…> 8œ-§½ÿŽ…³ƒVÓ»³–þúªÿDqÿÞº;ÿBñEHVœlþ7§Ym4Ûþ\r°ÿÄ,jÿï•Gÿ¤Œ}ÿŸ­3)ç‘>!Šo]¹SEs.a—ÿä1ÙâqKêþÁ™ ÿ¶0`ÿ\r€ÃùþEÁ;„%Qþ}j<Öð©¤ãBÒ£N%4—cMîœÕÿÕÀÑI.TA)6ÎOɃ’þªoÿ±!2þ«&ËÿN÷tÑݙ…€²:,É\';½ü1åÒu»uµ³¸rÛ0^“õ)8}\rÌþô­w,Ý þTêù Æì~êÿ>݁YÖÿ7‹þD¿ÿ̲#ÃÙ/3Î&ö¥ÎþžW$Ù4’ÿ}{×ÿU<ÿ«\rÚõXþü#<7Ö ÿ…e8à þ“@ê‘¢rv}øüúe^Äÿƍâþ3*¶‡ þm¬ÒÿÅìÂñAš0œ/ÿ™C7ÿÚ¥"þJ´³ÚBGXzcÔµÛÿ\\*çÿïšõM·ÿ^QªÕØ«]G4^ø—¡þÅÑBÿ®ôþ¢0·1=ðþ¶]ÃÇäÈÿ‰-íÿl”ZOíÿ\'?Mÿ5RÏŽvÿeè\\CÈXÿ!¨Šÿ•áHÑÿ,õ¨ÜíÿÓiþî݀PõþoþÞ_¾ß ñ’LÔÿlÍhÿ?u™E0#äoÀ!ÁÿpÖ¾þs˜—fX3JøâǏþÌ¢eÿÐa½õhæöÿ”EnX4þâµYÿÐ/Zþr¡Pÿ!tø³˜WÿE±Xîÿ: qME;y4ÿ˜îS4Áç\'éÿÇ"ŠÞD­[9òþÜÒÿÀöþ—#»Ãì¥o]ÎÔ÷…š…Ñÿ›ç\n@N&zùdaÿ>[ùø…MÅ?¨þt\nR¸ìqþÔËÂÿ=düþ$Êÿw[™ÿOgg«þí×oÿØ5Eïð•Ýÿ&áÞèÿ´þvR…ÿ9ѱ‹è…ž°.þÂs.X÷åg¿ÝÞ¯þ•ë,—äþÚigŽUҕ¾ÿÕA^þu†àÿRÆuÝÜ£e$År%h¬¦þ ¶QH¼ÿa¼ÿE\nǓ‘ÿ sAÖ¯ÿÙ­ÑP¦÷åþ§·|ÿZÌþ¯;ðÿ )øl(3ÿ±Ãþ–ú~Š[Ax<ÞÿõÁïÖ½ÿ€Pš¢MÜkêÍJÿ6¦gÿtH ä^/ÿÈÿ#ÖYÿ=°ŒÿSâ£ÿK‚¬€&_‰˜ÿ×|ŸO]”RþÂûÿ(ÊLÿû~àc>þÏáÿ`D̺ÿƒçÿ*€þ4Û=þfËH ÿº¤Õzw…ò‘Ðüèÿ[Õ¶ÿúþù×J¥o« ßå{"\\‚ÿM›-Ëÿ;àNˆ÷ly Oú½ÿ`ãüþ&ñ>>®}ÿ›o]ÿ\næÎaÅ(ÿ19þAú\rû–ÿÜmÒÿ®¦þ,½ë#“ÿ%÷ÿHÿgkÿ÷Z5,*ð;?XN$q§´¾GÁÿǞ¤ÿ:¬M! A?™M!ÿ¬þfäÝÿWþ’)VÿŠÌïþlÿ»ò‡ÒÐD-þI`>Q<ÿª$ÿù#Õm6ÿ#áÿê=8ÿ:ُ|Xì~BÑ&·ÿ"îÿ®‘f_ÓÄ™þ.Tèÿu"’çúJÿ†d\\»ÃÿªÆpx*ÑFCQ¨d©­ k#u>`;ÿQ E‡ï¾ÿÜü£Ü:ÿ‰‰¼ÿSfm`LêÞÒÿ¹®Í<žÕÿ\rñÖ¬Œ]hòÀœû+uáQžèÚâËé—ÿu+ÿò/ÿ!‰û,þõÿ·Ö}þ(y•ºžÕÿYãEXþˇáɮ˓G¸y)þ^NàÖðþ$´û‡ç£ŠÔÒùtþX»1þ>ÿŸLÓÖ3RmuäþgßËÿKüšGÜÿ\r[¨`ÿµ¶…ú37êêÔþ¯?ž\'ð4ž½$ÿÕ(U ´÷ÿfTaÿEޔ‹zÿÜÕëèËÿy9“ãš5“HáR†0þS<ÿ‘H©"gïÆé/tÿ¸j ÿ·S$°æ"gHÛ¢†õ*ž •`þ¥,ÊïHþז*B$„ׯV®VÿŜÿ1è‡þg¶Rý€°™²zõú\n첉j„()2˜ÿ|i&æ¿K+ª,ƒÿ,\rÿíÿ›ŸmdÿpµÿhÜl7Ӄc Õÿ˜—‘ÿîŸa›!lQg>m"ÿú›´ GÃÿ&F‘Ÿ_õEåeˆðOàNnyÿø¨|»€÷“ëþO „F: µ£ÿO‰…ÿ%ª ÿóUÿ°ç×ÿ̖¤ÿï×\'ÿ.Wœþ£Xÿ¬"èB,fÿ6)þìcWÿ){©4r+u†(›†çÏ[þ#„&ÿf}þ$ã…ÿvqÿ\r|˜`JX’Îÿ§¿Üþ¢Xÿ¶du4Q.j EPÉÑö¬ 0àÓXtâŸzb‚Aìêáâ ÿÏâ{YÖ;p‡XZôËÿ1 &lºYpe.ÌÿÌ-þOÿÝÿ3Iÿ*eÿñÊ ãi2ìO4ÅÿhÊдeÅNÿbMË)¹ñ#Á|#›ÿÏ5À }£ùž¹ÿƒ0]oÿ=yçEÈ$ÿ¹0¹ÿoîÿ\'2ÿc×£ÿWÔÿ¤“ÿ€#lßnÿÂL²Je´ó/0®+ÿR­ý6rÀÿ(7[×l°ÿ 8àéLÑbÊþò},Á]þ˱‡°pGÕÿÎ;°CÕþ*7Ðÿ×næ³§ÿ6ü¾Ý̶þ³žAÿQÂڟªßà ÿ&Åb¨¤%X¤ºn`$†êòåúyòþpÿ/^ ïÿQ†™þÖý¨ÿC|àõ_J,þmÜÿ²YYü$LÆ.ÿLMo†êˆÿ\'^¹HêÿFD‡ÿçfþM猧/:”avÿá¦Îÿn²Öÿ´ƒ¢á\rÚNÿr™!bh̯ru§ÎKÊÄS:@CŠ/oÄ÷€ÿ‰ààþžpϚdÿ†%kƀOÿћÿ£þ¹þ<óÛpþÙAÈ\rtþ{<Äÿà;¸þòYÄ{Kþ•ÎEþ0çtßÿÑ AÈPb%¸þ”?"‹ðAÿِ„ÿ8&-þÇxÒl±¦ÿ ÞÜ~wþ¥k ÿRÜøñ¯ˆÿ©ŠT ‰NÿâvPÿ4„ÿ?`‹ÿ˜ú\'¼›è3–þ(èÿðå ÿ‰¯ÿKIaÚÔ ‡¢k¹Õùkÿ(òFÛȝ\rCRPÿÄùÿ‘•2H’^L”ûAÀ¸ÔÉÿ{é¢÷­H¢WÛþ~†YŸ þ¦iIäqx·ÿB£mԏ ÿŸç¨ÿ€Z9:þY4\nÿý£‘Òÿ\nU.µgˆ þ~¼Ñÿ"#o×ÛÿÔ ÖþevèŅÿß§mÿíPVÿF‹^žÁ¿›3ÿ¾sN‡Ïÿù\nµ}é_¬\rþªÕ¡ÿ\'ìŠÿ_]Wÿ¾€_}Φ–ŸãžÿΞxÿ*€e²xœmƒÚ,þ÷¨ÎÿÔppäÿZ%ÅÞlþÏSÿ Zóÿóô¬XsÿÍtz¿æÁ´d Ù%`ÿšNœëêÿβ²ÿ•Àû¶ú‡öi|Ámÿҕÿ©ª`nÿu 2{(ÿÁ½c"ã 0PFþÓ3ì-zõþ,®­%éÿžA«zE×ÿZPÿƒj`þãr‡Í1wþ°>@ÿR3ÿñóÿ‚\rþ€Ùóÿ¢þZvñöÆöÿ7vÿȟ£ŒkyU¡vÿ&•œ/î ¦¦Kbµÿ2JB/‹áŸLŽÿî¸ Ï5ÿ·Àº« ®ÿ¿LÝ÷ªÛ¬2þÙ éË~Dÿ·\\0§·A1þ?þªÿ;àþ0?ÿN‚þ(Ãú„pþ#ːh©¨Ïýÿh(&þ^äX΀ÿÔ7zÿßêßÅýµµ‘fvì™$ÿÔÙHÿ&þŠ>>˜ŒæÜcÿÔÿ”Éçô{ þ«Ò3:%ÿÿÿô·‘þò¦J„yØ)_Ãrþ…—ÿœâçÿ÷Mÿö”sþá\\QÿÞPöþª{YÿJǍÿŠˆFÿ]K\\ݓ1þ4~âå|. µÍ@4ƒþ—žÔƒ@NΫ拿ýnþg÷§@((*¥ñÿ;Käþ|ó½ÿÄ\\²ÿ‚ŒVÿY8“ÆÿËøžþ¢ ¬â‚*ÿ§ÿ$$ÿ0X¤þ¨ªÜbGÖ[ÐOŸLɦ*ÖÿEÿÿ€}ÿ¾Œ’SÚÿ×îHz5½t¥ÿTBÿÖÐÿÕn…è,žçE¢@Èþ[:h¶:»þùäˆË†LþcÝéKþÖþPEš@˜øþìˆÊÿi™þ•¯#ÿ|yéºúÆþ„勉P®ÿ¥}DÊ”þëïø‡¸ve^ÿzHFþE‚’ÞøEvÿR×þ¼Jÿå§ÂþuBÿAê8þÕœ—;]þ-ÿº~¤ÿ ïrcÛ4ÿc`¦þ>¾~ÿlÞ¨Kâ®æâÇÿ(kþŠšÇÿ^ßâÿ«&£±þ-vÿÞѾQÿv{è\rÕeÿ{7{þö¥2cLÿŒÖ ÿaACÿ ®VN@÷` ‡CB7óÿ“Ì`ÿ!ÿb3S™ÕÐÿ¸6ÿÚ 1Cöþ•Hÿ\rH*OÖ*&‹ÿ•»¤„õT¸þxÆhÿ~Ú`8uêÿ\rÖþD/\nÿ§š„þ˜&ÆB²YÿÈ.«ÿ\rcSÿÒ»ýÿª-*ŠÑ|Ö¢ æœf$pþ“C4×{ÿé«6ÿb‰>÷Ú\'ÿçÚì÷¿ÒT¥°\\ÿÔ^ÿJãX(™ƓÿÎCõþðÚÿ=Õÿa·jÃèëþ_VšÑ0ÍþvÑñÿðxßÕŸ£“ÿ\rÚ]UDþFPÿ½ŒRaþÿcc¿ÿ„T…ÿkÚtÿpz.i  ?ÿDÞ\'Øý\\±iÍÿ•ÉÃ*á ÿ(¢s Q¥ÚÛ´þ’üÿ’Ïá´‡`£p± Ûÿ… Áþ+N2Aqy;Ùÿn^p¬o`$U{G–ÿÐI¼À §Õõ" æ\\¢Ž\'ÿ×ZbaY^OÓZð_Ü~f°â$àþ#çèsUS‚ÒIõÿ/rÿDAÅ;H>ÿ·…­þ]yvÿ;±QÿêE­ÿ̀±Üô3ôÑIÞMÿ£`þ–•ÓžþË6‹¡à;mÿÞ*-ÿВfÿ쎻2Íõÿ\nJYþ0OŽÞL‚ÿ¦?ì \rÿ1¸ô»qfÚeý™9¶þ –*ƒíñ8ŒD[¤¬ÿN‘ºþC4ÍÛρms6:øxÿ³ÿÁìBÿÿÿýÀ0ÿEÙÖÿ@e’ß}#ÿëI³ÿù§âá¯\na¢:jp«T¬ÿ…Œ²ÿ†õŽaZ}ÿºË¹ÿßMÿÀ\\jÆsÿ٘ø«²xÿä†5°6Áúû5Õ\nd"Çj—ôþ¬àWÿíÿýUÿ\'tÿ¬hdûFÿÔЊÿýÓú°1¥L{ÿ%Ú ÿ\\‡\n~rÿFàÿ÷ùD<ñÒ½ÿÃÙ»—q—\\®ç>²ÿÛ·á!ÿ͵P9¸øÿC´ÿZ{]ÿ\'¢ÿ`ø4ÿTBŒ"äÿЦn¼›š¾ÆÿÖP;ÿHâÇÙùè¡G•¾ÉÙ¯_þq“CÿŠÇÿ̶SÎæ›ÿºÌ<\n}Uÿè`ÿÿY÷ÿÕþ¯èÁQ+œþ E“øÆ1†<#vöÿ1Xþþäºÿ¶ApÛÿ~4ÿ½51ÿp&7ÿâe£þЅ=ÿ‰E®¾v‘ÿ!sÓ¢a€ÿ¸þt¨ÿøŠ—ÿbôðºv‚røëÿi­È |Gÿ^$¤¯A’ÿîñªþÊÆÅäGŠþ-ömÿÂ4ž…»°SüšþY½ÝÿªIü”:}$D3þ*E±ÿ¨LVÿ&dÌÿ&5#¯aáîýÿQQ‡ÒÿþëIkÏsRˆTcþψd¤ePÐMÿ„Ïíÿÿ!¦nœ_Uÿ%¹o–j#ÿ¦—LrW‡ÿŸÂ@ zÿèeþ­wbšGÜþ¿95ÿ¨è ÿà cÿڜ¥—™£Ù\r”ÅqY•¡þÏi„ãÿ6æ^ÿ…­Ìÿ\\·ÿXüþf!ZŸaµÚ›ÿðrwjÖ5ÿ¥¾s˜[áÿXj,ÿÐ=q—4|¿œÿn6ì¦ÿ\'ÏåǼä¼þdëöÚ·kÁÿΠ_Lï“Ï¡u3¦ÿ4u\nþI8ãÿ˜Áá„^ˆÿe¿Ñ kåÿÆ+´dÒvrC™ÿXÿYš\\ÜxŒÿrÏÿüsúÿ"ÎHŠ…ÿ²|WKaå\\þðCƒÿv{ãþ’xhÿ‘Õÿ»FÿÛw6­-–”øSHË驎k8÷ù&-òPÿég`RFÉoQ\'ÿ¡·NÿÂê!ÿDãŒþØÎtFëÿhO¤æ]þևœš»òþ¼ƒÿ$m®Ÿpñn•$¥Ú¦².I]+ þø½íf›É]Ãÿñ‹ýÿobÿlA£þ›O¾ÿI®Áþö(0ÿkX þÊaUÿýÌÿqòBn ÂþкQ<¼h§ÿ|¦aþ҅Ž8ò‰þ)o‚o—:oՍÿ·¬ñÿ&Äÿ¹{ÿ. öõiw¡ÿÎ-ÿÊJÿS|sԍSÑþ‹èÿ¬6­þ2÷„ֽՐ¸ißþøÿ“ðÿ¼H36¼´þÜ´ÿS £½óÿ:ÑÂÿWI<j1õùÜ­§v Ãÿ~ínŸ%ÿ;R/´»V¼”Ðd%…ÿpÁ¼œÿTjÿ…áÊìoÿ(e¬¬1þ36Jÿû¹¸ÿ]›àÿ´ùà沒H96þ²>¸wÍH¹ïýÿ=ÚÄC8ÿê «.ÛäÐlêÿ?èÿ¥5Ç…äÿ4ÍkJîŒÿ–œÛþגּÿû½ßþ ŽÓÿÚŠñÄP$bþêÇ=íÜÿö9%ŽŽÿ>+î_þÙÿÕð\'Ü®ÿšÍ0þ\rÀÿô"6þŒ›ðµþ›Á<¦€ÿ$‘8ÿ–ðÛx3‘R™*Œì’k\\ø½\n?ˆòÓ\'Ê¡­ºÿÒÌïþ)Ñ¢ÿ¶þŸÿ¬t4ÃgÞþÍE;5)Ú0ÂPÒòҼϻ¡¡þ؈áqú¸?ßbþM¨¢;5¯É\nÿ‹à“ÁšÿÔ½ þÈ®ÿ2…q^³Z­¶‡^±q+Y×ÿˆüjÿ{†SþõBÿR1\'Üàa±M;Y=›Ë«Üÿ\\N‹‘!µÿ©7–³‹ìxþb{cÿ¨ÉÂþ.êÖ¿…1ÿc©w¾»#s-ÿùƒHp{ÿÖ1µþ¦é"\\ÅfþýäÍÿ;É*b.Û%#ÿ©Ã&^|Áœ+ß_H…þxοzÅïÿ±»Oÿþ.ú§¾TËq¦ÿù½þHÊÿÐGIÿÏH\nÒQLÿXÐÀÿ~ókÿîxÿÇyêÿ‰ ;ÿ$Ü{ÿ”³<þð Ba$&ÿs]ÿ`gçÿŞ;À¤ðÊÊ9ÿ®0YM›*L×ô—é0Qï4þã‚%ÿøt]|„v­þÀëSÿn¯çû¶ù]þT¸€Lµ>¯€ºd5ˆþmâÝé:cJ †\r 47ÿYŒ¯";T¥wÿàâêÿH¦ÿ{sÿÖöúGÙܹÔ#Lÿ&}¯½aÒrî,ÿ)¼©þ-ºšQ\\„ ÁyÐbÿ\rQ,ÿ˜RG:ÿÐr¿þ2&“šØÃe<ú×ÿé„ëÿg¯Ž\\nþîñ-ÿ™Ùïa¨/ÿùU¯>ÿ9þ6Þç~¦-uþ½`ÿäL2Èô^ƘxD"Eÿ A þeZ§ÅxÿD6¹ÿ)Ú¼q¨0Xi½R ÿ¹]¤äðíÿB¶5«Å\\ÿk éÇxÿN1\nÿmªiÿZÿôqÿJ: >ÜöÿyšÈþÒ²ÿ~9+úÿeo/Vñÿ=F–ÿ5IÿžÑVŠíJ¤_¼Ž<þ¢tøÿ»¯ —ÑoAþˆ\'ÿXl1ÿƒGÿÝ×þhi]ÿìþ‡ÓÿnÔIåéC§þÃÐÿ„Ýÿ3ÙZCë2ÿßҏ³5‚éjÆÙ­Üÿpåÿ¯š]þGËöÿ0B…ÿˆæÿÝqþëoÕªx_þûÝ-‚žþi^Ùÿò4´þÕD-ÿh&ôžL¡È`ÿÏ5\rÿ»C”ª6øw¢²ÿS **À’Ÿ£ÿ·èoMåÿG5L"öˆ/ÿÛ\'¶ÿ\\àÉŽÿE¶ñÿ£võ mjªµ÷ÿN/îÿTÒ°ÿÕk‹\'& H–H‚EÍM›þŽ…Go¬þâ*;ÿ³×!€ñêü\r¸OnIÿö½ªÏÚJšEÿŠö1ÿ› d}JiÿZU=ÿ#å±ÿ>}Áÿ™V¼IxÔÑ{öþ‡Ñ&ÿ—:,\\EÖÿ Xÿü™¦ÿýÏpÿ°{þ …ÿá¿>]F™µ*h¿àÿÈȌÿùê%•9Ã8Ðÿþ‚Fÿ ­ðÿÜÇndsÿ„åùäéßÿ%ØÑþ²±Ñÿ·-¥þàar‰a¨ÿáÞ¬¥\r1ÒëÌÿüþF —è¾4þSø]ÿ>×M¯¯³ÿ 2By0Ð?©ÑÿÒÈà»,I¢R °ÿLÁÿ;§+š¾¾¼èëËÿêmÿ6AŸ{„ÿ÷d½›ß˜Å!›;,ÿ–]ðWÿ_GϧUÿ¼˜tÿ\n‰Ã]6bað¨ÿ”¼†k—Lý«Z„À’6àB6þæºåÿ\'¶Ä”û‚ÿAƒlþ€ ©1§þÇþ”ÿûƒ»þÿUR>²:ÿþ„¤Õ\'†ü’þ%5Qÿ›†Rͧîÿ^-´ÿ„(¡þop6KÙ³æÝë^¿ÿó0ʑËÿ\'v*ÿuýþÞ+û26©êPDДËóþ‘‡þü¹bÿ&#HÿÓ$Ü(Y¨@ÅþÞïÿS×þ´Ÿi:sºtjÿå÷ÛÿvÁÊ®·¦¡HÉk“þíˆJéæjio¨@àåf—¯ÿÂîäÿþúÔ»íyCû`Å ·_ÌÍYŠ@Ý%ÿßÿ²0ÓÿñÈZÿ§Ñ`ÿ9‚Ý.rÈÿ=¸B7¶þn¶!«¾èÿr^Ý/çþÿpSv×ÿ­(þÀÁÿî’ÿ«Ávÿeê5þƒÔpYÀkеÙÿç•èŒì~ Çÿ Oµþ“¶Êÿm¶ÿ1ÔáJ£Ë¯é”p3ÁÁ ÿ‡ù–ã‚ÌÛòÍîÐuÿôpå"%P¼ÿ&-ÎþðZáÿ/ÿ*àLºó§ „ÿ3}‹‡ñÛ¬å…ÿöÖ2ç Ïÿ¿~S´£ªÿõ8²¤ÓÿÊb9vÿƒYþ!3ó•[ÿý4#©Cþ1Xÿ³$ÿ¥Œ·:½—XK©BBeÇÿØÇyÄÿOËþðâQÿ^\nÿSÁðÿÌÁƒÿ^VÚ(3ÁÑò±f¹÷žmt&‡[߯•ÜBÿV<è`%ÿáz¢×»¨ÿž.8«¢èðez 3 ÿ5îÿÙèþ}©”\rèf” %¥aäƒ)Þóÿþ<íjq;„½\\piÐÕ0T³ÿ»yçþØmÿ¢ÝkþIïÃÿú9ÿ•‡Yÿ¹s£ÿpú9»ÿ¡`¤/ó ûþCê¸ÿ)¡¯`ÿ ¬4þ°·ÿÆÁU|y‰ÿ—2rÿÜË<ÿÏï&kÿ7î^þF˜^ÕÜMxEÿU¤¾ÿËêQ&1%þ=|‰N1þ¨÷0_¤üi©‡ýä†@¦KQIÿÏÒ\nêj–ÿ^"ZÿþŸ9þ܅c‹“´þ¹)9ÿ½aLA»ßÿà¬%ÿ">_çðMj~þ@˜[b›âû5ÿêÓÿËÞÿ¤°Ýþç³zÍ$†ÿ}F—þaäü¬þ0ZÑÿ–àRT†ñÄ.gqêÿ.eyþ(|úÿ‡-òþ ù¨ÿŒlƒÿ£«2­ÇÿXގÿÈ_žŽÀ£ÿu‡o|ì AþD&Aÿã®þôõ&ð2Ðÿ¡?ú<Ñïz#!æþŸqjÿäÍ`‰Ò®þ´ÔÿYbš"X‹§¢pAnÅñ%©B8ƒÿ\nÉSþ…ý»ÿ±p-þÄûÄú—ÿîèÖÿ–ÑÍðvGLSìc[*úƒ`@ÿvÞ#qÖËÿzw¸ÿB$Ì@ù’Y‹†>‡hée¼T1ùÐÖKÿςMÿs¯ë«‰ÿ¯‘º7õ‡ÿšVµd:öÿmÇ<ÿR̆ÿ×1æŒåÀÿÞÁûÿQˆÿ³•¢ÿ\'ÿ_Kþ¿QÞñQZÿk1Éÿôӝތ•ÿAÛ8þ½öZÿ²;0Û4b"×»ÿ¯©\\O¡ÿìÈ“êåáŨë35ýx®Å¨ÿÊu«£ÎrUZÿ)\nÿÂcA7Øþ¢’t2ÎÔÿ@’ÿžžƒd¥‚ÿ¬ÿ}5 ÿÁ1 ÿµ®É‡Éÿd•ÛbO*cþ`0ÿÅùSþh•OÿënˆþR€,ÿA)$þXÓ\n»y»b†Ç«¼³þÒ îÿB{‚þ4ê=0qþVxÿw²õWÉòÑÊrU”¡gÃ01«ÿŠC‚¶Izþ”‚Óåš ›žTi=±Â ÿ¦YV6S»ù(uÿm×ÿ5’,?/³ÂØþTˆˆ±\rÿHóºÿu}ÿÓ:Óÿ]OßZXõÿ‹ÑoÿFÞ/\nöOÿÆÙ²ãá N~³ÿ>+~g”#¥þõð”=3ŽQІ‰sÿÓwìÿŸõøÿ†ˆÿæ‹: ¤þrUÿ1¦¶ÿFTU¶.5] ¦¡ÿ7¢²ÿ-¸¼’,þ©Z1x²ñ{ÿñǽB2ÿƏeþ½ó‡ÿþKaWvûší6œ«’ÏÿƒÄöÿˆ@q—è9ðÚs1=ÿ@Iü©ÿ(„\nZÉÁÿüyðºÎ)+Æa‘d·ÌØPþ¬–AùåÄþh{IÿMh`þ‚´h{9ÜÊåÿfùÓVèÿ¶NÑïá¤j\r ÿxIÿ†CéSþµ·ìp0@ƒÿñØóÿAÁâÎñdþd†¦ÿíÊÅ7\rQ |fÿ(ä±vµ砆ÿw»ÊŽ<ÿ€&½ÿ¦É–Ïx6¸¬ òÌþ…Bæ"&¸pP 3¥þ¿ó7:I’þ›§Íÿdh˜ÿÅþÏÿ­÷î\nÊï—ò^;\'ÿðfÿ\n\\šÿåTÛÿ¡PÐZÌðÛ®ÿžf‘5²Lÿ4l¨SÞkÓ$mv:8í ÇªÑ‰G/V ÆòÔ0ˆ\\¬ºæ—i`¿åŠP¿þð؂ÿb+þ¨Ä1ý[Iy=’\'?hÿ¸¥pþ~ëbPÕbÿ{ÿœXÒ¸bÿ¯{ÿfSåÜAt–úÿ\\ŽÜÿ"÷BÿÌá³þ—Q—G(ìÿŠ?>Oðÿ·¹µv2?ãÀ{c:2à›ÿáßþÜàMÿ,{€¯øÔȖ;·ÿ“a–̵ý%G‘UwšÈº€ùÿS|W¨3õ|—çÿÐðÅ|¾¹0:öéè}bÿ\rþÿõ±‚ÿlŽ#«}òþŒ "ÿ¥¡¢ÎÍe÷"d‘9\'F9vÌËÿò¢¥ôÆtâ€o™ÿŒ6¶ƒÿO@ þ^0qŠ2þÁÿ÷ÅC7hÍ_ÿ0%B7œ?@RJÿÈ5GþïC}àÞ߉]ÿàÊÿ ܄Æ&ëfV<+Qˆé$þÏò”¤¢?3.àÿr0Oÿ ¯âÞÁÿ/ èÿÿ]iþ*æŠRÐ+ô\'&ÿbÐÿ@•¶ÿúÑ»<þ1Úÿ©tÍÿwxœt“ÿ„5mÿ\r\nÊnS§Û‰ÿ‚ÿ2§ÿ<Ÿ/ÿ€þ^½¦DSßזZ¨AãS3ÿÍ«Bÿ6»<˜f-ÿwšáð÷ˆdŲÿ‹GßÿÌR)Î*ÿœÀÝÿØ{ôÿÚÚ¹ÿ»ºïÿü¬ ÿÃ4®µþ»dsÿÓN°ÿÁ“ÕhÿZÉ\nÿP{B!ºcþÎ\nåê5ҊÜþG7§HáVv¾¼þÁe«ù¬ÿ^ž·þ]lÿ°]LÿIcOÿJ@þö.Acñþö—fÿ,5Ðþ;fꚯ¤ÿXò o&ÿ¶¾ÿs°þ©<zíñZL?>JxÿzÃnw²Þò҂!.þœ()§’p1£oÿy°ëLÏÿÆ)ëÕU$Ö1\\mÿÈþ¨ìÑ\'|ìÕZ$¸ÿCUªÿ&#þƒ|Dÿï›#ÿ6ɤÄuÿ1Íà~qu¶ËŸß‡M°æ°ÿ¾å×ÿc%µÿ3Šÿ½Yÿ10¥þ˜-÷ªlÞPÊEgþ́ÿ´ü>þÒ[ÿ’nþÿÛ¢ßüÕ;!ÎôÓ0k Ðp;ÑmMØþ"¹ÿöc8ÿ³‹ÿ¹2ÿTYJúbÿá*ÈÿÀÙÍÿÒ§c„_+æ9þ Ëÿc¼?ÿwÁûþPi6èµ½·EpÿЫ¥ÿ/m´ÿ{S¥’¢4ÿš ÿ—ãZÿ’‰aþ=é)ÿ^*7ÿl¤ì˜Dþ\nŒƒÿ\njOþóž‰C²Bþ±{Æÿ>"ÅX*ÿ•_±ÿ˜Æÿ•þqÿáZ£ÿ}Ù÷à€BxþÀ ÿ2ÝÍ1ÔFéÿ¤Ñ Ý4Ûþ¬àôÿ^8Îò³ÿ[¤æ.Šÿ½æÜ9/=ÿo ±[˜æbaW~ÆY‘ÿ§OkùM éæÿ–Vþ< Á—%$þ¹–óÿäÔS¬—´É©›ô<êŽëCÚ<ÀqKtóÏÿA¬›QœÿPH!þçmÿŽkþ}„ÿ°;ÿ–É:ΩÉÐyâ(¬ÿ–=^ÿ89œÿ<‘ÿ-l•ÿÿÑUþÀ Òcb]þ˜—á¹Üë,ÿ ¬þGÿ\r@]þ8Ʊ>ø¶ñ¦e”ÿNQ…ÿÞ×¼©ÿèa1p<ÿÙåûwlŠ\'{þƒ1ë„T‘‚æ”ÿJ»õ6ÿ¹ÛñÂäÿñÊfiqʛëO ²ÿœïȔ=s÷Òÿ1݇:½#. QAÿ4ž¹ÿ}t.ÿJŒ\rÿÒ\\¬þ“GÙàýþsl´ÿ‘:0þÛ±ÿœÿ<š“òý†W5Kå0ÃÞÿ¯2ÿœÒxÿÐ#Þÿø³\neÿÂøÿžÌeÿhþÅÿO>²¬e`’ûÿA\nœ‰¥ÿtçò×#ÿ+¡O;•öûB°È!ÿPnŽÿáä8Bÿ{/‘þ„¤C®¬ýrWaWúÜT`[Èÿ%};Av¡4ñÿí¬ÿ°¿ÿÿA‚þß¾æeýçÿ’#múM1{Z›V ÿÚÕAo]<]©ÿ¶ºþý‰öÿÕ0þLîÿø\\Fÿcà‹¸ ÿ¤Ð̓ÆWÖǂÖ_ݕÞ&«þÅnÕ+sŒþ×±v`4Buží@¶ÿ.?®ÿž_¾ÿáͱÿ+Žÿ¬cÔÿô»“3™ÿätþeÏö–ÿ†ç}†âMAbì‚!ÿn>Elÿq‘Sþ¡çÿƒµ<Ùѱÿå”Ôþƒ¸u±»ÿ°fP2T—ÿ}6ÿ…ÿ³‹àè"uªÿ§ü«ÿIÎþú#HOìÜåÿ)Ê­ÿcLîÿÆàÿlÆÃÿ$`ìž;ÿjdWnâãêޚ]wÿJp¤ÿC[ÿ‘!ÿf։ÿ¯ægþ£ö¦]÷tþ§àÿÜ9«ÎT{äÿxww “´/áÿhȹþ¥rMNÔ-š±ÿÄyþR¶Z¾ “Å_ï˜ÿ ëGV’wÿ¬†Ö<ƒÄ¡á‚xþ_È3içÒÿ: ”ÿ+¨Ýÿ|íŽÆÓ2þ.õg¤øT˜FÐÿ´u±FO¹óJ •œÏÅÄ¡õ5ï]öþ‹ð1ÿÄX$ÿ¢&{€È®Lgÿ­©"þØ«ÿr3ˆäÂn–8þjöŸ¸Oÿ–Mðÿ›P¢5©ÿ—VD^\\nþbu•ÿùMæÿý\nŒÖ|\\þ#vëY095¦¸=ÿ³ÿÂÖø=þ;nöyQþ¦äj@ÿEè†ÿòÜ5þ.ÜUq•÷ÿa³gÿ¾ ‡Ñ¶_4ªÎÿzÈÌÿ¨d’<•þF<(z4±ÿöÓeÿ®í3x­~ïœÿ½ËĀXÿé…âÿ}­ÿÉl2{d;ÿþ£ݔµÿֈ9þÞ´‰ÿÏX6ÿ!ûÿCÖ4ÒÐdQª^‘(5àoçþ#ôÿâÇÃþîæÙÙ¤þ©ÝÚ.¢ÇÏ£ÿls¢`»ÿvçãê³ÿ"½Ôþô»ù¾\rP‚Y߅­ ÞÆÿBJ§Ø]ÿ›¨ÆB‘Df.¬ZšØ€Kÿ (3ž|ð1ìʰÿ—|Àÿ&Á¾_¶=£“|ÿÿ¥3ÿ(þ×`NV‘Úþ$ÊÿV o)Èÿíla9>,u¸-ñt˜Üÿ¥¼úƒ<,}ÿAÜûÿK2¸5Z€ÿçPÂÿˆ»ÿ-:¡ÿG“"®ù þ#ïD±ÿsn:î¾±Wõ¦ÿ¾1÷ÿ’S¸ÿ­\'ÿ’×hŽßx•È›ÿÔϑµÙ­ Wÿÿ#µwß¡Èß^ÿFºÿÀCUÿ2©˜{ÿ8ó³þDˆ\'Œ¼þýÐÿÈs‡+¬åÿœh»—û§4‡—™H“Åkþ”žÿîÎ~™‰ÿX˜ÅþD§üŸ¥ÿïN6ÿ?7ÿ&Þ^í· ÿÎÌÒ\'öþJç‡l³suvt„üÿ‘¡iCR%âÿîâäÿÌցþ¢{dÿ¹yê-lçB8ÿ„ˆ€¬àBþ¯¼æßâþòÛE¸wR¢8r{¢gUÿ1ïcþœ‡×oÿ§þ\'Ä֐&Où¨}›aœÿ4Ûÿ–,•¥ÿ(·ÄMéÿvÒÿª‡æÿÖwÆéð#ý4ÿuf0ÿ̚ÿ³ˆ±ÿ•‚YÿüŸF<k´¾<ÿ8¶;ÿnG6ÿƁÿ•àWÿߘÿжÿúœÍì-ÐÿO”òeFÑgN®e¬ÿ˜ˆí¿ÂˆqP}˜›–5ÿÄtõïrIþRÿ|}êÿ(4¿*Ҟÿ›„¥²*@\\(ÿ$UMÿ²äv‰B`þsâBnðEþ—oP§®ìÿãlkÿ¼òAÿ·Qÿ9εÿ/"µÿÕðžGK_œ(ÿfÒQ«Çäÿš")ã¯KïÊå_LÀ1u{Wãá‚}>?ÿÆ«þ$\rþ‘ºÎ”ÿôÿ#¦–Û\\äÔ\\Æ<þ>…ÈÿÉ);}îmÿ´£îŒzR Xÿŝ/ÿ™^9X¶T¡U²’|¦¦ÿÐߜ¶ò›y¹Sœ®þšvÿºSèß:yÿX#}ÿª•þ¤ ‚ÿ›Ä¡`ˆ#¢%û.òÿÙ¼9®âÎé9»ˆþ{½ ÿÉuÿº$ÌçØPNi†ÿ”ËDQ}þø¥Èÿ֐‡—7¦ÿ&ë[.šßþ–ÿ#™´ÿ}°+bÿØzæÿé  9¹ þðqÿ þ[lmÆË“(†äÿ|º(ÿrb„þ¦„cE, òîÿ¸5;„fÿ4 óþ“ßÈÿ{S³þ‡Éÿ%8—<ãÿZIœˬ»P—/ÿ^‰çÿ$¿;ÿáѵÿJ×Õþv³ÿ™6Á2çhHŒãšÿ¶âþ`á\\ÿsªþúNøK­ÿ5Yÿ´vH­@ή…ß¹>…ÿÖ bÅЫ§ôÿçµ–Ú¹÷©a¥‹÷ÿ/x•gø3²¦{„ ¡ÿ=®+ÃE/¿",N9ê4ÿ(ÿö^’Sä€?ƒ³»ÿMœ›ÿwV¤ªÐ’ÿЅšÿ”›:ÿ¢xèþü՛ñ\r*^2ƒ³ªpŒS—ÿ7wTŒ#ïÿ™-Cì¯\'6—gÿž*AÿÄï‡þV5˕a/þØ#ÿFFg$Zÿ(­¸0\r£ÛÙÿQÿݪlþéÐ]dÉùþV$#ÿњãÉûÿ½§þd9\r€)ÅdK–Ìëÿ‘®;xø•ÿU7árÒ5þÇÌw÷J?ûCh—‡‚POY7ÿuæÿ`Õ‘Eñx•ó_ÿr*ƒHš5ÿI>mÄf˜) Ìÿz& ú\n‘Ï}”öôÞÿ) UpÕ~¢ùVGÆÿQ b\'ÿÌG-Ko‰ê;ç 0_ÿÌrĵÿ3ñ§þ]mŽh-ë µÿ4p¤LþÊÿ®¢=ë“ÿ+@¹þé}ÙóX§þJ1œÌB|Ö{&Ýv’pìrb±—YÇWÅp¹•¡,`¥ø³ÿ¼ÛØþ(>\róŽåãÎÿ¬Ê#ÿu°áÿRn&*õÿSa1«\nòwxè=Ôð“ÿs8ÿ‘ïþÊûÿùõÿcu︳ÿöí3ÿ%ï‰ÿ¦p¦ÿQ¼!ÿ¹úŽÿ6»­ÐpÉö+äh¸XÿÔ4Äÿ3ulÿþu›.[ÿWÿWãÌSSŸLãŸÕ—lu³þ‰ÑR&Ÿ\ns…Éß¶œnÄ]ÿ9<é§iÿšÅ¤`"ºÿ“…%Üc¾§Tÿ‘«ÂÅûþ_N…ÿüøóÿá]ƒÿ»†ÄÿؙªvžþŒvVž-Ó)ÿ“dþqtLÿÓlg0ÁfE3_ÿk€‰«éZ|j¡¶¯Lìȍ¬ÿ£:hé´4ÿðýÿ¢qþÿ&ïŠþ4.¦ñe!þƒºœoÐ>ÿ|^ ÿ¬þp®8ÿ¼cÿCŠû}:€œ˜®ÿ² ÷ÿüTžRÅþ¬ÈSÿ%\'.jϧ½"ƒ²ÎÕ¡âÒH3iÿa-»ÿN¸ßÿ°ûO Vÿt%²RMÕRTÿâeÔ¯XÇÿõ^÷¬vmÿ¦¹¾ƒµxWþ]ÿ†ðIÿ õÿ‹¢gÿ³bþÙÌp“ßxÿ5\n󦌖}PÈÿmÛÿ[Úÿüü/þmœtÿs1ÌWÓÿ”ÊÙÿUùÿõ†LY©ÿò-æ;b¬ÿrI„þN›1ÿž~T1¯+ÿ¶Tÿg#hÁmÿCݚɬþ¢X¥ÿ}›åÿšÜgï\\ÜmÿÊÆ^Ž$6,ëâžÿªûÖÿ¹M aJòÛ£•ÿð#vÿßrXþÀÇj%ÿÉ¡vÿaYcà:gÿeǓþÞÿ\n—\nO‹²ÿxòÊÛÕ>}#ÿlÿæ!SÿQ-Øà>ÖÙ}b™™ÿ³°jþƒ]Šÿm>$ÿ²y ÿxüFÜø%ÌXg€Üûÿìãj1Æÿ<8kcrîÜÌ^I»Yš"NÙ¥ÿÃùÿ æýÿ͇õüÿT͆p%ž ç[íÿ¿ªÌÿ˜ÞmÀ1Á¦’ÿèµÿiŽ4ÿgýÈ¥ÃÙÿ4½ÿ{› þW‚6ÿNx=ÿ8))}ÿW¨õÖ¥FÔ©ÿÛÓÂþH]¤ÿÅ!gÿ+Žƒá¬ôiDDáˆT\rÿ‚9(þ‹M8T–56_\r±þ_sºuvÿô¦ñÿ º‡²jËÿaÚ]+ý-¤˜‹vï`þë™Óÿ¨nÿ2ï°r)èÁú5þ oþˆz)ÿalCטÿŒÑÔ*½£Ê*2ÿjj½ÿ¾DÙÿé:uåÜóÅ%x6þœ†ÿ$=«þ¥ˆdÿÔèZ®\nØÆAÿ @tqsÿøgç}ÿ Å¸#ßIùÿ{.þ‡8%ÿ­\råw¡"ÿõ=IÍ}p‰h†Ùöÿ펏AŸfÿl¤¾Ûu­ÿ"%xþÈEP|ÚþJ ÿºšÇÿGÇühQŸÈ\'Ó=Àî[”Ù ;[Õÿ Q·ÿæzÿrˑw´BÿHŠ´à•jwRhÿЌ+b ¶ÿÍe†ÿe&_ŦÿËñ“>Бÿ…öû©\r÷¸Žþ$ÈÿXÍß[4ÿºäÒ÷êøÿæEþ°º‡ÿîÍ4‹O+°Ùþ óCòoé,# ÿãrQG ÿ&i¿u2ÿQO?DAÿ$nÿMñÿâ-ûŽÎx{Ñþîÿ€~ÿ[Þ×ÿ¢¿VðI‡¹Qþ,ñ£ÔÛÒÿp¢›Ïev¨H8ÿÄ4H¬òÿ~ÿ’`;ÿ¢y˜þŒ_ÃþÈþR–¢w+‘þ̬Nÿ¦àŸhíÿõ~Ðÿâ;ÕuÙŘHíÜþZçÿ¼Ô@¸L@Ϭ¯Ðþ¯J%ŠÓþ”}Â\nYQ¨Ëeÿ+ÕÑëõ6#âÿ ~Fâ}^þœuÿ9øpæ0@ÿ¤\\¦àÖæÿ$x7+ÿûõjb¥Jkjþ56ÿZ²–x{ÿôYrú=ÿþ™RM9îZ_ßæì4/þg”¤ÿyÏ$¹ÿKJ» e.0ÿïÒÿMìÿoMÌÿ=HaÿÇÙûÿ*×̅‘Éÿ9æ’ëdƒI#þlÆÿ¶OÒÿRgˆöl°"<ÿJrþ¨ªNÿïÿ•)¨:yO³†ÿçy‡ÿ®Ñbÿóz¾«¦ÍÔt0lBÿ¢Þ¶wÕ\'ùÿþßäÿ·¥Æ…¾0|Ðmÿw¯Uÿ Ñy0«½ÿÃG†ˆÛ3ÿ¶[þ1ŸH#võÿpºãÿ;‰‰,£rg<þՖ¢\nqÿÂhH܃tÿ²O\\ËúÕþ]Á½ÿ‚ÿ"þÔ¼—ˆÿeSÿÔΦåîIÿ—Jÿ¨Wכ¼…ÿ¦IðO…ÿ²ÓQÿËH£þÁ¨¥¤ÇþÿÌAH[¦JfÿÈ*ÿÂqãÿBÐåØdÿï\né>ÿ{\n²$®ÿwÛÇ-£¾¨*¦9Æÿ~¥çûldÿ=åyÿ:vŠLÏ\r"pþY¨%Ðiÿ#É×ÿ(jeþïr(gâþönÿ?§:„ðŽžXÿIžÿ^Y’æ6’-­O©sº÷T@ƒCàýÿϽ@šQ-¸6ÿWÔàÿ`Iÿ!ë4BPÿû®›ÿ³%ê¤]þ]¯ýÆEWÿàj.cÒ>¼rÿ,ꩯ÷ÿm‰ÿå¶\'À¥^þõeÙ¿X`Ä^cÿjî þ5~ó^eÿ.“É||ÿ Ú\r¦0ûíÿ›ú|ÿj”’ÿ¶\rÊ=§Ù˜þ܂-ÿÈæÿ7AWÿ]¿aþrû i\\ύÏ\rþ20ÿº”tÿÓ+á%"¢þ¤Ò*ÿD`ÿ¶Öÿõu‰ÿBÃ2K SþPŒ¤ ¥$änãñZ4Ôß ÿ‹ó9 qKö·¿ÿÕ¿EÿæŽÃÄÿŠ«/ÿ@?j©ÖÿÏ®8XI…ÿ¶…Œ±ÿ“¸5ÿ\nã¡ÿxØôÿIMéî‹;AéFûØ)¸™ÿ Ëp’“ýWem,R…ÿô–5ÿ^˜èÿ;]\'ÿX“ÜÿNQ\r /üÿ rÿ]k\'ÿvÓ¹wÑÿãÛþXiìÿ¢nÿ$¦nÿ[ìÝÿBêtoôþ\né ·þ¿òڜ5þ)­o¥övs[ÿ€T<§ËW\róä±q’ÿªæþü™ÿ‘á+Fçÿzi~þVö”ÿn%šþÑ[D‘>ä¥ÿ7Ýùþ²Ò[S’âþE’º]Òhþ­çº&½zŒÿû\rpÿin]ûHªÀßÿÊá]䙓Çþmªøeöÿ²| ÿ²þfþ7A}Ö´·`“-uþ„¿ù°Ëþˆ·6ÿ’ê±’eVÿ,{!јÀZ)þS}ÿÕ¬Rש\r" ÑdÿTùÅìÿÙºæ1 °ÿovaÿíhëO;\\þEù ÿ#¬JvDÞ|¥ÿ´B#ÿV®ö+Joÿ~Vÿäê[òÕþE,ëÿÜ´#øÿf/\\ÿðÍfÿq櫹ÉÿÂöFÿz»†FÇÿ•–ÿu?gAh{ÿÔ6XS†óÿˆ5g©´±1o6§Ã=×ÿl<*F¹¢ÿ•(ÿö&þ¾w&ÿ=w`¡Ûÿ*Ëݱò¤ÿõŸ\ntÄ]Íþ€³}íöÿ•¢ÙÿW%þŒîÀ Áaâ&\nˆ?ÿåHÒþ&†\\ÿNÚÐh$Tÿ Áÿò¯=ÿ¿©.³““ÿq¾‹þ}¬Küþ×$ÁÿE•ÿnvË]ùЉ@þ&F™tÞ¡J{ÁcOÿv;^ÿ= +’±.“¿ÿ& 3<:bÿoÂMš[ôŒ(­\nûËÑ2þl‚Nä´Z®ú®<)«tcRÿvÁ‹ÿ»­ÆþÚo8¹{Øùž44´]ÿÉ [ÿ8-¦þ„›Ëÿ:èn4ÓYÿý¢ W·‘ˆ,^zõU¼«“\\Æh_®Ýæ4÷÷ëÿ‰®5ÿ#ÌÿGãÖèR 0ãÿªI¸ÿÆûüþ,p"ƒeƒÿH¨»„‡}ÿŠhaÿÿóhTÿ‡Øâÿ‹í¼‰–P8ŒÿV©§ÿÂNÿÜ´ÿ\rÁu‰Ôÿà—1ô¯Ác¯ÿcšÿA>ÿœÒ7ÿòôÿú•žXÙÿÏ†þûè.œûÿ«8¸ÿï3ꎊƒÿþó\nÉÂ?aKÒï¢ÀÈuÖóGÞþ6(èÿL·oþWÿÖOˆÿØÄԄŒþƒý|lÿ×KLÞ7þé¶?D«¿þ4oÞÿ\niMÿPªëXÿ-çy”à=öTý.ÛÿïL!1”þæ%EC†þŽ›^ÓþÕ*ÿä÷þü°\rÿ\'þñôÿÿª-\nþýÞùÞr„ÿ/ÿ´£³T^—ÿYÑRþå4©ÿÕìÖ8äÿ‡w—ÿpÉÁS 5þ—B¢éa[ƒNµx5ÿu_?ÿíu¹¿~ˆÿwé·9a/É»ÿ§¥w-d~bþ‘–_ÿx6˜Ñbhoþ¸”ùëØ.øÊ”ÿ9_òá£é÷èÿG«ÿgô1ÿTg]ÿDyôRà\r)O+ÿùΧÿ×4þÀ ÿ÷o<eJ&ÿ[Tþ\rÿÆç×þôšÈ߉íӄ_@Îÿ>÷ÿéƒy]MÍÌ4þQ½ˆ´ÛŠ^Ì+Œþ¼¯Ûobÿ—?¢ÿÓ2Gþ’5’-Sþ²Rîÿ…TÿâÆ]ÿÉaÿxv#ÿr2çÿ¢åœÿÓ r\'sÿÎԆÅÙ ÿt^þÇ×ÛÿKßùýtµÿè×hÿä‚öÿ¹uVï=íW…ÿ}’‰þ̨ß.¨õšiÜÔ¡ÿkEÿ‰ÚµÿñTÆÿ‚zÓÿ™ÿ¾±v`Y²ÿ0þz`iÿu6èÿ"~iÿÌC¦è4Šÿӓ 6,×þ3ì-¾Dj“á]-þìÿ=¡ÜsÀì‘þo¨©à:?ÿ¤¼RêKàž†ÑDnÙ¦ÙFᦻÁÿXÿ\n͌uÀœ8&|l«×7ÿ_ýԛ‡¨ÿö²™þšDJè=`þi„;!Lǽ°‚ÿ hþKÆfÿéplÜÿræFŒÂ…ÿ9ž¤þ’Pÿ©ÄaU·‚FžÞ;íêÿ`ÿè¯aÿ yøþX#ÂÛ´üþJãÃãI¸n¡ÿ1餀5/RyÿÁ¾:0®uÿ„ (\n†3ÿð °ÿn9’uïevÿ6TL͸ÿ/HÿNpUÿÁ2B]4ÿi† mHÿ:œû#Ì, uþ2kÂD¥ÿon¢žS(þLÖê:ØÍÿ«`“ÿ(ãr°ãñFù·ˆT‹ÿ÷ÿ-@8ÿ¡ô"98iÊS€“Ðg\nÿJŠAÿaPdÿÖ®!ÿ2†Jÿn—‚þoT¬TÇKþø;pÿز ·_îþªÍÜÃå‡bLíÿâ[RÛ\'ÿá¾ÇÙÈyÿQ³ÿŒAβÏWþúü.ÿhYný½žÿÖžÿ õ6ÿ5·\\ÈÂÿ’!qÑÿëj+ÿ§4èåÝ3úÝA“WÿO{ÄAÄßÿL,UñDÊ·ùÿAÔÔÿ !šG;P¯Â;ÿH d ôæÐ8;KþPÂÂÈþ Ÿs„÷o]9ÿ:í †Þ‡ÿz£l{+¾ÿû½ÎþP¶HÿÐöà< ¡Ï&m[ØÓÿˆNnb£hÿPyÿ­²·hÿ3ÿÒÿ>ìþ7àÿr\'ôÀ¼úÿäL5bTQÿ­Ë=þ“27ÿÌë¿4ÅôX+Óþ¿w¼çšBQ¡\\Á úãx{7â¸H…¨\nþ‡œÿ)gÿ0Ê:º•Qÿ¼†ïëµ½þً¼ÿJ0R.Úå½ýû2å ÿӍ¿€ôÿ©çzþV/½ÿ„·ÿ%²–ÿ3‰ýÈNi2‚<„£[þç»ÀOïf¤ÿÀRµgÿð ê{¤ÿ…éÿÊòò<ºõñÇÿàtžþ¿}[ÿàVÏy%çÿã Æÿ™ïÿyèÙþKpR_ 9þ3Öiÿ”ÜaÇb$œÑ þ\nÔ4Ù´7þÔªèÿØTÿú‡cþÎ)•$F6ÄÉÿWtþ뫖£êʇ´Ð_þ{œ]·>K‰ë¶Ìáÿÿ֋Òÿsÿ o4œýûÿ%¥þ ‚Ój5þ*cšÙ=þØ \\ÿÈÅpþ“&Ç$üxþk©M{ŸÿÏKf£¯Ä,ðxº°þ\rbLÿí|ñÿ蒼ÿÈ`àÌ)ÐÈ\rá`ÿ¯œÄ÷Ð~>¸ôþ«QUsž6@-ÿŠr‡GÍã/“ÚçBýÑô­ÿvþ–Ðÿ¹2ÿVpÏÿKq×?’+ÿáþã>ÿÿÖþ-ÍÿWŗþÒR×ÿõø÷ÿ€øFá÷WZxFÕõ\\\r…â/µ\\£iÿ…þè²=ÿæ•ÿ1žäd=þtóûÿMK\\QۓÿL£þþÕöè%˜þa,dÉ%2Ôô9®«·ÿùJp¦œÞÝaÿó]IþûedÿØÙ]ÿþŠ»ÿ޾4ÿ;˱ÿÈ^4sržÿ¥˜h~câÿvôkÈÁZåyXœ ]þ}ñÓÿíÿ¥šÿ¸àÿú˜ÿqM÷«ÿí±Ìÿ4‰‘ÿ¶ràê•\nogɁîŽN4(ÿnÕ¥þ<Ïý>×E`aÿ1-Êxyÿë‹0Æ-"ÿ¶2ƒÒ[ÿ.6€¯{iÿƍNþCôïÿõ6gþN&òÿ\\ùþû®Wÿ‹?lÿ"f"˜Båvþ2c©•v˜²yŸZeæÿwD$ è·7ÿ`ÿ¡)Áÿ?‹Þ³óÿdÿR5‡‰9•cðªÿæäþ1´Rÿ=R+nõÙÇ}=.ý4ÅÛӟÁ7yiþ·©wªÿ˲‹ÿ‡(¶ÿ¬\rÊÿA²”Ï+z5J¡0ãրþV óÿdVõD†ÿ=+˜T^ÿ¾<úþïvèÿֈ%qLkÿ]hdÎÿn–šäg¹Ú12þ‡M‹ÿ¹N¡”ÿaéÿϔ•ÿ ¨[€«ÿþ o÷\'»–ÿŠè•u>Dÿ?ؼÿëê þ9 ÿ ñ©<¿ ƒÿíŸ{ÿ^Å^þtþÿ\\³aþya\\ÿªp•øøãP`mKÀJ Zâÿ¡jDÐrÿr*ÿþJJÿ÷³–þyŒ<“FÈÿÖ(¡ÿ¡¼ÉÿA‡ÿòsü>/Ê´•ÿþ‚7í¥ºÿ\n©ÂœmÚÿpŒ{ÿh€ßþ±Žlÿy%Ûÿ€Mÿol[ÀK®õÿì>ÿ+@™ã­þíz„YºÿŽR€þüT®Z³±óÖWÿg<¢ÿЂÿ ‚‹ÎÛÿ^ٝÿïææÿtsŸþ¤k_3ÚØ}ÆÿŒÊ€þ _Dÿ7 ]þ®™ÿ̬`E nÕ&1þPÕv}rFFCÿŽIÿƒz¹ÿó2þ‚í(ҟŒŗAÿT™BÃ~Zîìv»fÿ…ÿ»Eæ8Å\\ÕE^ÿPŠåÎæÞoæ[éwÿ Yb”J…ÿ3ö´ÿä±p:½lÿÂËíþÑÓ\n#Vâ£‹þ8Kÿ>Ztµ<©Š¢ÔþQ§ÍZpÿ!pãS—u±àIÿ®ÙÿæÌOÿMèÿrNêà9~þ 1ò“¥h¶Œÿ§„ {DáW\'ûlÆÁy‡Ïÿ¬F2Dtÿe¯(ÿøié¦ËnÅÚ×þþ¨âý` g)·Ëþd÷JÿÕ~„Ò“,Çê”/µ›[ž6i¯ÿN‘þfš_€Ïþ4|ìÿ‚TGÝóӘªÏÞjÇ·T^þ\\È8ÿжsŽ`’…ˆäa–7ûBŒfÊg—øÿ3¸ÏÊÆY7Åáþ©_ùÿBADÿ¼ê~¦ßdpïôÂ:\'¶ô,þ¯D³ÿ˜v𰢂ÙrÌþ­~Nÿ!Þÿ$[ÿó ë׫—×õÿ¨/¤þñ’ÏE´Dóq5Hþû-n¨DDOÿnF_þ®[ÿ!Î_ÿ‰)ÿ»™þ#ÿpÿ ‘¹þ2% p1f¾ÿêó©ÿaæGÿf=LÔìÿ¤aÆ;’£Ä8=µbÁû“åÿb½ÿ.6ÎÿêRö·g&m>Ì\nðà’uÿŽšxEÔ#ÐcvyÿÿHÂuÅÿ}šO™Ö^Åÿ¹7“ÿ>þNþR™nf?ÿlR¡ÿi»ÔPŠ\'<ÿ]ÿH ºÒû¾§ÿä,þ€CèÖùkþˆ‘Vÿ„.°½»ãÿÐŒÙÓt2Qºþ‹ú@Ƈ›d Îþ»¢Óÿ¼?þÐ1UT¿ñÀòÿ™~‘ꢢÿæaØ@‡~¾”ß4+ÿ\'½@ˆî¯Ä¹bâÕÿŸôâ¯< éŽ´óÏÿE˜Ye¤þ‹¿Ñ[y “\'º{ÿ?sæÿ]§ÆÿÕÜÿ³œÿBzÖ Ùÿ->ÿjO’þ3‰cÿWdçÿ¯‘èÿe¸ÿ® }R%¡$rÿ0ގÿõºš®Ýþ?r›ÿ‡7 P‡~ú³ìÚ-‘“Iù½„½ÀÿߎÆÿHÿú5íþ ÓqþÕk8ÿ®“’ÿ`~0Ám%¢^ǝùþ€»ÿÍ1²þ]¤*ÿ+wëX·íÿÚÒÿkþ*æ\ncÿ¢âÛí[²ËÐ2_þÎÐ_ÿ÷¿YþnêOÿ¥=ózpÿöö¹þg{écæÛ[üÿÇÞÿ³õéÿÓñêoúÀÿUTˆe:2ÿƒ­œþw-3ÿvéþòZÖ^ŸÛêÿbL\\þP6æäçþ5ßÿq8v„ÿ«Òì8ñžÿºsÿå®0,rr¦ÿIâÿÍYô‰ãKø­8Jxöþw ÿQxÆÿˆzbÿ’ñÝmÂNÿßñFÖÈ©ÿa¾/ÿ/g®ÿc\\Hþvé´ÿÁ#éþå ÿÞüÆÌ+GÿÇT¬†f¾oîaþæ(æãÍ@þÈ á¦ÞqE3ÿŸ§¸JàtþžÐéÁt~ÿÔ …ÿ:ŒÌ$3ÿè+ëFµÿ@8’þ©Tÿâ\rÿÈ2°ÿ4Õõþ¨Ña¿G7"Nœè:¹J½ºŽ•þ@Eÿ¡Ë“ÿ°—¿ˆçËþ£¶‰¡~ûþé BDÏB%]r`þ\\÷ÿ,«EÊw ÿ¼v2ÿSˆÿGRFã ëyµ)šG†åþÊÿ$)˜š?Iÿ"¶|yݖÿÌÕ)¬WZ’ÿm‚GkÈÿóf½Ñþ.XuÎã¿nýÿm€þ†U3ÿ‰±pØ"ÿƒÐÿy•ªr¦Pÿqðzè³úDn´þÒªwßl¤ÿÏOéÿåâþÑbQÿODƒ¹dª¢ÿ¢kÿ9 dȵÿA¦¥†Ìh§¨¤O’‡;F2€ÿfw\rþã‡¢Ž³ÿ dÞàÛž]Ãÿꍉ}ÿîÎ/ÿabÿtn ÿ`sM[ãèÿøþOÿ\\åþXƋÎKúMÎÿô{ŠEÜ —ƒ§ÿíD§þǽ–£«Šÿ3¼ÿ_‰þ”â³µkÐÿ†Rÿ—e-ÿÊáàH“0Š—ÿÃ@Îþíڞj‰þý½éÿgÿÂaÿ²-©þÆá›\'0uÿ‡jsa&µ–/AÿS‚åþö&\\ïšþ[c¡o!ÿîÙòÿƒ¹ÃÿÕ¿žÿ)–Ú„©ƒYTü«F€ÿ£øËþ2´ÿ|LUûoPcBïÿší¶ÿÝ~…þJÌcÿA“wÿc8§ÿOø•ÿt›äÿí+þE‰ ÿúñ[zÿÍùóÔ<ÿ0¶°0¿ÿËy˜þ-JÕÿ>Zþõ£æÿ¹jtÿS#Ÿ !ÿP">W®ÿ­eUÊ$Qþ EÌÿ@á»:Î^V/åVõ?‘¾%\'mû‰“ê¢y‘ÿtÎÿÅè¹ÿ·¾ŒÿI þÿ‹òÿªZïÿaB»ÿõµ‡þވ4õ3þË/N˜eØI}þ`!ëÒIÿ+ÑXmzhäþªòËò̇ÿÊéÿAŸGdŒ_N–\rûkv¶:}ÿ&lÿ½Ñÿ›}q£[ÿyO¾ÿ†ïlÿL/ø£äïo\nX•Kÿ×ë履ÿ/—lÿkѼéçcþʔÿ®#ŠÿnDÿEµkfRfí\\$íÿÝ¢S7Êÿ‡ê‡ÿúÞA^¨þõøÒÿ§lÉþÿ¡oÍþˆ\rtd°„ÿ+×~ÿ±…‚ÿžO”Cà% Îÿ>"níh¯ÿP„oÿŽ®HTå´þi³Œ@øÿéŠõC{þÚyÔÿ?_ÚՅ‰ÿ¶Rÿ0 ôrѯLÿµ–ÿºåÿ¤o罋wʾÿÚj@ÿDë?þ`¬ÿ»/ ×ûÿQTYD:€^q\\ÐÿaSþ ¼ï ¤<͘À£bÿ¸<Ù¶‹m;xÿÀû©Òðÿ%¬\\þ”Óõÿ³A4ý\rs¹®Îr¼•ÿíZ­+ÇÀÿXlq4#LB”ÿÝÿ—ñrÿ¾Ñèb2Ǘ–ÕÿJ$5(‡Aÿ¬E®íUc_)8\' ±ÿÈjÚþ¹DTÿ[º=þCÿ\rô¦ÿcrÆÇn£ÿÁº|ïönDë.Ôdÿµì^þ¤LpÿxfOÊÀåȰ×)@ôÿθN§-? #ÿ; ŽÿÌ ÿÛ^åzp½imÿ@ÐJÿû7âÆ,Lї˜MÿÒ.É«Eÿ,Óç¾%àÿõÄ>ÿ©µÞÿ"ÓwñÅÿå#˜E(ÿ²â¡”³ÁÛÂþ(Î3ÿç\\úC™ª”ñªERÿyçÿ\\r¸>æáÉWÿ’`¢ÿµòÜ­»Ýâ>ªÿ8~Ùu\rãÿ³,›ÿÝSëÑÐ*¥ûQ…|õÉþaÓÿSÖ¦š$ ÿø/Zیÿ¡Ù&þԓ?ÿBT”Ïæ†YNzÿà›ÿRˆJ²œÐÿº1ÿÞÒ喾ÿU¢4ÿ)TÿI{Tþ]–w ×ÿÌÿŽñ4ÿä4}LÏ×§úþ¯¤æ7Ïim»õÿ¡,Ü)e€ÿ§^]ÖkÿvHþP=êÿy¯}‹©ûa\'“þúÄ1ÿ¥³nþßF»ÿŽ}š³Šÿv°*\n®™œ\\f¨\r¡ÿ úÅ´ÿË£,W $¡™ÿ{üãPþÄáºþ{¬U)ÿâo·Õç—;ÿB“!ÿöÿэtÿhpX¡¬S׿þ/o—-&4„-̊€mþéu†ÿó¾­þñìðRìþ(ß¡ÿn¶áÿ{®ï‡ò‘3њ–sþÙ¤üÿ7œET^ÿÿèI-Ôÿ`Å;þ`û!&ÇI@¬÷ÿut8ÿä>Šgöå¤ÿôvÉþV Ÿÿm"‰UÓº\nÁÁþz±zîfÿ¢Ú«lÙ¡žª"°/›µä ÿœK]Îbÿ:š# ó¸þCuBÿæå{É*n†ä²þºlvÿ:šÿR©>ÿrsïÄ2ÿ­0Áÿ“Tÿ–†“þ_èImã4þ¿‰\n(ÌþL4aÿ¤ë~þ|¼J¶y#ÿñþUÚÖÿT–þQuÿ Ÿ˜þBÝÿã\n<‡fн–u³\\„ˆÿxǁOþ¶ AÚ£©ö“Æÿk&N¯ÍÿÖúþ/Xÿ¤/Ìÿ+7ÿƒ†ÏþtdÖ`ŒKjܐà ¬Qÿdz4ÿ%T˪p® [Eôuƒ\\!˜¯ÿŒ™kÿû‡+þWŠÿÆê“þy˜TÿÍe› Hjþl™ÿ½åºÁ°ÿ®•Ñî‚éÖ~=âf9£Æo3ÿ-ONsÒ\nÿÚ ÿž‹ÆÿÓR»þP…Sæó…†ÿ(ˆMkOÿ·U\\±ÌÊ£G“ÿ˜E¾¬3¼úÒ¬ÿÓòqYYÿ@Boþt˜*¡\'ÿ6PþjÑsg|aÝæbÿç²ÀxþÙËÿ|žOp‘÷\\ú0£µÁÿ%/Žþ½¥ÿ.’ðK€)ÈþWyÕqì-ú Rlçáïwÿ§½ÿ»ä„ÿn½"^,Ì¢4ÅN¼ñþ9ô’/Îd3}k”þÃM˜ýZÿ3%"w&ÿÅv™¼Ó—tþõA4ÿ´ýn/±Ñ¡cÿvÞÊ}³ü{6~ÿ‘9¿7ºy\nóŠÍÓåÿ}œñþ”œ¹ÿã¼ÿ|) ÿ"Îþ9SÌ%ÿ*`bwf¸¾nRÚÿÈÌÀÿɑvu̒„ bÀÂyj¡øíX|ÔÍ«Zÿø0؍%æÿ|Ëþž¨ÿÖøp»ÿK…ïÿJãóÿú“FÖx¢§ ³ÿžÚMÑamQÿô!³ÿ949ÿA¬ÒÿùGÑÿŽ©îž½™ÿ®þgþb!Læÿq‹4ÿ:Ô¨×ÉÿøÌ×ßD ÿ9š·þ/çyj¦‰QˆŠ¥+3ç‹=9_;þvbÿ—?ì^¾úÿ©¹rú:ÿKia×߆qc£€>pcj“£Ã\n!ͶÖ®ÿ&çÿ5¶ßb*Ÿÿ÷\r(¼Ò±ÿÿ=”þ‰-ÿYtþ~&rû2òþy†€ÿÌù§þ¥ë×ʱó…>ð‚¾n¯ÿ’%Òyÿ\'‚ŽúTÿÈÏ _hÿ ô®†è~§{þÁ•ÿèéïÕFpÿüt þòÞÜÿÍUã¹:v÷?tM±ÿ>õÈþ?%ÿk5èþ2ÝÓ¢Ûþ^+¶>¶þ NÈÿ‡Œªë¸ä¯5ŠþP:Mÿ˜É?Ä"¸«°šy;Î&c\'¬PMþ†—º!ñþ^ýßÿ,rül~9ÿÉ(\rÿ\'åÿ\'ï—y3ÿ™–ø\nê®ÿvöþÈõ&E¡ò²–q8‚«iXlÿ1*jû©BE]•9þ¤oZ¼ZÿÌÅ(Õ2Ô`„ÿXŠ´þä’|ÿ¸ö÷AuVÿýfÒþþy$‰sÿ<؆;âa°ŽGÑ¡½T3þ›úHÕTëÿ-Þàÿª*5ÿN§uº(ÿ}±gÿEáBãXK¬©-ã$Fÿ2 ÿ‹Á·çþÚE2ì8¡Ճ*Š‘,þˆå(ÿ1?#ÿ=‘õÿeÀþè§q˜h&y¹Úy‹Óþwð#A½Ùþ»³¢ÿ »æ>øÿçÿÜøl 粏P[ƒ]eÿ\'ÿú²ìþ‹ .̼&þõs4ÿ¿qIþ¿lEÿEõ˲ªcªAøo%l™ÿ@%EX>þY”ÿ¿Dàñ\'5)Ëíÿ‘~ÂÿÝ*ýÿc—aýßJs1ÿ¯Hÿ;°Ë|·ùääc Ïþ¨ÀÃÿ̰þ˜ê«M%Uÿ!x‡ÿŽÂãÖ:Õ»}ÿè.<ÿ¾t*þ—²ÿ3>íþÌìÁÂè<¬"ÿ½¸þg_ÿé$þ) ÿævõ-CՕÿŸ ÿ»¤ã  NÃ+Åá0Ž)þě<ÿßÇ‘ˆœüu©þ‘âîïkmµ¼ÿæp1þIªíÿç·ãÿPÜÂkÍe.4ÅÒ«$ÿXZÿ8—`»ÿÿ*NÈþFFô}¨ÌDŠ|×FfBÈþ4äu܏þËø{8®ÿº—¤ÿ3èРä+ÿùD¾?\rÿõûýóó óýÿõÿÿA¬‰ +vÁ_epÿPü¡þòjÆÿ…²äßpßîUþ3ó>+‹þËA\nAà‰ W3M푪Vÿ6&3ÿñ€eÿ)yJÿìN›©—iþœ)HÂf¯ÿ΢eÿ.{¨ýÿÓ¯—þÃÛ`8v¾þþÑõÿ™d~þèÿ5¸òÿǤÝAàŠ A€‹ ñ&àëz|;A¸®VãúñŸÄjÚ ëœ2±ý†b_I¸_œ•¼£PŒ$±Ð±Uœƒï[D\\ÄXކØ"NÝПWìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆcc¥ø||„îww™ö{{ÿòò\rÖkk½Þoo±‘ÅÅT`00PÎgg©V++}çþþµ××bM««æìvvšÊÊE‚‚‰ÉÉ@ú}}‡ïúú²YYëŽGGÉûðð A­­ì³ÔÔg_¢¢ýE¯¯ê#œœ¿S¤¤÷ärr–›ÀÀ[u··Âáýý=““®L&&jl66Z~??Aõ÷÷ƒÌÌOh44\\Q¥¥ôÑåå4ùññâqq“«ØØsb11S*? •ÇÇRF##eÃÃ^0(7––¡\n/ššµ $6€€›ßââ=Íëë&N\'\'i²²ÍêuuŸ ƒƒžX,,t4.6-Ünn²´ZZî[  û¤RRöv;;M·ÖÖa}³³ÎR)){Ýãã>^//q„„—¦SSõ¹ÑÑhÁíí,@ `ãüüy±±È¶[[íÔjj¾ËËFg¾¾Ùr99K”JJޘLLÔ°XXè…ÏÏJ»ÐÐkÅïï*Oªªåíûû†CCŚMM×f33U……”ŠEEÏéùùþ PPðx<!–KKÝa½½Ü\r‹‹†ŠŠ…àpp|>>BqµµÄÌffªHHØ÷ööÂaa£j55_®WWùi¹¹Ð††‘™ÁÁX:\'\'žž¹Ùáá8ëøø+˜˜³"3Òii»©ÙÙpŽŽ‰3””§-››¶<"‡‡’Ééé ‡ÎÎIªUUÿP((x¥ßßzŒŒY¡¡ø ‰‰€\r\re¿¿Ú׿æ1„BBÆÐhh¸‚AAÃ)™™°Z--w{°°Ë¨TTüm»»Ö,:¥Æcc„ø||™îwwö{{\rÿòò½Ökk±ÞooT‘ÅÅP`00©Îgg}V++çþþbµ×׿M««šìvvEÊʝ‚‚@‰Éɇú}}ïúúë²YYɎGG ûððìA­­g³ÔÔý_¢¢êE¯¯¿#œœ÷S¤¤–ärr[›ÀÀÂu··áýý®=““jL&&Zl66A~??õ÷÷OƒÌÌ\\h44ôQ¥¥4Ñååùññ“âqqs«ØØSb11?* R•ÇÇeF##^ÃÃ(0¡7––\nµ/šš 6$›€€=ßââ&ÍëëiN\'\'Ͳ²Ÿêuu žƒƒtX,,.4-6²Ünnî´ZZû[  ö¤RRMv;;a·ÖÖÎ}³³{R))>Ýããq^//—„„õ¦SSh¹ÑÑ,Áíí`@ ãüüÈy±±í¶[[¾ÔjjFËËÙg¾¾Kr99ޔJJԘLLè°XXJ…ÏÏk»ÐÐ*ÅïïåOªªíûûņCCךMMUf33”……ÏŠEEéùùþð PPDx<<º%ŸŸãK¨¨ó¢QQþ]££À€@@Š­?’’¼!Hp88ñõõßc¼¼Áw¶¶u¯ÚÚcB!!0 åÿÿýóóm¿ÒÒLÍÍ 5&/Ãììá¾__¢5——̈DD9.W“ÄÄòU§§‚ü~~Gz==¬Èddçº]]+2•æss À``˜ÑžOO£ÜÜfD""~T**«;ƒ ˆˆÊŒFF)ÇîîÓk¸¸<(y§ÞÞâ¼^^ v­ÛÛ;ÛààVd22Nt::\n\nےII\n lH$$ä¸\\\\]ŸÂÂn½ÓÓïC¬¬¦Äbb¨9‘‘¤1••7Óää‹òyy2ÕççC‹ÈÈYn77·ÚmmŒd±ÕÕҜNNàI©©´Øllú¬VVóôô%Ïêê¯ÊeeŽôzzéG®®ÕoººˆðxxoJ%%r\\..$8ñW¦¦Çs´´Q—ÆÆ#Ëèè|¡Ýݜètt!>ݖKKÜa½½†\r‹‹…ŠŠàppB|>>ÄqµµªÌffؐHH÷öö£Âaa_j55ù®WWÐi¹¹‘††X™ÁÁ\':¹\'žž8Ùááëøø³+˜˜3"»Òiip©ÙىŽŽ§3””¶-››"<’‡‡ ÉééI‡ÎÎÿªUUxP((z¥ßߏŒŒøY¡¡€ ‰‰\r\rÚe¿¿1×ææÆ„BB¸ÐhhÂAA°)™™wZ--Ë{°°ü¨TTÖm»»:,c¥Æc|„ø|w™îw{ö{ò\rÿòk½Öko±ÞoÅT‘Å0P`0g©Îg+}V+þçþ×bµ×«æM«všìvÊEÊ‚‚É@‰É}‡ú}úïúYë²YGɎGð ûð­ìA­Ôg³Ô¢ý_¢¯êE¯œ¿#œ¤÷S¤r–ärÀ[›À·Âu·ýáý“®=“&jL&6Zl6?A~?÷õ÷ÌOƒÌ4\\h4¥ôQ¥å4Ñåñùñq“âqØs«Ø1Sb1?* ÇR•Ç#eF#Ã^Ã(0–¡7–\nšµ/š 6$€›€â=ßâë&Íë\'iN\'²Í²uŸêu  ƒžƒ,tX,.4-6n²ÜnZî´Z û[ Rö¤R;Mv;Öa·Ö³Î}³){R)ã>Ýã/q^/„—„Sõ¦SÑh¹Ñí,Áí `@ üãü±Èy±[í¶[j¾ÔjËFË¾Ùg¾9Kr9JޔJLԘLXè°XÏJ…ÏÐk»Ðï*ÅïªåOªûíûCņCMךM3Uf3…”…EϊEùéùþPð PKݖK½Üa½‹†\r‹Š…Špàp>B|>µÄqµfªÌfHؐHö÷öa£Âa5_j5Wù®W¹Ði¹†‘†ÁX™Á\':ž¹\'žá8Ùáøëø˜³+˜3"i»ÒiÙp©ÙމŽ”§3”›¶-›"<‡’‡é ÉéÎI‡ÎUÿªU(xP(ßz¥ßŒŒ¡øY¡‰€ ‰\r\r¿Úe¿æ1׿BƄBh¸ÐhAÂA™°)™-wZ-°Ë{°Tü¨T»Öm»:,cc¥Æ||„øww™î{{öòò\rÿkk½Öoo±ÞÅÅT‘00P`gg©Î++}Vþþç××bµ««æMvvšìÊÊE‚‚ÉÉ@‰}}‡úúúïYYë²GGɎðð û­­ìAÔÔg³¢¢ý_¯¯êEœœ¿#¤¤÷Srr–äÀÀ[›··Âuýýᓓ®=&&jL66Zl??A~÷÷õÌÌOƒ44\\h¥¥ôQåå4Ñññùqq“âØØs«11Sb?* ÇÇR•##eFÃÃ^(0––¡7\nššµ/ 6$€€›ââ=ßëë&Í\'\'iN²²ÍuuŸê ƒƒž,,tX.4-6nn²ÜZZî´  û[RRö¤;;MvÖÖa·³³Î})){Rãã>Ý//q^„„—SSõ¦ÑÑh¹íí,Á `@üüã±±Èy[[í¶jj¾ÔËËF¾¾Ùg99KrJJޔLLԘXXè°ÏÏJ…ÐÐk»ïï*ŪªåOûûíCCņMMך33Uf……”EEϊùùéþPPð <KKݖ½½Üa‹‹†\rŠŠ…ppà>>B|µµÄqffªÌHHؐöö÷aa£Â55_jWWù®¹¹Ði††‘ÁÁX™\':žž¹\'áá8Ùøø똘³+3"ii»ÒÙÙp©ŽŽ‰””§3››¶-"<‡‡’éé ÉÎÎI‡UUÿª((xPßßz¥ŒŒ¡¡øY‰‰€ \r\r¿¿Úeææ1×BBƄhh¸ÐAA™™°)--wZ°°Ë{TTü¨»»Öm:,LibsodiumDRGɼógæ j;§Ê„…®g»+ø”þrón<ñ6_:õO¥Ñ‚æ­RQl>+Œh›k½Aû«Ùƒy!~Íà["®(ט/ŠBÍeï#‘D7q/;MìÏûÀµ¼Û‰¥Ûµé8µHó[ÂV9жññY›O¯¤‚?’mÚÕ^«B£˜ªؾopE[ƒŒ²äN¾…1$â´ÿÕÃ} Uo‰{òt]¾r±–;þ±Þ€5Ç%§ܛ”&iÏtñ›ÁÒJñžÁi›äã%O8†G¾ïµÕŒ‹ÆÁeœ¬wÌ¡ $u+Yo,é-ƒä¦nª„tJÔûA½Ü©°\\µSƒÚˆùv«ßfîRQ>˜2´-mÆ1¨?!û˜È\'°äï¾ÇY¿Â¨=ó àÆ%§\n“G‘§Õo‚àQcÊpn\ng))ü/ÒF…\n·\'&É&\\8!.í*ÄZüm,Mß³•\r8SÞc¯‹Ts\ne¨²w<»\njvæ®íG.Ɂ;5‚…,r’dñL¡è¿¢0B¼Kf¨‘—øÐp‹KÂ0¾T£QlÇRïÖè’Ñ©eU$™Ö* qW…5ô¸Ñ»2p jÈÐÒ¸Á¤S«AQl7™ëŽßLwH\'¨H›áµ¼°4cZÉų 9ˊAãJªØNsãcwOʜ[£¸²Öóo.hü²ï]t`/Coc¥xr«ð¡xȄì9dnj(c#úÿ¾é½‚ÞëlP¤yƲ÷£ù¾+SrãòxqƜa&êÎ>\'ÊÂÀ!Ǹ†ÑëàÍÖ}ÚêxÑnîO}õºorªgð¦˜È¢Å}c\n®\rù¾˜?G5 q„}#õwÛ(“$Ç@{«Ê2¼¾É\n¾žË¾ÔÅL*~eüœ)YìúÖ:«oË_XGJŒDl€Að² íÓõ\\cX֜÷¢ÞùÞA³ A ³ ¡gæ j…®g»rón<:õO¥RQŒh›«ÙƒÍà[˜/ŠB‘D7qÏûÀµ¥Ûµé[ÂV9ññY¤‚?’Õ^«˜ªØ[ƒ¾…1$Ã} Ut]¾rþ±Þ€§ܛtñ›ÁÁi›ä†G¾ïƝÁÌ¡ $o,é-ª„tJÜ©°\\ڈùvRQ>˜mÆ1¨È\'°ÇY¿ó àÆG‘§ÕQcÊg))…\n·\'8!.üm,M\r8STs\ne»\njv.Ɂ…,r’¡è¿¢Kf¨p‹K£QlÇè’Ñ$™Ö…5ôp jÁ¤l7LwH\'µ¼°4³ 9JªØNOʜ[óo.htoc¥xxȄnjúÿ¾ëlP¤÷£ù¾òxqƀA¶ !SigEd25519 no Ed25519 collisionsAð¶ E¡ \n \r')}function getBinarySync(file){return file}async function getWasmBinary(binaryFile){return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason);}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency();return wasmExports}addRunDependency();function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst));});})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports$1=receiveInstantiationResult(result);return exports$1}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module);}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies);};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":return HEAP8[ptr];case "i8":return HEAP8[ptr];case "i16":return HEAP16[ptr>>1];case "i32":return HEAP32[ptr>>2];case "i64":abort("to do getValue(i64) use WASM_BIGINT");case "float":return HEAPF32[ptr>>2];case "double":return HEAPF64[ptr>>3];case "*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`);}}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":HEAP8[ptr]=value;break;case "i8":HEAP8[ptr]=value;break;case "i16":HEAP16[ptr>>1]=value;break;case "i32":HEAP32[ptr>>2]=value;break;case "i64":abort("to do setValue(i64) use WASM_BIGINT");case "float":HEAPF32[ptr>>2]=value;break;case "double":HEAPF64[ptr>>3]=value;break;case "*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`);}}var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023);}}return str};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var __abort_js=()=>abort("");var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4;}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};for(var base64ReverseLookup=new Uint8Array(123),i=25;i>=0;--i){base64ReverseLookup[48+i]=52+i;base64ReverseLookup[65+i]=i;base64ReverseLookup[97+i]=26+i;}base64ReverseLookup[43]=62;base64ReverseLookup[47]=63;{if(Module["noExitRuntime"])Module["noExitRuntime"];if(Module["print"])Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])Module["arguments"];if(Module["thisProgram"])Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()();}}}Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;var ASM_CONSTS={39864:()=>Module.getRandomValue(),39900:()=>{if(Module.getRandomValue===undefined){try{var window_="object"===typeof window?window:self;var crypto_=typeof window_.crypto!=="undefined"?window_.crypto:window_.msCrypto;crypto_=crypto_===undefined?crypto:crypto_;var randomValuesStandard=function(){var buf=new Uint32Array(1);crypto_.getRandomValues(buf);return buf[0]>>>0};randomValuesStandard();Module.getRandomValue=randomValuesStandard;}catch(e){try{var crypto=null;var randomValueNodeJS=function(){var buf=crypto["randomBytes"](4);return (buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0};randomValueNodeJS();Module.getRandomValue=randomValueNodeJS;}catch(e){throw "No secure random number generator found"}}}}};var wasmMemory;function assignWasmExports(wasmExports){Module["_crypto_aead_aegis128l_keybytes"]=wasmExports["f"];Module["_crypto_aead_aegis128l_nsecbytes"]=wasmExports["g"];Module["_crypto_aead_aegis128l_npubbytes"]=wasmExports["h"];Module["_crypto_aead_aegis128l_abytes"]=wasmExports["i"];Module["_crypto_aead_aegis128l_messagebytes_max"]=wasmExports["j"];Module["_crypto_aead_aegis128l_keygen"]=wasmExports["k"];Module["_crypto_aead_aegis128l_encrypt"]=wasmExports["l"];Module["_crypto_aead_aegis128l_encrypt_detached"]=wasmExports["m"];Module["_crypto_aead_aegis128l_decrypt"]=wasmExports["n"];Module["_crypto_aead_aegis128l_decrypt_detached"]=wasmExports["o"];Module["_crypto_aead_aegis256_keybytes"]=wasmExports["p"];Module["_crypto_aead_aegis256_nsecbytes"]=wasmExports["q"];Module["_crypto_aead_aegis256_npubbytes"]=wasmExports["r"];Module["_crypto_aead_aegis256_abytes"]=wasmExports["s"];Module["_crypto_aead_aegis256_messagebytes_max"]=wasmExports["t"];Module["_crypto_aead_aegis256_keygen"]=wasmExports["u"];Module["_crypto_aead_aegis256_encrypt"]=wasmExports["v"];Module["_crypto_aead_aegis256_encrypt_detached"]=wasmExports["w"];Module["_crypto_aead_aegis256_decrypt"]=wasmExports["x"];Module["_crypto_aead_aegis256_decrypt_detached"]=wasmExports["y"];Module["_crypto_aead_aes256gcm_is_available"]=wasmExports["z"];Module["_crypto_aead_chacha20poly1305_encrypt_detached"]=wasmExports["A"];Module["_crypto_aead_chacha20poly1305_encrypt"]=wasmExports["B"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt_detached"]=wasmExports["C"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt"]=wasmExports["D"];Module["_crypto_aead_chacha20poly1305_decrypt_detached"]=wasmExports["E"];Module["_crypto_aead_chacha20poly1305_decrypt"]=wasmExports["F"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt_detached"]=wasmExports["G"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt"]=wasmExports["H"];Module["_crypto_aead_chacha20poly1305_ietf_keybytes"]=wasmExports["I"];Module["_crypto_aead_chacha20poly1305_ietf_npubbytes"]=wasmExports["J"];Module["_crypto_aead_chacha20poly1305_ietf_nsecbytes"]=wasmExports["K"];Module["_crypto_aead_chacha20poly1305_ietf_abytes"]=wasmExports["L"];Module["_crypto_aead_chacha20poly1305_ietf_messagebytes_max"]=wasmExports["M"];Module["_crypto_aead_chacha20poly1305_ietf_keygen"]=wasmExports["N"];Module["_crypto_aead_chacha20poly1305_keybytes"]=wasmExports["O"];Module["_crypto_aead_chacha20poly1305_npubbytes"]=wasmExports["P"];Module["_crypto_aead_chacha20poly1305_nsecbytes"]=wasmExports["Q"];Module["_crypto_aead_chacha20poly1305_abytes"]=wasmExports["R"];Module["_crypto_aead_chacha20poly1305_messagebytes_max"]=wasmExports["S"];Module["_crypto_aead_chacha20poly1305_keygen"]=wasmExports["T"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt_detached"]=wasmExports["U"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt"]=wasmExports["V"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt_detached"]=wasmExports["W"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt"]=wasmExports["X"];Module["_crypto_aead_xchacha20poly1305_ietf_keybytes"]=wasmExports["Y"];Module["_crypto_aead_xchacha20poly1305_ietf_npubbytes"]=wasmExports["Z"];Module["_crypto_aead_xchacha20poly1305_ietf_nsecbytes"]=wasmExports["_"];Module["_crypto_aead_xchacha20poly1305_ietf_abytes"]=wasmExports["$"];Module["_crypto_aead_xchacha20poly1305_ietf_messagebytes_max"]=wasmExports["aa"];Module["_crypto_aead_xchacha20poly1305_ietf_keygen"]=wasmExports["ba"];Module["_crypto_auth_bytes"]=wasmExports["ca"];Module["_crypto_auth_keybytes"]=wasmExports["da"];Module["_crypto_auth_primitive"]=wasmExports["ea"];Module["_crypto_auth"]=wasmExports["fa"];Module["_crypto_auth_verify"]=wasmExports["ga"];Module["_crypto_auth_keygen"]=wasmExports["ha"];Module["_crypto_auth_hmacsha256_bytes"]=wasmExports["ia"];Module["_crypto_auth_hmacsha256_keybytes"]=wasmExports["ja"];Module["_crypto_auth_hmacsha256_statebytes"]=wasmExports["ka"];Module["_crypto_auth_hmacsha256_keygen"]=wasmExports["la"];Module["_crypto_auth_hmacsha256_init"]=wasmExports["ma"];Module["_crypto_auth_hmacsha256_update"]=wasmExports["na"];Module["_crypto_auth_hmacsha256_final"]=wasmExports["oa"];Module["_crypto_auth_hmacsha256"]=wasmExports["pa"];Module["_crypto_auth_hmacsha256_verify"]=wasmExports["qa"];Module["_crypto_auth_hmacsha512_bytes"]=wasmExports["ra"];Module["_crypto_auth_hmacsha512_keybytes"]=wasmExports["sa"];Module["_crypto_auth_hmacsha512_statebytes"]=wasmExports["ta"];Module["_crypto_auth_hmacsha512_keygen"]=wasmExports["ua"];Module["_crypto_auth_hmacsha512_init"]=wasmExports["va"];Module["_crypto_auth_hmacsha512_update"]=wasmExports["wa"];Module["_crypto_auth_hmacsha512_final"]=wasmExports["xa"];Module["_crypto_auth_hmacsha512"]=wasmExports["ya"];Module["_crypto_auth_hmacsha512_verify"]=wasmExports["za"];Module["_crypto_auth_hmacsha512256_bytes"]=wasmExports["Aa"];Module["_crypto_auth_hmacsha512256_keybytes"]=wasmExports["Ba"];Module["_crypto_auth_hmacsha512256_statebytes"]=wasmExports["Ca"];Module["_crypto_auth_hmacsha512256_keygen"]=wasmExports["Da"];Module["_crypto_auth_hmacsha512256_init"]=wasmExports["Ea"];Module["_crypto_auth_hmacsha512256_update"]=wasmExports["Fa"];Module["_crypto_auth_hmacsha512256_final"]=wasmExports["Ga"];Module["_crypto_auth_hmacsha512256"]=wasmExports["Ha"];Module["_crypto_auth_hmacsha512256_verify"]=wasmExports["Ia"];Module["_crypto_box_seedbytes"]=wasmExports["Ja"];Module["_crypto_box_publickeybytes"]=wasmExports["Ka"];Module["_crypto_box_secretkeybytes"]=wasmExports["La"];Module["_crypto_box_beforenmbytes"]=wasmExports["Ma"];Module["_crypto_box_noncebytes"]=wasmExports["Na"];Module["_crypto_box_zerobytes"]=wasmExports["Oa"];Module["_crypto_box_boxzerobytes"]=wasmExports["Pa"];Module["_crypto_box_macbytes"]=wasmExports["Qa"];Module["_crypto_box_messagebytes_max"]=wasmExports["Ra"];Module["_crypto_box_primitive"]=wasmExports["Sa"];Module["_crypto_box_seed_keypair"]=wasmExports["Ta"];Module["_crypto_box_keypair"]=wasmExports["Ua"];Module["_crypto_box_beforenm"]=wasmExports["Va"];Module["_crypto_box_afternm"]=wasmExports["Wa"];Module["_crypto_box_open_afternm"]=wasmExports["Xa"];Module["_crypto_box"]=wasmExports["Ya"];Module["_crypto_box_open"]=wasmExports["Za"];Module["_crypto_box_detached_afternm"]=wasmExports["_a"];Module["_crypto_box_detached"]=wasmExports["$a"];Module["_crypto_box_easy_afternm"]=wasmExports["ab"];Module["_crypto_box_easy"]=wasmExports["bb"];Module["_crypto_box_open_detached_afternm"]=wasmExports["cb"];Module["_crypto_box_open_detached"]=wasmExports["db"];Module["_crypto_box_open_easy_afternm"]=wasmExports["eb"];Module["_crypto_box_open_easy"]=wasmExports["fb"];Module["_crypto_box_seal"]=wasmExports["gb"];Module["_crypto_box_seal_open"]=wasmExports["hb"];Module["_crypto_box_sealbytes"]=wasmExports["ib"];Module["_crypto_box_curve25519xsalsa20poly1305_seed_keypair"]=wasmExports["jb"];Module["_crypto_box_curve25519xsalsa20poly1305_keypair"]=wasmExports["kb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenm"]=wasmExports["lb"];Module["_crypto_box_curve25519xsalsa20poly1305_afternm"]=wasmExports["mb"];Module["_crypto_box_curve25519xsalsa20poly1305_open_afternm"]=wasmExports["nb"];Module["_crypto_box_curve25519xsalsa20poly1305"]=wasmExports["ob"];Module["_crypto_box_curve25519xsalsa20poly1305_open"]=wasmExports["pb"];Module["_crypto_box_curve25519xsalsa20poly1305_seedbytes"]=wasmExports["qb"];Module["_crypto_box_curve25519xsalsa20poly1305_publickeybytes"]=wasmExports["rb"];Module["_crypto_box_curve25519xsalsa20poly1305_secretkeybytes"]=wasmExports["sb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenmbytes"]=wasmExports["tb"];Module["_crypto_box_curve25519xsalsa20poly1305_noncebytes"]=wasmExports["ub"];Module["_crypto_box_curve25519xsalsa20poly1305_zerobytes"]=wasmExports["vb"];Module["_crypto_box_curve25519xsalsa20poly1305_boxzerobytes"]=wasmExports["wb"];Module["_crypto_box_curve25519xsalsa20poly1305_macbytes"]=wasmExports["xb"];Module["_crypto_box_curve25519xsalsa20poly1305_messagebytes_max"]=wasmExports["yb"];Module["_crypto_core_hchacha20"]=wasmExports["zb"];Module["_crypto_core_hchacha20_outputbytes"]=wasmExports["Ab"];Module["_crypto_core_hchacha20_inputbytes"]=wasmExports["Bb"];Module["_crypto_core_hchacha20_keybytes"]=wasmExports["Cb"];Module["_crypto_core_hchacha20_constbytes"]=wasmExports["Db"];Module["_crypto_core_hsalsa20"]=wasmExports["Eb"];Module["_crypto_core_hsalsa20_outputbytes"]=wasmExports["Fb"];Module["_crypto_core_hsalsa20_inputbytes"]=wasmExports["Gb"];Module["_crypto_core_hsalsa20_keybytes"]=wasmExports["Hb"];Module["_crypto_core_hsalsa20_constbytes"]=wasmExports["Ib"];Module["_crypto_core_salsa20"]=wasmExports["Jb"];Module["_crypto_core_salsa20_outputbytes"]=wasmExports["Kb"];Module["_crypto_core_salsa20_inputbytes"]=wasmExports["Lb"];Module["_crypto_core_salsa20_keybytes"]=wasmExports["Mb"];Module["_crypto_core_salsa20_constbytes"]=wasmExports["Nb"];Module["_crypto_core_salsa2012"]=wasmExports["Ob"];Module["_crypto_core_salsa2012_outputbytes"]=wasmExports["Pb"];Module["_crypto_core_salsa2012_inputbytes"]=wasmExports["Qb"];Module["_crypto_core_salsa2012_keybytes"]=wasmExports["Rb"];Module["_crypto_core_salsa2012_constbytes"]=wasmExports["Sb"];Module["_crypto_core_salsa208"]=wasmExports["Tb"];Module["_crypto_core_salsa208_outputbytes"]=wasmExports["Ub"];Module["_crypto_core_salsa208_inputbytes"]=wasmExports["Vb"];Module["_crypto_core_salsa208_keybytes"]=wasmExports["Wb"];Module["_crypto_core_salsa208_constbytes"]=wasmExports["Xb"];Module["_crypto_generichash_bytes_min"]=wasmExports["Yb"];Module["_crypto_generichash_bytes_max"]=wasmExports["Zb"];Module["_crypto_generichash_bytes"]=wasmExports["_b"];Module["_crypto_generichash_keybytes_min"]=wasmExports["$b"];Module["_crypto_generichash_keybytes_max"]=wasmExports["ac"];Module["_crypto_generichash_keybytes"]=wasmExports["bc"];Module["_crypto_generichash_primitive"]=wasmExports["cc"];Module["_crypto_generichash_statebytes"]=wasmExports["dc"];Module["_crypto_generichash"]=wasmExports["ec"];Module["_crypto_generichash_init"]=wasmExports["fc"];Module["_crypto_generichash_update"]=wasmExports["gc"];Module["_crypto_generichash_final"]=wasmExports["hc"];Module["_crypto_generichash_keygen"]=wasmExports["ic"];Module["_crypto_generichash_blake2b_bytes_min"]=wasmExports["jc"];Module["_crypto_generichash_blake2b_bytes_max"]=wasmExports["kc"];Module["_crypto_generichash_blake2b_bytes"]=wasmExports["lc"];Module["_crypto_generichash_blake2b_keybytes_min"]=wasmExports["mc"];Module["_crypto_generichash_blake2b_keybytes_max"]=wasmExports["nc"];Module["_crypto_generichash_blake2b_keybytes"]=wasmExports["oc"];Module["_crypto_generichash_blake2b_saltbytes"]=wasmExports["pc"];Module["_crypto_generichash_blake2b_personalbytes"]=wasmExports["qc"];Module["_crypto_generichash_blake2b_statebytes"]=wasmExports["rc"];Module["_crypto_generichash_blake2b_keygen"]=wasmExports["sc"];Module["_crypto_generichash_blake2b"]=wasmExports["tc"];Module["_crypto_generichash_blake2b_salt_personal"]=wasmExports["uc"];Module["_crypto_generichash_blake2b_init"]=wasmExports["vc"];Module["_crypto_generichash_blake2b_init_salt_personal"]=wasmExports["wc"];Module["_crypto_generichash_blake2b_update"]=wasmExports["xc"];Module["_crypto_generichash_blake2b_final"]=wasmExports["yc"];Module["_crypto_hash_bytes"]=wasmExports["zc"];Module["_crypto_hash"]=wasmExports["Ac"];Module["_crypto_hash_primitive"]=wasmExports["Bc"];Module["_crypto_hash_sha256_bytes"]=wasmExports["Cc"];Module["_crypto_hash_sha256_statebytes"]=wasmExports["Dc"];Module["_crypto_hash_sha256_init"]=wasmExports["Ec"];Module["_crypto_hash_sha256_update"]=wasmExports["Fc"];Module["_crypto_hash_sha256_final"]=wasmExports["Gc"];Module["_crypto_hash_sha256"]=wasmExports["Hc"];Module["_crypto_hash_sha512_bytes"]=wasmExports["Ic"];Module["_crypto_hash_sha512_statebytes"]=wasmExports["Jc"];Module["_crypto_hash_sha512_init"]=wasmExports["Kc"];Module["_crypto_hash_sha512_update"]=wasmExports["Lc"];Module["_crypto_hash_sha512_final"]=wasmExports["Mc"];Module["_crypto_hash_sha512"]=wasmExports["Nc"];Module["_crypto_kdf_blake2b_bytes_min"]=wasmExports["Oc"];Module["_crypto_kdf_blake2b_bytes_max"]=wasmExports["Pc"];Module["_crypto_kdf_blake2b_contextbytes"]=wasmExports["Qc"];Module["_crypto_kdf_blake2b_keybytes"]=wasmExports["Rc"];Module["_crypto_kdf_blake2b_derive_from_key"]=wasmExports["Sc"];Module["_crypto_kdf_primitive"]=wasmExports["Tc"];Module["_crypto_kdf_bytes_min"]=wasmExports["Uc"];Module["_crypto_kdf_bytes_max"]=wasmExports["Vc"];Module["_crypto_kdf_contextbytes"]=wasmExports["Wc"];Module["_crypto_kdf_keybytes"]=wasmExports["Xc"];Module["_crypto_kdf_derive_from_key"]=wasmExports["Yc"];Module["_crypto_kdf_keygen"]=wasmExports["Zc"];Module["_crypto_kdf_hkdf_sha256_extract_init"]=wasmExports["_c"];Module["_crypto_kdf_hkdf_sha256_extract_update"]=wasmExports["$c"];Module["_crypto_kdf_hkdf_sha256_extract_final"]=wasmExports["ad"];Module["_crypto_kdf_hkdf_sha256_extract"]=wasmExports["bd"];Module["_crypto_kdf_hkdf_sha256_keygen"]=wasmExports["cd"];Module["_crypto_kdf_hkdf_sha256_expand"]=wasmExports["dd"];Module["_crypto_kdf_hkdf_sha256_keybytes"]=wasmExports["ed"];Module["_crypto_kdf_hkdf_sha256_bytes_min"]=wasmExports["fd"];Module["_crypto_kdf_hkdf_sha256_bytes_max"]=wasmExports["gd"];Module["_crypto_kdf_hkdf_sha256_statebytes"]=wasmExports["hd"];Module["_crypto_kdf_hkdf_sha512_extract_init"]=wasmExports["id"];Module["_crypto_kdf_hkdf_sha512_extract_update"]=wasmExports["jd"];Module["_crypto_kdf_hkdf_sha512_extract_final"]=wasmExports["kd"];Module["_crypto_kdf_hkdf_sha512_extract"]=wasmExports["ld"];Module["_crypto_kdf_hkdf_sha512_keygen"]=wasmExports["md"];Module["_crypto_kdf_hkdf_sha512_expand"]=wasmExports["nd"];Module["_crypto_kdf_hkdf_sha512_keybytes"]=wasmExports["od"];Module["_crypto_kdf_hkdf_sha512_bytes_min"]=wasmExports["pd"];Module["_crypto_kdf_hkdf_sha512_bytes_max"]=wasmExports["qd"];Module["_crypto_kdf_hkdf_sha512_statebytes"]=wasmExports["rd"];Module["_crypto_kx_seed_keypair"]=wasmExports["sd"];Module["_crypto_kx_keypair"]=wasmExports["td"];Module["_crypto_kx_client_session_keys"]=wasmExports["ud"];Module["_crypto_kx_server_session_keys"]=wasmExports["vd"];Module["_crypto_kx_publickeybytes"]=wasmExports["wd"];Module["_crypto_kx_secretkeybytes"]=wasmExports["xd"];Module["_crypto_kx_seedbytes"]=wasmExports["yd"];Module["_crypto_kx_sessionkeybytes"]=wasmExports["zd"];Module["_crypto_kx_primitive"]=wasmExports["Ad"];Module["_crypto_onetimeauth_statebytes"]=wasmExports["Bd"];Module["_crypto_onetimeauth_bytes"]=wasmExports["Cd"];Module["_crypto_onetimeauth_keybytes"]=wasmExports["Dd"];Module["_crypto_onetimeauth"]=wasmExports["Ed"];Module["_crypto_onetimeauth_verify"]=wasmExports["Fd"];Module["_crypto_onetimeauth_init"]=wasmExports["Gd"];Module["_crypto_onetimeauth_update"]=wasmExports["Hd"];Module["_crypto_onetimeauth_final"]=wasmExports["Id"];Module["_crypto_onetimeauth_primitive"]=wasmExports["Jd"];Module["_crypto_onetimeauth_keygen"]=wasmExports["Kd"];Module["_crypto_onetimeauth_poly1305"]=wasmExports["Ld"];Module["_crypto_onetimeauth_poly1305_verify"]=wasmExports["Md"];Module["_crypto_onetimeauth_poly1305_init"]=wasmExports["Nd"];Module["_crypto_onetimeauth_poly1305_update"]=wasmExports["Od"];Module["_crypto_onetimeauth_poly1305_final"]=wasmExports["Pd"];Module["_crypto_onetimeauth_poly1305_bytes"]=wasmExports["Qd"];Module["_crypto_onetimeauth_poly1305_keybytes"]=wasmExports["Rd"];Module["_crypto_onetimeauth_poly1305_statebytes"]=wasmExports["Sd"];Module["_crypto_onetimeauth_poly1305_keygen"]=wasmExports["Td"];Module["_crypto_pwhash_argon2i_alg_argon2i13"]=wasmExports["Ud"];Module["_crypto_pwhash_argon2i_bytes_min"]=wasmExports["Vd"];Module["_crypto_pwhash_argon2i_bytes_max"]=wasmExports["Wd"];Module["_crypto_pwhash_argon2i_passwd_min"]=wasmExports["Xd"];Module["_crypto_pwhash_argon2i_passwd_max"]=wasmExports["Yd"];Module["_crypto_pwhash_argon2i_saltbytes"]=wasmExports["Zd"];Module["_crypto_pwhash_argon2i_strbytes"]=wasmExports["_d"];Module["_crypto_pwhash_argon2i_strprefix"]=wasmExports["$d"];Module["_crypto_pwhash_argon2i_opslimit_min"]=wasmExports["ae"];Module["_crypto_pwhash_argon2i_opslimit_max"]=wasmExports["be"];Module["_crypto_pwhash_argon2i_memlimit_min"]=wasmExports["ce"];Module["_crypto_pwhash_argon2i_memlimit_max"]=wasmExports["de"];Module["_crypto_pwhash_argon2i_opslimit_interactive"]=wasmExports["ee"];Module["_crypto_pwhash_argon2i_memlimit_interactive"]=wasmExports["fe"];Module["_crypto_pwhash_argon2i_opslimit_moderate"]=wasmExports["ge"];Module["_crypto_pwhash_argon2i_memlimit_moderate"]=wasmExports["he"];Module["_crypto_pwhash_argon2i_opslimit_sensitive"]=wasmExports["ie"];Module["_crypto_pwhash_argon2i_memlimit_sensitive"]=wasmExports["je"];Module["_crypto_pwhash_argon2i"]=wasmExports["ke"];Module["_crypto_pwhash_argon2i_str"]=wasmExports["le"];Module["_crypto_pwhash_argon2i_str_verify"]=wasmExports["me"];Module["_crypto_pwhash_argon2i_str_needs_rehash"]=wasmExports["ne"];Module["_crypto_pwhash_argon2id_str_needs_rehash"]=wasmExports["oe"];Module["_crypto_pwhash_argon2id_alg_argon2id13"]=wasmExports["pe"];Module["_crypto_pwhash_argon2id_bytes_min"]=wasmExports["qe"];Module["_crypto_pwhash_argon2id_bytes_max"]=wasmExports["re"];Module["_crypto_pwhash_argon2id_passwd_min"]=wasmExports["se"];Module["_crypto_pwhash_argon2id_passwd_max"]=wasmExports["te"];Module["_crypto_pwhash_argon2id_saltbytes"]=wasmExports["ue"];Module["_crypto_pwhash_argon2id_strbytes"]=wasmExports["ve"];Module["_crypto_pwhash_argon2id_strprefix"]=wasmExports["we"];Module["_crypto_pwhash_argon2id_opslimit_min"]=wasmExports["xe"];Module["_crypto_pwhash_argon2id_opslimit_max"]=wasmExports["ye"];Module["_crypto_pwhash_argon2id_memlimit_min"]=wasmExports["ze"];Module["_crypto_pwhash_argon2id_memlimit_max"]=wasmExports["Ae"];Module["_crypto_pwhash_argon2id_opslimit_interactive"]=wasmExports["Be"];Module["_crypto_pwhash_argon2id_memlimit_interactive"]=wasmExports["Ce"];Module["_crypto_pwhash_argon2id_opslimit_moderate"]=wasmExports["De"];Module["_crypto_pwhash_argon2id_memlimit_moderate"]=wasmExports["Ee"];Module["_crypto_pwhash_argon2id_opslimit_sensitive"]=wasmExports["Fe"];Module["_crypto_pwhash_argon2id_memlimit_sensitive"]=wasmExports["Ge"];Module["_crypto_pwhash_argon2id"]=wasmExports["He"];Module["_crypto_pwhash_argon2id_str"]=wasmExports["Ie"];Module["_crypto_pwhash_argon2id_str_verify"]=wasmExports["Je"];Module["_crypto_pwhash_alg_argon2i13"]=wasmExports["Ke"];Module["_crypto_pwhash_alg_argon2id13"]=wasmExports["Le"];Module["_crypto_pwhash_alg_default"]=wasmExports["Me"];Module["_crypto_pwhash_bytes_min"]=wasmExports["Ne"];Module["_crypto_pwhash_bytes_max"]=wasmExports["Oe"];Module["_crypto_pwhash_passwd_min"]=wasmExports["Pe"];Module["_crypto_pwhash_passwd_max"]=wasmExports["Qe"];Module["_crypto_pwhash_saltbytes"]=wasmExports["Re"];Module["_crypto_pwhash_strbytes"]=wasmExports["Se"];Module["_crypto_pwhash_strprefix"]=wasmExports["Te"];Module["_crypto_pwhash_opslimit_min"]=wasmExports["Ue"];Module["_crypto_pwhash_opslimit_max"]=wasmExports["Ve"];Module["_crypto_pwhash_memlimit_min"]=wasmExports["We"];Module["_crypto_pwhash_memlimit_max"]=wasmExports["Xe"];Module["_crypto_pwhash_opslimit_interactive"]=wasmExports["Ye"];Module["_crypto_pwhash_memlimit_interactive"]=wasmExports["Ze"];Module["_crypto_pwhash_opslimit_moderate"]=wasmExports["_e"];Module["_crypto_pwhash_memlimit_moderate"]=wasmExports["$e"];Module["_crypto_pwhash_opslimit_sensitive"]=wasmExports["af"];Module["_crypto_pwhash_memlimit_sensitive"]=wasmExports["bf"];Module["_crypto_pwhash"]=wasmExports["cf"];Module["_crypto_pwhash_str"]=wasmExports["df"];Module["_crypto_pwhash_str_alg"]=wasmExports["ef"];Module["_crypto_pwhash_str_verify"]=wasmExports["ff"];Module["_crypto_pwhash_str_needs_rehash"]=wasmExports["gf"];Module["_crypto_pwhash_primitive"]=wasmExports["hf"];Module["_crypto_scalarmult_primitive"]=wasmExports["jf"];Module["_crypto_scalarmult_base"]=wasmExports["kf"];Module["_crypto_scalarmult"]=wasmExports["lf"];Module["_crypto_scalarmult_bytes"]=wasmExports["mf"];Module["_crypto_scalarmult_scalarbytes"]=wasmExports["nf"];Module["_crypto_scalarmult_curve25519"]=wasmExports["of"];Module["_crypto_scalarmult_curve25519_base"]=wasmExports["pf"];Module["_crypto_scalarmult_curve25519_bytes"]=wasmExports["qf"];Module["_crypto_scalarmult_curve25519_scalarbytes"]=wasmExports["rf"];Module["_crypto_secretbox_keybytes"]=wasmExports["sf"];Module["_crypto_secretbox_noncebytes"]=wasmExports["tf"];Module["_crypto_secretbox_zerobytes"]=wasmExports["uf"];Module["_crypto_secretbox_boxzerobytes"]=wasmExports["vf"];Module["_crypto_secretbox_macbytes"]=wasmExports["wf"];Module["_crypto_secretbox_messagebytes_max"]=wasmExports["xf"];Module["_crypto_secretbox_primitive"]=wasmExports["yf"];Module["_crypto_secretbox"]=wasmExports["zf"];Module["_crypto_secretbox_open"]=wasmExports["Af"];Module["_crypto_secretbox_keygen"]=wasmExports["Bf"];Module["_crypto_secretbox_detached"]=wasmExports["Cf"];Module["_crypto_secretbox_easy"]=wasmExports["Df"];Module["_crypto_secretbox_open_detached"]=wasmExports["Ef"];Module["_crypto_secretbox_open_easy"]=wasmExports["Ff"];Module["_crypto_secretbox_xsalsa20poly1305"]=wasmExports["Gf"];Module["_crypto_secretbox_xsalsa20poly1305_open"]=wasmExports["Hf"];Module["_crypto_secretbox_xsalsa20poly1305_keybytes"]=wasmExports["If"];Module["_crypto_secretbox_xsalsa20poly1305_noncebytes"]=wasmExports["Jf"];Module["_crypto_secretbox_xsalsa20poly1305_zerobytes"]=wasmExports["Kf"];Module["_crypto_secretbox_xsalsa20poly1305_boxzerobytes"]=wasmExports["Lf"];Module["_crypto_secretbox_xsalsa20poly1305_macbytes"]=wasmExports["Mf"];Module["_crypto_secretbox_xsalsa20poly1305_messagebytes_max"]=wasmExports["Nf"];Module["_crypto_secretbox_xsalsa20poly1305_keygen"]=wasmExports["Of"];Module["_crypto_secretstream_xchacha20poly1305_keygen"]=wasmExports["Pf"];Module["_crypto_secretstream_xchacha20poly1305_init_push"]=wasmExports["Qf"];Module["_crypto_secretstream_xchacha20poly1305_init_pull"]=wasmExports["Rf"];Module["_crypto_secretstream_xchacha20poly1305_rekey"]=wasmExports["Sf"];Module["_crypto_secretstream_xchacha20poly1305_push"]=wasmExports["Tf"];Module["_crypto_secretstream_xchacha20poly1305_pull"]=wasmExports["Uf"];Module["_crypto_secretstream_xchacha20poly1305_statebytes"]=wasmExports["Vf"];Module["_crypto_secretstream_xchacha20poly1305_abytes"]=wasmExports["Wf"];Module["_crypto_secretstream_xchacha20poly1305_headerbytes"]=wasmExports["Xf"];Module["_crypto_secretstream_xchacha20poly1305_keybytes"]=wasmExports["Yf"];Module["_crypto_secretstream_xchacha20poly1305_messagebytes_max"]=wasmExports["Zf"];Module["_crypto_secretstream_xchacha20poly1305_tag_message"]=wasmExports["_f"];Module["_crypto_secretstream_xchacha20poly1305_tag_push"]=wasmExports["$f"];Module["_crypto_secretstream_xchacha20poly1305_tag_rekey"]=wasmExports["ag"];Module["_crypto_secretstream_xchacha20poly1305_tag_final"]=wasmExports["bg"];Module["_crypto_shorthash_bytes"]=wasmExports["cg"];Module["_crypto_shorthash_keybytes"]=wasmExports["dg"];Module["_crypto_shorthash_primitive"]=wasmExports["eg"];Module["_crypto_shorthash"]=wasmExports["fg"];Module["_crypto_shorthash_keygen"]=wasmExports["gg"];Module["_crypto_shorthash_siphash24_bytes"]=wasmExports["hg"];Module["_crypto_shorthash_siphash24_keybytes"]=wasmExports["ig"];Module["_crypto_shorthash_siphash24"]=wasmExports["jg"];Module["_crypto_sign_statebytes"]=wasmExports["kg"];Module["_crypto_sign_bytes"]=wasmExports["lg"];Module["_crypto_sign_seedbytes"]=wasmExports["mg"];Module["_crypto_sign_publickeybytes"]=wasmExports["ng"];Module["_crypto_sign_secretkeybytes"]=wasmExports["og"];Module["_crypto_sign_messagebytes_max"]=wasmExports["pg"];Module["_crypto_sign_primitive"]=wasmExports["qg"];Module["_crypto_sign_seed_keypair"]=wasmExports["rg"];Module["_crypto_sign_keypair"]=wasmExports["sg"];Module["_crypto_sign"]=wasmExports["tg"];Module["_crypto_sign_open"]=wasmExports["ug"];Module["_crypto_sign_detached"]=wasmExports["vg"];Module["_crypto_sign_verify_detached"]=wasmExports["wg"];Module["_crypto_sign_init"]=wasmExports["xg"];Module["_crypto_sign_update"]=wasmExports["yg"];Module["_crypto_sign_final_create"]=wasmExports["zg"];Module["_crypto_sign_final_verify"]=wasmExports["Ag"];Module["_crypto_sign_ed25519ph_statebytes"]=wasmExports["Bg"];Module["_crypto_sign_ed25519_bytes"]=wasmExports["Cg"];Module["_crypto_sign_ed25519_seedbytes"]=wasmExports["Dg"];Module["_crypto_sign_ed25519_publickeybytes"]=wasmExports["Eg"];Module["_crypto_sign_ed25519_secretkeybytes"]=wasmExports["Fg"];Module["_crypto_sign_ed25519_messagebytes_max"]=wasmExports["Gg"];Module["_crypto_sign_ed25519_sk_to_seed"]=wasmExports["Hg"];Module["_crypto_sign_ed25519_sk_to_pk"]=wasmExports["Ig"];Module["_crypto_sign_ed25519ph_init"]=wasmExports["Jg"];Module["_crypto_sign_ed25519ph_update"]=wasmExports["Kg"];Module["_crypto_sign_ed25519ph_final_create"]=wasmExports["Lg"];Module["_crypto_sign_ed25519ph_final_verify"]=wasmExports["Mg"];Module["_crypto_sign_ed25519_seed_keypair"]=wasmExports["Ng"];Module["_crypto_sign_ed25519_keypair"]=wasmExports["Og"];Module["_crypto_sign_ed25519_pk_to_curve25519"]=wasmExports["Pg"];Module["_crypto_sign_ed25519_sk_to_curve25519"]=wasmExports["Qg"];Module["_crypto_sign_ed25519_verify_detached"]=wasmExports["Rg"];Module["_crypto_sign_ed25519_open"]=wasmExports["Sg"];Module["_crypto_sign_ed25519_detached"]=wasmExports["Tg"];Module["_crypto_sign_ed25519"]=wasmExports["Ug"];Module["_crypto_stream_chacha20_keybytes"]=wasmExports["Vg"];Module["_crypto_stream_chacha20_noncebytes"]=wasmExports["Wg"];Module["_crypto_stream_chacha20_messagebytes_max"]=wasmExports["Xg"];Module["_crypto_stream_chacha20_ietf_keybytes"]=wasmExports["Yg"];Module["_crypto_stream_chacha20_ietf_noncebytes"]=wasmExports["Zg"];Module["_crypto_stream_chacha20_ietf_messagebytes_max"]=wasmExports["_g"];Module["_crypto_stream_chacha20"]=wasmExports["$g"];Module["_crypto_stream_chacha20_xor_ic"]=wasmExports["ah"];Module["_crypto_stream_chacha20_xor"]=wasmExports["bh"];Module["_crypto_stream_chacha20_ietf"]=wasmExports["ch"];Module["_crypto_stream_chacha20_ietf_xor_ic"]=wasmExports["dh"];Module["_crypto_stream_chacha20_ietf_xor"]=wasmExports["eh"];Module["_crypto_stream_chacha20_ietf_keygen"]=wasmExports["fh"];Module["_crypto_stream_chacha20_keygen"]=wasmExports["gh"];Module["_crypto_stream_keybytes"]=wasmExports["hh"];Module["_crypto_stream_noncebytes"]=wasmExports["ih"];Module["_crypto_stream_messagebytes_max"]=wasmExports["jh"];Module["_crypto_stream_primitive"]=wasmExports["kh"];Module["_crypto_stream"]=wasmExports["lh"];Module["_crypto_stream_xor"]=wasmExports["mh"];Module["_crypto_stream_keygen"]=wasmExports["nh"];Module["_crypto_stream_salsa20_keybytes"]=wasmExports["oh"];Module["_crypto_stream_salsa20_noncebytes"]=wasmExports["ph"];Module["_crypto_stream_salsa20_messagebytes_max"]=wasmExports["qh"];Module["_crypto_stream_salsa20"]=wasmExports["rh"];Module["_crypto_stream_salsa20_xor_ic"]=wasmExports["sh"];Module["_crypto_stream_salsa20_xor"]=wasmExports["th"];Module["_crypto_stream_salsa20_keygen"]=wasmExports["uh"];Module["_crypto_stream_xsalsa20"]=wasmExports["vh"];Module["_crypto_stream_xsalsa20_xor_ic"]=wasmExports["wh"];Module["_crypto_stream_xsalsa20_xor"]=wasmExports["xh"];Module["_crypto_stream_xsalsa20_keybytes"]=wasmExports["yh"];Module["_crypto_stream_xsalsa20_noncebytes"]=wasmExports["zh"];Module["_crypto_stream_xsalsa20_messagebytes_max"]=wasmExports["Ah"];Module["_crypto_stream_xsalsa20_keygen"]=wasmExports["Bh"];Module["_crypto_verify_16_bytes"]=wasmExports["Ch"];Module["_crypto_verify_32_bytes"]=wasmExports["Dh"];Module["_crypto_verify_64_bytes"]=wasmExports["Eh"];Module["_crypto_verify_16"]=wasmExports["Fh"];Module["_crypto_verify_32"]=wasmExports["Gh"];Module["_crypto_verify_64"]=wasmExports["Hh"];Module["_randombytes_implementation_name"]=wasmExports["Ih"];Module["_randombytes_random"]=wasmExports["Jh"];Module["_randombytes_stir"]=wasmExports["Kh"];Module["_randombytes_uniform"]=wasmExports["Lh"];Module["_randombytes_buf"]=wasmExports["Mh"];Module["_randombytes_buf_deterministic"]=wasmExports["Nh"];Module["_randombytes_seedbytes"]=wasmExports["Oh"];Module["_randombytes_close"]=wasmExports["Ph"];Module["_randombytes"]=wasmExports["Qh"];Module["_sodium_bin2hex"]=wasmExports["Rh"];Module["_sodium_hex2bin"]=wasmExports["Sh"];Module["_sodium_base64_encoded_len"]=wasmExports["Th"];Module["_sodium_bin2base64"]=wasmExports["Uh"];Module["_sodium_base642bin"]=wasmExports["Vh"];Module["_sodium_init"]=wasmExports["Wh"];Module["_sodium_pad"]=wasmExports["Xh"];Module["_sodium_unpad"]=wasmExports["Yh"];Module["_sodium_version_string"]=wasmExports["Zh"];Module["_sodium_library_version_major"]=wasmExports["_h"];Module["_sodium_library_version_minor"]=wasmExports["$h"];Module["_sodium_library_minimal"]=wasmExports["ai"];Module["_crypto_box_curve25519xchacha20poly1305_seed_keypair"]=wasmExports["bi"];Module["_crypto_box_curve25519xchacha20poly1305_keypair"]=wasmExports["ci"];Module["_crypto_box_curve25519xchacha20poly1305_beforenm"]=wasmExports["di"];Module["_crypto_box_curve25519xchacha20poly1305_detached_afternm"]=wasmExports["ei"];Module["_crypto_box_curve25519xchacha20poly1305_detached"]=wasmExports["fi"];Module["_crypto_box_curve25519xchacha20poly1305_easy_afternm"]=wasmExports["gi"];Module["_crypto_box_curve25519xchacha20poly1305_easy"]=wasmExports["hi"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached_afternm"]=wasmExports["ii"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached"]=wasmExports["ji"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy_afternm"]=wasmExports["ki"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy"]=wasmExports["li"];Module["_crypto_box_curve25519xchacha20poly1305_seedbytes"]=wasmExports["mi"];Module["_crypto_box_curve25519xchacha20poly1305_publickeybytes"]=wasmExports["ni"];Module["_crypto_box_curve25519xchacha20poly1305_secretkeybytes"]=wasmExports["oi"];Module["_crypto_box_curve25519xchacha20poly1305_beforenmbytes"]=wasmExports["pi"];Module["_crypto_box_curve25519xchacha20poly1305_noncebytes"]=wasmExports["qi"];Module["_crypto_box_curve25519xchacha20poly1305_macbytes"]=wasmExports["ri"];Module["_crypto_box_curve25519xchacha20poly1305_messagebytes_max"]=wasmExports["si"];Module["_crypto_box_curve25519xchacha20poly1305_seal"]=wasmExports["ti"];Module["_crypto_box_curve25519xchacha20poly1305_seal_open"]=wasmExports["ui"];Module["_crypto_box_curve25519xchacha20poly1305_sealbytes"]=wasmExports["vi"];Module["_crypto_core_ed25519_is_valid_point"]=wasmExports["wi"];Module["_crypto_core_ed25519_add"]=wasmExports["xi"];Module["_crypto_core_ed25519_sub"]=wasmExports["yi"];Module["_crypto_core_ed25519_from_uniform"]=wasmExports["zi"];Module["_crypto_core_ed25519_random"]=wasmExports["Ai"];Module["_crypto_core_ed25519_scalar_random"]=wasmExports["Bi"];Module["_crypto_core_ed25519_scalar_invert"]=wasmExports["Ci"];Module["_crypto_core_ed25519_scalar_negate"]=wasmExports["Di"];Module["_crypto_core_ed25519_scalar_complement"]=wasmExports["Ei"];Module["_crypto_core_ed25519_scalar_add"]=wasmExports["Fi"];Module["_crypto_core_ed25519_scalar_reduce"]=wasmExports["Gi"];Module["_crypto_core_ed25519_scalar_sub"]=wasmExports["Hi"];Module["_crypto_core_ed25519_scalar_mul"]=wasmExports["Ii"];Module["_crypto_core_ed25519_bytes"]=wasmExports["Ji"];Module["_crypto_core_ed25519_nonreducedscalarbytes"]=wasmExports["Ki"];Module["_crypto_core_ed25519_uniformbytes"]=wasmExports["Li"];Module["_crypto_core_ed25519_hashbytes"]=wasmExports["Mi"];Module["_crypto_core_ed25519_scalarbytes"]=wasmExports["Ni"];Module["_crypto_core_ristretto255_is_valid_point"]=wasmExports["Oi"];Module["_crypto_core_ristretto255_add"]=wasmExports["Pi"];Module["_crypto_core_ristretto255_sub"]=wasmExports["Qi"];Module["_crypto_core_ristretto255_from_hash"]=wasmExports["Ri"];Module["_crypto_core_ristretto255_random"]=wasmExports["Si"];Module["_crypto_core_ristretto255_scalar_random"]=wasmExports["Ti"];Module["_crypto_core_ristretto255_scalar_invert"]=wasmExports["Ui"];Module["_crypto_core_ristretto255_scalar_negate"]=wasmExports["Vi"];Module["_crypto_core_ristretto255_scalar_complement"]=wasmExports["Wi"];Module["_crypto_core_ristretto255_scalar_add"]=wasmExports["Xi"];Module["_crypto_core_ristretto255_scalar_sub"]=wasmExports["Yi"];Module["_crypto_core_ristretto255_scalar_mul"]=wasmExports["Zi"];Module["_crypto_core_ristretto255_scalar_reduce"]=wasmExports["_i"];Module["_crypto_core_ristretto255_bytes"]=wasmExports["$i"];Module["_crypto_core_ristretto255_nonreducedscalarbytes"]=wasmExports["aj"];Module["_crypto_core_ristretto255_hashbytes"]=wasmExports["bj"];Module["_crypto_core_ristretto255_scalarbytes"]=wasmExports["cj"];Module["_crypto_pwhash_scryptsalsa208sha256_ll"]=wasmExports["dj"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_min"]=wasmExports["ej"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_max"]=wasmExports["fj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_min"]=wasmExports["gj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_max"]=wasmExports["hj"];Module["_crypto_pwhash_scryptsalsa208sha256_saltbytes"]=wasmExports["ij"];Module["_crypto_pwhash_scryptsalsa208sha256_strbytes"]=wasmExports["jj"];Module["_crypto_pwhash_scryptsalsa208sha256_strprefix"]=wasmExports["kj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_min"]=wasmExports["lj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_max"]=wasmExports["mj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_min"]=wasmExports["nj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_max"]=wasmExports["oj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"]=wasmExports["pj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"]=wasmExports["qj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"]=wasmExports["rj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"]=wasmExports["sj"];Module["_crypto_pwhash_scryptsalsa208sha256"]=wasmExports["tj"];Module["_crypto_pwhash_scryptsalsa208sha256_str"]=wasmExports["uj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_verify"]=wasmExports["vj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_needs_rehash"]=wasmExports["wj"];Module["_crypto_scalarmult_ed25519"]=wasmExports["xj"];Module["_crypto_scalarmult_ed25519_noclamp"]=wasmExports["yj"];Module["_crypto_scalarmult_ed25519_base"]=wasmExports["zj"];Module["_crypto_scalarmult_ed25519_base_noclamp"]=wasmExports["Aj"];Module["_crypto_scalarmult_ed25519_bytes"]=wasmExports["Bj"];Module["_crypto_scalarmult_ed25519_scalarbytes"]=wasmExports["Cj"];Module["_crypto_scalarmult_ristretto255"]=wasmExports["Dj"];Module["_crypto_scalarmult_ristretto255_base"]=wasmExports["Ej"];Module["_crypto_scalarmult_ristretto255_bytes"]=wasmExports["Fj"];Module["_crypto_scalarmult_ristretto255_scalarbytes"]=wasmExports["Gj"];Module["_crypto_secretbox_xchacha20poly1305_detached"]=wasmExports["Hj"];Module["_crypto_secretbox_xchacha20poly1305_easy"]=wasmExports["Ij"];Module["_crypto_secretbox_xchacha20poly1305_open_detached"]=wasmExports["Jj"];Module["_crypto_secretbox_xchacha20poly1305_open_easy"]=wasmExports["Kj"];Module["_crypto_secretbox_xchacha20poly1305_keybytes"]=wasmExports["Lj"];Module["_crypto_secretbox_xchacha20poly1305_noncebytes"]=wasmExports["Mj"];Module["_crypto_secretbox_xchacha20poly1305_macbytes"]=wasmExports["Nj"];Module["_crypto_secretbox_xchacha20poly1305_messagebytes_max"]=wasmExports["Oj"];Module["_crypto_shorthash_siphashx24_bytes"]=wasmExports["Pj"];Module["_crypto_shorthash_siphashx24_keybytes"]=wasmExports["Qj"];Module["_crypto_shorthash_siphashx24"]=wasmExports["Rj"];Module["_crypto_stream_salsa2012"]=wasmExports["Sj"];Module["_crypto_stream_salsa2012_xor"]=wasmExports["Tj"];Module["_crypto_stream_salsa2012_keybytes"]=wasmExports["Uj"];Module["_crypto_stream_salsa2012_noncebytes"]=wasmExports["Vj"];Module["_crypto_stream_salsa2012_messagebytes_max"]=wasmExports["Wj"];Module["_crypto_stream_salsa2012_keygen"]=wasmExports["Xj"];Module["_crypto_stream_salsa208"]=wasmExports["Yj"];Module["_crypto_stream_salsa208_xor"]=wasmExports["Zj"];Module["_crypto_stream_salsa208_keybytes"]=wasmExports["_j"];Module["_crypto_stream_salsa208_noncebytes"]=wasmExports["$j"];Module["_crypto_stream_salsa208_messagebytes_max"]=wasmExports["ak"];Module["_crypto_stream_salsa208_keygen"]=wasmExports["bk"];Module["_crypto_stream_xchacha20_keybytes"]=wasmExports["ck"];Module["_crypto_stream_xchacha20_noncebytes"]=wasmExports["dk"];Module["_crypto_stream_xchacha20_messagebytes_max"]=wasmExports["ek"];Module["_crypto_stream_xchacha20"]=wasmExports["fk"];Module["_crypto_stream_xchacha20_xor_ic"]=wasmExports["gk"];Module["_crypto_stream_xchacha20_xor"]=wasmExports["hk"];Module["_crypto_stream_xchacha20_keygen"]=wasmExports["ik"];Module["_malloc"]=wasmExports["jk"];Module["_free"]=wasmExports["kk"];wasmExports["dynCall_iiiji"];wasmExports["dynCall_iiij"];wasmExports["dynCall_iijii"];wasmExports["dynCall_iiijiji"];wasmExports["dynCall_iiijiii"];wasmMemory=wasmExports["e"];wasmExports["__indirect_function_table"];}var wasmImports={b:___assert_fail,c:__abort_js,a:_emscripten_asm_const_int,d:_emscripten_resize_heap};function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;Module["onRuntimeInitialized"]?.();postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun();},1);}else {doRun();}}var wasmExports;createWasm();run(); + }).catch(function() { + return _Module.useBackupModule(); + }); +var e = Module; + +let a;const r={},t=e.ready.then(function(){function t(){if(a._sodium_init()<0)throw new Error("libsodium was not correctly initialized.");for(var e=["crypto_aead_aegis128l_decrypt","crypto_aead_aegis128l_decrypt_detached","crypto_aead_aegis128l_encrypt","crypto_aead_aegis128l_encrypt_detached","crypto_aead_aegis128l_keygen","crypto_aead_aegis256_decrypt","crypto_aead_aegis256_decrypt_detached","crypto_aead_aegis256_encrypt","crypto_aead_aegis256_encrypt_detached","crypto_aead_aegis256_keygen","crypto_aead_chacha20poly1305_decrypt","crypto_aead_chacha20poly1305_decrypt_detached","crypto_aead_chacha20poly1305_encrypt","crypto_aead_chacha20poly1305_encrypt_detached","crypto_aead_chacha20poly1305_ietf_decrypt","crypto_aead_chacha20poly1305_ietf_decrypt_detached","crypto_aead_chacha20poly1305_ietf_encrypt","crypto_aead_chacha20poly1305_ietf_encrypt_detached","crypto_aead_chacha20poly1305_ietf_keygen","crypto_aead_chacha20poly1305_keygen","crypto_aead_xchacha20poly1305_ietf_decrypt","crypto_aead_xchacha20poly1305_ietf_decrypt_detached","crypto_aead_xchacha20poly1305_ietf_encrypt","crypto_aead_xchacha20poly1305_ietf_encrypt_detached","crypto_aead_xchacha20poly1305_ietf_keygen","crypto_auth","crypto_auth_hmacsha256","crypto_auth_hmacsha256_final","crypto_auth_hmacsha256_init","crypto_auth_hmacsha256_keygen","crypto_auth_hmacsha256_update","crypto_auth_hmacsha256_verify","crypto_auth_hmacsha512","crypto_auth_hmacsha512256","crypto_auth_hmacsha512256_final","crypto_auth_hmacsha512256_init","crypto_auth_hmacsha512256_keygen","crypto_auth_hmacsha512256_update","crypto_auth_hmacsha512256_verify","crypto_auth_hmacsha512_final","crypto_auth_hmacsha512_init","crypto_auth_hmacsha512_keygen","crypto_auth_hmacsha512_update","crypto_auth_hmacsha512_verify","crypto_auth_keygen","crypto_auth_verify","crypto_box_beforenm","crypto_box_curve25519xchacha20poly1305_beforenm","crypto_box_curve25519xchacha20poly1305_detached","crypto_box_curve25519xchacha20poly1305_detached_afternm","crypto_box_curve25519xchacha20poly1305_easy","crypto_box_curve25519xchacha20poly1305_easy_afternm","crypto_box_curve25519xchacha20poly1305_keypair","crypto_box_curve25519xchacha20poly1305_open_detached","crypto_box_curve25519xchacha20poly1305_open_detached_afternm","crypto_box_curve25519xchacha20poly1305_open_easy","crypto_box_curve25519xchacha20poly1305_open_easy_afternm","crypto_box_curve25519xchacha20poly1305_seal","crypto_box_curve25519xchacha20poly1305_seal_open","crypto_box_curve25519xchacha20poly1305_seed_keypair","crypto_box_detached","crypto_box_easy","crypto_box_easy_afternm","crypto_box_keypair","crypto_box_open_detached","crypto_box_open_easy","crypto_box_open_easy_afternm","crypto_box_seal","crypto_box_seal_open","crypto_box_seed_keypair","crypto_core_ed25519_add","crypto_core_ed25519_from_hash","crypto_core_ed25519_from_uniform","crypto_core_ed25519_is_valid_point","crypto_core_ed25519_random","crypto_core_ed25519_scalar_add","crypto_core_ed25519_scalar_complement","crypto_core_ed25519_scalar_invert","crypto_core_ed25519_scalar_mul","crypto_core_ed25519_scalar_negate","crypto_core_ed25519_scalar_random","crypto_core_ed25519_scalar_reduce","crypto_core_ed25519_scalar_sub","crypto_core_ed25519_sub","crypto_core_hchacha20","crypto_core_hsalsa20","crypto_core_ristretto255_add","crypto_core_ristretto255_from_hash","crypto_core_ristretto255_is_valid_point","crypto_core_ristretto255_random","crypto_core_ristretto255_scalar_add","crypto_core_ristretto255_scalar_complement","crypto_core_ristretto255_scalar_invert","crypto_core_ristretto255_scalar_mul","crypto_core_ristretto255_scalar_negate","crypto_core_ristretto255_scalar_random","crypto_core_ristretto255_scalar_reduce","crypto_core_ristretto255_scalar_sub","crypto_core_ristretto255_sub","crypto_generichash","crypto_generichash_blake2b_salt_personal","crypto_generichash_final","crypto_generichash_init","crypto_generichash_keygen","crypto_generichash_update","crypto_hash","crypto_hash_sha256","crypto_hash_sha256_final","crypto_hash_sha256_init","crypto_hash_sha256_update","crypto_hash_sha512","crypto_hash_sha512_final","crypto_hash_sha512_init","crypto_hash_sha512_update","crypto_kdf_derive_from_key","crypto_kdf_keygen","crypto_kx_client_session_keys","crypto_kx_keypair","crypto_kx_seed_keypair","crypto_kx_server_session_keys","crypto_onetimeauth","crypto_onetimeauth_final","crypto_onetimeauth_init","crypto_onetimeauth_keygen","crypto_onetimeauth_update","crypto_onetimeauth_verify","crypto_pwhash","crypto_pwhash_scryptsalsa208sha256","crypto_pwhash_scryptsalsa208sha256_ll","crypto_pwhash_scryptsalsa208sha256_str","crypto_pwhash_scryptsalsa208sha256_str_verify","crypto_pwhash_str","crypto_pwhash_str_needs_rehash","crypto_pwhash_str_verify","crypto_scalarmult","crypto_scalarmult_base","crypto_scalarmult_ed25519","crypto_scalarmult_ed25519_base","crypto_scalarmult_ed25519_base_noclamp","crypto_scalarmult_ed25519_noclamp","crypto_scalarmult_ristretto255","crypto_scalarmult_ristretto255_base","crypto_secretbox_detached","crypto_secretbox_easy","crypto_secretbox_keygen","crypto_secretbox_open_detached","crypto_secretbox_open_easy","crypto_secretstream_xchacha20poly1305_init_pull","crypto_secretstream_xchacha20poly1305_init_push","crypto_secretstream_xchacha20poly1305_keygen","crypto_secretstream_xchacha20poly1305_pull","crypto_secretstream_xchacha20poly1305_push","crypto_secretstream_xchacha20poly1305_rekey","crypto_shorthash","crypto_shorthash_keygen","crypto_shorthash_siphashx24","crypto_sign","crypto_sign_detached","crypto_sign_ed25519_pk_to_curve25519","crypto_sign_ed25519_sk_to_curve25519","crypto_sign_ed25519_sk_to_pk","crypto_sign_ed25519_sk_to_seed","crypto_sign_final_create","crypto_sign_final_verify","crypto_sign_init","crypto_sign_keypair","crypto_sign_open","crypto_sign_seed_keypair","crypto_sign_update","crypto_sign_verify_detached","crypto_stream_chacha20","crypto_stream_chacha20_ietf_xor","crypto_stream_chacha20_ietf_xor_ic","crypto_stream_chacha20_keygen","crypto_stream_chacha20_xor","crypto_stream_chacha20_xor_ic","crypto_stream_keygen","crypto_stream_xchacha20_keygen","crypto_stream_xchacha20_xor","crypto_stream_xchacha20_xor_ic","randombytes_buf","randombytes_buf_deterministic","randombytes_close","randombytes_random","randombytes_set_implementation","randombytes_stir","randombytes_uniform","sodium_version_string"],t=[x,k,S,T,w,Y,B,A,M,I,K,N,L,O,U,C,P,R,X,G,D,F,V,H,W,q,z,j,J,Q,Z,$,ee,ae,re,te,_e,ne,se,ce,he,oe,pe,ye,ie,le,ue,de,ve,ge,be,fe,me,Ee,xe,ke,Se,Te,we,Ye,Be,Ae,Me,Ie,Ke,Ne,Le,Oe,Ue,Ce,Pe,Re,Xe,Ge,De,Fe,Ve,He,We,qe,ze,je,Je,Qe,Ze,$e,ea,aa,ra,ta,_a,na,sa,ca,ha,oa,pa,ya,ia,la,ua,da,va,ga,ba,fa,ma,Ea,xa,ka,Sa,Ta,wa,Ya,Ba,Aa,Ma,Ia,Ka,Na,La,Oa,Ua,Ca,Pa,Ra,Xa,Ga,Da,Fa,Va,Ha,Wa,qa,za,ja,Ja,Qa,Za,$a,er,ar,rr,tr,_r,nr,sr,cr,hr,or,pr,yr,ir,lr,ur,dr,vr,gr,br,fr,mr,Er,xr,kr,Sr,Tr,wr,Yr,Br,Ar,Mr,Ir,Kr,Nr,Lr,Or,Ur,Cr,Pr,Rr,Xr,Gr,Dr,Fr,Vr,Hr,Wr,qr],_=0;_=240?(p=4,h=true):y>=224?(p=3,h=true):y>=192?(p=2,h=true):y<128&&(p=1,h=true);}while(!h);for(var i=p-(c.length-o),l=0;l>8&-39)<<8|87+(a=e[n]>>>4)+(a-10>>8&-39),_+=String.fromCharCode(255&t)+String.fromCharCode(t>>>8);return _}var c={ORIGINAL:1,ORIGINAL_NO_PADDING:3,URLSAFE:5,URLSAFE_NO_PADDING:7};function h(e){if(void 0===e)return c.URLSAFE_NO_PADDING;if(e!==c.ORIGINAL&&e!==c.ORIGINAL_NO_PADDING&&e!==c.URLSAFE&&e!==c.URLSAFE_NO_PADDING)throw new Error("unsupported base64 variant");return e}function o(e,r){r=h(r);var t=[];e=E(t,e,"input");var _,s=0|Math.floor(e.length/3),c=e.length-3*s,o=4*s+(0!==c?2&r?2+(c>>>1):4:0),p=new l(o+1),y=u(e);return t.push(y),t.push(p.address),0===a._sodium_bin2base64(p.address,p.length,y,e.length,r)&&b(t,"conversion failed"),p.length=o,_=n(p.to_Uint8Array()),g(t),_}function p(e,a){var r=a||"uint8array";if(!y(r))throw new Error(r+" output format is not available");if(e instanceof l){if("uint8array"===r)return e.to_Uint8Array();if("text"===r)return n(e.to_Uint8Array());if("hex"===r)return s(e.to_Uint8Array());if("base64"===r)return o(e.to_Uint8Array(),c.URLSAFE_NO_PADDING);throw new Error('What is output format "'+r+'"?')}if("object"==typeof e){for(var t=Object.keys(e),_={},h=0;h=BigInt(0)){const e=r>>BigInt(32);e>BigInt(4294967295)&&f(c,"subkey_id cannot be more than 64 bits"),o=Number(e),h=Number(r&BigInt(4294967295));}else "number"==typeof r&&(0|r)===r&&r>=0?h=r:f(c,"subkey_id must be an unsigned integer or bigint");"string"!=typeof t&&f(c,"ctx must be a string"),(t=_(t+"\0")).length-1!==a._crypto_kdf_contextbytes()&&f(c,"invalid ctx length");var y=u(t);t.length,c.push(y),n=E(c,n,"key");var d,v=0|a._crypto_kdf_keybytes();n.length!==v&&f(c,"invalid key length"),d=u(n),c.push(d);var b=new l(0|e),x=b.address;c.push(x),a._crypto_kdf_derive_from_key(x,e,h,o,y,d);var k=p(b,s);return g(c),k}function Aa(e){var r=[];i(e);var t=new l(0|a._crypto_kdf_keybytes()),_=t.address;r.push(_),a._crypto_kdf_keygen(_);var n=p(t,e);return g(r),n}function Ma(e,r,t,_){var n=[];i(_),e=E(n,e,"clientPublicKey");var s,c=0|a._crypto_kx_publickeybytes();e.length!==c&&f(n,"invalid clientPublicKey length"),s=u(e),n.push(s),r=E(n,r,"clientSecretKey");var h,o=0|a._crypto_kx_secretkeybytes();r.length!==o&&f(n,"invalid clientSecretKey length"),h=u(r),n.push(h),t=E(n,t,"serverPublicKey");var y,d=0|a._crypto_kx_publickeybytes();t.length!==d&&f(n,"invalid serverPublicKey length"),y=u(t),n.push(y);var v=new l(0|a._crypto_kx_sessionkeybytes()),m=v.address;n.push(m);var x=new l(0|a._crypto_kx_sessionkeybytes()),k=x.address;if(n.push(k),!(0|a._crypto_kx_client_session_keys(m,k,s,h,y))){var S=p({sharedRx:v,sharedTx:x},_);return g(n),S}b(n,"invalid usage");}function Ia(e){var r=[];i(e);var t=new l(0|a._crypto_kx_publickeybytes()),_=t.address;r.push(_);var n=new l(0|a._crypto_kx_secretkeybytes()),s=n.address;if(r.push(s),!(0|a._crypto_kx_keypair(_,s))){var c={publicKey:p(t,e),privateKey:p(n,e),keyType:"x25519"};return g(r),c}b(r,"internal error");}function Ka(e,r){var t=[];i(r),e=E(t,e,"seed");var _,n=0|a._crypto_kx_seedbytes();e.length!==n&&f(t,"invalid seed length"),_=u(e),t.push(_);var s=new l(0|a._crypto_kx_publickeybytes()),c=s.address;t.push(c);var h=new l(0|a._crypto_kx_secretkeybytes()),o=h.address;if(t.push(o),!(0|a._crypto_kx_seed_keypair(c,o,_))){var y={publicKey:p(s,r),privateKey:p(h,r),keyType:"x25519"};return g(t),y}b(t,"internal error");}function Na(e,r,t,_){var n=[];i(_),e=E(n,e,"serverPublicKey");var s,c=0|a._crypto_kx_publickeybytes();e.length!==c&&f(n,"invalid serverPublicKey length"),s=u(e),n.push(s),r=E(n,r,"serverSecretKey");var h,o=0|a._crypto_kx_secretkeybytes();r.length!==o&&f(n,"invalid serverSecretKey length"),h=u(r),n.push(h),t=E(n,t,"clientPublicKey");var y,d=0|a._crypto_kx_publickeybytes();t.length!==d&&f(n,"invalid clientPublicKey length"),y=u(t),n.push(y);var v=new l(0|a._crypto_kx_sessionkeybytes()),m=v.address;n.push(m);var x=new l(0|a._crypto_kx_sessionkeybytes()),k=x.address;if(n.push(k),!(0|a._crypto_kx_server_session_keys(m,k,s,h,y))){var S=p({sharedRx:v,sharedTx:x},_);return g(n),S}b(n,"invalid usage");}function La(e,r,t){var _=[];i(t);var n=u(e=E(_,e,"message")),s=e.length;_.push(n),r=E(_,r,"key");var c,h=0|a._crypto_onetimeauth_keybytes();r.length!==h&&f(_,"invalid key length"),c=u(r),_.push(c);var o=new l(0|a._crypto_onetimeauth_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_onetimeauth(y,n,s,0,c))){var d=p(o,t);return g(_),d}b(_,"invalid usage");}function Oa(e,r){var t=[];i(r),m(t,e,"state_address");var _=new l(0|a._crypto_onetimeauth_bytes()),n=_.address;if(t.push(n),!(0|a._crypto_onetimeauth_final(e,n))){var s=(a._free(e),p(_,r));return g(t),s}b(t,"invalid usage");}function Ua(e,r){var t=[];i(r);var _=null;null!=e&&(_=u(e=E(t,e,"key")),e.length,t.push(_));var n=new l(144).address;if(!(0|a._crypto_onetimeauth_init(n,_))){var s=n;return g(t),s}b(t,"invalid usage");}function Ca(e){var r=[];i(e);var t=new l(0|a._crypto_onetimeauth_keybytes()),_=t.address;r.push(_),a._crypto_onetimeauth_keygen(_);var n=p(t,e);return g(r),n}function Pa(e,r,t){var _=[];i(t),m(_,e,"state_address");var n=u(r=E(_,r,"message_chunk")),s=r.length;_.push(n),0|a._crypto_onetimeauth_update(e,n,s)&&b(_,"invalid usage"),g(_);}function Ra(e,r,t){var _=[];e=E(_,e,"hash");var n,s=0|a._crypto_onetimeauth_bytes();e.length!==s&&f(_,"invalid hash length"),n=u(e),_.push(n);var c=u(r=E(_,r,"message")),h=r.length;_.push(c),t=E(_,t,"key");var o,p=0|a._crypto_onetimeauth_keybytes();t.length!==p&&f(_,"invalid key length"),o=u(t),_.push(o);var y=!(0|a._crypto_onetimeauth_verify(n,c,h,0,o));return g(_),y}function Xa(e,r,t,_,n,s,c){var h=[];i(c),m(h,e,"keyLength"),("number"!=typeof e||(0|e)!==e||e<0)&&f(h,"keyLength must be an unsigned integer");var o=u(r=E(h,r,"password")),y=r.length;h.push(o),t=E(h,t,"salt");var d,v=0|a._crypto_pwhash_saltbytes();t.length!==v&&f(h,"invalid salt length"),d=u(t),h.push(d),m(h,_,"opsLimit"),("number"!=typeof _||(0|_)!==_||_<0)&&f(h,"opsLimit must be an unsigned integer"),m(h,n,"memLimit"),("number"!=typeof n||(0|n)!==n||n<0)&&f(h,"memLimit must be an unsigned integer"),m(h,s,"algorithm"),("number"!=typeof s||(0|s)!==s||s<0)&&f(h,"algorithm must be an unsigned integer");var x=new l(0|e),k=x.address;if(h.push(k),!(0|a._crypto_pwhash(k,e,0,o,y,0,d,_,0,n,s))){var S=p(x,c);return g(h),S}b(h,"invalid usage");}function Ga(e,r,t,_,n,s){var c=[];i(s),m(c,e,"keyLength"),("number"!=typeof e||(0|e)!==e||e<0)&&f(c,"keyLength must be an unsigned integer");var h=u(r=E(c,r,"password")),o=r.length;c.push(h),t=E(c,t,"salt");var y,d=0|a._crypto_pwhash_scryptsalsa208sha256_saltbytes();t.length!==d&&f(c,"invalid salt length"),y=u(t),c.push(y),m(c,_,"opsLimit"),("number"!=typeof _||(0|_)!==_||_<0)&&f(c,"opsLimit must be an unsigned integer"),m(c,n,"memLimit"),("number"!=typeof n||(0|n)!==n||n<0)&&f(c,"memLimit must be an unsigned integer");var v=new l(0|e),x=v.address;if(c.push(x),!(0|a._crypto_pwhash_scryptsalsa208sha256(x,e,0,h,o,0,y,_,0,n))){var k=p(v,s);return g(c),k}b(c,"invalid usage");}function Da(e,r,t,_,n,s,c){var h=[];i(c);var o=u(e=E(h,e,"password")),y=e.length;h.push(o);var d=u(r=E(h,r,"salt")),v=r.length;h.push(d),m(h,t,"opsLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(h,"opsLimit must be an unsigned integer"),m(h,_,"r"),("number"!=typeof _||(0|_)!==_||_<0)&&f(h,"r must be an unsigned integer"),m(h,n,"p"),("number"!=typeof n||(0|n)!==n||n<0)&&f(h,"p must be an unsigned integer"),m(h,s,"keyLength"),("number"!=typeof s||(0|s)!==s||s<0)&&f(h,"keyLength must be an unsigned integer");var x=new l(0|s),k=x.address;if(h.push(k),!(0|a._crypto_pwhash_scryptsalsa208sha256_ll(o,y,d,v,t,0,_,n,k,s))){var S=p(x,c);return g(h),S}b(h,"invalid usage");}function Fa(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"password")),c=e.length;n.push(s),m(n,r,"opsLimit"),("number"!=typeof r||(0|r)!==r||r<0)&&f(n,"opsLimit must be an unsigned integer"),m(n,t,"memLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(n,"memLimit must be an unsigned integer");var h=new l(0|a._crypto_pwhash_scryptsalsa208sha256_strbytes()).address;if(n.push(h),!(0|a._crypto_pwhash_scryptsalsa208sha256_str(h,s,c,0,r,0,t))){var o=a.UTF8ToString(h);return g(n),o}b(n,"invalid usage");}function Va(e,r,t){var n=[];i(t),"string"!=typeof e&&f(n,"hashed_password must be a string");var s=u(e=_(e+"\0"));e.length,n.push(s);var c=u(r=E(n,r,"password")),h=r.length;n.push(c);var o=!(0|a._crypto_pwhash_scryptsalsa208sha256_str_verify(s,c,h,0));return g(n),o}function Ha(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"password")),c=e.length;n.push(s),m(n,r,"opsLimit"),("number"!=typeof r||(0|r)!==r||r<0)&&f(n,"opsLimit must be an unsigned integer"),m(n,t,"memLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(n,"memLimit must be an unsigned integer");var h=new l(0|a._crypto_pwhash_strbytes()).address;if(n.push(h),!(0|a._crypto_pwhash_str(h,s,c,0,r,0,t))){var o=a.UTF8ToString(h);return g(n),o}b(n,"invalid usage");}function Wa(e,r,t,n){var s=[];i(n),"string"!=typeof e&&f(s,"hashed_password must be a string");var c=u(e=_(e+"\0"));e.length,s.push(c),m(s,r,"opsLimit"),("number"!=typeof r||(0|r)!==r||r<0)&&f(s,"opsLimit must be an unsigned integer"),m(s,t,"memLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(s,"memLimit must be an unsigned integer");var h=!!(0|a._crypto_pwhash_str_needs_rehash(c,r,0,t));return g(s),h}function qa(e,r,t){var n=[];i(t),"string"!=typeof e&&f(n,"hashed_password must be a string");var s=u(e=_(e+"\0"));e.length,n.push(s);var c=u(r=E(n,r,"password")),h=r.length;n.push(c);var o=!(0|a._crypto_pwhash_str_verify(s,c,h,0));return g(n),o}function za(e,r,t){var _=[];i(t),e=E(_,e,"privateKey");var n,s=0|a._crypto_scalarmult_scalarbytes();e.length!==s&&f(_,"invalid privateKey length"),n=u(e),_.push(n),r=E(_,r,"publicKey");var c,h=0|a._crypto_scalarmult_bytes();r.length!==h&&f(_,"invalid publicKey length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult(y,n,c))){var d=p(o,t);return g(_),d}b(_,"weak public key");}function ja(e,r){var t=[];i(r),e=E(t,e,"privateKey");var _,n=0|a._crypto_scalarmult_scalarbytes();e.length!==n&&f(t,"invalid privateKey length"),_=u(e),t.push(_);var s=new l(0|a._crypto_scalarmult_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_base(c,_))){var h=p(s,r);return g(t),h}b(t,"unknown error");}function Ja(e,r,t){var _=[];i(t),e=E(_,e,"n");var n,s=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==s&&f(_,"invalid n length"),n=u(e),_.push(n),r=E(_,r,"p");var c,h=0|a._crypto_scalarmult_ed25519_bytes();r.length!==h&&f(_,"invalid p length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_ed25519_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult_ed25519(y,n,c))){var d=p(o,t);return g(_),d}b(_,"invalid point or scalar is 0");}function Qa(e,r){var t=[];i(r),e=E(t,e,"scalar");var _,n=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==n&&f(t,"invalid scalar length"),_=u(e),t.push(_);var s=new l(0|a._crypto_scalarmult_ed25519_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_ed25519_base(c,_))){var h=p(s,r);return g(t),h}b(t,"scalar is 0");}function Za(e,r){var t=[];i(r),e=E(t,e,"scalar");var _,n=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==n&&f(t,"invalid scalar length"),_=u(e),t.push(_);var s=new l(0|a._crypto_scalarmult_ed25519_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_ed25519_base_noclamp(c,_))){var h=p(s,r);return g(t),h}b(t,"scalar is 0");}function $a(e,r,t){var _=[];i(t),e=E(_,e,"n");var n,s=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==s&&f(_,"invalid n length"),n=u(e),_.push(n),r=E(_,r,"p");var c,h=0|a._crypto_scalarmult_ed25519_bytes();r.length!==h&&f(_,"invalid p length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_ed25519_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult_ed25519_noclamp(y,n,c))){var d=p(o,t);return g(_),d}b(_,"invalid point or scalar is 0");}function er(e,r,t){var _=[];i(t),e=E(_,e,"scalar");var n,s=0|a._crypto_scalarmult_ristretto255_scalarbytes();e.length!==s&&f(_,"invalid scalar length"),n=u(e),_.push(n),r=E(_,r,"element");var c,h=0|a._crypto_scalarmult_ristretto255_bytes();r.length!==h&&f(_,"invalid element length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_ristretto255_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult_ristretto255(y,n,c))){var d=p(o,t);return g(_),d}b(_,"result is identity element");}function ar(e,r){var t=[];i(r),e=E(t,e,"scalar");var _,n=0|a._crypto_core_ristretto255_scalarbytes();e.length!==n&&f(t,"invalid scalar length"),_=u(e),t.push(_);var s=new l(0|a._crypto_core_ristretto255_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_ristretto255_base(c,_))){var h=p(s,r);return g(t),h}b(t,"scalar is 0");}function rr(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"message")),c=e.length;n.push(s),r=E(n,r,"nonce");var h,o=0|a._crypto_secretbox_noncebytes();r.length!==o&&f(n,"invalid nonce length"),h=u(r),n.push(h),t=E(n,t,"key");var y,d=0|a._crypto_secretbox_keybytes();t.length!==d&&f(n,"invalid key length"),y=u(t),n.push(y);var v=new l(0|c),m=v.address;n.push(m);var x=new l(0|a._crypto_secretbox_macbytes()),k=x.address;if(n.push(k),!(0|a._crypto_secretbox_detached(m,k,s,c,0,h,y))){var S=p({mac:x,cipher:v},_);return g(n),S}b(n,"invalid usage");}function tr(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"message")),c=e.length;n.push(s),r=E(n,r,"nonce");var h,o=0|a._crypto_secretbox_noncebytes();r.length!==o&&f(n,"invalid nonce length"),h=u(r),n.push(h),t=E(n,t,"key");var y,d=0|a._crypto_secretbox_keybytes();t.length!==d&&f(n,"invalid key length"),y=u(t),n.push(y);var v=new l(c+a._crypto_secretbox_macbytes()|0),m=v.address;if(n.push(m),!(0|a._crypto_secretbox_easy(m,s,c,0,h,y))){var x=p(v,_);return g(n),x}b(n,"invalid usage");}function _r(e){var r=[];i(e);var t=new l(0|a._crypto_secretbox_keybytes()),_=t.address;r.push(_),a._crypto_secretbox_keygen(_);var n=p(t,e);return g(r),n}function nr(e,r,t,_,n){var s=[];i(n);var c=u(e=E(s,e,"ciphertext")),h=e.length;s.push(c),r=E(s,r,"mac");var o,y=0|a._crypto_secretbox_macbytes();r.length!==y&&f(s,"invalid mac length"),o=u(r),s.push(o),t=E(s,t,"nonce");var d,v=0|a._crypto_secretbox_noncebytes();t.length!==v&&f(s,"invalid nonce length"),d=u(t),s.push(d),_=E(s,_,"key");var m,x=0|a._crypto_secretbox_keybytes();_.length!==x&&f(s,"invalid key length"),m=u(_),s.push(m);var k=new l(0|h),S=k.address;if(s.push(S),!(0|a._crypto_secretbox_open_detached(S,c,o,h,0,d,m))){var T=p(k,n);return g(s),T}b(s,"wrong secret key for the given ciphertext");}function sr(e,r,t,_){var n=[];i(_),e=E(n,e,"ciphertext");var s,c=a._crypto_secretbox_macbytes(),h=e.length;h>>0;return g([]),r}function Vr(e,r){var t=[];i(r);for(var _=a._malloc(24),n=0;n<6;n++)a.setValue(_+4*n,a.Runtime.addFunction(e[["implementation_name","random","stir","uniform","buf","close"][n]]),"i32");0|a._randombytes_set_implementation(_)&&b(t,"unsupported implementation"),g(t);}function Hr(e){i(e),a._randombytes_stir();}function Wr(e,r){var t=[];i(r),m(t,e,"upper_bound"),("number"!=typeof e||(0|e)!==e||e<0)&&f(t,"upper_bound must be an unsigned integer");var _=a._randombytes_uniform(e)>>>0;return g(t),_}function qr(){var e=a._sodium_version_string(),r=a.UTF8ToString(e);return g([]),r}l.prototype.to_Uint8Array=function(){var e=new Uint8Array(this.length);return e.set(a.HEAPU8.subarray(this.address,this.address+this.length)),e},r.add=function(e,a){if(!(e instanceof Uint8Array&&a instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be added");var r=e.length,t=0,_=0;if(a.length!==e.length)throw new TypeError("Arguments must have the same length");for(_=0;_>=8,t+=e[_]+a[_],e[_]=255&t;},r.base64_variants=c,r.compare=function(e,a){if(!(e instanceof Uint8Array&&a instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be compared");if(e.length!==a.length)throw new TypeError("Only instances of identical length can be compared");for(var r=0,t=1,_=e.length;_-- >0;)r|=a[_]-e[_]>>8&t,t&=(a[_]^e[_])-1>>8;return r+r+t-1},r.from_base64=function(e,r){r=h(r);var t,_=[],n=new l(3*(e=E(_,e,"input")).length/4),s=u(e),c=d(4),o=d(4);return _.push(s),_.push(n.address),_.push(c),_.push(o),0!==a._sodium_base642bin(n.address,n.length,s,e.length,0,c,o,r)&&b(_,"invalid input"),a.getValue(o,"i32")-s!==e.length&&b(_,"incomplete input"),n.length=a.getValue(c,"i32"),t=n.to_Uint8Array(),g(_),t},r.from_hex=function(e){var r,t=[],_=new l((e=E(t,e,"input")).length/2),n=u(e),s=d(4);return t.push(n),t.push(_.address),t.push(s),0!==a._sodium_hex2bin(_.address,_.length,n,e.length,0,0,s)&&b(t,"invalid input"),a.getValue(s,"i32")-n!==e.length&&b(t,"incomplete input"),r=_.to_Uint8Array(),g(t),r},r.from_string=_,r.increment=function(e){if(!(e instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be incremented");for(var a=256,r=0,t=e.length;r>=8,a+=e[r],e[r]=255&a;},r.is_zero=function(e){if(!(e instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be checked");for(var a=0,r=0,t=e.length;r 0");var t,_=[],n=d(4),s=1,c=0,h=0|e.length,o=new l(h+r);_.push(n),_.push(o.address);for(var p=o.address,y=o.address+h+r;p>>48|h>>>32|h>>>16|h))-1>>16);return 0!==a._sodium_pad(n,o.address,e.length,r,o.length)&&b(_,"internal error"),o.length=a.getValue(n,"i32"),t=o.to_Uint8Array(),g(_),t},r.unpad=function(e,r){if(!(e instanceof Uint8Array))throw new TypeError("buffer must be a Uint8Array");if((r|=0)<=0)throw new Error("block size must be > 0");var t=[],_=u(e),n=d(4);return t.push(_),t.push(n),0!==a._sodium_unpad(n,_,e.length,r)&&b(t,"unsupported/invalid padding"),e=(e=new Uint8Array(e)).subarray(0,a.getValue(n,"i32")),g(t),e},r.ready=t,r.symbols=function(){return Object.keys(r).sort()},r.to_base64=o,r.to_hex=s,r.to_string=n; + +class Decoder { + buf; + view; + pos; + constructor(buf) { + this.buf = buf; + this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength); + this.pos = 0; + } + take(n) { + if (this.pos + n > this.buf.length) throw new Error("Decoder: unexpected end of input"); + const slice = this.buf.subarray(this.pos, this.pos + n); + this.pos += n; + return slice; + } + takeAll() { + const slice = this.buf.subarray(this.pos); + this.pos = this.buf.length; + return slice; + } + anyByte() { + if (this.pos >= this.buf.length) throw new Error("Decoder: unexpected end of input"); + return this.buf[this.pos++]; + } + remaining() { + return this.buf.length - this.pos; + } + offset() { + return this.pos; + } +} +function concatBytes(...arrays) { + let totalLen = 0; + for (const a of arrays) totalLen += a.length; + const result = new Uint8Array(totalLen); + let offset = 0; + for (const a of arrays) { + result.set(a, offset); + offset += a.length; + } + return result; +} +function encodeWord32(n) { + const buf = new Uint8Array(4); + const view = new DataView(buf.buffer); + view.setUint32(0, n, false); + return buf; +} +function decodeWord32(d) { + const bytes = d.take(4); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + return view.getUint32(0, false); +} +function encodeInt64(n) { + const high = Number(n >> 32n & 0xFFFFFFFFn); + const low = Number(n & 0xFFFFFFFFn); + return concatBytes(encodeWord32(high), encodeWord32(low)); +} +function decodeInt64(d) { + const high = BigInt(decodeWord32(d)); + const low = BigInt(decodeWord32(d)); + const unsigned = high << 32n | low; + return unsigned >= 0x8000000000000000n ? unsigned - 0x10000000000000000n : unsigned; +} +function encodeBytes(bs) { + if (bs.length > 255) throw new Error("encodeBytes: length exceeds 255"); + const result = new Uint8Array(1 + bs.length); + result[0] = bs.length; + result.set(bs, 1); + return result; +} +function decodeBytes(d) { + const len = d.anyByte(); + return d.take(len); +} +const textEncoder = new TextEncoder(); +const textDecoder = new TextDecoder(); +function encodeString(s) { + return encodeBytes(textEncoder.encode(s)); +} +function decodeString(d) { + return textDecoder.decode(decodeBytes(d)); +} +const CHAR_0 = 48; +const CHAR_1 = 49; +function encodeMaybe(encode, v) { + return new Uint8Array([CHAR_0]); +} +function decodeMaybe(decode, d) { + const tag = d.anyByte(); + if (tag === CHAR_0) return null; + if (tag === CHAR_1) return decode(d); + throw new Error("decodeMaybe: invalid tag " + tag); +} + +function unPadLazy(padded) { + return splitLen(padded).content; +} +function splitLen(data) { + if (data.length < 8) throw new Error("splitLen: input too short"); + const d = new Decoder(data); + const len = decodeInt64(d); + if (len < 0n) throw new Error("splitLen: negative length"); + const numLen = Number(len); + const available = data.length - 8; + const takeLen = Math.min(numLen, available); + return { len, content: data.subarray(8, 8 + takeLen) }; +} + +const _sodium = r; +function readU32LE(buf, off) { + return (buf[off] | buf[off + 1] << 8 | buf[off + 2] << 16 | buf[off + 3] << 24) >>> 0; +} +function writeU32LE(buf, off, val) { + buf[off] = val & 255; + buf[off + 1] = val >>> 8 & 255; + buf[off + 2] = val >>> 16 & 255; + buf[off + 3] = val >>> 24 & 255; +} +function rotl32(v, n) { + return (v << n | v >>> 32 - n) >>> 0; +} +const SIGMA_0 = 1634760805; +const SIGMA_1 = 857760878; +const SIGMA_2 = 2036477234; +const SIGMA_3 = 1797285236; +function salsa20Block(key, nonce8, counter) { + const k0 = readU32LE(key, 0), k1 = readU32LE(key, 4); + const k2 = readU32LE(key, 8), k3 = readU32LE(key, 12); + const k4 = readU32LE(key, 16), k5 = readU32LE(key, 20); + const k6 = readU32LE(key, 24), k7 = readU32LE(key, 28); + const n0 = readU32LE(nonce8, 0), n1 = readU32LE(nonce8, 4); + const s0 = SIGMA_0, s1 = k0, s2 = k1, s3 = k2; + const s4 = k3, s5 = SIGMA_1, s6 = n0, s7 = n1; + const s8 = counter >>> 0, s9 = 0, s10 = SIGMA_2, s11 = k4; + const s12 = k5, s13 = k6, s14 = k7, s15 = SIGMA_3; + let x0 = s0, x1 = s1, x2 = s2, x3 = s3; + let x4 = s4, x5 = s5, x6 = s6, x7 = s7; + let x8 = s8, x9 = s9, x10 = s10, x11 = s11; + let x12 = s12, x13 = s13, x14 = s14, x15 = s15; + for (let i = 0; i < 10; i++) { + x4 ^= rotl32(x0 + x12 >>> 0, 7); + x8 ^= rotl32(x4 + x0 >>> 0, 9); + x12 ^= rotl32(x8 + x4 >>> 0, 13); + x0 ^= rotl32(x12 + x8 >>> 0, 18); + x9 ^= rotl32(x5 + x1 >>> 0, 7); + x13 ^= rotl32(x9 + x5 >>> 0, 9); + x1 ^= rotl32(x13 + x9 >>> 0, 13); + x5 ^= rotl32(x1 + x13 >>> 0, 18); + x14 ^= rotl32(x10 + x6 >>> 0, 7); + x2 ^= rotl32(x14 + x10 >>> 0, 9); + x6 ^= rotl32(x2 + x14 >>> 0, 13); + x10 ^= rotl32(x6 + x2 >>> 0, 18); + x3 ^= rotl32(x15 + x11 >>> 0, 7); + x7 ^= rotl32(x3 + x15 >>> 0, 9); + x11 ^= rotl32(x7 + x3 >>> 0, 13); + x15 ^= rotl32(x11 + x7 >>> 0, 18); + x1 ^= rotl32(x0 + x3 >>> 0, 7); + x2 ^= rotl32(x1 + x0 >>> 0, 9); + x3 ^= rotl32(x2 + x1 >>> 0, 13); + x0 ^= rotl32(x3 + x2 >>> 0, 18); + x6 ^= rotl32(x5 + x4 >>> 0, 7); + x7 ^= rotl32(x6 + x5 >>> 0, 9); + x4 ^= rotl32(x7 + x6 >>> 0, 13); + x5 ^= rotl32(x4 + x7 >>> 0, 18); + x11 ^= rotl32(x10 + x9 >>> 0, 7); + x8 ^= rotl32(x11 + x10 >>> 0, 9); + x9 ^= rotl32(x8 + x11 >>> 0, 13); + x10 ^= rotl32(x9 + x8 >>> 0, 18); + x12 ^= rotl32(x15 + x14 >>> 0, 7); + x13 ^= rotl32(x12 + x15 >>> 0, 9); + x14 ^= rotl32(x13 + x12 >>> 0, 13); + x15 ^= rotl32(x14 + x13 >>> 0, 18); + } + const out = new Uint8Array(64); + writeU32LE(out, 0, x0 + s0 >>> 0); + writeU32LE(out, 4, x1 + s1 >>> 0); + writeU32LE(out, 8, x2 + s2 >>> 0); + writeU32LE(out, 12, x3 + s3 >>> 0); + writeU32LE(out, 16, x4 + s4 >>> 0); + writeU32LE(out, 20, x5 + s5 >>> 0); + writeU32LE(out, 24, x6 + s6 >>> 0); + writeU32LE(out, 28, x7 + s7 >>> 0); + writeU32LE(out, 32, x8 + s8 >>> 0); + writeU32LE(out, 36, x9 + s9 >>> 0); + writeU32LE(out, 40, x10 + s10 >>> 0); + writeU32LE(out, 44, x11 + s11 >>> 0); + writeU32LE(out, 48, x12 + s12 >>> 0); + writeU32LE(out, 52, x13 + s13 >>> 0); + writeU32LE(out, 56, x14 + s14 >>> 0); + writeU32LE(out, 60, x15 + s15 >>> 0); + return out; +} +function sbInit(key, nonce) { + const zeros16 = new Uint8Array(16); + const subkey1 = _sodium.crypto_core_hsalsa20(zeros16, key); + const subkey = _sodium.crypto_core_hsalsa20(nonce.subarray(0, 16), subkey1); + const nonce8 = new Uint8Array(nonce.subarray(16, 24)); + const block0 = salsa20Block(subkey, nonce8, 0); + const poly1305Key = block0.subarray(0, 32); + const ksBuf = new Uint8Array(block0.subarray(32)); + const authState = r.crypto_onetimeauth_init(poly1305Key); + return { _subkey: subkey, _nonce8: nonce8, _counter: 1, _ksBuf: ksBuf, _ksOff: 0, _authState: authState }; +} +function cbInit(dhSecret, nonce) { + return sbInit(dhSecret, nonce); +} +function sbEncryptChunk(state, chunk) { + const cipher = xorKeystream(state, chunk); + r.crypto_onetimeauth_update(state._authState, cipher); + return cipher; +} +function sbDecryptChunk(state, chunk) { + r.crypto_onetimeauth_update(state._authState, chunk); + return xorKeystream(state, chunk); +} +function sbAuth(state) { + return r.crypto_onetimeauth_final(state._authState); +} +function sbDecryptTailTag(key, nonce, paddedLen, data) { + const pLen = Number(paddedLen); + const cipher = data.subarray(0, pLen); + const providedTag = data.subarray(pLen); + const state = sbInit(key, nonce); + const plaintext = sbDecryptChunk(state, cipher); + const computedTag = sbAuth(state); + const valid = providedTag.length === 16 && constantTimeEqual$1(providedTag, computedTag); + const content = unPadLazy(plaintext); + return { valid, content }; +} +function xorKeystream(state, data) { + const result = new Uint8Array(data.length); + let off = 0; + while (off < data.length) { + if (state._ksOff >= state._ksBuf.length) { + state._ksBuf = salsa20Block(state._subkey, state._nonce8, state._counter++); + state._ksOff = 0; + } + const available = state._ksBuf.length - state._ksOff; + const needed = data.length - off; + const n = Math.min(available, needed); + for (let i = 0; i < n; i++) { + result[off + i] = data[off + i] ^ state._ksBuf[state._ksOff + i]; + } + state._ksOff += n; + off += n; + } + return result; +} +function constantTimeEqual$1(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +const AUTH_TAG_SIZE = 16n; +const PROGRESS_SEG = 256 * 1024; +function encodeFileHeader(hdr) { + return concatBytes( + encodeString(hdr.fileName), + encodeMaybe() + ); +} +function parseFileHeader(data) { + const hdrLen = Math.min(1024, data.length); + const d = new Decoder(data.subarray(0, hdrLen)); + const fileName = decodeString(d); + const fileExtra = decodeMaybe(decodeString, d); + const consumed = d.offset(); + return { + header: { fileName, fileExtra }, + rest: data.subarray(consumed) + }; +} +function encryptFile(source, fileHdr, key, nonce, fileSize, encSize, onProgress) { + const state = sbInit(key, nonce); + const lenStr = encodeInt64(fileSize); + const padLen = Number(encSize - AUTH_TAG_SIZE - fileSize - 8n); + if (padLen < 0) throw new Error("encryptFile: encSize too small"); + const hdr = sbEncryptChunk(state, concatBytes(lenStr, fileHdr)); + const encSource = new Uint8Array(source.length); + for (let off = 0; off < source.length; off += PROGRESS_SEG) { + const end = Math.min(off + PROGRESS_SEG, source.length); + const seg = sbEncryptChunk(state, source.subarray(off, end)); + encSource.set(seg, off); + onProgress?.(end, source.length); + } + if (source.length === 0) onProgress?.(0, 0); + const padding = new Uint8Array(padLen); + padding.fill(35); + const encPad = sbEncryptChunk(state, padding); + const tag = sbAuth(state); + return concatBytes(hdr, encSource, encPad, tag); +} +function decryptChunks(encSize, chunks, key, nonce, onProgress) { + if (chunks.length === 0) throw new Error("decryptChunks: empty chunks"); + const paddedLen = encSize - AUTH_TAG_SIZE; + const data = chunks.length === 1 ? chunks[0] : concatBytes(...chunks); + if (!onProgress) { + const { valid, content: content2 } = sbDecryptTailTag(key, nonce, paddedLen, data); + if (!valid) throw new Error("decryptChunks: invalid auth tag"); + const { header: header2, rest: rest2 } = parseFileHeader(content2); + return { header: header2, content: rest2 }; + } + const pLen = Number(paddedLen); + const cipher = data.subarray(0, pLen); + const providedTag = data.subarray(pLen); + const state = sbInit(key, nonce); + const plaintext = new Uint8Array(pLen); + for (let off = 0; off < pLen; off += PROGRESS_SEG) { + const end = Math.min(off + PROGRESS_SEG, pLen); + const seg = sbDecryptChunk(state, cipher.subarray(off, end)); + plaintext.set(seg, off); + onProgress(end, pLen); + } + if (pLen === 0) onProgress(0, 0); + const computedTag = sbAuth(state); + let diff = providedTag.length === 16 ? 0 : 1; + for (let i = 0; i < computedTag.length; i++) diff |= providedTag[i] ^ computedTag[i]; + if (diff !== 0) throw new Error("decryptChunks: invalid auth tag"); + const content = unPadLazy(plaintext); + const { header, rest } = parseFileHeader(content); + return { header, content: rest }; +} + +function sha256(data) { + return r.crypto_hash_sha256(data); +} +function sha512Streaming(chunks, onProgress, totalBytes) { + const SEG = 4 * 1024 * 1024; + const state = r.crypto_hash_sha512_init(); + let done = 0; + for (const chunk of chunks) { + for (let off = 0; off < chunk.length; off += SEG) { + const end = Math.min(off + SEG, chunk.length); + r.crypto_hash_sha512_update(state, chunk.subarray(off, end)); + done += end - off; + onProgress?.(done, totalBytes ?? done); + } + } + return r.crypto_hash_sha512_final(state); +} + +const B64URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; +const B64_DECODE = new Uint8Array(128); +B64_DECODE.fill(255); +for (let i = 0; i < 64; i++) B64_DECODE[B64URL.charCodeAt(i)] = i; +const kb = (n) => n * 1024; +const mb = (n) => n * 1048576; + +const chunkSize0 = kb(64); +const chunkSize1 = kb(256); +const chunkSize2 = mb(1); +const chunkSize3 = mb(4); +const fileSizeLen = 8; +const authTagSize = 16; +function size34(sz) { + return Math.floor(sz * 3 / 4); +} +function prepareChunkSizes(payloadSize) { + let smallSize, bigSize; + if (payloadSize > size34(chunkSize3)) { + smallSize = chunkSize2; + bigSize = chunkSize3; + } else if (payloadSize > size34(chunkSize2)) { + smallSize = chunkSize1; + bigSize = chunkSize2; + } else { + smallSize = chunkSize0; + bigSize = chunkSize1; + } + function prepareSizes(size) { + if (size === 0) return []; + if (size >= bigSize) { + const n1 = Math.floor(size / bigSize); + const remSz = size % bigSize; + return new Array(n1).fill(bigSize).concat(prepareSizes(remSz)); + } + if (size > size34(bigSize)) return [bigSize]; + const n2 = Math.floor(size / smallSize); + const remSz2 = size % smallSize; + return new Array(remSz2 === 0 ? n2 : n2 + 1).fill(smallSize); + } + return prepareSizes(payloadSize); +} + +await r.ready; + +function decryptTransportChunk(dhSecret, cbNonce, encData) { + if (encData.length < 16) return { valid: false, content: new Uint8Array(0), computedTag: new Uint8Array(0) }; + const cipher = encData.subarray(0, encData.length - 16); + const providedTag = encData.subarray(encData.length - 16); + const state = cbInit(dhSecret, cbNonce); + const plaintext = sbDecryptChunk(state, cipher); + const computedTag = sbAuth(state); + const valid = constantTimeEqual(providedTag, computedTag); + return { valid, content: plaintext, computedTag }; +} +function constantTimeEqual(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +function decryptReceivedChunk(dhSecret, cbNonce, encData, expectedDigest) { + encData.slice(encData.length - 16); + const { valid, content } = decryptTransportChunk(dhSecret, cbNonce, encData); + if (!valid) throw new Error("transport auth tag verification failed"); + if (expectedDigest !== null) { + const actual = sha256(content); + if (!digestEqual$1(actual, expectedDigest)) { + throw new Error("chunk digest mismatch"); + } + } + return content; +} +function digestEqual$1(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +const SESSION_DIR = `session-${Date.now()}-${crypto.randomUUID()}`; +let uploadReadHandle = null; +let downloadWriteHandle = null; +const chunkMeta = /* @__PURE__ */ new Map(); +let currentDownloadOffset = 0; +let sessionDir = null; +let useMemory = false; +const memoryChunks = /* @__PURE__ */ new Map(); +async function getSessionDir() { + if (!sessionDir) { + const root = await navigator.storage.getDirectory(); + sessionDir = await root.getDirectoryHandle(SESSION_DIR, { create: true }); + } + return sessionDir; +} +async function sweepStale() { + const root = await navigator.storage.getDirectory(); + const oneHourAgo = Date.now() - 36e5; + for await (const [name] of root.entries()) { + if (!name.startsWith("session-")) continue; + const parts = name.split("-"); + const ts = parseInt(parts[1], 10); + if (!isNaN(ts) && ts < oneHourAgo) { + try { + await root.removeEntry(name, { recursive: true }); + } catch (_) { + } + } + } +} +async function handleEncrypt(id, data, fileName) { + const source = new Uint8Array(data); + const key = new Uint8Array(32); + const nonce = new Uint8Array(24); + crypto.getRandomValues(key); + crypto.getRandomValues(nonce); + const fileHdr = encodeFileHeader({ fileName}); + const fileSize = BigInt(fileHdr.length + source.length); + const payloadSize = Number(fileSize) + fileSizeLen + authTagSize; + const chunkSizes = prepareChunkSizes(payloadSize); + const encSize = BigInt(chunkSizes.reduce((a, b) => a + b, 0)); + const encDataLen = Number(encSize); + const total = source.length + encDataLen * 2; + const encData = encryptFile(source, fileHdr, key, nonce, fileSize, encSize, (done) => { + self.postMessage({ id, type: "progress", done, total }); + }); + const digest = sha512Streaming([encData], (done) => { + self.postMessage({ id, type: "progress", done: source.length + done, total }); + }, encDataLen); + console.log(`[WORKER-DBG] encrypt: encData.len=${encData.length} digest=${_whex(digest, 64)} chunkSizes=[${chunkSizes.join(",")}]`); + const dir = await getSessionDir(); + const fileHandle = await dir.getFileHandle("upload.bin", { create: true }); + const writeHandle = await fileHandle.createSyncAccessHandle(); + const written = writeHandle.write(encData); + if (written !== encData.length) throw new Error(`OPFS upload write: ${written}/${encData.length}`); + writeHandle.flush(); + writeHandle.close(); + uploadReadHandle = await fileHandle.createSyncAccessHandle(); + self.postMessage({ id, type: "progress", done: total, total }); + self.postMessage({ id, type: "encrypted", digest, key, nonce, chunkSizes }); +} +function handleReadChunk(id, offset, size) { + if (!uploadReadHandle) { + self.postMessage({ id, type: "error", message: "No upload file open" }); + return; + } + const buf = new Uint8Array(size); + uploadReadHandle.read(buf, { at: offset }); + const ab = buf.buffer; + self.postMessage({ id, type: "chunk", data: ab }, [ab]); +} +async function handleDecryptAndStore(id, dhSecret, nonce, body, chunkDigest, chunkNo) { + const bodyArr = new Uint8Array(body); + console.log(`[WORKER-DBG] store chunk=${chunkNo} body.len=${bodyArr.length} nonce=${_whex(nonce, 24)} dhSecret=${_whex(dhSecret)} digest=${_whex(chunkDigest, 32)} body[0..8]=${_whex(bodyArr)} body[-8..]=${_whex(bodyArr.slice(-8))}`); + const decrypted = decryptReceivedChunk(dhSecret, nonce, bodyArr, chunkDigest); + console.log(`[WORKER-DBG] decrypted chunk=${chunkNo} len=${decrypted.length} [0..8]=${_whex(decrypted)} [-8..]=${_whex(decrypted.slice(-8))}`); + if (useMemory) { + memoryChunks.set(chunkNo, decrypted); + self.postMessage({ id, type: "stored" }); + return; + } + if (!downloadWriteHandle) { + const dir = await getSessionDir(); + const fileHandle = await dir.getFileHandle("download.bin", { create: true }); + downloadWriteHandle = await fileHandle.createSyncAccessHandle(); + } + const offset = currentDownloadOffset; + currentDownloadOffset += decrypted.length; + chunkMeta.set(chunkNo, { offset, size: decrypted.length }); + const written = downloadWriteHandle.write(decrypted, { at: offset }); + console.log(`[WORKER-DBG] OPFS write chunk=${chunkNo} offset=${offset} size=${decrypted.length} written=${written}`); + if (written !== decrypted.length) { + console.warn(`[WORKER] OPFS write failed chunk=${chunkNo}: ${written}/${decrypted.length}, falling back to in-memory storage`); + for (const [cn, meta] of chunkMeta.entries()) { + if (cn === chunkNo) continue; + const buf = new Uint8Array(meta.size); + downloadWriteHandle.read(buf, { at: meta.offset }); + memoryChunks.set(cn, buf); + } + downloadWriteHandle.close(); + downloadWriteHandle = null; + try { + const dir = await getSessionDir(); + await dir.removeEntry("download.bin"); + } catch (_) { + } + chunkMeta.clear(); + currentDownloadOffset = 0; + memoryChunks.set(chunkNo, decrypted); + useMemory = true; + self.postMessage({ id, type: "stored" }); + return; + } + downloadWriteHandle.flush(); + const verifyBuf = new Uint8Array(Math.min(8, decrypted.length)); + downloadWriteHandle.read(verifyBuf, { at: offset }); + const verifyEnd = new Uint8Array(Math.min(8, decrypted.length)); + downloadWriteHandle.read(verifyEnd, { at: offset + decrypted.length - verifyEnd.length }); + console.log(`[WORKER-DBG] OPFS verify chunk=${chunkNo} readBack[0..8]=${_whex(verifyBuf)} readBack[-8..]=${_whex(verifyEnd)} expected[0..8]=${_whex(decrypted)} expected[-8..]=${_whex(decrypted.slice(-8))}`); + self.postMessage({ id, type: "stored" }); +} +async function handleVerifyAndDecrypt(id, size, digest, key, nonce) { + console.log(`[WORKER-DBG] verify: expectedSize=${size} expectedDigest=${_whex(digest, 64)} useMemory=${useMemory} chunkMeta.size=${chunkMeta.size} memoryChunks.size=${memoryChunks.size}`); + const chunks = []; + let totalSize = 0; + const total = size * 3; + let done = 0; + if (useMemory) { + const sorted = [...memoryChunks.entries()].sort((a, b) => a[0] - b[0]); + for (const [chunkNo, data] of sorted) { + console.log(`[WORKER-DBG] verify memory chunk=${chunkNo} size=${data.length}`); + chunks.push(data); + totalSize += data.length; + done += data.length; + self.postMessage({ id, type: "progress", done, total }); + } + } else { + if (downloadWriteHandle) { + downloadWriteHandle.flush(); + downloadWriteHandle.close(); + downloadWriteHandle = null; + } + const dir = await getSessionDir(); + const fileHandle = await dir.getFileHandle("download.bin"); + const readHandle = await fileHandle.createSyncAccessHandle(); + console.log(`[WORKER-DBG] verify: OPFS file size=${readHandle.getSize()}`); + const sortedEntries = [...chunkMeta.entries()].sort((a, b) => a[0] - b[0]); + for (const [chunkNo, meta] of sortedEntries) { + const buf = new Uint8Array(meta.size); + const bytesRead = readHandle.read(buf, { at: meta.offset }); + console.log(`[WORKER-DBG] verify read chunk=${chunkNo} offset=${meta.offset} size=${meta.size} bytesRead=${bytesRead} [0..8]=${_whex(buf)} [-8..]=${_whex(buf.slice(-8))}`); + chunks.push(buf); + totalSize += meta.size; + done += meta.size; + self.postMessage({ id, type: "progress", done, total }); + } + readHandle.close(); + } + if (totalSize !== size) { + self.postMessage({ id, type: "error", message: `File size mismatch: ${totalSize} !== ${size}` }); + return; + } + const hashSEG = 4 * 1024 * 1024; + const state = r.crypto_hash_sha512_init(); + for (let i = 0; i < chunks.length; i++) { + const chunk = chunks[i]; + for (let off = 0; off < chunk.length; off += hashSEG) { + const end = Math.min(off + hashSEG, chunk.length); + r.crypto_hash_sha512_update(state, chunk.subarray(off, end)); + done += end - off; + self.postMessage({ id, type: "progress", done, total }); + } + } + const actualDigest = r.crypto_hash_sha512_final(state); + if (!digestEqual(actualDigest, digest)) { + console.error(`[WORKER-DBG] DIGEST MISMATCH: expected=${_whex(digest, 64)} actual=${_whex(actualDigest, 64)} chunks=${chunks.length} totalSize=${totalSize}`); + const state2 = r.crypto_hash_sha512_init(); + for (let i = 0; i < chunks.length; i++) { + const chunk = chunks[i]; + for (let off = 0; off < chunk.length; off += hashSEG) { + r.crypto_hash_sha512_update(state2, chunk.subarray(off, Math.min(off + hashSEG, chunk.length))); + } + const chunkDigest = sha512Streaming([chunk]); + console.error(`[WORKER-DBG] chunk[${i}] size=${chunk.length} sha512=${_whex(chunkDigest, 32)}… [0..8]=${_whex(chunk)} [-8..]=${_whex(chunk.slice(-8))}`); + } + self.postMessage({ id, type: "error", message: "File digest mismatch" }); + return; + } + console.log(`[WORKER-DBG] verify: digest OK`); + const result = decryptChunks(BigInt(size), chunks, key, nonce, (d) => { + self.postMessage({ id, type: "progress", done: size * 2 + d, total }); + }); + self.postMessage({ id, type: "progress", done: total, total }); + if (!useMemory) { + const dir = await getSessionDir(); + try { + await dir.removeEntry("download.bin"); + } catch (_) { + } + } + chunkMeta.clear(); + memoryChunks.clear(); + currentDownloadOffset = 0; + useMemory = false; + const contentBuf = result.content.buffer.slice( + result.content.byteOffset, + result.content.byteOffset + result.content.byteLength + ); + self.postMessage( + { id, type: "decrypted", header: result.header, content: contentBuf }, + [contentBuf] + ); +} +async function handleCleanup(id) { + if (uploadReadHandle) { + uploadReadHandle.close(); + uploadReadHandle = null; + } + if (downloadWriteHandle) { + downloadWriteHandle.close(); + downloadWriteHandle = null; + } + chunkMeta.clear(); + memoryChunks.clear(); + currentDownloadOffset = 0; + useMemory = false; + try { + const root = await navigator.storage.getDirectory(); + await root.removeEntry(SESSION_DIR, { recursive: true }); + } catch (_) { + } + sessionDir = null; + self.postMessage({ id, type: "cleaned" }); +} +let queue = Promise.resolve(); +self.onmessage = (e) => { + const msg = e.data; + queue = queue.then(async () => { + try { + await initPromise; + switch (msg.type) { + case "encrypt": + await handleEncrypt(msg.id, msg.data, msg.fileName); + break; + case "readChunk": + handleReadChunk(msg.id, msg.offset, msg.size); + break; + case "decryptAndStoreChunk": + await handleDecryptAndStore(msg.id, msg.dhSecret, msg.nonce, msg.body, msg.chunkDigest, msg.chunkNo); + break; + case "verifyAndDecrypt": + await handleVerifyAndDecrypt(msg.id, msg.size, msg.digest, msg.key, msg.nonce); + break; + case "cleanup": + await handleCleanup(msg.id); + break; + default: + self.postMessage({ id: msg.id, type: "error", message: `Unknown message type: ${msg.type}` }); + } + } catch (err) { + self.postMessage({ id: msg.id, type: "error", message: err?.message ?? String(err) }); + } + }); +}; +function _whex(b, n = 8) { + return Array.from(b.slice(0, n)).map((x) => x.toString(16).padStart(2, "0")).join(""); +} +function digestEqual(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} +const initPromise = (async () => { + await r.ready; + await sweepStale(); +})(); +initPromise.then(() => self.postMessage({ type: "ready" }), () => { +}); diff --git a/apps/xftp-server/static/xftp-web-bundle/index.css b/apps/xftp-server/static/xftp-web-bundle/index.css new file mode 100644 index 000000000..01705e369 --- /dev/null +++ b/apps/xftp-server/static/xftp-web-bundle/index.css @@ -0,0 +1,145 @@ +#app, [data-xftp-app] { + font-family: system-ui, -apple-system, sans-serif; + color: #333; + width: 100%; + max-width: 480px; + padding: 16px; + box-sizing: border-box; + --xftp-ring-fg: #3b82f6; +} + +:is(#app, [data-xftp-app]) .card { + background: #fff; + border-radius: 12px; + padding: 32px 24px; + box-shadow: 0 1px 3px rgba(0,0,0,.1); + text-align: center; +} + +:is(#app, [data-xftp-app]) h1 { + font-size: 1.25rem; + font-weight: 600; + margin-bottom: 24px; +} + +:is(#app, [data-xftp-app]) .stage { margin-top: 16px; } + +/* Drop zone */ +:is(#app, [data-xftp-app]) .drop-zone { + border: 2px dashed #ccc; + border-radius: 8px; + padding: 32px 16px; + transition: border-color .15s, background .15s; +} +:is(#app, [data-xftp-app]) .drop-zone.drag-over { + border-color: #3b82f6; + background: #eff6ff; +} + +/* Buttons */ +:is(#app, [data-xftp-app]) .btn { + display: inline-block; + padding: 10px 24px; + border: none; + border-radius: 6px; + background: #3b82f6; + color: #fff; + font-size: .9rem; + font-weight: 500; + cursor: pointer; + transition: background .15s; +} +:is(#app, [data-xftp-app]) .btn:hover { background: #2563eb; } +:is(#app, [data-xftp-app]) .btn-secondary { background: #6b7280; } +:is(#app, [data-xftp-app]) .btn-secondary:hover { background: #4b5563; } + +/* Hints */ +:is(#app, [data-xftp-app]) .hint { color: #999; font-size: .85rem; margin-top: 8px; } +:is(#app, [data-xftp-app]) .expiry { margin-top: 12px; } + +/* Progress */ +:is(#app, [data-xftp-app]) .progress-ring { display: block; margin: 0 auto 12px; } +:is(#app, [data-xftp-app]) #upload-status, +:is(#app, [data-xftp-app]) #dl-status { font-size: .9rem; color: #666; margin-bottom: 12px; } + +/* Share link row */ +:is(#app, [data-xftp-app]) .link-row { + display: flex; + gap: 8px; + margin-top: 12px; +} +:is(#app, [data-xftp-app]) .link-row input { + flex: 1; + padding: 8px 10px; + border: 1px solid #ccc; + border-radius: 6px; + font-size: .85rem; + background: #f9fafb; +} + +/* Upload link */ +:is(#app, [data-xftp-app]) .upload-link { + margin-top: 12px; + color: #3b82f6; + font-size: .9rem; + text-decoration: none; + cursor: pointer; +} +:is(#app, [data-xftp-app]) .upload-link:not([hidden]) { + display: inline-block; +} +:is(#app, [data-xftp-app]) .upload-link:hover { text-decoration: underline; } + +/* Messages */ +:is(#app, [data-xftp-app]) .success { color: #16a34a; font-weight: 600; } +:is(#app, [data-xftp-app]) .error { color: #dc2626; font-weight: 500; margin-bottom: 12px; } + +/* Security note */ +:is(#app, [data-xftp-app]) .security-note { + margin-top: 20px; + padding: 12px; + background: #f0fdf4; + border-radius: 6px; + font-size: .8rem; + color: #555; + text-align: left; +} +:is(#app, [data-xftp-app]) .security-note p + p { margin-top: 6px; } +:is(#app, [data-xftp-app]) .security-note a { color: #3b82f6; text-decoration: none; } +:is(#app, [data-xftp-app]) .security-note a:hover { text-decoration: underline; } + +/* ── Dark mode ─────────────────────────────────── */ +.dark :is(#app, [data-xftp-app]) { + color: #e5e7eb; + --xftp-ring-bg: #374151; + --xftp-ring-fg: #60a5fa; + --xftp-ring-text: #e5e7eb; + --xftp-ring-done: #4ade80; +} +.dark :is(#app, [data-xftp-app]) .card { + background: #1f2937; + box-shadow: 0 1px 3px rgba(0,0,0,.4); +} +.dark :is(#app, [data-xftp-app]) .drop-zone { border-color: #4b5563; } +.dark :is(#app, [data-xftp-app]) .drop-zone.drag-over { + border-color: #60a5fa; + background: rgba(59,130,246,.15); +} +.dark :is(#app, [data-xftp-app]) .btn-secondary { background: #4b5563; } +.dark :is(#app, [data-xftp-app]) .btn-secondary:hover { background: #374151; } +.dark :is(#app, [data-xftp-app]) .hint { color: #9ca3af; } +.dark :is(#app, [data-xftp-app]) #upload-status, +.dark :is(#app, [data-xftp-app]) #dl-status { color: #9ca3af; } +.dark :is(#app, [data-xftp-app]) .link-row input { + background: #374151; + border-color: #4b5563; + color: #e5e7eb; +} +.dark :is(#app, [data-xftp-app]) .success { color: #4ade80; } +.dark :is(#app, [data-xftp-app]) .error { color: #f87171; } +.dark :is(#app, [data-xftp-app]) .security-note { + background: rgba(34,197,94,.1); + color: #d1d5db; +} +.dark :is(#app, [data-xftp-app]) .upload-link { color: #60a5fa; } +.dark :is(#app, [data-xftp-app]) .security-note a { color: #60a5fa; } diff --git a/apps/xftp-server/static/xftp-web-bundle/index.js b/apps/xftp-server/static/xftp-web-bundle/index.js new file mode 100644 index 000000000..1d41088c8 --- /dev/null +++ b/apps/xftp-server/static/xftp-web-bundle/index.js @@ -0,0 +1,11607 @@ +true &&(function polyfill() { + const relList = document.createElement("link").relList; + if (relList && relList.supports && relList.supports("modulepreload")) { + return; + } + for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { + processPreload(link); + } + new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.tagName === "LINK" && node.rel === "modulepreload") + processPreload(node); + } + } + }).observe(document, { childList: true, subtree: true }); + function getFetchOpts(link) { + const fetchOpts = {}; + if (link.integrity) fetchOpts.integrity = link.integrity; + if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; + if (link.crossOrigin === "use-credentials") + fetchOpts.credentials = "include"; + else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; + else fetchOpts.credentials = "same-origin"; + return fetchOpts; + } + function processPreload(link) { + if (link.ep) + return; + link.ep = true; + const fetchOpts = getFetchOpts(link); + fetch(link.href, fetchOpts); + } +}()); + +const scriptRel = 'modulepreload';const assetsURL = function(dep, importerUrl) { return new URL(dep, importerUrl).href };const seen = {};const __vitePreload = function preload(baseModule, deps, importerUrl) { + let promise = Promise.resolve(); + if (true && deps && deps.length > 0) { + let allSettled2 = function(promises) { + return Promise.all( + promises.map( + (p) => Promise.resolve(p).then( + (value) => ({ status: "fulfilled", value }), + (reason) => ({ status: "rejected", reason }) + ) + ) + ); + }; + const links = document.getElementsByTagName("link"); + const cspNonceMeta = document.querySelector( + "meta[property=csp-nonce]" + ); + const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce"); + promise = allSettled2( + deps.map((dep) => { + dep = assetsURL(dep, importerUrl); + if (dep in seen) return; + seen[dep] = true; + const isCss = dep.endsWith(".css"); + const cssSelector = isCss ? '[rel="stylesheet"]' : ""; + const isBaseRelative = !!importerUrl; + if (isBaseRelative) { + for (let i = links.length - 1; i >= 0; i--) { + const link2 = links[i]; + if (link2.href === dep && (!isCss || link2.rel === "stylesheet")) { + return; + } + } + } else if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) { + return; + } + const link = document.createElement("link"); + link.rel = isCss ? "stylesheet" : scriptRel; + if (!isCss) { + link.as = "script"; + } + link.crossOrigin = ""; + link.href = dep; + if (cspNonce) { + link.setAttribute("nonce", cspNonce); + } + document.head.appendChild(link); + if (isCss) { + return new Promise((res, rej) => { + link.addEventListener("load", res); + link.addEventListener( + "error", + () => rej(new Error(`Unable to preload CSS for ${dep}`)) + ); + }); + } + }) + ); + } + function handlePreloadError(err) { + const e = new Event("vite:preloadError", { + cancelable: true + }); + e.payload = err; + window.dispatchEvent(e); + if (!e.defaultPrevented) { + throw err; + } + } + return promise.then((res) => { + for (const item of res || []) { + if (item.status !== "rejected") continue; + handlePreloadError(item.reason); + } + return baseModule().catch(handlePreloadError); + }); +}; + +// __dirname and __filename are not available in ESM, so we polyfill them for Node.js +var __filename$1, __dirname$1; +try { + // Only works in Node.js ESM - browsers will skip this + if (typeof process !== 'undefined' && process.versions && process.versions.node) { + var url = await __vitePreload(() => import('url'),true ?[]:void 0,import.meta.url); + var path = await __vitePreload(() => import('./__vite-browser-external.js'),true ?[]:void 0,import.meta.url); + __filename$1 = url.fileURLToPath(import.meta.url); + __dirname$1 = path.dirname(__filename$1); + } +} catch (e) { + // In browser environments, these are not needed +} + +var Module = {}; + +// Set up getRandomValue for ESM environments (browsers and Node.js 19+) +// This must be done before the WASM module initializes +(function() { + try { + // Try globalThis.crypto first (works in browsers and Node.js 19+) + var crypto_ = globalThis.crypto; + if (crypto_ && typeof crypto_.getRandomValues === 'function') { + Module.getRandomValue = function() { + var buf = new Uint32Array(1); + crypto_.getRandomValues(buf); + return buf[0] >>> 0; + }; + return; + } + } catch (e) {} + + try { + // Fallback for older browsers: window.crypto or self.crypto + var window_ = typeof window !== 'undefined' ? window : self; + var crypto_ = window_.crypto || window_.msCrypto; + if (crypto_ && typeof crypto_.getRandomValues === 'function') { + Module.getRandomValue = function() { + var buf = new Uint32Array(1); + crypto_.getRandomValues(buf); + return buf[0] >>> 0; + }; + return; + } + } catch (e) {} + + // No crypto available - will fail at runtime if random bytes are needed +})(); + var Module; + if (typeof Module === 'undefined') { + Module = {}; + } + var root = Module; + if (typeof root['sodium'] !== 'object') { + if (typeof global === 'object') { + root = global; + } else if (typeof window === 'object') { + root = window; + } + } + if (typeof Module.getRandomValue === 'undefined') { + try { + var window_ = 'object' === typeof window ? window : self; + var crypto_ = typeof window_.crypto !== 'undefined' ? window_.crypto : window_.msCrypto; + var randomValuesStandard = function() { + var buf = new Uint32Array(1); + crypto_.getRandomValues(buf); + return buf[0] >>> 0; + }; + randomValuesStandard(); + Module.getRandomValue = randomValuesStandard; + } catch (e) { + try { + var crypto$2 = null; + var randomValueNodeJS = function() { + var buf = crypto$2['randomBytes'](4); + return (buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]) >>> 0; + }; + randomValueNodeJS(); + Module.getRandomValue = randomValueNodeJS; + } catch (e) { + throw 'No secure random number generator found'; + } + } + } + var _Module = Module; + Module.ready = new Promise(function(resolve, reject) { + var Module = _Module; + Module.onAbort = reject; + Module.print = function(what) { + typeof(console) !== 'undefined' && console.log(what); + }; + Module.printErr = function(what) { + typeof(console) !== 'undefined' && console.warn(what); + }; + Module.onRuntimeInitialized = function() { + try { + /* Test arbitrary wasm function */ + Module._crypto_secretbox_keybytes(); + resolve(); + } catch (err) { + reject(err); + } + }; + Module.useBackupModule = function() { + return new Promise(function(resolve, reject) { + var Module = {}; + Module.onAbort = reject; + Module.getRandomValue = _Module.getRandomValue; + + Module.onRuntimeInitialized = function() { + Object.keys(_Module).forEach(function(k) { + if (k !== 'getRandomValue') { + delete _Module[k]; + } + }); + Object.keys(Module).forEach(function(k) { + _Module[k] = Module[k]; + }); + resolve(); + }; + +var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename$1!="undefined"){_scriptName=__filename$1;}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href;}var scriptDirectory="";if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname$1+"/";if(process.argv.length>1){process.argv[1].replace(/\\/g,"/");}process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module;}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href;}catch{}}else;console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536);},Module:function(binary){},Instance:function(module,info){this.exports=( +// EMSCRIPTEN_START_ASM +function instantiate(ea){var a;var b=new Uint8Array(123);for(var c=25;c>=0;--c){b[48+c]=52+c;b[65+c]=c;b[97+c]=26+c;}b[43]=62;b[47]=63;function i(j,k,l){var d,e,c=0,f=k,g=l.length,h=k+(g*3>>2)-(l[g-2]=="=")-(l[g-1]=="=");for(;c>4;if(f>2;if(f>>0;r=r>>>0;if(p+r>a.length)throw "trap: invalid memory.fill";a.fill(q,p,p+r);}function s(){throw new Error("abort")}function t(p,u,r){a.copyWithin(p,u,u+r);}function da(n){var v=new ArrayBuffer(50331648);var w=new Int8Array(v);var x=new Int16Array(v);var y=new Int32Array(v);var z=new Uint8Array(v);var A=new Uint16Array(v);var B=new Uint32Array(v);var E=Math.imul;var H=Math.clz32;var O=n.a;var P=O.a;var Q=O.b;var R=O.c;var S=O.d;var T=106768;var U=0;var V=0;var W=0; +// EMSCRIPTEN_START_FUNCS +function Eb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;ia=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);c=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);ka=c;Z=z[b+104|0]|z[b+105|0]<<8|(z[b+106|0]<<16|z[b+107|0]<<24);c=z[b+108|0]|z[b+109|0]<<8|(z[b+110|0]<<16|z[b+111|0]<<24);la=c;c=z[b+68|0]|z[b+69|0]<<8|(z[b+70|0]<<16|z[b+71|0]<<24);O=z[b+64|0]|z[b+65|0]<<8|(z[b+66|0]<<16|z[b+67|0]<<24);$=c;c=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);wa=c;s=c;da=z[b+120|0]|z[b+121|0]<<8|(z[b+122|0]<<16|z[b+123|0]<<24);c=z[b+124|0]|z[b+125|0]<<8|(z[b+126|0]<<16|z[b+127|0]<<24);qa=c;c=z[b+92|0]|z[b+93|0]<<8|(z[b+94|0]<<16|z[b+95|0]<<24);Aa=c;pa=z[b+88|0]|z[b+89|0]<<8|(z[b+90|0]<<16|z[b+91|0]<<24);N=c;ca=z[b+80|0]|z[b+81|0]<<8|(z[b+82|0]<<16|z[b+83|0]<<24);c=z[b+84|0]|z[b+85|0]<<8|(z[b+86|0]<<16|z[b+87|0]<<24);na=c;P=c;aa=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);fa=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);c=fa+s|0;ea=z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24);ga=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);L=ea+ga|0;c=(z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24))+(ea>>>0>L>>>0?c+1|0:c)|0;d=L;L=L+aa|0;aa=d>>>0>L>>>0?c+1|0:c;c=aa+ka|0;ja=L+ia|0;c=ja>>>0>>0?c+1|0:c;ba=ja;ja=c;L=Ci(L^(z[a+80|0]|z[a+81|0]<<8|(z[a+82|0]<<16|z[a+83|0]<<24))^-79577749,aa^(z[a+84|0]|z[a+85|0]<<8|(z[a+86|0]<<16|z[a+87|0]<<24))^528734635,32);c=W;ta=c;c=c+1013904242|0;aa=L;L=L-23791573|0;c=L>>>0<4271175723?c+1|0:c;S=c;fa=Ci(L^ea,c^fa,40);ea=fa+ba|0;c=ja;ja=W;c=c+ja|0;k=ea;l=k>>>0>>0?c+1|0:c;ea=Ci(aa^k,ta^l,48);J=W;c=S+J|0;m=ea;ea=L+m|0;c=ea>>>0>>0?c+1|0:c;o=ea;p=c;c=Ci(fa^o,ja^c,1);L=W;ea=c;S=L;ja=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);c=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);ta=c;ha=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);fa=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);aa=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);L=fa+aa|0;xa=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);Ba=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);c=xa+Ba|0;c=(z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24))+(L>>>0>>0?c+1|0:c)|0;d=L;L=L+ha|0;ba=d>>>0>L>>>0?c+1|0:c;c=ta+ba|0;ha=L+ja|0;c=ha>>>0>>0?c+1|0:c;d=Ci(L^(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))^725511199,ba^(z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24))^-1694144372,32);L=W;C=L;e=d-2067093701|0;H=C-((d>>>0<2067093701)+1150833018|0)|0;h=Ci(aa^e,Ba^H,40);L=h+ha|0;K=W;c=K+c|0;q=L;B=q>>>0>>0?c+1|0:c;c=B+S|0;L=q+ea|0;c=(q>>>0>L>>>0?c+1|0:c)+P|0;f=L;L=L+ca|0;aa=f>>>0>L>>>0?c+1|0:c;c=aa+N|0;N=L+pa|0;c=N>>>0>>0?c+1|0:c;F=N;j=c;n=ea;ra=S;S=L;ba=aa;ea=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);L=c;c=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);Ba=c;aa=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);Ca=aa;P=c;ua=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);g=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);c=ua+g|0;N=z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24);aa=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);f=N+aa|0;c=Ca+(N>>>0>f>>>0?c+1|0:c)|0;P=f+P|0;ha=P>>>0>>0?c+1|0:c;c=ha+L|0;f=P+ea|0;c=f>>>0

>>0?c+1|0:c;oa=f;f=c;i=N;c=a- -64|0;N=Ci(P^(z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24))^-1377402159,ha^(z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24))^1359893119,32);c=W;ha=c;c=c+1779033703|0;P=N;N=N-205731576|0;c=N>>>0<4089235720?c+1|0:c;r=N;x=c;g=Ci(i^r,c^g,40);N=g+oa|0;E=W;c=E+f|0;f=N;t=g>>>0>f>>>0?c+1|0:c;i=Ci(P^f,ha^t,48);U=W;c=Ci(i^S,U^ba,32);N=W;R=N;G=c;c=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);za=c;oa=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);ha=oa;v=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);ba=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);P=z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24);N=ba+P|0;va=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);D=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);c=va+D|0;c=(z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24))+(N>>>0

>>0?c+1|0:c)|0;u=N;N=v+N|0;S=u>>>0>N>>>0?c+1|0:c;c=za+S|0;v=N+ha|0;c=v>>>0>>0?c+1|0:c;S=Ci(N^(z[a+88|0]|z[a+89|0]<<8|(z[a+90|0]<<16|z[a+91|0]<<24))^327033209,S^(z[a+92|0]|z[a+93|0]<<8|(z[a+94|0]<<16|z[a+95|0]<<24))^1541459225,32);N=W;y=N;ha=S+1595750129|0;u=D;D=y-((S>>>0<2699217167)+1521486533|0)|0;P=Ci(P^ha,u^D,40);N=P+v|0;Y=W;c=Y+c|0;v=N;u=v>>>0

>>0?c+1|0:c;N=Ci(v^S,y^u,48);V=W;c=D+V|0;D=N;N=ha+D|0;c=N>>>0>>0?c+1|0:c;y=N;A=c;c=R+c|0;S=G+y|0;c=S>>>0>>0?c+1|0:c;Q=n^S;n=c;ha=Ci(Q,c^ra,40);N=ha+F|0;ra=W;c=ra+j|0;j=N;F=G^j;G=j>>>0>>0?c+1|0:c;N=Ci(F,R^G,48);_=W;c=n+_|0;F=N;n=S+F|0;c=n>>>0>>0?c+1|0:c;R=c;I=Ci(n^ha,ra^c,1);S=z[b+72|0]|z[b+73|0]<<8|(z[b+74|0]<<16|z[b+75|0]<<24);N=I+S|0;ma=W;ra=z[b+76|0]|z[b+77|0]<<8|(z[b+78|0]<<16|z[b+79|0]<<24);c=ma+ra|0;sa=N;M=N>>>0>>0?c+1|0:c;T=la;N=z[b+96|0]|z[b+97|0]<<8|(z[b+98|0]<<16|z[b+99|0]<<24);c=z[b+100|0]|z[b+101|0]<<8|(z[b+102|0]<<16|z[b+103|0]<<24);ha=c;c=k;k=Ci(y^P,A^Y,1);P=c+k|0;y=W;c=y+l|0;c=(k>>>0>P>>>0?c+1|0:c)+ha|0;l=P;P=N+P|0;l=l>>>0>P>>>0?c+1|0:c;c=l+T|0;A=P+Z|0;c=A>>>0

>>0?c+1|0:c;Q=A;A=c;q=Ci(d^q,B^C,48);C=W;c=Ci(q^P,C^l,32);P=W;Y=P;B=c;c=x+U|0;P=i+r|0;r=P>>>0>>0?c+1|0:c;c=Y+r|0;l=P;i=l+B|0;c=l>>>0>i>>>0?c+1|0:c;x=c;k=Ci(i^k,y^c,40);P=k+Q|0;U=W;c=U+A|0;A=P;y=k>>>0>A>>>0?c+1|0:c;c=y+M|0;P=A+sa|0;d=A>>>0>P>>>0?c+1|0:c;c=d+qa|0;M=P+da|0;c=M>>>0

>>0?c+1|0:c;sa=M;M=c;Q=P;T=d;P=z[b+116|0]|z[b+117|0]<<8|(z[b+118|0]<<16|z[b+119|0]<<24);b=z[b+112|0]|z[b+113|0]<<8|(z[b+114|0]<<16|z[b+115|0]<<24);g=Ci(g^l,r^E,1);d=g+v|0;E=W;c=E+u|0;c=(d>>>0>>0?c+1|0:c)+P|0;r=d;d=b+d|0;l=r>>>0>d>>>0?c+1|0:c;c=l+qa|0;r=d+da|0;c=r>>>0>>0?c+1|0:c;ya=r;r=c;c=Ci(d^m,l^J,32);d=W;X=d;m=c;l=d;c=C+H|0;d=e+q|0;c=d>>>0>>0?c+1|0:c;q=d;v=c;c=c+l|0;d=d+m|0;c=q>>>0>d>>>0?c+1|0:c;u=d;J=c;l=Ci(d^g,E^c,40);d=l+ya|0;E=W;c=E+r|0;e=d>>>0>>0?c+1|0:c;m=Ci(d^m,X^e,48);ya=W;c=Ci(m^Q,ya^T,32);g=W;X=g;r=c;Q=g;h=Ci(h^q,v^K,1);q=W;c=t+q|0;g=f;f=f+h|0;c=(g>>>0>f>>>0?c+1|0:c)+$|0;g=f+O|0;f=g>>>0>>0?c+1|0:c;c=f+ra|0;t=g+S|0;c=t>>>0>>0?c+1|0:c;T=t;t=c;v=h;g=Ci(g^D,f^V,32);h=g+o|0;D=W;c=D+p|0;f=h;p=g>>>0>f>>>0?c+1|0:c;o=Ci(v^f,p^q,40);h=o+T|0;V=W;c=V+t|0;q=h;t=h>>>0>>0?c+1|0:c;h=Ci(g^h,D^t,48);Da=W;c=p+Da|0;p=h;h=f+h|0;c=h>>>0>>0?c+1|0:c;v=h;D=c;c=c+Q|0;h=h+r|0;c=v>>>0>h>>>0?c+1|0:c;Q=h;h=h^I;I=c;g=Ci(h,ma^c,40);h=g+sa|0;ma=W;c=ma+M|0;M=h;T=g>>>0>h>>>0?c+1|0:c;c=Aa+T|0;h=h+pa|0;c=h>>>0>>0?c+1|0:c;sa=h;C=c;h=d;H=Z;K=la;d=Ci(B^A,y^Y,48);Y=W;c=x+Y|0;B=d;f=i+d|0;c=f>>>0>>0?c+1|0:c;x=c;d=Ci(f^k,U^c,1);i=W;c=i+K|0;k=d+H|0;c=(k>>>0>>0?c+1|0:c)+e|0;e=h+k|0;h=e>>>0>>0?c+1|0:c;c=va+h|0;k=e+ba|0;c=k>>>0>>0?c+1|0:c;A=k;k=c;e=Ci(e^p,h^Da,32);y=W;c=R+y|0;p=e;e=n+e|0;c=e>>>0>>0?c+1|0:c;n=c;h=Ci(d^e,c^i,40);d=h+A|0;c=k;k=W;c=c+k|0;i=d;A=d>>>0>>0?c+1|0:c;d=Ci(d^p,y^A,48);U=W;c=n+U|0;y=d;n=e+d|0;c=n>>>0>>0?c+1|0:c;R=c;d=Ci(h^n,k^c,1);k=W;c=k+C|0;e=d+sa|0;h=e>>>0>>0?c+1|0:c;c=za+h|0;p=e+oa|0;c=p>>>0>>0?c+1|0:c;sa=p;p=c;C=d;H=k;c=J+ya|0;d=m+u|0;c=d>>>0>>0?c+1|0:c;m=d;u=c;c=Ci(d^l,E^c,1);k=W;l=k;d=c;c=t+P|0;q=b+q|0;c=(q>>>0>>0?c+1|0:c)+k|0;k=d+q|0;q=k>>>0>>0?c+1|0:c;c=na+q|0;t=k+ca|0;c=t>>>0>>0?c+1|0:c;J=t;t=c;k=Ci(k^F,q^_,32);F=W;c=x+F|0;x=f;q=k;f=f+k|0;c=x>>>0>f>>>0?c+1|0:c;x=c;k=Ci(d^f,c^l,40);d=k+J|0;E=W;c=E+t|0;l=d;t=d^q;q=d>>>0>>0?c+1|0:c;d=Ci(t,F^q,48);_=W;c=x+_|0;x=d;d=f+d|0;c=d>>>0>>0?c+1|0:c;t=d;F=c;J=e;K=h;d=Ci(o^v,D^V,1);f=W;c=f+s|0;e=d+ga|0;c=G+(e>>>0>>0?c+1|0:c)|0;e=e+j|0;h=e>>>0>>0?c+1|0:c;c=$+h|0;j=e+O|0;c=j>>>0>>0?c+1|0:c;G=j;j=c;o=d;e=Ci(e^B,h^Y,32);d=e+m|0;m=W;c=m+u|0;h=d;B=d>>>0>>0?c+1|0:c;f=Ci(d^o,B^f,40);d=f+G|0;Y=W;c=Y+j|0;j=d;G=d>>>0>>0?c+1|0:c;v=Ci(d^e,m^G,48);c=K;K=W;e=Ci(v^J,c^K,32);d=e+t|0;J=W;c=J+F|0;m=d;u=d>>>0>>0?c+1|0:c;o=Ci(d^C,u^H,40);d=o+sa|0;C=W;c=C+p|0;p=d;D=d>>>0>>0?c+1|0:c;d=Ci(d^e,J^D,48);V=W;c=u+V|0;e=m;u=d;m=m+d|0;c=e>>>0>m>>>0?c+1|0:c;J=c;d=Ci(m^o,C^c,1);sa=W;c=qa+sa|0;C=d;d=da+d|0;c=d>>>0>>0?c+1|0:c;ya=d;o=c;e=ia;d=Ci(k^t,E^F,1);k=W;c=A+k|0;t=i;i=d+i|0;c=(t>>>0>i>>>0?c+1|0:c)+ka|0;e=e+i|0;t=e>>>0>>0?c+1|0:c;c=t+ta|0;i=e+ja|0;c=i>>>0>>0?c+1|0:c;H=i;A=c;F=d;i=Ci(r^M,T^X,48);E=W;c=Ci(i^e,E^t,32);d=W;X=d;r=c;e=d;c=B+K|0;d=h+v|0;c=d>>>0>>0?c+1|0:c;h=d;B=c;c=c+e|0;d=d+r|0;c=h>>>0>d>>>0?c+1|0:c;t=d;v=c;e=Ci(d^F,c^k,40);c=A;A=W;c=c+A|0;d=e+H|0;c=d>>>0>>0?c+1|0:c;F=d;M=c;c=c+o|0;k=d+ya|0;c=k>>>0>>0?c+1|0:c;T=c;o=c;d=Ci(f^h,B^Y,1);f=W;c=L+f|0;h=d+ea|0;c=q+(h>>>0>>0?c+1|0:c)|0;h=h+l|0;l=h>>>0>>0?c+1|0:c;c=ha+l|0;q=h+N|0;c=q>>>0>>0?c+1|0:c;H=q;q=c;B=d;c=Ci(h^y,l^U,32);d=W;K=d;h=c;l=d;c=E+I|0;d=i+Q|0;c=d>>>0>>0?c+1|0:c;y=d;I=c;c=c+l|0;i=d+h|0;c=i>>>0>>0?c+1|0:c;d=i^B;B=c;l=Ci(d,c^f,40);d=l+H|0;U=W;c=U+q|0;f=d;q=d>>>0>>0?c+1|0:c;Q=Ci(d^h,K^q,48);Y=W;c=Ci(Q^k,Y^o,32);d=W;ya=d;H=c;o=d;d=Ci(g^y,I^ma,1);g=W;c=G+g|0;h=d+j|0;c=ua+(h>>>0>>0?c+1|0:c)|0;h=h+aa|0;j=h>>>0>>0?c+1|0:c;c=j+xa|0;G=h+fa|0;c=G>>>0>>0?c+1|0:c;y=G;G=c;h=Ci(h^x,j^_,32);I=W;c=R+I|0;x=h;h=n+h|0;c=h>>>0>>0?c+1|0:c;j=g;g=c;j=Ci(d^h,j^c,40);d=j+y|0;_=W;c=_+G|0;n=d;y=d^x;x=d>>>0>>0?c+1|0:c;d=Ci(y,I^x,48);E=W;c=g+E|0;g=d;d=h+d|0;c=d>>>0>>0?c+1|0:c;G=d;y=c;c=c+o|0;o=d+H|0;c=o>>>0>>0?c+1|0:c;R=c;h=Ci(o^C,sa^c,40);I=W;c=T+I|0;d=h+k|0;c=(d>>>0>>0?c+1|0:c)+la|0;k=d;d=d+Z|0;c=k>>>0>d>>>0?c+1|0:c;T=d;C=c;K=$;k=Ci(r^F,M^X,48);d=k+t|0;ma=W;c=ma+v|0;r=d;t=d>>>0>>0?c+1|0:c;c=Ci(d^e,t^A,1);e=W;A=e;d=c;c=q+Aa|0;f=f+pa|0;c=(f>>>0>>0?c+1|0:c)+e|0;e=d+f|0;f=e>>>0>>0?c+1|0:c;c=f+K|0;q=e+O|0;c=q>>>0>>0?c+1|0:c;v=q;q=c;e=Ci(e^g,f^E,32);F=W;c=J+F|0;g=e+m|0;c=g>>>0>>0?c+1|0:c;m=c;f=Ci(d^g,c^A,40);d=f+v|0;M=W;c=M+q|0;q=d;A=d>>>0>>0?c+1|0:c;e=Ci(d^e,F^A,48);v=W;c=m+v|0;m=e+g|0;c=m>>>0>>0?c+1|0:c;F=c;d=Ci(f^m,M^c,1);M=W;c=M+C|0;g=d+T|0;c=ra+(g>>>0>>0?c+1|0:c)|0;g=g+S|0;f=g>>>0>>0?c+1|0:c;c=f+s|0;s=g+ga|0;c=s>>>0>>0?c+1|0:c;sa=s;s=c;J=d;K=g;E=f;g=ia;d=Ci(j^G,y^_,1);j=W;c=D+j|0;f=p;p=d+p|0;c=(f>>>0>p>>>0?c+1|0:c)+ka|0;g=g+p|0;f=g>>>0

>>0?c+1|0:c;c=xa+f|0;p=g+fa|0;c=p>>>0>>0?c+1|0:c;D=p;G=c;p=d;c=Ci(g^k,f^ma,32);d=W;y=d;f=c;c=B+Y|0;d=i+Q|0;i=d>>>0>>0?c+1|0:c;c=y+i|0;k=d+f|0;c=k>>>0>>0?c+1|0:c;B=c;p=Ci(k^p,c^j,40);g=p+D|0;Y=W;c=Y+G|0;D=g^f;f=g>>>0

>>0?c+1|0:c;G=Ci(D,y^f,48);_=W;c=Ci(G^K,_^E,32);j=W;ma=j;D=c;y=j;d=Ci(d^l,i^U,1);j=W;c=ha+j|0;i=d+N|0;c=x+(i>>>0>>0?c+1|0:c)|0;i=i+n|0;n=i>>>0>>0?c+1|0:c;c=ua+n|0;l=i+aa|0;c=l>>>0>>0?c+1|0:c;K=l;l=c;x=d;Q=j;i=Ci(i^u,n^V,32);d=i+r|0;u=W;c=u+t|0;j=d;r=d>>>0>>0?c+1|0:c;n=Ci(d^x,r^Q,40);d=n+K|0;U=W;c=U+l|0;x=d;t=d>>>0>>0?c+1|0:c;d=Ci(d^i,u^t,48);K=W;c=r+K|0;l=d;d=j+d|0;c=d>>>0>>0?c+1|0:c;r=d;u=c;c=c+y|0;d=d+D|0;c=r>>>0>d>>>0?c+1|0:c;y=d;i=M;M=c;i=Ci(d^J,i^c,40);c=s;s=W;c=c+s|0;d=i+sa|0;c=d>>>0>>0?c+1|0:c;Q=d;J=c;j=f;d=Ci(H^T,C^ya,48);V=W;c=R+V|0;R=d;d=o+d|0;c=d>>>0>>0?c+1|0:c;f=d^h;h=c;f=Ci(f,c^I,1);g=f+g|0;I=W;c=I+j|0;c=za+(g>>>0>>0?c+1|0:c)|0;g=g+oa|0;j=g>>>0>>0?c+1|0:c;c=j+L|0;o=g+ea|0;c=o>>>0>>0?c+1|0:c;T=o;o=c;g=Ci(g^l,j^K,32);C=W;c=F+C|0;F=g;j=m+g|0;c=j>>>0>>0?c+1|0:c;m=c;f=Ci(f^j,I^c,40);g=f+T|0;c=o;o=W;c=c+o|0;l=g;H=g^F;F=g>>>0>>0?c+1|0:c;g=Ci(H,C^F,48);sa=W;c=m+sa|0;I=g;m=j+g|0;c=m>>>0>>0?c+1|0:c;T=c;g=Ci(f^m,o^c,1);o=W;c=o+J|0;f=g+Q|0;c=Aa+(f>>>0>>0?c+1|0:c)|0;f=f+pa|0;j=f>>>0>>0?c+1|0:c;c=P+j|0;C=b+f|0;c=C>>>0>>0?c+1|0:c;ya=C;C=c;H=g;K=o;o=f;E=j;g=Ci(n^r,u^U,1);j=W;c=j+A|0;f=g+q|0;c=na+(f>>>0>>0?c+1|0:c)|0;f=f+ca|0;n=f>>>0>>0?c+1|0:c;c=n+P|0;q=b+f|0;c=q>>>0>>0?c+1|0:c;A=q;q=c;r=g;c=Ci(f^R,n^V,32);g=W;f=c;n=g;c=B+_|0;g=k+G|0;c=g>>>0>>0?c+1|0:c;k=g;B=c;c=c+n|0;g=g+f|0;c=k>>>0>g>>>0?c+1|0:c;G=g;g=g^r;r=c;j=Ci(g,c^j,40);g=j+A|0;U=W;c=U+q|0;q=g^f;f=g>>>0>>0?c+1|0:c;n=Ci(q,n^f,48);c=E;E=W;c=Ci(n^o,c^E,32);o=W;V=o;q=c;A=h;h=e;c=Ci(k^p,B^Y,1);e=W;u=e;k=c;c=t+ta|0;p=x+ja|0;c=(p>>>0>>0?c+1|0:c)+e|0;e=k+p|0;c=e>>>0

>>0?c+1|0:c;p=c;h=Ci(e^h,c^v,32);d=h+d|0;c=A;A=W;c=c+A|0;B=d>>>0>>0?c+1|0:c;k=Ci(d^k,u^B,40);Y=W;c=p+Y|0;t=e;x=k;e=e+k|0;c=va+(t>>>0>e>>>0?c+1|0:c)|0;k=e+ba|0;c=k>>>0>>0?c+1|0:c;t=c;e=Ci(h^k,A^c,48);_=W;c=B+_|0;v=d;h=e;d=d+e|0;c=v>>>0>d>>>0?c+1|0:c;B=d;A=c;c=c+o|0;o=d+q|0;c=o>>>0>>0?c+1|0:c;v=c;p=Ci(o^H,c^K,40);d=p+ya|0;ya=W;c=ya+C|0;u=d;R=d>>>0

>>0?c+1|0:c;d=Ci(D^Q,J^ma,48);D=W;c=D+M|0;e=d+y|0;c=e>>>0>>0?c+1|0:c;y=e;H=s;s=c;c=Ci(e^i,H^c,1);e=W;Q=e;i=c;c=f+za|0;g=g+oa|0;c=(g>>>0>>0?c+1|0:c)+e|0;e=g+i|0;g=e>>>0>>0?c+1|0:c;c=ra+g|0;f=e+S|0;c=f>>>0>>0?c+1|0:c;J=f;f=c;e=Ci(e^h,g^_,32);C=W;c=T+C|0;M=e;h=m+e|0;c=h>>>0>>0?c+1|0:c;e=h^i;i=c;g=Ci(e,Q^c,40);e=g+J|0;c=f;f=W;c=c+f|0;Q=e;m=e^M;M=e>>>0>>0?c+1|0:c;e=Ci(m,C^M,48);_=W;c=i+_|0;T=e;e=h+e|0;c=e>>>0>>0?c+1|0:c;h=c;g=Ci(e^g,f^c,1);m=W;c=m+R|0;f=g+u|0;c=qa+(f>>>0>>0?c+1|0:c)|0;f=f+da|0;i=f>>>0>>0?c+1|0:c;c=i+$|0;J=f+O|0;c=J>>>0>>0?c+1|0:c;X=J;J=c;C=g;H=f;K=i;g=Ci(x^B,A^Y,1);f=g+Z|0;A=W;c=A+la|0;c=F+(g>>>0>f>>>0?c+1|0:c)|0;f=f+l|0;c=f>>>0>>0?c+1|0:c;i=c;c=Ci(d^f,c^D,32);d=W;D=d;l=c;c=r+E|0;d=n+G|0;c=d>>>0>>0?c+1|0:c;n=d;B=c;c=D+c|0;d=d+l|0;c=n>>>0>d>>>0?c+1|0:c;r=d;x=c;d=Ci(d^g,A^c,40);E=W;c=i+E|0;G=d;d=f+d|0;c=ha+(d>>>0>>0?c+1|0:c)|0;d=d+N|0;c=d>>>0>>0?c+1|0:c;A=d;d=d^l;l=c;i=Ci(d,D^c,48);c=K;K=W;c=Ci(i^H,c^K,32);d=W;Y=d;D=c;F=d;d=Ci(j^n,B^U,1);f=W;c=ta+f|0;g=d+ja|0;c=t+(g>>>0>>0?c+1|0:c)|0;g=g+k|0;j=g>>>0>>0?c+1|0:c;c=j+L|0;n=g+ea|0;c=n>>>0>>0?c+1|0:c;t=n;n=c;k=d;B=f;g=Ci(g^I,j^sa,32);d=g+y|0;y=W;c=y+s|0;f=d;j=d^k;k=d>>>0>>0?c+1|0:c;j=Ci(j,k^B,40);d=j+t|0;U=W;c=U+n|0;n=d;s=d>>>0>>0?c+1|0:c;g=Ci(d^g,y^s,48);B=W;c=k+B|0;d=g+f|0;c=d>>>0>>0?c+1|0:c;t=d;y=c;c=c+F|0;k=d+D|0;c=k>>>0>>0?c+1|0:c;F=c;f=Ci(k^C,c^m,40);I=W;c=I+J|0;d=f+X|0;c=d>>>0>>0?c+1|0:c;J=d;C=c;d=e;m=h;h=g;e=Ci(q^u,R^V,48);X=W;c=v+X|0;q=e;g=o+e|0;c=g>>>0>>0?c+1|0:c;o=c;c=Ci(g^p,ya^c,1);e=W;v=e;p=c;c=l+wa|0;l=A+ga|0;c=(l>>>0>>0?c+1|0:c)+e|0;e=l+p|0;c=e>>>0>>0?c+1|0:c;l=c;h=Ci(e^h,c^B,32);d=h+d|0;A=W;c=A+m|0;m=d>>>0>>0?c+1|0:c;p=Ci(d^p,v^m,40);u=W;c=l+u|0;l=e;e=e+p|0;c=ua+(l>>>0>e>>>0?c+1|0:c)|0;l=e+aa|0;c=l>>>0>>0?c+1|0:c;B=c;e=Ci(h^l,A^c,48);V=W;c=m+V|0;A=e;m=d+e|0;c=m>>>0>>0?c+1|0:c;v=c;d=Ci(m^p,u^c,1);p=W;c=p+C|0;e=d+J|0;c=na+(e>>>0>>0?c+1|0:c)|0;e=e+ca|0;h=e>>>0>>0?c+1|0:c;c=qa+h|0;u=e+da|0;c=u>>>0>>0?c+1|0:c;ma=u;u=c;R=d;H=e;d=Ci(j^t,y^U,1);j=W;c=j+M|0;e=d+Q|0;c=xa+(e>>>0>>0?c+1|0:c)|0;e=e+fa|0;t=e>>>0>>0?c+1|0:c;c=va+t|0;y=e+ba|0;c=y>>>0>>0?c+1|0:c;Q=y;y=c;M=d;c=Ci(e^q,t^X,32);d=W;X=d;e=c;c=x+K|0;d=i+r|0;c=d>>>0>>0?c+1|0:c;r=d;q=c;c=X+c|0;i=d+e|0;c=i>>>0>>0?c+1|0:c;x=c;j=Ci(i^M,c^j,40);d=j+Q|0;K=W;c=K+y|0;t=d;y=d>>>0>>0?c+1|0:c;M=Ci(d^e,X^y,48);X=W;c=Ci(M^H,X^h,32);d=W;U=d;Q=c;h=d;e=ia;d=Ci(r^G,q^E,1);q=W;c=s+q|0;r=n;n=d+n|0;c=(r>>>0>n>>>0?c+1|0:c)+ka|0;e=e+n|0;n=e>>>0>>0?c+1|0:c;c=na+n|0;s=e+ca|0;c=s>>>0>>0?c+1|0:c;r=s;s=c;e=Ci(e^T,n^_,32);G=W;c=o+G|0;o=e;e=g+e|0;c=e>>>0>>0?c+1|0:c;g=q;q=c;g=Ci(d^e,g^c,40);d=g+r|0;E=W;c=E+s|0;n=d;s=d>>>0>>0?c+1|0:c;d=Ci(d^o,G^s,48);H=W;c=q+H|0;q=d;d=e+d|0;c=d>>>0>>0?c+1|0:c;r=d;G=c;c=c+h|0;o=d+Q|0;c=o>>>0>>0?c+1|0:c;d=o^R;R=c;p=Ci(d,c^p,40);d=p+ma|0;_=W;c=_+u|0;u=d;T=d>>>0

>>0?c+1|0:c;d=Ci(D^J,C^Y,48);Y=W;c=F+Y|0;D=d;d=k+d|0;c=d>>>0>>0?c+1|0:c;k=d;F=c;c=Ci(d^f,c^I,1);d=W;I=d;h=c;c=y+ra|0;e=t+S|0;c=(e>>>0>>0?c+1|0:c)+d|0;d=e+h|0;e=d>>>0>>0?c+1|0:c;c=ua+e|0;f=d+aa|0;c=f>>>0>>0?c+1|0:c;t=f;f=c;d=Ci(d^q,e^H,32);y=W;c=v+y|0;q=d;e=m+d|0;c=e>>>0>>0?c+1|0:c;m=c;h=Ci(e^h,I^c,40);d=h+t|0;I=W;c=I+f|0;t=d;f=d^q;q=d>>>0>>0?c+1|0:c;d=Ci(f,y^q,48);ma=W;c=m+ma|0;m=d;f=e+d|0;c=f>>>0>>0?c+1|0:c;v=c;d=Ci(f^h,I^c,1);y=W;c=y+T|0;e=d+u|0;c=ta+(e>>>0>>0?c+1|0:c)|0;e=e+ja|0;h=e>>>0>>0?c+1|0:c;c=h+la|0;I=e+Z|0;c=I>>>0>>0?c+1|0:c;sa=I;I=c;J=d;C=e;H=h;d=Ci(g^r,E^G,1);h=W;c=xa+h|0;e=d+fa|0;c=B+(e>>>0>>0?c+1|0:c)|0;e=e+l|0;g=e>>>0>>0?c+1|0:c;c=wa+g|0;l=e+ga|0;c=l>>>0>>0?c+1|0:c;G=l;l=c;B=d;r=h;c=Ci(e^D,g^Y,32);d=W;D=d;g=c;e=d;c=x+X|0;d=i+M|0;c=d>>>0>>0?c+1|0:c;i=d;x=c;c=c+e|0;h=d+g|0;c=h>>>0>>0?c+1|0:c;d=h^B;B=c;d=Ci(d,c^r,40);c=l;l=W;c=c+l|0;e=d+G|0;c=e>>>0>>0?c+1|0:c;r=e;G=c;D=Ci(e^g,D^c,48);c=H;H=W;c=Ci(D^C,c^H,32);e=W;E=e;M=c;e=Ci(i^j,x^K,1);i=W;c=i+ka|0;g=e+ia|0;c=s+(g>>>0>>0?c+1|0:c)|0;g=g+n|0;j=g>>>0>>0?c+1|0:c;c=za+j|0;n=g+oa|0;c=n>>>0>>0?c+1|0:c;K=n;n=c;s=e;x=i;g=Ci(g^A,j^V,32);e=g+k|0;A=W;c=A+F|0;i=e;k=e>>>0>>0?c+1|0:c;j=Ci(e^s,k^x,40);e=j+K|0;K=W;c=K+n|0;s=e;x=e>>>0>>0?c+1|0:c;e=Ci(e^g,A^x,48);X=W;c=k+X|0;A=e;e=i+e|0;c=e>>>0>>0?c+1|0:c;F=e;C=c;c=E+c|0;g=e+M|0;c=g>>>0>>0?c+1|0:c;e=y;y=c;i=Ci(g^J,e^c,40);e=i+sa|0;Y=W;c=Y+I|0;n=e;I=e>>>0>>0?c+1|0:c;c=Ci(e^M,E^I,48);e=W;E=e;M=c;e=d;c=B+H|0;d=h+D|0;c=d>>>0>>0?c+1|0:c;B=d;D=c;c=Ci(d^e,c^l,1);e=W;h=e;d=c;c=x+Aa|0;k=s+pa|0;c=(k>>>0>>0?c+1|0:c)+e|0;e=d+k|0;k=e>>>0>>0?c+1|0:c;c=ha+k|0;l=e+N|0;c=l>>>0>>0?c+1|0:c;H=l;l=c;s=d;x=h;d=Ci(u^Q,T^U,48);U=W;c=R+U|0;u=d;d=o+d|0;c=d>>>0>>0?c+1|0:c;o=d;e=Ci(e^m,k^ma,32);d=e+d|0;R=c;Q=W;c=c+Q|0;h=d;m=d>>>0>>0?c+1|0:c;k=Ci(d^s,m^x,40);d=k+H|0;T=W;c=T+l|0;l=d;s=d>>>0>>0?c+1|0:c;d=Ci(d^e,Q^s,48);V=W;c=m+V|0;x=d;m=h+d|0;c=m>>>0>>0?c+1|0:c;Q=c;d=Ci(k^m,T^c,1);H=W;c=ua+H|0;T=d;d=aa+d|0;c=d>>>0>>0?c+1|0:c;ma=d;h=c;d=Ci(p^o,R^_,1);k=W;c=k+G|0;e=d+r|0;c=va+(e>>>0>>0?c+1|0:c)|0;e=e+ba|0;o=e>>>0>>0?c+1|0:c;c=$+o|0;p=e+O|0;c=p>>>0>>0?c+1|0:c;R=p;p=c;r=k;e=Ci(e^A,o^X,32);X=W;c=v+X|0;G=e;k=f+e|0;c=k>>>0>>0?c+1|0:c;f=r;r=c;o=Ci(d^k,f^c,40);d=o+R|0;_=W;c=_+p|0;A=d;v=d>>>0>>0?c+1|0:c;c=v+h|0;h=d+ma|0;c=h>>>0>>0?c+1|0:c;p=c;c=Ci(h^M,c^E,32);d=W;R=c;J=d;d=Ci(j^F,C^K,1);f=W;c=f+q|0;e=d+t|0;c=P+(e>>>0>>0?c+1|0:c)|0;e=b+e|0;j=e>>>0>>0?c+1|0:c;c=j+L|0;q=e+ea|0;c=q>>>0>>0?c+1|0:c;C=q;q=c;t=d;F=f;e=Ci(e^u,j^U,32);d=e+B|0;u=W;c=u+D|0;f=d;B=d>>>0>>0?c+1|0:c;j=Ci(d^t,B^F,40);d=j+C|0;C=W;c=C+q|0;q=d;t=d>>>0>>0?c+1|0:c;d=Ci(d^e,u^t,48);U=W;c=B+U|0;B=d;d=f+d|0;c=d>>>0>>0?c+1|0:c;f=d;u=c;c=c+J|0;d=d+R|0;c=f>>>0>d>>>0?c+1|0:c;D=c;e=Ci(d^T,H^c,40);H=W;c=p+H|0;F=e;e=h+e|0;c=Aa+(e>>>0>>0?c+1|0:c)|0;e=e+pa|0;c=e>>>0>>0?c+1|0:c;T=e;h=e^R;R=c;e=Ci(h,J^c,48);J=W;c=D+J|0;p=d+e|0;c=p>>>0>>0?c+1|0:c;D=c;c=Ci(p^F,H^c,1);h=W;d=c;F=h;h=Ci(f^j,u^C,1);j=W;c=s+j|0;f=h+l|0;c=va+(f>>>0>>0?c+1|0:c)|0;f=f+ba|0;l=f>>>0>>0?c+1|0:c;c=na+l|0;s=f+ca|0;c=s>>>0>>0?c+1|0:c;H=s;s=c;u=h;C=j;c=y+E|0;h=g+M|0;c=h>>>0>>0?c+1|0:c;y=h;G=Ci(A^G,v^X,48);X=W;j=Ci(f^G,l^X,32);h=j+h|0;A=c;ma=W;c=c+ma|0;l=h;v=h>>>0>>0?c+1|0:c;h=Ci(h^u,v^C,40);u=W;c=u+s|0;g=h+H|0;c=g>>>0>>0?c+1|0:c;M=g;C=c;c=c+F|0;g=d+g|0;c=za+(M>>>0>g>>>0?c+1|0:c)|0;g=g+oa|0;f=g>>>0>>0?c+1|0:c;c=f+ka|0;s=g+ia|0;c=s>>>0>>0?c+1|0:c;sa=s;H=c;K=d;E=g;c=Ci(i^y,A^Y,1);g=W;i=g;d=c;c=t+xa|0;s=q+fa|0;c=(s>>>0>>0?c+1|0:c)+g|0;g=d+s|0;s=g>>>0>>0?c+1|0:c;c=ha+s|0;q=g+N|0;c=q>>>0>>0?c+1|0:c;A=q;q=c;t=d;c=Ci(g^x,s^V,32);d=W;y=d;g=c;s=d;c=r+X|0;d=k+G|0;c=d>>>0>>0?c+1|0:c;r=d;x=c;c=c+s|0;k=d+g|0;c=k>>>0>>0?c+1|0:c;d=k^t;t=c;s=Ci(d,c^i,40);d=s+A|0;X=W;c=X+q|0;q=d^g;g=d>>>0>>0?c+1|0:c;G=Ci(q,y^g,48);c=G^E;E=W;c=Ci(c,E^f,32);f=W;Y=f;A=c;q=f;f=Ci(o^r,x^_,1);o=W;c=$+o|0;i=f+O|0;c=I+(i>>>0>>0?c+1|0:c)|0;i=i+n|0;n=i>>>0>>0?c+1|0:c;c=ta+n|0;r=i+ja|0;c=r>>>0>>0?c+1|0:c;x=r;r=c;i=Ci(i^B,n^U,32);y=W;c=Q+y|0;B=i;i=m+i|0;c=i>>>0>>0?c+1|0:c;m=c;n=Ci(f^i,c^o,40);f=n+x|0;U=W;c=U+r|0;o=f;r=f^B;B=f>>>0>>0?c+1|0:c;f=Ci(r,y^B,48);V=W;c=m+V|0;r=f;f=i+f|0;c=f>>>0>>0?c+1|0:c;x=f;y=c;c=c+q|0;i=f+A|0;c=i>>>0>>0?c+1|0:c;f=F;F=c;m=Ci(i^K,f^c,40);f=m+sa|0;I=W;c=I+H|0;q=f;H=f^A;A=f>>>0>>0?c+1|0:c;f=Ci(H,Y^A,48);Y=W;c=F+Y|0;F=f;f=i+f|0;c=f>>>0>>0?c+1|0:c;i=c;c=Ci(f^m,I^c,1);m=W;I=c;_=c;Q=m;m=g;g=h;h=Ci(j^M,C^ma,48);ma=W;c=v+ma|0;v=h;h=l+h|0;c=h>>>0>>0?c+1|0:c;l=d;d=g^h;g=c;d=Ci(d,c^u,1);j=l+d|0;u=W;c=u+m|0;c=wa+(d>>>0>j>>>0?c+1|0:c)|0;j=j+ga|0;l=j>>>0>>0?c+1|0:c;c=la+l|0;m=j+Z|0;c=m>>>0>>0?c+1|0:c;M=m;m=c;j=Ci(j^r,l^V,32);C=W;c=D+C|0;l=j+p|0;c=l>>>0

>>0?c+1|0:c;r=c;p=Ci(d^l,u^c,40);d=p+M|0;V=W;c=V+m|0;u=d;D=d>>>0

>>0?c+1|0:c;j=Ci(d^j,C^D,48);M=W;c=r+M|0;d=j+l|0;c=d>>>0>>0?c+1|0:c;C=d;r=d;H=c;l=h;m=g;c=t+E|0;d=k+G|0;c=d>>>0>>0?c+1|0:c;k=d;d=d^s;s=c;c=Ci(d,X^c,1);d=W;K=d;t=c;g=c;c=B+L|0;h=o+ea|0;c=(h>>>0>>0?c+1|0:c)+d|0;d=h;h=g+h|0;c=d>>>0>h>>>0?c+1|0:c;o=c;g=Ci(e^h,c^J,32);d=g+l|0;c=m;m=W;c=c+m|0;G=d;e=d^t;t=d>>>0>>0?c+1|0:c;e=Ci(e,K^t,40);J=W;c=o+J|0;d=e+h|0;c=ra+(d>>>0>>0?c+1|0:c)|0;l=d+S|0;c=l>>>0>>0?c+1|0:c;K=c;m=Ci(g^l,m^c,48);c=W;sa=c;d=Ci(n^x,y^U,1);g=W;c=g+R|0;h=d+T|0;c=qa+(h>>>0>>0?c+1|0:c)|0;h=h+da|0;n=h>>>0>>0?c+1|0:c;c=P+n|0;o=b+h|0;c=o>>>0>>0?c+1|0:c;R=o;x=c;y=d;o=Ci(h^v,n^ma,32);d=o+k|0;U=W;c=U+s|0;s=d;v=d>>>0>>0?c+1|0:c;h=Ci(d^y,v^g,40);c=x;x=W;c=c+x|0;d=h+R|0;c=d>>>0>>0?c+1|0:c;y=d;R=c;g=c;c=P+Q|0;n=b+I|0;c=(n>>>0>>0?c+1|0:c)+g|0;g=d+n|0;c=g>>>0>>0?c+1|0:c;B=c;d=Ci(g^m,sa^c,32);I=W;c=I+H|0;n=d+r|0;c=n>>>0>>0?c+1|0:c;k=Ci(n^_,c^Q,40);Q=c;r=W;c=la+r|0;T=k+Z|0;c=B+(T>>>0>>0?c+1|0:c)|0;B=g+T|0;c=B>>>0>>0?c+1|0:c;g=I;I=c;g=Ci(d^B,g^c,48);c=Q;Q=W;c=c+Q|0;n=g+n|0;c=n>>>0>>0?c+1|0:c;d=k^n;k=c;c=Ci(d,c^r,1);d=W;T=c;_=c;E=d;r=f;X=i;f=h;h=Ci(o^y,R^U,48);y=W;c=v+y|0;d=h+s|0;c=d>>>0>>0?c+1|0:c;o=d;s=c;f=Ci(d^f,c^x,1);d=f+ga|0;R=W;c=R+wa|0;c=K+(d>>>0>>0?c+1|0:c)|0;i=d+l|0;c=i>>>0>>0?c+1|0:c;l=c;d=Ci(i^j,c^M,32);x=W;c=x+X|0;j=d+r|0;c=j>>>0>>0?c+1|0:c;r=j;v=c;f=Ci(f^j,c^R,40);ma=W;c=na+ma|0;R=f;f=ca+f|0;c=l+(f>>>0>>0?c+1|0:c)|0;f=f+i|0;c=f>>>0>>0?c+1|0:c;i=c;j=Ci(d^f,c^x,48);c=v;v=W;c=c+v|0;d=j+r|0;c=d>>>0>>0?c+1|0:c;M=d;x=d;K=c;c=t+sa|0;d=m+G|0;c=d>>>0>>0?c+1|0:c;r=d^e;e=c;c=Ci(r,c^J,1);l=W;J=l;r=c;c=D+ha|0;m=u+N|0;c=(m>>>0>>0?c+1|0:c)+l|0;t=m;m=m+r|0;c=t>>>0>m>>>0?c+1|0:c;t=c;l=Ci(m^F,Y^c,32);G=l;c=W;u=c;c=c+s|0;l=l+o|0;c=G>>>0>l>>>0?c+1|0:c;D=l;F=c;l=Ci(l^r,J^c,40);J=W;c=ka+J|0;o=l+ia|0;c=t+(o>>>0>>0?c+1|0:c)|0;r=m;m=m+o|0;c=r>>>0>m>>>0?c+1|0:c;o=c;r=Ci(m^G,c^u,48);c=W;Y=c;s=c;p=Ci(p^C,H^V,1);c=W;t=c;G=h;c=c+L|0;h=p+ea|0;c=A+(h>>>0>>0?c+1|0:c)|0;h=h+q|0;c=h>>>0>>0?c+1|0:c;q=h^G;G=c;q=Ci(q,c^y,32);d=q+d|0;V=W;c=V+e|0;A=d;e=t;t=d>>>0>>0?c+1|0:c;e=Ci(d^p,e^t,40);u=W;c=qa+u|0;d=e+da|0;c=G+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;G=d;y=c;h=c;c=E+va|0;p=T+ba|0;c=(p>>>0>>0?c+1|0:c)+h|0;h=d+p|0;c=h>>>0

>>0?c+1|0:c;T=c;d=Ci(h^r,c^s,32);C=W;c=C+K|0;p=d+x|0;c=p>>>0>>0?c+1|0:c;s=Ci(p^_,c^E,40);x=W;H=x;E=c;c=x+ta|0;x=s+ja|0;c=T+(x>>>0>>0?c+1|0:c)|0;x=h+x|0;c=x>>>0>>0?c+1|0:c;T=c;h=Ci(d^x,c^C,48);C=W;c=C+E|0;p=h+p|0;c=p>>>0>>0?c+1|0:c;d=p^s;s=c;c=Ci(d,c^H,1);d=W;H=c;E=d;X=n;U=j;j=e;e=Ci(q^G,y^V,48);q=W;c=q+t|0;d=e+A|0;c=d>>>0>>0?c+1|0:c;t=d;G=c;j=Ci(d^j,c^u,1);d=j+aa|0;u=W;c=u+ua|0;c=(d>>>0>>0?c+1|0:c)+o|0;n=d+m|0;c=n>>>0>>0?c+1|0:c;m=c;d=Ci(n^U,c^v,32);o=W;c=o+k|0;k=d+X|0;c=k>>>0>>0?c+1|0:c;A=k;v=c;j=Ci(j^k,c^u,40);U=W;c=za+U|0;u=j;j=oa+j|0;c=m+(j>>>0>>0?c+1|0:c)|0;k=j+n|0;c=k>>>0>>0?c+1|0:c;y=c;j=Ci(d^k,c^o,48);c=v;v=W;c=c+v|0;d=j+A|0;c=d>>>0>>0?c+1|0:c;A=d;X=c;m=g;n=f;c=F+Y|0;d=r+D|0;c=d>>>0>>0?c+1|0:c;g=c;f=Ci(d^l,c^J,1);l=W;c=l+$|0;o=f+O|0;c=(o>>>0>>0?c+1|0:c)+i|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;i=Ci(m^n,c^Q,32);o=c;r=f;m=W;c=m+G|0;f=i+t|0;c=f>>>0>>0?c+1|0:c;t=f;f=f^r;r=c;f=Ci(f,c^l,40);G=W;c=Aa+G|0;l=f+pa|0;c=(l>>>0>>0?c+1|0:c)+o|0;o=l;l=l+n|0;c=o>>>0>l>>>0?c+1|0:c;D=c;m=Ci(i^l,c^m,48);c=W;Y=c;n=c;i=Ci(M^R,K^ma,1);c=W;F=c;R=g;c=c+ra|0;g=i+S|0;c=I+(g>>>0>>0?c+1|0:c)|0;g=g+B|0;c=g>>>0>>0?c+1|0:c;o=q;q=c;o=Ci(e^g,o^c,32);d=o+d|0;V=W;c=V+R|0;B=d;e=F;F=d>>>0>>0?c+1|0:c;e=Ci(d^i,e^F,40);R=W;c=xa+R|0;d=e+fa|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;I=d;M=c;g=c;c=E+ha|0;i=N+H|0;c=(i>>>0>>0?c+1|0:c)+g|0;g=d+i|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^m,c^n,32);Q=W;c=Q+X|0;i=d+A|0;c=i>>>0>>0?c+1|0:c;n=Ci(i^H,c^E,40);H=c;J=W;c=L+J|0;K=n+ea|0;c=q+(K>>>0>>0?c+1|0:c)|0;q=g+K|0;c=q>>>0>>0?c+1|0:c;g=Q;Q=c;g=Ci(d^q,g^c,48);c=H;H=W;c=c+H|0;i=g+i|0;c=i>>>0>>0?c+1|0:c;d=i^n;n=c;c=Ci(d,c^J,1);d=W;J=c;K=d;E=j;j=e;e=Ci(o^I,M^V,48);c=F;F=W;c=c+F|0;d=e+B|0;c=d>>>0>>0?c+1|0:c;B=d;o=R;R=c;j=Ci(d^j,o^c,1);d=j+ja|0;I=W;c=I+ta|0;c=D+(d>>>0>>0?c+1|0:c)|0;o=l;l=d+l|0;c=o>>>0>l>>>0?c+1|0:c;d=v;v=c;d=Ci(l^E,d^c,32);c=s;s=W;c=c+s|0;o=d+p|0;c=o>>>0>>0?c+1|0:c;D=c;p=o;j=Ci(j^o,c^I,40);V=W;c=ra+V|0;I=j;j=S+j|0;c=v+(j>>>0>>0?c+1|0:c)|0;o=j+l|0;c=o>>>0>>0?c+1|0:c;v=c;j=Ci(d^o,c^s,48);c=D;D=W;c=c+D|0;d=j+p|0;c=d>>>0>>0?c+1|0:c;M=d;E=c;p=h;c=r+Y|0;d=m+t|0;c=d>>>0>>0?c+1|0:c;h=c;f=Ci(d^f,c^G,1);m=W;c=la+m|0;l=f+Z|0;c=y+(l>>>0>>0?c+1|0:c)|0;l=k+l|0;c=l>>>0>>0?c+1|0:c;r=l^p;p=c;k=Ci(r,c^C,32);c=W;s=c;r=f;c=c+R|0;f=k+B|0;c=f>>>0>>0?c+1|0:c;t=f;f=f^r;r=c;f=Ci(f,c^m,40);G=W;c=Aa+G|0;m=f+pa|0;c=p+(m>>>0>>0?c+1|0:c)|0;m=l+m|0;c=m>>>0>>0?c+1|0:c;y=c;p=Ci(k^m,c^s,48);c=W;Y=c;l=c;k=Ci(u^A,U^X,1);c=W;B=c;A=h;c=c+za|0;h=k+oa|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+x|0;c=h>>>0>>0?c+1|0:c;x=c;s=Ci(e^h,c^F,32);d=s+d|0;_=W;c=_+A|0;A=d;u=d>>>0>>0?c+1|0:c;e=Ci(d^k,u^B,40);F=W;c=P+F|0;d=b+e|0;c=x+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;x=d;R=c;h=c;c=K+qa|0;k=J+da|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+E|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^J,c^K,40);C=c;J=W;c=wa+J|0;K=l+ga|0;c=B+(K>>>0>>0?c+1|0:c)|0;B=h+K|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=C;C=W;c=c+C|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^J,1);d=W;J=c;ma=c;K=d;X=i;U=j;i=e;e=Ci(s^x,R^_,48);s=W;c=s+u|0;d=e+A|0;c=d>>>0>>0?c+1|0:c;x=d;A=c;i=Ci(d^i,c^F,1);d=i+ia|0;F=W;c=F+ka|0;c=y+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);u=W;c=u+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=c;i=Ci(i^n,c^F,40);_=W;c=ua+_|0;y=i;i=aa+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;m=i+j|0;c=m>>>0>>0?c+1|0:c;i=u;u=c;i=Ci(d^m,i^c,48);c=D;D=W;c=c+D|0;d=i+n|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;j=g;c=r+Y|0;d=p+t|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^G,1);p=W;c=p+xa|0;n=f+fa|0;c=v+(n>>>0>>0?c+1|0:c)|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;j=Ci(j^n,c^H,32);o=W;r=o;o=c;t=f;c=r+A|0;f=j+x|0;c=f>>>0>>0?c+1|0:c;x=f;f=f^t;t=c;f=Ci(f,c^p,40);G=W;c=na+G|0;p=f+ca|0;c=(p>>>0>>0?c+1|0:c)+o|0;o=n+p|0;c=o>>>0

>>0?c+1|0:c;v=r;r=c;p=Ci(j^o,v^c,48);c=W;Y=c;n=c;j=Ci(M^I,E^V,1);c=W;A=c;v=g;c=c+$|0;g=j+O|0;c=Q+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=c;s=Ci(e^g,c^s,32);d=s+d|0;V=W;c=V+v|0;v=d;e=A;A=d>>>0>>0?c+1|0:c;e=Ci(d^j,e^A,40);I=W;c=va+I|0;d=e+ba|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;g=c;c=K+Aa|0;j=J+pa|0;c=(j>>>0>>0?c+1|0:c)+g|0;g=d+j|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^p,c^n,32);J=W;c=J+R|0;j=d+F|0;c=j>>>0>>0?c+1|0:c;n=Ci(j^ma,c^K,40);K=c;H=W;c=ta+H|0;E=n+ja|0;c=q+(E>>>0>>0?c+1|0:c)|0;q=g+E|0;c=q>>>0>>0?c+1|0:c;g=J;J=c;g=Ci(d^q,g^c,48);c=K;K=W;c=c+K|0;j=g+j|0;c=j>>>0>>0?c+1|0:c;d=j^n;n=c;c=Ci(d,c^H,1);d=W;H=c;E=d;X=k;U=i;i=e;e=Ci(s^M,Q^V,48);s=W;c=s+A|0;d=e+v|0;c=d>>>0>>0?c+1|0:c;A=d;v=c;i=Ci(d^i,c^I,1);d=i+aa|0;I=W;c=I+ua|0;c=r+(d>>>0>>0?c+1|0:c)|0;k=d+o|0;c=k>>>0>>0?c+1|0:c;o=c;d=Ci(k^U,c^D,32);r=W;c=r+l|0;l=d+X|0;c=l>>>0>>0?c+1|0:c;D=c;i=Ci(i^l,c^I,40);V=W;c=$+V|0;I=i;i=O+i|0;c=o+(i>>>0>>0?c+1|0:c)|0;o=i+k|0;c=o>>>0>>0?c+1|0:c;i=r;r=c;i=Ci(d^o,i^c,48);c=D;D=W;c=c+D|0;d=i+l|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;k=h;c=t+Y|0;d=p+x|0;c=d>>>0

>>0?c+1|0:c;h=c;f=Ci(d^f,c^G,1);p=W;c=va+p|0;l=f+ba|0;c=u+(l>>>0>>0?c+1|0:c)|0;l=l+m|0;c=l>>>0>>0?c+1|0:c;m=c;k=Ci(k^l,c^C,32);c=W;x=c;t=f;c=c+v|0;f=k+A|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=qa+A|0;p=f+da|0;c=m+(p>>>0>>0?c+1|0:c)|0;m=l+p|0;c=m>>>0>>0?c+1|0:c;l=x;x=c;p=Ci(k^m,l^c,48);c=W;Y=c;l=c;k=Ci(y^F,R^_,1);c=W;v=c;u=h;c=c+P|0;h=b+k|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+B|0;c=h>>>0>>0?c+1|0:c;B=c;s=Ci(e^h,c^s,32);d=s+d|0;_=W;c=_+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^k,e^v,40);y=W;c=ra+y|0;d=e+S|0;c=B+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;h=c;c=E+la|0;k=H+Z|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+Q|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^H,c^E,40);H=c;C=W;c=za+C|0;E=l+oa|0;c=B+(E>>>0>>0?c+1|0:c)|0;B=h+E|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=H;H=W;c=c+H|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=j;U=i;i=e;e=Ci(s^F,R^_,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^y,1);d=i+N|0;y=W;c=y+ha|0;c=x+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);x=W;c=x+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=c;i=Ci(i^n,c^y,40);_=W;c=xa+_|0;y=i;i=fa+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;m=i+j|0;c=m>>>0>>0?c+1|0:c;i=x;x=c;i=Ci(d^m,i^c,48);c=D;D=W;c=c+D|0;d=i+n|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;j=g;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^A,1);p=W;c=p+na|0;n=f+ca|0;c=r+(n>>>0>>0?c+1|0:c)|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;o=c;j=Ci(j^n,c^K,32);c=W;r=c;t=f;c=c+u|0;f=j+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=ka+A|0;p=f+ia|0;c=o+(p>>>0>>0?c+1|0:c)|0;o=n+p|0;c=o>>>0>>0?c+1|0:c;v=r;r=c;p=Ci(j^o,v^c,48);c=W;Y=c;n=c;j=Ci(M^I,Q^V,1);c=W;v=c;u=g;c=c+L|0;g=j+ea|0;c=J+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=c;s=Ci(e^g,c^s,32);d=s+d|0;V=W;c=V+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^j,e^v,40);I=W;c=wa+I|0;d=e+ga|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;g=c;c=E+za|0;j=C+oa|0;c=(j>>>0>>0?c+1|0:c)+g|0;g=d+j|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^p,c^n,32);J=W;c=J+R|0;j=d+F|0;c=j>>>0>>0?c+1|0:c;n=Ci(j^C,c^E,40);K=c;C=W;c=va+C|0;E=n+ba|0;c=q+(E>>>0>>0?c+1|0:c)|0;q=g+E|0;c=q>>>0>>0?c+1|0:c;g=J;J=c;g=Ci(d^q,g^c,48);c=K;K=W;c=c+K|0;j=g+j|0;c=j>>>0>>0?c+1|0:c;d=j^n;n=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=k;U=i;i=e;e=Ci(s^M,Q^V,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^I,1);d=i+ea|0;I=W;c=I+L|0;c=r+(d>>>0>>0?c+1|0:c)|0;k=d+o|0;c=k>>>0>>0?c+1|0:c;o=c;d=Ci(k^U,c^D,32);r=W;c=r+l|0;l=d+X|0;c=l>>>0>>0?c+1|0:c;D=c;i=Ci(i^l,c^I,40);V=W;c=ka+V|0;I=i;i=ia+i|0;c=o+(i>>>0>>0?c+1|0:c)|0;o=i+k|0;c=o>>>0>>0?c+1|0:c;i=r;r=c;i=Ci(d^o,i^c,48);c=D;D=W;c=c+D|0;d=i+l|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;k=h;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;h=c;f=Ci(d^f,c^A,1);p=W;c=na+p|0;l=f+ca|0;c=x+(l>>>0>>0?c+1|0:c)|0;l=l+m|0;c=l>>>0>>0?c+1|0:c;m=c;k=Ci(k^l,c^H,32);c=W;x=c;t=f;c=c+u|0;f=k+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=xa+A|0;p=f+fa|0;c=m+(p>>>0>>0?c+1|0:c)|0;m=l+p|0;c=m>>>0>>0?c+1|0:c;l=x;x=c;p=Ci(k^m,l^c,48);c=W;Y=c;l=c;k=Ci(y^F,R^_,1);c=W;v=c;u=h;c=c+$|0;h=k+O|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+B|0;c=h>>>0>>0?c+1|0:c;B=c;s=Ci(e^h,c^s,32);d=s+d|0;_=W;c=_+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^k,e^v,40);y=W;c=wa+y|0;d=e+ga|0;c=B+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;h=c;c=E+ra|0;k=C+S|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+Q|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^C,c^E,40);H=c;C=W;c=P+C|0;E=b+l|0;c=B+(E>>>0>>0?c+1|0:c)|0;B=h+E|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=H;H=W;c=c+H|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=j;U=i;i=e;e=Ci(s^F,R^_,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^y,1);d=i+da|0;y=W;c=y+qa|0;c=x+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);x=W;c=x+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=c;i=Ci(i^n,c^y,40);_=W;c=Aa+_|0;y=i;i=pa+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;m=i+j|0;c=m>>>0>>0?c+1|0:c;i=x;x=c;i=Ci(d^m,i^c,48);c=D;D=W;c=c+D|0;d=i+n|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;j=g;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^A,1);p=W;c=p+la|0;n=f+Z|0;c=r+(n>>>0>>0?c+1|0:c)|0;n=n+o|0;c=n>>>0>>0?c+1|0:c;o=c;j=Ci(j^n,c^K,32);c=W;r=c;t=f;c=c+u|0;f=j+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=ua+A|0;p=f+aa|0;c=o+(p>>>0>>0?c+1|0:c)|0;o=n+p|0;c=o>>>0>>0?c+1|0:c;v=r;r=c;p=Ci(j^o,v^c,48);c=W;Y=c;n=c;j=Ci(M^I,Q^V,1);c=W;v=c;u=g;c=c+ta|0;g=j+ja|0;c=J+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=c;s=Ci(e^g,c^s,32);d=s+d|0;V=W;c=V+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^j,e^v,40);I=W;c=ha+I|0;d=e+N|0;c=q+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;g=c;c=E+wa|0;j=C+ga|0;c=(j>>>0>>0?c+1|0:c)+g|0;g=d+j|0;c=g>>>0>>0?c+1|0:c;q=c;d=Ci(g^p,c^n,32);J=W;c=J+R|0;j=d+F|0;c=j>>>0>>0?c+1|0:c;n=Ci(j^C,c^E,40);K=c;C=W;c=ka+C|0;E=n+ia|0;c=q+(E>>>0>>0?c+1|0:c)|0;q=g+E|0;c=q>>>0>>0?c+1|0:c;g=J;J=c;g=Ci(d^q,g^c,48);c=K;K=W;c=c+K|0;j=g+j|0;c=j>>>0>>0?c+1|0:c;d=j^n;n=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=k;U=i;i=e;e=Ci(s^M,Q^V,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^I,1);d=i+ba|0;I=W;c=I+va|0;c=r+(d>>>0>>0?c+1|0:c)|0;k=d+o|0;c=k>>>0>>0?c+1|0:c;o=c;d=Ci(k^U,c^D,32);r=W;c=r+l|0;l=d+X|0;c=l>>>0>>0?c+1|0:c;D=c;i=Ci(i^l,c^I,40);V=W;c=za+V|0;I=i;i=oa+i|0;c=o+(i>>>0>>0?c+1|0:c)|0;o=i+k|0;c=o>>>0>>0?c+1|0:c;i=r;r=c;i=Ci(d^o,i^c,48);c=D;D=W;c=c+D|0;d=i+l|0;c=d>>>0>>0?c+1|0:c;M=d;Q=c;k=h;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;h=c;f=Ci(d^f,c^A,1);p=W;c=ua+p|0;l=f+aa|0;c=x+(l>>>0>>0?c+1|0:c)|0;l=l+m|0;c=l>>>0>>0?c+1|0:c;m=c;k=Ci(k^l,c^H,32);c=W;x=c;t=f;c=c+u|0;f=k+v|0;c=f>>>0>>0?c+1|0:c;G=f;f=f^t;t=c;f=Ci(f,c^p,40);A=W;c=L+A|0;p=f+ea|0;c=m+(p>>>0>>0?c+1|0:c)|0;m=l+p|0;c=m>>>0>>0?c+1|0:c;l=x;x=c;p=Ci(k^m,l^c,48);c=W;Y=c;l=c;k=Ci(y^F,R^_,1);c=W;v=c;u=h;c=c+xa|0;h=k+fa|0;c=T+(h>>>0>>0?c+1|0:c)|0;h=h+B|0;c=h>>>0>>0?c+1|0:c;B=c;s=Ci(e^h,c^s,32);d=s+d|0;_=W;c=_+u|0;u=d;e=v;v=d>>>0>>0?c+1|0:c;e=Ci(d^k,e^v,40);y=W;c=ta+y|0;d=e+ja|0;c=B+(d>>>0>>0?c+1|0:c)|0;d=d+h|0;c=d>>>0>>0?c+1|0:c;F=d;R=c;h=c;c=E+na|0;k=C+ca|0;c=(k>>>0>>0?c+1|0:c)+h|0;h=d+k|0;c=h>>>0>>0?c+1|0:c;B=c;d=Ci(h^p,c^l,32);T=W;c=T+Q|0;k=d+M|0;c=k>>>0>>0?c+1|0:c;l=Ci(k^C,c^E,40);H=c;C=W;c=Aa+C|0;E=l+pa|0;c=B+(E>>>0>>0?c+1|0:c)|0;B=h+E|0;c=B>>>0>>0?c+1|0:c;h=T;T=c;h=Ci(d^B,h^c,48);c=H;H=W;c=c+H|0;k=h+k|0;c=k>>>0>>0?c+1|0:c;d=k^l;l=c;c=Ci(d,c^C,1);d=W;C=c;E=d;X=j;U=i;i=e;e=Ci(s^F,R^_,48);s=W;c=s+v|0;d=e+u|0;c=d>>>0>>0?c+1|0:c;v=d;u=c;i=Ci(d^i,c^y,1);d=i+O|0;F=W;c=F+$|0;c=x+(d>>>0>>0?c+1|0:c)|0;j=d+m|0;c=j>>>0>>0?c+1|0:c;m=c;d=Ci(j^U,c^D,32);x=W;c=x+n|0;n=d+X|0;c=n>>>0>>0?c+1|0:c;D=n;y=c;i=Ci(i^n,c^F,40);X=W;c=ra+X|0;F=i;i=S+i|0;c=m+(i>>>0>>0?c+1|0:c)|0;n=i+j|0;c=n>>>0>>0?c+1|0:c;i=x;x=c;i=Ci(d^n,i^c,48);c=y;y=W;c=c+y|0;d=i+D|0;c=d>>>0>>0?c+1|0:c;D=d;R=c;j=g;c=t+Y|0;d=p+G|0;c=d>>>0

>>0?c+1|0:c;g=c;f=Ci(d^f,c^A,1);p=W;c=p+P|0;m=b+f|0;c=r+(m>>>0>>0?c+1|0:c)|0;m=m+o|0;c=m>>>0>>0?c+1|0:c;o=c;j=Ci(j^m,c^K,32);r=j;c=W;t=c;G=f;c=c+u|0;f=j+v|0;c=f>>>0>>0?c+1|0:c;A=f;f=f^G;G=c;f=Ci(f,c^p,40);v=W;c=qa+v|0;j=f+da|0;c=o+(j>>>0>>0?c+1|0:c)|0;j=j+m|0;c=j>>>0>>0?c+1|0:c;u=j^r;r=c;m=Ci(u,c^t,48);c=W;K=c;p=c;o=Ci(M^I,Q^V,1);t=o;c=W;u=c;I=g;c=c+ha|0;g=o+N|0;c=J+(g>>>0>>0?c+1|0:c)|0;g=g+q|0;c=g>>>0>>0?c+1|0:c;q=s;s=c;o=Ci(e^g,q^c,32);d=o+d|0;U=W;c=U+I|0;q=d;e=d^t;t=d>>>0>>0?c+1|0:c;e=Ci(e,t^u,40);u=W;c=la+u|0;d=e+Z|0;c=s+(d>>>0>>0?c+1|0:c)|0;d=d+g|0;c=d>>>0>>0?c+1|0:c;s=d;I=c;g=c;c=E+ra|0;J=S;S=C+S|0;c=(J>>>0>S>>>0?c+1|0:c)+g|0;d=d+S|0;c=d>>>0>>0?c+1|0:c;ra=c;S=Ci(d^m,c^p,32);M=W;c=M+R|0;g=D+S|0;c=g>>>0>>0?c+1|0:c;p=Ci(g^C,c^E,40);J=c;Q=W;c=qa+Q|0;C=da;da=p+da|0;c=ra+(C>>>0>da>>>0?c+1|0:c)|0;da=d+da|0;c=da>>>0>>0?c+1|0:c;d=S^da;S=c;qa=Ci(d,c^M,48);ra=W;c=ra+J|0;d=g+qa|0;c=d>>>0>>0?c+1|0:c;g=c;c=Ci(d^p,c^Q,1);p=W;M=c;Q=k;k=Z;J=la;la=Ci(o^s,I^U,48);o=W;c=o+t|0;Z=q+la|0;c=Z>>>0>>0?c+1|0:c;t=k;s=Z;q=c;k=Ci(e^s,c^u,1);Z=t+k|0;u=W;c=u+J|0;c=r+(k>>>0>Z>>>0?c+1|0:c)|0;Z=j+Z|0;c=Z>>>0>>0?c+1|0:c;e=c;i=Ci(i^Z,c^y,32);c=l;l=W;c=c+l|0;j=i+Q|0;c=j>>>0>>0?c+1|0:c;r=j;t=c;j=Ci(j^k,c^u,40);ba=j+ba|0;u=W;c=u+va|0;c=(j>>>0>ba>>>0?c+1|0:c)+e|0;e=ba;ba=Z+ba|0;c=e>>>0>ba>>>0?c+1|0:c;e=c;i=Ci(i^ba,c^l,48);k=W;c=k+t|0;Z=i+r|0;c=Z>>>0>>0?c+1|0:c;l=Z;va=c;r=b;t=P;c=G+K|0;b=m+A|0;c=b>>>0>>0?c+1|0:c;Z=c;P=Ci(b^f,c^v,1);m=W;c=m+t|0;f=r+P|0;c=x+(f>>>0

>>0?c+1|0:c)|0;f=f+n|0;c=f>>>0>>0?c+1|0:c;h=Ci(f^h,c^H,32);r=c;x=ca;ca=P;n=W;c=n+q|0;P=h+s|0;c=P>>>0>>0?c+1|0:c;q=m;m=c;ca=Ci(P^ca,q^c,40);s=W;c=s+na|0;na=x+ca|0;c=(na>>>0>>0?c+1|0:c)+r|0;r=na;na=f+na|0;c=r>>>0>na>>>0?c+1|0:c;f=h^na;h=c;c=Ci(f,c^n,48);f=W;G=f;n=c;q=O;r=$;O=Ci(D^F,R^X,1);x=O;c=W;t=c;c=c+wa|0;O=x+ga|0;c=T+(O>>>0>>0?c+1|0:c)|0;O=B+O|0;c=O>>>0>>0?c+1|0:c;ga=c;$=Ci(O^la,c^o,32);b=$+b|0;B=W;c=B+Z|0;Z=b;o=b>>>0<$>>>0?c+1|0:c;la=Ci(b^x,o^t,40);b=la+q|0;c=r;r=W;c=c+r|0;c=ga+(b>>>0>>0?c+1|0:c)|0;b=b+O|0;c=b>>>0>>0?c+1|0:c;ga=b;wa=c;O=c;c=p+ua|0;x=aa;aa=M+aa|0;c=(x>>>0>aa>>>0?c+1|0:c)+O|0;O=b+aa|0;c=O>>>0>>0?c+1|0:c;ua=c;aa=Ci(n^O,c^f,32);b=aa+l|0;x=W;c=x+va|0;f=b;q=p;p=b>>>0>>0?c+1|0:c;b=Ci(b^M,q^p,40);t=W;c=xa+t|0;xa=b;b=fa+b|0;c=ua+(b>>>0>>0?c+1|0:c)|0;b=b+O|0;c=b>>>0>>0?c+1|0:c;ua=b;A=(z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24))^b;q=c;v=c^(z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24));O=Ci($^ga,B^wa,48);ga=W;c=ga+o|0;b=O+Z|0;c=b>>>0>>0?c+1|0:c;o=b;wa=c;$=ia;c=m+G|0;b=n+P|0;c=b>>>0

>>0?c+1|0:c;ia=c;ca=Ci(b^ca,c^s,1);$=ca+$|0;n=W;c=n+ka|0;c=($>>>0>>0?c+1|0:c)+e|0;ka=$+ba|0;c=ka>>>0<$>>>0?c+1|0:c;$=c;Z=Ci(ka^qa,c^ra,32);P=W;c=P+wa|0;fa=Z+o|0;c=fa>>>0>>0?c+1|0:c;ba=c;qa=Z;Z=Ci(ca^fa,c^n,40);ca=Z+ja|0;e=W;c=e+ta|0;c=(Z>>>0>ca>>>0?c+1|0:c)+$|0;ka=ca+ka|0;c=ka>>>0>>0?c+1|0:c;ja=ka;m=P;P=c;ca=Ci(qa^ja,m^c,48);$=ca+fa|0;n=W;c=n+ba|0;c=$>>>0>>0?c+1|0:c;fa=$;$=A^$;w[a+8|0]=$;w[a+9|0]=$>>>8;w[a+10|0]=$>>>16;w[a+11|0]=$>>>24;ba=c;c=c^v;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;ka=b;$=ia;b=O;O=Ci(j^l,u^va,1);ia=O+pa|0;ta=W;c=ta+Aa|0;c=(O>>>0>ia>>>0?c+1|0:c)+S|0;l=ia;ia=da+ia|0;c=l>>>0>ia>>>0?c+1|0:c;da=c;b=Ci(b^ia,c^ga,32);c=$;$=W;c=c+$|0;ka=b+ka|0;c=ka>>>0>>0?c+1|0:c;ga=c;qa=b;S=ka;ka=Ci(O^S,c^ta,40);b=ka+oa|0;j=W;c=j+za|0;c=da+(b>>>0>>0?c+1|0:c)|0;b=b+ia|0;c=b>>>0>>0?c+1|0:c;da=b;b=b^qa;qa=c;ia=Ci(b,c^$,48);b=ia+S|0;l=W;c=l+ga|0;S=b;ga=b>>>0>>0?c+1|0:c;b=Ci(o^la,r^wa,1);la=b;c=W;ta=c;c=c+L|0;b=b+ea|0;c=h+(b>>>0>>0?c+1|0:c)|0;O=b+na|0;c=O>>>0>>0?c+1|0:c;L=c;$=Ci(i^O,c^k,32);b=$+d|0;d=W;c=d+g|0;na=b;h=b^la;la=b>>>0<$>>>0?c+1|0:c;ea=Ci(h,la^ta,40);b=ea+N|0;N=W;c=N+ha|0;c=L+(b>>>0>>0?c+1|0:c)|0;L=b+O|0;c=L>>>0>>0?c+1|0:c;b=a;O=L^Ba^S;w[b|0]=O;w[b+1|0]=O>>>8;w[b+2|0]=O>>>16;w[b+3|0]=O>>>24;O=c^Ca^ga;w[b+4|0]=O;w[b+5|0]=O>>>8;w[b+6|0]=O>>>16;w[b+7|0]=O>>>24;$=Ci(L^$,c^d,48);O=$+na|0;na=W;c=na+la|0;la=O>>>0<$>>>0?c+1|0:c;c=la^((z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24))^qa);L=(z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24))^da^O;w[b+16|0]=L;w[b+17|0]=L>>>8;w[b+18|0]=L>>>16;w[b+19|0]=L>>>24;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;b=Ci(aa^ua,q^x,48);L=W;da=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);c=(z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24))^Ci(Z^fa,e^ba,1)^b;w[a+32|0]=c;w[a+33|0]=c>>>8;w[a+34|0]=c>>>16;w[a+35|0]=c>>>24;c=W^da^L;w[a+36|0]=c;w[a+37|0]=c>>>8;w[a+38|0]=c>>>16;w[a+39|0]=c>>>24;c=p+L|0;da=b+f|0;c=da>>>0>>0?c+1|0:c;b=a;Z=(z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24))^P^c;L=(z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24))^ja^da;w[b+24|0]=L;w[b+25|0]=L>>>8;w[b+26|0]=L>>>16;w[b+27|0]=L>>>24;w[b+28|0]=Z;w[b+29|0]=Z>>>8;w[b+30|0]=Z>>>16;w[b+31|0]=Z>>>24;Z=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);b=ia^((z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24))^Ci(O^ea,N^la,1));w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;b=l^(W^Z);w[a+44|0]=b;w[a+45|0]=b>>>8;w[a+46|0]=b>>>16;w[a+47|0]=b>>>24;O=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);b=$^((z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24))^Ci(S^ka,j^ga,1));w[a+56|0]=b;w[a+57|0]=b>>>8;w[a+58|0]=b>>>16;w[a+59|0]=b>>>24;b=na^(W^O);w[a+60|0]=b;w[a+61|0]=b>>>8;w[a+62|0]=b>>>16;w[a+63|0]=b>>>24;O=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);b=ca^((z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24))^Ci(da^xa,c^t,1));w[a+48|0]=b;w[a+49|0]=b>>>8;w[a+50|0]=b>>>16;w[a+51|0]=b>>>24;b=n^(W^O);w[a+52|0]=b;w[a+53|0]=b>>>8;w[a+54|0]=b>>>16;w[a+55|0]=b>>>24;}function qc(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0;H=T-560|0;T=H;k=H+352|0;Za(k);if(g){va(k,39696,34,0);}rb(H+288|0,f,32,0);n=H+352|0;va(n,H+320|0,32,0);va(n,c,d,e);p=H+224|0;Ca(n,p);j=f;r=z[f+32|0]|z[f+33|0]<<8|(z[f+34|0]<<16|z[f+35|0]<<24);t=z[f+36|0]|z[f+37|0]<<8|(z[f+38|0]<<16|z[f+39|0]<<24);l=z[f+40|0]|z[f+41|0]<<8|(z[f+42|0]<<16|z[f+43|0]<<24);h=z[f+44|0]|z[f+45|0]<<8|(z[f+46|0]<<16|z[f+47|0]<<24);k=z[f+48|0]|z[f+49|0]<<8|(z[f+50|0]<<16|z[f+51|0]<<24);f=z[f+52|0]|z[f+53|0]<<8|(z[f+54|0]<<16|z[f+55|0]<<24);m=z[j+60|0]|z[j+61|0]<<8|(z[j+62|0]<<16|z[j+63|0]<<24);j=z[j+56|0]|z[j+57|0]<<8|(z[j+58|0]<<16|z[j+59|0]<<24);w[a+56|0]=j;w[a+57|0]=j>>>8;w[a+58|0]=j>>>16;w[a+59|0]=j>>>24;w[a+60|0]=m;w[a+61|0]=m>>>8;w[a+62|0]=m>>>16;w[a+63|0]=m>>>24;w[a+48|0]=k;w[a+49|0]=k>>>8;w[a+50|0]=k>>>16;w[a+51|0]=k>>>24;w[a+52|0]=f;w[a+53|0]=f>>>8;w[a+54|0]=f>>>16;w[a+55|0]=f>>>24;w[a+40|0]=l;w[a+41|0]=l>>>8;w[a+42|0]=l>>>16;w[a+43|0]=l>>>24;w[a+44|0]=h;w[a+45|0]=h>>>8;w[a+46|0]=h>>>16;w[a+47|0]=h>>>24;w[a+32|0]=r;w[a+33|0]=r>>>8;w[a+34|0]=r>>>16;w[a+35|0]=r>>>24;w[a+36|0]=t;w[a+37|0]=t>>>8;w[a+38|0]=t>>>16;w[a+39|0]=t>>>24;Pa(p);jb(H,p);Wa(a,H);Za(n);if(g){va(n,39696,34,0);}f=H+352|0;va(f,a,64,0);va(f,c,d,e);o=H+160|0;Ca(f,o);Pa(o);w[H+288|0]=z[H+288|0]&248;w[H+319|0]=z[H+319|0]&63|64;u=H+288|0;c=u;d=z[c+23|0];P=z[c+21|0]|z[c+22|0]<<8|d<<16&2031616;Q=(z[o+28|0]|z[o+29|0]<<8|(z[o+30|0]<<16|z[o+31|0]<<24))>>>7|0;l=Ai(P,0,Q,0);k=W;c=z[o+27|0];d=0;h=z[o+23|0]|z[o+24|0]<<8|(z[o+25|0]<<16|z[o+26|0]<<24);f=c<<8|h>>>24;e=z[o+28|0];c=0;e=e<<16;t=c|d;d=e|f;R=((t&3)<<30|d>>>2)&2097151;g=z[u+23|0]|z[u+24|0]<<8|(z[u+25|0]<<16|z[u+26|0]<<24);S=g>>>5&2097151;c=Ai(R,0,S,0);f=c+l|0;d=W+k|0;e=c>>>0>f>>>0?d+1|0:d;d=z[o+23|0];U=d<<16&2031616|(z[o+21|0]|z[o+22|0]<<8);V=(z[u+28|0]|z[u+29|0]<<8|(z[u+30|0]<<16|z[u+31|0]<<24))>>>7|0;c=Ai(U,0,V,0);d=c+f|0;e=W+e|0;k=d;f=c>>>0>d>>>0?e+1|0:e;c=z[u+27|0];e=0;g=c<<8|g>>>24;c=z[u+28|0];d=0;c=c<<16;e=d|e;d=c|g;X=((e&3)<<30|d>>>2)&2097151;Y=h>>>5&2097151;c=Ai(X,0,Y,0);e=c+k|0;d=W+f|0;j=e;f=c>>>0>e>>>0?d+1|0:d;h=Ai(S,0,Y,0);k=W;c=z[u+19|0];d=0;E=z[u+15|0]|z[u+16|0]<<8|(z[u+17|0]<<16|z[u+18|0]<<24);g=c<<8|E>>>24;c=z[u+20|0];c=c<<16;e=d|d;d=c|g;Z=(e&7)<<29|d>>>3;t=e>>>3|0;d=Ai(Z,t,Q,0);e=d+h|0;c=W+k|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(P,i,R,i);g=d+e|0;e=W+c|0;h=g;d=d>>>0>h>>>0?e+1|0:e;c=z[o+19|0];e=0;B=z[o+15|0]|z[o+16|0]<<8|(z[o+17|0]<<16|z[o+18|0]<<24);k=c<<8|B>>>24;g=z[o+20|0];c=0;g=g<<16;l=c|e;e=g|k;_=(l&7)<<29|e>>>3;$=l>>>3|0;c=Ai(_,$,V,0);e=c+h|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(X,i,U,i);p=c+e|0;d=W+d|0;d=c>>>0>p>>>0?d+1|0:d;r=d;c=d-((p>>>0<4293918720)-1|0)|0;v=c;d=c>>>21|0;l=p- -1048576|0;c=(c&2097151)<<11|l>>>21;j=c+j|0;e=d+f|0;e=c>>>0>j>>>0?e+1|0:e;h=e;c=e-((j>>>0<4293918720)-1|0)|0;A=c;k=j- -1048576|0;m=(c&2097151)<<11|k>>>21;g=c>>>21|0;c=Ai(V,0,Y,0);d=W;e=c;c=Ai(Q,0,S,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(R,i,X,i);x=c+e|0;c=W+d|0;c=e>>>0>x>>>0?c+1|0:c;e=x- -1048576|0;d=e&-2097152;n=x-d|0;f=c-((x>>>0<4293918720)-1|0)|0;d=(c-((f&131071)+(d>>>0>x>>>0)|0)|0)+g|0;c=m+n|0;d=c>>>0>>0?d+1|0:d;Ea=d;Fa=c;n=Ai(c,d,470296,0);m=W;d=Ai(Q,0,X,i);c=W;g=d;d=Ai(R,i,V,0);g=g+d|0;c=W+c|0;d=d>>>0>g>>>0?c+1|0:c;c=f>>>21|0;f=(f&2097151)<<11|e>>>21;g=f+g|0;e=c+d|0;e=f>>>0>g>>>0?e+1|0:e;f=e-((g>>>0<4293918720)-1|0)|0;J=f;I=g- -1048576|0;d=I&-2097152;c=g-d|0;g=e-((f&131071)+(d>>>0>g>>>0)|0)|0;Ga=g;e=k&-2097152;d=j-e|0;Ha=d;f=h-((e>>>0>j>>>0)+A|0)|0;Ia=f;Ja=c;e=Ai(c,g,666643,0);g=e+n|0;c=W+m|0;c=e>>>0>g>>>0?c+1|0:c;e=Ai(d,f,654183,0);f=e+g|0;d=W+c|0;q=f;k=e>>>0>f>>>0?d+1|0:d;c=l&-2097152;x=p-c|0;v=r-((c>>>0>p>>>0)+v|0)|0;d=Ai(R,i,Z,t);e=W;c=d;aa=E>>>6&2097151;d=Ai(aa,0,Q,0);f=c+d|0;c=W+e|0;c=d>>>0>f>>>0?c+1|0:c;d=Ai(S,0,U,i);f=d+f|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(P,i,Y,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;ba=B>>>6&2097151;e=Ai(V,0,ba,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;e=Ai(X,i,_,$);f=e+f|0;d=W+c|0;p=f;g=e>>>0>f>>>0?d+1|0:d;c=z[u+14|0];d=0;r=z[u+10|0]|z[u+11|0]<<8|(z[u+12|0]<<16|z[u+13|0]<<24);f=c<<8|r>>>24;e=z[u+15|0];c=0;e=e<<16;d=c|d;c=e|f;ca=((d&1)<<31|c>>>1)&2097151;d=Ai(ca,0,Q,0);c=W;e=d;d=Ai(R,i,aa,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Y,0,Z,t);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(S,0,_,$);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(P,i,U,i);e=c+f|0;d=W+d|0;l=e;f=c>>>0>e>>>0?d+1|0:d;c=z[o+14|0];d=0;j=z[o+10|0]|z[o+11|0]<<8|(z[o+12|0]<<16|z[o+13|0]<<24);h=c<<8|j>>>24;c=z[o+15|0];c=c<<16|h;d=d|d;da=((d&1)<<31|c>>>1)&2097151;d=Ai(da,0,V,0);e=d+l|0;c=W+f|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(X,i,ba,0);l=d+e|0;c=W+c|0;c=d>>>0>l>>>0?c+1|0:c;h=c;d=c-((l>>>0<4293918720)-1|0)|0;K=d;c=d>>>21|0;n=l- -1048576|0;d=(d&2097151)<<11|n>>>21;A=d+p|0;e=c+g|0;e=d>>>0>A>>>0?e+1|0:e;m=e;d=e-((A>>>0<4293918720)-1|0)|0;F=d;c=d>>>21|0;p=A- -1048576|0;e=(d&2097151)<<11|p>>>21;d=e+x|0;c=c+v|0;c=d>>>0>>0?c+1|0:c;Ka=c;La=d;c=Ai(d,c,-997805,-1);e=c+q|0;d=W+k|0;q=e;k=c>>>0>e>>>0?d+1|0:d;s=H+224|0;N=z[s+23|0]|z[s+24|0]<<8|(z[s+25|0]<<16|z[s+26|0]<<24);x=N>>>5&2097151;c=z[u+2|0];ea=c<<16&2031616|(z[u|0]|z[u+1|0]<<8);e=Ai(ea,0,Y,0);d=W;g=z[u+2|0]|z[u+3|0]<<8|(z[u+4|0]<<16|z[u+5|0]<<24);fa=g>>>5&2097151;c=Ai(U,i,fa,0);f=c+e|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;ga=(z[u+7|0]|z[u+8|0]<<8|(z[u+9|0]<<16|z[u+10|0]<<24))>>>7&2097151;c=Ai(ga,0,ba,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;ha=r>>>4&2097151;e=Ai(da,i,ha,0);f=e+f|0;c=W+d|0;r=f;f=e>>>0>f>>>0?c+1|0:c;d=z[u+6|0];c=0;g=d<<8|g>>>24;e=c;c=z[u+7|0];d=0;c=c<<16|g;d=d|e;ia=((d&3)<<30|c>>>2)&2097151;d=Ai(ia,0,_,$);e=d+r|0;c=W+f|0;c=d>>>0>e>>>0?c+1|0:c;ka=(z[o+7|0]|z[o+8|0]<<8|(z[o+9|0]<<16|z[o+10|0]<<24))>>>7&2097151;d=Ai(aa,0,ka,0);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;G=j>>>4&2097151;d=Ai(ca,i,G,0);f=d+f|0;c=W+e|0;g=d>>>0>f>>>0?c+1|0:c;d=z[o+6|0];c=0;j=z[o+2|0]|z[o+3|0]<<8|(z[o+4|0]<<16|z[o+5|0]<<24);r=d<<8|j>>>24;d=c;c=z[o+7|0];e=0;c=c<<16|r;d=d|e;la=((d&3)<<30|c>>>2)&2097151;c=Ai(Z,t,la,0);e=c+f|0;d=W+g|0;d=c>>>0>e>>>0?d+1|0:d;c=z[o+2|0];f=e;ma=c<<16&2031616|(z[o|0]|z[o+1|0]<<8);e=Ai(ma,0,S,0);f=f+e|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;na=j>>>5&2097151;d=Ai(P,i,na,0);e=d+f|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=e+x|0;d=d>>>0>e>>>0?c+1|0:c;r=e;g=d;f=z[s+21|0]|z[s+22|0]<<8;c=Ai(ea,i,U,i);d=W;e=c;c=Ai(_,$,fa,0);j=e+c|0;e=W+d|0;e=c>>>0>j>>>0?e+1|0:e;c=Ai(da,i,ga,0);j=c+j|0;d=W+e|0;d=c>>>0>j>>>0?d+1|0:d;c=Ai(ha,0,G,0);e=c+j|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ba,0,ia,i);j=c+e|0;c=W+d|0;c=e>>>0>j>>>0?c+1|0:c;d=Ai(aa,0,la,i);e=d+j|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(ca,i,ka,0);j=d+e|0;e=W+c|0;e=d>>>0>j>>>0?e+1|0:e;c=Ai(Z,t,na,0);j=c+j|0;d=W+e|0;d=c>>>0>j>>>0?d+1|0:d;c=Ai(P,i,ma,i);e=c+j|0;d=W+d|0;c=c>>>0>e>>>0?d+1|0:d;d=e;e=e+f|0;d=d>>>0>e>>>0?c+1|0:c;c=z[s+23|0];f=e;e=c<<16&2031616;f=f+e|0;c=d;c=e>>>0>f>>>0?c+1|0:c;e=c;c=c-((f>>>0<4293918720)-1|0)|0;o=c;d=c>>>21|0;j=f- -1048576|0;c=(c&2097151)<<11|j>>>21;r=c+r|0;d=d+g|0;g=r;d=g>>>0>>0?d+1|0:d;c=d+k|0;k=g+q|0;c=k>>>0>>0?c+1|0:c;B=g- -1048576|0;g=d-((g>>>0<4293918720)-1|0)|0;C=g;d=B&-2097152;D=k-d|0;L=c-((d>>>0>k>>>0)+g|0)|0;r=f;k=e;c=Ai(Ha,Ia,470296,0);d=W;e=c;c=Ai(Fa,Ea,666643,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(La,Ka,654183,0);f=c+e|0;c=W+d|0;E=f;g=e>>>0>f>>>0?c+1|0:c;d=Ai(_,$,ea,i);c=W;e=d;d=Ai(ba,0,fa,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(ga,0,G,0);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;c=Ai(ha,0,ka,0);f=c+f|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(da,i,ia,i);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(aa,0,na,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(ca,i,la,i);e=d+f|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(Z,t,ma,i);f=d+e|0;d=W+c|0;x=f;e=e>>>0>f>>>0?d+1|0:d;c=z[s+19|0];d=0;q=z[s+15|0]|z[s+16|0]<<8|(z[s+17|0]<<16|z[s+18|0]<<24);v=c<<8|q>>>24;f=z[s+20|0];c=0;f=f<<16;M=c|d;d=f|v;e=(M>>>3|0)+e|0;d=(M&7)<<29|d>>>3;f=d+x|0;x=f;f=d>>>0>f>>>0?e+1|0:e;v=q>>>6&2097151;c=Ai(ba,0,ea,i);d=W;e=c;c=Ai(da,i,fa,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ga,0,ka,0);q=c+e|0;c=W+d|0;c=e>>>0>q>>>0?c+1|0:c;e=Ai(ha,0,la,i);q=e+q|0;d=W+c|0;d=e>>>0>q>>>0?d+1|0:d;e=Ai(ia,i,G,0);q=e+q|0;c=W+d|0;c=e>>>0>q>>>0?c+1|0:c;d=Ai(aa,0,ma,i);q=d+q|0;e=W+c|0;e=d>>>0>q>>>0?e+1|0:e;c=Ai(ca,i,na,0);q=c+q|0;d=W+e|0;c=c>>>0>q>>>0?d+1|0:d;oa=q+v|0;c=oa>>>0>>0?c+1|0:c;wa=c;c=c-((oa>>>0<4293918720)-1|0)|0;Ua=c;ta=oa- -1048576|0;e=(c&2097151)<<11|ta>>>21;xa=e+x|0;c=(c>>>21|0)+f|0;c=e>>>0>xa>>>0?c+1|0:c;ya=c;c=c-((xa>>>0<4293918720)-1|0)|0;Va=c;qa=xa- -1048576|0;e=(c&2097151)<<11|qa>>>21;f=e+E|0;c=(c>>>21|0)+g|0;d=(e>>>0>f>>>0?c+1|0:c)+k|0;e=f+r|0;d=e>>>0>>0?d+1|0:d;c=j&-2097152;k=e-c|0;c=d-((c>>>0>e>>>0)+o|0)|0;o=c;c=c-((k>>>0<4293918720)-1|0)|0;Xa=c;ra=k- -1048576|0;e=(c&2097151)<<11|ra>>>21;g=e+D|0;c=(c>>21)+L|0;c=e>>>0>g>>>0?c+1|0:c;f=c;c=c-((g>>>0<4293918720)-1|0)|0;Ma=c;E=g- -1048576|0;sa=(c&2097151)<<11|E>>>21;r=c>>21;c=p&-2097152;M=A-c|0;F=m-((c>>>0>A>>>0)+F|0)|0;c=Ai(Q,0,V,0);d=W;ua=d;D=c;q=c- -1048576|0;d=d-((c>>>0<4293918720)-1|0)|0;pa=d;c=d>>>21|0;Na=c;Da=(d&2097151)<<11|q>>>21;c=Ai(Da,c,-683901,-1);e=c+l|0;d=W+h|0;d=c>>>0>e>>>0?d+1|0:d;c=n&-2097152;p=e-c|0;j=d-((c>>>0>e>>>0)+K|0)|0;d=Ai(Y,0,aa,0);c=W;e=d;d=Ai(Q,0,ha,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(R,i,ca,i);e=d+e|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(Z,t,U,i);h=d+e|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;c=Ai(S,0,ba,0);h=c+h|0;e=W+d|0;e=c>>>0>h>>>0?e+1|0:e;c=Ai(P,i,_,$);h=c+h|0;d=W+e|0;d=c>>>0>h>>>0?d+1|0:d;e=Ai(V,0,G,0);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(X,i,da,i);e=d+h|0;c=W+c|0;l=e;h=d>>>0>e>>>0?c+1|0:c;c=Ai(R,i,ha,0);d=W;e=c;c=Ai(Q,0,ga,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(aa,0,U,i);m=c+e|0;e=W+d|0;e=c>>>0>m>>>0?e+1|0:e;c=Ai(Y,0,ca,i);m=c+m|0;d=W+e|0;d=c>>>0>m>>>0?d+1|0:d;e=Ai(Z,t,_,$);m=e+m|0;c=W+d|0;c=e>>>0>m>>>0?c+1|0:c;d=Ai(S,0,da,i);e=d+m|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(P,i,ba,0);m=d+e|0;d=W+c|0;d=e>>>0>m>>>0?d+1|0:d;c=Ai(V,0,ka,0);m=c+m|0;e=W+d|0;e=c>>>0>m>>>0?e+1|0:e;c=Ai(X,i,G,0);x=c+m|0;d=W+e|0;d=c>>>0>x>>>0?d+1|0:d;v=d;c=d-((x>>>0<4293918720)-1|0)|0;Aa=c;A=x- -1048576|0;d=(c&2097151)<<11|A>>>21;K=d+l|0;c=(c>>>21|0)+h|0;c=d>>>0>K>>>0?c+1|0:c;n=c;c=c-((K>>>0<4293918720)-1|0)|0;O=c;e=c>>>21|0;m=K- -1048576|0;c=(c&2097151)<<11|m>>>21;L=c+p|0;d=e+j|0;d=c>>>0>L>>>0?d+1|0:d;p=d;c=d-((L>>>0<4293918720)-1|0)|0;za=c;j=L- -1048576|0;h=(c&2097151)<<11|j>>>21;d=h+M|0;c=(c>>21)+F|0;c=d>>>0>>0?c+1|0:c;Oa=c;Qa=d;c=Ai(d,c,-683901,-1);e=c+sa|0;d=W+r|0;sa=e;r=c>>>0>e>>>0?d+1|0:d;c=Ai(R,i,ea,i);d=W;e=c;c=Ai(Y,0,fa,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(_,$,ga,0);h=c+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(ba,0,ha,0);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;d=Ai(U,i,ia,i);h=d+h|0;c=W+e|0;c=d>>>0>h>>>0?c+1|0:c;e=Ai(aa,0,G,0);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;c=Ai(ca,i,da,i);e=c+h|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Z,t,ka,0);h=c+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(S,0,na,0);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;d=Ai(P,i,la,i);h=d+h|0;c=W+e|0;c=d>>>0>h>>>0?c+1|0:c;e=Ai(X,i,ma,i);h=e+h|0;d=W+c|0;F=h;e=e>>>0>h>>>0?d+1|0:d;c=z[s+27|0];d=0;l=c<<8|N>>>24;h=z[s+28|0];c=0;h=h<<16;d=c|d;c=h|l;h=((d&3)<<30|c>>>2)&2097151;c=h+F|0;d=e;l=c;h=c>>>0>>0?d+1|0:d;M=Ai(Ja,Ga,470296,0);F=W;e=(J&2097151)<<11|I>>>21;d=q&-2097152;c=e+(D-d|0)|0;d=ua-((pa&524287)+(d>>>0>D>>>0)|0)+(J>>>21)|0;d=c>>>0>>0?d+1|0:d;Ra=d;Sa=c;d=Ai(c,d,666643,0);e=d+M|0;c=W+F|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Fa,Ea,654183,0);q=d+e|0;e=W+c|0;e=d>>>0>q>>>0?e+1|0:e;d=Ai(Ha,Ia,-997805,-1);q=d+q|0;c=W+e|0;c=d>>>0>q>>>0?c+1|0:c;e=Ai(La,Ka,136657,0);q=e+q|0;d=W+c|0;c=(C&2097151)<<11|B>>>21;B=c+q|0;d=(C>>>21|0)+(e>>>0>q>>>0?d+1|0:d)|0;ua=l- -1048576|0;q=h-((l>>>0<4293918720)-1|0)|0;pa=q;c=(c>>>0>B>>>0?d+1|0:d)+h|0;h=l+B|0;c=h>>>0>>0?c+1|0:c;e=ua&-2097152;d=h-e|0;c=c-((e>>>0>h>>>0)+q|0)|0;e=c+r|0;l=d+sa|0;e=l>>>0>>0?e+1|0:e;h=c-((d>>>0<4293918720)-1|0)|0;M=h;F=d- -1048576|0;d=F&-2097152;c=l-d|0;D=e-((d>>>0>l>>>0)+h|0)|0;N=c;h=g;g=f;c=j&-2097152;Ba=L-c|0;q=p-((c>>>0>L>>>0)+za|0)|0;c=Ai(Sa,Ra,-683901,-1);d=W;e=c;c=Ai(Da,Na,136657,0);f=e+c|0;e=W+d|0;d=n+(c>>>0>f>>>0?e+1|0:e)|0;e=f+K|0;d=e>>>0>>0?d+1|0:d;c=m&-2097152;m=e-c|0;p=d-((c>>>0>e>>>0)+O|0)|0;d=Ai(Da,Na,-997805,-1);e=d+x|0;c=W+v|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Sa,Ra,136657,0);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(Ja,Ga,-683901,-1);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=A&-2097152;j=f-c|0;r=d-((c>>>0>f>>>0)+Aa|0)|0;d=Ai(Y,0,ha,0);c=W;e=d;d=Ai(R,i,ga,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Q,0,ia,i);f=d+e|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(_,$,aa,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(U,i,ca,i);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;e=Ai(Z,t,ba,0);f=e+f|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;e=Ai(S,0,G,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(P,i,da,i);f=d+f|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(V,0,la,i);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(X,i,ka,0);f=e+f|0;c=W+d|0;l=f;f=e>>>0>f>>>0?c+1|0:c;c=Ai(Y,0,ga,0);d=W;e=c;c=Ai(Q,0,fa,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(U,i,ha,0);n=c+e|0;c=W+d|0;c=e>>>0>n>>>0?c+1|0:c;d=Ai(R,i,ia,i);n=d+n|0;e=W+c|0;e=d>>>0>n>>>0?e+1|0:e;c=Ai(aa,0,ba,0);n=c+n|0;d=W+e|0;d=c>>>0>n>>>0?d+1|0:d;e=Ai(_,$,ca,i);n=e+n|0;c=W+d|0;c=e>>>0>n>>>0?c+1|0:c;e=Ai(Z,t,da,i);n=e+n|0;d=W+c|0;d=e>>>0>n>>>0?d+1|0:d;e=Ai(S,0,ka,0);n=e+n|0;c=W+d|0;c=e>>>0>n>>>0?c+1|0:c;d=Ai(P,i,G,0);n=d+n|0;e=W+c|0;e=d>>>0>n>>>0?e+1|0:e;c=Ai(V,0,na,0);n=c+n|0;d=W+e|0;e=Ai(X,i,la,i);za=e+n|0;c=W+(c>>>0>n>>>0?d+1|0:d)|0;c=e>>>0>za>>>0?c+1|0:c;L=c;c=c-((za>>>0<4293918720)-1|0)|0;$a=c;J=za- -1048576|0;e=(c&2097151)<<11|J>>>21;sa=e+l|0;c=(c>>>21|0)+f|0;c=e>>>0>sa>>>0?c+1|0:c;I=c;c=c-((sa>>>0<4293918720)-1|0)|0;ab=c;C=sa- -1048576|0;e=(c&2097151)<<11|C>>>21;K=e+j|0;c=(c>>>21|0)+r|0;c=e>>>0>K>>>0?c+1|0:c;B=c;c=c-((K>>>0<4293918720)-1|0)|0;bb=c;v=K- -1048576|0;e=(c&2097151)<<11|v>>>21;j=e+m|0;c=(c>>21)+p|0;c=e>>>0>j>>>0?c+1|0:c;f=c;c=c-((j>>>0<4293918720)-1|0)|0;p=c;e=j- -1048576|0;r=(c&2097151)<<11|e>>>21;l=r+Ba|0;c=(c>>21)+q|0;c=l>>>0>>0?c+1|0:c;Aa=c;O=l;c=Ai(l,c,-683901,-1);d=W;l=c;c=Ai(Qa,Oa,136657,0);l=l+c|0;d=W+d|0;c=(c>>>0>l>>>0?d+1|0:d)+g|0;g=h+l|0;c=g>>>0>>0?c+1|0:c;d=E&-2097152;Ya=g-d|0;_a=c-((d>>>0>g>>>0)+Ma|0)|0;r=k;l=o;k=Ai(O,Aa,136657,0);g=W;d=e&-2097152;c=j-d|0;Ba=c;f=f-((d>>>0>j>>>0)+p|0)|0;Ta=f;e=Ai(Qa,Oa,-997805,-1);k=e+k|0;d=W+g|0;d=e>>>0>k>>>0?d+1|0:d;e=Ai(c,f,-683901,-1);f=e+k|0;c=W+d|0;Ma=f;h=e>>>0>f>>>0?c+1|0:c;c=Ai(La,Ka,470296,0);d=W;e=c;c=Ai(Ha,Ia,666643,0);f=e+c|0;e=W+d|0;d=ya+(c>>>0>f>>>0?e+1|0:e)|0;c=f+xa|0;d=c>>>0>>0?d+1|0:d;E=c;g=d;d=Ai(La,Ka,666643,0);e=d+oa|0;c=W+wa|0;c=d>>>0>e>>>0?c+1|0:c;d=ta&-2097152;m=e-d|0;x=c-((d>>>0>e>>>0)+Ua|0)|0;d=Ai(ea,i,da,i);c=W;e=d;d=Ai(fa,0,G,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(ga,0,la,i);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;e=Ai(ha,0,na,0);f=e+f|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(ia,i,ka,0);f=d+f|0;e=W+c|0;e=d>>>0>f>>>0?e+1|0:e;c=Ai(ca,i,ma,i);f=c+f|0;d=W+e|0;j=f;f=c>>>0>f>>>0?d+1|0:d;c=z[s+14|0];d=0;p=z[s+10|0]|z[s+11|0]<<8|(z[s+12|0]<<16|z[s+13|0]<<24);k=c<<8|p>>>24;c=z[s+15|0];e=0;c=k|c<<16;d=d|e;d=((d&1)<<31|c>>>1)&2097151;e=d+j|0;c=f;j=e;f=d>>>0>e>>>0?c+1|0:c;k=p>>>4&2097151;c=Ai(ea,i,G,0);d=W;e=c;c=Ai(fa,0,ka,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(ga,0,na,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ha,0,ma,i);p=c+e|0;c=W+d|0;c=e>>>0>p>>>0?c+1|0:c;d=Ai(ia,i,la,i);p=d+p|0;e=W+c|0;c=d>>>0>p>>>0?e+1|0:e;ta=k+p|0;c=ta>>>0

>>0?c+1|0:c;o=c;c=c-((ta>>>0<4293918720)-1|0)|0;cb=c;e=c>>>21|0;q=ta- -1048576|0;c=(c&2097151)<<11|q>>>21;ya=c+j|0;d=e+f|0;d=c>>>0>ya>>>0?d+1|0:d;A=d;c=d-((ya>>>0<4293918720)-1|0)|0;db=c;n=ya- -1048576|0;d=(c&2097151)<<11|n>>>21;m=d+m|0;c=(c>>>21|0)+x|0;c=d>>>0>m>>>0?c+1|0:c;p=c;c=c-((m>>>0<4293918720)-1|0)|0;eb=c;e=c>>21;j=m- -1048576|0;c=(c&2097151)<<11|j>>>21;f=c+E|0;d=e+g|0;d=c>>>0>f>>>0?d+1|0:d;e=qa&-2097152;c=f-e|0;d=d-((e>>>0>f>>>0)+Va|0)|0;Ua=d;qa=c;k=c- -1048576|0;c=d-((c>>>0<4293918720)-1|0)|0;Va=c;d=c>>21;c=(c&2097151)<<11|k>>>21;f=c+Ma|0;e=d+h|0;d=(c>>>0>f>>>0?e+1|0:e)+l|0;c=f;f=f+r|0;d=c>>>0>f>>>0?d+1|0:d;e=ra&-2097152;c=f-e|0;d=d-((e>>>0>f>>>0)+Xa|0)|0;oa=d;l=c;g=c- -1048576|0;c=d-((c>>>0<4293918720)-1|0)|0;wa=c;d=c>>21;c=(c&2097151)<<11|g>>>21;h=c+Ya|0;e=d+_a|0;e=c>>>0>h>>>0?e+1|0:e;c=e-((h>>>0<4293918720)-1|0)|0;ra=c;E=N- -1048576|0;x=D-((N>>>0<4293918720)-1|0)|0;f=h- -1048576|0;r=(c&2097151)<<11|f>>>21;N=r+N|0;c=(c>>21)+D|0;d=E&-2097152;Xa=N-d|0;Ya=(r>>>0>N>>>0?c+1|0:c)-((d>>>0>N>>>0)+x|0)|0;c=f&-2097152;_a=h-c|0;Ma=e-((c>>>0>h>>>0)+ra|0)|0;c=g&-2097152;xa=l-c|0;N=oa-((c>>>0>l>>>0)+wa|0)|0;c=Ai(O,Aa,-997805,-1);d=W;e=c;c=Ai(Qa,Oa,654183,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Ba,Ta,136657,0);f=c+e|0;c=W+d|0;d=Ua+(e>>>0>f>>>0?c+1|0:c)|0;e=f+qa|0;d=e>>>0>>0?d+1|0:d;c=k&-2097152;oa=e-c|0;wa=d-((c>>>0>e>>>0)+Va|0)|0;c=v&-2097152;qa=K-c|0;D=B-((c>>>0>K>>>0)+bb|0)|0;d=Ai(Sa,Ra,-997805,-1);c=W;e=d;d=Ai(Da,Na,654183,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(Ja,Ga,136657,0);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;c=Ai(Fa,Ea,-683901,-1);f=c+f|0;e=W+d|0;d=I+(c>>>0>f>>>0?e+1|0:e)|0;e=f+sa|0;d=e>>>0>>0?d+1|0:d;c=C&-2097152;v=e-c|0;B=d-((c>>>0>e>>>0)+ab|0)|0;d=Ai(Sa,Ra,654183,0);c=W;e=d;d=Ai(Da,Na,470296,0);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(Ja,Ga,-997805,-1);f=d+e|0;e=W+c|0;d=L+(d>>>0>f>>>0?e+1|0:e)|0;c=f+za|0;d=c>>>0>>0?d+1|0:d;e=c;c=Ai(Fa,Ea,136657,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Ha,Ia,-683901,-1);f=c+e|0;c=W+d|0;d=J&-2097152;k=f-d|0;g=(e>>>0>f>>>0?c+1|0:c)-((d>>>0>f>>>0)+$a|0)|0;f=(z[s+28|0]|z[s+29|0]<<8|(z[s+30|0]<<16|z[s+31|0]<<24))>>>7|0;c=Ai(Q,0,ea,i);d=W;e=c;c=Ai(R,i,fa,0);h=e+c|0;e=W+d|0;e=c>>>0>h>>>0?e+1|0:e;c=Ai(U,i,ga,0);h=c+h|0;d=W+e|0;d=c>>>0>h>>>0?d+1|0:d;e=Ai(_,$,ha,0);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;e=Ai(Y,0,ia,i);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;e=Ai(aa,0,da,i);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(ba,0,ca,i);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;c=Ai(Z,t,G,0);h=c+h|0;d=W+e|0;d=c>>>0>h>>>0?d+1|0:d;e=Ai(S,0,la,i);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;e=Ai(P,i,ka,0);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;e=Ai(V,0,ma,i);h=e+h|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(X,i,na,0);h=d+h|0;e=W+c|0;e=d>>>0>h>>>0?e+1|0:e;d=e;c=f+h|0;d=c>>>0>>0?d+1|0:d;e=(pa&2097151)<<11|ua>>>21;I=e+c|0;c=(pa>>>21|0)+d|0;c=e>>>0>I>>>0?c+1|0:c;r=c;d=c-((I>>>0<4293918720)-1|0)|0;ra=d;c=d>>>21|0;t=I- -1048576|0;d=(d&2097151)<<11|t>>>21;C=d+k|0;e=c+g|0;e=d>>>0>C>>>0?e+1|0:e;l=e;d=e-((C>>>0<4293918720)-1|0)|0;ua=d;c=d>>21;h=C- -1048576|0;d=(d&2097151)<<11|h>>>21;v=d+v|0;c=c+B|0;c=d>>>0>v>>>0?c+1|0:c;k=c;d=c-((v>>>0<4293918720)-1|0)|0;J=d;c=d>>21;g=v- -1048576|0;f=(d&2097151)<<11|g>>>21;d=f+qa|0;e=c+D|0;e=d>>>0>>0?e+1|0:e;pa=e;D=d;c=Ai(d,e,-683901,-1);e=c+oa|0;d=W+wa|0;B=e;f=c>>>0>e>>>0?d+1|0:d;d=Ai(Qa,Oa,470296,0);m=d+m|0;c=W+p|0;c=d>>>0>m>>>0?c+1|0:c;d=Ai(O,Aa,654183,0);e=j&-2097152;j=d+(m-e|0)|0;c=W+(c-((e>>>0>m>>>0)+eb|0)|0)|0;c=d>>>0>j>>>0?c+1|0:c;e=Ai(Ba,Ta,-997805,-1);j=e+j|0;d=W+c|0;d=e>>>0>j>>>0?d+1|0:d;c=g&-2097152;e=v-c|0;L=e;k=k-((c>>>0>v>>>0)+J|0)|0;G=k;g=Ai(D,pa,136657,0);j=g+j|0;c=W+d|0;e=Ai(e,k,-683901,-1);p=e+j|0;d=W+(g>>>0>j>>>0?c+1|0:c)|0;d=e>>>0>p>>>0?d+1|0:d;k=d;c=d-((p>>>0<4293918720)-1|0)|0;J=c;g=p- -1048576|0;d=(c&2097151)<<11|g>>>21;j=d+B|0;c=(c>>21)+f|0;c=d>>>0>j>>>0?c+1|0:c;d=c-((j>>>0<4293918720)-1|0)|0;v=d;f=j- -1048576|0;m=(d&2097151)<<11|f>>>21;B=m+xa|0;d=(d>>21)+N|0;xa=B;B=m>>>0>B>>>0?d+1|0:d;d=f&-2097152;N=j-d|0;za=c-((d>>>0>j>>>0)+v|0)|0;c=g&-2097152;oa=p-c|0;wa=k-((c>>>0>p>>>0)+J|0)|0;c=Ai(Qa,Oa,666643,0);e=A+W|0;g=c+ya|0;e=g>>>0>>0?e+1|0:e;c=Ai(O,Aa,470296,0);d=n&-2097152;f=c+(g-d|0)|0;d=W+(e-((d>>>0>g>>>0)+db|0)|0)|0;d=c>>>0>f>>>0?d+1|0:d;e=Ai(Ba,Ta,654183,0);f=e+f|0;c=W+d|0;j=f;f=e>>>0>f>>>0?c+1|0:c;c=h&-2097152;g=C-c|0;k=l-((c>>>0>C>>>0)+ua|0)|0;c=Ai(Sa,Ra,470296,0);d=W;e=c;c=Ai(Da,Na,666643,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(Ja,Ga,654183,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(Fa,Ea,-997805,-1);h=c+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;d=Ai(Ha,Ia,136657,0);e=d+h|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(La,Ka,-683901,-1);h=d+e|0;e=W+c|0;d=r+(d>>>0>h>>>0?e+1|0:e)|0;h=h+I|0;d=h>>>0>>0?d+1|0:d;e=(M&2097151)<<11|F>>>21;c=t&-2097152;C=e+(h-c|0)|0;c=(d-((c>>>0>h>>>0)+ra|0)|0)+(M>>21)|0;c=e>>>0>C>>>0?c+1|0:c;v=c;c=c-((C>>>0<4293918720)-1|0)|0;qa=c;d=g;n=C- -1048576|0;g=(c&2097151)<<11|n>>>21;e=d+g|0;c=(c>>21)+k|0;c=e>>>0>>0?c+1|0:c;J=c;I=e;c=Ai(e,c,-683901,-1);e=c+j|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(D,pa,-997805,-1);f=c+e|0;c=W+d|0;c=e>>>0>f>>>0?c+1|0:c;d=Ai(L,G,136657,0);f=d+f|0;e=W+c|0;F=f;l=d>>>0>f>>>0?e+1|0:e;c=q&-2097152;j=ta-c|0;r=o-((c>>>0>ta>>>0)+cb|0)|0;d=Ai(ea,i,ka,0);c=W;e=d;d=Ai(fa,0,la,i);e=e+d|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(ga,0,ma,i);e=d+e|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=Ai(ia,i,na,0);f=d+e|0;e=W+c|0;d=d>>>0>f>>>0?e+1|0:e;c=(z[s+7|0]|z[s+8|0]<<8|(z[s+9|0]<<16|z[s+10|0]<<24))>>>7&2097151;e=c+f|0;t=e;h=c>>>0>e>>>0?d+1|0:d;c=Ai(ea,i,la,i);d=W;e=c;c=Ai(fa,0,na,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(ia,i,ma,i);f=c+e|0;c=W+d|0;k=f;f=e>>>0>f>>>0?c+1|0:c;d=z[s+6|0];c=0;ra=z[s+2|0]|z[s+3|0]<<8|(z[s+4|0]<<16|z[s+5|0]<<24);g=d<<8|ra>>>24;e=c;c=z[s+7|0];d=0;c=c<<16|g;d=d|e;c=((d&3)<<30|c>>>2)&2097151;k=c+k|0;e=f;e=c>>>0>k>>>0?e+1|0:e;g=e;c=e-((k>>>0<4293918720)-1|0)|0;sa=c;A=k- -1048576|0;e=(c&2097151)<<11|A>>>21;o=e+t|0;c=(c>>>21|0)+h|0;c=e>>>0>o>>>0?c+1|0:c;m=c;c=c-((o>>>0<4293918720)-1|0)|0;ua=c;d=c>>>21|0;p=o- -1048576|0;c=(c&2097151)<<11|p>>>21;f=c+j|0;e=d+r|0;e=c>>>0>f>>>0?e+1|0:e;d=Ai(O,Aa,666643,0);f=d+f|0;c=W+e|0;c=d>>>0>f>>>0?c+1|0:c;d=Ai(Ba,Ta,470296,0);e=d+f|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(I,J,136657,0);f=d+e|0;d=W+c|0;d=e>>>0>f>>>0?d+1|0:d;c=Ai(D,pa,654183,0);e=c+f|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(L,G,-997805,-1);j=c+e|0;e=W+d|0;e=c>>>0>j>>>0?e+1|0:e;r=e;c=e-((j>>>0<4293918720)-1|0)|0;M=c;t=j- -1048576|0;e=(c&2097151)<<11|t>>>21;f=e+F|0;c=(c>>21)+l|0;c=e>>>0>f>>>0?c+1|0:c;e=c-((f>>>0<4293918720)-1|0)|0;F=e;l=f- -1048576|0;h=(e&2097151)<<11|l>>>21;q=h+oa|0;e=(e>>21)+wa|0;K=q;q=h>>>0>q>>>0?e+1|0:e;h=f;d=c;c=n&-2097152;n=(x&2097151)<<11|E>>>21;f=(C-c|0)+n|0;c=(v-((c>>>0>C>>>0)+qa|0)|0)+(x>>21)|0;c=f>>>0>>0?c+1|0:c;x=c;c=c-((f>>>0<4293918720)-1|0)|0;oa=c;e=c>>21;C=e;v=f- -1048576|0;O=(c&2097151)<<11|v>>>21;c=Ai(O,e,-683901,-1);e=c+h|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=l&-2097152;wa=e-c|0;ta=d-((c>>>0>e>>>0)+F|0)|0;d=Ai(O,C,136657,0);e=d+j|0;c=W+r|0;c=d>>>0>e>>>0?c+1|0:c;d=t&-2097152;ya=e-d|0;M=c-((d>>>0>e>>>0)+M|0)|0;d=Ai(Ba,Ta,666643,0);e=p&-2097152;h=d+(o-e|0)|0;c=W+(m-((e>>>0>o>>>0)+ua|0)|0)|0;c=d>>>0>h>>>0?c+1|0:c;e=Ai(I,J,-997805,-1);h=e+h|0;d=W+c|0;d=e>>>0>h>>>0?d+1|0:d;c=Ai(D,pa,470296,0);h=c+h|0;e=W+d|0;e=c>>>0>h>>>0?e+1|0:e;d=Ai(L,G,654183,0);h=d+h|0;c=W+e|0;F=h;r=d>>>0>h>>>0?c+1|0:c;e=ra>>>5&2097151;c=Ai(ea,i,na,0);d=W;l=c;c=Ai(fa,0,ma,i);h=l+c|0;d=W+d|0;c=c>>>0>h>>>0?d+1|0:d;d=e+h|0;c=d>>>0>>0?c+1|0:c;l=d;e=c;d=Ai(ea,i,ma,i);c=z[s+2|0];c=c<<16&2031616|(z[s|0]|z[s+1|0]<<8);o=d+c|0;d=W;d=c>>>0>o>>>0?d+1|0:d;n=d;d=d-((o>>>0<4293918720)-1|0)|0;qa=d;c=d>>>21|0;m=o- -1048576|0;d=(d&2097151)<<11|m>>>21;E=d+l|0;c=c+e|0;c=d>>>0>E>>>0?c+1|0:c;p=c;d=c-((E>>>0<4293918720)-1|0)|0;ra=d;j=E- -1048576|0;e=(d&2097151)<<11|j>>>21;h=e+k|0;d=(d>>>21|0)+g|0;d=e>>>0>h>>>0?d+1|0:d;e=Ai(I,J,654183,0);g=A&-2097152;k=e+(h-g|0)|0;c=W+(d-((g>>>0>h>>>0)+sa|0)|0)|0;c=e>>>0>k>>>0?c+1|0:c;d=Ai(D,pa,666643,0);e=d+k|0;c=W+c|0;c=d>>>0>e>>>0?c+1|0:c;d=e;e=Ai(L,G,470296,0);t=d+e|0;d=W+c|0;d=e>>>0>t>>>0?d+1|0:d;l=d;d=d-((t>>>0<4293918720)-1|0)|0;ua=d;c=d>>21;h=t- -1048576|0;d=(d&2097151)<<11|h>>>21;k=d+F|0;e=c+r|0;e=d>>>0>k>>>0?e+1|0:e;d=e-((k>>>0<4293918720)-1|0)|0;A=d;g=k- -1048576|0;r=(d&2097151)<<11|g>>>21;D=r+ya|0;d=(d>>21)+M|0;pa=D;r=r>>>0>D>>>0?d+1|0:d;c=Ai(O,C,-997805,-1);k=c+k|0;d=W+e|0;d=c>>>0>k>>>0?d+1|0:d;c=g&-2097152;M=k-c|0;F=d-((c>>>0>k>>>0)+A|0)|0;d=Ai(O,C,654183,0);e=d+t|0;c=W+l|0;c=d>>>0>e>>>0?c+1|0:c;d=h&-2097152;D=e-d|0;A=c-((d>>>0>e>>>0)+ua|0)|0;c=Ai(I,J,470296,0);d=j&-2097152;g=c+(E-d|0)|0;e=W+(p-((d>>>0>E>>>0)+ra|0)|0)|0;e=c>>>0>g>>>0?e+1|0:e;d=Ai(L,G,666643,0);g=d+g|0;c=W+e|0;k=g;e=d>>>0>g>>>0?c+1|0:c;d=Ai(I,J,666643,0);g=m&-2097152;j=d+(o-g|0)|0;c=W+(n-((qa&4095)+(g>>>0>o>>>0)|0)|0)|0;c=d>>>0>j>>>0?c+1|0:c;t=c;c=c-((j>>>0<4293918720)-1|0)|0;n=c;l=j- -1048576|0;g=(c&2097151)<<11|l>>>21;h=g+k|0;c=(c>>21)+e|0;c=g>>>0>h>>>0?c+1|0:c;e=c;c=c-((h>>>0<4293918720)-1|0)|0;m=c;k=h- -1048576|0;g=(c&2097151)<<11|k>>>21;p=g+D|0;c=(c>>21)+A|0;g=g>>>0>p>>>0?c+1|0:c;c=Ai(O,C,470296,0);d=c+h|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=k&-2097152;h=d-c|0;k=e-((c>>>0>d>>>0)+m|0)|0;d=Ai(O,C,666643,0);e=l&-2097152;A=d+(j-e|0)|0;c=W+(t-((e>>>0>j>>>0)+n|0)|0)|0;c=d>>>0>A>>>0?c+1|0:c;e=c>>21;c=(c&2097151)<<11|A>>>21;n=c+h|0;d=e+k|0;d=c>>>0>n>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|n>>>21;m=d+p|0;c=c+g|0;c=d>>>0>m>>>0?c+1|0:c;d=c>>21;c=(c&2097151)<<11|m>>>21;g=c+M|0;d=d+F|0;d=c>>>0>g>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|g>>>21;p=d+pa|0;e=c+r|0;e=d>>>0>p>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|p>>>21;j=e+wa|0;c=d+ta|0;c=e>>>0>j>>>0?c+1|0:c;e=c>>21;c=(c&2097151)<<11|j>>>21;r=c+K|0;d=e+q|0;d=c>>>0>r>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|r>>>21;t=d+N|0;c=c+za|0;c=d>>>0>t>>>0?c+1|0:c;d=c>>21;c=(c&2097151)<<11|t>>>21;l=c+xa|0;d=d+B|0;d=c>>>0>l>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|l>>>21;h=d+_a|0;e=c+Ma|0;e=d>>>0>h>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|h>>>21;k=e+Xa|0;c=d+Ya|0;d=v&-2097152;q=f-d|0;c=e>>>0>k>>>0?c+1|0:c;v=q+((c&2097151)<<11|k>>>21)|0;c=(x-((d>>>0>f>>>0)+oa|0)|0)+(c>>21)|0;c=q>>>0>v>>>0?c+1|0:c;B=(c&2097151)<<11|v>>>21;d=c>>21;x=d;c=Ai(B,d,666643,0);d=A&2097151;A=c+d|0;c=W;c=d>>>0>A>>>0?c+1|0:c;f=c;w[a+32|0]=A;w[a+33|0]=(c&255)<<24|A>>>8;c=n&2097151;d=Ai(B,x,470296,0)+c|0;e=W;q=(f&2097151)<<11|A>>>21;n=q+d|0;c=(f>>21)+(c>>>0>d>>>0?e+1|0:e)|0;c=n>>>0>>0?c+1|0:c;w[a+36|0]=(c&2047)<<21|n>>>11;d=c;e=n;w[a+35|0]=(c&7)<<29|e>>>3;w[a+34|0]=((f&65535)<<16|A>>>16)&31|e<<5;f=m&2097151;m=Ai(B,x,654183,0)+f|0;c=W;f=f>>>0>m>>>0?c+1|0:c;n=(d&2097151)<<11|e>>>21;m=n+m|0;d=(d>>21)+f|0;d=m>>>0>>0?d+1|0:d;c=d;w[a+38|0]=(c&63)<<26|m>>>6;f=m;w[a+37|0]=f<<2|(e&1572864)>>>19;e=g&2097151;g=Ai(B,x,-997805,-1)+e|0;d=W;d=e>>>0>g>>>0?d+1|0:d;e=c;c=c>>21;m=(e&2097151)<<11|f>>>21;g=m+g|0;e=c+d|0;e=g>>>0>>0?e+1|0:e;w[a+41|0]=(e&511)<<23|g>>>9;w[a+40|0]=(e&1)<<31|g>>>1;w[a+39|0]=g<<7|(f&2080768)>>>14;d=p&2097151;f=Ai(B,x,136657,0)+d|0;c=W;c=d>>>0>f>>>0?c+1|0:c;d=e;e=d>>21;p=(d&2097151)<<11|g>>>21;f=p+f|0;d=c+e|0;d=f>>>0

>>0?d+1|0:d;w[a+44|0]=(d&4095)<<20|f>>>12;e=f;w[a+43|0]=(d&15)<<28|e>>>4;w[a+42|0]=e<<4|(g&1966080)>>>17;f=j&2097151;g=Ai(B,x,-683901,-1)+f|0;c=W;c=f>>>0>g>>>0?c+1|0:c;f=d;d=d>>21;j=g;g=(f&2097151)<<11|e>>>21;f=j+g|0;d=c+d|0;d=f>>>0>>0?d+1|0:d;w[a+46|0]=(d&127)<<25|f>>>7;w[a+45|0]=f<<1|(e&1048576)>>>20;c=d>>21;d=(d&2097151)<<11|f>>>21;g=d+(r&2097151)|0;e=d>>>0>g>>>0?c+1|0:c;w[a+49|0]=(e&1023)<<22|g>>>10;w[a+48|0]=(e&3)<<30|g>>>2;w[a+47|0]=g<<6|(f&2064384)>>>15;c=e>>21;d=(e&2097151)<<11|g>>>21;e=d+(t&2097151)|0;c=d>>>0>e>>>0?c+1|0:c;w[a+52|0]=(c&8191)<<19|e>>>13;w[a+51|0]=(c&31)<<27|e>>>5;d=l&2097151;l=(c&2097151)<<11|e>>>21;f=d+l|0;d=c>>21;d=f>>>0>>0?d+1|0:d;l=f;w[a+53|0]=f;w[a+50|0]=e<<3|(g&1835008)>>>18;w[a+54|0]=(d&255)<<24|f>>>8;g=(d&2097151)<<11|f>>>21;f=g+(h&2097151)|0;e=d>>21;e=f>>>0>>0?e+1|0:e;w[a+57|0]=(e&2047)<<21|f>>>11;w[a+56|0]=(e&7)<<29|f>>>3;w[a+55|0]=((d&65535)<<16|l>>>16)&31|f<<5;c=e>>21;d=(e&2097151)<<11|f>>>21;e=d+(k&2097151)|0;c=d>>>0>e>>>0?c+1|0:c;w[a+59|0]=(c&63)<<26|e>>>6;w[a+58|0]=e<<2|(f&1572864)>>>19;d=c;c=c>>21;k=(d&2097151)<<11|e>>>21;g=v&2097151;f=k+g|0;d=f>>>0>>0?c+1|0:c;w[a+63|0]=(d&131071)<<15|f>>>17;c=f;w[a+62|0]=(d&511)<<23|c>>>9;w[a+60|0]=c<<7|(e&2080768)>>>14;w[a+61|0]=k+v>>>1;ja(u,64);ja(s,64);if(b){y[b>>2]=64;y[b+4>>2]=0;}T=H+560|0;return 0}function ha(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0;e=z[c+2|0];M=e<<16&2031616|(z[c|0]|z[c+1|0]<<8);p=z[b+23|0]|z[b+24|0]<<8|(z[b+25|0]<<16|z[b+26|0]<<24);N=p>>>5&2097151;g=Ai(M,0,N,0);f=W;e=z[b+23|0];O=e<<16&2031616|(z[b+21|0]|z[b+22|0]<<8);i=z[c+2|0]|z[c+3|0]<<8|(z[c+4|0]<<16|z[c+5|0]<<24);P=i>>>5&2097151;d=Ai(O,0,P,0);g=d+g|0;e=W+f|0;e=d>>>0>g>>>0?e+1|0:e;Q=(z[c+7|0]|z[c+8|0]<<8|(z[c+9|0]<<16|z[c+10|0]<<24))>>>7&2097151;t=z[b+15|0]|z[b+16|0]<<8|(z[b+17|0]<<16|z[b+18|0]<<24);R=t>>>6&2097151;f=Ai(Q,0,R,0);g=f+g|0;d=W+e|0;l=g;f=f>>>0>g>>>0?d+1|0:d;e=z[b+14|0];d=0;m=z[b+10|0]|z[b+11|0]<<8|(z[b+12|0]<<16|z[b+13|0]<<24);j=e<<8|m>>>24;g=z[b+15|0];g=g<<16;n=d|d;e=g|j;S=((n&1)<<31|e>>>1)&2097151;k=z[c+10|0]|z[c+11|0]<<8|(z[c+12|0]<<16|z[c+13|0]<<24);T=k>>>4&2097151;d=Ai(S,0,T,0);e=d+l|0;f=W+f|0;n=e;g=e>>>0>>0?f+1|0:f;d=z[c+6|0];f=0;l=d<<8|i>>>24;e=z[c+7|0];d=0;e=l|e<<16;f=d|f;U=((f&3)<<30|e>>>2)&2097151;i=U;l=0;e=z[b+19|0];j=e<<8|t>>>24;f=d;d=z[b+20|0];e=0;d=d<<16|j;e=e|f;f=e>>>3|0;V=(e&7)<<29|d>>>3;ia=f;d=Ai(i,l,V,f);j=d+n|0;e=W+g|0;e=d>>>0>j>>>0?e+1|0:e;i=z[c+15|0]|z[c+16|0]<<8|(z[c+17|0]<<16|z[c+18|0]<<24);X=i>>>6&2097151;Y=(z[b+7|0]|z[b+8|0]<<8|(z[b+9|0]<<16|z[b+10|0]<<24))>>>7&2097151;f=Ai(X,0,Y,0);g=f+j|0;d=W+e|0;l=g;g=f>>>0>g>>>0?d+1|0:d;e=z[c+14|0];d=0;j=e<<8|k>>>24;e=d;d=z[c+15|0];f=0;d=d<<16;f=e|f;e=d|j;Z=((f&1)<<31|e>>>1)&2097151;_=m>>>4&2097151;d=Ai(Z,0,_,0);f=d+l|0;e=W+g|0;k=f;l=d>>>0>f>>>0?e+1|0:e;d=z[c+19|0];e=0;g=d<<8|i>>>24;d=z[c+20|0];f=0;d=g|d<<16;f=e|f;e=f>>>3|0;$=(f&7)<<29|d>>>3;A=e;g=e;d=z[b+6|0];e=0;n=z[b+2|0]|z[b+3|0]<<8|(z[b+4|0]<<16|z[b+5|0]<<24);i=d<<8|n>>>24;d=z[b+7|0];d=d<<16|i;e=e|e;aa=((e&3)<<30|d>>>2)&2097151;e=Ai($,g,aa,0);g=e+k|0;d=W+l|0;f=e>>>0>g>>>0?d+1|0:d;e=z[c+23|0];ba=e<<16&2031616|(z[c+21|0]|z[c+22|0]<<8);ca=n>>>5&2097151;e=Ai(ba,0,ca,0);g=e+g|0;d=W+f|0;f=e>>>0>g>>>0?d+1|0:d;e=z[b+2|0];da=e<<16&2031616|(z[b|0]|z[b+1|0]<<8);n=z[c+23|0]|z[c+24|0]<<8|(z[c+25|0]<<16|z[c+26|0]<<24);D=n>>>5&2097151;d=Ai(da,0,D,0);g=d+g|0;e=W+f|0;i=g;l=d>>>0>g>>>0?e+1|0:e;d=Ai(O,h,M,h);e=W;f=d;d=Ai(V,ia,P,0);g=f+d|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;d=Ai(Q,0,S,h);g=d+g|0;e=W+f|0;e=d>>>0>g>>>0?e+1|0:e;f=Ai(T,0,_,0);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;e=Ai(R,0,U,h);f=e+g|0;d=W+d|0;d=e>>>0>f>>>0?d+1|0:d;e=f;f=Ai(X,0,aa,h);g=e+f|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=Ai(Z,h,Y,0);g=d+g|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;d=Ai($,A,ca,0);g=d+g|0;e=W+f|0;f=Ai(ba,h,da,h);j=f+g|0;d=W+(d>>>0>g>>>0?e+1|0:e)|0;d=f>>>0>j>>>0?d+1|0:d;g=d;d=d-((j>>>0<4293918720)-1|0)|0;B=d;e=d>>>21|0;v=j- -1048576|0;d=(d&2097151)<<11|v>>>21;i=d+i|0;e=e+l|0;e=d>>>0>i>>>0?e+1|0:e;f=e-((i>>>0<4293918720)-1|0)|0;r=f;s=i- -1048576|0;d=s&-2097152;q=i-d|0;o=e-((d>>>0>i>>>0)+f|0)|0;e=z[c+27|0];d=0;l=e<<8|n>>>24;f=d;d=z[c+28|0];e=0;d=d<<16;f=e|f;e=d|l;ea=((f&3)<<30|e>>>2)&2097151;E=(z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24))>>>7|0;i=Ai(ea,0,E,0);l=W;d=z[b+27|0];e=0;b=z[b+28|0];f=0;d=d<<8|p>>>24|b<<16;e=e|f;fa=((e&3)<<30|d>>>2)&2097151;F=(z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24))>>>7|0;b=Ai(fa,0,F,0);c=b+i|0;d=W+l|0;d=b>>>0>c>>>0?d+1|0:d;f=c;b=Ai(N,0,F,0);c=W;e=b;b=Ai(D,0,E,0);l=e+b|0;e=W+c|0;e=b>>>0>l>>>0?e+1|0:e;b=Ai(ea,h,fa,h);n=b+l|0;e=W+e|0;e=b>>>0>n>>>0?e+1|0:e;l=e;b=e-((n>>>0<4293918720)-1|0)|0;k=b;e=b>>>21|0;c=n- -1048576|0;b=(b&2097151)<<11|c>>>21;i=b+f|0;f=e+d|0;f=b>>>0>i>>>0?f+1|0:f;e=f-((i>>>0<4293918720)-1|0)|0;t=e;m=i- -1048576|0;d=m&-2097152;b=i-d|0;d=f-((e&131071)+(d>>>0>i>>>0)|0)|0;ua=d;va=b;b=Ai(b,d,666643,0);e=b+q|0;d=W+o|0;I=e;i=b>>>0>e>>>0?d+1|0:d;b=c&-2097152;q=n-b|0;x=l-((k&131071)+(b>>>0>n>>>0)|0)|0;b=Ai(ba,h,E,0);c=W;d=b;b=Ai(D,0,fa,h);e=d+b|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(O,h,F,0);c=b+e|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(N,0,ea,h);c=b+c|0;d=W+e|0;k=c;b=b>>>0>c>>>0?d+1|0:d;c=Ai(N,0,D,0);d=W;e=c;c=Ai($,A,E,0);f=e+c|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(ba,h,fa,h);d=c+f|0;f=W+e|0;f=c>>>0>d>>>0?f+1|0:f;c=Ai(V,ia,F,0);e=c+d|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(O,h,ea,h);o=c+e|0;e=W+d|0;e=c>>>0>o>>>0?e+1|0:e;n=e;c=e-((o>>>0<4293918720)-1|0)|0;u=c;d=c>>>21|0;l=o- -1048576|0;c=(c&2097151)<<11|l>>>21;k=c+k|0;e=b+d|0;e=c>>>0>k>>>0?e+1|0:e;c=e;e=e-((k>>>0<4293918720)-1|0)|0;p=e;d=q;b=k- -1048576|0;q=(e&2097151)<<11|b>>>21;f=d+q|0;e=(e>>>21|0)+x|0;e=f>>>0>>0?e+1|0:e;wa=e;d=b&-2097152;b=k-d|0;xa=b;k=c-((d>>>0>k>>>0)+p|0)|0;ya=k;za=f;c=Ai(f,e,470296,0);e=c+I|0;d=W+i|0;d=c>>>0>e>>>0?d+1|0:d;b=Ai(b,k,654183,0);c=b+e|0;f=W+d|0;x=c;i=b>>>0>c>>>0?f+1|0:f;b=l&-2097152;p=o-b|0;o=n-((b>>>0>o>>>0)+u|0)|0;b=Ai($,A,fa,h);c=W;d=b;b=Ai(X,0,E,0);e=d+b|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(O,h,D,0);c=b+e|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(N,0,ba,h);c=b+c|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(R,0,F,0);c=b+c|0;d=W+f|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(V,ia,ea,h);c=b+c|0;e=W+d|0;n=c;l=b>>>0>c>>>0?e+1|0:e;b=Ai(Z,h,E,0);c=W;d=b;b=Ai(X,0,fa,h);e=d+b|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(N,0,$,A);c=b+e|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(V,ia,D,0);c=b+c|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(O,h,ba,h);c=b+c|0;d=W+f|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(S,h,F,0);c=b+c|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(R,0,ea,h);c=b+c|0;d=W+e|0;d=b>>>0>c>>>0?d+1|0:d;b=d;d=d-((c>>>0<4293918720)-1|0)|0;C=d;e=d>>>21|0;u=c- -1048576|0;d=(d&2097151)<<11|u>>>21;G=d+n|0;f=e+l|0;f=d>>>0>G>>>0?f+1|0:f;q=f;d=f-((G>>>0<4293918720)-1|0)|0;ga=d;k=G- -1048576|0;l=(d&2097151)<<11|k>>>21;f=l+p|0;d=(d>>>21|0)+o|0;d=f>>>0>>0?d+1|0:d;Aa=d;Ba=f;d=Ai(f,d,-997805,-1);f=d+x|0;e=W+i|0;o=f;i=d>>>0>f>>>0?e+1|0:e;l=j;j=g;d=Ai(M,h,V,ia);e=W;f=d;d=Ai(R,0,P,0);g=f+d|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai(Q,0,_,0);g=e+g|0;d=W+f|0;d=e>>>0>g>>>0?d+1|0:d;f=Ai(T,0,Y,0);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;f=Ai(S,h,U,h);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;f=Ai(X,0,ca,0);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=Ai(Z,h,aa,h);g=d+g|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai($,A,da,h);g=e+g|0;d=W+f|0;n=g;g=e>>>0>g>>>0?d+1|0:d;d=Ai(M,h,R,0);e=W;f=d;d=Ai(P,0,S,h);f=f+d|0;e=W+e|0;e=d>>>0>f>>>0?e+1|0:e;d=f;f=Ai(Q,0,Y,0);p=d+f|0;d=W+e|0;d=f>>>0>p>>>0?d+1|0:d;f=Ai(T,0,aa,h);p=f+p|0;e=W+d|0;e=f>>>0>p>>>0?e+1|0:e;d=Ai(U,h,_,0);p=d+p|0;f=W+e|0;f=d>>>0>p>>>0?f+1|0:f;e=Ai(X,0,da,h);p=e+p|0;d=W+f|0;f=Ai(Z,h,ca,0);ja=f+p|0;e=W+(e>>>0>p>>>0?d+1|0:d)|0;e=f>>>0>ja>>>0?e+1|0:e;ka=e;e=e-((ja>>>0<4293918720)-1|0)|0;Ja=e;ha=ja- -1048576|0;f=(e&2097151)<<11|ha>>>21;la=f+n|0;e=(e>>>21|0)+g|0;e=f>>>0>la>>>0?e+1|0:e;y=e;e=e-((la>>>0<4293918720)-1|0)|0;Ka=e;I=la- -1048576|0;f=(e&2097151)<<11|I>>>21;l=f+l|0;e=(e>>>21|0)+j|0;e=f>>>0>l>>>0?e+1|0:e;d=Ai(za,wa,666643,0);f=v&-2097152;g=d+(l-f|0)|0;e=W+(e-((f>>>0>l>>>0)+B|0)|0)|0;e=d>>>0>g>>>0?e+1|0:e;f=Ai(xa,ya,470296,0);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;f=Ai(Ba,Aa,654183,0);J=f+g|0;e=W+d|0;e=f>>>0>J>>>0?e+1|0:e;x=e;e=e-((J>>>0<4293918720)-1|0)|0;ra=e;d=e>>21;p=J- -1048576|0;e=(e&2097151)<<11|p>>>21;B=e+o|0;d=d+i|0;d=e>>>0>B>>>0?d+1|0:d;o=d;e=d-((B>>>0<4293918720)-1|0)|0;ma=e;v=B- -1048576|0;pa=(e&2097151)<<11|v>>>21;n=e>>21;d=Ai(M,h,fa,h);e=W;f=d;d=Ai(N,0,P,0);f=f+d|0;e=W+e|0;e=d>>>0>f>>>0?e+1|0:e;d=Ai(Q,0,V,ia);g=d+f|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai(R,0,T,0);g=e+g|0;d=W+f|0;d=e>>>0>g>>>0?d+1|0:d;f=Ai(O,h,U,h);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;f=Ai(X,0,_,0);g=f+g|0;d=W+e|0;d=f>>>0>g>>>0?d+1|0:d;f=Ai(Z,h,S,h);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=Ai(Y,0,$,A);g=d+g|0;f=W+e|0;f=d>>>0>g>>>0?f+1|0:f;e=Ai(ca,0,D,0);g=e+g|0;d=W+f|0;d=e>>>0>g>>>0?d+1|0:d;f=Ai(aa,h,ba,h);g=f+g|0;e=W+d|0;e=f>>>0>g>>>0?e+1|0:e;d=g;g=Ai(ea,h,da,h);f=d+g|0;d=W+e|0;i=f;l=f>>>0>>0?d+1|0:d;K=Ai(E,0,F,0);g=K- -1048576|0;L=W;f=L-((K>>>0<4293918720)-1|0)|0;j=f;d=g&-2097152;e=K-d|0;d=L-((f&524287)+(d>>>0>K>>>0)|0)|0;m=(t&2097151)<<11|m>>>21;f=m+e|0;d=(t>>>21|0)+d|0;d=f>>>0>>0?d+1|0:d;Ca=d;Da=f;e=(r&2097151)<<11|s>>>21;m=Ai(f,d,666643,0)+e|0;d=W+(r>>>21|0)|0;d=e>>>0>m>>>0?d+1|0:d;f=Ai(va,ua,470296,0);m=f+m|0;e=W+d|0;e=(f>>>0>m>>>0?e+1|0:e)+l|0;d=i+m|0;e=d>>>0>>0?e+1|0:e;f=Ai(za,wa,654183,0);m=f+d|0;d=W+e|0;qa=i- -1048576|0;l=l-((i>>>0<4293918720)-1|0)|0;K=l;e=Ai(xa,ya,-997805,-1);i=e+m|0;f=W+(f>>>0>m>>>0?d+1|0:d)|0;f=e>>>0>i>>>0?f+1|0:f;d=Ai(Ba,Aa,136657,0);e=qa&-2097152;s=d+(i-e|0)|0;e=W+(f-((e>>>0>i>>>0)+l|0)|0)|0;t=d>>>0>s>>>0?e+1|0:e;f=t+n|0;d=s+pa|0;f=d>>>0>>0?f+1|0:f;na=d;m=f;d=k&-2097152;L=G-d|0;G=q-((d>>>0>G>>>0)+ga|0)|0;f=j>>>21|0;Ea=f;d=c;ta=(j&2097151)<<11|g>>>21;c=Ai(ta,f,-683901,-1);e=d+c|0;d=W+b|0;b=u&-2097152;q=e-b|0;r=(c>>>0>e>>>0?d+1|0:d)-((b>>>0>e>>>0)+C|0)|0;b=Ai(N,0,X,0);c=W;d=b;b=Ai(T,0,E,0);d=d+b|0;e=W+c|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(Z,h,fa,h);c=b+d|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(O,h,$,A);c=b+c|0;d=W+f|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(R,0,D,0);c=b+c|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(V,ia,ba,h);c=b+c|0;e=W+d|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(_,0,F,0);c=b+c|0;e=W+e|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(S,h,ea,h);c=b+c|0;f=W+e|0;g=c;b=b>>>0>c>>>0?f+1|0:f;c=Ai(T,0,fa,h);d=W;e=c;c=Ai(Q,0,E,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(O,h,X,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(N,0,Z,h);f=c+e|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(V,ia,$,A);d=c+f|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(S,h,D,0);d=c+d|0;f=W+e|0;f=c>>>0>d>>>0?f+1|0:f;c=Ai(R,0,ba,h);e=c+d|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(Y,0,F,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(_,0,ea,h);k=c+e|0;e=W+d|0;e=c>>>0>k>>>0?e+1|0:e;n=e;c=e-((k>>>0<4293918720)-1|0)|0;oa=c;d=c>>>21|0;i=k- -1048576|0;c=(c&2097151)<<11|i>>>21;u=c+g|0;f=b+d|0;f=c>>>0>u>>>0?f+1|0:f;l=f;b=f-((u>>>0<4293918720)-1|0)|0;C=b;d=b>>>21|0;j=u- -1048576|0;b=(b&2097151)<<11|j>>>21;q=b+q|0;e=d+r|0;e=b>>>0>q>>>0?e+1|0:e;g=e;c=e-((q>>>0<4293918720)-1|0)|0;r=c;d=c>>21;b=q- -1048576|0;e=(c&2097151)<<11|b>>>21;c=e+L|0;f=d+G|0;f=c>>>0>>0?f+1|0:f;Fa=f;ga=s- -1048576|0;e=t-((s>>>0<4293918720)-1|0)|0;pa=e;sa=c;c=Ai(c,f,-683901,-1);f=c+na|0;d=W+m|0;d=c>>>0>f>>>0?d+1|0:d;c=ga&-2097152;m=f-c|0;G=m- -1048576|0;e=d-((c>>>0>f>>>0)+e|0)|0;d=e-((m>>>0<4293918720)-1|0)|0;L=d;c=G&-2097152;Pa=m-c|0;La=e-((c>>>0>m>>>0)+d|0)|0;c=Ai(sa,Fa,136657,0);d=v&-2097152;f=c+(B-d|0)|0;e=W+(o-((d>>>0>B>>>0)+ma|0)|0)|0;Ga=f;c=c>>>0>f>>>0?e+1|0:e;b=b&-2097152;H=q-b|0;v=g-((b>>>0>q>>>0)+r|0)|0;b=Ai(Da,Ca,-683901,-1);d=W;e=b;b=Ai(ta,Ea,136657,0);f=e+b|0;d=W+d|0;e=l+(b>>>0>f>>>0?d+1|0:d)|0;d=f+u|0;e=d>>>0>>0?e+1|0:e;b=j&-2097152;t=d-b|0;m=e-((b>>>0>d>>>0)+C|0)|0;b=Ai(ta,Ea,-997805,-1);e=b+k|0;d=W+n|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(Da,Ca,136657,0);e=b+e|0;d=W+d|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(va,ua,-683901,-1);f=b+e|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=i&-2097152;l=f-b|0;j=e-((b>>>0>f>>>0)+oa|0)|0;b=Ai(N,0,T,0);d=W;e=b;b=Ai(Q,0,fa,h);f=e+b|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(U,h,E,0);f=b+f|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(X,0,V,ia);f=b+f|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(O,h,Z,h);f=b+f|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(R,0,$,A);e=b+f|0;f=W+d|0;f=b>>>0>e>>>0?f+1|0:f;b=Ai(_,0,D,0);d=b+e|0;e=W+f|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(S,h,ba,h);f=b+d|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(aa,h,F,0);f=b+f|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(Y,0,ea,h);f=b+f|0;d=W+e|0;g=f;b=b>>>0>f>>>0?d+1|0:d;d=Ai(N,0,Q,0);e=W;f=d;d=Ai(P,0,E,0);i=f+d|0;f=W+e|0;f=d>>>0>i>>>0?f+1|0:f;d=Ai(O,h,T,0);i=d+i|0;e=W+f|0;e=d>>>0>i>>>0?e+1|0:e;f=Ai(U,h,fa,h);i=f+i|0;d=W+e|0;d=f>>>0>i>>>0?d+1|0:d;f=Ai(R,0,X,0);i=f+i|0;e=W+d|0;e=f>>>0>i>>>0?e+1|0:e;f=Ai(V,ia,Z,h);i=f+i|0;d=W+e|0;d=f>>>0>i>>>0?d+1|0:d;e=Ai(S,h,$,A);i=e+i|0;f=W+d|0;f=e>>>0>i>>>0?f+1|0:f;d=Ai(Y,0,D,0);i=d+i|0;e=W+f|0;e=d>>>0>i>>>0?e+1|0:e;f=Ai(_,0,ba,h);i=f+i|0;d=W+e|0;d=f>>>0>i>>>0?d+1|0:d;f=Ai(ca,0,F,0);i=f+i|0;e=W+d|0;e=f>>>0>i>>>0?e+1|0:e;f=Ai(aa,h,ea,h);ma=f+i|0;d=W+e|0;d=f>>>0>ma>>>0?d+1|0:d;B=d;d=d-((ma>>>0<4293918720)-1|0)|0;Qa=d;e=d>>>21|0;r=ma- -1048576|0;d=(d&2097151)<<11|r>>>21;na=d+g|0;e=b+e|0;e=d>>>0>na>>>0?e+1|0:e;s=e;b=e-((na>>>0<4293918720)-1|0)|0;Ra=b;e=b>>>21|0;u=na- -1048576|0;b=(b&2097151)<<11|u>>>21;oa=b+l|0;d=e+j|0;d=b>>>0>oa>>>0?d+1|0:d;q=d;b=d-((oa>>>0<4293918720)-1|0)|0;Sa=b;e=b>>21;o=oa- -1048576|0;b=(b&2097151)<<11|o>>>21;C=b+t|0;e=e+m|0;e=b>>>0>C>>>0?e+1|0:e;n=e;b=e-((C>>>0<4293918720)-1|0)|0;Ma=b;e=b>>21;g=C- -1048576|0;f=(b&2097151)<<11|g>>>21;b=f+H|0;d=e+v|0;d=b>>>0>>0?d+1|0:d;Ha=d;H=b;b=Ai(b,d,-683901,-1);d=b+Ga|0;f=W+c|0;Na=d;i=b>>>0>d>>>0?f+1|0:f;b=p&-2097152;Oa=J-b|0;ra=x-((b>>>0>J>>>0)+ra|0)|0;b=Ai(xa,ya,666643,0);c=I&-2097152;e=b+(la-c|0)|0;d=W+(y-((c>>>0>la>>>0)+Ka|0)|0)|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(Ba,Aa,470296,0);c=b+e|0;e=W+d|0;I=c;c=b>>>0>c>>>0?e+1|0:e;b=ha&-2097152;k=ja-b|0;l=ka-((b>>>0>ja>>>0)+Ja|0)|0;b=Ai(M,h,S,h);d=W;e=b;b=Ai(P,0,_,0);e=e+b|0;f=W+d|0;f=b>>>0>e>>>0?f+1|0:f;b=Ai(Q,0,aa,h);e=b+e|0;d=W+f|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(T,0,ca,0);f=b+e|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(U,h,Y,0);f=b+f|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(Z,h,da,h);f=b+f|0;e=W+d|0;j=f;b=b>>>0>f>>>0?e+1|0:e;d=Ai(M,h,_,0);e=W;f=d;d=Ai(P,0,Y,0);m=f+d|0;f=W+e|0;f=d>>>0>m>>>0?f+1|0:f;e=Ai(Q,0,ca,0);m=e+m|0;d=W+f|0;d=e>>>0>m>>>0?d+1|0:d;f=Ai(T,0,da,h);m=f+m|0;e=W+d|0;e=f>>>0>m>>>0?e+1|0:e;f=Ai(U,h,aa,h);J=f+m|0;d=W+e|0;d=f>>>0>J>>>0?d+1|0:d;x=d;d=d-((J>>>0<4293918720)-1|0)|0;Ta=d;e=d>>>21|0;p=J- -1048576|0;d=(d&2097151)<<11|p>>>21;ka=d+j|0;f=b+e|0;f=d>>>0>ka>>>0?f+1|0:f;v=f;b=f-((ka>>>0<4293918720)-1|0)|0;Ja=b;e=b>>>21|0;t=ka- -1048576|0;b=(b&2097151)<<11|t>>>21;f=b+k|0;d=e+l|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(Ba,Aa,666643,0);ha=b+f|0;e=W+d|0;e=b>>>0>ha>>>0?e+1|0:e;m=e;b=e-((ha>>>0<4293918720)-1|0)|0;Ka=b;d=b>>21;k=ha- -1048576|0;b=(b&2097151)<<11|k>>>21;y=b+I|0;d=c+d|0;d=b>>>0>y>>>0?d+1|0:d;l=d;b=d-((y>>>0<4293918720)-1|0)|0;Ga=b;d=b>>21;j=y- -1048576|0;b=(b&2097151)<<11|j>>>21;c=b+Oa|0;e=d+ra|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(sa,Fa,-997805,-1);d=b+c|0;f=W+e|0;f=b>>>0>d>>>0?f+1|0:f;c=g&-2097152;b=C-c|0;la=b;e=n-((c>>>0>C>>>0)+Ma|0)|0;Ia=e;c=Ai(H,Ha,136657,0);g=c+d|0;d=W+f|0;b=Ai(b,e,-683901,-1);n=b+g|0;d=W+(c>>>0>g>>>0?d+1|0:d)|0;d=b>>>0>n>>>0?d+1|0:d;g=d;b=d-((n>>>0<4293918720)-1|0)|0;ja=b;e=b>>21;f=n- -1048576|0;b=(b&2097151)<<11|f>>>21;I=b+Na|0;d=e+i|0;i=I;d=i>>>0>>0?d+1|0:d;c=d;d=d-((i>>>0<4293918720)-1|0)|0;C=d;b=i- -1048576|0;I=(d&2097151)<<11|b>>>21;ra=I+Pa|0;d=(d>>21)+La|0;La=ra;I=I>>>0>ra>>>0?d+1|0:d;b=b&-2097152;Ma=i-b|0;Na=c-((b>>>0>i>>>0)+C|0)|0;b=f&-2097152;Oa=n-b|0;ra=g-((b>>>0>n>>>0)+ja|0)|0;b=Ai(sa,Fa,654183,0);c=j&-2097152;d=b+(y-c|0)|0;e=W+(l-((c>>>0>y>>>0)+Ga|0)|0)|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(H,Ha,-997805,-1);c=b+d|0;d=W+e|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(la,Ia,136657,0);c=b+c|0;d=W+d|0;Ga=c;b=b>>>0>c>>>0?d+1|0:d;c=o&-2097152;ja=oa-c|0;y=q-((c>>>0>oa>>>0)+Sa|0)|0;c=Ai(Da,Ca,-997805,-1);d=W;e=c;c=Ai(ta,Ea,654183,0);f=e+c|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(va,ua,136657,0);f=c+f|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(za,wa,-683901,-1);f=c+f|0;d=W+d|0;e=s+(c>>>0>f>>>0?d+1|0:d)|0;d=f+na|0;e=d>>>0>>0?e+1|0:e;c=u&-2097152;o=d-c|0;u=e-((c>>>0>d>>>0)+Ra|0)|0;c=Ai(Da,Ca,654183,0);d=W;e=c;c=Ai(ta,Ea,470296,0);f=e+c|0;e=W+d|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(va,ua,-997805,-1);f=c+f|0;d=W+e|0;e=B+(c>>>0>f>>>0?d+1|0:d)|0;c=f+ma|0;e=c>>>0>>0?e+1|0:e;d=c;c=Ai(za,wa,136657,0);f=d+c|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(xa,ya,-683901,-1);e=c+f|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=r&-2097152;j=e-c|0;g=f-((c>>>0>e>>>0)+Qa|0)|0;c=Ai(M,h,E,0);d=W;e=c;c=Ai(P,0,fa,h);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(O,h,Q,0);e=c+e|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(V,ia,T,0);e=c+e|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=Ai(N,0,U,h);d=c+e|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(X,0,S,h);d=c+d|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(R,0,Z,h);f=c+d|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(_,0,$,A);e=c+f|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(aa,h,D,0);e=c+e|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=Ai(Y,0,ba,h);d=c+e|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(da,h,F,0);d=c+d|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(ea,h,ca,0);f=c+d|0;d=W+e|0;d=c>>>0>f>>>0?d+1|0:d;c=(K&2097151)<<11|qa>>>21;s=c+f|0;d=(K>>>21|0)+d|0;d=c>>>0>s>>>0?d+1|0:d;n=d;c=d-((s>>>0<4293918720)-1|0)|0;ma=c;e=c>>>21|0;i=s- -1048576|0;c=(c&2097151)<<11|i>>>21;q=c+j|0;e=e+g|0;e=c>>>0>q>>>0?e+1|0:e;l=e;c=e-((q>>>0<4293918720)-1|0)|0;C=c;e=c>>21;j=q- -1048576|0;c=(c&2097151)<<11|j>>>21;o=c+o|0;d=e+u|0;d=c>>>0>o>>>0?d+1|0:d;g=d;d=d-((o>>>0<4293918720)-1|0)|0;r=d;e=d>>21;c=o- -1048576|0;f=(d&2097151)<<11|c>>>21;d=f+ja|0;e=e+y|0;e=d>>>0>>0?e+1|0:e;y=e;qa=d;e=Ai(d,e,-683901,-1);f=e+Ga|0;d=W+b|0;u=f;b=e>>>0>f>>>0?d+1|0:d;d=Ai(sa,Fa,470296,0);e=k&-2097152;k=d+(ha-e|0)|0;f=W+(m-((e>>>0>ha>>>0)+Ka|0)|0)|0;f=d>>>0>k>>>0?f+1|0:f;d=Ai(H,Ha,654183,0);k=d+k|0;e=W+f|0;e=d>>>0>k>>>0?e+1|0:e;f=Ai(la,Ia,-997805,-1);k=f+k|0;d=W+e|0;d=f>>>0>k>>>0?d+1|0:d;e=c&-2097152;c=o-e|0;K=c;g=g-((e>>>0>o>>>0)+r|0)|0;A=g;f=Ai(qa,y,136657,0);k=f+k|0;e=W+d|0;c=Ai(c,g,-683901,-1);m=c+k|0;f=W+(f>>>0>k>>>0?e+1|0:e)|0;f=c>>>0>m>>>0?f+1|0:f;g=f;e=f-((m>>>0<4293918720)-1|0)|0;B=e;c=m- -1048576|0;f=(e&2097151)<<11|c>>>21;k=f+u|0;e=(e>>21)+b|0;e=f>>>0>k>>>0?e+1|0:e;f=e-((k>>>0<4293918720)-1|0)|0;r=f;b=k- -1048576|0;o=(f&2097151)<<11|b>>>21;u=o+Oa|0;f=(f>>21)+ra|0;D=u;u=o>>>0>u>>>0?f+1|0:f;b=b&-2097152;E=k-b|0;F=e-((b>>>0>k>>>0)+r|0)|0;b=c&-2097152;na=m-b|0;oa=g-((b>>>0>m>>>0)+B|0)|0;b=Ai(sa,Fa,666643,0);c=t&-2097152;d=b+(ka-c|0)|0;e=W+(v-((c>>>0>ka>>>0)+Ja|0)|0)|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(H,Ha,470296,0);c=b+d|0;f=W+e|0;f=b>>>0>c>>>0?f+1|0:f;b=Ai(la,Ia,654183,0);c=b+c|0;e=W+f|0;k=c;b=b>>>0>c>>>0?e+1|0:e;c=j&-2097152;j=q-c|0;g=l-((c>>>0>q>>>0)+C|0)|0;c=Ai(Da,Ca,470296,0);d=W;e=c;c=Ai(ta,Ea,666643,0);e=e+c|0;d=W+d|0;d=c>>>0>e>>>0?d+1|0:d;c=Ai(va,ua,654183,0);e=c+e|0;f=W+d|0;f=c>>>0>e>>>0?f+1|0:f;c=Ai(za,wa,-997805,-1);d=c+e|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(xa,ya,136657,0);f=c+d|0;e=W+e|0;d=n+(c>>>0>f>>>0?e+1|0:e)|0;c=f+s|0;d=c>>>0>>0?d+1|0:d;e=c;c=Ai(Ba,Aa,-683901,-1);f=e+c|0;d=W+d|0;d=c>>>0>f>>>0?d+1|0:d;c=(pa&2097151)<<11|ga>>>21;e=i&-2097152;r=c+(f-e|0)|0;e=(d-((e>>>0>f>>>0)+ma|0)|0)+(pa>>21)|0;e=c>>>0>r>>>0?e+1|0:e;q=e;c=e-((r>>>0<4293918720)-1|0)|0;C=c;d=c>>21;o=r- -1048576|0;f=(c&2097151)<<11|o>>>21;c=f+j|0;e=d+g|0;e=c>>>0>>0?e+1|0:e;pa=e;B=c;c=Ai(c,e,-683901,-1);d=c+k|0;f=W+b|0;f=c>>>0>d>>>0?f+1|0:f;b=Ai(qa,y,-997805,-1);c=b+d|0;e=W+f|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(K,A,136657,0);c=b+c|0;d=W+e|0;ga=c;j=b>>>0>c>>>0?d+1|0:d;b=p&-2097152;i=J-b|0;l=x-((b>>>0>J>>>0)+Ta|0)|0;b=Ai(M,h,Y,0);c=W;d=b;b=Ai(P,0,aa,h);d=d+b|0;e=W+c|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(Q,0,da,h);c=b+d|0;e=W+e|0;e=b>>>0>c>>>0?e+1|0:e;b=Ai(U,h,ca,0);c=b+c|0;d=W+e|0;e=c;b=b>>>0>e>>>0?d+1|0:d;c=Ai(M,h,aa,h);d=W;f=c;c=Ai(P,0,ca,0);g=f+c|0;f=W+d|0;f=c>>>0>g>>>0?f+1|0:f;c=Ai(U,h,da,h);g=c+g|0;d=W+f|0;d=c>>>0>g>>>0?d+1|0:d;c=d;d=d-((g>>>0<4293918720)-1|0)|0;sa=d;f=d>>>21|0;v=g- -1048576|0;d=(d&2097151)<<11|v>>>21;s=d+e|0;e=b+f|0;e=d>>>0>s>>>0?e+1|0:e;t=e;b=e-((s>>>0<4293918720)-1|0)|0;ka=b;f=b>>>21|0;m=s- -1048576|0;b=(b&2097151)<<11|m>>>21;e=b+i|0;d=f+l|0;d=b>>>0>e>>>0?d+1|0:d;b=Ai(H,Ha,666643,0);f=b+e|0;e=W+d|0;e=b>>>0>f>>>0?e+1|0:e;b=Ai(la,Ia,470296,0);d=b+f|0;e=W+e|0;e=b>>>0>d>>>0?e+1|0:e;b=Ai(B,pa,136657,0);f=b+d|0;d=W+e|0;d=b>>>0>f>>>0?d+1|0:d;b=Ai(qa,y,654183,0);e=b+f|0;f=W+d|0;f=b>>>0>e>>>0?f+1|0:f;b=Ai(K,A,-997805,-1);k=b+e|0;d=W+f|0;d=b>>>0>k>>>0?d+1|0:d;n=d;b=d-((k>>>0<4293918720)-1|0)|0;ha=b;f=b>>21;i=k- -1048576|0;d=(b&2097151)<<11|i>>>21;b=d+ga|0;e=f+j|0;e=b>>>0>>0?e+1|0:e;d=e-((b>>>0<4293918720)-1|0)|0;ga=d;l=b- -1048576|0;j=(d&2097151)<<11|l>>>21;p=j+na|0;d=(d>>21)+oa|0;ja=p;x=j>>>0>p>>>0?d+1|0:d;j=b;f=e;d=o&-2097152;o=(L&2097151)<<11|G>>>21;b=(r-d|0)+o|0;e=(q-((d>>>0>r>>>0)+C|0)|0)+(L>>21)|0;e=b>>>0>>0?e+1|0:e;p=e;e=e-((b>>>0<4293918720)-1|0)|0;ma=e;d=e>>21;r=d;q=b- -1048576|0;H=(e&2097151)<<11|q>>>21;e=Ai(H,d,-683901,-1);j=e+j|0;d=W+f|0;d=e>>>0>j>>>0?d+1|0:d;e=l&-2097152;na=j-e|0;oa=d-((e>>>0>j>>>0)+ga|0)|0;d=Ai(H,r,136657,0);f=d+k|0;e=W+n|0;e=d>>>0>f>>>0?e+1|0:e;d=i&-2097152;C=f-d|0;ga=e-((d>>>0>f>>>0)+ha|0)|0;d=Ai(la,Ia,666643,0);e=m&-2097152;f=d+(s-e|0)|0;e=W+(t-((e>>>0>s>>>0)+ka|0)|0)|0;e=d>>>0>f>>>0?e+1|0:e;d=Ai(B,pa,-997805,-1);j=d+f|0;f=W+e|0;f=d>>>0>j>>>0?f+1|0:f;e=Ai(qa,y,470296,0);j=e+j|0;d=W+f|0;d=e>>>0>j>>>0?d+1|0:d;f=Ai(K,A,654183,0);j=f+j|0;e=W+d|0;L=j;n=f>>>0>j>>>0?e+1|0:e;j=g;g=c;c=Ai(P,0,da,h);d=W;e=c;c=Ai(M,h,ca,0);f=e+c|0;d=W+d|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(M,h,da,h);e=W;J=e;s=c;t=c- -1048576|0;c=e-((c>>>0<4293918720)-1|0)|0;ka=c;e=c>>>21|0;c=(c&2097151)<<11|t>>>21;o=c+f|0;f=e+d|0;f=c>>>0>o>>>0?f+1|0:f;m=f;c=f-((o>>>0<4293918720)-1|0)|0;ha=c;e=c>>>21|0;k=o- -1048576|0;c=(c&2097151)<<11|k>>>21;f=c+j|0;d=e+g|0;d=c>>>0>f>>>0?d+1|0:d;c=Ai(B,pa,654183,0);e=v&-2097152;g=c+(f-e|0)|0;f=W+(d-((sa&8191)+(e>>>0>f>>>0)|0)|0)|0;f=c>>>0>g>>>0?f+1|0:f;c=Ai(qa,y,666643,0);d=c+g|0;e=W+f|0;e=c>>>0>d>>>0?e+1|0:e;c=Ai(K,A,470296,0);i=c+d|0;d=W+e|0;d=c>>>0>i>>>0?d+1|0:d;l=d;c=d-((i>>>0<4293918720)-1|0)|0;G=c;e=c>>21;j=i- -1048576|0;c=(c&2097151)<<11|j>>>21;g=c+L|0;e=e+n|0;e=c>>>0>g>>>0?e+1|0:e;f=e;d=e-((g>>>0<4293918720)-1|0)|0;v=d;c=g- -1048576|0;n=(d&2097151)<<11|c>>>21;L=n+C|0;d=(d>>21)+ga|0;y=L;n=n>>>0>y>>>0?d+1|0:d;e=Ai(H,r,-997805,-1);g=e+g|0;d=W+f|0;c=c&-2097152;qa=g-c|0;ga=(e>>>0>g>>>0?d+1|0:d)-((c>>>0>g>>>0)+v|0)|0;c=Ai(H,r,654183,0);d=c+i|0;f=W+l|0;f=c>>>0>d>>>0?f+1|0:f;c=j&-2097152;L=d-c|0;G=f-((c>>>0>d>>>0)+G|0)|0;c=Ai(B,pa,470296,0);d=k&-2097152;f=c+(o-d|0)|0;e=W+(m-((ha&8191)+(d>>>0>o>>>0)|0)|0)|0;e=c>>>0>f>>>0?e+1|0:e;c=Ai(K,A,666643,0);d=c+f|0;e=W+e|0;e=c>>>0>d>>>0?e+1|0:e;g=d;c=Ai(B,pa,666643,0);d=t&-2097152;k=c+(s-d|0)|0;f=W+(J-((ka&2047)+(d>>>0>s>>>0)|0)|0)|0;f=c>>>0>k>>>0?f+1|0:f;i=f;c=f-((k>>>0<4293918720)-1|0)|0;v=c;d=c>>21;l=k- -1048576|0;c=(c&2097151)<<11|l>>>21;j=c+g|0;e=e+d|0;e=c>>>0>j>>>0?e+1|0:e;c=e-((j>>>0<4293918720)-1|0)|0;t=c;d=c>>21;g=j- -1048576|0;c=(c&2097151)<<11|g>>>21;m=c+L|0;f=d+G|0;c=c>>>0>m>>>0?f+1|0:f;d=Ai(H,r,470296,0);f=d+j|0;e=W+e|0;e=d>>>0>f>>>0?e+1|0:e;d=g&-2097152;g=f-d|0;j=e-((d>>>0>f>>>0)+t|0)|0;d=Ai(H,r,666643,0);e=l&-2097152;o=d+(k-e|0)|0;f=W+(i-((e>>>0>k>>>0)+v|0)|0)|0;f=d>>>0>o>>>0?f+1|0:f;e=f>>21;f=(f&2097151)<<11|o>>>21;g=f+g|0;d=e+j|0;d=f>>>0>g>>>0?d+1|0:d;f=d>>21;d=(d&2097151)<<11|g>>>21;j=d+m|0;e=c+f|0;c=j;e=c>>>0>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|c>>>21;v=e+qa|0;d=d+ga|0;d=e>>>0>v>>>0?d+1|0:d;e=d>>21;d=(d&2097151)<<11|v>>>21;t=d+y|0;e=e+n|0;e=d>>>0>t>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|t>>>21;m=e+na|0;f=d+oa|0;f=e>>>0>m>>>0?f+1|0:f;e=f>>21;f=(f&2097151)<<11|m>>>21;k=f+ja|0;d=e+x|0;d=f>>>0>k>>>0?d+1|0:d;f=d>>21;d=(d&2097151)<<11|k>>>21;n=d+E|0;e=f+F|0;e=d>>>0>n>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|n>>>21;i=e+D|0;d=d+u|0;d=e>>>0>i>>>0?d+1|0:d;e=d>>21;d=(d&2097151)<<11|i>>>21;l=d+Ma|0;e=e+Na|0;e=d>>>0>l>>>0?e+1|0:e;d=e>>21;e=(e&2097151)<<11|l>>>21;j=e+La|0;f=d+I|0;d=q&-2097152;x=b-d|0;f=e>>>0>j>>>0?f+1|0:f;q=x+((f&2097151)<<11|j>>>21)|0;e=(p-((b>>>0>>0)+ma|0)|0)+(f>>21)|0;e=q>>>0>>0?e+1|0:e;x=(e&2097151)<<11|q>>>21;d=e>>21;p=d;b=Ai(x,d,666643,0);d=o&2097151;b=b+d|0;f=W;w[a|0]=b;f=b>>>0>>0?f+1|0:f;w[a+1|0]=(f&255)<<24|b>>>8;d=g&2097151;g=Ai(x,p,470296,0)+d|0;e=W;e=d>>>0>g>>>0?e+1|0:e;o=(f&2097151)<<11|b>>>21;g=o+g|0;e=(f>>21)+e|0;e=g>>>0>>0?e+1|0:e;w[a+4|0]=(e&2047)<<21|g>>>11;w[a+3|0]=(e&7)<<29|g>>>3;w[a+2|0]=((f&65535)<<16|b>>>16)&31|g<<5;b=c&2097151;c=Ai(x,p,654183,0)+b|0;f=W;f=b>>>0>c>>>0?f+1|0:f;b=e;e=e>>21;b=(b&2097151)<<11|g>>>21;c=b+c|0;d=e+f|0;d=b>>>0>c>>>0?d+1|0:d;b=d;w[a+6|0]=(d&63)<<26|c>>>6;w[a+5|0]=c<<2|(g&1572864)>>>19;e=v&2097151;f=Ai(x,p,-997805,-1)+e|0;d=W;d=e>>>0>f>>>0?d+1|0:d;e=b>>21;g=f;f=(b&2097151)<<11|c>>>21;b=g+f|0;e=e+d|0;e=b>>>0>>0?e+1|0:e;w[a+9|0]=(e&511)<<23|b>>>9;w[a+8|0]=(e&1)<<31|b>>>1;w[a+7|0]=b<<7|(c&2080768)>>>14;c=t&2097151;d=Ai(x,p,136657,0)+c|0;f=W;f=c>>>0>d>>>0?f+1|0:f;c=e;e=e>>21;g=(c&2097151)<<11|b>>>21;c=g+d|0;d=e+f|0;d=c>>>0>>0?d+1|0:d;w[a+12|0]=(d&4095)<<20|c>>>12;w[a+11|0]=(d&15)<<28|c>>>4;w[a+10|0]=c<<4|(b&1966080)>>>17;b=m&2097151;f=Ai(x,p,-683901,-1)+b|0;e=W;e=b>>>0>f>>>0?e+1|0:e;b=d;d=d>>21;g=f;f=(b&2097151)<<11|c>>>21;b=g+f|0;d=e+d|0;d=b>>>0>>0?d+1|0:d;w[a+14|0]=(d&127)<<25|b>>>7;w[a+13|0]=b<<1|(c&1048576)>>>20;e=d>>21;d=(d&2097151)<<11|b>>>21;c=d+(k&2097151)|0;e=c>>>0>>0?e+1|0:e;w[a+17|0]=(e&1023)<<22|c>>>10;w[a+16|0]=(e&3)<<30|c>>>2;w[a+15|0]=c<<6|(b&2064384)>>>15;b=e;e=e>>21;d=(b&2097151)<<11|c>>>21;b=d+(n&2097151)|0;f=b>>>0>>0?e+1|0:e;w[a+20|0]=(f&8191)<<19|b>>>13;w[a+19|0]=(f&31)<<27|b>>>5;g=(f&2097151)<<11|b>>>21;e=g+(i&2097151)|0;d=f>>21;d=e>>>0>>0?d+1|0:d;g=e;w[a+21|0]=e;w[a+18|0]=b<<3|(c&1835008)>>>18;w[a+22|0]=(d&255)<<24|e>>>8;c=(d&2097151)<<11|e>>>21;b=c+(l&2097151)|0;e=d>>21;e=b>>>0>>0?e+1|0:e;w[a+25|0]=(e&2047)<<21|b>>>11;w[a+24|0]=(e&7)<<29|b>>>3;w[a+23|0]=((d&65535)<<16|g>>>16)&31|b<<5;d=(e&2097151)<<11|b>>>21;c=d+(j&2097151)|0;e=e>>21;e=c>>>0>>0?e+1|0:e;w[a+27|0]=(e&63)<<26|c>>>6;w[a+26|0]=c<<2|(b&1572864)>>>19;b=e;e=e>>21;g=(b&2097151)<<11|c>>>21;f=q&2097151;b=g+f|0;d=e;d=b>>>0>>0?d+1|0:d;w[a+31|0]=(d&131071)<<15|b>>>17;w[a+30|0]=(d&511)<<23|b>>>9;w[a+28|0]=b<<7|(c&2080768)>>>14;w[a+29|0]=g+q>>>1;}function Xb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0;while(1){e=i<<3;g=e+c|0;e=b+e|0;f=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);u=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);l=f<<24|(f&65280)<<8;h=f&16711680;p=h<<24;h=h>>>8|0;j=f&-16777216;e=j>>>24|0;y[g>>2]=p|j<<8|(((u&255)<<24|f>>>8)&-16777216|((u&16777215)<<8|f>>>24)&16711680|(u>>>8&65280|u>>>24));e=e|h|l;y[g+4>>2]=e;i=i+1|0;if((i|0)!=16){continue}break}b=y[a+60>>2];y[d+56>>2]=y[a+56>>2];y[d+60>>2]=b;b=y[a+52>>2];y[d+48>>2]=y[a+48>>2];y[d+52>>2]=b;b=y[a+44>>2];y[d+40>>2]=y[a+40>>2];y[d+44>>2]=b;b=y[a+36>>2];y[d+32>>2]=y[a+32>>2];y[d+36>>2]=b;b=y[a+28>>2];y[d+24>>2]=y[a+24>>2];y[d+28>>2]=b;b=y[a+20>>2];y[d+16>>2]=y[a+16>>2];y[d+20>>2]=b;b=y[a+12>>2];y[d+8>>2]=y[a+8>>2];y[d+12>>2]=b;b=y[a+4>>2];y[d>>2]=y[a>>2];y[d+4>>2]=b;while(1){g=y[d+56>>2];h=y[d+60>>2];B=K<<3;u=B+c|0;b=u;e=y[b>>2];b=y[b+4>>2];f=y[d+36>>2];s=f;m=y[d+32>>2];f=Ci(m,f,50);i=W;f=Ci(m,s,46)^f;i=W^i;f=Ci(m,s,23)^f;e=f+e|0;b=(W^i)+b|0;b=e>>>0>>0?b+1|0:b;f=B+38512|0;i=y[f>>2];e=i+e|0;b=y[f+4>>2]+b|0;b=e>>>0>>0?b+1|0:b;p=y[d+48>>2];w=y[d+40>>2];i=(p^w)&m^p;f=i+e|0;r=y[d+52>>2];n=y[d+44>>2];e=((r^n)&s^r)+b|0;b=(f>>>0>>0?e+1|0:e)+h|0;g=f+g|0;b=g>>>0>>0?b+1|0:b;f=y[d+24>>2];i=f+g|0;e=y[d+28>>2]+b|0;e=f>>>0>i>>>0?e+1|0:e;x=e;y[d+24>>2]=i;y[d+28>>2]=e;e=y[d+4>>2];v=e;f=y[d>>2];e=Ci(f,e,36);h=W;e=Ci(f,v,30)^e;h=W^h;j=g+(Ci(f,v,25)^e)|0;e=b+(W^h)|0;e=g>>>0>j>>>0?e+1|0:e;b=j;h=y[d+16>>2];g=y[d+8>>2];j=f&(h|g)|g&h;l=b+j|0;b=e;e=y[d+20>>2];k=y[d+12>>2];b=b+(v&(e|k)|e&k)|0;b=j>>>0>l>>>0?b+1|0:b;j=b;y[d+56>>2]=l;y[d+60>>2]=b;o=h;q=e;t=B|8;C=t+c|0;b=C;A=y[b>>2];F=y[b+4>>2];h=(m^w)&i^w;b=h+p|0;e=((s^n)&x^n)+r|0;e=b>>>0>>0?e+1|0:e;h=Ci(i,x,50);p=W;h=Ci(i,x,46)^h;p=W^p;r=Ci(i,x,23)^h;h=r+b|0;b=(W^p)+e|0;b=(h>>>0>>0?b+1|0:b)+F|0;e=h+A|0;b=e>>>0>>0?b+1|0:b;h=e;e=t+38512|0;p=y[e>>2];h=h+p|0;e=y[e+4>>2]+b|0;b=h>>>0

>>0?e+1|0:e;e=b+q|0;p=h+o|0;e=p>>>0>>0?e+1|0:e;r=e;y[d+16>>2]=p;y[d+20>>2]=e;b=b+((k|v)&j|k&v)|0;e=h+((f|g)&l|f&g)|0;b=e>>>0>>0?b+1|0:b;h=Ci(l,j,36);o=W;h=Ci(l,j,30)^h;o=W^o;q=e;e=Ci(l,j,25)^h;h=q+e|0;b=(W^o)+b|0;b=e>>>0>h>>>0?b+1|0:b;o=b;y[d+48>>2]=h;y[d+52>>2]=b;q=g;t=k;g=B|16;e=g+c|0;k=y[e>>2];b=k+w|0;e=y[e+4>>2]+n|0;e=b>>>0>>0?e+1|0:e;n=b;b=g+38512|0;k=y[b>>2];g=n+k|0;b=y[b+4>>2]+e|0;b=g>>>0>>0?b+1|0:b;e=g;g=(i^m)&p^m;e=e+g|0;b=((s^x)&r^s)+b|0;b=e>>>0>>0?b+1|0:b;g=Ci(p,r,50);k=W;g=Ci(p,r,46)^g;k=W^k;w=Ci(p,r,23)^g;g=w+e|0;e=(W^k)+b|0;k=g;w=g>>>0>>0?e+1|0:e;e=w+t|0;g=g+q|0;e=k>>>0>g>>>0?e+1|0:e;t=e;y[d+8>>2]=g;y[d+12>>2]=e;b=Ci(h,o,36);e=W;b=Ci(h,o,30)^b;e=W^e;n=Ci(h,o,25)^b;q=n+((f|l)&h|f&l)|0;b=((j|v)&o|j&v)+(W^e)|0;e=w+(q>>>0>>0?b+1|0:b)|0;w=k+q|0;e=w>>>0>>0?e+1|0:e;k=e;y[d+40>>2]=w;y[d+44>>2]=e;q=f;e=m;f=B|24;b=f+c|0;m=y[b>>2];e=e+m|0;b=y[b+4>>2]+s|0;b=e>>>0>>0?b+1|0:b;n=e;e=f+38512|0;m=y[e>>2];f=n+m|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=i^(i^p)&g;b=b+f|0;e=(x^(r^x)&t)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(g,t,50);m=W;f=Ci(g,t,46)^f;m=W^m;s=Ci(g,t,23)^f;f=s+b|0;b=(W^m)+e|0;b=f>>>0>>0?b+1|0:b;e=b+v|0;v=f+q|0;e=v>>>0>>0?e+1|0:e;s=e;y[d>>2]=v;y[d+4>>2]=e;e=Ci(w,k,36);m=W;e=Ci(w,k,30)^e;q=W^m;n=Ci(w,k,25)^e;m=n+((h|l)&w|h&l)|0;e=((j|o)&k|j&o)+(W^q)|0;b=b+(m>>>0>>0?e+1|0:e)|0;q=f+m|0;b=q>>>0>>0?b+1|0:b;m=b;y[d+32>>2]=q;y[d+36>>2]=b;b=B|32;e=b+c|0;f=y[e>>2];e=x+y[e+4>>2]|0;f=f+i|0;e=f>>>0>>0?e+1|0:e;b=b+38512|0;i=y[b>>2];f=i+f|0;b=y[b+4>>2]+e|0;b=f>>>0>>0?b+1|0:b;e=f;f=p^(g^p)&v;e=e+f|0;b=(r^(r^t)&s)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(v,s,50);i=W;f=Ci(v,s,46)^f;i=W^i;x=Ci(v,s,23)^f;f=x+e|0;e=(W^i)+b|0;e=f>>>0>>0?e+1|0:e;n=e;b=e;e=Ci(q,m,36);i=W;e=Ci(q,m,30)^e;x=W^i;A=Ci(q,m,25)^e;i=A+((h|w)&q|h&w)|0;e=((o|k)&m|o&k)+(W^x)|0;b=(i>>>0>>0?e+1|0:e)+b|0;x=f+i|0;b=x>>>0>>0?b+1|0:b;i=b;y[d+24>>2]=x;y[d+28>>2]=b;e=j+n|0;j=f+l|0;e=j>>>0>>0?e+1|0:e;n=e;y[d+56>>2]=j;y[d+60>>2]=e;e=B|40;b=e+c|0;f=y[b>>2];b=r+y[b+4>>2]|0;f=f+p|0;b=f>>>0

>>0?b+1|0:b;e=e+38512|0;l=y[e>>2];f=l+f|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=g^(g^v)&j;b=b+f|0;e=(t^(s^t)&n)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(j,n,50);l=W;f=Ci(j,n,46)^f;l=W^l;p=Ci(j,n,23)^f;f=p+b|0;b=(W^l)+e|0;b=f>>>0

>>0?b+1|0:b;e=Ci(x,i,36);l=W;e=Ci(x,i,30)^e;p=W^l;r=Ci(x,i,25)^e;l=r+((q|w)&x|q&w)|0;e=((k|m)&i|k&m)+(W^p)|0;e=(l>>>0>>0?e+1|0:e)+b|0;p=f+l|0;e=p>>>0>>0?e+1|0:e;l=e;y[d+16>>2]=p;y[d+20>>2]=e;b=b+o|0;e=h;h=f+h|0;b=e>>>0>h>>>0?b+1|0:b;r=b;y[d+48>>2]=h;y[d+52>>2]=b;b=B|48;e=b+c|0;f=y[e>>2];e=t+y[e+4>>2]|0;f=f+g|0;e=f>>>0>>0?e+1|0:e;b=b+38512|0;g=y[b>>2];f=g+f|0;b=y[b+4>>2]+e|0;b=f>>>0>>0?b+1|0:b;e=f;f=v^(j^v)&h;e=e+f|0;b=(s^(s^n)&r)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(h,r,50);g=W;f=Ci(h,r,46)^f;g=W^g;o=Ci(h,r,23)^f;f=o+e|0;e=(W^g)+b|0;e=f>>>0>>0?e+1|0:e;t=e;b=e;e=Ci(p,l,36);g=W;e=Ci(p,l,30)^e;o=W^g;A=Ci(p,l,25)^e;g=A+((q|x)&p|q&x)|0;e=((i|m)&l|i&m)+(W^o)|0;b=(g>>>0>>0?e+1|0:e)+b|0;e=g;g=f+g|0;b=e>>>0>g>>>0?b+1|0:b;o=b;y[d+8>>2]=g;y[d+12>>2]=b;e=k+t|0;A=f+w|0;e=A>>>0>>0?e+1|0:e;t=e;y[d+40>>2]=A;y[d+44>>2]=e;e=B|56;b=e+c|0;f=y[b>>2];b=s+y[b+4>>2]|0;f=f+v|0;b=f>>>0>>0?b+1|0:b;e=e+38512|0;k=y[e>>2];f=k+f|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=j^(h^j)&A;b=b+f|0;e=(n^(r^n)&t)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(A,t,50);k=W;f=Ci(A,t,46)^f;k=W^k;w=Ci(A,t,23)^f;f=w+b|0;b=(W^k)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(g,o,36);k=W;e=Ci(g,o,30)^e;w=W^k;v=Ci(g,o,25)^e;k=v+((p|x)&g|p&x)|0;e=((i|l)&o|i&l)+(W^w)|0;e=(k>>>0>>0?e+1|0:e)+b|0;w=f+k|0;e=w>>>0>>0?e+1|0:e;k=e;y[d>>2]=w;y[d+4>>2]=e;b=b+m|0;v=f+q|0;b=v>>>0>>0?b+1|0:b;s=b;y[d+32>>2]=v;y[d+36>>2]=b;b=B|64;e=b+c|0;f=y[e>>2];e=n+y[e+4>>2]|0;f=f+j|0;e=f>>>0>>0?e+1|0:e;b=b+38512|0;j=y[b>>2];f=j+f|0;b=y[b+4>>2]+e|0;b=f>>>0>>0?b+1|0:b;e=f;f=h^(h^A)&v;e=e+f|0;b=(r^(r^t)&s)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(v,s,50);j=W;f=Ci(v,s,46)^f;j=W^j;m=Ci(v,s,23)^f;f=m+e|0;e=(W^j)+b|0;e=f>>>0>>0?e+1|0:e;q=e;b=e;e=Ci(w,k,36);j=W;e=Ci(w,k,30)^e;m=W^j;n=Ci(w,k,25)^e;j=n+((g|p)&w|g&p)|0;e=((l|o)&k|l&o)+(W^m)|0;b=(j>>>0>>0?e+1|0:e)+b|0;m=f+j|0;b=m>>>0>>0?b+1|0:b;j=b;y[d+56>>2]=m;y[d+60>>2]=b;e=i+q|0;i=f+x|0;e=i>>>0>>0?e+1|0:e;n=e;y[d+24>>2]=i;y[d+28>>2]=e;e=B|72;F=e+c|0;b=F;f=y[b>>2];b=r+y[b+4>>2]|0;f=f+h|0;b=f>>>0>>0?b+1|0:b;e=e+38512|0;h=y[e>>2];f=h+f|0;e=y[e+4>>2]+b|0;e=f>>>0>>0?e+1|0:e;b=f;f=A^(v^A)&i;b=b+f|0;e=(t^(s^t)&n)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(i,n,50);h=W;f=Ci(i,n,46)^f;h=W^h;q=Ci(i,n,23)^f;f=q+b|0;b=(W^h)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(m,j,36);h=W;e=Ci(m,j,30)^e;q=W^h;x=Ci(m,j,25)^e;h=x+((g|w)&m|g&w)|0;e=((o|k)&j|o&k)+(W^q)|0;e=(h>>>0>>0?e+1|0:e)+b|0;q=f+h|0;e=q>>>0>>0?e+1|0:e;h=e;y[d+48>>2]=q;y[d+52>>2]=e;b=b+l|0;l=f+p|0;b=l>>>0>>0?b+1|0:b;r=b;y[d+16>>2]=l;y[d+20>>2]=b;f=B|80;Q=f+c|0;e=Q;p=y[e>>2];b=p+A|0;e=y[e+4>>2]+t|0;e=b>>>0

>>0?e+1|0:e;t=b;b=f+38512|0;p=y[b>>2];f=t+p|0;b=y[b+4>>2]+e|0;b=f>>>0

>>0?b+1|0:b;e=f;f=v^(i^v)&l;e=e+f|0;b=(s^(s^n)&r)+b|0;b=e>>>0>>0?b+1|0:b;f=Ci(l,r,50);p=W;f=Ci(l,r,46)^f;p=W^p;x=Ci(l,r,23)^f;f=x+e|0;e=(W^p)+b|0;e=f>>>0>>0?e+1|0:e;t=e;b=e;e=Ci(q,h,36);p=W;e=Ci(q,h,30)^e;x=W^p;A=Ci(q,h,25)^e;p=A+((m|w)&q|m&w)|0;e=((j|k)&h|j&k)+(W^x)|0;b=(p>>>0>>0?e+1|0:e)+b|0;x=f+p|0;b=x>>>0

>>0?b+1|0:b;p=b;y[d+40>>2]=x;y[d+44>>2]=b;e=o+t|0;o=f+g|0;e=o>>>0>>0?e+1|0:e;t=e;y[d+8>>2]=o;y[d+12>>2]=e;b=B|88;e=b+38512|0;R=b+c|0;b=R;g=y[b>>2];f=y[e>>2]+g|0;b=y[e+4>>2]+y[b+4>>2]|0;e=s+(f>>>0>>0?b+1|0:b)|0;b=f+v|0;e=b>>>0>>0?e+1|0:e;f=i^(i^l)&o;b=f+b|0;e=(n^(r^n)&t)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(o,t,50);g=W;f=Ci(o,t,46)^f;g=W^g;v=Ci(o,t,23)^f;f=v+b|0;b=(W^g)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(x,p,36);g=W;e=Ci(x,p,30)^e;v=W^g;s=Ci(x,p,25)^e;g=s+((m|q)&x|m&q)|0;e=((h|j)&p|h&j)+(W^v)|0;e=(g>>>0>>0?e+1|0:e)+b|0;s=g;g=f+g|0;e=s>>>0>g>>>0?e+1|0:e;v=e;y[d+32>>2]=g;y[d+36>>2]=e;b=b+k|0;k=f+w|0;b=k>>>0>>0?b+1|0:b;w=b;y[d>>2]=k;y[d+4>>2]=b;b=B|96;e=b+38512|0;S=b+c|0;b=S;s=y[b>>2];f=y[e>>2]+s|0;e=y[e+4>>2]+y[b+4>>2]|0;b=n+(f>>>0>>0?e+1|0:e)|0;e=f+i|0;b=e>>>0>>0?b+1|0:b;i=l^(l^o)&k;f=i+e|0;e=(r^(r^t)&w)+b|0;e=f>>>0>>0?e+1|0:e;b=Ci(k,w,50);i=W;b=Ci(k,w,46)^b;i=W^i;n=f;f=Ci(k,w,23)^b;b=n+f|0;e=(W^i)+e|0;e=b>>>0>>0?e+1|0:e;n=e;f=b;b=Ci(g,v,36);i=W;b=Ci(g,v,30)^b;s=W^i;A=Ci(g,v,25)^b;i=A+((q|x)&g|q&x)|0;b=((h|p)&v|h&p)+(W^s)|0;e=(i>>>0>>0?b+1|0:b)+e|0;s=f+i|0;e=s>>>0>>0?e+1|0:e;i=e;y[d+24>>2]=s;y[d+28>>2]=e;e=j+n|0;m=f+m|0;e=m>>>0>>0?e+1|0:e;j=e;y[d+56>>2]=m;y[d+60>>2]=e;b=B|104;e=b+38512|0;T=b+c|0;b=T;n=y[b>>2];f=y[e>>2]+n|0;b=y[e+4>>2]+y[b+4>>2]|0;e=r+(f>>>0>>0?b+1|0:b)|0;b=f+l|0;e=b>>>0>>0?e+1|0:e;l=o^(o^k)&m;f=l+b|0;b=(t^(t^w)&j)+e|0;b=f>>>0>>0?b+1|0:b;e=Ci(m,j,50);l=W;e=Ci(m,j,46)^e;l=W^l;r=Ci(m,j,23)^e;f=r+f|0;e=(W^l)+b|0;e=f>>>0>>0?e+1|0:e;n=e;b=e;e=Ci(s,i,36);l=W;e=Ci(s,i,30)^e;r=W^l;A=Ci(s,i,25)^e;l=A+((g|x)&s|g&x)|0;e=((p|v)&i|p&v)+(W^r)|0;b=(l>>>0>>0?e+1|0:e)+b|0;r=f+l|0;b=r>>>0>>0?b+1|0:b;l=b;y[d+16>>2]=r;y[d+20>>2]=b;b=h+n|0;q=f+q|0;b=q>>>0>>0?b+1|0:b;h=b;y[d+48>>2]=q;y[d+52>>2]=b;b=B|112;e=b+38512|0;A=b+c|0;f=A;n=y[f>>2];b=y[e>>2]+n|0;e=y[e+4>>2]+y[f+4>>2]|0;e=t+(b>>>0>>0?e+1|0:e)|0;b=b+o|0;e=b>>>0>>0?e+1|0:e;f=k^(k^m)&q;b=f+b|0;e=(w^(j^w)&h)+e|0;e=b>>>0>>0?e+1|0:e;f=Ci(q,h,50);o=W;f=Ci(q,h,46)^f;o=W^o;t=Ci(q,h,23)^f;f=t+b|0;b=(W^o)+e|0;b=f>>>0>>0?b+1|0:b;n=b;e=b;b=Ci(r,l,36);o=W;b=Ci(r,l,30)^b;t=W^o;G=Ci(r,l,25)^b;o=G+((g|s)&r|g&s)|0;b=((i|v)&l|i&v)+(W^t)|0;e=(o>>>0>>0?b+1|0:b)+e|0;t=f+o|0;e=t>>>0>>0?e+1|0:e;o=e;y[d+8>>2]=t;y[d+12>>2]=e;e=p+n|0;p=f+x|0;e=p>>>0>>0?e+1|0:e;f=e;y[d+40>>2]=p;y[d+44>>2]=e;b=B|120;e=b+38512|0;U=b+c|0;b=U;n=y[b>>2];x=y[e>>2]+n|0;e=y[e+4>>2]+y[b+4>>2]|0;b=w+(n>>>0>x>>>0?e+1|0:e)|0;e=k+x|0;b=(j^(h^j)&f)+(e>>>0>>0?b+1|0:b)|0;h=Ci(p,f,50);j=W;h=Ci(p,f,46)^h;j=W^j;k=m^(m^q)&p;e=k+e|0;h=Ci(p,f,23)^h;f=e+h|0;e=(W^j)+(e>>>0>>0?b+1|0:b)|0;e=f>>>0>>0?e+1|0:e;h=f;j=e;b=e;e=Ci(t,o,36);p=W;e=Ci(t,o,30)^e;k=W^p;w=Ci(t,o,25)^e;p=w+((r|s)&t|r&s)|0;e=((i|l)&o|i&l)+(W^k)|0;b=(p>>>0>>0?e+1|0:e)+b|0;f=f+p|0;b=f>>>0

>>0?b+1|0:b;y[d>>2]=f;y[d+4>>2]=b;e=j+v|0;k=g;g=g+h|0;e=k>>>0>g>>>0?e+1|0:e;y[d+32>>2]=g;y[d+36>>2]=e;if((K|0)!=64){K=K+16|0;h=(K<<3)+c|0;g=y[u>>2];i=y[u+4>>2];b=y[F>>2];V=b;e=y[F+4>>2];X=e;f=y[A+4>>2];w=f;F=y[A>>2];f=Ci(F,f,45);j=W;l=((w&63)<<26|F>>>6)^(Ci(F,w,3)^f);f=l+b|0;b=(W^j^w>>>6)+e|0;e=(f>>>0>>0?b+1|0:b)+i|0;b=f+g|0;e=b>>>0>>0?e+1|0:e;f=y[C+4>>2];g=f;j=y[C>>2];f=Ci(j,f,63);i=W;l=((g&127)<<25|j>>>7)^(Ci(j,g,56)^f);f=l+b|0;e=(W^i^g>>>7)+e|0;x=f;y[h>>2]=f;e=f>>>0>>0?e+1|0:e;y[h+4>>2]=e;b=y[u+20>>2];l=b;k=y[u+16>>2];h=b;H=y[u+88>>2];b=y[u+92>>2];G=b;i=b;p=e;b=Ci(f,e,45);v=W;n=Ci(f,e,3)^b;b=e;e=e>>>6|0;m=n^((b&63)<<26|f>>>6);f=m+H|0;b=(e^(W^v))+i|0;e=(f>>>0>>0?b+1|0:b)+h|0;b=f+k|0;e=b>>>0>>0?e+1|0:e;f=y[u+28>>2];h=f;i=y[u+24>>2];f=Ci(i,f,63);o=W;f=((h&127)<<25|i>>>7)^(Ci(i,h,56)^f);m=f+b|0;b=(W^o^h>>>7)+e|0;b=f>>>0>m>>>0?b+1|0:b;o=b;y[u+144>>2]=m;y[u+148>>2]=b;r=y[u+80>>2];b=r+j|0;I=y[u+84>>2];e=I+g|0;v=y[u+120>>2];f=y[u+124>>2];g=Ci(v,f,45);j=W;q=((f&63)<<26|v>>>6)^(Ci(v,f,3)^g);g=q+b|0;e=(W^j^f>>>6)+(b>>>0>>0?e+1|0:e)|0;b=g>>>0>>0?e+1|0:e;e=Ci(k,l,63);j=W;n=g;g=((l&127)<<25|k>>>7)^(Ci(k,l,56)^e);t=n+g|0;b=(W^j^l>>>7)+b|0;b=g>>>0>t>>>0?b+1|0:b;l=b;y[u+136>>2]=t;y[u+140>>2]=b;b=y[u+36>>2];q=b;n=y[u+32>>2];k=n;L=y[u+104>>2];e=y[u+108>>2];M=e;g=e;e=Ci(m,o,45);j=W;e=Ci(m,o,3)^e;s=W^j;A=((o&63)<<26|m>>>6)^e;j=A+L|0;e=(o>>>6^s)+g|0;b=(j>>>0>>0?e+1|0:e)+b|0;e=j+k|0;b=e>>>0>>0?b+1|0:b;g=y[u+44>>2];j=g;k=y[u+40>>2];g=Ci(k,g,63);s=W;g=Ci(k,j,56)^g;A=W^s;g=((j&127)<<25|k>>>7)^g;s=g+e|0;e=(j>>>7^A)+b|0;e=g>>>0>s>>>0?e+1|0:e;g=e;y[u+160>>2]=s;y[u+164>>2]=e;N=y[u+96>>2];b=y[u+100>>2];O=b;e=b;b=Ci(t,l,45);A=W;b=Ci(t,l,3)^b;B=W^A;C=((l&63)<<26|t>>>6)^b;A=C+N|0;e=(l>>>6^B)+e|0;b=(A>>>0>>0?e+1|0:e)+h|0;e=i+A|0;b=e>>>0>>0?b+1|0:b;h=Ci(n,q,63);i=W;h=((q&127)<<25|n>>>7)^(Ci(n,q,56)^h);n=h+e|0;e=(W^i^q>>>7)+b|0;e=h>>>0>n>>>0?e+1|0:e;h=e;y[u+152>>2]=n;y[u+156>>2]=e;b=y[u+52>>2];B=b;C=y[u+48>>2];q=C;e=b;b=Ci(s,g,45);i=W;b=Ci(s,g,3)^b;A=W^i;D=((g&63)<<26|s>>>6)^b;i=D+v|0;b=(g>>>6^A)+f|0;e=(i>>>0>>0?b+1|0:b)+e|0;b=i+q|0;e=b>>>0>>0?e+1|0:e;i=y[u+60>>2];D=i;q=y[u+56>>2];i=Ci(q,i,63);A=W;i=Ci(q,D,56)^i;J=W^A;i=((D&127)<<25|q>>>7)^i;A=i+b|0;e=(D>>>7^J)+e|0;e=i>>>0>A>>>0?e+1|0:e;i=e;y[u+176>>2]=A;y[u+180>>2]=e;P=y[u+112>>2];b=y[u+116>>2];J=b;e=Ci(n,h,45);E=W;e=Ci(n,h,3)^e;Y=W^E;e=((h&63)<<26|n>>>6)^e;E=e+P|0;b=(h>>>6^Y)+b|0;e=(e>>>0>E>>>0?b+1|0:b)+j|0;b=k+E|0;e=b>>>0>>0?e+1|0:e;j=Ci(C,B,63);k=W;E=b;b=B>>>7|0;j=((B&127)<<25|C>>>7)^(Ci(C,B,56)^j);B=E+j|0;e=(b^(W^k))+e|0;e=j>>>0>B>>>0?e+1|0:e;j=e;y[u+168>>2]=B;y[u+172>>2]=e;e=p+D|0;k=q+x|0;b=k>>>0>>0?e+1|0:e;e=Ci(B,j,45);q=W;C=((j&63)<<26|B>>>6)^(Ci(B,j,3)^e);k=C+k|0;b=(W^q^j>>>6)+b|0;b=k>>>0>>0?b+1|0:b;e=u- -64|0;C=y[e>>2];e=y[e+4>>2];D=e;e=Ci(C,e,63);q=W;e=Ci(C,D,56)^e;E=W^q;q=k;k=((D&127)<<25|C>>>7)^e;q=q+k|0;b=(D>>>7^E)+b|0;b=k>>>0>q>>>0?b+1|0:b;k=b;y[u+184>>2]=q;y[u+188>>2]=b;e=l+D|0;b=t+C|0;e=b>>>0>>0?e+1|0:e;l=Ci(A,i,45);t=W;l=Ci(A,i,3)^l;C=W^t;l=((i&63)<<26|A>>>6)^l;t=l+b|0;b=(i>>>6^C)+e|0;C=l>>>0>t>>>0?b+1|0:b;b=y[u+72>>2];e=y[u+76>>2];l=Ci(b,e,63);D=W;E=Ci(b,e,56)^l;l=e;e=e>>>7|0;b=E^((l&127)<<25|b>>>7);t=b+t|0;e=(e^(W^D))+C|0;e=b>>>0>t>>>0?e+1|0:e;l=e;y[u+192>>2]=t;y[u+196>>2]=e;b=Ci(r,I,63);e=W;C=((I&127)<<25|r>>>7)^(Ci(r,I,56)^b);r=C+V|0;e=(W^e^I>>>7)+X|0;b=o+(r>>>0>>0?e+1|0:e)|0;e=m+r|0;b=e>>>0>>0?b+1|0:b;o=Ci(q,k,45);m=W;o=Ci(q,k,3)^o;r=W^m;o=((k&63)<<26|q>>>6)^o;m=o+e|0;e=(k>>>6^r)+b|0;e=o>>>0>m>>>0?e+1|0:e;o=e;y[u+200>>2]=m;y[u+204>>2]=e;C=y[Q>>2];e=y[Q+4>>2];b=Ci(H,G,63);r=W;b=Ci(H,G,56)^b;I=W^r;r=n;n=((G&127)<<25|H>>>7)^b;r=r+n|0;b=(G>>>7^I)+h|0;e=(r>>>0>>0?b+1|0:b)+e|0;b=r+C|0;e=b>>>0>>0?e+1|0:e;h=Ci(t,l,45);r=W;h=Ci(t,l,3)^h;n=W^r;h=((l&63)<<26|t>>>6)^h;r=h+b|0;e=(l>>>6^n)+e|0;e=h>>>0>r>>>0?e+1|0:e;h=e;y[u+208>>2]=r;y[u+212>>2]=e;n=y[R>>2];C=y[R+4>>2];b=Ci(N,O,63);e=W;H=((O&127)<<25|N>>>7)^(Ci(N,O,56)^b);s=H+s|0;b=(W^e^O>>>7)+g|0;e=(s>>>0>>0?b+1|0:b)+C|0;b=s+n|0;e=b>>>0>>0?e+1|0:e;g=Ci(m,o,45);s=W;n=b;b=o>>>6|0;g=((o&63)<<26|m>>>6)^(Ci(m,o,3)^g);o=n+g|0;e=(b^(W^s))+e|0;e=g>>>0>o>>>0?e+1|0:e;g=e;y[u+216>>2]=o;y[u+220>>2]=e;s=y[S>>2];b=y[S+4>>2];e=Ci(L,M,63);m=W;e=Ci(L,M,56)^e;n=W^m;D=B;B=((M&127)<<25|L>>>7)^e;m=D+B|0;e=(M>>>7^n)+j|0;b=(m>>>0>>0?e+1|0:e)+b|0;e=m+s|0;b=e>>>0>>0?b+1|0:b;j=Ci(r,h,45);m=W;n=e;e=h>>>6|0;h=((h&63)<<26|r>>>6)^(Ci(r,h,3)^j);j=n+h|0;e=(e^(W^m))+b|0;e=h>>>0>j>>>0?e+1|0:e;h=e;y[u+224>>2]=j;y[u+228>>2]=e;r=y[T>>2];s=y[T+4>>2];b=Ci(P,J,63);e=W;n=((J&127)<<25|P>>>7)^(Ci(P,J,56)^b);m=n+A|0;e=(W^e^J>>>7)+i|0;b=(m>>>0>>0?e+1|0:e)+s|0;e=m+r|0;b=e>>>0>>0?b+1|0:b;i=Ci(o,g,45);m=W;n=e;e=g>>>6|0;g=((g&63)<<26|o>>>6)^(Ci(o,g,3)^i);i=n+g|0;e=(e^(W^m))+b|0;e=g>>>0>i>>>0?e+1|0:e;g=e;y[u+232>>2]=i;y[u+236>>2]=e;b=Ci(v,f,63);e=W;n=Ci(v,f,56)^b;b=f>>>7|0;o=n^((f&127)<<25|v>>>7);f=o+F|0;b=(b^(W^e))+w|0;e=k+(f>>>0>>0?b+1|0:b)|0;b=f+q|0;e=b>>>0>>0?e+1|0:e;f=Ci(j,h,45);o=W;k=b;b=h>>>6|0;h=((h&63)<<26|j>>>6)^(Ci(j,h,3)^f);f=k+h|0;e=(b^(W^o))+e|0;y[u+240>>2]=f;y[u+244>>2]=f>>>0>>0?e+1|0:e;h=y[U>>2];j=y[U+4>>2];b=Ci(x,p,63);e=W;b=Ci(x,p,56)^b;o=W^e;e=p>>>7|0;p=((p&127)<<25|x>>>7)^b;f=p+t|0;b=(e^o)+l|0;e=(f>>>0

>>0?b+1|0:b)+j|0;b=f+h|0;e=b>>>0>>0?e+1|0:e;f=Ci(i,g,45);h=W;k=b;b=g>>>6|0;g=((g&63)<<26|i>>>6)^(Ci(i,g,3)^f);f=k+g|0;e=(b^(W^h))+e|0;y[u+248>>2]=f;y[u+252>>2]=f>>>0>>0?e+1|0:e;continue}break}e=b+y[a+4>>2]|0;b=f+y[a>>2]|0;e=b>>>0>>0?e+1|0:e;y[a>>2]=b;y[a+4>>2]=e;b=y[a+12>>2]+y[d+12>>2]|0;e=y[d+8>>2];c=e+y[a+8>>2]|0;y[a+8>>2]=c;y[a+12>>2]=c>>>0>>0?b+1|0:b;e=y[a+20>>2]+y[d+20>>2]|0;c=y[d+16>>2];b=c+y[a+16>>2]|0;y[a+16>>2]=b;y[a+20>>2]=b>>>0>>0?e+1|0:e;e=y[a+28>>2]+y[d+28>>2]|0;c=y[d+24>>2];b=c+y[a+24>>2]|0;y[a+24>>2]=b;y[a+28>>2]=b>>>0>>0?e+1|0:e;b=y[a+36>>2]+y[d+36>>2]|0;e=y[d+32>>2];c=e+y[a+32>>2]|0;y[a+32>>2]=c;y[a+36>>2]=c>>>0>>0?b+1|0:b;e=y[a+44>>2]+y[d+44>>2]|0;c=y[d+40>>2];b=c+y[a+40>>2]|0;y[a+40>>2]=b;y[a+44>>2]=b>>>0>>0?e+1|0:e;b=y[a+52>>2]+y[d+52>>2]|0;e=y[d+48>>2];c=e+y[a+48>>2]|0;y[a+48>>2]=c;y[a+52>>2]=c>>>0>>0?b+1|0:b;e=y[a+60>>2]+y[d+60>>2]|0;c=y[d+56>>2];b=c+y[a+56>>2]|0;y[a+56>>2]=b;y[a+60>>2]=b>>>0>>0?e+1|0:e;}function Pb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0;B=T-4096|0;T=B;a:{if(!a){break a}b:{c:{f=y[a+36>>2];d:{if((f|0)!=2){ja=y[a+4>>2];g=z[b+8|0];ca=y[b>>2];break d}ja=y[a+4>>2];ca=y[b>>2];g=z[b+8|0];if(ca|g>>>0>=2){break c}ca=0;}o(B+3072|0,0,1024);o(B+2104|0,0,968);y[B+2048>>2]=ca;y[B+2052>>2]=0;K=y[b+4>>2];y[B+2064>>2]=g&255;y[B+2068>>2]=0;y[B+2056>>2]=K;y[B+2060>>2]=0;y[B+2072>>2]=y[a+16>>2];y[B+2076>>2]=0;K=y[a+8>>2];y[B+2088>>2]=f;y[B+2092>>2]=0;y[B+2080>>2]=K;y[B+2084>>2]=0;if(!y[a+20>>2]){break b}K=0;while(1){f=p&127;if(!f){R=R+1|0;K=R?K:K+1|0;y[B+2096>>2]=R;y[B+2100>>2]=K;o(B,0,1024);s=B+1024|0;o(s,0,1024);d=B+3072|0;oc(d,B+2048|0,B);oc(d,B,s);}f=(B+1024|0)+(f<<3)|0;s=y[f+4>>2];d=(p<<3)+ja|0;y[d>>2]=y[f>>2];y[d+4>>2]=s;s=y[a+20>>2];p=p+1|0;if(s>>>0>p>>>0){continue}break}break b}s=y[a+20>>2];la=1;}fa=g&255;f=fa|ca;K=f?0:2;if(K>>>0>=s>>>0){break a}ma=!f;f=y[a+24>>2];ia=y[b+4>>2];R=(E(f,ia)+K|0)+E(s,fa)|0;p=R+((R>>>0)%(f>>>0)|0?-1:f-1|0)|0;na=fa+1|0;while(1){g=y[a+28>>2];f=y[a+24>>2];ka=((R>>>0)%(f>>>0)|0)==1?R-1|0:p;p=la?y[y[a>>2]+4>>2]+(ka<<10)|0:(K<<3)+ja|0;d=y[p>>2];p=y[p+4>>2];y[b+12>>2]=K;g=ma?ia:(p>>>0)%(g>>>0)|0;e:{if(!ca){if(!fa){p=K-1|0;c=0;break e}p=E(s,fa);if((g|0)==(ia|0)){p=(p+K|0)-1|0;c=0;break e}p=p-!K|0;c=0;break e}p=f+((g|0)==(ia|0)?(s^-1)+K|0:(K?0:-1)-s|0)|0;c=0;if((fa|0)==3){break e}c=E(s,na);}s=c;k=y[y[a>>2]+4>>2];j=k+(E(f,g)<<10)|0;g=p-1|0;c=g+s|0;e=g>>>0>c>>>0;Ai(d,0,d,0);Ai(p,0,W,0);p=W;g=c-p|0;s=0;m=0;f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p=e-(c>>>0

>>0)|0;if(p){if(!f){break o}break n}U=g-E((g>>>0)/(f>>>0)|0,f)|0;V=0;W=0;break f}if(!g){break m}break l}d=f-1|0;if(!(d&f)){break k}d=(H(f)+33|0)-H(p)|0;h=0-d|0;break i}U=0;V=p;W=0;break f}s=32-H(p)|0;if(s>>>0<31){break j}break h}U=d&g;V=0;if((f|0)==1){break g}g=zi(f);f=g&31;if((g&63)>>>0>=32){d=p>>>f|0;}else {s=p>>>f|0;d=0;}W=s;break f}d=s+1|0;h=63-s|0;}s=d&63;c=s&31;if(s>>>0>=32){s=0;e=p>>>c|0;}else {s=p>>>c|0;e=((1<>>c;}h=h&63;c=h&31;if(h>>>0>=32){p=g<>>32-c|p<>>31;s=e<<1|p>>>31;c=i-(n+(s>>>0>h>>>0)|0)>>31;G=c&f;e=s-G|0;s=n-(s>>>0>>0)|0;p=p<<1|g>>>31;g=m|g<<1;m=c&1;d=d-1|0;if(d){continue}break}}U=e;V=s;W=p<<1|g>>>31;break f}U=g;V=p;p=0;}W=p;}W=V;p=(U<<10)+j|0;f=k+(ka<<10)|0;s=k+(R<<10)|0;p:{if(ca){oc(f,p,s);break p}t(B+3072|0,p,1024);g=0;while(1){p=g<<3;d=B+3072|0;c=p+d|0;e=y[c>>2];k=f+p|0;m=y[k>>2];k=y[c+4>>2]^y[k+4>>2];y[c>>2]=e^m;y[c+4>>2]=k;e=p|8;c=e+d|0;k=y[c>>2];e=f+e|0;m=y[e>>2];e=y[c+4>>2]^y[e+4>>2];y[c>>2]=k^m;y[c+4>>2]=e;e=p|16;c=e+d|0;k=y[c>>2];e=f+e|0;m=y[e>>2];e=y[c+4>>2]^y[e+4>>2];y[c>>2]=k^m;y[c+4>>2]=e;c=p|24;p=c+d|0;e=y[p>>2];c=c+f|0;k=y[c>>2];c=y[p+4>>2]^y[c+4>>2];y[p>>2]=e^k;y[p+4>>2]=c;g=g+4|0;if((g|0)!=128){continue}break}t(B+2048|0,d,1024);p=0;g=0;while(1){f=(B+3072|0)+(g<<7)|0;k=y[f+56>>2];c=y[f+24>>2];e=k+c|0;n=y[f+60>>2];d=y[f+28>>2];m=n+d|0;j=Ai(c<<1&-2,(d<<1|c>>>31)&1,k,0);d=j+e|0;c=W+(c>>>0>e>>>0?m+1|0:m)|0;m=d>>>0>>0?c+1|0:c;j=Ci(d^y[f+120>>2],m^y[f+124>>2],32);c=y[f+88>>2];h=j+c|0;u=W;e=y[f+92>>2];i=u+e|0;G=Ai(j,0,c<<1&-2,(e<<1|c>>>31)&1);e=G+h|0;c=W+(c>>>0>h>>>0?i+1|0:i)|0;M=e>>>0>>0?c+1|0:c;F=Ci(k^e,n^M,40);ga=W;c=m+ga|0;i=c+1|0;l=c;c=d+F|0;k=c>>>0>>0?i:l;d=Ai(F,0,d<<1&-2,(m<<1|d>>>31)&1);G=d+c|0;c=W+k|0;X=d>>>0>G>>>0?c+1|0:c;u=Ci(G^j,u^X,48);l=W;C=l;r=y[f+44>>2];d=y[f+12>>2];k=r+d|0;m=y[f+40>>2];c=y[f+8>>2];j=m+c|0;h=Ai(c<<1&-2,(d<<1|c>>>31)&1,m,0);d=j+h|0;c=W+(c>>>0>j>>>0?k+1|0:k)|0;h=d>>>0>>0?c+1|0:c;i=Ci(d^y[f+104>>2],h^y[f+108>>2],32);k=y[f+72>>2];j=i+k|0;v=W;c=y[f+76>>2];n=v+c|0;q=Ai(i,0,k<<1&-2,(c<<1|k>>>31)&1);c=q+j|0;A=m^c;k=W+(k>>>0>j>>>0?n+1|0:n)|0;m=c>>>0>>0?k+1|0:k;j=Ci(A,r^m,40);n=W;k=h+n|0;r=k+1|0;q=k;k=d+j|0;r=k>>>0>>0?r:q;d=Ai(j,0,d<<1&-2,(h<<1|d>>>31)&1);k=d+k|0;h=W+r|0;Y=d>>>0>k>>>0?h+1|0:h;r=Ci(k^i,v^Y,48);ha=W;d=m+ha|0;q=d+1|0;i=d;d=c+r|0;h=d>>>0>>0?q:i;c=Ai(r,0,c<<1&-2,(m<<1|c>>>31)&1);m=d+c|0;d=W+h|0;_=c>>>0>m>>>0?d+1|0:d;v=Ci(j^m,n^_,1);A=W;da=A;D=y[f+36>>2];d=y[f+4>>2];j=D+d|0;h=y[f+32>>2];c=y[f>>2];i=h+c|0;n=Ai(c<<1&-2,(d<<1|c>>>31)&1,h,0);d=i+n|0;c=W+(c>>>0>i>>>0?j+1|0:j)|0;i=d>>>0>>0?c+1|0:c;Q=Ci(d^y[f+96>>2],i^y[f+100>>2],32);S=f- -64|0;j=S;c=y[j>>2];n=Q+c|0;aa=W;j=y[j+4>>2];q=aa+j|0;N=Ai(Q,0,c<<1&-2,(j<<1|c>>>31)&1);j=N+n|0;c=W+(c>>>0>n>>>0?q+1|0:q)|0;N=j>>>0>>0?c+1|0:c;q=Ci(h^j,D^N,40);ba=W;c=i+ba|0;n=c+1|0;h=c;c=d+q|0;h=c>>>0>>0?n:h;i=Ai(q,0,d<<1&-2,(i<<1|d>>>31)&1);d=c+i|0;c=W+h|0;Z=d>>>0>>0?c+1|0:c;c=Z+A|0;h=c+1|0;i=c;c=d+v|0;i=c>>>0>>0?h:i;n=Ai(v,0,d<<1&-2,(Z<<1|d>>>31)&1);h=c+n|0;c=W+i|0;J=h>>>0>>0?c+1|0:c;l=Ci(h^u,J^l,32);O=W;w=y[f+52>>2];c=y[f+20>>2];n=w+c|0;A=y[f+48>>2];i=y[f+16>>2];D=A+i|0;I=Ai(i<<1&-2,(c<<1|i>>>31)&1,A,0);c=D+I|0;i=W+(i>>>0>D>>>0?n+1|0:n)|0;D=c>>>0>>0?i+1|0:i;I=Ci(c^y[f+112>>2],D^y[f+116>>2],32);n=y[f+80>>2];P=I+n|0;ea=W;i=y[f+84>>2];L=ea+i|0;x=Ai(I,0,n<<1&-2,(i<<1|n>>>31)&1);i=x+P|0;n=W+(n>>>0>P>>>0?L+1|0:L)|0;P=i>>>0>>0?n+1|0:n;A=Ci(A^i,w^P,40);w=W;n=D+w|0;x=n+1|0;L=n;n=c+A|0;L=n>>>0>>0?x:L;c=Ai(A,0,c<<1&-2,(D<<1|c>>>31)&1);n=c+n|0;x=n^I;D=W+L|0;I=c>>>0>n>>>0?D+1|0:D;D=Ci(x,ea^I,48);ea=W;c=P+ea|0;x=c+1|0;L=c;c=i+D|0;L=c>>>0>>0?x:L;i=Ai(D,0,i<<1&-2,(P<<1|i>>>31)&1);c=i+c|0;P=W+L|0;P=c>>>0>>0?P+1|0:P;i=P+O|0;x=i+1|0;L=i;i=c+l|0;L=i>>>0>>0?x:L;x=Ai(l,0,c<<1&-2,(P<<1|c>>>31)&1);i=x+i|0;$=v^i;v=W+L|0;L=i>>>0>>0?v+1|0:v;v=Ci($,da^L,40);da=W;x=J+da|0;oa=x+1|0;$=x;x=h+v|0;$=x>>>0>>0?oa:$;J=Ai(v,0,h<<1&-2,(J<<1|h>>>31)&1);h=J+x|0;y[f>>2]=h;x=W+$|0;J=h>>>0>>0?x+1|0:x;y[f+4>>2]=J;h=Ci(h^l,J^O,48);y[f+120>>2]=h;l=W;y[f+124>>2]=l;l=l+L|0;$=l+1|0;x=l;l=h+i|0;J=l>>>0>>0?$:x;i=Ai(h,0,i<<1&-2,(L<<1|i>>>31)&1);h=i+l|0;y[f+80>>2]=h;l=W+J|0;i=h>>>0>>0?l+1|0:l;y[f+84>>2]=i;pa=f,qa=Ci(h^v,i^da,1),y[pa+40>>2]=qa;y[f+44>>2]=W;h=Ci(c^A,w^P,1);A=W;c=Y+A|0;i=c+1|0;l=c;c=h+k|0;i=c>>>0>>0?i:l;v=Ai(h,0,k<<1&-2,(Y<<1|k>>>31)&1);c=c+v|0;k=W+i|0;i=Ci(d^Q,Z^aa,48);v=c>>>0>>0?k+1|0:k;Y=W;k=Ci(i^c,v^Y,32);l=W;Q=l;d=M+C|0;w=d+1|0;C=d;d=e+u|0;Z=d>>>0>>0?w:C;e=Ai(u,0,e<<1&-2,(M<<1|e>>>31)&1);d=e+d|0;u=W+Z|0;u=d>>>0>>0?u+1|0:u;e=u+l|0;C=e+1|0;l=e;e=d+k|0;l=e>>>0>>0?C:l;M=Ai(k,0,d<<1&-2,(u<<1|d>>>31)&1);e=M+e|0;C=h^e;h=W+l|0;l=e>>>0>>0?h+1|0:h;h=Ci(C,A^l,40);A=W;M=v+A|0;w=M+1|0;C=M;M=c+h|0;Z=M>>>0>>0?w:C;v=Ai(h,0,c<<1&-2,(v<<1|c>>>31)&1);c=v+M|0;C=k^c;k=W+Z|0;v=c>>>0>>0?k+1|0:k;k=Ci(C,Q^v,48);y[f+96>>2]=k;M=W;y[f+100>>2]=M;y[f+8>>2]=c;y[f+12>>2]=v;c=l+M|0;w=c+1|0;C=c;c=e+k|0;v=c>>>0>>0?w:C;e=Ai(k,0,e<<1&-2,(l<<1|e>>>31)&1);c=e+c|0;y[f+88>>2]=c;k=W+v|0;e=c>>>0>>0?k+1|0:k;y[f+92>>2]=e;pa=f,qa=Ci(c^h,e^A,1),y[pa+48>>2]=qa;y[f+52>>2]=W;k=Ci(d^F,u^ga,1);F=W;d=I+F|0;e=d+1|0;c=d;d=k+n|0;e=d>>>0>>0?e:c;h=Ai(k,0,n<<1&-2,(I<<1|n>>>31)&1);c=d+h|0;d=W+e|0;n=c>>>0>>0?d+1|0:d;h=Ci(c^r,ha^n,32);e=W;u=e;d=N+Y|0;l=d+1|0;e=d;d=i+j|0;r=d>>>0>>0?l:e;j=Ai(i,0,j<<1&-2,(N<<1|j>>>31)&1);d=j+d|0;e=W+r|0;j=d>>>0>>0?e+1|0:e;e=u+j|0;i=e+1|0;l=e;e=d+h|0;i=e>>>0>>0?i:l;r=Ai(h,0,d<<1&-2,(j<<1|d>>>31)&1);e=e+r|0;l=k^e;k=W+i|0;i=e>>>0>>0?k+1|0:k;k=Ci(l,F^i,40);F=W;r=n+F|0;C=r+1|0;l=r;r=c+k|0;v=r>>>0>>0?C:l;n=Ai(k,0,c<<1&-2,(n<<1|c>>>31)&1);c=n+r|0;l=h^c;h=W+v|0;n=c>>>0>>0?h+1|0:h;h=Ci(l,u^n,48);y[f+104>>2]=h;u=W;y[f+108>>2]=u;y[f+16>>2]=c;y[f+20>>2]=n;c=i+u|0;n=c+1|0;l=c;c=e+h|0;n=c>>>0>>0?n:l;e=Ai(h,0,e<<1&-2,(i<<1|e>>>31)&1);c=e+c|0;y[S>>2]=c;h=W+n|0;e=c>>>0>>0?h+1|0:h;y[S+4>>2]=e;pa=f,qa=Ci(c^k,e^F,1),y[pa+56>>2]=qa;y[f+60>>2]=W;e=Ci(d^q,j^ba,1);c=e+G|0;h=W;k=h+X|0;j=Ai(G<<1&-2,(X<<1|G>>>31)&1,e,0);d=j+c|0;c=W+(c>>>0>>0?k+1|0:k)|0;j=d>>>0>>0?c+1|0:c;k=Ci(d^D,ea^j,32);i=W;c=_+i|0;q=c+1|0;l=c;c=k+m|0;n=c>>>0>>0?q:l;m=Ai(k,0,m<<1&-2,(_<<1|m>>>31)&1);c=c+m|0;l=e^c;e=W+n|0;m=c>>>0>>0?e+1|0:e;e=Ci(l,h^m,40);h=W;n=j+h|0;q=n+1|0;l=n;n=d+e|0;G=n>>>0>>0?q:l;j=Ai(e,0,d<<1&-2,(j<<1|d>>>31)&1);d=j+n|0;l=k^d;k=W+G|0;j=d>>>0>>0?k+1|0:k;k=Ci(l,i^j,48);y[f+112>>2]=k;i=W;y[f+116>>2]=i;y[f+24>>2]=d;y[f+28>>2]=j;d=i+m|0;i=d+1|0;l=d;d=c+k|0;j=d>>>0>>0?i:l;c=Ai(k,0,c<<1&-2,(m<<1|c>>>31)&1);d=c+d|0;y[f+72>>2]=d;k=W+j|0;c=d>>>0>>0?k+1|0:k;y[f+76>>2]=c;pa=f,qa=Ci(d^e,c^h,1),y[pa+32>>2]=qa;y[f+36>>2]=W;g=g+1|0;if((g|0)!=8){continue}break}while(1){f=(B+3072|0)+(p<<4)|0;e=y[f+392>>2];d=y[f+136>>2];c=e+d|0;i=y[f+396>>2];g=y[f+140>>2];k=i+g|0;m=Ai(d<<1&-2,(g<<1|d>>>31)&1,e,0);g=m+c|0;d=W+(d>>>0>c>>>0?k+1|0:k)|0;k=g>>>0>>0?d+1|0:d;m=Ci(g^y[f+904>>2],k^y[f+908>>2],32);d=y[f+648>>2];j=m+d|0;F=W;c=y[f+652>>2];h=F+c|0;n=Ai(m,0,d<<1&-2,(c<<1|d>>>31)&1);c=n+j|0;d=W+(d>>>0>j>>>0?h+1|0:h)|0;D=c>>>0>>0?d+1|0:d;G=Ci(e^c,i^D,40);P=W;d=k+P|0;l=d+1|0;e=d;d=g+G|0;e=d>>>0>>0?l:e;g=Ai(G,0,g<<1&-2,(k<<1|g>>>31)&1);n=g+d|0;d=W+e|0;M=g>>>0>n>>>0?d+1|0:d;F=Ci(n^m,F^M,48);q=W;L=q;u=y[f+268>>2];g=y[f+12>>2];e=u+g|0;k=y[f+264>>2];d=y[f+8>>2];m=k+d|0;j=Ai(d<<1&-2,(g<<1|d>>>31)&1,k,0);g=m+j|0;d=W+(d>>>0>m>>>0?e+1|0:e)|0;j=g>>>0>>0?d+1|0:d;h=Ci(g^y[f+776>>2],j^y[f+780>>2],32);e=y[f+520>>2];m=h+e|0;r=W;d=y[f+524>>2];i=r+d|0;v=Ai(h,0,e<<1&-2,(d<<1|e>>>31)&1);d=v+m|0;l=k^d;e=W+(e>>>0>m>>>0?i+1|0:i)|0;k=d>>>0>>0?e+1|0:e;m=Ci(l,u^k,40);i=W;e=j+i|0;u=e+1|0;l=e;e=g+m|0;u=e>>>0>>0?u:l;g=Ai(m,0,g<<1&-2,(j<<1|g>>>31)&1);e=g+e|0;j=W+u|0;X=e>>>0>>0?j+1|0:j;u=Ci(e^h,r^X,48);ga=W;g=k+ga|0;h=g+1|0;l=g;g=d+u|0;j=g>>>0>>0?h:l;d=Ai(u,0,d<<1&-2,(k<<1|d>>>31)&1);k=g+d|0;g=W+j|0;Y=d>>>0>k>>>0?g+1|0:g;r=Ci(m^k,i^Y,1);l=W;C=l;A=y[f+260>>2];g=y[f+4>>2];m=A+g|0;j=y[f+256>>2];d=y[f>>2];h=j+d|0;i=Ai(d<<1&-2,(g<<1|d>>>31)&1,j,0);g=h+i|0;d=W+(d>>>0>h>>>0?m+1|0:m)|0;h=g>>>0>>0?d+1|0:d;_=Ci(g^y[f+768>>2],h^y[f+772>>2],32);d=y[f+512>>2];i=_+d|0;ha=W;m=y[f+516>>2];v=ha+m|0;Q=Ai(_,0,d<<1&-2,(m<<1|d>>>31)&1);m=Q+i|0;d=W+(d>>>0>i>>>0?v+1|0:v)|0;Q=m>>>0>>0?d+1|0:d;v=Ci(j^m,A^Q,40);da=W;d=h+da|0;j=d+1|0;i=d;d=g+v|0;j=d>>>0>>0?j:i;h=Ai(v,0,g<<1&-2,(h<<1|g>>>31)&1);g=d+h|0;d=W+j|0;S=g>>>0>>0?d+1|0:d;d=S+l|0;i=d+1|0;l=d;d=g+r|0;h=d>>>0>>0?i:l;i=Ai(r,0,g<<1&-2,(S<<1|g>>>31)&1);j=d+i|0;d=W+h|0;N=i>>>0>j>>>0?d+1|0:d;q=Ci(j^F,N^q,32);Z=W;aa=y[f+388>>2];d=y[f+132>>2];i=aa+d|0;l=y[f+384>>2];h=y[f+128>>2];A=l+h|0;J=Ai(h<<1&-2,(d<<1|h>>>31)&1,l,0);d=A+J|0;h=W+(h>>>0>A>>>0?i+1|0:i)|0;A=d>>>0>>0?h+1|0:h;J=Ci(d^y[f+896>>2],A^y[f+900>>2],32);i=y[f+640>>2];O=J+i|0;ba=W;h=y[f+644>>2];I=ba+h|0;w=Ai(J,0,i<<1&-2,(h<<1|i>>>31)&1);h=w+O|0;i=W+(i>>>0>O>>>0?I+1|0:I)|0;O=h>>>0>>0?i+1|0:i;l=Ci(l^h,aa^O,40);aa=W;i=A+aa|0;x=i+1|0;w=i;i=d+l|0;I=i>>>0>>0?x:w;d=Ai(l,0,d<<1&-2,(A<<1|d>>>31)&1);i=d+i|0;w=i^J;A=W+I|0;J=d>>>0>i>>>0?A+1|0:A;A=Ci(w,ba^J,48);ba=W;d=O+ba|0;x=d+1|0;w=d;d=h+A|0;I=d>>>0>>0?x:w;h=Ai(A,0,h<<1&-2,(O<<1|h>>>31)&1);d=h+d|0;O=W+I|0;O=d>>>0>>0?O+1|0:O;h=O+Z|0;x=h+1|0;w=h;h=d+q|0;I=h>>>0>>0?x:w;w=Ai(q,0,d<<1&-2,(O<<1|d>>>31)&1);h=w+h|0;x=r^h;r=W+I|0;I=h>>>0>>0?r+1|0:r;r=Ci(x,C^I,40);C=W;w=N+C|0;$=w+1|0;x=w;w=j+r|0;ea=w>>>0>>0?$:x;N=Ai(r,0,j<<1&-2,(N<<1|j>>>31)&1);j=N+w|0;y[f>>2]=j;w=W+ea|0;N=j>>>0>>0?w+1|0:w;y[f+4>>2]=N;j=Ci(j^q,N^Z,48);y[f+904>>2]=j;q=W;y[f+908>>2]=q;q=q+I|0;x=q+1|0;w=q;q=h+j|0;N=q>>>0>>0?x:w;h=Ai(j,0,h<<1&-2,(I<<1|h>>>31)&1);j=h+q|0;y[f+640>>2]=j;q=W+N|0;h=h>>>0>j>>>0?q+1|0:q;y[f+644>>2]=h;pa=f,qa=Ci(j^r,h^C,1),y[pa+264>>2]=qa;y[f+268>>2]=W;j=Ci(d^l,O^aa,1);l=W;d=X+l|0;h=d+1|0;q=d;d=e+j|0;h=d>>>0>>0?h:q;r=Ai(j,0,e<<1&-2,(X<<1|e>>>31)&1);d=d+r|0;e=W+h|0;h=Ci(g^_,S^ha,48);r=d>>>0>>0?e+1|0:e;X=W;e=Ci(h^d,r^X,32);q=W;_=q;g=D+L|0;w=g+1|0;C=g;g=c+F|0;S=g>>>0>>0?w:C;c=Ai(F,0,c<<1&-2,(D<<1|c>>>31)&1);g=c+g|0;F=W+S|0;F=c>>>0>g>>>0?F+1|0:F;c=F+q|0;C=c+1|0;q=c;c=e+g|0;q=c>>>0>>0?C:q;D=Ai(e,0,g<<1&-2,(F<<1|g>>>31)&1);c=D+c|0;C=j^c;j=W+q|0;q=c>>>0>>0?j+1|0:j;j=Ci(C,l^q,40);l=W;D=r+l|0;w=D+1|0;C=D;D=d+j|0;S=D>>>0>>0?w:C;r=Ai(j,0,d<<1&-2,(r<<1|d>>>31)&1);d=r+D|0;C=e^d;e=W+S|0;r=d>>>0>>0?e+1|0:e;e=Ci(C,_^r,48);y[f+768>>2]=e;D=W;y[f+772>>2]=D;y[f+8>>2]=d;y[f+12>>2]=r;d=q+D|0;r=d+1|0;C=d;d=c+e|0;r=d>>>0>>0?r:C;c=Ai(e,0,c<<1&-2,(q<<1|c>>>31)&1);d=c+d|0;y[f+648>>2]=d;e=W+r|0;c=d>>>0>>0?e+1|0:e;y[f+652>>2]=c;pa=f,qa=Ci(d^j,c^l,1),y[pa+384>>2]=qa;y[f+388>>2]=W;e=Ci(g^G,F^P,1);G=W;g=J+G|0;c=g+1|0;d=g;g=e+i|0;c=g>>>0>>0?c:d;j=Ai(e,0,i<<1&-2,(J<<1|i>>>31)&1);d=g+j|0;g=W+c|0;i=d>>>0>>0?g+1|0:g;j=Ci(d^u,ga^i,32);c=W;F=c;g=Q+X|0;l=g+1|0;c=g;g=h+m|0;u=g>>>0>>0?l:c;m=Ai(h,0,m<<1&-2,(Q<<1|m>>>31)&1);g=m+g|0;c=W+u|0;m=g>>>0>>0?c+1|0:c;c=F+m|0;q=c+1|0;l=c;c=g+j|0;h=c>>>0>>0?q:l;u=Ai(j,0,g<<1&-2,(m<<1|g>>>31)&1);c=c+u|0;l=e^c;e=W+h|0;h=c>>>0>>0?e+1|0:e;e=Ci(l,G^h,40);G=W;u=i+G|0;q=u+1|0;l=u;u=d+e|0;r=u>>>0>>0?q:l;i=Ai(e,0,d<<1&-2,(i<<1|d>>>31)&1);d=i+u|0;l=j^d;j=W+r|0;i=d>>>0>>0?j+1|0:j;j=Ci(l,F^i,48);y[f+776>>2]=j;F=W;y[f+780>>2]=F;y[f+128>>2]=d;y[f+132>>2]=i;d=h+F|0;i=d+1|0;l=d;d=c+j|0;i=d>>>0>>0?i:l;c=Ai(j,0,c<<1&-2,(h<<1|c>>>31)&1);d=c+d|0;y[f+512>>2]=d;j=W+i|0;c=d>>>0>>0?j+1|0:j;y[f+516>>2]=c;pa=f,qa=Ci(d^e,c^G,1),y[pa+392>>2]=qa;y[f+396>>2]=W;c=Ci(g^v,m^da,1);d=c+n|0;j=W;e=j+M|0;m=Ai(n<<1&-2,(M<<1|n>>>31)&1,c,0);g=m+d|0;d=W+(d>>>0>>0?e+1|0:e)|0;m=g>>>0>>0?d+1|0:d;e=Ci(g^A,ba^m,32);h=W;d=Y+h|0;i=d+1|0;l=d;d=e+k|0;i=d>>>0>>0?i:l;k=Ai(e,0,k<<1&-2,(Y<<1|k>>>31)&1);d=d+k|0;l=c^d;c=W+i|0;k=d>>>0>>0?c+1|0:c;c=Ci(l,j^k,40);j=W;i=m+j|0;q=i+1|0;l=i;i=c+g|0;n=i>>>0>>0?q:l;m=Ai(c,0,g<<1&-2,(m<<1|g>>>31)&1);g=m+i|0;l=e^g;e=W+n|0;m=g>>>0>>0?e+1|0:e;e=Ci(l,h^m,48);y[f+896>>2]=e;h=W;y[f+900>>2]=h;y[f+136>>2]=g;y[f+140>>2]=m;g=h+k|0;i=g+1|0;l=g;g=d+e|0;m=g>>>0>>0?i:l;d=Ai(e,0,d<<1&-2,(k<<1|d>>>31)&1);g=d+g|0;y[f+520>>2]=g;e=W+m|0;d=d>>>0>g>>>0?e+1|0:e;y[f+524>>2]=d;pa=f,qa=Ci(c^g,d^j,1),y[pa+256>>2]=qa;y[f+260>>2]=W;p=p+1|0;if((p|0)!=8){continue}break}t(s,B+2048|0,1024);p=0;while(1){f=p<<3;g=f+s|0;c=y[g>>2];d=B+3072|0;e=d+f|0;k=y[e>>2];e=y[g+4>>2]^y[e+4>>2];y[g>>2]=c^k;y[g+4>>2]=e;c=f|8;g=c+s|0;e=y[g>>2];c=d+c|0;k=y[c>>2];c=y[g+4>>2]^y[c+4>>2];y[g>>2]=e^k;y[g+4>>2]=c;c=f|16;g=c+s|0;e=y[g>>2];c=d+c|0;k=y[c>>2];c=y[g+4>>2]^y[c+4>>2];y[g>>2]=e^k;y[g+4>>2]=c;g=f|24;f=g+s|0;c=y[f>>2];g=d+g|0;d=y[g>>2];g=y[f+4>>2]^y[g+4>>2];y[f>>2]=d^c;y[f+4>>2]=g;p=p+4|0;if((p|0)!=128){continue}break}}p=ka+1|0;R=R+1|0;s=y[a+20>>2];K=K+1|0;if(s>>>0>K>>>0){continue}break}}T=B+4096|0;}function Pa(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0;q=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);e=q>>>5&2097151;I=(z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24))>>>3|0;d=Ai(I,0,-683901,-1);b=z[a+44|0];c=b<<16&2031616|(z[a+42|0]|z[a+43|0]<<8);k=d+c|0;b=W;b=c>>>0>k>>>0?b+1|0:b;i=b;b=b-((k>>>0<4293918720)-1|0)|0;n=b;d=b>>21;c=e;g=k- -1048576|0;e=(b&2097151)<<11|g>>>21;b=c+e|0;c=d;c=b>>>0>>0?c+1|0:c;x=c;H=b;o=Ai(b,c,-683901,-1);j=W;J=(z[a+49|0]|z[a+50|0]<<8|(z[a+51|0]<<16|z[a+52|0]<<24))>>>7&2097151;h=Ai(J,0,-997805,-1);b=z[a+27|0];d=0;p=z[a+23|0]|z[a+24|0]<<8|(z[a+25|0]<<16|z[a+26|0]<<24);e=b<<8|p>>>24;b=z[a+28|0];c=0;b=e|b<<16;c=c|d;c=((c&3)<<30|b>>>2)&2097151;d=c+h|0;b=W;b=c>>>0>d>>>0?b+1|0:b;l=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);F=l>>>4&2097151;c=Ai(F,0,654183,0);d=c+d|0;b=W+b|0;h=d;d=c>>>0>d>>>0?b+1|0:b;c=z[a+48|0];b=0;f=c<<8|q>>>24;e=z[a+49|0];e=e<<16;q=b|b;c=e|f;K=((q&3)<<30|c>>>2)&2097151;b=Ai(K,0,136657,0);c=b+h|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;L=(z[a+57|0]|z[a+58|0]<<8|(z[a+59|0]<<16|z[a+60|0]<<24))>>>6&2097151;b=Ai(L,0,666643,0);e=b+c|0;c=W+d|0;h=e;d=b>>>0>e>>>0?c+1|0:c;b=z[a+56|0];c=0;f=b<<8|l>>>24;e=z[a+57|0];b=0;e=e<<16;l=b|c;c=e|f;M=((l&1)<<31|c>>>1)&2097151;c=Ai(M,0,470296,0);e=c+h|0;b=W+d|0;d=e;b=d>>>0>>0?b+1|0:b;c=b+j|0;e=d+o|0;c=d>>>0>e>>>0?c+1|0:c;r=d- -1048576|0;d=b-((d>>>0<4293918720)-1|0)|0;y=d;b=r&-2097152;j=e-b|0;o=c-((b>>>0>e>>>0)+d|0)|0;c=Ai(J,0,654183,0);d=c+(p>>>5&2097151)|0;b=W;b=c>>>0>d>>>0?b+1|0:b;c=d;d=Ai(F,0,470296,0);e=c+d|0;c=W+b|0;c=d>>>0>e>>>0?c+1|0:c;b=Ai(K,N,-997805,-1);d=b+e|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(M,O,666643,0);e=b+d|0;b=W+c|0;f=e;e=d>>>0>e>>>0?b+1|0:b;d=Ai(J,0,470296,0);b=z[a+23|0];b=b<<16&2031616|(z[a+21|0]|z[a+22|0]<<8);h=d+b|0;d=W;d=b>>>0>h>>>0?d+1|0:d;c=Ai(F,0,666643,0);h=c+h|0;b=W+d|0;d=Ai(K,N,654183,0);p=d+h|0;c=W+(c>>>0>h>>>0?b+1|0:b)|0;c=d>>>0>p>>>0?c+1|0:c;l=c;c=c-((p>>>0<4293918720)-1|0)|0;E=c;b=c>>>21|0;h=p- -1048576|0;c=(c&2097151)<<11|h>>>21;f=c+f|0;b=b+e|0;b=c>>>0>f>>>0?b+1|0:b;d=b;c=b-((f>>>0<4293918720)-1|0)|0;m=c;b=j;e=f- -1048576|0;j=(c&2097151)<<11|e>>>21;s=b+j|0;c=(c>>21)+o|0;c=j>>>0>s>>>0?c+1|0:c;j=c-((s>>>0<4293918720)-1|0)|0;q=j;o=s- -1048576|0;b=o&-2097152;G=s-b|0;P=c-((b>>>0>s>>>0)+j|0)|0;b=Ai(H,x,136657,0);c=b+f|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;b=e&-2097152;v=c-b|0;t=d-((b>>>0>c>>>0)+m|0)|0;b=g&-2097152;s=k-b|0;n=i-((b>>>0>k>>>0)+n|0)|0;i=Ai(I,0,136657,0);b=z[a+40|0];c=0;g=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);e=b<<8|g>>>24;b=z[a+41|0];d=0;b=e|b<<16;d=c|d;c=d>>>3|0;d=(d&7)<<29|b>>>3;e=d+i|0;b=c+W|0;b=d>>>0>e>>>0?b+1|0:b;c=Ai(L,0,-683901,-1);d=c+e|0;b=W+b|0;b=c>>>0>d>>>0?b+1|0:b;f=d;c=Ai(I,0,-997805,-1);e=c+(g>>>6&2097151)|0;d=W;d=c>>>0>e>>>0?d+1|0:d;c=e;e=Ai(L,0,136657,0);g=c+e|0;c=W+d|0;d=Ai(M,O,-683901,-1);A=d+g|0;c=W+(e>>>0>g>>>0?c+1|0:c)|0;c=d>>>0>A>>>0?c+1|0:c;j=c;d=c-((A>>>0<4293918720)-1|0)|0;S=d;c=d>>21;k=A- -1048576|0;d=(d&2097151)<<11|k>>>21;m=d+f|0;b=b+c|0;b=d>>>0>m>>>0?b+1|0:b;g=b;b=b-((m>>>0<4293918720)-1|0)|0;B=b;c=b>>21;f=m- -1048576|0;d=(b&2097151)<<11|f>>>21;b=d+s|0;c=c+n|0;c=b>>>0>>0?c+1|0:c;D=c;C=b;c=Ai(b,c,-683901,-1);d=c+v|0;b=W+t|0;u=d;e=c>>>0>d>>>0?b+1|0:b;b=h&-2097152;s=p-b|0;n=l-((E&4095)+(b>>>0>p>>>0)|0)|0;p=Ai(J,0,666643,0);c=z[a+19|0];b=0;l=z[a+15|0]|z[a+16|0]<<8|(z[a+17|0]<<16|z[a+18|0]<<24);h=c<<8|l>>>24;d=b;b=z[a+20|0];c=0;b=b<<16;d=c|d;c=b|h;c=(d&7)<<29|c>>>3;h=c+p|0;d=W+(d>>>3|0)|0;d=c>>>0>h>>>0?d+1|0:d;b=Ai(K,N,470296,0);h=b+h|0;c=W+d|0;b=b>>>0>h>>>0?c+1|0:c;d=Ai(K,N,666643,0);v=d+(l>>>6&2097151)|0;c=W;c=d>>>0>v>>>0?c+1|0:c;p=c;d=c-((v>>>0<4293918720)-1|0)|0;T=d;c=d>>>21|0;i=v- -1048576|0;d=(d&2097151)<<11|i>>>21;t=d+h|0;b=b+c|0;b=d>>>0>t>>>0?b+1|0:b;l=b;b=b-((t>>>0<4293918720)-1|0)|0;U=b;c=b>>>21|0;h=t- -1048576|0;b=(b&2097151)<<11|h>>>21;d=b+s|0;c=c+n|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(H,x,-997805,-1);n=b+d|0;b=W+c|0;b=d>>>0>n>>>0?b+1|0:b;d=f&-2097152;c=m-d|0;E=c;f=g-((d>>>0>m>>>0)+B|0)|0;Q=f;d=Ai(C,D,136657,0);g=d+n|0;b=W+b|0;b=d>>>0>g>>>0?b+1|0:b;d=Ai(c,f,-683901,-1);n=d+g|0;c=W+b|0;c=d>>>0>n>>>0?c+1|0:c;g=c;b=c-((n>>>0<4293918720)-1|0)|0;B=b;f=n- -1048576|0;c=(b&2097151)<<11|f>>>21;m=c+u|0;b=(b>>21)+e|0;b=c>>>0>m>>>0?b+1|0:b;c=b-((m>>>0<4293918720)-1|0)|0;u=c;e=m- -1048576|0;s=(c&2097151)<<11|e>>>21;G=s+G|0;c=(c>>21)+P|0;V=G;s=s>>>0>G>>>0?c+1|0:c;c=e&-2097152;X=m-c|0;Y=b-((c>>>0>m>>>0)+u|0)|0;b=f&-2097152;G=n-b|0;P=g-((b>>>0>n>>>0)+B|0)|0;b=Ai(H,x,654183,0);c=h&-2097152;d=b+(t-c|0)|0;c=W+(l-((U&2147483647)+(c>>>0>t>>>0)|0)|0)|0;c=b>>>0>d>>>0?c+1|0:c;b=Ai(C,D,-997805,-1);d=b+d|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(E,Q,136657,0);e=b+d|0;b=W+c|0;u=e;g=d>>>0>e>>>0?b+1|0:b;b=k&-2097152;t=A-b|0;m=j-((b>>>0>A>>>0)+S|0)|0;l=Ai(F,0,-683901,-1);c=z[a+35|0];b=0;h=z[a+31|0]|z[a+32|0]<<8|(z[a+33|0]<<16|z[a+34|0]<<24);e=c<<8|h>>>24;d=b;b=z[a+36|0];c=0;b=b<<16|e;c=c|d;b=((c&1)<<31|b>>>1)&2097151;c=b+l|0;d=W;d=b>>>0>c>>>0?d+1|0:d;b=Ai(I,0,654183,0);e=b+c|0;c=W+d|0;c=b>>>0>e>>>0?c+1|0:c;d=Ai(L,0,-997805,-1);e=d+e|0;b=W+c|0;b=d>>>0>e>>>0?b+1|0:b;c=Ai(M,O,136657,0);d=c+e|0;b=W+b|0;f=d;e=c>>>0>d>>>0?b+1|0:b;b=Ai(J,0,-683901,-1);d=b+(h>>>4&2097151)|0;c=W;c=b>>>0>d>>>0?c+1|0:c;b=Ai(F,0,136657,0);h=b+d|0;d=W+c|0;d=b>>>0>h>>>0?d+1|0:d;b=Ai(I,0,470296,0);h=b+h|0;c=W+d|0;c=b>>>0>h>>>0?c+1|0:c;d=Ai(L,0,654183,0);h=d+h|0;b=W+c|0;c=Ai(M,O,-997805,-1);j=c+h|0;b=W+(d>>>0>h>>>0?b+1|0:b)|0;b=c>>>0>j>>>0?b+1|0:b;l=b;c=b-((j>>>0<4293918720)-1|0)|0;Z=c;b=c>>21;h=j- -1048576|0;c=(c&2097151)<<11|h>>>21;k=c+f|0;d=b+e|0;d=c>>>0>k>>>0?d+1|0:d;c=d-((k>>>0<4293918720)-1|0)|0;n=c;b=c>>21;f=k- -1048576|0;e=(c&2097151)<<11|f>>>21;c=e+t|0;b=b+m|0;b=c>>>0>>0?b+1|0:b;B=b;e=u;u=c;b=Ai(c,b,-683901,-1);e=e+b|0;c=W+g|0;m=e;e=b>>>0>e>>>0?c+1|0:c;b=Ai(H,x,470296,0);c=i&-2097152;g=b+(v-c|0)|0;c=W+(p-((T&2047)+(c>>>0>v>>>0)|0)|0)|0;c=b>>>0>g>>>0?c+1|0:c;b=g;g=Ai(C,D,654183,0);i=b+g|0;b=W+c|0;b=g>>>0>i>>>0?b+1|0:b;g=Ai(E,Q,-997805,-1);i=g+i|0;c=W+b|0;c=g>>>0>i>>>0?c+1|0:c;b=f&-2097152;f=k-b|0;A=f;g=d-((b>>>0>k>>>0)+n|0)|0;R=g;d=Ai(u,B,136657,0);i=d+i|0;b=W+c|0;b=d>>>0>i>>>0?b+1|0:b;d=Ai(f,g,-683901,-1);p=d+i|0;c=W+b|0;c=d>>>0>p>>>0?c+1|0:c;g=c;b=c-((p>>>0<4293918720)-1|0)|0;t=b;f=p- -1048576|0;c=(b&2097151)<<11|f>>>21;i=c+m|0;b=(b>>21)+e|0;b=c>>>0>i>>>0?b+1|0:b;c=b-((i>>>0<4293918720)-1|0)|0;m=c;e=i- -1048576|0;k=(c&2097151)<<11|e>>>21;n=k+G|0;c=(c>>21)+P|0;S=n;n=k>>>0>n>>>0?c+1|0:c;c=e&-2097152;T=i-c|0;U=b-((c>>>0>i>>>0)+m|0)|0;b=f&-2097152;G=p-b|0;P=g-((b>>>0>p>>>0)+t|0)|0;g=Ai(H,x,666643,0);c=z[a+14|0];b=0;m=z[a+10|0]|z[a+11|0]<<8|(z[a+12|0]<<16|z[a+13|0]<<24);e=c<<8|m>>>24;d=b;b=z[a+15|0];c=0;b=b<<16|e;c=c|d;b=((c&1)<<31|b>>>1)&2097151;c=b+g|0;d=W;d=b>>>0>c>>>0?d+1|0:d;b=c;c=Ai(C,D,470296,0);e=b+c|0;b=W+d|0;b=c>>>0>e>>>0?b+1|0:b;c=Ai(E,Q,654183,0);d=c+e|0;b=W+b|0;b=c>>>0>d>>>0?b+1|0:b;c=d;d=Ai(u,B,-997805,-1);e=c+d|0;c=W+b|0;c=d>>>0>e>>>0?c+1|0:c;b=Ai(A,R,136657,0);d=b+e|0;c=W+c|0;p=d;e=b>>>0>d>>>0?c+1|0:c;b=h&-2097152;h=j-b|0;g=l-((b>>>0>j>>>0)+Z|0)|0;d=Ai(J,0,136657,0);b=W;c=(z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24))>>>7&2097151;d=c+d|0;b=c>>>0>d>>>0?b+1|0:b;c=d;d=Ai(F,0,-997805,-1);f=c+d|0;c=W+b|0;c=d>>>0>f>>>0?c+1|0:c;b=Ai(K,N,-683901,-1);d=b+f|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=Ai(I,0,666643,0);f=b+d|0;d=W+c|0;d=b>>>0>f>>>0?d+1|0:d;c=Ai(L,0,470296,0);f=c+f|0;b=W+d|0;b=c>>>0>f>>>0?b+1|0:b;c=Ai(M,O,654183,0);d=c+f|0;b=W+b|0;f=(y&2097151)<<11|r>>>21;r=f+d|0;c=(y>>21)+(c>>>0>d>>>0?b+1|0:b)|0;c=f>>>0>r>>>0?c+1|0:c;k=c;b=c-((r>>>0<4293918720)-1|0)|0;y=b;i=r- -1048576|0;f=(b&2097151)<<11|i>>>21;c=f+h|0;b=(b>>21)+g|0;b=c>>>0>>0?b+1|0:b;v=b;t=c;c=Ai(c,b,-683901,-1);d=c+p|0;b=W+e|0;f=d;e=c>>>0>d>>>0?b+1|0:b;b=Ai(C,D,666643,0);d=b+(m>>>4&2097151)|0;c=W;c=b>>>0>d>>>0?c+1|0:c;b=Ai(E,Q,470296,0);d=b+d|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=Ai(u,B,654183,0);g=b+d|0;d=W+c|0;d=b>>>0>g>>>0?d+1|0:d;c=Ai(A,R,-997805,-1);g=c+g|0;b=W+d|0;b=c>>>0>g>>>0?b+1|0:b;c=Ai(t,v,136657,0);j=c+g|0;b=W+b|0;b=c>>>0>j>>>0?b+1|0:b;l=b;c=b-((j>>>0<4293918720)-1|0)|0;D=c;b=f;h=j- -1048576|0;f=(c&2097151)<<11|h>>>21;d=b+f|0;c=(c>>21)+e|0;c=d>>>0>>0?c+1|0:c;e=c-((d>>>0<4293918720)-1|0)|0;C=e;b=e>>21;g=d- -1048576|0;e=(e&2097151)<<11|g>>>21;f=e+G|0;b=b+P|0;H=f;p=e>>>0>f>>>0?b+1|0:b;f=d;d=c;c=i&-2097152;i=(q&2097151)<<11|o>>>21;e=(r-c|0)+i|0;c=(k-((c>>>0>r>>>0)+y|0)|0)+(q>>21)|0;c=e>>>0>>0?c+1|0:c;m=c;c=c-((e>>>0<4293918720)-1|0)|0;F=c;b=c>>21;o=b;y=e- -1048576|0;x=(c&2097151)<<11|y>>>21;b=Ai(x,b,-683901,-1);c=b+f|0;d=W+d|0;d=b>>>0>c>>>0?d+1|0:d;b=g&-2097152;N=c-b|0;O=d-((b>>>0>c>>>0)+C|0)|0;b=Ai(x,o,136657,0);c=l+W|0;d=b+j|0;c=d>>>0>>0?c+1|0:c;b=h&-2097152;C=d-b|0;r=c-((b>>>0>d>>>0)+D|0)|0;c=Ai(E,Q,666643,0);d=W;b=(z[a+7|0]|z[a+8|0]<<8|(z[a+9|0]<<16|z[a+10|0]<<24))>>>7&2097151;c=b+c|0;d=b>>>0>c>>>0?d+1|0:d;b=Ai(u,B,470296,0);f=b+c|0;c=W+d|0;c=b>>>0>f>>>0?c+1|0:c;b=Ai(A,R,654183,0);d=b+f|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=d;d=Ai(t,v,-997805,-1);f=b+d|0;b=W+c|0;i=f;f=d>>>0>f>>>0?b+1|0:b;l=Ai(u,B,666643,0);c=z[a+6|0];b=0;D=z[a+2|0]|z[a+3|0]<<8|(z[a+4|0]<<16|z[a+5|0]<<24);g=c<<8|D>>>24;d=b;b=z[a+7|0];c=0;b=b<<16|g;c=c|d;c=((c&3)<<30|b>>>2)&2097151;d=c+l|0;b=W;b=c>>>0>d>>>0?b+1|0:b;c=Ai(A,R,470296,0);g=c+d|0;d=W+b|0;d=c>>>0>g>>>0?d+1|0:d;c=Ai(t,v,654183,0);k=c+g|0;b=W+d|0;b=c>>>0>k>>>0?b+1|0:b;l=b;b=b-((k>>>0<4293918720)-1|0)|0;q=b;d=b>>21;h=k- -1048576|0;b=(b&2097151)<<11|h>>>21;g=b+i|0;c=d+f|0;c=b>>>0>g>>>0?c+1|0:c;b=c-((g>>>0<4293918720)-1|0)|0;j=b;f=g- -1048576|0;i=(b&2097151)<<11|f>>>21;u=i+C|0;b=(b>>21)+r|0;C=u;i=i>>>0>u>>>0?b+1|0:b;b=Ai(x,o,-997805,-1);d=b+g|0;c=W+c|0;c=b>>>0>d>>>0?c+1|0:c;b=f&-2097152;E=d-b|0;B=c-((b>>>0>d>>>0)+j|0)|0;c=Ai(x,o,654183,0);b=l+W|0;d=c+k|0;b=d>>>0>>0?b+1|0:b;c=h&-2097152;u=d-c|0;r=b-((c>>>0>d>>>0)+q|0)|0;b=Ai(A,R,666643,0);d=b+(D>>>5&2097151)|0;c=W;c=b>>>0>d>>>0?c+1|0:c;b=Ai(t,v,470296,0);d=b+d|0;c=W+c|0;g=d;d=b>>>0>d>>>0?c+1|0:c;f=Ai(t,v,666643,0);b=z[a+2|0];c=b<<16&2031616|(z[a|0]|z[a+1|0]<<8);j=f+c|0;b=W;b=c>>>0>j>>>0?b+1|0:b;l=b;b=b-((j>>>0<4293918720)-1|0)|0;v=b;h=j- -1048576|0;f=(b&2097151)<<11|h>>>21;k=f+g|0;b=(b>>21)+d|0;b=f>>>0>k>>>0?b+1|0:b;d=b;b=b-((k>>>0<4293918720)-1|0)|0;q=b;g=k- -1048576|0;f=(b&2097151)<<11|g>>>21;t=f+u|0;b=(b>>21)+r|0;f=f>>>0>t>>>0?b+1|0:b;b=Ai(x,o,470296,0);d=d+W|0;c=b+k|0;d=c>>>0>>0?d+1|0:d;b=g&-2097152;k=c-b|0;g=d-((b>>>0>c>>>0)+q|0)|0;c=Ai(x,o,666643,0);d=h&-2097152;r=c+(j-d|0)|0;b=W+(l-((d>>>0>j>>>0)+v|0)|0)|0;b=c>>>0>r>>>0?b+1|0:b;d=b>>21;b=(b&2097151)<<11|r>>>21;q=b+k|0;c=d+g|0;c=b>>>0>q>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|q>>>21;o=c+t|0;b=b+f|0;b=c>>>0>o>>>0?b+1|0:b;c=b>>21;b=(b&2097151)<<11|o>>>21;f=b+E|0;c=c+B|0;c=b>>>0>f>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|f>>>21;j=c+C|0;d=b+i|0;d=c>>>0>j>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|j>>>21;k=d+N|0;b=c+O|0;b=d>>>0>k>>>0?b+1|0:b;d=b>>21;b=(b&2097151)<<11|k>>>21;g=b+H|0;c=d+p|0;p=g;c=b>>>0>g>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|g>>>21;i=c+T|0;b=b+U|0;b=c>>>0>i>>>0?b+1|0:b;c=b>>21;b=(b&2097151)<<11|i>>>21;l=b+S|0;c=c+n|0;c=b>>>0>l>>>0?c+1|0:c;b=c>>21;c=(c&2097151)<<11|l>>>21;h=c+X|0;d=b+Y|0;d=c>>>0>h>>>0?d+1|0:d;c=d>>21;d=(d&2097151)<<11|h>>>21;g=d+V|0;b=c+s|0;c=y&-2097152;n=e-c|0;b=d>>>0>g>>>0?b+1|0:b;y=n+((b&2097151)<<11|g>>>21)|0;b=(m-((c>>>0>e>>>0)+F|0)|0)+(b>>21)|0;b=n>>>0>y>>>0?b+1|0:b;s=(b&2097151)<<11|y>>>21;c=b>>21;m=c;b=Ai(s,c,666643,0);c=r&2097151;r=b+c|0;b=W;b=c>>>0>r>>>0?b+1|0:b;e=b;w[a|0]=r;w[a+1|0]=(b&255)<<24|r>>>8;b=q&2097151;c=Ai(s,m,470296,0)+b|0;d=W;n=(e&2097151)<<11|r>>>21;q=n+c|0;b=(e>>21)+(b>>>0>c>>>0?d+1|0:d)|0;b=n>>>0>q>>>0?b+1|0:b;w[a+4|0]=(b&2047)<<21|q>>>11;c=b;d=q;w[a+3|0]=(b&7)<<29|d>>>3;w[a+2|0]=((e&65535)<<16|r>>>16)&31|d<<5;e=o&2097151;o=Ai(s,m,654183,0)+e|0;b=W;e=e>>>0>o>>>0?b+1|0:b;q=(c&2097151)<<11|d>>>21;o=q+o|0;c=(c>>21)+e|0;c=o>>>0>>0?c+1|0:c;b=c;w[a+6|0]=(b&63)<<26|o>>>6;e=o;w[a+5|0]=e<<2|(d&1572864)>>>19;d=f&2097151;f=Ai(s,m,-997805,-1)+d|0;c=W;c=d>>>0>f>>>0?c+1|0:c;d=b;b=b>>21;o=(d&2097151)<<11|e>>>21;f=o+f|0;d=b+c|0;d=f>>>0>>0?d+1|0:d;w[a+9|0]=(d&511)<<23|f>>>9;w[a+8|0]=(d&1)<<31|f>>>1;w[a+7|0]=f<<7|(e&2080768)>>>14;c=j&2097151;e=Ai(s,m,136657,0)+c|0;b=W;b=c>>>0>e>>>0?b+1|0:b;c=d;d=c>>21;j=(c&2097151)<<11|f>>>21;e=j+e|0;c=b+d|0;c=e>>>0>>0?c+1|0:c;w[a+12|0]=(c&4095)<<20|e>>>12;d=e;w[a+11|0]=(c&15)<<28|d>>>4;w[a+10|0]=d<<4|(f&1966080)>>>17;e=k&2097151;f=Ai(s,m,-683901,-1)+e|0;b=W;b=e>>>0>f>>>0?b+1|0:b;e=c;c=c>>21;u=f;f=(e&2097151)<<11|d>>>21;e=u+f|0;c=b+c|0;c=e>>>0>>0?c+1|0:c;w[a+14|0]=(c&127)<<25|e>>>7;w[a+13|0]=e<<1|(d&1048576)>>>20;b=c>>21;c=(c&2097151)<<11|e>>>21;f=c+(p&2097151)|0;d=c>>>0>f>>>0?b+1|0:b;w[a+17|0]=(d&1023)<<22|f>>>10;w[a+16|0]=(d&3)<<30|f>>>2;w[a+15|0]=f<<6|(e&2064384)>>>15;b=d>>21;c=(d&2097151)<<11|f>>>21;d=c+(i&2097151)|0;b=c>>>0>d>>>0?b+1|0:b;w[a+20|0]=(b&8191)<<19|d>>>13;w[a+19|0]=(b&31)<<27|d>>>5;c=l&2097151;l=(b&2097151)<<11|d>>>21;e=c+l|0;c=b>>21;c=e>>>0>>0?c+1|0:c;l=e;w[a+21|0]=e;w[a+18|0]=d<<3|(f&1835008)>>>18;w[a+22|0]=(c&255)<<24|e>>>8;f=(c&2097151)<<11|e>>>21;e=f+(h&2097151)|0;d=c>>21;d=e>>>0>>0?d+1|0:d;w[a+25|0]=(d&2047)<<21|e>>>11;w[a+24|0]=(d&7)<<29|e>>>3;w[a+23|0]=((c&65535)<<16|l>>>16)&31|e<<5;b=d>>21;c=(d&2097151)<<11|e>>>21;d=c+(g&2097151)|0;b=c>>>0>d>>>0?b+1|0:b;w[a+27|0]=(b&63)<<26|d>>>6;w[a+26|0]=d<<2|(e&1572864)>>>19;c=b;b=b>>21;g=(c&2097151)<<11|d>>>21;f=y&2097151;e=g+f|0;c=e>>>0>>0?b+1|0:b;w[a+31|0]=(c&131071)<<15|e>>>17;b=e;w[a+30|0]=(c&511)<<23|b>>>9;w[a+28|0]=b<<7|(d&2080768)>>>14;w[a+29|0]=g+y>>>1;}function oc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0;C=T-2048|0;T=C;t(C+1024|0,b,1024);b=0;while(1){f=C+1024|0;d=b<<3;e=f+d|0;j=y[e>>2];g=a+d|0;k=y[g>>2];g=y[e+4>>2]^y[g+4>>2];y[e>>2]=j^k;y[e+4>>2]=g;j=d|8;e=j+f|0;g=y[e>>2];j=a+j|0;k=y[j>>2];j=y[e+4>>2]^y[j+4>>2];y[e>>2]=g^k;y[e+4>>2]=j;j=d|16;e=j+f|0;g=y[e>>2];j=a+j|0;k=y[j>>2];j=y[e+4>>2]^y[j+4>>2];y[e>>2]=g^k;y[e+4>>2]=j;e=d|24;d=e+f|0;j=y[d>>2];e=a+e|0;g=y[e>>2];e=y[d+4>>2]^y[e+4>>2];y[d>>2]=g^j;y[d+4>>2]=e;b=b+4|0;if((b|0)!=128){continue}break}t(C,f,1024);a=0;b=0;while(1){f=b<<3;d=f+C|0;e=y[d>>2];j=c+f|0;g=y[j>>2];j=y[d+4>>2]^y[j+4>>2];y[d>>2]=g^e;y[d+4>>2]=j;e=f|8;d=e+C|0;j=y[d>>2];e=c+e|0;g=y[e>>2];e=y[d+4>>2]^y[e+4>>2];y[d>>2]=g^j;y[d+4>>2]=e;e=f|16;d=e+C|0;j=y[d>>2];e=c+e|0;g=y[e>>2];e=y[d+4>>2]^y[e+4>>2];y[d>>2]=g^j;y[d+4>>2]=e;d=f|24;f=d+C|0;e=y[f>>2];d=c+d|0;j=y[d>>2];d=y[f+4>>2]^y[d+4>>2];y[f>>2]=e^j;y[f+4>>2]=d;b=b+4|0;if((b|0)!=128){continue}break}while(1){f=(C+1024|0)+(a<<7)|0;g=y[f+56>>2];d=y[f+24>>2];k=g+d|0;i=y[f+60>>2];e=y[f+28>>2];b=i+e|0;j=d>>>0>k>>>0?b+1|0:b;e=Ai(d<<1&-2,(e<<1|d>>>31)&1,g,0);d=e+k|0;b=W+j|0;j=d>>>0>>0?b+1|0:b;k=Ci(y[f+120>>2]^d,j^y[f+124>>2],32);e=y[f+88>>2];m=k+e|0;o=W;h=y[f+92>>2];b=o+h|0;l=e>>>0>m>>>0?b+1|0:b;h=Ai(e<<1&-2,(h<<1|e>>>31)&1,k,0);e=h+m|0;b=W+l|0;n=e>>>0>>0?b+1|0:b;L=Ci(g^e,i^n,40);S=W;b=j+S|0;h=d+L|0;g=h>>>0>>0?b+1|0:b;d=Ai(L,0,d<<1&-2,(j<<1|d>>>31)&1);I=d+h|0;b=W+g|0;M=d>>>0>I>>>0?b+1|0:b;D=Ci(k^I,o^M,48);b=W;U=b;p=D;m=b;k=y[f+40>>2];d=y[f+8>>2];h=k+d|0;E=y[f+44>>2];j=y[f+12>>2];b=E+j|0;g=d>>>0>h>>>0?b+1|0:b;j=Ai(d<<1&-2,(j<<1|d>>>31)&1,k,0);d=j+h|0;b=W+g|0;g=d>>>0>>0?b+1|0:b;h=Ci(y[f+104>>2]^d,g^y[f+108>>2],32);j=y[f+72>>2];o=h+j|0;s=W;l=y[f+76>>2];b=s+l|0;i=j>>>0>o>>>0?b+1|0:b;l=Ai(j<<1&-2,(l<<1|j>>>31)&1,h,0);j=l+o|0;b=W+i|0;i=j^k;k=j>>>0>>0?b+1|0:b;l=Ci(i,E^k,40);r=W;b=g+r|0;o=d+l|0;i=o>>>0>>0?b+1|0:b;g=Ai(l,0,d<<1&-2,(g<<1|d>>>31)&1);d=g+o|0;b=W+i|0;o=d>>>0>>0?b+1|0:b;N=Ci(d^h,s^o,48);O=W;b=k+O|0;h=j+N|0;g=h>>>0>>0?b+1|0:b;k=Ai(N,0,j<<1&-2,(k<<1|j>>>31)&1);j=k+h|0;b=W+g|0;E=j>>>0>>0?b+1|0:b;x=Ci(j^l,r^E,1);b=W;P=b;u=x;i=b;l=y[f+32>>2];g=y[f>>2];s=l+g|0;F=y[f+36>>2];k=y[f+4>>2];b=F+k|0;h=g>>>0>s>>>0?b+1|0:b;k=Ai(g<<1&-2,(k<<1|g>>>31)&1,l,0);g=k+s|0;b=W+h|0;h=g>>>0>>0?b+1|0:b;G=Ci(y[f+96>>2]^g,h^y[f+100>>2],32);v=f- -64|0;b=v;k=y[b>>2];q=G+k|0;R=W;s=y[b+4>>2];b=R+s|0;r=k>>>0>q>>>0?b+1|0:b;s=Ai(k<<1&-2,(s<<1|k>>>31)&1,G,0);k=s+q|0;b=W+r|0;s=k>>>0>>0?b+1|0:b;F=Ci(k^l,F^s,40);V=W;b=h+V|0;r=g+F|0;l=r>>>0>>0?b+1|0:b;h=Ai(F,0,g<<1&-2,(h<<1|g>>>31)&1);g=h+r|0;b=W+l|0;r=g>>>0>>0?b+1|0:b;b=r+i|0;h=g+u|0;l=h>>>0>>0?b+1|0:b;i=Ai(u,0,g<<1&-2,(r<<1|g>>>31)&1);h=i+h|0;b=W+l|0;q=h>>>0>>0?b+1|0:b;H=Ci(h^p,q^m,32);b=W;Q=b;z=b;p=y[f+48>>2];l=y[f+16>>2];u=p+l|0;J=y[f+52>>2];m=y[f+20>>2];b=J+m|0;i=l>>>0>u>>>0?b+1|0:b;m=Ai(l<<1&-2,(m<<1|l>>>31)&1,p,0);l=m+u|0;b=W+i|0;i=l>>>0>>0?b+1|0:b;u=Ci(y[f+112>>2]^l,i^y[f+116>>2],32);m=y[f+80>>2];w=u+m|0;K=W;A=y[f+84>>2];b=K+A|0;B=m>>>0>w>>>0?b+1|0:b;A=Ai(m<<1&-2,(A<<1|m>>>31)&1,u,0);m=A+w|0;b=W+B|0;w=m^p;p=m>>>0>>0?b+1|0:b;A=Ci(w,J^p,40);J=W;b=i+J|0;w=l+A|0;B=w>>>0>>0?b+1|0:b;i=Ai(A,0,l<<1&-2,(i<<1|l>>>31)&1);l=i+w|0;b=W+B|0;w=l^u;u=i>>>0>l>>>0?b+1|0:b;B=Ci(w,K^u,48);K=W;b=p+K|0;w=m+B|0;i=w>>>0>>0?b+1|0:b;p=Ai(B,0,m<<1&-2,(p<<1|m>>>31)&1);m=p+w|0;b=W+i|0;p=m>>>0

>>0?b+1|0:b;b=p+z|0;i=m+H|0;z=i>>>0>>0?b+1|0:b;w=Ai(H,0,m<<1&-2,(p<<1|m>>>31)&1);i=w+i|0;b=W+z|0;z=i^x;x=i>>>0>>0?b+1|0:b;z=Ci(z,P^x,40);P=W;b=q+P|0;X=h+z|0;w=X>>>0>>0?b+1|0:b;q=Ai(z,0,h<<1&-2,(q<<1|h>>>31)&1);h=q+X|0;b=W+w|0;y[f>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+4>>2]=b;h=Ci(h^H,b^Q,48);y[f+120>>2]=h;b=W;y[f+124>>2]=b;b=b+x|0;H=h+i|0;q=H>>>0>>0?b+1|0:b;i=Ai(h,0,i<<1&-2,(x<<1|i>>>31)&1);h=i+H|0;b=W+q|0;y[f+80>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+84>>2]=b;Y=f,Z=Ci(h^z,b^P,1),y[Y+40>>2]=Z;y[f+44>>2]=W;b=n+U|0;i=e+D|0;h=i>>>0>>0?b+1|0:b;e=Ai(D,0,e<<1&-2,(n<<1|e>>>31)&1);i=e+i|0;b=W+h|0;b=e>>>0>i>>>0?b+1|0:b;h=b;e=b;m=Ci(m^A,p^J,1);p=W;b=o+p|0;q=d+m|0;n=q>>>0>>0?b+1|0:b;o=Ai(m,0,d<<1&-2,(o<<1|d>>>31)&1);d=o+q|0;b=W+n|0;b=d>>>0>>0?b+1|0:b;o=Ci(g^G,r^R,48);g=b;x=W;n=Ci(o^d,b^x,32);q=n+i|0;D=W;b=D+e|0;r=n>>>0>q>>>0?b+1|0:b;b=q;q=Ai(i<<1&-2,(e<<1|i>>>31)&1,n,0);e=b+q|0;b=W+r|0;r=e^m;m=e>>>0>>0?b+1|0:b;r=Ci(r,p^m,40);p=W;b=g+p|0;G=d+r|0;q=G>>>0>>0?b+1|0:b;d=Ai(r,0,d<<1&-2,(g<<1|d>>>31)&1);g=d+G|0;b=W+q|0;b=d>>>0>g>>>0?b+1|0:b;d=Ci(g^n,D^b,48);y[f+96>>2]=d;n=W;y[f+100>>2]=n;y[f+8>>2]=g;y[f+12>>2]=b;b=m+n|0;n=d+e|0;g=n>>>0>>0?b+1|0:b;e=Ai(d,0,e<<1&-2,(m<<1|e>>>31)&1);d=e+n|0;b=W+g|0;y[f+88>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+92>>2]=b;Y=f,Z=Ci(d^r,b^p,1),y[Y+48>>2]=Z;y[f+52>>2]=W;m=Ci(i^L,h^S,1);n=W;b=u+n|0;d=l+m|0;e=d>>>0>>0?b+1|0:b;g=Ai(m,0,l<<1&-2,(u<<1|l>>>31)&1);d=g+d|0;b=W+e|0;h=d>>>0>>0?b+1|0:b;i=Ci(d^N,O^h,32);b=W;r=b;g=b;b=s+x|0;e=k+o|0;l=e>>>0>>0?b+1|0:b;k=Ai(o,0,k<<1&-2,(s<<1|k>>>31)&1);e=k+e|0;b=W+l|0;k=e>>>0>>0?b+1|0:b;b=k+g|0;g=e+i|0;l=g>>>0>>0?b+1|0:b;o=Ai(i,0,e<<1&-2,(k<<1|e>>>31)&1);g=o+g|0;b=W+l|0;l=g>>>0>>0?b+1|0:b;m=Ci(g^m,n^l,40);o=W;b=h+o|0;s=d+m|0;n=s>>>0>>0?b+1|0:b;d=Ai(m,0,d<<1&-2,(h<<1|d>>>31)&1);h=d+s|0;b=W+n|0;b=d>>>0>h>>>0?b+1|0:b;d=Ci(h^i,r^b,48);y[f+104>>2]=d;i=W;y[f+108>>2]=i;y[f+16>>2]=h;y[f+20>>2]=b;h=v;b=i+l|0;n=d+g|0;i=n>>>0>>0?b+1|0:b;g=Ai(d,0,g<<1&-2,(l<<1|g>>>31)&1);d=g+n|0;b=W+i|0;y[h>>2]=d;b=d>>>0>>0?b+1|0:b;y[h+4>>2]=b;Y=f,Z=Ci(d^m,b^o,1),y[Y+56>>2]=Z;y[f+60>>2]=W;g=Ci(e^F,k^V,1);d=g+I|0;l=W;b=l+M|0;e=d>>>0>>0?b+1|0:b;k=Ai(I<<1&-2,(M<<1|I>>>31)&1,g,0);d=k+d|0;b=W+e|0;e=d>>>0>>0?b+1|0:b;k=Ci(d^B,K^e,32);m=W;b=E+m|0;i=j+k|0;h=i>>>0>>0?b+1|0:b;b=i;i=Ai(k,0,j<<1&-2,(E<<1|j>>>31)&1);j=b+i|0;b=W+h|0;h=g^j;g=i>>>0>j>>>0?b+1|0:b;h=Ci(h,l^g,40);i=W;b=e+i|0;n=d+h|0;l=n>>>0>>0?b+1|0:b;d=Ai(h,0,d<<1&-2,(e<<1|d>>>31)&1);e=d+n|0;b=W+l|0;b=d>>>0>e>>>0?b+1|0:b;d=Ci(e^k,m^b,48);y[f+112>>2]=d;k=W;y[f+116>>2]=k;y[f+24>>2]=e;y[f+28>>2]=b;b=g+k|0;k=d+j|0;e=k>>>0>>0?b+1|0:b;j=Ai(d,0,j<<1&-2,(g<<1|j>>>31)&1);d=j+k|0;b=W+e|0;y[f+72>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+76>>2]=b;Y=f,Z=Ci(d^h,b^i,1),y[Y+32>>2]=Z;y[f+36>>2]=W;a=a+1|0;if((a|0)!=8){continue}break}a=0;while(1){f=(C+1024|0)+(a<<4)|0;g=y[f+392>>2];d=y[f+136>>2];k=g+d|0;i=y[f+396>>2];e=y[f+140>>2];b=i+e|0;j=d>>>0>k>>>0?b+1|0:b;e=Ai(d<<1&-2,(e<<1|d>>>31)&1,g,0);d=e+k|0;b=W+j|0;j=d>>>0>>0?b+1|0:b;k=Ci(y[f+904>>2]^d,j^y[f+908>>2],32);e=y[f+648>>2];m=k+e|0;o=W;h=y[f+652>>2];b=o+h|0;l=e>>>0>m>>>0?b+1|0:b;h=Ai(e<<1&-2,(h<<1|e>>>31)&1,k,0);e=h+m|0;b=W+l|0;n=e>>>0>>0?b+1|0:b;L=Ci(g^e,i^n,40);w=W;b=j+w|0;h=d+L|0;g=h>>>0>>0?b+1|0:b;d=Ai(L,0,d<<1&-2,(j<<1|d>>>31)&1);I=d+h|0;b=W+g|0;M=d>>>0>I>>>0?b+1|0:b;D=Ci(k^I,o^M,48);b=W;S=b;p=D;m=b;k=y[f+264>>2];d=y[f+8>>2];h=k+d|0;E=y[f+268>>2];j=y[f+12>>2];b=E+j|0;g=d>>>0>h>>>0?b+1|0:b;j=Ai(d<<1&-2,(j<<1|d>>>31)&1,k,0);d=j+h|0;b=W+g|0;g=d>>>0>>0?b+1|0:b;h=Ci(y[f+776>>2]^d,g^y[f+780>>2],32);j=y[f+520>>2];o=h+j|0;s=W;l=y[f+524>>2];b=s+l|0;i=j>>>0>o>>>0?b+1|0:b;l=Ai(j<<1&-2,(l<<1|j>>>31)&1,h,0);j=l+o|0;b=W+i|0;i=j^k;k=j>>>0>>0?b+1|0:b;l=Ci(i,E^k,40);r=W;b=g+r|0;o=d+l|0;i=o>>>0>>0?b+1|0:b;g=Ai(l,0,d<<1&-2,(g<<1|d>>>31)&1);d=g+o|0;b=W+i|0;o=d>>>0>>0?b+1|0:b;N=Ci(d^h,s^o,48);U=W;b=k+U|0;h=j+N|0;g=h>>>0>>0?b+1|0:b;k=Ai(N,0,j<<1&-2,(k<<1|j>>>31)&1);j=k+h|0;b=W+g|0;E=j>>>0>>0?b+1|0:b;x=Ci(j^l,r^E,1);b=W;O=b;u=x;i=b;l=y[f+256>>2];g=y[f>>2];s=l+g|0;F=y[f+260>>2];k=y[f+4>>2];b=F+k|0;h=g>>>0>s>>>0?b+1|0:b;k=Ai(g<<1&-2,(k<<1|g>>>31)&1,l,0);g=k+s|0;b=W+h|0;h=g>>>0>>0?b+1|0:b;G=Ci(y[f+768>>2]^g,h^y[f+772>>2],32);k=y[f+512>>2];q=G+k|0;P=W;s=y[f+516>>2];b=P+s|0;r=k>>>0>q>>>0?b+1|0:b;s=Ai(k<<1&-2,(s<<1|k>>>31)&1,G,0);k=s+q|0;b=W+r|0;s=k>>>0>>0?b+1|0:b;F=Ci(k^l,F^s,40);R=W;b=h+R|0;r=g+F|0;l=r>>>0>>0?b+1|0:b;h=Ai(F,0,g<<1&-2,(h<<1|g>>>31)&1);g=h+r|0;b=W+l|0;r=g>>>0>>0?b+1|0:b;b=r+i|0;h=g+u|0;l=h>>>0>>0?b+1|0:b;i=Ai(u,0,g<<1&-2,(r<<1|g>>>31)&1);h=i+h|0;b=W+l|0;q=h>>>0>>0?b+1|0:b;H=Ci(h^p,q^m,32);b=W;V=b;z=b;p=y[f+384>>2];l=y[f+128>>2];u=p+l|0;Q=y[f+388>>2];m=y[f+132>>2];b=Q+m|0;i=l>>>0>u>>>0?b+1|0:b;m=Ai(l<<1&-2,(m<<1|l>>>31)&1,p,0);l=m+u|0;b=W+i|0;i=l>>>0>>0?b+1|0:b;u=Ci(y[f+896>>2]^l,i^y[f+900>>2],32);m=y[f+640>>2];v=u+m|0;J=W;A=y[f+644>>2];b=J+A|0;B=m>>>0>v>>>0?b+1|0:b;A=Ai(m<<1&-2,(A<<1|m>>>31)&1,u,0);m=A+v|0;b=W+B|0;v=m^p;p=m>>>0>>0?b+1|0:b;A=Ci(v,Q^p,40);Q=W;b=i+Q|0;v=l+A|0;B=v>>>0>>0?b+1|0:b;i=Ai(A,0,l<<1&-2,(i<<1|l>>>31)&1);l=i+v|0;b=W+B|0;v=l^u;u=i>>>0>l>>>0?b+1|0:b;B=Ci(v,J^u,48);J=W;b=p+J|0;v=m+B|0;i=v>>>0>>0?b+1|0:b;p=Ai(B,0,m<<1&-2,(p<<1|m>>>31)&1);m=p+v|0;b=W+i|0;p=m>>>0

>>0?b+1|0:b;b=p+z|0;i=m+H|0;z=i>>>0>>0?b+1|0:b;v=Ai(H,0,m<<1&-2,(p<<1|m>>>31)&1);i=v+i|0;b=W+z|0;z=i^x;x=i>>>0>>0?b+1|0:b;z=Ci(z,O^x,40);O=W;b=q+O|0;K=h+z|0;v=K>>>0>>0?b+1|0:b;q=Ai(z,0,h<<1&-2,(q<<1|h>>>31)&1);h=q+K|0;b=W+v|0;y[f>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+4>>2]=b;h=Ci(h^H,b^V,48);y[f+904>>2]=h;b=W;y[f+908>>2]=b;b=b+x|0;H=h+i|0;q=H>>>0>>0?b+1|0:b;i=Ai(h,0,i<<1&-2,(x<<1|i>>>31)&1);h=i+H|0;b=W+q|0;y[f+640>>2]=h;b=h>>>0>>0?b+1|0:b;y[f+644>>2]=b;Y=f,Z=Ci(h^z,b^O,1),y[Y+264>>2]=Z;y[f+268>>2]=W;b=n+S|0;i=e+D|0;h=i>>>0>>0?b+1|0:b;e=Ai(D,0,e<<1&-2,(n<<1|e>>>31)&1);i=e+i|0;b=W+h|0;b=e>>>0>i>>>0?b+1|0:b;h=b;e=b;m=Ci(m^A,p^Q,1);p=W;b=o+p|0;q=d+m|0;n=q>>>0>>0?b+1|0:b;o=Ai(m,0,d<<1&-2,(o<<1|d>>>31)&1);d=o+q|0;b=W+n|0;b=d>>>0>>0?b+1|0:b;o=Ci(g^G,r^P,48);g=b;x=W;n=Ci(o^d,b^x,32);q=n+i|0;D=W;b=D+e|0;r=n>>>0>q>>>0?b+1|0:b;b=q;q=Ai(i<<1&-2,(e<<1|i>>>31)&1,n,0);e=b+q|0;b=W+r|0;r=e^m;m=e>>>0>>0?b+1|0:b;r=Ci(r,p^m,40);p=W;b=g+p|0;G=d+r|0;q=G>>>0>>0?b+1|0:b;d=Ai(r,0,d<<1&-2,(g<<1|d>>>31)&1);g=d+G|0;b=W+q|0;b=d>>>0>g>>>0?b+1|0:b;d=Ci(g^n,D^b,48);y[f+768>>2]=d;n=W;y[f+772>>2]=n;y[f+8>>2]=g;y[f+12>>2]=b;b=m+n|0;n=d+e|0;g=n>>>0>>0?b+1|0:b;e=Ai(d,0,e<<1&-2,(m<<1|e>>>31)&1);d=e+n|0;b=W+g|0;y[f+648>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+652>>2]=b;Y=f,Z=Ci(d^r,b^p,1),y[Y+384>>2]=Z;y[f+388>>2]=W;m=Ci(i^L,h^w,1);n=W;b=u+n|0;d=l+m|0;e=d>>>0>>0?b+1|0:b;g=Ai(m,0,l<<1&-2,(u<<1|l>>>31)&1);d=g+d|0;b=W+e|0;h=d>>>0>>0?b+1|0:b;i=Ci(d^N,U^h,32);b=W;r=b;g=b;b=s+x|0;e=k+o|0;l=e>>>0>>0?b+1|0:b;k=Ai(o,0,k<<1&-2,(s<<1|k>>>31)&1);e=k+e|0;b=W+l|0;k=e>>>0>>0?b+1|0:b;b=k+g|0;g=e+i|0;l=g>>>0>>0?b+1|0:b;o=Ai(i,0,e<<1&-2,(k<<1|e>>>31)&1);g=o+g|0;b=W+l|0;l=g>>>0>>0?b+1|0:b;m=Ci(g^m,n^l,40);o=W;b=h+o|0;s=d+m|0;n=s>>>0>>0?b+1|0:b;d=Ai(m,0,d<<1&-2,(h<<1|d>>>31)&1);h=d+s|0;b=W+n|0;b=d>>>0>h>>>0?b+1|0:b;d=Ci(h^i,r^b,48);y[f+776>>2]=d;i=W;y[f+780>>2]=i;y[f+128>>2]=h;y[f+132>>2]=b;b=i+l|0;i=d+g|0;h=i>>>0>>0?b+1|0:b;g=Ai(d,0,g<<1&-2,(l<<1|g>>>31)&1);d=g+i|0;b=W+h|0;y[f+512>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+516>>2]=b;Y=f,Z=Ci(d^m,b^o,1),y[Y+392>>2]=Z;y[f+396>>2]=W;g=Ci(e^F,k^R,1);d=g+I|0;l=W;b=l+M|0;e=d>>>0>>0?b+1|0:b;k=Ai(I<<1&-2,(M<<1|I>>>31)&1,g,0);d=k+d|0;b=W+e|0;e=d>>>0>>0?b+1|0:b;k=Ci(d^B,J^e,32);m=W;b=E+m|0;i=j+k|0;h=i>>>0>>0?b+1|0:b;b=i;i=Ai(k,0,j<<1&-2,(E<<1|j>>>31)&1);j=b+i|0;b=W+h|0;h=g^j;g=i>>>0>j>>>0?b+1|0:b;h=Ci(h,l^g,40);i=W;b=e+i|0;n=d+h|0;l=n>>>0>>0?b+1|0:b;d=Ai(h,0,d<<1&-2,(e<<1|d>>>31)&1);e=d+n|0;b=W+l|0;b=d>>>0>e>>>0?b+1|0:b;d=Ci(e^k,m^b,48);y[f+896>>2]=d;k=W;y[f+900>>2]=k;y[f+136>>2]=e;y[f+140>>2]=b;b=g+k|0;k=d+j|0;e=k>>>0>>0?b+1|0:b;j=Ai(d,0,j<<1&-2,(g<<1|j>>>31)&1);d=j+k|0;b=W+e|0;y[f+520>>2]=d;b=d>>>0>>0?b+1|0:b;y[f+524>>2]=b;Y=f,Z=Ci(d^h,b^i,1),y[Y+256>>2]=Z;y[f+260>>2]=W;a=a+1|0;if((a|0)!=8){continue}break}t(c,C,1024);a=0;while(1){b=a<<3;f=b+c|0;d=y[f>>2];i=C+1024|0;e=i;j=e+b|0;g=y[j>>2];j=y[f+4>>2]^y[j+4>>2];y[f>>2]=d^g;y[f+4>>2]=j;d=b|8;f=d+c|0;j=y[f>>2];d=d+e|0;e=y[d>>2];d=y[f+4>>2]^y[d+4>>2];y[f>>2]=e^j;y[f+4>>2]=d;d=b|16;f=d+c|0;e=y[f>>2];d=d+i|0;j=y[d>>2];d=y[f+4>>2]^y[d+4>>2];y[f>>2]=e^j;y[f+4>>2]=d;f=b|24;b=f+c|0;d=y[b>>2];f=f+i|0;e=y[f>>2];f=y[b+4>>2]^y[f+4>>2];y[b>>2]=d^e;y[b+4>>2]=f;a=a+4|0;if((a|0)!=128){continue}break}T=C+2048|0;}function Ie(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=T-800|0;T=d;g=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);i=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);j=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);k=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);l=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);m=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);n=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);p=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);q=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);r=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);s=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);t=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);u=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);v=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);o=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);b=c- -64|0;w=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[b>>2]=w^33620224;y[c+56>>2]=1496785429;y[c+60>>2]=1652156816;y[c+48>>2]=33620224;y[c+52>>2]=218629379;y[c+40>>2]=1110511904;y[c+44>>2]=-584534669;y[c+32>>2]=1427652059;y[c+36>>2]=-248528275;o=o^w;y[c>>2]=o;y[c+92>>2]=v^-584534669;y[c+88>>2]=u^1110511904;y[c+84>>2]=t^-248528275;y[c+80>>2]=s^1427652059;y[c+76>>2]=r^1652156816;y[c+72>>2]=q^1496785429;y[c+68>>2]=p^218629379;n=n^v;y[c+28>>2]=n;m=m^u;y[c+24>>2]=m;l=l^t;y[c+20>>2]=l;k=k^s;y[c+16>>2]=k;j=j^r;y[c+12>>2]=j;i=i^q;y[c+8>>2]=i;x=g^p;y[c+4>>2]=x;g=0;while(1){a=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=a;a=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=a;a=y[b+4>>2];y[d+752>>2]=y[b>>2];y[d+756>>2]=a;a=y[b+12>>2];y[d+760>>2]=y[b+8>>2];y[d+764>>2]=a;a=y[c+84>>2];y[d+736>>2]=y[c+80>>2];y[d+740>>2]=a;a=y[c+92>>2];y[d+744>>2]=y[c+88>>2];y[d+748>>2]=a;a=d+768|0;ia(a,d+752|0,d+736|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+720>>2]=y[c+48>>2];y[d+724>>2]=e;e=y[c+60>>2];y[d+728>>2]=y[c+56>>2];y[d+732>>2]=e;e=y[b+4>>2];y[d+704>>2]=y[b>>2];y[d+708>>2]=e;e=y[b+12>>2];y[d+712>>2]=y[b+8>>2];y[d+716>>2]=e;ia(a,d+720|0,d+704|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+688>>2]=y[c+32>>2];y[d+692>>2]=e;e=y[c+44>>2];y[d+696>>2]=y[c+40>>2];y[d+700>>2]=e;e=y[c+52>>2];y[d+672>>2]=y[c+48>>2];y[d+676>>2]=e;e=y[c+60>>2];y[d+680>>2]=y[c+56>>2];y[d+684>>2]=e;ia(a,d+688|0,d+672|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+656>>2]=y[c+16>>2];y[d+660>>2]=e;e=y[c+28>>2];y[d+664>>2]=y[c+24>>2];y[d+668>>2]=e;e=y[c+36>>2];y[d+640>>2]=y[c+32>>2];y[d+644>>2]=e;e=y[c+44>>2];y[d+648>>2]=y[c+40>>2];y[d+652>>2]=e;ia(a,d+656|0,d+640|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+624>>2]=y[c>>2];y[d+628>>2]=e;e=y[c+12>>2];y[d+632>>2]=y[c+8>>2];y[d+636>>2]=e;e=y[c+20>>2];y[d+608>>2]=y[c+16>>2];y[d+612>>2]=e;e=y[c+28>>2];y[d+616>>2]=y[c+24>>2];y[d+620>>2]=e;ia(a,d+624|0,d+608|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+592>>2]=y[d+784>>2];y[d+596>>2]=e;e=y[d+796>>2];y[d+600>>2]=y[d+792>>2];y[d+604>>2]=e;e=y[c+4>>2];y[d+576>>2]=y[c>>2];y[d+580>>2]=e;e=y[c+12>>2];y[d+584>>2]=y[c+8>>2];y[d+588>>2]=e;ia(a,d+592|0,d+576|0);e=y[d+768>>2];f=y[d+772>>2];h=y[d+776>>2];y[c+12>>2]=y[d+780>>2]^r;y[c+8>>2]=h^q;y[c+4>>2]=f^p;y[c>>2]=e^w;e=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=e;e=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=e;e=y[b+4>>2];y[d+560>>2]=y[b>>2];y[d+564>>2]=e;e=y[b+12>>2];y[d+568>>2]=y[b+8>>2];y[d+572>>2]=e;e=y[c+92>>2];y[d+552>>2]=y[c+88>>2];y[d+556>>2]=e;e=y[c+84>>2];y[d+544>>2]=y[c+80>>2];y[d+548>>2]=e;ia(a,d+560|0,d+544|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+528>>2]=y[c+48>>2];y[d+532>>2]=e;e=y[c+60>>2];y[d+536>>2]=y[c+56>>2];y[d+540>>2]=e;e=y[b+4>>2];y[d+512>>2]=y[b>>2];y[d+516>>2]=e;e=y[b+12>>2];y[d+520>>2]=y[b+8>>2];y[d+524>>2]=e;ia(a,d+528|0,d+512|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+496>>2]=y[c+32>>2];y[d+500>>2]=e;e=y[c+44>>2];y[d+504>>2]=y[c+40>>2];y[d+508>>2]=e;e=y[c+52>>2];y[d+480>>2]=y[c+48>>2];y[d+484>>2]=e;e=y[c+60>>2];y[d+488>>2]=y[c+56>>2];y[d+492>>2]=e;ia(a,d+496|0,d+480|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+464>>2]=y[c+16>>2];y[d+468>>2]=e;e=y[c+28>>2];y[d+472>>2]=y[c+24>>2];y[d+476>>2]=e;e=y[c+36>>2];y[d+448>>2]=y[c+32>>2];y[d+452>>2]=e;e=y[c+44>>2];y[d+456>>2]=y[c+40>>2];y[d+460>>2]=e;ia(a,d+464|0,d+448|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+432>>2]=y[c>>2];y[d+436>>2]=e;e=y[c+12>>2];y[d+440>>2]=y[c+8>>2];y[d+444>>2]=e;e=y[c+20>>2];y[d+416>>2]=y[c+16>>2];y[d+420>>2]=e;e=y[c+28>>2];y[d+424>>2]=y[c+24>>2];y[d+428>>2]=e;ia(a,d+432|0,d+416|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+400>>2]=y[d+784>>2];y[d+404>>2]=e;e=y[d+796>>2];y[d+408>>2]=y[d+792>>2];y[d+412>>2]=e;e=y[c+4>>2];y[d+384>>2]=y[c>>2];y[d+388>>2]=e;e=y[c+12>>2];y[d+392>>2]=y[c+8>>2];y[d+396>>2]=e;ia(a,d+400|0,d+384|0);e=y[d+768>>2];f=y[d+772>>2];h=y[d+776>>2];y[c+12>>2]=y[d+780>>2]^v;y[c+8>>2]=h^u;y[c+4>>2]=f^t;y[c>>2]=e^s;e=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=e;e=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=e;e=y[b+4>>2];y[d+368>>2]=y[b>>2];y[d+372>>2]=e;e=y[b+12>>2];y[d+376>>2]=y[b+8>>2];y[d+380>>2]=e;e=y[c+92>>2];y[d+360>>2]=y[c+88>>2];y[d+364>>2]=e;e=y[c+84>>2];y[d+352>>2]=y[c+80>>2];y[d+356>>2]=e;ia(a,d+368|0,d+352|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+336>>2]=y[c+48>>2];y[d+340>>2]=e;e=y[c+60>>2];y[d+344>>2]=y[c+56>>2];y[d+348>>2]=e;e=y[b+4>>2];y[d+320>>2]=y[b>>2];y[d+324>>2]=e;e=y[b+12>>2];y[d+328>>2]=y[b+8>>2];y[d+332>>2]=e;ia(a,d+336|0,d+320|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+304>>2]=y[c+32>>2];y[d+308>>2]=e;e=y[c+44>>2];y[d+312>>2]=y[c+40>>2];y[d+316>>2]=e;e=y[c+52>>2];y[d+288>>2]=y[c+48>>2];y[d+292>>2]=e;e=y[c+60>>2];y[d+296>>2]=y[c+56>>2];y[d+300>>2]=e;ia(a,d+304|0,d+288|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+272>>2]=y[c+16>>2];y[d+276>>2]=e;e=y[c+28>>2];y[d+280>>2]=y[c+24>>2];y[d+284>>2]=e;e=y[c+36>>2];y[d+256>>2]=y[c+32>>2];y[d+260>>2]=e;e=y[c+44>>2];y[d+264>>2]=y[c+40>>2];y[d+268>>2]=e;ia(a,d+272|0,d+256|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+240>>2]=y[c>>2];y[d+244>>2]=e;e=y[c+12>>2];y[d+248>>2]=y[c+8>>2];y[d+252>>2]=e;e=y[c+20>>2];y[d+224>>2]=y[c+16>>2];y[d+228>>2]=e;e=y[c+28>>2];y[d+232>>2]=y[c+24>>2];y[d+236>>2]=e;ia(a,d+240|0,d+224|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+208>>2]=y[d+784>>2];y[d+212>>2]=e;e=y[d+796>>2];y[d+216>>2]=y[d+792>>2];y[d+220>>2]=e;e=y[c+4>>2];y[d+192>>2]=y[c>>2];y[d+196>>2]=e;e=y[c+12>>2];y[d+200>>2]=y[c+8>>2];y[d+204>>2]=e;ia(a,d+208|0,d+192|0);e=y[d+768>>2];f=y[d+772>>2];h=y[d+776>>2];y[c+12>>2]=j^y[d+780>>2];y[c+8>>2]=h^i;y[c+4>>2]=f^x;y[c>>2]=e^o;e=y[c+92>>2];y[d+792>>2]=y[c+88>>2];y[d+796>>2]=e;e=y[c+84>>2];y[d+784>>2]=y[c+80>>2];y[d+788>>2]=e;e=y[b+4>>2];y[d+176>>2]=y[b>>2];y[d+180>>2]=e;e=y[b+12>>2];y[d+184>>2]=y[b+8>>2];y[d+188>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;ia(a,d+176|0,d+160|0);e=y[d+780>>2];y[c+88>>2]=y[d+776>>2];y[c+92>>2]=e;e=y[d+772>>2];y[c+80>>2]=y[d+768>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[b+4>>2];y[d+128>>2]=y[b>>2];y[d+132>>2]=e;e=y[b+12>>2];y[d+136>>2]=y[b+8>>2];y[d+140>>2]=e;ia(a,d+144|0,d+128|0);e=y[d+780>>2];y[b+8>>2]=y[d+776>>2];y[b+12>>2]=e;e=y[d+772>>2];y[b>>2]=y[d+768>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+780>>2];y[c+56>>2]=y[d+776>>2];y[c+60>>2]=e;e=y[d+772>>2];y[c+48>>2]=y[d+768>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+780>>2];y[c+40>>2]=y[d+776>>2];y[c+44>>2]=e;e=y[d+772>>2];y[c+32>>2]=y[d+768>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+780>>2];y[c+24>>2]=y[d+776>>2];y[c+28>>2]=e;e=y[d+772>>2];y[c+16>>2]=y[d+768>>2];y[c+20>>2]=e;e=y[d+788>>2];y[d+16>>2]=y[d+784>>2];y[d+20>>2]=e;e=y[d+796>>2];y[d+24>>2]=y[d+792>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+768>>2];e=y[d+772>>2];f=y[d+776>>2];y[c+12>>2]=n^y[d+780>>2];y[c+8>>2]=f^m;y[c+4>>2]=e^l;y[c>>2]=a^k;g=g+1|0;if((g|0)!=4){continue}break}T=d+800|0;}function Da(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=T-16|0;T=k;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{if(a>>>0<=244){f=y[10173];g=a>>>0<11?16:a+11&504;a=g>>>3|0;b=f>>>a|0;if(b&3){e=a+((b^-1)&1)|0;b=e<<3;a=b+40732|0;c=y[b+40740>>2];d=y[c+8>>2];k:{if((a|0)==(d|0)){m=40692,n=Bi(-2,e)&f,y[m>>2]=n;break k}y[d+12>>2]=a;y[a+8>>2]=d;}a=c+8|0;y[c+4>>2]=b|3;b=b+c|0;y[b+4>>2]=y[b+4>>2]|1;break a}i=y[10175];if(i>>>0>=g>>>0){break j}if(b){c=2<>2];d=y[c+8>>2];l:{if((b|0)==(d|0)){f=Bi(-2,e)&f;y[10173]=f;break l}y[d+12>>2]=b;y[b+8>>2]=d;}y[c+4>>2]=g|3;h=c+g|0;e=a-g|0;y[h+4>>2]=e|1;y[a+c>>2]=e;if(i){a=(i&-8)+40732|0;d=y[10178];b=1<<(i>>>3);m:{if(!(b&f)){y[10173]=b|f;b=a;break m}b=y[a+8>>2];}y[a+8>>2]=d;y[b+12>>2]=d;y[d+12>>2]=a;y[d+8>>2]=b;}a=c+8|0;y[10178]=h;y[10175]=e;break a}l=y[10174];if(!l){break j}b=y[(zi(l)<<2)+40996>>2];e=(y[b+4>>2]&-8)-g|0;c=b;while(1){n:{a=y[b+16>>2];if(!a){a=y[b+20>>2];if(!a){break n}}d=(y[a+4>>2]&-8)-g|0;b=d>>>0>>0;e=b?d:e;c=b?a:c;b=a;continue}break}j=y[c+24>>2];a=y[c+12>>2];if((c|0)!=(a|0)){b=y[c+8>>2];y[b+12>>2]=a;y[a+8>>2]=b;break b}b=y[c+20>>2];if(b){d=c+20|0;}else {b=y[c+16>>2];if(!b){break i}d=c+16|0;}while(1){h=d;a=b;d=a+20|0;b=y[a+20>>2];if(b){continue}d=a+16|0;b=y[a+16>>2];if(b){continue}break}y[h>>2]=0;break b}g=-1;if(a>>>0>4294967231){break j}b=a+11|0;g=b&-8;h=y[10174];if(!h){break j}i=31;e=0-g|0;if(a>>>0<=16777204){a=H(b>>>8|0);i=((g>>>38-a&1)-(a<<1)|0)+62|0;}b=y[(i<<2)+40996>>2];o:{p:{q:{if(!b){a=0;break q}a=0;c=g<<((i|0)!=31?25-(i>>>1|0)|0:0);while(1){r:{f=(y[b+4>>2]&-8)-g|0;if(f>>>0>=e>>>0){break r}d=b;e=f;if(e){break r}e=0;a=b;break p}f=y[b+20>>2];b=y[((c>>>29&4)+b|0)+16>>2];a=f?(f|0)==(b|0)?a:f:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<>2];}if(!a){break o}}while(1){c=(y[a+4>>2]&-8)-g|0;b=c>>>0>>0;e=b?c:e;d=b?a:d;b=y[a+16>>2];if(b){a=b;}else {a=y[a+20>>2];}if(a){continue}break}}if(!d|y[10175]-g>>>0<=e>>>0){break j}i=y[d+24>>2];a=y[d+12>>2];if((d|0)!=(a|0)){b=y[d+8>>2];y[b+12>>2]=a;y[a+8>>2]=b;break c}b=y[d+20>>2];if(b){c=d+20|0;}else {b=y[d+16>>2];if(!b){break h}c=d+16|0;}while(1){f=c;a=b;c=a+20|0;b=y[a+20>>2];if(b){continue}c=a+16|0;b=y[a+16>>2];if(b){continue}break}y[f>>2]=0;break c}d=y[10175];if(d>>>0>=g>>>0){a=y[10178];b=d-g|0;s:{if(b>>>0>=16){c=a+g|0;y[c+4>>2]=b|1;y[a+d>>2]=b;y[a+4>>2]=g|3;break s}y[a+4>>2]=d|3;b=a+d|0;y[b+4>>2]=y[b+4>>2]|1;b=0;c=0;}y[10175]=b;y[10178]=c;a=a+8|0;break a}c=y[10176];if(c>>>0>g>>>0){b=c-g|0;y[10176]=b;a=y[10179];c=a+g|0;y[10179]=c;y[c+4>>2]=b|1;y[a+4>>2]=g|3;a=a+8|0;break a}a=0;e=g+47|0;if(y[10291]){b=y[10293];}else {y[10294]=-1;y[10295]=-1;y[10292]=4096;y[10293]=4096;y[10291]=k+12&-16^1431655768;y[10296]=0;y[10284]=0;b=4096;}f=e+b|0;h=0-b|0;b=f&h;if(b>>>0<=g>>>0){break a}i=y[10283];if(i){j=y[10281];d=j+b|0;if(d>>>0<=j>>>0|d>>>0>i>>>0){break a}}t:{if(!(z[41136]&4)){u:{v:{w:{x:{d=y[10179];if(d){a=41140;while(1){i=y[a>>2];if(i>>>0<=d>>>0&d>>>0>2]>>>0){break x}a=y[a+8>>2];if(a){continue}break}}c=lb(0);if((c|0)==-1){break u}f=b;a=y[10292];d=a-1|0;if(d&c){f=(b-c|0)+(c+d&0-a)|0;}if(f>>>0<=g>>>0){break u}d=y[10283];if(d){h=y[10281];a=h+f|0;if(a>>>0<=h>>>0|a>>>0>d>>>0){break u}}a=lb(f);if((c|0)!=(a|0)){break w}break t}f=h&f-c;c=lb(f);if((c|0)==(y[a>>2]+y[a+4>>2]|0)){break v}a=c;}if((a|0)==-1){break u}if(g+48>>>0<=f>>>0){c=a;break t}c=y[10293];c=c+(e-f|0)&0-c;if((lb(c)|0)==-1){break u}f=c+f|0;c=a;break t}if((c|0)!=-1){break t}}y[10284]=y[10284]|4;}c=lb(b);a=lb(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break e}f=a-c|0;if(f>>>0<=g+40>>>0){break e}}a=y[10281]+f|0;y[10281]=a;if(a>>>0>B[10282]){y[10282]=a;}y:{e=y[10179];if(e){a=41140;while(1){b=y[a>>2];d=y[a+4>>2];if((b+d|0)==(c|0)){break y}a=y[a+8>>2];if(a){continue}break}break g}a=y[10177];if(!(a>>>0<=c>>>0?a:0)){y[10177]=c;}a=0;y[10286]=f;y[10285]=c;y[10181]=-1;y[10182]=y[10291];y[10288]=0;while(1){b=a<<3;d=b+40732|0;y[b+40740>>2]=d;y[b+40744>>2]=d;a=a+1|0;if((a|0)!=32){continue}break}a=f-40|0;b=-8-c&7;d=a-b|0;y[10176]=d;b=b+c|0;y[10179]=b;y[b+4>>2]=d|1;y[(a+c|0)+4>>2]=40;y[10180]=y[10295];break f}if(y[a+12>>2]&8|(c>>>0<=e>>>0|b>>>0>e>>>0)){break g}y[a+4>>2]=d+f;a=-8-e&7;b=a+e|0;y[10179]=b;c=y[10176]+f|0;a=c-a|0;y[10176]=a;y[b+4>>2]=a|1;y[(c+e|0)+4>>2]=40;y[10180]=y[10295];break f}a=0;break b}a=0;break c}if(B[10177]>c>>>0){y[10177]=c;}d=c+f|0;a=41140;z:{while(1){b=y[a>>2];if((b|0)!=(d|0)){a=y[a+8>>2];if(a){continue}break z}break}if(!(z[a+12|0]&8)){break d}}a=41140;while(1){A:{b=y[a>>2];if(b>>>0<=e>>>0){d=b+y[a+4>>2]|0;if(d>>>0>e>>>0){break A}}a=y[a+8>>2];continue}break}a=f-40|0;b=-8-c&7;h=a-b|0;y[10176]=h;b=b+c|0;y[10179]=b;y[b+4>>2]=h|1;y[(a+c|0)+4>>2]=40;y[10180]=y[10295];a=(d+(39-d&7)|0)-47|0;b=a>>>0>>0?e:a;y[b+4>>2]=27;a=y[10288];y[b+16>>2]=y[10287];y[b+20>>2]=a;a=y[10286];y[b+8>>2]=y[10285];y[b+12>>2]=a;y[10287]=b+8;y[10286]=f;y[10285]=c;y[10288]=0;a=b+24|0;while(1){y[a+4>>2]=7;c=a+8|0;a=a+4|0;if(c>>>0>>0){continue}break}if((b|0)==(e|0)){break f}y[b+4>>2]=y[b+4>>2]&-2;c=b-e|0;y[e+4>>2]=c|1;y[b>>2]=c;B:{if(c>>>0<=255){a=(c&248)+40732|0;b=y[10173];c=1<<(c>>>3);C:{if(!(b&c)){y[10173]=b|c;b=a;break C}b=y[a+8>>2];}y[a+8>>2]=e;y[b+12>>2]=e;d=8;c=12;break B}a=31;if(c>>>0<=16777215){a=H(c>>>8|0);a=(c>>>38-a&1|a<<1)^62;}y[e+28>>2]=a;y[e+16>>2]=0;y[e+20>>2]=0;b=(a<<2)+40996|0;D:{d=y[10174];f=1<>2]=e;break E}a=c<<((a|0)!=31?25-(a>>>1|0)|0:0);d=y[b>>2];while(1){b=d;if((c|0)==(y[b+4>>2]&-8)){break D}d=a>>>29|0;a=a<<1;f=(d&4)+b|0;d=y[f+16>>2];if(d){continue}break}y[f+16>>2]=e;}y[e+24>>2]=b;b=e;a=b;d=12;c=8;break B}a=y[b+8>>2];y[a+12>>2]=e;y[b+8>>2]=e;y[e+8>>2]=a;a=0;d=12;c=24;}y[e+d>>2]=b;y[c+e>>2]=a;}a=y[10176];if(a>>>0<=g>>>0){break e}b=a-g|0;y[10176]=b;a=y[10179];c=a+g|0;y[10179]=c;y[c+4>>2]=b|1;y[a+4>>2]=g|3;a=a+8|0;break a}y[10172]=48;a=0;break a}y[a>>2]=c;y[a+4>>2]=y[a+4>>2]+f;i=(-8-c&7)+c|0;y[i+4>>2]=g|3;f=b+(-8-b&7)|0;e=g+i|0;h=f-e|0;F:{if(y[10179]==(f|0)){y[10179]=e;a=y[10176]+h|0;y[10176]=a;y[e+4>>2]=a|1;break F}if(y[10178]==(f|0)){y[10178]=e;a=y[10175]+h|0;y[10175]=a;y[e+4>>2]=a|1;y[a+e>>2]=a;break F}a=y[f+4>>2];if((a&3)==1){j=a&-8;c=y[f+12>>2];G:{if(a>>>0<=255){b=y[f+8>>2];if((b|0)==(c|0)){m=40692,n=y[10173]&Bi(-2,a>>>3|0),y[m>>2]=n;break G}y[b+12>>2]=c;y[c+8>>2]=b;break G}g=y[f+24>>2];H:{if((c|0)!=(f|0)){a=y[f+8>>2];y[a+12>>2]=c;y[c+8>>2]=a;break H}I:{a=y[f+20>>2];if(a){b=f+20|0;}else {a=y[f+16>>2];if(!a){break I}b=f+16|0;}while(1){d=b;c=a;b=a+20|0;a=y[a+20>>2];if(a){continue}b=c+16|0;a=y[c+16>>2];if(a){continue}break}y[d>>2]=0;break H}c=0;}if(!g){break G}a=y[f+28>>2];b=a<<2;J:{if(y[b+40996>>2]==(f|0)){y[b+40996>>2]=c;if(c){break J}m=40696,n=y[10174]&Bi(-2,a),y[m>>2]=n;break G}K:{if(y[g+16>>2]==(f|0)){y[g+16>>2]=c;break K}y[g+20>>2]=c;}if(!c){break G}}y[c+24>>2]=g;a=y[f+16>>2];if(a){y[c+16>>2]=a;y[a+24>>2]=c;}a=y[f+20>>2];if(!a){break G}y[c+20>>2]=a;y[a+24>>2]=c;}h=h+j|0;f=f+j|0;a=y[f+4>>2];}y[f+4>>2]=a&-2;y[e+4>>2]=h|1;y[e+h>>2]=h;if(h>>>0<=255){a=(h&248)+40732|0;b=y[10173];c=1<<(h>>>3);L:{if(!(b&c)){y[10173]=b|c;b=a;break L}b=y[a+8>>2];}y[a+8>>2]=e;y[b+12>>2]=e;y[e+12>>2]=a;y[e+8>>2]=b;break F}c=31;if(h>>>0<=16777215){a=H(h>>>8|0);c=(h>>>38-a&1|a<<1)^62;}y[e+28>>2]=c;y[e+16>>2]=0;y[e+20>>2]=0;a=(c<<2)+40996|0;M:{b=y[10174];d=1<>2]=e;break N}c=h<<((c|0)!=31?25-(c>>>1|0)|0:0);b=y[a>>2];while(1){a=b;if((y[a+4>>2]&-8)==(h|0)){break M}b=c>>>29|0;c=c<<1;d=(b&4)+a|0;b=y[d+16>>2];if(b){continue}break}y[d+16>>2]=e;}y[e+24>>2]=a;y[e+12>>2]=e;y[e+8>>2]=e;break F}b=y[a+8>>2];y[b+12>>2]=e;y[a+8>>2]=e;y[e+24>>2]=0;y[e+12>>2]=a;y[e+8>>2]=b;}a=i+8|0;break a}O:{if(!i){break O}b=y[d+28>>2];c=b<<2;P:{if(y[c+40996>>2]==(d|0)){y[c+40996>>2]=a;if(a){break P}h=Bi(-2,b)&h;y[10174]=h;break O}Q:{if(y[i+16>>2]==(d|0)){y[i+16>>2]=a;break Q}y[i+20>>2]=a;}if(!a){break O}}y[a+24>>2]=i;b=y[d+16>>2];if(b){y[a+16>>2]=b;y[b+24>>2]=a;}b=y[d+20>>2];if(!b){break O}y[a+20>>2]=b;y[b+24>>2]=a;}R:{if(e>>>0<=15){a=e+g|0;y[d+4>>2]=a|3;a=a+d|0;y[a+4>>2]=y[a+4>>2]|1;break R}y[d+4>>2]=g|3;f=d+g|0;y[f+4>>2]=e|1;y[e+f>>2]=e;if(e>>>0<=255){a=(e&248)+40732|0;b=y[10173];c=1<<(e>>>3);S:{if(!(b&c)){y[10173]=b|c;b=a;break S}b=y[a+8>>2];}y[a+8>>2]=f;y[b+12>>2]=f;y[f+12>>2]=a;y[f+8>>2]=b;break R}a=31;if(e>>>0<=16777215){a=H(e>>>8|0);a=(e>>>38-a&1|a<<1)^62;}y[f+28>>2]=a;y[f+16>>2]=0;y[f+20>>2]=0;b=(a<<2)+40996|0;T:{c=1<>2]=f;y[f+24>>2]=b;break U}a=e<<((a|0)!=31?25-(a>>>1|0)|0:0);b=y[b>>2];while(1){c=b;if((y[b+4>>2]&-8)==(e|0)){break T}h=a>>>29|0;a=a<<1;h=b+(h&4)|0;b=y[h+16>>2];if(b){continue}break}y[h+16>>2]=f;y[f+24>>2]=c;}y[f+12>>2]=f;y[f+8>>2]=f;break R}a=y[c+8>>2];y[a+12>>2]=f;y[c+8>>2]=f;y[f+24>>2]=0;y[f+12>>2]=c;y[f+8>>2]=a;}a=d+8|0;break a}V:{if(!j){break V}b=y[c+28>>2];d=b<<2;W:{if(y[d+40996>>2]==(c|0)){y[d+40996>>2]=a;if(a){break W}m=40696,n=Bi(-2,b)&l,y[m>>2]=n;break V}X:{if(y[j+16>>2]==(c|0)){y[j+16>>2]=a;break X}y[j+20>>2]=a;}if(!a){break V}}y[a+24>>2]=j;b=y[c+16>>2];if(b){y[a+16>>2]=b;y[b+24>>2]=a;}b=y[c+20>>2];if(!b){break V}y[a+20>>2]=b;y[b+24>>2]=a;}Y:{if(e>>>0<=15){a=e+g|0;y[c+4>>2]=a|3;a=a+c|0;y[a+4>>2]=y[a+4>>2]|1;break Y}y[c+4>>2]=g|3;h=c+g|0;y[h+4>>2]=e|1;y[e+h>>2]=e;if(i){a=(i&-8)+40732|0;d=y[10178];b=1<<(i>>>3);Z:{if(!(b&f)){y[10173]=b|f;b=a;break Z}b=y[a+8>>2];}y[a+8>>2]=d;y[b+12>>2]=d;y[d+12>>2]=a;y[d+8>>2]=b;}y[10178]=h;y[10175]=e;}a=c+8|0;}T=k+16|0;return a|0}function Hc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;m=T-48|0;T=m;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);d=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);d=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=e;w[a+21|0]=e>>>8;w[a+22|0]=e>>>16;w[a+23|0]=e>>>24;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);d=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;d=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;b=z[a+31|0];w[a+31|0]=b&127;cb(m,a);S=b&128;b=T-960|0;T=b;d=b+304|0;Oc(d,m);y[b+304>>2]=y[b+304>>2]+1;bb(d,d);d=y[b+340>>2];e=Ai(d,d>>31,486662,0);d=W;l=e+16777216|0;j=l>>>0<16777216?d+1|0:d;k=e-(l&-33554432)|0;d=y[b+336>>2];c=Ai(d,d>>31,486662,0);e=W;d=y[b+332>>2];f=Ai(d,d>>31,486662,0);d=W;i=c;h=f+16777216|0;d=h>>>0<16777216?d+1|0:d;c=d>>25;d=(d&33554431)<<7|h>>>25;g=i+d|0;c=c+e|0;d=d>>>0>g>>>0?c+1|0:c;e=g+33554432|0;d=e>>>0<33554432?d+1|0:d;n=((d&67108863)<<6|e>>>26)+k|0;o=0-n|0;y[b+292>>2]=o;p=g-(e&-67108864)|0;q=0-p|0;y[b+288>>2]=q;k=f-(h&-33554432)|0;d=y[b+328>>2];e=Ai(d,d>>31,486662,0);d=W;c=y[b+324>>2];h=Ai(c,c>>31,486662,0);c=W;i=e;g=h+16777216|0;c=g>>>0<16777216?c+1|0:c;e=c>>25;f=(c&33554431)<<7|g>>>25;c=i+f|0;d=d+e|0;d=c>>>0>>0?d+1|0:d;e=c+33554432|0;d=e>>>0<33554432?d+1|0:d;r=((d&67108863)<<6|e>>>26)+k|0;t=0-r|0;y[b+284>>2]=t;u=c-(e&-67108864)|0;v=0-u|0;y[b+280>>2]=v;k=h-(g&-33554432)|0;d=y[b+320>>2];c=Ai(d,d>>31,486662,0);d=W;e=y[b+316>>2];h=Ai(e,e>>31,486662,0);e=W;i=c;g=h+16777216|0;e=g>>>0<16777216?e+1|0:e;c=e>>25;f=(e&33554431)<<7|g>>>25;e=i+f|0;d=c+d|0;d=e>>>0>>0?d+1|0:d;c=d;f=e+33554432|0;c=f>>>0<33554432?c+1|0:c;x=((c&67108863)<<6|f>>>26)+k|0;A=0-x|0;y[b+276>>2]=A;B=e-(f&-67108864)|0;C=0-B|0;y[b+272>>2]=C;i=h-(g&-33554432)|0;d=y[b+312>>2];d=Ai(d,d>>31,486662,0);k=W;e=y[b+308>>2];f=Ai(e,e>>31,486662,0);c=W;h=f+16777216|0;c=h>>>0<16777216?c+1|0:c;e=(c&33554431)<<7|h>>>25;g=e+d|0;c=(c>>25)+k|0;e=e>>>0>g>>>0?c+1|0:c;d=g+33554432|0;e=d>>>0<33554432?e+1|0:e;D=((e&67108863)<<6|d>>>26)+i|0;E=0-D|0;y[b+268>>2]=E;F=g-(d&-67108864)|0;G=0-F|0;y[b+264>>2]=G;g=f-(h&-33554432)|0;e=Ai((j&33554431)<<7|l>>>25,j>>25,19,0);d=W;f=e;c=y[b+304>>2];e=Ai(c,c>>31,486662,0);c=f+e|0;d=W+d|0;e=c>>>0>>0?d+1|0:d;d=c+33554432|0;e=d>>>0<33554432?e+1|0:e;H=((e&67108863)<<6|d>>>26)+g|0;I=0-H|0;y[b+260>>2]=I;J=c-(d&-67108864)|0;K=0-J|0;y[b+256>>2]=K;e=b+208|0;d=b+256|0;fa(e,d);ga(b+160|0,d,e);U=y[b+196>>2];V=y[b+160>>2];M=y[b+208>>2];X=y[b+164>>2];Y=y[b+168>>2];N=y[b+212>>2];O=y[b+216>>2];Z=y[b+172>>2];_=y[b+176>>2];P=y[b+220>>2];Q=y[b+224>>2];$=y[b+180>>2];aa=y[b+184>>2];i=y[b+228>>2];k=y[b+232>>2];ba=y[b+188>>2];ca=y[b+192>>2];d=y[b+244>>2];e=Ai(d,d>>31,486662,0);d=W;l=e+16777216|0;j=l>>>0<16777216?d+1|0:d;da=e-(l&-33554432)|0;d=y[b+240>>2];d=Ai(d,d>>31,486662,0);L=W;e=y[b+236>>2];f=Ai(e,e>>31,486662,0);c=W;e=d;h=f+16777216|0;c=h>>>0<16777216?c+1|0:c;d=(c&33554431)<<7|h>>>25;g=e+d|0;c=(c>>25)+L|0;d=d>>>0>g>>>0?c+1|0:c;e=g+33554432|0;d=e>>>0<33554432?d+1|0:d;c=((d&67108863)<<6|e>>>26)+da|0;y[b+244>>2]=c;y[b+388>>2]=c+(U-n|0);d=g-(e&-67108864)|0;y[b+240>>2]=d;y[b+384>>2]=d+(ca-p|0);L=f-(h&-33554432)|0;d=Ai(k,k>>31,486662,0);f=W;h=Ai(i,i>>31,486662,0);e=W;i=d;g=h+16777216|0;e=g>>>0<16777216?e+1|0:e;d=e>>25;c=(e&33554431)<<7|g>>>25;e=i+c|0;d=d+f|0;d=c>>>0>e>>>0?d+1|0:d;c=d;f=e+33554432|0;c=f>>>0<33554432?c+1|0:c;d=f;f=((c&67108863)<<6|d>>>26)+L|0;y[b+236>>2]=f;y[b+380>>2]=f+(ba-r|0);d=e-(d&-67108864)|0;y[b+232>>2]=d;y[b+376>>2]=d+(aa-u|0);k=h-(g&-33554432)|0;c=Ai(Q,Q>>31,486662,0);e=W;f=Ai(P,P>>31,486662,0);d=W;i=c;h=f+16777216|0;d=h>>>0<16777216?d+1|0:d;c=d>>25;d=(d&33554431)<<7|h>>>25;g=i+d|0;c=c+e|0;e=d>>>0>g>>>0?c+1|0:c;d=g+33554432|0;e=d>>>0<33554432?e+1|0:e;c=((e&67108863)<<6|d>>>26)+k|0;y[b+228>>2]=c;y[b+372>>2]=c+($-x|0);d=g-(d&-67108864)|0;y[b+224>>2]=d;y[b+368>>2]=d+(_-B|0);k=f-(h&-33554432)|0;d=Ai(O,O>>31,486662,0);e=W;h=Ai(N,N>>31,486662,0);c=W;i=d;g=h+16777216|0;c=g>>>0<16777216?c+1|0:c;d=c>>25;f=(c&33554431)<<7|g>>>25;c=i+f|0;e=d+e|0;e=c>>>0>>0?e+1|0:e;d=e;f=c+33554432|0;d=f>>>0<33554432?d+1|0:d;e=f;f=((d&67108863)<<6|e>>>26)+k|0;y[b+220>>2]=f;y[b+364>>2]=f+(Z-D|0);d=c-(e&-67108864)|0;y[b+216>>2]=d;y[b+360>>2]=d+(Y-F|0);g=h-(g&-33554432)|0;e=Ai((j&33554431)<<7|l>>>25,j>>25,19,0);d=W;c=e;e=Ai(M,M>>31,486662,0);c=c+e|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;e=c+33554432|0;d=e>>>0<33554432?d+1|0:d;j=((d&67108863)<<6|e>>>26)+g|0;y[b+212>>2]=j;y[b+356>>2]=j+(X-H|0);d=c-(e&-67108864)|0;y[b+208>>2]=d;y[b+352>>2]=d+(V-J|0);d=b+624|0;e=b+352|0;ga(d,e,e);ga(b,e,d);e=b+784|0;fa(e,b);fa(e,e);d=b+912|0;ga(d,b,e);e=b+576|0;fa(e,d);fa(e,e);fa(e,e);fa(e,e);c=b+528|0;ga(c,d,e);fa(c,c);fa(c,c);ga(c,c,b);d=y[b+564>>2];y[b+512>>2]=y[b+560>>2];y[b+516>>2]=d;d=y[b+556>>2];y[b+504>>2]=y[b+552>>2];y[b+508>>2]=d;d=y[b+548>>2];y[b+496>>2]=y[b+544>>2];y[b+500>>2]=d;d=y[b+540>>2];y[b+488>>2]=y[b+536>>2];y[b+492>>2]=d;d=y[b+532>>2];y[b+480>>2]=y[b+528>>2];y[b+484>>2]=d;fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);d=b+480|0;ga(c,c,d);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,d);d=y[b+564>>2];y[b+464>>2]=y[b+560>>2];y[b+468>>2]=d;d=y[b+556>>2];y[b+456>>2]=y[b+552>>2];y[b+460>>2]=d;d=y[b+548>>2];y[b+448>>2]=y[b+544>>2];y[b+452>>2]=d;d=y[b+540>>2];y[b+440>>2]=y[b+536>>2];y[b+444>>2]=d;d=y[b+532>>2];y[b+432>>2]=y[b+528>>2];y[b+436>>2]=d;fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);e=b+432|0;ga(c,c,e);d=y[b+564>>2];y[b+464>>2]=y[b+560>>2];y[b+468>>2]=d;d=y[b+556>>2];y[b+456>>2]=y[b+552>>2];y[b+460>>2]=d;d=y[b+548>>2];y[b+448>>2]=y[b+544>>2];y[b+452>>2]=d;d=y[b+540>>2];y[b+440>>2]=y[b+536>>2];y[b+444>>2]=d;d=y[b+532>>2];y[b+432>>2]=y[b+528>>2];y[b+436>>2]=d;fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,e);d=y[b+564>>2];y[b+464>>2]=y[b+560>>2];y[b+468>>2]=d;d=y[b+556>>2];y[b+456>>2]=y[b+552>>2];y[b+460>>2]=d;d=y[b+548>>2];y[b+448>>2]=y[b+544>>2];y[b+452>>2]=d;d=y[b+540>>2];y[b+440>>2]=y[b+536>>2];y[b+444>>2]=d;d=y[b+532>>2];y[b+432>>2]=y[b+528>>2];y[b+436>>2]=d;while(1){d=b+528|0;fa(d,d);R=R+1|0;if((R|0)!=120){continue}break}ga(d,d,b+432|0);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);ga(d,d,b+480|0);fa(d,d);fa(d,d);fa(d,d);ga(d,d,b);fa(d,d);pa(b+400|0,d);d=0-(w[b+401|0]&1)|0;i=o^d&(n^o);y[b+660>>2]=i;k=q^d&(p^q);y[b+656>>2]=k;l=t^d&(r^t);y[b+652>>2]=l;f=d&(u^v)^v;y[b+648>>2]=f;h=d&(x^A)^A;y[b+644>>2]=h;g=d&(B^C)^C;y[b+640>>2]=g;j=d&(D^E)^E;y[b+636>>2]=j;c=d&(F^G)^G;y[b+632>>2]=c;e=d&(H^I)^I;y[b+628>>2]=e;d=(d&(J^K)^K)-(d&486662)|0;y[b+624>>2]=d+1;y[b+820>>2]=i;y[b+816>>2]=k;y[b+812>>2]=l;y[b+808>>2]=f;y[b+804>>2]=h;y[b+800>>2]=g;y[b+796>>2]=j;y[b+792>>2]=c;y[b+788>>2]=e;y[b+784>>2]=d-1;bb(b,b+624|0);d=b+912|0;ga(d,b+784|0,b);pa(a,d);w[a+31|0]=z[a+31|0]|S;if(ab(b,a)){Ic();s();}d=y[b+36>>2];y[b+816>>2]=y[b+32>>2];y[b+820>>2]=d;d=y[b+28>>2];y[b+808>>2]=y[b+24>>2];y[b+812>>2]=d;d=y[b+20>>2];y[b+800>>2]=y[b+16>>2];y[b+804>>2]=d;d=y[b+12>>2];y[b+792>>2]=y[b+8>>2];y[b+796>>2]=d;d=y[b+4>>2];y[b+784>>2]=y[b>>2];y[b+788>>2]=d;d=y[b+44>>2];y[b+824>>2]=y[b+40>>2];y[b+828>>2]=d;d=y[b+52>>2];y[b+832>>2]=y[b+48>>2];y[b+836>>2]=d;d=y[b+60>>2];y[b+840>>2]=y[b+56>>2];y[b+844>>2]=d;d=y[b+68>>2];y[b+848>>2]=y[b+64>>2];y[b+852>>2]=d;d=y[b+76>>2];y[b+856>>2]=y[b+72>>2];y[b+860>>2]=d;d=y[b+116>>2];y[b+896>>2]=y[b+112>>2];y[b+900>>2]=d;d=y[b+108>>2];y[b+888>>2]=y[b+104>>2];y[b+892>>2]=d;d=y[b+100>>2];y[b+880>>2]=y[b+96>>2];y[b+884>>2]=d;d=y[b+92>>2];y[b+872>>2]=y[b+88>>2];y[b+876>>2]=d;d=y[b+84>>2];y[b+864>>2]=y[b+80>>2];y[b+868>>2]=d;f=b+624|0;h=b+784|0;xa(f,h);g=b+744|0;ga(h,f,g);e=b+824|0;c=b+664|0;j=b+704|0;ga(e,c,j);d=b+864|0;ga(d,j,g);xa(f,h);ga(h,f,g);ga(e,c,j);ga(d,j,g);xa(f,h);ga(b,f,g);e=b+40|0;ga(e,c,j);d=b+80|0;ga(d,j,g);ga(b+120|0,f,c);bb(f,d);ga(h,b,f);d=b+912|0;ga(d,e,f);pa(a,d);pa(b+576|0,h);w[a+31|0]=z[a+31|0]^z[b+576|0]<<7;T=b+960|0;T=m+48|0;}function pc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0;I=T-592|0;T=I;j=-1;h=a+32|0;a:{if(!Jc(h)){break a}if(yb(a)){break a}if(!dc(e)){break a}if(yb(e)){break a}k=I+128|0;if(Qc(k,e)){break a}j=I+384|0;Za(j);if(f){va(j,39696,34,0);}va(j,a,32,0);va(j,e,32,0);va(j,b,c,d);d=I+320|0;Ca(j,d);Pa(d);j=I+8|0;c=h;e=0;b=0;g=T-2272|0;T=g;while(1){f=g+2016|0;h=z[d+(e>>>3|0)|0];w[f+e|0]=h>>>(e&6)&1;i=f;f=e|1;w[i+f|0]=h>>>(f&7)&1;e=e+2|0;if((e|0)!=256){continue}break}f=254;while(1){d=b;b=d+1|0;e=g+2016|0;n=e+d|0;b:{if(!z[n|0]|d>>>0>254){break b}l=b+e|0;e=w[l|0];c:{if(!e){break c}i=e<<1;h=w[n|0];e=i+h|0;if((e|0)<=15){w[n|0]=e;w[l|0]=0;break c}e=h-i|0;if((e|0)<-15){break b}w[n|0]=e;e=b;while(1){h=(g+2016|0)+e|0;if(!z[h|0]){w[h|0]=1;break c}w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break}}if(!f){break b}e=d+2|0;r=e+(g+2016|0)|0;h=w[r|0];d:{if(!h){break d}l=h<<2;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break d}break}w[h|0]=1;break d}w[n|0]=h;w[r|0]=0;}m=(f>>>0>=5?5:f)+1|0;if((m|0)==2){break b}e=d+3|0;r=e+(g+2016|0)|0;h=w[r|0];e:{if(!h){break e}l=h<<3;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break e}break}w[h|0]=1;break e}w[n|0]=h;w[r|0]=0;}if((m|0)==3){break b}e=d+4|0;r=e+(g+2016|0)|0;h=w[r|0];f:{if(!h){break f}l=h<<4;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break f}break}w[h|0]=1;break f}w[n|0]=h;w[r|0]=0;}if((m|0)==4){break b}e=d+5|0;r=e+(g+2016|0)|0;h=w[r|0];g:{if(!h){break g}l=h<<5;i=w[n|0];h=l+i|0;if((h|0)>=16){h=i-l|0;if((h|0)<-15){break b}w[n|0]=h;while(1){h=(g+2016|0)+e|0;if(z[h|0]){w[h|0]=0;e=e+1|0;if((e|0)!=256){continue}break g}break}w[h|0]=1;break g}w[n|0]=h;w[r|0]=0;}if((m|0)==5){break b}e=d+6|0;l=e+(g+2016|0)|0;d=w[l|0];if(!d){break b}i=d<<6;h=w[n|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break b}w[n|0]=d;while(1){d=(g+2016|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break b}break}w[d|0]=1;break b}w[n|0]=d;w[l|0]=0;}f=f-1|0;if((b|0)!=256){continue}break}e=0;while(1){b=g+1760|0;d=z[c+(e>>>3|0)|0];w[b+e|0]=d>>>(e&6)&1;f=b;b=e|1;w[f+b|0]=d>>>(b&7)&1;e=e+2|0;if((e|0)!=256){continue}break}b=0;f=254;while(1){c=b;b=b+1|0;d=g+1760|0;m=d+c|0;h:{if(!z[m|0]|c>>>0>254){break h}i=b+d|0;d=w[i|0];i:{if(!d){break i}h=d<<1;e=w[m|0];d=h+e|0;if((d|0)<=15){w[m|0]=d;w[i|0]=0;break i}d=e-h|0;if((d|0)<-15){break h}w[m|0]=d;e=b;while(1){d=(g+1760|0)+e|0;if(!z[d|0]){w[d|0]=1;break i}w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break}}if(!f){break h}e=c+2|0;l=e+(g+1760|0)|0;d=w[l|0];j:{if(!d){break j}i=d<<2;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break j}break}w[d|0]=1;break j}w[m|0]=d;w[l|0]=0;}r=(f>>>0>=5?5:f)+1|0;if((r|0)==2){break h}e=c+3|0;l=e+(g+1760|0)|0;d=w[l|0];k:{if(!d){break k}i=d<<3;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break k}break}w[d|0]=1;break k}w[m|0]=d;w[l|0]=0;}if((r|0)==3){break h}e=c+4|0;l=e+(g+1760|0)|0;d=w[l|0];l:{if(!d){break l}i=d<<4;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break l}break}w[d|0]=1;break l}w[m|0]=d;w[l|0]=0;}if((r|0)==4){break h}e=c+5|0;l=e+(g+1760|0)|0;d=w[l|0];m:{if(!d){break m}i=d<<5;h=w[m|0];d=i+h|0;if((d|0)>=16){d=h-i|0;if((d|0)<-15){break h}w[m|0]=d;while(1){d=(g+1760|0)+e|0;if(z[d|0]){w[d|0]=0;e=e+1|0;if((e|0)!=256){continue}break m}break}w[d|0]=1;break m}w[m|0]=d;w[l|0]=0;}if((r|0)==5){break h}e=c+6|0;i=e+(g+1760|0)|0;c=w[i|0];if(!c){break h}h=c<<6;d=w[m|0];c=h+d|0;if((c|0)>=16){c=d-h|0;if((c|0)<-15){break h}w[m|0]=c;while(1){c=(g+1760|0)+e|0;if(z[c|0]){w[c|0]=0;e=e+1|0;if((e|0)!=256){continue}break h}break}w[c|0]=1;break h}w[m|0]=c;w[i|0]=0;}f=f-1|0;if((b|0)!=256){continue}break}d=g+480|0;qa(d,k);b=y[k+36>>2];y[g+192>>2]=y[k+32>>2];y[g+196>>2]=b;b=y[k+28>>2];y[g+184>>2]=y[k+24>>2];y[g+188>>2]=b;b=y[k+20>>2];y[g+176>>2]=y[k+16>>2];y[g+180>>2]=b;b=y[k+12>>2];y[g+168>>2]=y[k+8>>2];y[g+172>>2]=b;b=y[k+4>>2];y[g+160>>2]=y[k>>2];y[g+164>>2]=b;b=y[k+44>>2];y[g+200>>2]=y[k+40>>2];y[g+204>>2]=b;b=y[k+52>>2];y[g+208>>2]=y[k+48>>2];y[g+212>>2]=b;b=y[k+60>>2];y[g+216>>2]=y[k+56>>2];y[g+220>>2]=b;c=k- -64|0;b=y[c+4>>2];y[g+224>>2]=y[c>>2];y[g+228>>2]=b;b=y[k+76>>2];y[g+232>>2]=y[k+72>>2];y[g+236>>2]=b;b=y[k+84>>2];y[g+240>>2]=y[k+80>>2];y[g+244>>2]=b;b=y[k+92>>2];y[g+248>>2]=y[k+88>>2];y[g+252>>2]=b;b=y[k+100>>2];y[g+256>>2]=y[k+96>>2];y[g+260>>2]=b;b=y[k+108>>2];y[g+264>>2]=y[k+104>>2];y[g+268>>2]=b;b=y[k+116>>2];y[g+272>>2]=y[k+112>>2];y[g+276>>2]=b;e=g+320|0;c=g+160|0;xa(e,c);o=g+440|0;ga(g,e,o);p=g+360|0;q=g+400|0;ga(g+40|0,p,q);ga(g+80|0,q,o);ga(g+120|0,e,p);sa(e,g,d);ga(c,e,o);t=g+200|0;ga(t,p,q);u=g+240|0;ga(u,q,o);s=g+280|0;ga(s,e,p);b=g+640|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+800|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+960|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+1120|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+1280|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);b=g+1440|0;qa(b,c);sa(e,g,b);ga(c,e,o);ga(t,p,q);ga(u,q,o);ga(s,e,p);qa(g+1600|0,c);y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;y[j+8>>2]=0;y[j+12>>2]=0;y[j>>2]=0;y[j+4>>2]=0;y[j+44>>2]=0;y[j+48>>2]=0;L=j+40|0;y[L>>2]=1;y[j+52>>2]=0;y[j+56>>2]=0;y[j+60>>2]=0;y[j+64>>2]=0;y[j+68>>2]=0;y[j+72>>2]=0;y[j+84>>2]=0;y[j+88>>2]=0;y[j+76>>2]=0;y[j+80>>2]=1;y[j+92>>2]=0;y[j+96>>2]=0;y[j+100>>2]=0;y[j+104>>2]=0;y[j+108>>2]=0;y[j+112>>2]=0;y[j+116>>2]=0;S=j+80|0;f=255;while(1){n:{o:{b=g+2016|0;p:{if(z[b+f|0]){break p}c=g+1760|0;if(z[c+f|0]){break p}d=b;b=f-1|0;if(!(z[d+b|0]|z[b+c|0])){break o}f=b;}if((f|0)<0){break n}while(1){d=g+320|0;xa(d,j);b=f;e=w[b+(g+2016|0)|0];q:{if((e|0)>0){c=g+160|0;ga(c,d,o);ga(t,p,q);ga(u,q,o);ga(s,d,p);sa(d,c,(g+480|0)+E((e&254)>>>1|0,160)|0);break q}if((e|0)>=0){break q}c=g+160|0;d=g+320|0;ga(c,d,o);ga(t,p,q);ga(u,q,o);ga(s,d,p);Hb(d,c,(g+480|0)+E((0-e&254)>>>1|0,160)|0);}J=w[b+(g+1760|0)|0];r:{if((J|0)>0){c=g+160|0;d=g+320|0;ga(c,d,o);ga(t,p,q);ga(u,q,o);ga(s,d,p);fc(d,c,E((J&254)>>>1|0,120)+1728|0);break r}if((J|0)>=0){break r}K=g+320|0;ga(g+160|0,K,o);ga(t,p,q);ga(u,q,o);ga(s,K,p);v=y[g+160>>2];x=y[g+200>>2];A=y[g+164>>2];B=y[g+204>>2];C=y[g+168>>2];D=y[g+208>>2];F=y[g+172>>2];G=y[g+212>>2];H=y[g+176>>2];k=y[g+216>>2];n=y[g+180>>2];m=y[g+220>>2];r=y[g+184>>2];l=y[g+224>>2];i=y[g+188>>2];h=y[g+228>>2];f=y[g+192>>2];e=y[g+232>>2];d=y[g+236>>2];c=y[g+196>>2];y[g+396>>2]=d-c;y[g+392>>2]=e-f;y[g+388>>2]=h-i;y[g+384>>2]=l-r;y[g+380>>2]=m-n;y[g+376>>2]=k-H;y[g+372>>2]=G-F;y[g+368>>2]=D-C;y[g+364>>2]=B-A;y[g+360>>2]=x-v;y[g+356>>2]=c+d;y[g+352>>2]=e+f;y[g+348>>2]=h+i;y[g+344>>2]=l+r;y[g+340>>2]=m+n;y[g+336>>2]=k+H;y[g+332>>2]=F+G;y[g+328>>2]=C+D;y[g+324>>2]=A+B;y[g+320>>2]=v+x;c=E((0-J&254)>>>1|0,120)+1728|0;ga(q,K,c+40|0);ga(p,p,c);ga(o,c+80|0,s);U=y[g+276>>2];V=y[g+272>>2];J=y[g+268>>2];K=y[g+264>>2];r=y[g+260>>2];l=y[g+256>>2];i=y[g+252>>2];h=y[g+248>>2];f=y[g+244>>2];e=y[g+240>>2];M=y[g+360>>2];N=y[g+400>>2];O=y[g+364>>2];P=y[g+404>>2];Q=y[g+368>>2];R=y[g+408>>2];v=y[g+372>>2];x=y[g+412>>2];A=y[g+376>>2];B=y[g+416>>2];C=y[g+380>>2];D=y[g+420>>2];F=y[g+384>>2];G=y[g+424>>2];H=y[g+388>>2];k=y[g+428>>2];n=y[g+392>>2];m=y[g+432>>2];d=y[g+396>>2];c=y[g+436>>2];y[g+396>>2]=d+c;y[g+392>>2]=m+n;y[g+388>>2]=k+H;y[g+384>>2]=F+G;y[g+380>>2]=C+D;y[g+376>>2]=A+B;y[g+372>>2]=v+x;y[g+368>>2]=Q+R;y[g+364>>2]=O+P;y[g+360>>2]=M+N;y[g+356>>2]=c-d;y[g+352>>2]=m-n;y[g+348>>2]=k-H;y[g+344>>2]=G-F;y[g+340>>2]=D-C;y[g+336>>2]=B-A;y[g+332>>2]=x-v;y[g+328>>2]=R-Q;y[g+324>>2]=P-O;y[g+320>>2]=N-M;v=e<<1;x=y[g+440>>2];y[g+400>>2]=v-x;A=f<<1;B=y[g+444>>2];y[g+404>>2]=A-B;C=h<<1;D=y[g+448>>2];y[g+408>>2]=C-D;F=i<<1;G=y[g+452>>2];y[g+412>>2]=F-G;H=l<<1;k=y[g+456>>2];y[g+416>>2]=H-k;n=r<<1;m=y[g+460>>2];y[g+420>>2]=n-m;r=K<<1;l=y[g+464>>2];y[g+424>>2]=r-l;i=J<<1;h=y[g+468>>2];y[g+428>>2]=i-h;f=V<<1;e=y[g+472>>2];y[g+432>>2]=f-e;d=U<<1;c=y[g+476>>2];y[g+436>>2]=d-c;y[g+440>>2]=v+x;y[g+444>>2]=A+B;y[g+448>>2]=C+D;y[g+452>>2]=F+G;y[g+456>>2]=k+H;y[g+460>>2]=m+n;y[g+464>>2]=l+r;y[g+468>>2]=h+i;y[g+472>>2]=e+f;y[g+476>>2]=c+d;}ga(j,g+320|0,o);ga(L,p,q);ga(S,q,o);f=b-1|0;if((b|0)>0){continue}break}break n}f=f-2|0;if(b){continue}}break}T=g+2272|0;b=I+288|0;Wa(b,j);j=(W=-1,X=kb(b,a),Y=(a|0)==(b|0),Y?W:X)|$a(a,b,32);}T=I+592|0;return j}function ph(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0;g=T-256|0;T=g;za=-1;a:{if(yb(b)){break a}c=g+96|0;if(Qc(c,b)){break a}if(!ec(c)){break a}za=0;K=y[g+172>>2];y[g+36>>2]=0-K;s=y[g+168>>2];y[g+32>>2]=0-s;L=y[g+164>>2];y[g+28>>2]=0-L;t=y[g+160>>2];y[g+24>>2]=0-t;M=y[g+156>>2];y[g+20>>2]=0-M;u=y[g+152>>2];y[g+16>>2]=0-u;N=y[g+148>>2];y[g+12>>2]=0-N;v=y[g+144>>2];y[g+8>>2]=0-v;O=y[g+140>>2];y[g+4>>2]=0-O;e=y[g+136>>2];y[g>>2]=1-e;bb(g,g);w=y[g+4>>2];H=w>>31;x=M<<1;ba=x>>31;b=Ai(w,H,x,ba);c=W;q=y[g>>2];z=q>>31;A=t>>31;d=Ai(q,z,t,A);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;B=y[g+8>>2];P=B>>31;C=u>>31;f=Ai(B,P,u,C);d=f+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;I=y[g+12>>2];S=I>>31;X=N<<1;ca=X>>31;d=Ai(I,S,X,ca);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;Q=y[g+16>>2];Y=Q>>31;D=v>>31;d=Ai(Q,Y,v,D);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;f=y[g+20>>2];ta=f;da=f>>31;Z=O<<1;ea=Z>>31;o=Ai(f,da,Z,ea);c=o+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;l=y[g+24>>2];ua=l;qa=l>>31;o=e+1|0;F=o>>31;e=Ai(l,qa,o,F);b=e+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;fa=y[g+28>>2];r=E(fa,19);U=r>>31;_=K<<1;ga=_>>31;e=Ai(r,U,_,ga);d=e+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;Aa=y[g+32>>2];i=E(Aa,19);R=i>>31;G=s>>31;d=Ai(i,R,s,G);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;Ba=y[g+36>>2];n=E(Ba,19);J=n>>31;$=L<<1;ha=$>>31;d=Ai(n,J,$,ha);c=d+c|0;b=W+b|0;j=c;e=c>>>0>>0?b+1|0:b;b=Ai(u,C,w,H);c=W;ia=M>>31;h=Ai(q,z,M,ia);b=h+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;ja=N>>31;h=Ai(B,P,N,ja);b=h+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;h=Ai(v,D,I,S);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;ka=O>>31;d=Ai(Q,Y,O,ka);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(o,F,f,da);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;l=E(l,19);aa=l>>31;la=K>>31;h=Ai(l,aa,K,la);c=h+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;h=Ai(s,G,r,U);b=h+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;ma=L>>31;h=Ai(i,R,L,ma);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;d=Ai(n,J,t,A);c=c+d|0;b=W+b|0;va=c;V=c>>>0>>0?b+1|0:b;b=Ai(w,H,X,ca);d=W;h=Ai(q,z,u,C);c=h+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;h=Ai(v,D,B,P);c=h+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;h=Ai(I,S,Z,ea);b=h+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;h=Ai(o,F,Q,Y);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;h=E(f,19);na=h>>31;d=Ai(h,na,_,ga);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(s,G,l,aa);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;f=Ai(r,U,$,ha);c=f+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;f=Ai(i,R,t,A);b=f+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;f=Ai(n,J,x,ba);d=f+b|0;b=W+c|0;Ca=d;b=d>>>0>>0?b+1|0:b;Da=b;d=d+33554432|0;b=d>>>0<33554432?b+1|0:b;Ea=d;Fa=b;d=(b&67108863)<<6|d>>>26;f=d+va|0;b=(b>>26)+V|0;va=f;b=d>>>0>f>>>0?b+1|0:b;f=f+16777216|0;d=f>>>0<16777216?b+1|0:b;Ga=f;c=d>>25;f=(d&33554431)<<7|f>>>25;d=f+j|0;b=c+e|0;b=d>>>0>>0?b+1|0:b;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;p=c;f=b;y[g+72>>2]=d-(c&-67108864);b=Ai(w,H,Z,ea);c=W;e=Ai(q,z,v,D);b=e+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=Ai(o,F,B,P);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;e=E(I,19);oa=e>>31;d=Ai(e,oa,_,ga);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;V=E(Q,19);ra=V>>31;j=Ai(V,ra,s,G);d=j+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;j=Ai($,ha,h,na);d=j+d|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;j=Ai(t,A,l,aa);c=j+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;j=Ai(r,U,x,ba);c=j+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(i,R,u,C);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;j=Ai(n,J,X,ca);d=j+c|0;c=W+b|0;m=d;wa=d>>>0>>0?c+1|0:c;b=Ai(o,F,w,H);c=W;j=Ai(q,z,O,ka);d=j+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=E(B,19);j=c;sa=c>>31;k=Ai(c,sa,K,la);c=k+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;k=Ai(s,G,e,oa);c=k+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(V,ra,L,ma);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;k=Ai(t,A,h,na);d=k+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;k=Ai(l,aa,M,ia);d=k+d|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;k=Ai(u,C,r,U);c=k+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;k=Ai(i,R,N,ja);c=k+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(n,J,v,D);c=d+c|0;b=W+b|0;xa=c;k=c>>>0>>0?b+1|0:b;b=E(w,19);b=Ai(b,b>>31,_,ga);c=W;d=Ai(q,z,o,F);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;j=Ai(s,G,j,sa);d=j+b|0;b=W+c|0;e=Ai(e,oa,$,ha);c=e+d|0;d=W+(d>>>0>>0?b+1|0:b)|0;d=c>>>0>>0?d+1|0:d;e=Ai(t,A,V,ra);c=e+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(x,ba,h,na);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;e=Ai(u,C,l,aa);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;e=Ai(r,U,X,ca);d=e+d|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;e=Ai(i,R,v,D);c=e+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;e=Ai(n,J,Z,ea);c=e+c|0;b=W+d|0;j=c;b=c>>>0>>0?b+1|0:b;oa=b;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;sa=c;Ha=b;d=b>>26;b=(b&67108863)<<6|c>>>26;e=b+xa|0;c=d+k|0;k=e;c=b>>>0>e>>>0?c+1|0:c;b=c;e=e+16777216|0;b=e>>>0<16777216?b+1|0:b;xa=e;e=(b&33554431)<<7|e>>>25;c=e+m|0;b=(b>>25)+wa|0;b=c>>>0>>0?b+1|0:b;d=c;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;wa=c;e=b;y[g+56>>2]=d-(c&-67108864);b=Ai(t,A,w,H);d=W;m=Ai(q,z,L,ma);c=m+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(B,P,M,ia);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(u,C,I,S);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;m=Ai(Q,Y,N,ja);c=m+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;m=Ai(v,D,ta,da);b=m+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;m=Ai(O,ka,ua,qa);d=m+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;ya=fa>>31;d=Ai(fa,ya,o,F);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(i,R,K,la);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=c;c=Ai(n,J,s,G);m=d+c|0;d=W+b|0;c=c>>>0>m>>>0?d+1|0:d;b=f>>26;f=(f&67108863)<<6|p>>>26;d=f+m|0;c=b+c|0;p=d;c=d>>>0>>0?c+1|0:c;b=c;d=d+16777216|0;b=d>>>0<16777216?b+1|0:b;m=d;f=b;y[g+76>>2]=p-(d&-33554432);b=Ai(v,D,w,H);c=W;p=Ai(q,z,N,ja);b=p+b|0;d=W+c|0;d=b>>>0

>>0?d+1|0:d;p=Ai(B,P,O,ka);b=p+b|0;c=W+d|0;c=b>>>0

>>0?c+1|0:c;p=Ai(o,F,I,S);d=p+b|0;b=W+c|0;b=d>>>0

>>0?b+1|0:b;c=d;d=Ai(V,ra,K,la);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(s,G,h,na);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;l=Ai(l,aa,L,ma);c=l+c|0;d=W+b|0;r=Ai(t,A,r,U);b=r+c|0;c=W+(c>>>0>>0?d+1|0:d)|0;i=Ai(i,R,M,ia);d=i+b|0;b=W+(b>>>0>>0?c+1|0:c)|0;b=d>>>0>>0?b+1|0:b;c=d;d=Ai(n,J,u,C);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;p=c;c=e>>26;d=(e&67108863)<<6|wa>>>26;e=p+d|0;b=b+c|0;i=e;b=d>>>0>e>>>0?b+1|0:b;c=e+16777216|0;d=c>>>0<16777216?b+1|0:b;r=c;e=d;y[g+60>>2]=i-(c&-33554432);b=Ai(w,H,$,ha);d=W;i=Ai(q,z,s,G);c=i+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(t,A,B,P);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;i=Ai(I,S,x,ba);c=i+c|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;i=Ai(u,C,Q,Y);b=i+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;i=Ai(X,ca,ta,da);d=i+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=d;d=Ai(v,D,ua,qa);c=c+d|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=c;c=Ai(fa,ya,Z,ea);d=d+c|0;b=W+b|0;b=c>>>0>d>>>0?b+1|0:b;c=Aa;i=c;l=c>>31;x=Ai(c,l,o,F);c=x+d|0;d=W+b|0;n=Ai(n,J,_,ga);b=n+c|0;c=W+(c>>>0>>0?d+1|0:d)|0;d=b>>>0>>0?c+1|0:c;c=b;b=f>>25;f=(f&33554431)<<7|m>>>25;c=c+f|0;b=b+d|0;b=c>>>0>>0?b+1|0:b;d=c;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;n=c;f=b;y[g+80>>2]=d-(c&-67108864);x=va-(Ga&-33554432)|0;c=e>>25;e=(e&33554431)<<7|r>>>25;b=Ea&-67108864;d=e+(Ca-b|0)|0;b=c+(Da-((b>>>0>Ca>>>0)+Fa|0)|0)|0;b=d>>>0>>0?b+1|0:b;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+x|0;y[g+68>>2]=b;y[g+64>>2]=d-(c&-67108864);b=Ai(s,G,w,H);d=W;e=Ai(q,z,K,la);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;e=Ai(B,P,L,ma);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;e=Ai(t,A,I,S);b=e+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=Ai(Q,Y,M,ia);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=Ai(u,C,ta,da);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;d=Ai(N,ja,ua,qa);c=d+c|0;b=W+b|0;b=c>>>0>>0?b+1|0:b;e=Ai(v,D,fa,ya);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;b=Ai(i,l,O,ka);e=b+d|0;d=W+c|0;d=b>>>0>e>>>0?d+1|0:d;c=e;b=Ba;e=Ai(b,b>>31,o,F);c=c+e|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;d=c;c=f>>26;f=(f&67108863)<<6|n>>>26;d=d+f|0;b=b+c|0;b=d>>>0>>0?b+1|0:b;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;y[g+84>>2]=d-(c&-33554432);f=k-(xa&-33554432)|0;d=sa&-67108864;e=j-d|0;q=oa-((d>>>0>j>>>0)+Ha|0)|0;d=b;b=b>>25;b=Ai((d&33554431)<<7|c>>>25,b,19,0);d=b+e|0;c=W+q|0;b=b>>>0>d>>>0?c+1|0:c;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+f|0;y[g+52>>2]=b;y[g+48>>2]=d-(c&-67108864);pa(a,g+48|0);}T=g+256|0;return za|0}function ui(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;j=T-544|0;T=j;Ie(i,h,j+432|0);i=0;if(g>>>0>31){h=32;while(1){He(f+i|0,j+432|0);i=h;h=h+32|0;if(h>>>0<=g>>>0){continue}break}}h=i|16;if(h>>>0<=g>>>0){while(1){i=f+i|0;l=z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24);m=z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24);p=z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24);n=z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24);i=y[j+524>>2];y[j+392>>2]=y[j+520>>2];y[j+396>>2]=i;i=y[j+516>>2];y[j+384>>2]=y[j+512>>2];y[j+388>>2]=i;i=y[j+500>>2];y[j+368>>2]=y[j+496>>2];y[j+372>>2]=i;i=y[j+508>>2];y[j+376>>2]=y[j+504>>2];y[j+380>>2]=i;i=y[j+516>>2];y[j+352>>2]=y[j+512>>2];y[j+356>>2]=i;i=y[j+524>>2];y[j+360>>2]=y[j+520>>2];y[j+364>>2]=i;i=j+528|0;ia(i,j+368|0,j+352|0);k=y[j+540>>2];y[j+520>>2]=y[j+536>>2];y[j+524>>2]=k;k=y[j+532>>2];y[j+512>>2]=y[j+528>>2];y[j+516>>2]=k;k=y[j+484>>2];y[j+336>>2]=y[j+480>>2];y[j+340>>2]=k;k=y[j+492>>2];y[j+344>>2]=y[j+488>>2];y[j+348>>2]=k;k=y[j+500>>2];y[j+320>>2]=y[j+496>>2];y[j+324>>2]=k;k=y[j+508>>2];y[j+328>>2]=y[j+504>>2];y[j+332>>2]=k;ia(i,j+336|0,j+320|0);k=y[j+540>>2];y[j+504>>2]=y[j+536>>2];y[j+508>>2]=k;k=y[j+532>>2];y[j+496>>2]=y[j+528>>2];y[j+500>>2]=k;k=y[j+468>>2];y[j+304>>2]=y[j+464>>2];y[j+308>>2]=k;k=y[j+476>>2];y[j+312>>2]=y[j+472>>2];y[j+316>>2]=k;k=y[j+484>>2];y[j+288>>2]=y[j+480>>2];y[j+292>>2]=k;k=y[j+492>>2];y[j+296>>2]=y[j+488>>2];y[j+300>>2]=k;ia(i,j+304|0,j+288|0);k=y[j+540>>2];y[j+488>>2]=y[j+536>>2];y[j+492>>2]=k;k=y[j+532>>2];y[j+480>>2]=y[j+528>>2];y[j+484>>2]=k;k=y[j+452>>2];y[j+272>>2]=y[j+448>>2];y[j+276>>2]=k;k=y[j+460>>2];y[j+280>>2]=y[j+456>>2];y[j+284>>2]=k;k=y[j+468>>2];y[j+256>>2]=y[j+464>>2];y[j+260>>2]=k;k=y[j+476>>2];y[j+264>>2]=y[j+472>>2];y[j+268>>2]=k;ia(i,j+272|0,j+256|0);k=y[j+540>>2];y[j+472>>2]=y[j+536>>2];y[j+476>>2]=k;k=y[j+532>>2];y[j+464>>2]=y[j+528>>2];y[j+468>>2]=k;k=y[j+436>>2];y[j+240>>2]=y[j+432>>2];y[j+244>>2]=k;k=y[j+444>>2];y[j+248>>2]=y[j+440>>2];y[j+252>>2]=k;k=y[j+452>>2];y[j+224>>2]=y[j+448>>2];y[j+228>>2]=k;k=y[j+460>>2];y[j+232>>2]=y[j+456>>2];y[j+236>>2]=k;ia(i,j+240|0,j+224|0);k=y[j+540>>2];y[j+456>>2]=y[j+536>>2];y[j+460>>2]=k;k=y[j+532>>2];y[j+448>>2]=y[j+528>>2];y[j+452>>2]=k;k=y[j+388>>2];y[j+208>>2]=y[j+384>>2];y[j+212>>2]=k;k=y[j+396>>2];y[j+216>>2]=y[j+392>>2];y[j+220>>2]=k;k=y[j+436>>2];y[j+192>>2]=y[j+432>>2];y[j+196>>2]=k;k=y[j+444>>2];y[j+200>>2]=y[j+440>>2];y[j+204>>2]=k;ia(i,j+208|0,j+192|0);y[j+444>>2]=n^y[j+540>>2];y[j+440>>2]=p^y[j+536>>2];y[j+436>>2]=m^y[j+532>>2];y[j+432>>2]=l^y[j+528>>2];i=h;h=h+16|0;if(h>>>0<=g>>>0){continue}break}}h=g&15;if(h){l=16-h|0;if(l){o(h|j+416,0,l);}if(h){t(j+416|0,f+i|0,h);}m=y[j+416>>2];p=y[j+420>>2];n=y[j+424>>2];k=y[j+428>>2];h=y[j+524>>2];i=y[j+520>>2];y[j+392>>2]=i;y[j+396>>2]=h;l=y[j+516>>2];f=y[j+512>>2];y[j+384>>2]=f;y[j+388>>2]=l;q=y[j+500>>2];y[j+176>>2]=y[j+496>>2];y[j+180>>2]=q;q=y[j+508>>2];y[j+184>>2]=y[j+504>>2];y[j+188>>2]=q;y[j+160>>2]=f;y[j+164>>2]=l;y[j+168>>2]=i;y[j+172>>2]=h;f=j+528|0;ia(f,j+176|0,j+160|0);h=y[j+540>>2];y[j+520>>2]=y[j+536>>2];y[j+524>>2]=h;h=y[j+532>>2];y[j+512>>2]=y[j+528>>2];y[j+516>>2]=h;h=y[j+484>>2];y[j+144>>2]=y[j+480>>2];y[j+148>>2]=h;h=y[j+492>>2];y[j+152>>2]=y[j+488>>2];y[j+156>>2]=h;h=y[j+500>>2];y[j+128>>2]=y[j+496>>2];y[j+132>>2]=h;h=y[j+508>>2];y[j+136>>2]=y[j+504>>2];y[j+140>>2]=h;ia(f,j+144|0,j+128|0);h=y[j+540>>2];y[j+504>>2]=y[j+536>>2];y[j+508>>2]=h;h=y[j+532>>2];y[j+496>>2]=y[j+528>>2];y[j+500>>2]=h;h=y[j+468>>2];y[j+112>>2]=y[j+464>>2];y[j+116>>2]=h;h=y[j+476>>2];y[j+120>>2]=y[j+472>>2];y[j+124>>2]=h;h=y[j+484>>2];y[j+96>>2]=y[j+480>>2];y[j+100>>2]=h;h=y[j+492>>2];y[j+104>>2]=y[j+488>>2];y[j+108>>2]=h;ia(f,j+112|0,j+96|0);h=y[j+540>>2];y[j+488>>2]=y[j+536>>2];y[j+492>>2]=h;h=y[j+532>>2];y[j+480>>2]=y[j+528>>2];y[j+484>>2]=h;h=y[j+452>>2];y[j+80>>2]=y[j+448>>2];y[j+84>>2]=h;h=y[j+460>>2];y[j+88>>2]=y[j+456>>2];y[j+92>>2]=h;h=y[j+468>>2];y[j+64>>2]=y[j+464>>2];y[j+68>>2]=h;h=y[j+476>>2];y[j+72>>2]=y[j+472>>2];y[j+76>>2]=h;ia(f,j+80|0,j- -64|0);h=y[j+540>>2];y[j+472>>2]=y[j+536>>2];y[j+476>>2]=h;h=y[j+532>>2];y[j+464>>2]=y[j+528>>2];y[j+468>>2]=h;h=y[j+436>>2];y[j+48>>2]=y[j+432>>2];y[j+52>>2]=h;h=y[j+444>>2];y[j+56>>2]=y[j+440>>2];y[j+60>>2]=h;h=y[j+452>>2];y[j+32>>2]=y[j+448>>2];y[j+36>>2]=h;h=y[j+460>>2];y[j+40>>2]=y[j+456>>2];y[j+44>>2]=h;ia(f,j+48|0,j+32|0);h=y[j+540>>2];y[j+456>>2]=y[j+536>>2];y[j+460>>2]=h;h=y[j+532>>2];y[j+448>>2]=y[j+528>>2];y[j+452>>2]=h;h=y[j+388>>2];y[j+16>>2]=y[j+384>>2];y[j+20>>2]=h;h=y[j+396>>2];y[j+24>>2]=y[j+392>>2];y[j+28>>2]=h;h=y[j+436>>2];y[j>>2]=y[j+432>>2];y[j+4>>2]=h;h=y[j+444>>2];y[j+8>>2]=y[j+440>>2];y[j+12>>2]=h;ia(f,j+16|0,j);y[j+444>>2]=k^y[j+540>>2];y[j+440>>2]=n^y[j+536>>2];y[j+436>>2]=p^y[j+532>>2];y[j+432>>2]=m^y[j+528>>2];}a:{if(!a){i=16;h=0;if(c>>>0<16){break a}while(1){Ee(j+528|0,b+h|0,j+432|0);h=i;i=h+16|0;if(i>>>0<=c>>>0){continue}break}break a}i=16;h=0;if(c>>>0<16){break a}while(1){Ee(a+h|0,b+h|0,j+432|0);h=i;i=h+16|0;if(i>>>0<=c>>>0){continue}break}}i=c&15;if(i){p=a?a+h|0:j+528|0;h=b+h|0;f=j+432|0;b=T-240|0;T=b;l=i+(b+192|0)|0;m=16-i|0;n=!m;if(!n){o(l,0,m);}k=!i;if(!k){t(b+192|0,h,i);}q=y[f+16>>2];h=f- -64|0;r=y[h>>2];s=y[f+80>>2];u=y[f+32>>2];v=y[f+48>>2];w=y[f+20>>2];x=y[f+68>>2];A=y[f+84>>2];B=y[f+36>>2];C=y[f+52>>2];D=y[f+24>>2];E=y[f+72>>2];F=y[f+88>>2];G=y[f+40>>2];H=y[f+56>>2];I=y[b+192>>2];J=y[b+196>>2];K=y[b+200>>2];y[b+204>>2]=y[f+44>>2]&y[f+60>>2]^(y[f+28>>2]^(y[f+76>>2]^(y[f+92>>2]^y[b+204>>2])));y[b+200>>2]=G&H^(E^(F^K)^D);y[b+196>>2]=B&C^(A^J^x^w);y[b+192>>2]=u&v^(s^I^r^q);if(!n){o(l,0,m);}if(!k){t(p,b+192|0,i);}l=y[b+192>>2];m=y[b+196>>2];p=y[b+200>>2];n=y[b+204>>2];i=y[f+92>>2];y[b+232>>2]=y[f+88>>2];y[b+236>>2]=i;i=y[f+84>>2];y[b+224>>2]=y[f+80>>2];y[b+228>>2]=i;i=y[h+4>>2];y[b+176>>2]=y[h>>2];y[b+180>>2]=i;i=y[f+76>>2];y[b+184>>2]=y[f+72>>2];y[b+188>>2]=i;i=y[f+84>>2];y[b+160>>2]=y[f+80>>2];y[b+164>>2]=i;i=y[f+92>>2];y[b+168>>2]=y[f+88>>2];y[b+172>>2]=i;i=b+208|0;ia(i,b+176|0,b+160|0);k=y[b+220>>2];y[f+88>>2]=y[b+216>>2];y[f+92>>2]=k;k=y[b+212>>2];y[f+80>>2]=y[b+208>>2];y[f+84>>2]=k;k=y[f+52>>2];y[b+144>>2]=y[f+48>>2];y[b+148>>2]=k;k=y[f+60>>2];y[b+152>>2]=y[f+56>>2];y[b+156>>2]=k;k=y[h+4>>2];y[b+128>>2]=y[h>>2];y[b+132>>2]=k;k=y[f+76>>2];y[b+136>>2]=y[f+72>>2];y[b+140>>2]=k;ia(i,b+144|0,b+128|0);k=y[b+220>>2];y[f+72>>2]=y[b+216>>2];y[f+76>>2]=k;k=y[b+212>>2];y[h>>2]=y[b+208>>2];y[h+4>>2]=k;h=y[f+36>>2];y[b+112>>2]=y[f+32>>2];y[b+116>>2]=h;h=y[f+44>>2];y[b+120>>2]=y[f+40>>2];y[b+124>>2]=h;h=y[f+52>>2];y[b+96>>2]=y[f+48>>2];y[b+100>>2]=h;h=y[f+60>>2];y[b+104>>2]=y[f+56>>2];y[b+108>>2]=h;ia(i,b+112|0,b+96|0);h=y[b+220>>2];y[f+56>>2]=y[b+216>>2];y[f+60>>2]=h;h=y[b+212>>2];y[f+48>>2]=y[b+208>>2];y[f+52>>2]=h;h=y[f+20>>2];y[b+80>>2]=y[f+16>>2];y[b+84>>2]=h;h=y[f+28>>2];y[b+88>>2]=y[f+24>>2];y[b+92>>2]=h;h=y[f+36>>2];y[b+64>>2]=y[f+32>>2];y[b+68>>2]=h;h=y[f+44>>2];y[b+72>>2]=y[f+40>>2];y[b+76>>2]=h;ia(i,b+80|0,b- -64|0);h=y[b+220>>2];y[f+40>>2]=y[b+216>>2];y[f+44>>2]=h;h=y[b+212>>2];y[f+32>>2]=y[b+208>>2];y[f+36>>2]=h;h=y[f+4>>2];y[b+48>>2]=y[f>>2];y[b+52>>2]=h;h=y[f+12>>2];y[b+56>>2]=y[f+8>>2];y[b+60>>2]=h;h=y[f+20>>2];y[b+32>>2]=y[f+16>>2];y[b+36>>2]=h;h=y[f+28>>2];y[b+40>>2]=y[f+24>>2];y[b+44>>2]=h;ia(i,b+48|0,b+32|0);h=y[b+220>>2];y[f+24>>2]=y[b+216>>2];y[f+28>>2]=h;h=y[b+212>>2];y[f+16>>2]=y[b+208>>2];y[f+20>>2]=h;h=y[b+228>>2];y[b+16>>2]=y[b+224>>2];y[b+20>>2]=h;h=y[b+236>>2];y[b+24>>2]=y[b+232>>2];y[b+28>>2]=h;h=y[f+4>>2];y[b>>2]=y[f>>2];y[b+4>>2]=h;h=y[f+12>>2];y[b+8>>2]=y[f+8>>2];y[b+12>>2]=h;ia(i,b+16|0,b);h=y[b+208>>2];i=y[b+212>>2];k=y[b+216>>2];y[f+12>>2]=n^y[b+220>>2];y[f+8>>2]=k^p;y[f+4>>2]=i^m;y[f>>2]=h^l;T=b+240|0;}Fe(j+384|0,e,g,c,j+432|0);h=-1;b:{c:{b=e-16|0;if(b){if((b|0)==16){break c}break b}h=db(j+384|0,d);break b}h=kb(j+384|0,d);}if(!(!c|(!a|!h))){o(a,0,c);}T=j+544|0;return h|0}function ga(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0;s=y[c+4>>2];D=s>>31;L=y[b+20>>2];F=L<<1;ba=F>>31;d=Ai(s,D,F,ba);f=W;r=y[c>>2];v=r>>31;t=y[b+24>>2];w=t>>31;p=Ai(r,v,t,w);e=p+d|0;d=W+f|0;d=e>>>0

>>0?d+1|0:d;x=y[c+8>>2];I=x>>31;p=y[b+16>>2];z=p>>31;l=Ai(x,I,p,z);e=l+e|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;G=y[c+12>>2];M=G>>31;N=y[b+12>>2];U=N<<1;ca=U>>31;l=Ai(G,M,U,ca);d=l+e|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;J=y[c+16>>2];V=J>>31;l=y[b+8>>2];A=l>>31;q=Ai(J,V,l,A);f=q+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;O=y[c+20>>2];da=O>>31;P=y[b+4>>2];X=P<<1;ea=X>>31;f=Ai(O,da,X,ea);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;j=y[c+24>>2];ta=j;pa=j>>31;q=y[b>>2];B=q>>31;m=Ai(j,pa,q,B);f=m+e|0;e=W+d|0;e=f>>>0>>0?e+1|0:e;fa=y[c+28>>2];o=E(fa,19);Q=o>>31;R=y[b+36>>2];Y=R<<1;ga=Y>>31;m=Ai(o,Q,Y,ga);d=m+f|0;f=W+e|0;f=d>>>0>>0?f+1|0:f;qa=y[c+32>>2];g=E(qa,19);K=g>>31;m=y[b+32>>2];C=m>>31;k=Ai(g,K,m,C);e=k+d|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;ua=y[c+36>>2];k=E(ua,19);H=k>>31;S=y[b+28>>2];Z=S<<1;ha=Z>>31;c=Ai(k,H,Z,ha);b=c+e|0;d=W+d|0;h=b;c=b>>>0>>0?d+1|0:d;b=Ai(p,z,s,D);d=W;ia=L>>31;e=Ai(r,v,L,ia);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;ja=N>>31;d=Ai(x,I,N,ja);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;f=Ai(l,A,G,M);b=f+b|0;d=W+e|0;d=b>>>0>>0?d+1|0:d;ka=P>>31;e=Ai(J,V,P,ka);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(q,B,O,da);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;j=E(j,19);_=j>>31;la=R>>31;e=Ai(j,_,R,la);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;d=Ai(m,C,o,Q);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;ma=S>>31;f=Ai(g,K,S,ma);b=f+b|0;d=W+e|0;d=b>>>0>>0?d+1|0:d;e=Ai(k,H,t,w);b=e+b|0;d=W+d|0;va=b;T=b>>>0>>0?d+1|0:d;b=Ai(s,D,U,ca);d=W;e=Ai(r,v,p,z);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(l,A,x,I);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;d=Ai(G,M,X,ea);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;f=Ai(q,B,J,V);b=f+b|0;d=W+e|0;d=b>>>0>>0?d+1|0:d;$=E(O,19);na=$>>31;e=Ai($,na,Y,ga);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(m,C,j,_);b=e+b|0;d=W+d|0;d=b>>>0>>0?d+1|0:d;e=Ai(o,Q,Z,ha);b=e+b|0;f=W+d|0;f=b>>>0>>0?f+1|0:f;d=Ai(g,K,t,w);b=d+b|0;e=W+f|0;e=b>>>0>>0?e+1|0:e;f=Ai(k,H,F,ba);b=f+b|0;d=W+e|0;ya=b;d=b>>>0>>0?d+1|0:d;za=d;b=b+33554432|0;d=b>>>0<33554432?d+1|0:d;Aa=b;Ba=d;f=(d&67108863)<<6|b>>>26;b=f+va|0;d=(d>>26)+T|0;va=b;d=b>>>0>>0?d+1|0:d;b=b+16777216|0;f=b>>>0<16777216?d+1|0:d;Ca=b;e=f>>25;f=(f&33554431)<<7|b>>>25;b=f+h|0;d=c+e|0;d=b>>>0>>0?d+1|0:d;e=b;c=e+33554432|0;d=c>>>0<33554432?d+1|0:d;aa=c;b=d;y[a+24>>2]=e-(c&-67108864);c=Ai(s,D,X,ea);d=W;e=Ai(r,v,l,A);c=e+c|0;f=W+d|0;f=c>>>0>>0?f+1|0:f;d=c;c=Ai(q,B,x,I);e=d+c|0;d=W+f|0;d=c>>>0>e>>>0?d+1|0:d;c=E(G,19);oa=c>>31;f=Ai(c,oa,Y,ga);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;T=E(J,19);ra=T>>31;h=Ai(m,C,T,ra);f=h+e|0;e=W+d|0;e=f>>>0>>0?e+1|0:e;h=Ai(Z,ha,$,na);f=h+f|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;h=Ai(t,w,j,_);e=h+f|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;h=Ai(o,Q,F,ba);e=h+e|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(g,K,p,z);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;h=Ai(k,H,U,ca);f=h+e|0;e=W+d|0;n=f;wa=f>>>0>>0?e+1|0:e;d=Ai(q,B,s,D);e=W;h=Ai(r,v,P,ka);f=h+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=E(x,19);h=e;sa=e>>31;i=Ai(e,sa,R,la);e=i+f|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;i=Ai(m,C,c,oa);e=i+e|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(T,ra,S,ma);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;i=Ai(t,w,$,na);f=i+e|0;e=W+d|0;e=f>>>0>>0?e+1|0:e;i=Ai(j,_,L,ia);f=i+f|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;i=Ai(p,z,o,Q);e=i+f|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;i=Ai(g,K,N,ja);e=i+e|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(k,H,l,A);e=f+e|0;d=W+d|0;xa=e;i=e>>>0>>0?d+1|0:d;d=E(s,19);d=Ai(d,d>>31,Y,ga);e=W;f=Ai(r,v,q,B);d=f+d|0;e=W+e|0;e=d>>>0>>0?e+1|0:e;h=Ai(m,C,h,sa);f=h+d|0;d=W+e|0;e=Ai(c,oa,Z,ha);c=e+f|0;f=W+(f>>>0>>0?d+1|0:d)|0;f=c>>>0>>0?f+1|0:f;e=Ai(t,w,T,ra);c=e+c|0;d=W+f|0;d=c>>>0>>0?d+1|0:d;e=Ai(F,ba,$,na);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;f=Ai(p,z,j,_);c=f+c|0;e=W+d|0;e=c>>>0>>0?e+1|0:e;f=Ai(o,Q,U,ca);c=f+c|0;d=W+e|0;d=c>>>0>>0?d+1|0:d;e=Ai(g,K,l,A);c=e+c|0;f=W+d|0;f=c>>>0>>0?f+1|0:f;e=Ai(k,H,X,ea);c=e+c|0;d=W+f|0;h=c;d=c>>>0>>0?d+1|0:d;oa=d;c=c+33554432|0;d=c>>>0<33554432?d+1|0:d;sa=c;Da=d;f=d>>26;d=(d&67108863)<<6|c>>>26;c=d+xa|0;e=f+i|0;i=c;d=c>>>0>>0?e+1|0:e;c=c+16777216|0;d=c>>>0<16777216?d+1|0:d;xa=c;e=(d&33554431)<<7|c>>>25;c=e+n|0;d=(d>>25)+wa|0;d=c>>>0>>0?d+1|0:d;f=c;e=f+33554432|0;d=e>>>0<33554432?d+1|0:d;wa=e;c=d;y[a+8>>2]=f-(e&-67108864);d=Ai(t,w,s,D);f=W;n=Ai(r,v,S,ma);e=n+d|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(x,I,L,ia);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(p,z,G,M);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;n=Ai(J,V,N,ja);e=n+e|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;n=Ai(l,A,O,da);d=n+e|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;n=Ai(P,ka,ta,pa);f=n+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;n=fa>>31;f=Ai(q,B,fa,n);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(g,K,R,la);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;u=Ai(k,H,m,C);e=u+e|0;f=W+d|0;d=b>>26;aa=(b&67108863)<<6|aa>>>26;b=aa+e|0;e=d+(e>>>0>>0?f+1|0:f)|0;f=b;d=f>>>0>>0?e+1|0:e;e=f+16777216|0;d=e>>>0<16777216?d+1|0:d;aa=e;b=d;y[a+28>>2]=f-(e&-33554432);d=Ai(l,A,s,D);e=W;u=Ai(r,v,N,ja);d=u+d|0;f=W+e|0;f=d>>>0>>0?f+1|0:f;u=Ai(x,I,P,ka);d=u+d|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;u=Ai(q,B,G,M);f=u+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;f=Ai(T,ra,R,la);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(m,C,$,na);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;j=Ai(j,_,S,ma);e=j+e|0;f=W+d|0;o=Ai(t,w,o,Q);d=o+e|0;e=W+(e>>>0>>0?f+1|0:f)|0;g=Ai(g,K,L,ia);f=g+d|0;d=W+(d>>>0>>0?e+1|0:e)|0;d=f>>>0>>0?d+1|0:d;e=f;f=Ai(k,H,p,z);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;g=e;e=c>>26;f=(c&67108863)<<6|wa>>>26;c=g+f|0;d=d+e|0;g=c;d=c>>>0>>0?d+1|0:d;e=c+16777216|0;f=e>>>0<16777216?d+1|0:d;o=e;c=f;y[a+12>>2]=g-(e&-33554432);d=Ai(s,D,Z,ha);f=W;g=Ai(r,v,m,C);e=g+d|0;d=W+f|0;d=e>>>0>>0?d+1|0:d;f=Ai(t,w,x,I);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;g=Ai(G,M,F,ba);e=g+e|0;f=W+d|0;f=e>>>0>>0?f+1|0:f;g=Ai(p,z,J,V);d=g+e|0;e=W+f|0;e=d>>>0>>0?e+1|0:e;g=Ai(U,ca,O,da);f=g+d|0;d=W+e|0;d=f>>>0>>0?d+1|0:d;e=f;f=Ai(l,A,ta,pa);e=e+f|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;f=Ai(fa,n,X,ea);e=f+e|0;d=W+d|0;d=e>>>0>>0?d+1|0:d;g=qa;j=g>>31;F=Ai(q,B,g,j);e=F+e|0;f=W+d|0;k=Ai(k,H,Y,ga);d=k+e|0;e=W+(e>>>0>>0?f+1|0:f)|0;e=d>>>0>>0?e+1|0:e;qa=d;d=b>>25;f=(b&33554431)<<7|aa>>>25;b=qa+f|0;d=d+e|0;d=b>>>0>>0?d+1|0:d;f=b;e=f+33554432|0;d=e>>>0<33554432?d+1|0:d;k=e;b=d;y[a+32>>2]=f-(e&-67108864);f=va-(Ca&-33554432)|0;e=c>>25;o=(c&33554431)<<7|o>>>25;d=Aa&-67108864;c=o+(ya-d|0)|0;d=e+(za-((d>>>0>ya>>>0)+Ba|0)|0)|0;d=c>>>0>>0?d+1|0:d;e=c;c=e+33554432|0;d=c>>>0<33554432?d+1|0:d;d=((d&67108863)<<6|c>>>26)+f|0;y[a+20>>2]=d;y[a+16>>2]=e-(c&-67108864);c=Ai(m,C,s,D);d=W;e=Ai(r,v,R,la);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;f=Ai(x,I,S,ma);c=f+c|0;e=W+d|0;e=c>>>0>>0?e+1|0:e;d=Ai(t,w,G,M);c=d+c|0;f=W+e|0;f=c>>>0>>0?f+1|0:f;e=Ai(J,V,L,ia);c=e+c|0;d=W+f|0;d=c>>>0>>0?d+1|0:d;e=Ai(p,z,O,da);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;e=Ai(N,ja,ta,pa);c=e+c|0;d=W+d|0;d=c>>>0>>0?d+1|0:d;f=Ai(l,A,fa,n);c=f+c|0;e=W+d|0;e=c>>>0>>0?e+1|0:e;d=Ai(g,j,P,ka);c=d+c|0;f=W+e|0;f=c>>>0>>0?f+1|0:f;e=Ai(q,B,ua,ua>>31);c=e+c|0;d=W+f|0;d=c>>>0>>0?d+1|0:d;e=b>>26;f=c;c=(b&67108863)<<6|k>>>26;b=f+c|0;d=d+e|0;d=b>>>0>>0?d+1|0:d;c=b;b=c+16777216|0;d=b>>>0<16777216?d+1|0:d;y[a+36>>2]=c-(b&-33554432);f=i-(xa&-33554432)|0;c=sa&-67108864;e=h-c|0;r=oa-((c>>>0>h>>>0)+Da|0)|0;c=d;d=d>>25;c=Ai((c&33554431)<<7|b>>>25,d,19,0);b=c+e|0;e=W+r|0;d=b>>>0>>0?e+1|0:e;c=b;b=c+33554432|0;d=b>>>0<33554432?d+1|0:d;d=((d&67108863)<<6|b>>>26)+f|0;y[a+4>>2]=d;y[a>>2]=c-(b&-67108864);}function Ue(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,ha=0,ia=0,ka=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0;d=T-368|0;T=d;while(1){e=z[c+B|0];j=B+34112|0;p=e^z[j|0]|p;q=e^z[j+192|0]|q;o=e^z[j+160|0]|o;i=e^z[j+128|0]|i;h=e^z[j+96|0]|h;g=e^z[j- -64|0]|g;f=e^z[j+32|0]|f;B=B+1|0;if((B|0)!=31){continue}break}e=-1;l=z[c+31|0]&127;j=l^127;if(!((((j|q)&255)-1|(((j|o)&255)-1|(((i|j)&255)-1|(((l^87|h)&255)-1|(((g|l)&255)-1|(((f|l)&255)-1|((l|p)&255)-1))))))&256)){e=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);f=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+336>>2]=f;y[d+340>>2]=e;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+360>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+364>>2]=e;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+352>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+356>>2]=e;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+344>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+348>>2]=e;w[d+336|0]=f&248;w[d+367|0]=z[d+367|0]&63|64;cb(d+288|0,c);y[d+244>>2]=0;y[d+248>>2]=0;y[d+240>>2]=1;y[d+252>>2]=0;y[d+256>>2]=0;y[d+260>>2]=0;y[d+264>>2]=0;y[d+268>>2]=0;y[d+272>>2]=0;y[d+276>>2]=0;y[d+192>>2]=0;y[d+196>>2]=0;y[d+200>>2]=0;y[d+204>>2]=0;y[d+208>>2]=0;y[d+212>>2]=0;y[d+216>>2]=0;y[d+220>>2]=0;y[d+224>>2]=0;y[d+228>>2]=0;b=y[d+292>>2];y[d+144>>2]=y[d+288>>2];y[d+148>>2]=b;b=y[d+300>>2];y[d+152>>2]=y[d+296>>2];y[d+156>>2]=b;b=y[d+308>>2];y[d+160>>2]=y[d+304>>2];y[d+164>>2]=b;b=y[d+316>>2];y[d+168>>2]=y[d+312>>2];y[d+172>>2]=b;b=y[d+324>>2];y[d+176>>2]=y[d+320>>2];y[d+180>>2]=b;y[d+100>>2]=0;y[d+104>>2]=0;y[d+96>>2]=1;y[d+108>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+120>>2]=0;y[d+124>>2]=0;y[d+128>>2]=0;y[d+132>>2]=0;c=254;B=0;while(1){P=y[d+144>>2];Q=y[d+240>>2];R=y[d+96>>2];S=y[d+192>>2];U=y[d+148>>2];V=y[d+244>>2];X=y[d+100>>2];Y=y[d+196>>2];Z=y[d+152>>2];_=y[d+248>>2];$=y[d+104>>2];aa=y[d+200>>2];ba=y[d+156>>2];ca=y[d+252>>2];da=y[d+108>>2];ea=y[d+204>>2];ha=y[d+160>>2];F=y[d+256>>2];ia=y[d+112>>2];k=y[d+208>>2];ka=y[d+164>>2];r=y[d+260>>2];la=y[d+116>>2];v=y[d+212>>2];ma=y[d+168>>2];x=y[d+264>>2];H=y[d+120>>2];n=y[d+216>>2];t=y[d+172>>2];s=y[d+268>>2];m=y[d+124>>2];l=y[d+220>>2];f=y[d+176>>2];j=y[d+272>>2];p=y[d+128>>2];q=y[d+224>>2];b=B;na=c;oa=d+336|0;B=z[oa+(c>>>3|0)|0]>>>(c&7)&1;u=0-(b^B)|0;e=y[d+180>>2];h=y[d+276>>2];o=u&(e^h);b=y[d+132>>2];g=y[d+228>>2];i=u&(b^g);qa=e^o;ra=b^i;y[d+84>>2]=qa-ra;b=f;f=u&(f^j);sa=b^f;e=u&(p^q);ta=e^p;y[d+80>>2]=sa-ta;c=u&(s^t);ua=c^t;b=u&(l^m);A=b^m;y[d+76>>2]=ua-A;C=h^o;G=g^i;y[d+36>>2]=C-G;J=f^j;K=e^q;y[d+32>>2]=J-K;va=c^s;wa=b^l;y[d+28>>2]=va-wa;I=u&(x^ma);L=I^x;i=u&(n^H);M=i^n;y[d+24>>2]=L-M;D=u&(r^ka);N=D^r;h=u&(v^la);O=h^v;y[d+20>>2]=N-O;E=u&(F^ha);F=E^F;g=u&(k^ia);k=g^k;y[d+16>>2]=F-k;r=u&(ba^ca);v=ca^r;f=u&(da^ea);x=ea^f;y[d+12>>2]=v-x;n=u&(Z^_);t=_^n;e=u&($^aa);s=aa^e;y[d+8>>2]=t-s;m=u&(U^V);l=V^m;c=u&(X^Y);j=Y^c;y[d+4>>2]=l-j;p=u&(P^Q);q=Q^p;b=u&(R^S);o=S^b;y[d>>2]=q-o;H=i^H;y[d+120>>2]=H;i=I^ma;y[d+72>>2]=i-H;I=h^la;y[d+116>>2]=I;h=D^ka;y[d+68>>2]=h-I;D=g^ia;y[d+112>>2]=D;g=E^ha;y[d+64>>2]=g-D;E=f^da;y[d+108>>2]=E;f=r^ba;y[d+60>>2]=f-E;r=e^$;y[d+104>>2]=r;e=n^Z;y[d+56>>2]=e-r;n=c^X;y[d+100>>2]=n;c=m^U;y[d+52>>2]=c-n;m=b^R;y[d+96>>2]=m;b=p^P;y[d+48>>2]=b-m;y[d+276>>2]=C+G;y[d+272>>2]=J+K;y[d+268>>2]=va+wa;y[d+264>>2]=L+M;y[d+260>>2]=N+O;y[d+256>>2]=k+F;y[d+252>>2]=v+x;y[d+248>>2]=s+t;y[d+244>>2]=j+l;y[d+240>>2]=o+q;y[d+228>>2]=qa+ra;y[d+224>>2]=sa+ta;y[d+220>>2]=A+ua;y[d+216>>2]=i+H;y[d+212>>2]=h+I;y[d+208>>2]=g+D;y[d+200>>2]=e+r;y[d+196>>2]=c+n;y[d+192>>2]=b+m;y[d+204>>2]=f+E;K=d+96|0;G=d+48|0;C=d+240|0;ga(K,G,C);A=d+192|0;ga(A,A,d);fa(G,d);fa(d,C);k=y[d+192>>2];r=y[d+96>>2];v=y[d+196>>2];x=y[d+100>>2];n=y[d+200>>2];t=y[d+104>>2];s=y[d+204>>2];m=y[d+108>>2];l=y[d+208>>2];j=y[d+112>>2];p=y[d+212>>2];q=y[d+116>>2];o=y[d+216>>2];i=y[d+120>>2];h=y[d+220>>2];g=y[d+124>>2];f=y[d+224>>2];e=y[d+128>>2];c=y[d+228>>2];b=y[d+132>>2];y[d+180>>2]=c+b;y[d+176>>2]=e+f;y[d+172>>2]=g+h;y[d+168>>2]=i+o;y[d+164>>2]=p+q;y[d+160>>2]=j+l;y[d+156>>2]=m+s;y[d+152>>2]=n+t;y[d+148>>2]=v+x;y[d+144>>2]=k+r;y[d+228>>2]=b-c;y[d+224>>2]=e-f;y[d+220>>2]=g-h;y[d+216>>2]=i-o;y[d+212>>2]=q-p;y[d+208>>2]=j-l;y[d+204>>2]=m-s;y[d+200>>2]=t-n;y[d+196>>2]=x-v;y[d+192>>2]=r-k;ga(C,d,G);m=y[d+72>>2];n=y[d+24>>2];L=y[d+68>>2];t=y[d+20>>2];l=y[d+64>>2];s=y[d+16>>2];M=y[d+60>>2];o=y[d+12>>2];j=y[d+56>>2];i=y[d+8>>2];D=y[d+52>>2];h=y[d+4>>2];N=y[d+84>>2];g=y[d+36>>2];J=y[d+48>>2];e=y[d>>2];O=y[d+76>>2];b=y[d+28>>2];f=y[d+80>>2];c=y[d+32>>2]-f|0;y[d+32>>2]=c;b=b-O|0;y[d+28>>2]=b;r=e-J|0;y[d>>2]=r;v=g-N|0;y[d+36>>2]=v;p=h-D|0;y[d+4>>2]=p;q=i-j|0;y[d+8>>2]=q;o=o-M|0;y[d+12>>2]=o;i=s-l|0;y[d+16>>2]=i;h=t-L|0;y[d+20>>2]=h;g=n-m|0;y[d+24>>2]=g;fa(A,A);e=d+144|0;fa(e,e);e=Ai(c,c>>31,121666,0);s=W;c=Ai(b,b>>31,121666,0);b=W;E=c;x=c+16777216|0;b=x>>>0<16777216?b+1|0:b;c=(b&33554431)<<7|x>>>25;e=c+e|0;b=(b>>25)+s|0;b=c>>>0>e>>>0?b+1|0:b;n=e+33554432|0;c=n>>>0<33554432?b+1|0:b;y[d+80>>2]=(e-(n&-67108864)|0)+f;f=m;g=Ai(g,g>>31,121666,0);m=W;e=Ai(h,h>>31,121666,0);b=W;h=g;F=e;t=e+16777216|0;b=t>>>0<16777216?b+1|0:b;g=(b&33554431)<<7|t>>>25;e=h+g|0;b=(b>>25)+m|0;b=e>>>0>>0?b+1|0:b;s=e+33554432|0;g=s>>>0<33554432?b+1|0:b;y[d+72>>2]=(e-(s&-67108864)|0)+f;h=l;f=Ai(i,i>>31,121666,0);i=W;e=Ai(o,o>>31,121666,0);b=W;l=f;k=e;m=e+16777216|0;b=m>>>0<16777216?b+1|0:b;f=(b&33554431)<<7|m>>>25;e=l+f|0;b=(b>>25)+i|0;b=e>>>0>>0?b+1|0:b;l=e+33554432|0;f=l>>>0<33554432?b+1|0:b;y[d+64>>2]=(e-(l&-67108864)|0)+h;i=j;e=Ai(q,q>>31,121666,0);o=W;j=Ai(p,p>>31,121666,0);b=W;h=e;p=j+16777216|0;b=p>>>0<16777216?b+1|0:b;e=(b&33554431)<<7|p>>>25;h=h+e|0;b=(b>>25)+o|0;b=e>>>0>h>>>0?b+1|0:b;q=h+33554432|0;e=q>>>0<33554432?b+1|0:b;y[d+56>>2]=(h-(q&-67108864)|0)+i;o=N;i=c;c=Ai(v,v>>31,121666,0);i=(i&67108863)<<6|n>>>26;n=c+i|0;h=W;b=h;i=c+16777216|0;c=i>>>0<16777216?b+1|0:b;y[d+84>>2]=(n-(i&-33554432)|0)+o;h=O;g=E+((g&67108863)<<6|s>>>26)|0;y[d+76>>2]=(g-(x&-33554432)|0)+h;g=L;f=F+((f&67108863)<<6|l>>>26)|0;y[d+68>>2]=(f-(t&-33554432)|0)+g;f=M;e=k+((e&67108863)<<6|q>>>26)|0;y[d+60>>2]=(e-(m&-33554432)|0)+f;f=D;g=j-(p&-33554432)|0;c=Ai((c&33554431)<<7|i>>>25,c>>25,19,0);b=W;e=c;c=Ai(r,r>>31,121666,0);e=e+c|0;b=W+b|0;b=c>>>0>e>>>0?b+1|0:b;c=e+33554432|0;b=c>>>0<33554432?b+1|0:b;g=((b&67108863)<<6|c>>>26)+g|0;y[d+52>>2]=f+g;y[d+48>>2]=(e-(c&-67108864)|0)+J;c=na-1|0;ga(K,d+288|0,A);ga(A,d,G);if(na){continue}break}p=y[d+144>>2];r=y[d+240>>2];q=y[d+148>>2];v=y[d+244>>2];o=y[d+152>>2];x=y[d+248>>2];i=y[d+156>>2];n=y[d+252>>2];h=y[d+160>>2];t=y[d+256>>2];g=y[d+164>>2];s=y[d+260>>2];f=y[d+168>>2];m=y[d+264>>2];e=y[d+172>>2];l=y[d+268>>2];c=y[d+176>>2];j=y[d+272>>2];k=0-B|0;b=y[d+276>>2];y[d+276>>2]=k&(b^y[d+180>>2])^b;y[d+272>>2]=j^k&(c^j);y[d+268>>2]=l^k&(e^l);y[d+264>>2]=m^k&(f^m);y[d+260>>2]=s^k&(g^s);y[d+256>>2]=t^k&(h^t);y[d+252>>2]=n^k&(i^n);y[d+248>>2]=x^k&(o^x);y[d+244>>2]=v^k&(q^v);y[d+240>>2]=r^k&(p^r);r=y[d+192>>2];p=y[d+96>>2];v=y[d+196>>2];q=y[d+100>>2];x=y[d+200>>2];o=y[d+104>>2];n=y[d+204>>2];i=y[d+108>>2];t=y[d+208>>2];h=y[d+112>>2];s=y[d+212>>2];g=y[d+116>>2];m=y[d+216>>2];f=y[d+120>>2];l=y[d+220>>2];e=y[d+124>>2];j=y[d+224>>2];c=y[d+128>>2];b=y[d+228>>2];y[d+228>>2]=k&(b^y[d+132>>2])^b;y[d+224>>2]=j^k&(c^j);y[d+220>>2]=l^k&(e^l);y[d+216>>2]=m^k&(f^m);y[d+212>>2]=s^k&(g^s);y[d+208>>2]=t^k&(h^t);y[d+204>>2]=n^k&(i^n);y[d+200>>2]=x^k&(o^x);y[d+196>>2]=v^k&(q^v);y[d+192>>2]=r^k&(p^r);bb(A,A);ga(C,C,A);pa(a,C);ja(oa,32);e=0;}T=d+368|0;return e|0}function Nc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=T-4032|0;T=d;qa(d+160|0,c);f=y[c+36>>2];y[d+3840>>2]=y[c+32>>2];y[d+3844>>2]=f;f=y[c+28>>2];y[d+3832>>2]=y[c+24>>2];y[d+3836>>2]=f;f=y[c+20>>2];y[d+3824>>2]=y[c+16>>2];y[d+3828>>2]=f;f=y[c+12>>2];y[d+3816>>2]=y[c+8>>2];y[d+3820>>2]=f;f=y[c+4>>2];y[d+3808>>2]=y[c>>2];y[d+3812>>2]=f;f=y[c+44>>2];y[d+3848>>2]=y[c+40>>2];y[d+3852>>2]=f;f=y[c+52>>2];y[d+3856>>2]=y[c+48>>2];y[d+3860>>2]=f;f=y[c+60>>2];y[d+3864>>2]=y[c+56>>2];y[d+3868>>2]=f;f=c- -64|0;e=y[f+4>>2];y[d+3872>>2]=y[f>>2];y[d+3876>>2]=e;f=y[c+76>>2];y[d+3880>>2]=y[c+72>>2];y[d+3884>>2]=f;f=y[c+84>>2];y[d+3888>>2]=y[c+80>>2];y[d+3892>>2]=f;f=y[c+92>>2];y[d+3896>>2]=y[c+88>>2];y[d+3900>>2]=f;f=y[c+100>>2];y[d+3904>>2]=y[c+96>>2];y[d+3908>>2]=f;f=y[c+108>>2];y[d+3912>>2]=y[c+104>>2];y[d+3916>>2]=f;f=y[c+116>>2];y[d+3920>>2]=y[c+112>>2];y[d+3924>>2]=f;e=d+3528|0;f=d+3808|0;xa(e,f);h=d+2408|0;g=d+3648|0;ga(h,e,g);i=d+3568|0;j=d+3608|0;ga(d+2448|0,i,j);ga(d+2488|0,j,g);ga(d+2528|0,e,i);g=d+320|0;qa(g,h);e=d+3368|0;sa(e,c,g);h=d+2248|0;g=d+3488|0;ga(h,e,g);i=d+3408|0;j=d+3448|0;ga(d+2288|0,i,j);ga(d+2328|0,j,g);ga(d+2368|0,e,i);qa(d+480|0,h);e=y[d+2444>>2];y[d+3840>>2]=y[d+2440>>2];y[d+3844>>2]=e;e=y[d+2436>>2];y[d+3832>>2]=y[d+2432>>2];y[d+3836>>2]=e;e=y[d+2428>>2];y[d+3824>>2]=y[d+2424>>2];y[d+3828>>2]=e;e=y[d+2420>>2];y[d+3816>>2]=y[d+2416>>2];y[d+3820>>2]=e;e=y[d+2412>>2];y[d+3808>>2]=y[d+2408>>2];y[d+3812>>2]=e;e=y[d+2452>>2];y[d+3848>>2]=y[d+2448>>2];y[d+3852>>2]=e;e=y[d+2460>>2];y[d+3856>>2]=y[d+2456>>2];y[d+3860>>2]=e;e=y[d+2468>>2];y[d+3864>>2]=y[d+2464>>2];y[d+3868>>2]=e;e=y[d+2476>>2];y[d+3872>>2]=y[d+2472>>2];y[d+3876>>2]=e;e=y[d+2484>>2];y[d+3880>>2]=y[d+2480>>2];y[d+3884>>2]=e;e=y[d+2524>>2];y[d+3920>>2]=y[d+2520>>2];y[d+3924>>2]=e;e=y[d+2516>>2];y[d+3912>>2]=y[d+2512>>2];y[d+3916>>2]=e;e=y[d+2508>>2];y[d+3904>>2]=y[d+2504>>2];y[d+3908>>2]=e;e=y[d+2500>>2];y[d+3896>>2]=y[d+2496>>2];y[d+3900>>2]=e;e=y[d+2492>>2];y[d+3888>>2]=y[d+2488>>2];y[d+3892>>2]=e;e=d+3208|0;xa(e,f);h=d+2088|0;g=d+3328|0;ga(h,e,g);i=d+3248|0;j=d+3288|0;ga(d+2128|0,i,j);ga(d+2168|0,j,g);ga(d+2208|0,e,i);g=d+640|0;qa(g,h);e=d+3048|0;sa(e,c,g);h=d+1928|0;g=d+3168|0;ga(h,e,g);i=d+3088|0;j=d+3128|0;ga(d+1968|0,i,j);ga(d+2008|0,j,g);ga(d+2048|0,e,i);qa(d+800|0,h);e=y[d+2284>>2];y[d+3840>>2]=y[d+2280>>2];y[d+3844>>2]=e;e=y[d+2276>>2];y[d+3832>>2]=y[d+2272>>2];y[d+3836>>2]=e;e=y[d+2268>>2];y[d+3824>>2]=y[d+2264>>2];y[d+3828>>2]=e;e=y[d+2260>>2];y[d+3816>>2]=y[d+2256>>2];y[d+3820>>2]=e;e=y[d+2252>>2];y[d+3808>>2]=y[d+2248>>2];y[d+3812>>2]=e;e=y[d+2292>>2];y[d+3848>>2]=y[d+2288>>2];y[d+3852>>2]=e;e=y[d+2300>>2];y[d+3856>>2]=y[d+2296>>2];y[d+3860>>2]=e;e=y[d+2308>>2];y[d+3864>>2]=y[d+2304>>2];y[d+3868>>2]=e;e=y[d+2316>>2];y[d+3872>>2]=y[d+2312>>2];y[d+3876>>2]=e;e=y[d+2324>>2];y[d+3880>>2]=y[d+2320>>2];y[d+3884>>2]=e;e=y[d+2364>>2];y[d+3920>>2]=y[d+2360>>2];y[d+3924>>2]=e;e=y[d+2356>>2];y[d+3912>>2]=y[d+2352>>2];y[d+3916>>2]=e;e=y[d+2348>>2];y[d+3904>>2]=y[d+2344>>2];y[d+3908>>2]=e;e=y[d+2340>>2];y[d+3896>>2]=y[d+2336>>2];y[d+3900>>2]=e;e=y[d+2332>>2];y[d+3888>>2]=y[d+2328>>2];y[d+3892>>2]=e;e=d+2888|0;xa(e,f);h=d+1768|0;g=d+3008|0;ga(h,e,g);i=d+2928|0;j=d+2968|0;ga(d+1808|0,i,j);ga(d+1848|0,j,g);ga(d+1888|0,e,i);g=d+960|0;qa(g,h);e=d+2728|0;sa(e,c,g);c=d+1608|0;h=d+2848|0;ga(c,e,h);g=d+2768|0;i=d+2808|0;ga(d+1648|0,g,i);ga(d+1688|0,i,h);ga(d+1728|0,e,g);qa(d+1120|0,c);c=y[d+2124>>2];y[d+3840>>2]=y[d+2120>>2];y[d+3844>>2]=c;c=y[d+2116>>2];y[d+3832>>2]=y[d+2112>>2];y[d+3836>>2]=c;c=y[d+2108>>2];y[d+3824>>2]=y[d+2104>>2];y[d+3828>>2]=c;c=y[d+2100>>2];y[d+3816>>2]=y[d+2096>>2];y[d+3820>>2]=c;c=y[d+2092>>2];y[d+3808>>2]=y[d+2088>>2];y[d+3812>>2]=c;c=y[d+2132>>2];y[d+3848>>2]=y[d+2128>>2];y[d+3852>>2]=c;c=y[d+2140>>2];y[d+3856>>2]=y[d+2136>>2];y[d+3860>>2]=c;c=y[d+2148>>2];y[d+3864>>2]=y[d+2144>>2];y[d+3868>>2]=c;c=y[d+2156>>2];y[d+3872>>2]=y[d+2152>>2];y[d+3876>>2]=c;c=y[d+2164>>2];y[d+3880>>2]=y[d+2160>>2];y[d+3884>>2]=c;c=y[d+2204>>2];y[d+3920>>2]=y[d+2200>>2];y[d+3924>>2]=c;c=y[d+2196>>2];y[d+3912>>2]=y[d+2192>>2];y[d+3916>>2]=c;c=y[d+2188>>2];y[d+3904>>2]=y[d+2184>>2];y[d+3908>>2]=c;c=y[d+2180>>2];y[d+3896>>2]=y[d+2176>>2];y[d+3900>>2]=c;c=y[d+2172>>2];y[d+3888>>2]=y[d+2168>>2];y[d+3892>>2]=c;c=d+2568|0;xa(c,f);f=d+1448|0;e=d+2688|0;ga(f,c,e);h=d+2608|0;g=d+2648|0;ga(d+1488|0,h,g);ga(d+1528|0,g,e);ga(d+1568|0,c,h);qa(d+1280|0,f);c=z[b|0];w[d+3969|0]=c>>>4;w[d+3968|0]=c&15;c=z[b+1|0];w[d+3971|0]=c>>>4;w[d+3970|0]=c&15;c=z[b+2|0];w[d+3973|0]=c>>>4;w[d+3972|0]=c&15;c=z[b+3|0];w[d+3975|0]=c>>>4;w[d+3974|0]=c&15;c=z[b+4|0];w[d+3977|0]=c>>>4;w[d+3976|0]=c&15;c=z[b+5|0];w[d+3979|0]=c>>>4;w[d+3978|0]=c&15;c=z[b+6|0];w[d+3981|0]=c>>>4;w[d+3980|0]=c&15;c=z[b+7|0];w[d+3983|0]=c>>>4;w[d+3982|0]=c&15;c=z[b+8|0];w[d+3985|0]=c>>>4;w[d+3984|0]=c&15;c=z[b+9|0];w[d+3987|0]=c>>>4;w[d+3986|0]=c&15;c=z[b+10|0];w[d+3989|0]=c>>>4;w[d+3988|0]=c&15;c=z[b+11|0];w[d+3991|0]=c>>>4;w[d+3990|0]=c&15;c=z[b+12|0];w[d+3993|0]=c>>>4;w[d+3992|0]=c&15;c=z[b+13|0];w[d+3995|0]=c>>>4;w[d+3994|0]=c&15;c=z[b+14|0];w[d+3997|0]=c>>>4;w[d+3996|0]=c&15;c=z[b+15|0];w[d+3999|0]=c>>>4;w[d+3998|0]=c&15;c=z[b+16|0];w[d+4001|0]=c>>>4;w[d+4e3|0]=c&15;c=z[b+17|0];w[d+4003|0]=c>>>4;w[d+4002|0]=c&15;c=z[b+18|0];w[d+4005|0]=c>>>4;w[d+4004|0]=c&15;c=z[b+19|0];w[d+4007|0]=c>>>4;w[d+4006|0]=c&15;c=z[b+20|0];w[d+4009|0]=c>>>4;w[d+4008|0]=c&15;c=z[b+21|0];w[d+4011|0]=c>>>4;w[d+4010|0]=c&15;c=z[b+22|0];w[d+4013|0]=c>>>4;w[d+4012|0]=c&15;c=z[b+23|0];w[d+4015|0]=c>>>4;w[d+4014|0]=c&15;c=z[b+24|0];w[d+4017|0]=c>>>4;w[d+4016|0]=c&15;c=z[b+25|0];w[d+4019|0]=c>>>4;w[d+4018|0]=c&15;c=z[b+26|0];w[d+4021|0]=c>>>4;w[d+4020|0]=c&15;c=z[b+27|0];w[d+4023|0]=c>>>4;w[d+4022|0]=c&15;c=z[b+28|0];w[d+4025|0]=c>>>4;w[d+4024|0]=c&15;c=z[b+29|0];w[d+4027|0]=c>>>4;w[d+4026|0]=c&15;c=z[b+30|0];w[d+4029|0]=c>>>4;w[d+4028|0]=c&15;b=z[b+31|0];w[d+4031|0]=b>>>4;w[d+4030|0]=b&15;b=0;c=0;while(1){e=b;b=(d+3968|0)+c|0;e=e+z[b|0]|0;f=e+8|0;w[b|0]=e-(f&240);e=z[b+1|0]+(f<<24>>24>>4)|0;f=e+8|0;w[b+1|0]=e-(f&240);e=z[b+2|0]+(f<<24>>24>>4)|0;f=e+8|0;w[b+2|0]=e-(f&240);b=f<<24>>24>>4;c=c+3|0;if((c|0)!=63){continue}break}w[d+4031|0]=z[d+4031|0]+b;y[a+32>>2]=0;y[a+36>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;k=a+40|0;y[k>>2]=1;y[a+52>>2]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=1;o(a+84|0,0,76);l=a+120|0;m=a+80|0;g=d+3768|0;c=d+3888|0;e=d+3848|0;i=d+3728|0;f=d+3928|0;j=63;while(1){n=d+160|0;Mc(d,n,w[(d+3968|0)+j|0]);b=d+3808|0;sa(b,a,d);h=d+3688|0;ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(h,b,f);ga(i,e,c);ga(g,c,f);xa(b,h);ga(a,b,f);ga(k,e,c);ga(m,c,f);ga(l,b,e);j=j-1|0;if(j){continue}break}Mc(d,n,w[d+3968|0]);sa(b,a,d);ga(a,b,f);ga(k,e,c);ga(m,c,f);ga(l,b,e);T=d+4032|0;}function Tb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0;e=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D>>2]=E;e=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+4>>2]=E;e=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+8>>2]=E;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+12>>2]=E;e=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+16>>2]=E;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+20>>2]=E;e=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+24>>2]=E;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+28>>2]=E;e=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+32>>2]=E;e=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+36>>2]=E;e=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+40>>2]=E;e=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+44>>2]=E;e=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+48>>2]=E;e=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+52>>2]=E;e=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);D=c,E=Di(e&16711935,8)|Di(e,24)&16711935,y[D+56>>2]=E;b=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);D=c,E=Di(b&16711935,8)|Di(b,24)&16711935,y[D+60>>2]=E;b=y[a+28>>2];y[d+24>>2]=y[a+24>>2];y[d+28>>2]=b;b=y[a+20>>2];y[d+16>>2]=y[a+16>>2];y[d+20>>2]=b;b=y[a+12>>2];y[d+8>>2]=y[a+8>>2];y[d+12>>2]=b;b=y[a+4>>2];y[d>>2]=y[a>>2];y[d+4>>2]=b;while(1){h=y[d+28>>2];e=s<<2;b=e+c|0;i=y[d+16>>2];g=y[b>>2]+(Bi(i,26)^Bi(i,21)^Bi(i,7))|0;f=y[e+39360>>2]+g|0;g=y[d+24>>2];n=y[d+20>>2];h=(f+(i&(g^n)^g)|0)+h|0;k=h+y[d+12>>2]|0;y[d+12>>2]=k;f=y[d>>2];l=h+(Bi(f,30)^Bi(f,19)^Bi(f,10))|0;m=y[d+8>>2];j=y[d+4>>2];h=l+(f&(m|j)|j&m)|0;y[d+28>>2]=h;l=m;m=e|4;q=m+c|0;g=(y[q>>2]+((g+(n^k&(i^n))|0)+(Bi(k,26)^Bi(k,21)^Bi(k,7))|0)|0)+y[m+39360>>2]|0;m=l+g|0;y[d+8>>2]=m;g=(g+(h&(f|j)|f&j)|0)+(Bi(h,30)^Bi(h,19)^Bi(h,10))|0;y[d+24>>2]=g;l=j;j=e|8;j=(((n+y[j+c>>2]|0)+y[j+39360>>2]|0)+(i^m&(i^k))|0)+(Bi(m,26)^Bi(m,21)^Bi(m,7))|0;n=l+j|0;y[d+4>>2]=n;j=j+((g&(f|h)|f&h)+(Bi(g,30)^Bi(g,19)^Bi(g,10))|0)|0;y[d+20>>2]=j;l=f;f=e|12;f=(((i+y[f+c>>2]|0)+y[f+39360>>2]|0)+(k^n&(m^k))|0)+(Bi(n,26)^Bi(n,21)^Bi(n,7))|0;i=l+f|0;y[d>>2]=i;f=f+((j&(g|h)|g&h)+(Bi(j,30)^Bi(j,19)^Bi(j,10))|0)|0;y[d+16>>2]=f;l=k;k=e|16;l=(((l+y[k+c>>2]|0)+y[k+39360>>2]|0)+(m^i&(m^n))|0)+(Bi(i,26)^Bi(i,21)^Bi(i,7))|0;k=l+((f&(g|j)|g&j)+(Bi(f,30)^Bi(f,19)^Bi(f,10))|0)|0;y[d+12>>2]=k;l=h+l|0;y[d+28>>2]=l;h=e|20;m=(((m+y[h+c>>2]|0)+y[h+39360>>2]|0)+(n^l&(i^n))|0)+(Bi(l,26)^Bi(l,21)^Bi(l,7))|0;h=m+((k&(f|j)|f&j)+(Bi(k,30)^Bi(k,19)^Bi(k,10))|0)|0;y[d+8>>2]=h;m=g+m|0;y[d+24>>2]=m;g=e|24;n=(((n+y[g+c>>2]|0)+y[g+39360>>2]|0)+(i^m&(i^l))|0)+(Bi(m,26)^Bi(m,21)^Bi(m,7))|0;g=n+((h&(f|k)|f&k)+(Bi(h,30)^Bi(h,19)^Bi(h,10))|0)|0;y[d+4>>2]=g;n=j+n|0;y[d+20>>2]=n;j=e|28;i=(((i+y[j+c>>2]|0)+y[j+39360>>2]|0)+(l^n&(m^l))|0)+(Bi(n,26)^Bi(n,21)^Bi(n,7))|0;j=i+((g&(h|k)|h&k)+(Bi(g,30)^Bi(g,19)^Bi(g,10))|0)|0;y[d>>2]=j;i=f+i|0;y[d+16>>2]=i;f=e|32;l=(((l+y[f+c>>2]|0)+y[f+39360>>2]|0)+(m^i&(m^n))|0)+(Bi(i,26)^Bi(i,21)^Bi(i,7))|0;f=l+((j&(g|h)|g&h)+(Bi(j,30)^Bi(j,19)^Bi(j,10))|0)|0;y[d+28>>2]=f;l=k+l|0;y[d+12>>2]=l;k=e|36;r=k+c|0;m=(((m+y[r>>2]|0)+y[k+39360>>2]|0)+(n^l&(i^n))|0)+(Bi(l,26)^Bi(l,21)^Bi(l,7))|0;k=m+((f&(g|j)|g&j)+(Bi(f,30)^Bi(f,19)^Bi(f,10))|0)|0;y[d+24>>2]=k;m=h+m|0;y[d+8>>2]=m;h=e|40;v=h+c|0;n=(((n+y[v>>2]|0)+y[h+39360>>2]|0)+(i^m&(i^l))|0)+(Bi(m,26)^Bi(m,21)^Bi(m,7))|0;h=n+((k&(f|j)|f&j)+(Bi(k,30)^Bi(k,19)^Bi(k,10))|0)|0;y[d+20>>2]=h;n=g+n|0;y[d+4>>2]=n;g=e|44;w=g+c|0;i=((i+(y[g+39360>>2]+y[w>>2]|0)|0)+(l^n&(m^l))|0)+(Bi(n,26)^Bi(n,21)^Bi(n,7))|0;g=i+((h&(f|k)|f&k)+(Bi(h,30)^Bi(h,19)^Bi(h,10))|0)|0;y[d+16>>2]=g;j=i+j|0;y[d>>2]=j;i=e|48;x=i+c|0;l=((l+(y[i+39360>>2]+y[x>>2]|0)|0)+(m^j&(m^n))|0)+(Bi(j,26)^Bi(j,21)^Bi(j,7))|0;i=l+((g&(h|k)|h&k)+(Bi(g,30)^Bi(g,19)^Bi(g,10))|0)|0;y[d+12>>2]=i;f=f+l|0;y[d+28>>2]=f;l=e|52;A=l+c|0;l=(((y[l+39360>>2]+y[A>>2]|0)+m|0)+(n^f&(j^n))|0)+(Bi(f,26)^Bi(f,21)^Bi(f,7))|0;m=l+((i&(g|h)|g&h)+(Bi(i,30)^Bi(i,19)^Bi(i,10))|0)|0;y[d+8>>2]=m;k=k+l|0;y[d+24>>2]=k;o=e|56;l=o+c|0;o=(((y[o+39360>>2]+y[l>>2]|0)+n|0)+(j^k&(f^j))|0)+(Bi(k,26)^Bi(k,21)^Bi(k,7))|0;n=o+((m&(g|i)|g&i)+(Bi(m,30)^Bi(m,19)^Bi(m,10))|0)|0;y[d+4>>2]=n;h=h+o|0;y[d+20>>2]=h;e=e|60;B=e+c|0;e=((j+(y[e+39360>>2]+y[B>>2]|0)|0)+(f^h&(f^k))|0)+(Bi(h,26)^Bi(h,21)^Bi(h,7))|0;h=e+((n&(i|m)|i&m)+(Bi(n,30)^Bi(n,19)^Bi(n,10))|0)|0;y[d>>2]=h;y[d+16>>2]=e+g;if((s|0)!=48){s=s+16|0;C=y[r>>2];r=y[l>>2];f=y[b>>2]+(C+(Bi(r,15)^Bi(r,13)^r>>>10)|0)|0;h=y[q>>2];e=f+(Bi(h,25)^Bi(h,14)^h>>>3)|0;y[(s<<2)+c>>2]=e;g=y[b+8>>2];j=y[b+44>>2];f=g+(j+(Bi(e,15)^Bi(e,13)^e>>>10)|0)|0;i=y[b+12>>2];f=f+(Bi(i,25)^Bi(i,14)^i>>>3)|0;y[b+72>>2]=f;q=y[b+40>>2];k=q+h|0;h=y[b+60>>2];g=(k+(Bi(h,15)^Bi(h,13)^h>>>10)|0)+(Bi(g,25)^Bi(g,14)^g>>>3)|0;y[b+68>>2]=g;k=y[b+16>>2];m=y[b+52>>2];l=k+(m+(Bi(f,15)^Bi(f,13)^f>>>10)|0)|0;o=y[b+20>>2];n=l+(Bi(o,25)^Bi(o,14)^o>>>3)|0;y[b+80>>2]=n;t=y[b+48>>2];k=(i+(t+(Bi(g,15)^Bi(g,13)^g>>>10)|0)|0)+(Bi(k,25)^Bi(k,14)^k>>>3)|0;y[b+76>>2]=k;i=y[b+24>>2];l=i+(h+(Bi(n,15)^Bi(n,13)^n>>>10)|0)|0;p=y[b+28>>2];l=l+(Bi(p,25)^Bi(p,14)^p>>>3)|0;y[b+88>>2]=l;u=y[b+56>>2];i=(o+(u+(Bi(k,15)^Bi(k,13)^k>>>10)|0)|0)+(Bi(i,25)^Bi(i,14)^i>>>3)|0;y[b+84>>2]=i;o=(e+p|0)+(Bi(i,15)^Bi(i,13)^i>>>10)|0;p=y[b+32>>2];o=o+(Bi(p,25)^Bi(p,14)^p>>>3)|0;y[b+92>>2]=o;p=(g+p|0)+(Bi(l,15)^Bi(l,13)^l>>>10)|0;g=y[b+36>>2];g=p+(Bi(g,25)^Bi(g,14)^g>>>3)|0;y[b+96>>2]=g;f=(f+((Bi(q,25)^Bi(q,14)^q>>>3)+C|0)|0)+(Bi(o,15)^Bi(o,13)^o>>>10)|0;y[b+100>>2]=f;j=(y[v>>2]+(k+(Bi(j,25)^Bi(j,14)^j>>>3)|0)|0)+(Bi(g,15)^Bi(g,13)^g>>>10)|0;y[b+104>>2]=j;f=(y[w>>2]+(n+(Bi(t,25)^Bi(t,14)^t>>>3)|0)|0)+(Bi(f,15)^Bi(f,13)^f>>>10)|0;y[b+108>>2]=f;j=(y[x>>2]+(i+(Bi(m,25)^Bi(m,14)^m>>>3)|0)|0)+(Bi(j,15)^Bi(j,13)^j>>>10)|0;y[b+112>>2]=j;f=(y[A>>2]+(l+(Bi(u,25)^Bi(u,14)^u>>>3)|0)|0)+(Bi(f,15)^Bi(f,13)^f>>>10)|0;y[b+116>>2]=f;D=b,E=(o+(r+(Bi(h,25)^Bi(h,14)^h>>>3)|0)|0)+(Bi(j,15)^Bi(j,13)^j>>>10)|0,y[D+120>>2]=E;D=b,E=(y[B>>2]+(g+(Bi(e,25)^Bi(e,14)^e>>>3)|0)|0)+(Bi(f,15)^Bi(f,13)^f>>>10)|0,y[D+124>>2]=E;continue}break}y[a>>2]=h+y[a>>2];y[a+4>>2]=y[a+4>>2]+y[d+4>>2];y[a+8>>2]=y[a+8>>2]+y[d+8>>2];y[a+12>>2]=y[a+12>>2]+y[d+12>>2];y[a+16>>2]=y[a+16>>2]+y[d+16>>2];y[a+20>>2]=y[a+20>>2]+y[d+20>>2];y[a+24>>2]=y[a+24>>2]+y[d+24>>2];y[a+28>>2]=y[a+28>>2]+y[d+28>>2];}function Pe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=T-544|0;T=c;g=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);h=z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24);i=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);j=z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24);k=z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24);l=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);m=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);n=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);d=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);o=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);p=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);q=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);r=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);s=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);t=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);u=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=y[b+124>>2];y[c+536>>2]=y[b+120>>2];y[c+540>>2]=a;a=y[b+116>>2];y[c+528>>2]=y[b+112>>2];y[c+532>>2]=a;a=y[b+100>>2];y[c+496>>2]=y[b+96>>2];y[c+500>>2]=a;a=y[b+108>>2];y[c+504>>2]=y[b+104>>2];y[c+508>>2]=a;a=y[b+116>>2];y[c+480>>2]=y[b+112>>2];y[c+484>>2]=a;a=y[b+124>>2];y[c+488>>2]=y[b+120>>2];y[c+492>>2]=a;a=c+512|0;ia(a,c+496|0,c+480|0);f=y[c+524>>2];y[b+120>>2]=y[c+520>>2];y[b+124>>2]=f;f=y[c+516>>2];y[b+112>>2]=y[c+512>>2];y[b+116>>2]=f;f=y[b+84>>2];y[c+464>>2]=y[b+80>>2];y[c+468>>2]=f;f=y[b+92>>2];y[c+472>>2]=y[b+88>>2];y[c+476>>2]=f;f=y[b+100>>2];y[c+448>>2]=y[b+96>>2];y[c+452>>2]=f;f=y[b+108>>2];y[c+456>>2]=y[b+104>>2];y[c+460>>2]=f;ia(a,c+464|0,c+448|0);f=y[c+524>>2];y[b+104>>2]=y[c+520>>2];y[b+108>>2]=f;f=y[c+516>>2];y[b+96>>2]=y[c+512>>2];y[b+100>>2]=f;f=b- -64|0;e=y[f+4>>2];y[c+432>>2]=y[f>>2];y[c+436>>2]=e;e=y[b+76>>2];y[c+440>>2]=y[b+72>>2];y[c+444>>2]=e;e=y[b+84>>2];y[c+416>>2]=y[b+80>>2];y[c+420>>2]=e;e=y[b+92>>2];y[c+424>>2]=y[b+88>>2];y[c+428>>2]=e;ia(a,c+432|0,c+416|0);e=y[c+524>>2];y[b+88>>2]=y[c+520>>2];y[b+92>>2]=e;e=y[c+516>>2];y[b+80>>2]=y[c+512>>2];y[b+84>>2]=e;e=y[b+52>>2];y[c+400>>2]=y[b+48>>2];y[c+404>>2]=e;e=y[b+60>>2];y[c+408>>2]=y[b+56>>2];y[c+412>>2]=e;e=y[f+4>>2];y[c+384>>2]=y[f>>2];y[c+388>>2]=e;e=y[b+76>>2];y[c+392>>2]=y[b+72>>2];y[c+396>>2]=e;ia(a,c+400|0,c+384|0);e=y[c+524>>2];y[b+72>>2]=y[c+520>>2];y[b+76>>2]=e;e=y[c+516>>2];y[f>>2]=y[c+512>>2];y[f+4>>2]=e;e=y[b+36>>2];y[c+368>>2]=y[b+32>>2];y[c+372>>2]=e;e=y[b+44>>2];y[c+376>>2]=y[b+40>>2];y[c+380>>2]=e;e=y[b+52>>2];y[c+352>>2]=y[b+48>>2];y[c+356>>2]=e;e=y[b+60>>2];y[c+360>>2]=y[b+56>>2];y[c+364>>2]=e;ia(a,c+368|0,c+352|0);e=y[c+524>>2];y[b+56>>2]=y[c+520>>2];y[b+60>>2]=e;e=y[c+516>>2];y[b+48>>2]=y[c+512>>2];y[b+52>>2]=e;e=y[b+20>>2];y[c+336>>2]=y[b+16>>2];y[c+340>>2]=e;e=y[b+28>>2];y[c+344>>2]=y[b+24>>2];y[c+348>>2]=e;e=y[b+36>>2];y[c+320>>2]=y[b+32>>2];y[c+324>>2]=e;e=y[b+44>>2];y[c+328>>2]=y[b+40>>2];y[c+332>>2]=e;ia(a,c+336|0,c+320|0);e=y[c+524>>2];y[b+40>>2]=y[c+520>>2];y[b+44>>2]=e;e=y[c+516>>2];y[b+32>>2]=y[c+512>>2];y[b+36>>2]=e;e=y[b+4>>2];y[c+304>>2]=y[b>>2];y[c+308>>2]=e;e=y[b+12>>2];y[c+312>>2]=y[b+8>>2];y[c+316>>2]=e;e=y[b+20>>2];y[c+288>>2]=y[b+16>>2];y[c+292>>2]=e;e=y[b+28>>2];y[c+296>>2]=y[b+24>>2];y[c+300>>2]=e;ia(a,c+304|0,c+288|0);e=y[c+524>>2];y[b+24>>2]=y[c+520>>2];y[b+28>>2]=e;e=y[c+516>>2];y[b+16>>2]=y[c+512>>2];y[b+20>>2]=e;e=y[c+532>>2];y[c+272>>2]=y[c+528>>2];y[c+276>>2]=e;e=y[c+540>>2];y[c+280>>2]=y[c+536>>2];y[c+284>>2]=e;e=y[b+4>>2];y[c+256>>2]=y[b>>2];y[c+260>>2]=e;e=y[b+12>>2];y[c+264>>2]=y[b+8>>2];y[c+268>>2]=e;ia(a,c+272|0,c+256|0);e=y[c+524>>2];y[b+8>>2]=y[c+520>>2];y[b+12>>2]=e;e=y[c+516>>2];y[b>>2]=y[c+512>>2];y[b+4>>2]=e;y[b+12>>2]=y[b+12>>2]^t;y[b+8>>2]=y[b+8>>2]^s;y[b+4>>2]=y[b+4>>2]^r;y[b>>2]=y[b>>2]^u;y[f>>2]=y[f>>2]^q;y[b+68>>2]=y[b+68>>2]^p;y[b+72>>2]=y[b+72>>2]^o;y[b+76>>2]=y[b+76>>2]^d;d=y[b+124>>2];y[c+536>>2]=y[b+120>>2];y[c+540>>2]=d;d=y[b+116>>2];y[c+528>>2]=y[b+112>>2];y[c+532>>2]=d;d=y[b+100>>2];y[c+240>>2]=y[b+96>>2];y[c+244>>2]=d;d=y[b+108>>2];y[c+248>>2]=y[b+104>>2];y[c+252>>2]=d;d=y[b+116>>2];y[c+224>>2]=y[b+112>>2];y[c+228>>2]=d;d=y[b+124>>2];y[c+232>>2]=y[b+120>>2];y[c+236>>2]=d;ia(a,c+240|0,c+224|0);d=y[c+524>>2];y[b+120>>2]=y[c+520>>2];y[b+124>>2]=d;d=y[c+516>>2];y[b+112>>2]=y[c+512>>2];y[b+116>>2]=d;d=y[b+84>>2];y[c+208>>2]=y[b+80>>2];y[c+212>>2]=d;d=y[b+92>>2];y[c+216>>2]=y[b+88>>2];y[c+220>>2]=d;d=y[b+100>>2];y[c+192>>2]=y[b+96>>2];y[c+196>>2]=d;d=y[b+108>>2];y[c+200>>2]=y[b+104>>2];y[c+204>>2]=d;ia(a,c+208|0,c+192|0);d=y[c+524>>2];y[b+104>>2]=y[c+520>>2];y[b+108>>2]=d;d=y[c+516>>2];y[b+96>>2]=y[c+512>>2];y[b+100>>2]=d;d=y[f+4>>2];y[c+176>>2]=y[f>>2];y[c+180>>2]=d;d=y[b+76>>2];y[c+184>>2]=y[b+72>>2];y[c+188>>2]=d;d=y[b+84>>2];y[c+160>>2]=y[b+80>>2];y[c+164>>2]=d;d=y[b+92>>2];y[c+168>>2]=y[b+88>>2];y[c+172>>2]=d;ia(a,c+176|0,c+160|0);d=y[c+524>>2];y[b+88>>2]=y[c+520>>2];y[b+92>>2]=d;d=y[c+516>>2];y[b+80>>2]=y[c+512>>2];y[b+84>>2]=d;d=y[b+52>>2];y[c+144>>2]=y[b+48>>2];y[c+148>>2]=d;d=y[b+60>>2];y[c+152>>2]=y[b+56>>2];y[c+156>>2]=d;d=y[f+4>>2];y[c+128>>2]=y[f>>2];y[c+132>>2]=d;d=y[b+76>>2];y[c+136>>2]=y[b+72>>2];y[c+140>>2]=d;ia(a,c+144|0,c+128|0);d=y[c+524>>2];y[b+72>>2]=y[c+520>>2];y[b+76>>2]=d;d=y[c+516>>2];y[f>>2]=y[c+512>>2];y[f+4>>2]=d;d=y[b+36>>2];y[c+112>>2]=y[b+32>>2];y[c+116>>2]=d;d=y[b+44>>2];y[c+120>>2]=y[b+40>>2];y[c+124>>2]=d;d=y[b+52>>2];y[c+96>>2]=y[b+48>>2];y[c+100>>2]=d;d=y[b+60>>2];y[c+104>>2]=y[b+56>>2];y[c+108>>2]=d;ia(a,c+112|0,c+96|0);d=y[c+524>>2];y[b+56>>2]=y[c+520>>2];y[b+60>>2]=d;d=y[c+516>>2];y[b+48>>2]=y[c+512>>2];y[b+52>>2]=d;d=y[b+20>>2];y[c+80>>2]=y[b+16>>2];y[c+84>>2]=d;d=y[b+28>>2];y[c+88>>2]=y[b+24>>2];y[c+92>>2]=d;d=y[b+36>>2];y[c+64>>2]=y[b+32>>2];y[c+68>>2]=d;d=y[b+44>>2];y[c+72>>2]=y[b+40>>2];y[c+76>>2]=d;ia(a,c+80|0,c- -64|0);d=y[c+524>>2];y[b+40>>2]=y[c+520>>2];y[b+44>>2]=d;d=y[c+516>>2];y[b+32>>2]=y[c+512>>2];y[b+36>>2]=d;d=y[b+4>>2];y[c+48>>2]=y[b>>2];y[c+52>>2]=d;d=y[b+12>>2];y[c+56>>2]=y[b+8>>2];y[c+60>>2]=d;d=y[b+20>>2];y[c+32>>2]=y[b+16>>2];y[c+36>>2]=d;d=y[b+28>>2];y[c+40>>2]=y[b+24>>2];y[c+44>>2]=d;ia(a,c+48|0,c+32|0);d=y[c+524>>2];y[b+24>>2]=y[c+520>>2];y[b+28>>2]=d;d=y[c+516>>2];y[b+16>>2]=y[c+512>>2];y[b+20>>2]=d;d=y[c+532>>2];y[c+16>>2]=y[c+528>>2];y[c+20>>2]=d;d=y[c+540>>2];y[c+24>>2]=y[c+536>>2];y[c+28>>2]=d;d=y[b+4>>2];y[c>>2]=y[b>>2];y[c+4>>2]=d;d=y[b+12>>2];y[c+8>>2]=y[b+8>>2];y[c+12>>2]=d;ia(a,c+16|0,c);a=y[c+524>>2];y[b+8>>2]=y[c+520>>2];y[b+12>>2]=a;a=y[c+516>>2];y[b>>2]=y[c+512>>2];y[b+4>>2]=a;y[b+12>>2]=y[b+12>>2]^n;y[b+8>>2]=y[b+8>>2]^m;y[b+4>>2]=y[b+4>>2]^l;y[b>>2]=y[b>>2]^k;y[f>>2]=y[f>>2]^j;y[b+68>>2]=y[b+68>>2]^i;y[b+72>>2]=y[b+72>>2]^h;y[b+76>>2]=y[b+76>>2]^g;T=c+544|0;}function Oc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;K=y[b+12>>2];u=K<<1;z=u>>31;f=y[b+4>>2];o=f<<1;v=o>>31;c=Ai(u,z,o,v);e=W;l=y[b+8>>2];R=l;L=l>>31;m=Ai(l,L,l,L);d=m+c|0;c=W+e|0;c=d>>>0>>0?c+1|0:c;h=y[b+16>>2];A=h>>31;g=y[b>>2];m=g<<1;w=m>>31;e=Ai(h,A,m,w);d=e+d|0;c=W+c|0;c=d>>>0>>0?c+1|0:c;G=y[b+28>>2];B=E(G,38);M=B>>31;S=G>>31;e=Ai(B,M,G,S);d=e+d|0;c=W+c|0;c=d>>>0>>0?c+1|0:c;e=d;H=y[b+32>>2];j=E(H,19);C=j>>31;p=y[b+24>>2];d=p<<1;i=Ai(j,C,d,d>>31);e=e+i|0;d=W+c|0;d=e>>>0>>0?d+1|0:d;$=y[b+36>>2];i=E($,38);x=i>>31;D=y[b+20>>2];q=D<<1;I=q>>31;c=Ai(i,x,q,I);e=c+e|0;b=W+d|0;c=(c>>>0>e>>>0?b+1|0:b)<<1|e>>>31;ba=c;T=e<<1;d=T+33554432|0;c=d>>>0<33554432?c+1|0:c;ca=d;da=c;b=c>>26;n=(c&67108863)<<6|d>>>26;c=Ai(o,v,h,A);e=W;l=l<<1;J=l>>31;U=K>>31;r=Ai(l,J,K,U);d=r+c|0;c=W+e|0;c=d>>>0>>0?c+1|0:c;O=D>>31;r=Ai(D,O,m,w);e=r+d|0;d=W+c|0;d=e>>>0>>0?d+1|0:d;r=G<<1;V=r>>31;P=Ai(j,C,r,V);e=P+e|0;c=W+d|0;c=e>>>0

>>0?c+1|0:c;F=p>>31;d=Ai(i,x,p,F);e=d+e|0;c=W+c|0;d=(d>>>0>e>>>0?c+1|0:c)<<1|e>>>31;c=e<<1;e=c+n|0;b=b+d|0;P=e;b=c>>>0>e>>>0?b+1|0:b;c=b;e=e+16777216|0;c=e>>>0<16777216?c+1|0:c;ea=e;n=(c&33554431)<<7|e>>>25;e=c>>25;b=Ai(u,z,K,U);c=W;d=Ai(h,A,l,J);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(o,v,q,I);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;s=Ai(m,w,p,F);d=s+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;Q=H>>31;s=Ai(j,C,H,Q);d=s+d|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;s=Ai(i,x,r,V);b=s+d|0;d=W+c|0;c=b;b=(c>>>0>>0?d+1|0:d)<<1|c>>>31;d=n;n=c<<1;d=d+n|0;c=b+e|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;s=b;e=c;y[a+24>>2]=d-(b&-67108864);b=E(D,38);d=Ai(b,b>>31,D,O);n=W;b=g;c=b>>31;c=Ai(b,c,b,c);b=c+d|0;d=W+n|0;d=b>>>0>>0?d+1|0:d;g=E(p,19);X=g>>31;n=h<<1;Y=n>>31;t=Ai(g,X,n,Y);b=t+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=Ai(u,z,B,M);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;t=Ai(j,C,l,J);d=t+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;t=Ai(o,v,i,x);d=t+d|0;c=W+b|0;Z=d<<1;c=(d>>>0>>0?c+1|0:c)<<1|d>>>31;t=c;b=Z+33554432|0;d=b>>>0<33554432?c+1|0:c;fa=b;ga=d;N=(d&67108863)<<6|b>>>26;_=d>>26;b=Ai(g,X,q,I);c=W;aa=f>>31;d=Ai(m,w,f,aa);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;k=Ai(h,A,B,M);d=k+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;k=Ai(j,C,u,z);d=k+d|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;b=Ai(i,x,R,L);k=b+d|0;d=W+c|0;b=(b>>>0>k>>>0?d+1|0:d)<<1|k>>>31;k=k<<1;d=k+N|0;c=b+_|0;c=d>>>0>>0?c+1|0:c;_=d;d=d+16777216|0;c=d>>>0<16777216?c+1|0:c;k=d;ha=(c&33554431)<<7|d>>>25;N=c>>25;b=Ai(m,w,R,L);c=W;d=Ai(o,v,f,aa);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;f=Ai(g,X,p,F);b=f+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;f=Ai(q,I,B,M);b=f+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=Ai(j,C,n,Y);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;f=Ai(i,x,u,z);d=f+b|0;b=W+c|0;c=(d>>>0>>0?b+1|0:b)<<1|d>>>31;d=d<<1;b=d+ha|0;c=c+N|0;g=b;c=b>>>0>>0?c+1|0:c;b=b+33554432|0;d=b>>>0<33554432?c+1|0:c;N=b;f=d;y[a+8>>2]=g-(b&-67108864);b=Ai(l,J,D,O);d=W;g=Ai(h,A,u,z);c=g+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;g=Ai(o,v,p,F);d=g+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;g=Ai(m,w,G,S);b=g+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;g=Ai(i,x,H,Q);b=g+b|0;c=W+d|0;c=(b>>>0>>0?c+1|0:c)<<1|b>>>31;d=e>>26;g=b<<1;b=(e&67108863)<<6|s>>>26;e=g+b|0;c=c+d|0;d=e;b=d>>>0>>0?c+1|0:c;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;g=c;e=b;y[a+28>>2]=d-(c&-33554432);b=Ai(m,w,K,U);c=W;d=Ai(o,v,R,L);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(p,F,B,M);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;j=Ai(j,C,q,I);d=j+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;j=Ai(i,x,h,A);c=j+d|0;d=W+b|0;b=c;c=(c>>>0>>0?d+1|0:d)<<1|c>>>31;d=b<<1;b=f>>26;f=(f&67108863)<<6|N>>>26;d=d+f|0;c=b+c|0;c=d>>>0>>0?c+1|0:c;b=d+16777216|0;c=b>>>0<16777216?c+1|0:c;j=b;f=c;y[a+12>>2]=d-(b&-33554432);b=Ai(p,F,l,J);c=W;d=Ai(h,A,h,A);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(u,z,q,I);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(o,v,r,V);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;h=Ai(m,w,H,Q);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;c=i;i=$;q=i>>31;h=Ai(c,x,i,q);c=h+d|0;d=W+b|0;b=c;c=(c>>>0>>0?d+1|0:d)<<1|c>>>31;d=b<<1;b=e>>25;e=(e&33554431)<<7|g>>>25;d=d+e|0;c=b+c|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;h=b;e=c;y[a+32>>2]=d-(b&-67108864);B=P-(ea&-33554432)|0;c=f>>25;f=(f&33554431)<<7|j>>>25;b=ca&-67108864;d=f+(T-b|0)|0;b=c+(ba-((b>>>0>T>>>0)+da|0)|0)|0;b=d>>>0>>0?b+1|0:b;f=d;c=b;d=d+33554432|0;c=d>>>0<33554432?c+1|0:c;b=((c&67108863)<<6|d>>>26)+B|0;y[a+20>>2]=b;y[a+16>>2]=f-(d&-67108864);b=Ai(u,z,p,F);d=W;f=Ai(D,O,n,Y);c=f+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;f=Ai(l,J,G,S);d=f+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;f=Ai(o,v,H,Q);b=f+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;f=Ai(m,w,i,q);b=f+b|0;c=W+d|0;c=(b>>>0>>0?c+1|0:c)<<1|b>>>31;d=e>>26;f=b<<1;b=(e&67108863)<<6|h>>>26;e=f+b|0;c=c+d|0;b=b>>>0>e>>>0?c+1|0:c;c=e+16777216|0;b=c>>>0<16777216?b+1|0:b;y[a+36>>2]=e-(c&-33554432);f=_-(k&-33554432)|0;d=fa&-67108864;e=Z-d|0;o=t-((d>>>0>Z>>>0)+ga|0)|0;b=Ai((b&33554431)<<7|c>>>25,b>>25,19,0);c=b+e|0;d=W+o|0;e=c;b=b>>>0>c>>>0?d+1|0:d;c=c+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+f|0;y[a+4>>2]=b;y[a>>2]=e-(c&-67108864);}function vi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0;j=T-528|0;T=j;Ie(i,h,j+400|0);i=0;if(g>>>0>31){h=32;while(1){He(f+i|0,j+400|0);i=h;h=h+32|0;if(h>>>0<=g>>>0){continue}break}}h=i|16;if(h>>>0<=g>>>0){while(1){i=f+i|0;l=z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24);m=z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24);n=z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24);p=z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24);i=y[j+492>>2];y[j+520>>2]=y[j+488>>2];y[j+524>>2]=i;i=y[j+484>>2];y[j+512>>2]=y[j+480>>2];y[j+516>>2]=i;i=y[j+468>>2];y[j+368>>2]=y[j+464>>2];y[j+372>>2]=i;i=y[j+476>>2];y[j+376>>2]=y[j+472>>2];y[j+380>>2]=i;i=y[j+484>>2];y[j+352>>2]=y[j+480>>2];y[j+356>>2]=i;i=y[j+492>>2];y[j+360>>2]=y[j+488>>2];y[j+364>>2]=i;i=j+496|0;ia(i,j+368|0,j+352|0);k=y[j+508>>2];y[j+488>>2]=y[j+504>>2];y[j+492>>2]=k;k=y[j+500>>2];y[j+480>>2]=y[j+496>>2];y[j+484>>2]=k;k=y[j+452>>2];y[j+336>>2]=y[j+448>>2];y[j+340>>2]=k;k=y[j+460>>2];y[j+344>>2]=y[j+456>>2];y[j+348>>2]=k;k=y[j+468>>2];y[j+320>>2]=y[j+464>>2];y[j+324>>2]=k;k=y[j+476>>2];y[j+328>>2]=y[j+472>>2];y[j+332>>2]=k;ia(i,j+336|0,j+320|0);k=y[j+508>>2];y[j+472>>2]=y[j+504>>2];y[j+476>>2]=k;k=y[j+500>>2];y[j+464>>2]=y[j+496>>2];y[j+468>>2]=k;k=y[j+436>>2];y[j+304>>2]=y[j+432>>2];y[j+308>>2]=k;k=y[j+444>>2];y[j+312>>2]=y[j+440>>2];y[j+316>>2]=k;k=y[j+452>>2];y[j+288>>2]=y[j+448>>2];y[j+292>>2]=k;k=y[j+460>>2];y[j+296>>2]=y[j+456>>2];y[j+300>>2]=k;ia(i,j+304|0,j+288|0);k=y[j+508>>2];y[j+456>>2]=y[j+504>>2];y[j+460>>2]=k;k=y[j+500>>2];y[j+448>>2]=y[j+496>>2];y[j+452>>2]=k;k=y[j+420>>2];y[j+272>>2]=y[j+416>>2];y[j+276>>2]=k;k=y[j+428>>2];y[j+280>>2]=y[j+424>>2];y[j+284>>2]=k;k=y[j+436>>2];y[j+256>>2]=y[j+432>>2];y[j+260>>2]=k;k=y[j+444>>2];y[j+264>>2]=y[j+440>>2];y[j+268>>2]=k;ia(i,j+272|0,j+256|0);k=y[j+508>>2];y[j+440>>2]=y[j+504>>2];y[j+444>>2]=k;k=y[j+500>>2];y[j+432>>2]=y[j+496>>2];y[j+436>>2]=k;k=y[j+404>>2];y[j+240>>2]=y[j+400>>2];y[j+244>>2]=k;k=y[j+412>>2];y[j+248>>2]=y[j+408>>2];y[j+252>>2]=k;k=y[j+420>>2];y[j+224>>2]=y[j+416>>2];y[j+228>>2]=k;k=y[j+428>>2];y[j+232>>2]=y[j+424>>2];y[j+236>>2]=k;ia(i,j+240|0,j+224|0);k=y[j+508>>2];y[j+424>>2]=y[j+504>>2];y[j+428>>2]=k;k=y[j+500>>2];y[j+416>>2]=y[j+496>>2];y[j+420>>2]=k;k=y[j+516>>2];y[j+208>>2]=y[j+512>>2];y[j+212>>2]=k;k=y[j+524>>2];y[j+216>>2]=y[j+520>>2];y[j+220>>2]=k;k=y[j+404>>2];y[j+192>>2]=y[j+400>>2];y[j+196>>2]=k;k=y[j+412>>2];y[j+200>>2]=y[j+408>>2];y[j+204>>2]=k;ia(i,j+208|0,j+192|0);y[j+412>>2]=p^y[j+508>>2];y[j+408>>2]=y[j+504>>2]^n;y[j+404>>2]=y[j+500>>2]^m;y[j+400>>2]=l^y[j+496>>2];i=h;h=h+16|0;if(h>>>0<=g>>>0){continue}break}}h=g&15;if(h){l=16-h|0;if(l){o(h|j+384,0,l);}if(h){t(j+384|0,f+i|0,h);}m=y[j+384>>2];n=y[j+388>>2];p=y[j+392>>2];k=y[j+396>>2];i=y[j+492>>2];f=y[j+488>>2];y[j+520>>2]=f;y[j+524>>2]=i;l=y[j+484>>2];h=y[j+480>>2];y[j+512>>2]=h;y[j+516>>2]=l;q=y[j+468>>2];y[j+176>>2]=y[j+464>>2];y[j+180>>2]=q;q=y[j+476>>2];y[j+184>>2]=y[j+472>>2];y[j+188>>2]=q;y[j+160>>2]=h;y[j+164>>2]=l;y[j+168>>2]=f;y[j+172>>2]=i;f=j+496|0;ia(f,j+176|0,j+160|0);h=y[j+508>>2];y[j+488>>2]=y[j+504>>2];y[j+492>>2]=h;h=y[j+500>>2];y[j+480>>2]=y[j+496>>2];y[j+484>>2]=h;h=y[j+452>>2];y[j+144>>2]=y[j+448>>2];y[j+148>>2]=h;h=y[j+460>>2];y[j+152>>2]=y[j+456>>2];y[j+156>>2]=h;h=y[j+468>>2];y[j+128>>2]=y[j+464>>2];y[j+132>>2]=h;h=y[j+476>>2];y[j+136>>2]=y[j+472>>2];y[j+140>>2]=h;ia(f,j+144|0,j+128|0);h=y[j+508>>2];y[j+472>>2]=y[j+504>>2];y[j+476>>2]=h;h=y[j+500>>2];y[j+464>>2]=y[j+496>>2];y[j+468>>2]=h;h=y[j+436>>2];y[j+112>>2]=y[j+432>>2];y[j+116>>2]=h;h=y[j+444>>2];y[j+120>>2]=y[j+440>>2];y[j+124>>2]=h;h=y[j+452>>2];y[j+96>>2]=y[j+448>>2];y[j+100>>2]=h;h=y[j+460>>2];y[j+104>>2]=y[j+456>>2];y[j+108>>2]=h;ia(f,j+112|0,j+96|0);h=y[j+508>>2];y[j+456>>2]=y[j+504>>2];y[j+460>>2]=h;h=y[j+500>>2];y[j+448>>2]=y[j+496>>2];y[j+452>>2]=h;h=y[j+420>>2];y[j+80>>2]=y[j+416>>2];y[j+84>>2]=h;h=y[j+428>>2];y[j+88>>2]=y[j+424>>2];y[j+92>>2]=h;h=y[j+436>>2];y[j+64>>2]=y[j+432>>2];y[j+68>>2]=h;h=y[j+444>>2];y[j+72>>2]=y[j+440>>2];y[j+76>>2]=h;ia(f,j+80|0,j- -64|0);h=y[j+508>>2];y[j+440>>2]=y[j+504>>2];y[j+444>>2]=h;h=y[j+500>>2];y[j+432>>2]=y[j+496>>2];y[j+436>>2]=h;h=y[j+404>>2];y[j+48>>2]=y[j+400>>2];y[j+52>>2]=h;h=y[j+412>>2];y[j+56>>2]=y[j+408>>2];y[j+60>>2]=h;h=y[j+420>>2];y[j+32>>2]=y[j+416>>2];y[j+36>>2]=h;h=y[j+428>>2];y[j+40>>2]=y[j+424>>2];y[j+44>>2]=h;ia(f,j+48|0,j+32|0);h=y[j+508>>2];y[j+424>>2]=y[j+504>>2];y[j+428>>2]=h;h=y[j+500>>2];y[j+416>>2]=y[j+496>>2];y[j+420>>2]=h;h=y[j+516>>2];y[j+16>>2]=y[j+512>>2];y[j+20>>2]=h;h=y[j+524>>2];y[j+24>>2]=y[j+520>>2];y[j+28>>2]=h;h=y[j+404>>2];y[j>>2]=y[j+400>>2];y[j+4>>2]=h;h=y[j+412>>2];y[j+8>>2]=y[j+408>>2];y[j+12>>2]=h;ia(f,j+16|0,j);y[j+412>>2]=k^y[j+508>>2];y[j+408>>2]=p^y[j+504>>2];y[j+404>>2]=n^y[j+500>>2];y[j+400>>2]=m^y[j+496>>2];}i=16;h=0;if(e>>>0>=16){while(1){Ge(a+h|0,d+h|0,j+400|0);h=i;i=h+16|0;if(i>>>0<=e>>>0){continue}break}}f=e&15;a:{if(!f){break a}i=16-f|0;if(i){o(f|j+384,0,i);}i=!f;if(!i){t(j+384|0,d+h|0,f);}d=j+512|0;Ge(d,j+384|0,j+400|0);if(i){break a}t(a+h|0,d,f);}Fe(b,c,g,e,j+400|0);T=j+528|0;return 0}function fa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;M=y[b+12>>2];q=M<<1;u=q>>31;S=M>>31;c=Ai(q,u,M,S);e=W;g=y[b+16>>2];v=g>>31;f=y[b+8>>2];x=f<<1;D=x>>31;k=Ai(g,v,x,D);d=k+c|0;c=W+e|0;c=d>>>0>>0?c+1|0:c;z=y[b+20>>2];o=z<<1;F=o>>31;h=y[b+4>>2];k=h<<1;r=k>>31;l=Ai(o,F,k,r);e=l+d|0;d=W+c|0;d=e>>>0>>0?d+1|0:d;p=y[b+24>>2];A=p>>31;G=y[b>>2];l=G<<1;s=l>>31;i=Ai(p,A,l,s);e=i+e|0;c=W+d|0;c=e>>>0>>0?c+1|0:c;d=e;H=y[b+32>>2];m=E(H,19);B=m>>31;P=H>>31;e=Ai(m,B,H,P);d=d+e|0;c=W+c|0;c=d>>>0>>0?c+1|0:c;_=y[b+36>>2];i=E(_,38);t=i>>31;I=y[b+28>>2];Q=I<<1;T=Q>>31;e=Ai(i,t,Q,T);d=e+d|0;b=W+c|0;C=d;e=d>>>0>>0?b+1|0:b;b=Ai(k,r,g,v);c=W;d=Ai(x,D,M,S);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;R=z>>31;j=Ai(z,R,l,s);b=j+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;j=Ai(m,B,Q,T);b=j+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=Ai(i,t,p,A);b=d+b|0;c=W+c|0;U=b;n=b>>>0>>0?c+1|0:c;c=Ai(k,r,q,u);d=W;b=f;w=b>>31;V=b;f=Ai(b,w,b,w);c=f+c|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;f=Ai(l,s,g,v);d=f+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;j=E(I,38);N=j>>31;X=I>>31;f=Ai(j,N,I,X);b=f+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;c=b;b=p<<1;f=Ai(m,B,b,b>>31);b=c+f|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=b;b=Ai(i,t,o,F);d=d+b|0;c=W+c|0;$=d;c=b>>>0>d>>>0?c+1|0:c;aa=c;b=c;d=d+33554432|0;b=d>>>0<33554432?b+1|0:b;ba=d;ca=b;c=b>>26;d=(b&67108863)<<6|d>>>26;b=d+U|0;c=c+n|0;U=b;c=b>>>0>>0?c+1|0:c;b=b+16777216|0;d=b>>>0<16777216?c+1|0:c;da=b;c=d>>25;b=(d&33554431)<<7|b>>>25;d=b+C|0;c=c+e|0;b=b>>>0>d>>>0?c+1|0:c;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;C=c;f=b;y[a+24>>2]=d-(c&-67108864);b=Ai(l,s,V,w);c=W;J=h>>31;e=Ai(k,r,h,J);b=e+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=E(p,19);O=e>>31;n=Ai(e,O,p,A);b=n+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;n=Ai(o,F,j,N);d=n+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;n=g<<1;Y=n>>31;K=Ai(m,B,n,Y);d=K+d|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;b=d;d=Ai(i,t,q,u);b=b+d|0;c=W+c|0;L=b;K=b>>>0>>0?c+1|0:c;b=Ai(o,F,e,O);c=W;h=Ai(l,s,h,J);b=h+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;h=Ai(g,v,j,N);b=h+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;h=Ai(m,B,q,u);d=h+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;h=Ai(i,t,V,w);d=h+d|0;c=W+b|0;Z=d;J=d>>>0>>0?c+1|0:c;b=E(z,38);d=Ai(b,b>>31,z,R);h=W;b=G;c=b>>31;G=d;d=Ai(b,c,b,c);b=G+d|0;c=W+h|0;c=b>>>0>>0?c+1|0:c;e=Ai(e,O,n,Y);b=e+b|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;e=Ai(q,u,j,N);b=e+b|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;e=Ai(m,B,x,D);d=e+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;e=Ai(k,r,i,t);d=e+d|0;c=W+b|0;h=d;c=d>>>0>>0?c+1|0:c;G=c;d=d+33554432|0;c=d>>>0<33554432?c+1|0:c;O=d;ea=c;b=c>>26;c=(c&67108863)<<6|d>>>26;e=c+Z|0;d=b+J|0;J=e;c=c>>>0>e>>>0?d+1|0:d;d=e+16777216|0;c=d>>>0<16777216?c+1|0:c;Z=d;e=(c&33554431)<<7|d>>>25;d=e+L|0;c=(c>>25)+K|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;K=b;e=c;y[a+8>>2]=d-(b&-67108864);b=Ai(x,D,z,R);c=W;d=Ai(g,v,q,u);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(k,r,p,A);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(l,s,I,X);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(i,t,H,P);L=d+b|0;b=W+c|0;d=d>>>0>L>>>0?b+1|0:b;c=f>>26;f=(f&67108863)<<6|C>>>26;b=f+L|0;d=c+d|0;C=b;c=b>>>0>>0?d+1|0:d;b=b+16777216|0;c=b>>>0<16777216?c+1|0:c;L=b;f=c;y[a+28>>2]=C-(b&-33554432);b=Ai(l,s,M,S);d=W;w=Ai(k,r,V,w);c=w+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;j=Ai(p,A,j,N);c=j+c|0;d=W+b|0;m=Ai(m,B,o,F);b=m+c|0;c=W+(c>>>0>>0?d+1|0:d)|0;c=b>>>0>>0?c+1|0:c;d=Ai(i,t,g,v);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=e>>26;C=b;b=(e&67108863)<<6|K>>>26;e=C+b|0;c=c+d|0;d=e;b=d>>>0>>0?c+1|0:c;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;m=c;e=b;y[a+12>>2]=d-(c&-33554432);b=Ai(p,A,x,D);c=W;d=Ai(g,v,g,v);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;d=Ai(q,u,o,F);b=d+b|0;c=W+c|0;c=b>>>0>>0?c+1|0:c;g=Ai(k,r,Q,T);d=g+b|0;b=W+c|0;b=d>>>0>>0?b+1|0:b;g=Ai(l,s,H,P);c=g+d|0;d=W+b|0;d=c>>>0>>0?d+1|0:d;b=i;i=_;o=i>>31;g=Ai(b,t,i,o);b=g+c|0;c=W+d|0;c=b>>>0>>0?c+1|0:c;d=b;b=f>>25;f=(f&33554431)<<7|L>>>25;d=d+f|0;c=b+c|0;c=d>>>0>>0?c+1|0:c;b=d+33554432|0;c=b>>>0<33554432?c+1|0:c;g=b;f=c;y[a+32>>2]=d-(b&-67108864);j=U-(da&-33554432)|0;c=e>>25;e=(e&33554431)<<7|m>>>25;b=ba&-67108864;d=e+($-b|0)|0;b=c+(aa-((b>>>0>$>>>0)+ca|0)|0)|0;b=d>>>0>>0?b+1|0:b;e=d;d=d+33554432|0;c=d>>>0<33554432?b+1|0:b;b=((c&67108863)<<6|d>>>26)+j|0;y[a+20>>2]=b;y[a+16>>2]=e-(d&-67108864);b=Ai(q,u,p,A);d=W;e=Ai(z,R,n,Y);c=e+b|0;b=W+d|0;b=c>>>0>>0?b+1|0:b;e=Ai(x,D,I,X);d=e+c|0;c=W+b|0;c=d>>>0>>0?c+1|0:c;e=Ai(k,r,H,P);b=e+d|0;d=W+c|0;d=b>>>0>>0?d+1|0:d;c=b;b=Ai(l,s,i,o);e=c+b|0;c=W+d|0;b=b>>>0>e>>>0?c+1|0:c;c=f>>26;f=(f&67108863)<<6|g>>>26;d=f+e|0;c=b+c|0;b=d>>>0>>0?c+1|0:c;c=d+16777216|0;b=c>>>0<16777216?b+1|0:b;y[a+36>>2]=d-(c&-33554432);f=J-(Z&-33554432)|0;d=O&-67108864;e=h-d|0;k=G-((d>>>0>h>>>0)+ea|0)|0;b=Ai((b&33554431)<<7|c>>>25,b>>25,19,0);d=b+e|0;c=W+k|0;b=b>>>0>d>>>0?c+1|0:c;c=d+33554432|0;b=c>>>0<33554432?b+1|0:b;b=((b&67108863)<<6|c>>>26)+f|0;y[a+4>>2]=b;y[a>>2]=d-(c&-67108864);}function af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);s=f^1886610805;g=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);q=g^1936682341;f=f^1852142177;h=g^1819895653;o=c;v=c&7;g=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);t=g^1852075907;c=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);r=c^1685025377;i=g^2037671283;g=c^1952801890;c=o&-8;if(c){n=b+c|0;while(1){u=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);p=g^u;c=p+h|0;k=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);d=i^k;e=f+d|0;i=e;c=e>>>0>>0?c+1|0:c;l=c;c=q+r|0;h=s+t|0;c=h>>>0>>0?c+1|0:c;f=Ci(t,r,13)^h;j=i+f|0;g=c;e=c^W;c=l+e|0;c=f>>>0>j>>>0?c+1|0:c;f=Ci(f,e,17)^j;m=c;e=c^W;r=Ci(f,e,13);q=W;c=Ci(d,p,16);d=l^W;p=c^i;g=Ci(h,g,32);h=p+g|0;c=W+d|0;g=g>>>0>h>>>0?c+1|0:c;c=g+e|0;i=f+h|0;c=i>>>0>>0?c+1|0:c;f=i^r;l=c;e=c^q;r=Ci(f,e,17);q=W;c=Ci(p,d,21);d=g^W;p=c^h;g=Ci(j,m,32);h=p+g|0;c=W+d|0;g=g>>>0>h>>>0?c+1|0:c;c=g+e|0;f=f+h|0;c=f>>>0>>0?c+1|0:c;t=f^r;e=c;r=c^q;c=Ci(p,d,16);g=g^W;j=g;c=c^h;m=Ci(c,g,21);h=W;g=Ci(i,l,32);l=g+c|0;c=W+j|0;i=m^l;c=g>>>0>l>>>0?c+1|0:c;g=c^h;f=Ci(f,e,32);h=W;s=k^l;q=c^u;b=b+8|0;if((n|0)!=(b|0)){continue}break}b=n;}j=0;d=o<<24;a:{switch(v-1|0){case 6:d=d|z[b+6|0]<<16;case 5:d=d|z[b+5|0]<<8;case 4:d=d|z[b+4|0];case 3:e=z[b+3|0];c=0;j=j|e<<24;d=c|d;case 2:e=z[b+2|0];c=0;j=j|e<<16;d=c|d;case 1:e=z[b+1|0];c=0;j=j|e<<8;d=c|d;case 0:j=z[b|0]|j;break;default:break a}}m=d;b=d^g;d=b;e=j^i;c=Ci(e,b,16);b=W;d=d+h|0;i=e+f|0;d=i>>>0>>0?d+1|0:d;e=c^i;l=d;d=d^b;k=Ci(e,d,21);g=W;c=q+r|0;f=s+t|0;c=f>>>0>>0?c+1|0:c;b=c;h=e;e=Ci(f,c,32);h=h+e|0;c=W+d|0;c=e>>>0>h>>>0?c+1|0:c;e=h^k;d=g;g=c;d=d^c;q=Ci(e,d,16);o=W;c=i;n=Ci(t,r,13)^f;i=n;f=c+i|0;k=W^b;c=k+l|0;l=e;b=f;c=b>>>0>>0?c+1|0:c;e=Ci(b,c,32);i=l+e|0;d=W+d|0;f=e>>>0>i>>>0?d+1|0:d;e=f^o;p=e;o=i^q;l=o;k=Ci(n,k,17)^b;b=k;d=b+h|0;h=W^c;c=h+g|0;c=b>>>0>d>>>0?c+1|0:c;b=c;g=Ci(d,c,32);l=g+l|0;c=W+e|0;j=j^l;g=g>>>0>l>>>0?c+1|0:c;m=g^m;c=Ci(k,h,13);b=b^W;h=b;e=c^d;c=Ci(e,b,17);b=W;d=f+h|0;f=e+i|0;d=f>>>0>>0?d+1|0:d;e=c^f;i=e+j|0;b=b^d;c=b+m|0;c=e>>>0>i>>>0?c+1|0:c;e=Ci(e,b,13)^i;h=c;b=c^W;n=Ci(e,b,17);j=W;m=Ci(o,p,21);o=g^W;k=m^l;d=Ci(f,d,32)^238;f=k+d|0;c=W+o|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;l=e+f|0;c=l>>>0>>0?c+1|0:c;e=l^n;g=c;b=c^j;j=Ci(e,b,13);m=W;c=Ci(k,o,16);n=d^W;k=c^f;c=Ci(i,h,32);f=k+c|0;d=W+n|0;d=c>>>0>f>>>0?d+1|0:d;c=d+b|0;i=e+f|0;c=i>>>0>>0?c+1|0:c;e=j^i;h=c;b=c^m;j=Ci(e,b,17);m=W;c=Ci(k,n,21);n=d^W;k=c^f;d=Ci(l,g,32);f=k+d|0;c=W+n|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;l=e+f|0;c=l>>>0>>0?c+1|0:c;e=j^l;g=c;b=c^m;j=Ci(e,b,13);m=W;c=Ci(k,n,16);n=d^W;k=c^f;d=Ci(i,h,32);f=k+d|0;c=W+n|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;i=e+f|0;c=i>>>0>>0?c+1|0:c;e=j^i;h=c;b=c^m;j=Ci(e,b,17);m=W;c=Ci(k,n,21);n=d^W;k=c^f;d=Ci(l,g,32);f=k+d|0;c=W+n|0;c=d>>>0>f>>>0?c+1|0:c;d=c+b|0;l=e+f|0;d=l>>>0>>0?d+1|0:d;e=j^l;g=d;b=d^m;j=Ci(e,b,13);m=W;d=Ci(k,n,16);n=c^W;k=d^f;d=Ci(i,h,32);f=k+d|0;c=W+n|0;d=d>>>0>f>>>0?c+1|0:c;c=d+b|0;i=e+f|0;c=i>>>0>>0?c+1|0:c;e=j^i;h=c;b=c^m;j=Ci(e,b,17);m=W;c=Ci(k,n,21);n=d^W;k=c^f;c=Ci(l,g,32);g=k+c|0;d=W+n|0;f=c>>>0>g>>>0?d+1|0:d;c=f+b|0;e=e+g|0;b=e>>>0>>0?c+1|0:c;d=b^m;l=d;j=e^j;c=Ci(k,n,16);k=f^W;g=c^g;f=Ci(i,h,32);h=g+f|0;c=W+k|0;b=Ci(e,b,32);i=W;c=f>>>0>h>>>0?c+1|0:c;e=c;f=a;g=Ci(g,k,21)^h;m=g^(b^(h^j));w[f|0]=m;w[f+1|0]=m>>>8;w[f+2|0]=m>>>16;w[f+3|0]=m>>>24;k=i^(c^d);d=c^W;c=k^d;w[f+4|0]=c;w[f+5|0]=c>>>8;w[f+6|0]=c>>>16;w[f+7|0]=c>>>24;c=d+i|0;f=b;b=b+g|0;c=f>>>0>b>>>0?c+1|0:c;m=b;f=Ci(g,d,16)^b;g=c;d=c^W;k=d;b=e;e=l;c=b+e|0;b=h;j=j^221;h=j;b=b+h|0;c=b>>>0>>0?c+1|0:c;h=Ci(b,c,32);i=h+f|0;d=W+d|0;f=Ci(f,k,21)^i;h=h>>>0>i>>>0?d+1|0:d;d=h^W;o=Ci(f,d,16);k=W;e=Ci(j,e,13);n=c^W;c=g+n|0;j=b^e;e=m+j|0;c=e>>>0>>0?c+1|0:c;b=c;g=f;f=Ci(e,c,32);l=g+f|0;c=W+d|0;g=f>>>0>l>>>0?c+1|0:c;c=g^k;k=c;o=l^o;m=Ci(o,c,21);f=W;c=Ci(j,n,17);n=b^W;d=h+n|0;j=c^e;e=i+j|0;d=e>>>0>>0?d+1|0:d;b=Ci(e,d,32);c=k+W|0;h=f;b=b+o|0;f=b>>>0>>0?c+1|0:c;c=h^f;k=c;h=b;o=m^b;m=Ci(o,c,16);i=W;b=Ci(j,n,13);n=d^W;c=g+n|0;j=b^e;e=l+j|0;c=e>>>0>>0?c+1|0:c;d=c;b=Ci(e,c,32);c=k+W|0;b=b+o|0;g=b>>>0>>0?c+1|0:c;c=g^i;k=c;l=b;o=m^b;m=Ci(o,c,21);i=W;b=Ci(j,n,17);n=d^W;c=f+n|0;j=b^e;e=h+j|0;c=e>>>0>>0?c+1|0:c;d=c;b=Ci(e,c,32);c=k+W|0;b=b+o|0;f=b>>>0>>0?c+1|0:c;c=f^i;k=c;h=b;o=m^b;m=Ci(o,c,16);i=W;b=Ci(j,n,13);j=d^W;c=g+j|0;g=b^e;e=l+g|0;c=e>>>0>>0?c+1|0:c;b=Ci(e,c,32);d=k+W|0;b=b+o|0;d=b>>>0>>0?d+1|0:d;m=Ci(b^m,d^i,21);i=W;e=Ci(g,j,17)^e;c=c^W;l=Ci(e,c,13);c=c+f|0;e=e+h|0;c=W^(e>>>0>>0?c+1|0:c);g=e^l;f=Ci(g,c,17)^m;e=W^i;c=c+d|0;d=b;b=b+g|0;c=d>>>0>b>>>0?c+1|0:c;b=Ci(b,c,32)^f^b;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=c^(W^e);w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;return 0}function Ne(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,z=0,A=0,B=0,C=0;f=T-288|0;T=f;i=y[e+44>>2]^d>>>29;j=y[e+40>>2]^d<<3;k=y[e+36>>2]^c>>>29;d=y[e+32>>2]^c<<3;g=e- -64|0;while(1){c=y[e+124>>2];y[f+280>>2]=y[e+120>>2];y[f+284>>2]=c;c=y[e+116>>2];y[f+272>>2]=y[e+112>>2];y[f+276>>2]=c;c=y[e+100>>2];y[f+240>>2]=y[e+96>>2];y[f+244>>2]=c;c=y[e+108>>2];y[f+248>>2]=y[e+104>>2];y[f+252>>2]=c;c=y[e+116>>2];y[f+224>>2]=y[e+112>>2];y[f+228>>2]=c;c=y[e+124>>2];y[f+232>>2]=y[e+120>>2];y[f+236>>2]=c;h=f+256|0;ia(h,f+240|0,f+224|0);c=y[f+268>>2];y[e+120>>2]=y[f+264>>2];y[e+124>>2]=c;c=y[f+260>>2];y[e+112>>2]=y[f+256>>2];y[e+116>>2]=c;c=y[e+84>>2];y[f+208>>2]=y[e+80>>2];y[f+212>>2]=c;c=y[e+92>>2];y[f+216>>2]=y[e+88>>2];y[f+220>>2]=c;c=y[e+100>>2];y[f+192>>2]=y[e+96>>2];y[f+196>>2]=c;c=y[e+108>>2];y[f+200>>2]=y[e+104>>2];y[f+204>>2]=c;ia(h,f+208|0,f+192|0);c=y[f+268>>2];y[e+104>>2]=y[f+264>>2];y[e+108>>2]=c;c=y[f+260>>2];y[e+96>>2]=y[f+256>>2];y[e+100>>2]=c;c=y[g+4>>2];y[f+176>>2]=y[g>>2];y[f+180>>2]=c;c=y[g+12>>2];y[f+184>>2]=y[g+8>>2];y[f+188>>2]=c;c=y[e+84>>2];y[f+160>>2]=y[e+80>>2];y[f+164>>2]=c;c=y[e+92>>2];y[f+168>>2]=y[e+88>>2];y[f+172>>2]=c;ia(h,f+176|0,f+160|0);c=y[f+268>>2];y[e+88>>2]=y[f+264>>2];y[e+92>>2]=c;c=y[f+260>>2];y[e+80>>2]=y[f+256>>2];y[e+84>>2]=c;c=y[e+52>>2];y[f+144>>2]=y[e+48>>2];y[f+148>>2]=c;c=y[e+60>>2];y[f+152>>2]=y[e+56>>2];y[f+156>>2]=c;c=y[g+4>>2];y[f+128>>2]=y[g>>2];y[f+132>>2]=c;c=y[g+12>>2];y[f+136>>2]=y[g+8>>2];y[f+140>>2]=c;ia(h,f+144|0,f+128|0);c=y[f+268>>2];y[g+8>>2]=y[f+264>>2];y[g+12>>2]=c;c=y[f+260>>2];y[g>>2]=y[f+256>>2];y[g+4>>2]=c;c=y[e+36>>2];y[f+112>>2]=y[e+32>>2];y[f+116>>2]=c;c=y[e+44>>2];y[f+120>>2]=y[e+40>>2];y[f+124>>2]=c;c=y[e+52>>2];y[f+96>>2]=y[e+48>>2];y[f+100>>2]=c;c=y[e+60>>2];y[f+104>>2]=y[e+56>>2];y[f+108>>2]=c;ia(h,f+112|0,f+96|0);c=y[f+268>>2];y[e+56>>2]=y[f+264>>2];y[e+60>>2]=c;c=y[f+260>>2];y[e+48>>2]=y[f+256>>2];y[e+52>>2]=c;c=y[e+20>>2];y[f+80>>2]=y[e+16>>2];y[f+84>>2]=c;c=y[e+28>>2];y[f+88>>2]=y[e+24>>2];y[f+92>>2]=c;c=y[e+36>>2];y[f+64>>2]=y[e+32>>2];y[f+68>>2]=c;c=y[e+44>>2];y[f+72>>2]=y[e+40>>2];y[f+76>>2]=c;ia(h,f+80|0,f- -64|0);c=y[f+268>>2];y[e+40>>2]=y[f+264>>2];y[e+44>>2]=c;c=y[f+260>>2];y[e+32>>2]=y[f+256>>2];y[e+36>>2]=c;c=y[e+4>>2];y[f+48>>2]=y[e>>2];y[f+52>>2]=c;c=y[e+12>>2];y[f+56>>2]=y[e+8>>2];y[f+60>>2]=c;c=y[e+20>>2];y[f+32>>2]=y[e+16>>2];y[f+36>>2]=c;c=y[e+28>>2];y[f+40>>2]=y[e+24>>2];y[f+44>>2]=c;ia(h,f+48|0,f+32|0);c=y[f+268>>2];y[e+24>>2]=y[f+264>>2];y[e+28>>2]=c;c=y[f+260>>2];y[e+16>>2]=y[f+256>>2];y[e+20>>2]=c;c=y[f+276>>2];y[f+16>>2]=y[f+272>>2];y[f+20>>2]=c;c=y[f+284>>2];y[f+24>>2]=y[f+280>>2];y[f+28>>2]=c;c=y[e+4>>2];y[f>>2]=y[e>>2];y[f+4>>2]=c;c=y[e+12>>2];y[f+8>>2]=y[e+8>>2];y[f+12>>2]=c;ia(h,f+16|0,f);c=y[f+268>>2];y[e+8>>2]=y[f+264>>2];y[e+12>>2]=c;c=y[f+260>>2];y[e>>2]=y[f+256>>2];y[e+4>>2]=c;n=i^y[e+12>>2];y[e+12>>2]=n;p=j^y[e+8>>2];y[e+8>>2]=p;q=k^y[e+4>>2];y[e+4>>2]=q;r=d^y[e>>2];y[e>>2]=r;u=d^y[g>>2];y[g>>2]=u;v=k^y[e+68>>2];y[e+68>>2]=v;x=j^y[e+72>>2];y[e+72>>2]=x;z=i^y[e+76>>2];y[e+76>>2]=z;l=l+1|0;if((l|0)!=7){continue}break}a:{b:{c:{c=b-16|0;if(c){if((c|0)==16){break c}break b}A=y[e+16>>2];B=y[e+48>>2];C=y[e+32>>2];s=y[e+96>>2];t=y[e+80>>2];m=y[e+20>>2];g=y[e+52>>2];h=y[e+36>>2];i=y[e+100>>2];j=y[e+84>>2];k=y[e+24>>2];l=y[e+56>>2];d=y[e+40>>2];c=y[e+104>>2];b=y[e+88>>2];e=n^(y[e+28>>2]^(y[e+60>>2]^(y[e+44>>2]^(y[e+92>>2]^y[e+108>>2])))^z);w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;b=p^(b^c^d^l^k^x);w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(v^(m^(g^(i^j^h))));w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(u^(A^(B^(C^(s^t)))));w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;break a}g=y[e+16>>2];h=y[e+48>>2];i=y[e+32>>2];j=y[e+20>>2];k=y[e+52>>2];l=y[e+36>>2];d=y[e+24>>2];c=y[e+56>>2];b=y[e+40>>2];m=n^(y[e+28>>2]^(y[e+60>>2]^y[e+44>>2]));w[a+12|0]=m;w[a+13|0]=m>>>8;w[a+14|0]=m>>>16;w[a+15|0]=m>>>24;b=p^(d^(b^c));w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(j^(k^l));w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(g^(h^i));w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;s=y[e+80>>2];t=y[e- -64>>2];m=y[e+112>>2];g=y[e+96>>2];h=y[e+84>>2];i=y[e+68>>2];j=y[e+116>>2];k=y[e+100>>2];l=y[e+88>>2];d=y[e+72>>2];c=y[e+120>>2];b=y[e+104>>2];e=y[e+92>>2]^(y[e+76>>2]^(y[e+124>>2]^y[e+108>>2]));w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;b=l^(d^(b^c));w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=h^(i^(j^k));w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=s^(t^(g^m));w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;break a}if(!b){break a}o(a,0,b);}T=f+288|0;}function wi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0;k=T;z=k;k=k-224&-32;T=k;Qe(i,h,k+96|0);h=0;if(g>>>0>63){i=64;while(1){Pe(f+h|0,k+96|0);h=i;i=h- -64|0;if(i>>>0<=g>>>0){continue}break}}i=h|32;if(i>>>0<=g>>>0){while(1){$b(f+h|0,k+96|0);h=i;i=h+32|0;if(i>>>0<=g>>>0){continue}break}}i=g&31;if(i){l=32-i|0;if(l){o(i|k- -64,0,l);}if(i){t(k- -64|0,f+h|0,i);}$b(k- -64|0,k+96|0);}a:{if(!a){f=32;h=0;if(c>>>0<32){break a}while(1){Me(k+32|0,b+h|0,k+96|0);h=f;f=f+32|0;if(f>>>0<=c>>>0){continue}break}break a}f=32;h=0;if(c>>>0<32){break a}while(1){Me(a+h|0,b+h|0,k+96|0);h=f;f=f+32|0;if(f>>>0<=c>>>0){continue}break}}i=c&31;if(i){u=a?a+h|0:k+32|0;m=b+h|0;f=k+96|0;b=T-320|0;T=b;h=i+(b+256|0)|0;l=32-i|0;j=!l;if(!j){o(h,0,l);}v=!i;if(!v){t(b+256|0,m,i);}A=y[f+16>>2];B=y[f+48>>2];C=y[f+20>>2];D=y[f+52>>2];E=y[f+24>>2];F=y[f+56>>2];G=y[f+28>>2];H=y[f+60>>2];m=y[f+32>>2];I=y[f+80>>2];J=y[f+112>>2];n=y[f+96>>2];p=y[f+36>>2];K=y[f+84>>2];L=y[f+116>>2];q=y[f+100>>2];r=y[f+40>>2];M=y[f+88>>2];N=y[f+120>>2];s=y[f+104>>2];O=y[b+256>>2];P=y[b+260>>2];Q=y[b+264>>2];R=y[b+268>>2];S=y[b+272>>2];U=y[b+276>>2];V=y[b+280>>2];w=y[f+44>>2];x=y[f+108>>2];y[b+284>>2]=w^(x&y[f+124>>2]^(y[f+92>>2]^y[b+284>>2]));y[b+280>>2]=s&N^(M^V)^r;y[b+276>>2]=q&L^(K^U)^p;y[b+272>>2]=n&J^(I^S)^m;y[b+268>>2]=x^(H&w^(G^R));y[b+264>>2]=r&F^(E^Q)^s;y[b+260>>2]=p&D^(C^P)^q;y[b+256>>2]=m&B^(A^O)^n;if(!j){o(h,0,l);}if(!v){t(u,b+256|0,i);}l=y[b+284>>2];m=y[b+280>>2];n=y[b+276>>2];p=y[b+272>>2];q=y[b+256>>2];r=y[b+260>>2];s=y[b+264>>2];u=y[b+268>>2];h=y[f+124>>2];y[b+312>>2]=y[f+120>>2];y[b+316>>2]=h;h=y[f+116>>2];y[b+304>>2]=y[f+112>>2];y[b+308>>2]=h;h=y[f+100>>2];y[b+240>>2]=y[f+96>>2];y[b+244>>2]=h;h=y[f+108>>2];y[b+248>>2]=y[f+104>>2];y[b+252>>2]=h;h=y[f+116>>2];y[b+224>>2]=y[f+112>>2];y[b+228>>2]=h;h=y[f+124>>2];y[b+232>>2]=y[f+120>>2];y[b+236>>2]=h;h=b+288|0;ia(h,b+240|0,b+224|0);i=y[b+300>>2];y[f+120>>2]=y[b+296>>2];y[f+124>>2]=i;i=y[b+292>>2];y[f+112>>2]=y[b+288>>2];y[f+116>>2]=i;i=y[f+84>>2];y[b+208>>2]=y[f+80>>2];y[b+212>>2]=i;i=y[f+92>>2];y[b+216>>2]=y[f+88>>2];y[b+220>>2]=i;i=y[f+100>>2];y[b+192>>2]=y[f+96>>2];y[b+196>>2]=i;i=y[f+108>>2];y[b+200>>2]=y[f+104>>2];y[b+204>>2]=i;ia(h,b+208|0,b+192|0);i=y[b+300>>2];y[f+104>>2]=y[b+296>>2];y[f+108>>2]=i;i=y[b+292>>2];y[f+96>>2]=y[b+288>>2];y[f+100>>2]=i;i=f- -64|0;j=y[i+4>>2];y[b+176>>2]=y[i>>2];y[b+180>>2]=j;j=y[f+76>>2];y[b+184>>2]=y[f+72>>2];y[b+188>>2]=j;j=y[f+84>>2];y[b+160>>2]=y[f+80>>2];y[b+164>>2]=j;j=y[f+92>>2];y[b+168>>2]=y[f+88>>2];y[b+172>>2]=j;ia(h,b+176|0,b+160|0);j=y[b+300>>2];y[f+88>>2]=y[b+296>>2];y[f+92>>2]=j;j=y[b+292>>2];y[f+80>>2]=y[b+288>>2];y[f+84>>2]=j;j=y[f+52>>2];y[b+144>>2]=y[f+48>>2];y[b+148>>2]=j;j=y[f+60>>2];y[b+152>>2]=y[f+56>>2];y[b+156>>2]=j;j=y[i+4>>2];y[b+128>>2]=y[i>>2];y[b+132>>2]=j;j=y[f+76>>2];y[b+136>>2]=y[f+72>>2];y[b+140>>2]=j;ia(h,b+144|0,b+128|0);j=y[b+300>>2];y[f+72>>2]=y[b+296>>2];y[f+76>>2]=j;j=y[b+292>>2];y[i>>2]=y[b+288>>2];y[i+4>>2]=j;j=y[f+36>>2];y[b+112>>2]=y[f+32>>2];y[b+116>>2]=j;j=y[f+44>>2];y[b+120>>2]=y[f+40>>2];y[b+124>>2]=j;j=y[f+52>>2];y[b+96>>2]=y[f+48>>2];y[b+100>>2]=j;j=y[f+60>>2];y[b+104>>2]=y[f+56>>2];y[b+108>>2]=j;ia(h,b+112|0,b+96|0);j=y[b+300>>2];y[f+56>>2]=y[b+296>>2];y[f+60>>2]=j;j=y[b+292>>2];y[f+48>>2]=y[b+288>>2];y[f+52>>2]=j;j=y[f+20>>2];y[b+80>>2]=y[f+16>>2];y[b+84>>2]=j;j=y[f+28>>2];y[b+88>>2]=y[f+24>>2];y[b+92>>2]=j;j=y[f+36>>2];y[b+64>>2]=y[f+32>>2];y[b+68>>2]=j;j=y[f+44>>2];y[b+72>>2]=y[f+40>>2];y[b+76>>2]=j;ia(h,b+80|0,b- -64|0);j=y[b+300>>2];y[f+40>>2]=y[b+296>>2];y[f+44>>2]=j;j=y[b+292>>2];y[f+32>>2]=y[b+288>>2];y[f+36>>2]=j;j=y[f+4>>2];y[b+48>>2]=y[f>>2];y[b+52>>2]=j;j=y[f+12>>2];y[b+56>>2]=y[f+8>>2];y[b+60>>2]=j;j=y[f+20>>2];y[b+32>>2]=y[f+16>>2];y[b+36>>2]=j;j=y[f+28>>2];y[b+40>>2]=y[f+24>>2];y[b+44>>2]=j;ia(h,b+48|0,b+32|0);j=y[b+300>>2];y[f+24>>2]=y[b+296>>2];y[f+28>>2]=j;j=y[b+292>>2];y[f+16>>2]=y[b+288>>2];y[f+20>>2]=j;j=y[b+308>>2];y[b+16>>2]=y[b+304>>2];y[b+20>>2]=j;j=y[b+316>>2];y[b+24>>2]=y[b+312>>2];y[b+28>>2]=j;j=y[f+4>>2];y[b>>2]=y[f>>2];y[b+4>>2]=j;j=y[f+12>>2];y[b+8>>2]=y[f+8>>2];y[b+12>>2]=j;ia(h,b+16|0,b);h=y[b+300>>2];y[f+8>>2]=y[b+296>>2];y[f+12>>2]=h;h=y[b+292>>2];y[f>>2]=y[b+288>>2];y[f+4>>2]=h;y[f+12>>2]=u^y[f+12>>2];y[f+8>>2]=s^y[f+8>>2];y[f+4>>2]=r^y[f+4>>2];y[f>>2]=q^y[f>>2];y[i>>2]=p^y[i>>2];y[f+68>>2]=n^y[f+68>>2];y[f+72>>2]=m^y[f+72>>2];y[f+76>>2]=l^y[f+76>>2];T=b+320|0;}Ne(k,e,g,c,k+96|0);h=-1;b:{c:{b=e-16|0;if(b){if((b|0)==16){break c}break b}h=db(k,d);break b}h=kb(k,d);}if(!(!c|(!a|!h))){o(a,0,c);}T=z;return h|0}function He(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c=T-416|0;T=c;g=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);h=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);i=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);j=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);f=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);k=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);l=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);m=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=y[b+92>>2];y[c+408>>2]=y[b+88>>2];y[c+412>>2]=a;a=y[b+84>>2];y[c+400>>2]=y[b+80>>2];y[c+404>>2]=a;e=b- -64|0;a=e;d=y[a+4>>2];y[c+368>>2]=y[a>>2];y[c+372>>2]=d;a=y[b+76>>2];y[c+376>>2]=y[b+72>>2];y[c+380>>2]=a;a=y[b+84>>2];y[c+352>>2]=y[b+80>>2];y[c+356>>2]=a;a=y[b+92>>2];y[c+360>>2]=y[b+88>>2];y[c+364>>2]=a;a=c+384|0;ia(a,c+368|0,c+352|0);d=y[c+396>>2];y[b+88>>2]=y[c+392>>2];y[b+92>>2]=d;d=y[c+388>>2];y[b+80>>2]=y[c+384>>2];y[b+84>>2]=d;d=y[b+52>>2];y[c+336>>2]=y[b+48>>2];y[c+340>>2]=d;d=y[b+60>>2];y[c+344>>2]=y[b+56>>2];y[c+348>>2]=d;d=y[e+4>>2];y[c+320>>2]=y[e>>2];y[c+324>>2]=d;d=y[b+76>>2];y[c+328>>2]=y[b+72>>2];y[c+332>>2]=d;ia(a,c+336|0,c+320|0);d=y[c+396>>2];y[b+72>>2]=y[c+392>>2];y[b+76>>2]=d;d=y[c+388>>2];y[e>>2]=y[c+384>>2];y[e+4>>2]=d;d=y[b+36>>2];y[c+304>>2]=y[b+32>>2];y[c+308>>2]=d;d=y[b+44>>2];y[c+312>>2]=y[b+40>>2];y[c+316>>2]=d;d=y[b+52>>2];y[c+288>>2]=y[b+48>>2];y[c+292>>2]=d;d=y[b+60>>2];y[c+296>>2]=y[b+56>>2];y[c+300>>2]=d;ia(a,c+304|0,c+288|0);d=y[c+396>>2];y[b+56>>2]=y[c+392>>2];y[b+60>>2]=d;d=y[c+388>>2];y[b+48>>2]=y[c+384>>2];y[b+52>>2]=d;d=y[b+20>>2];y[c+272>>2]=y[b+16>>2];y[c+276>>2]=d;d=y[b+28>>2];y[c+280>>2]=y[b+24>>2];y[c+284>>2]=d;d=y[b+36>>2];y[c+256>>2]=y[b+32>>2];y[c+260>>2]=d;d=y[b+44>>2];y[c+264>>2]=y[b+40>>2];y[c+268>>2]=d;ia(a,c+272|0,c+256|0);d=y[c+396>>2];y[b+40>>2]=y[c+392>>2];y[b+44>>2]=d;d=y[c+388>>2];y[b+32>>2]=y[c+384>>2];y[b+36>>2]=d;d=y[b+4>>2];y[c+240>>2]=y[b>>2];y[c+244>>2]=d;d=y[b+12>>2];y[c+248>>2]=y[b+8>>2];y[c+252>>2]=d;d=y[b+20>>2];y[c+224>>2]=y[b+16>>2];y[c+228>>2]=d;d=y[b+28>>2];y[c+232>>2]=y[b+24>>2];y[c+236>>2]=d;ia(a,c+240|0,c+224|0);d=y[c+396>>2];y[b+24>>2]=y[c+392>>2];y[b+28>>2]=d;d=y[c+388>>2];y[b+16>>2]=y[c+384>>2];y[b+20>>2]=d;d=y[c+404>>2];y[c+208>>2]=y[c+400>>2];y[c+212>>2]=d;d=y[c+412>>2];y[c+216>>2]=y[c+408>>2];y[c+220>>2]=d;d=y[b+4>>2];y[c+192>>2]=y[b>>2];y[c+196>>2]=d;d=y[b+12>>2];y[c+200>>2]=y[b+8>>2];y[c+204>>2]=d;ia(a,c+208|0,c+192|0);d=y[c+384>>2];n=y[c+388>>2];o=y[c+392>>2];y[b+12>>2]=y[c+396>>2]^l;y[b+8>>2]=k^o;y[b+4>>2]=f^n;y[b>>2]=d^m;f=y[b+92>>2];y[c+408>>2]=y[b+88>>2];y[c+412>>2]=f;f=y[b+84>>2];y[c+400>>2]=y[b+80>>2];y[c+404>>2]=f;f=y[e+4>>2];y[c+176>>2]=y[e>>2];y[c+180>>2]=f;f=y[b+76>>2];y[c+184>>2]=y[b+72>>2];y[c+188>>2]=f;f=y[b+84>>2];y[c+160>>2]=y[b+80>>2];y[c+164>>2]=f;f=y[b+92>>2];y[c+168>>2]=y[b+88>>2];y[c+172>>2]=f;ia(a,c+176|0,c+160|0);f=y[c+396>>2];y[b+88>>2]=y[c+392>>2];y[b+92>>2]=f;f=y[c+388>>2];y[b+80>>2]=y[c+384>>2];y[b+84>>2]=f;f=y[b+52>>2];y[c+144>>2]=y[b+48>>2];y[c+148>>2]=f;f=y[b+60>>2];y[c+152>>2]=y[b+56>>2];y[c+156>>2]=f;f=y[e+4>>2];y[c+128>>2]=y[e>>2];y[c+132>>2]=f;f=y[b+76>>2];y[c+136>>2]=y[b+72>>2];y[c+140>>2]=f;ia(a,c+144|0,c+128|0);f=y[c+396>>2];y[b+72>>2]=y[c+392>>2];y[b+76>>2]=f;f=y[c+388>>2];y[e>>2]=y[c+384>>2];y[e+4>>2]=f;e=y[b+36>>2];y[c+112>>2]=y[b+32>>2];y[c+116>>2]=e;e=y[b+44>>2];y[c+120>>2]=y[b+40>>2];y[c+124>>2]=e;e=y[b+52>>2];y[c+96>>2]=y[b+48>>2];y[c+100>>2]=e;e=y[b+60>>2];y[c+104>>2]=y[b+56>>2];y[c+108>>2]=e;ia(a,c+112|0,c+96|0);e=y[c+396>>2];y[b+56>>2]=y[c+392>>2];y[b+60>>2]=e;e=y[c+388>>2];y[b+48>>2]=y[c+384>>2];y[b+52>>2]=e;e=y[b+20>>2];y[c+80>>2]=y[b+16>>2];y[c+84>>2]=e;e=y[b+28>>2];y[c+88>>2]=y[b+24>>2];y[c+92>>2]=e;e=y[b+36>>2];y[c+64>>2]=y[b+32>>2];y[c+68>>2]=e;e=y[b+44>>2];y[c+72>>2]=y[b+40>>2];y[c+76>>2]=e;ia(a,c+80|0,c- -64|0);e=y[c+396>>2];y[b+40>>2]=y[c+392>>2];y[b+44>>2]=e;e=y[c+388>>2];y[b+32>>2]=y[c+384>>2];y[b+36>>2]=e;e=y[b+4>>2];y[c+48>>2]=y[b>>2];y[c+52>>2]=e;e=y[b+12>>2];y[c+56>>2]=y[b+8>>2];y[c+60>>2]=e;e=y[b+20>>2];y[c+32>>2]=y[b+16>>2];y[c+36>>2]=e;e=y[b+28>>2];y[c+40>>2]=y[b+24>>2];y[c+44>>2]=e;ia(a,c+48|0,c+32|0);e=y[c+396>>2];y[b+24>>2]=y[c+392>>2];y[b+28>>2]=e;e=y[c+388>>2];y[b+16>>2]=y[c+384>>2];y[b+20>>2]=e;e=y[c+404>>2];y[c+16>>2]=y[c+400>>2];y[c+20>>2]=e;e=y[c+412>>2];y[c+24>>2]=y[c+408>>2];y[c+28>>2]=e;e=y[b+4>>2];y[c>>2]=y[b>>2];y[c+4>>2]=e;e=y[b+12>>2];y[c+8>>2]=y[b+8>>2];y[c+12>>2]=e;ia(a,c+16|0,c);a=y[c+384>>2];e=y[c+388>>2];f=y[c+392>>2];y[b+12>>2]=y[c+396>>2]^j;y[b+8>>2]=f^i;y[b+4>>2]=e^h;y[b>>2]=a^g;T=c+416|0;}function Me(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;d=T-288|0;T=d;r=y[c+16>>2];s=y[c+48>>2];t=y[c+20>>2];u=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);v=y[c+52>>2];x=y[c+24>>2];A=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);B=y[c+56>>2];i=y[c+28>>2];C=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);D=y[c+60>>2];f=y[c+32>>2];j=y[c+80>>2];E=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);F=y[c+112>>2];e=y[c+96>>2];g=y[c+36>>2];k=y[c+84>>2];G=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);H=y[c+116>>2];n=y[c+100>>2];h=y[c+40>>2];l=y[c+88>>2];I=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);J=y[c+120>>2];o=y[c+104>>2];K=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);p=y[c+44>>2];q=y[c+108>>2];m=p^(q&y[c+124>>2]^(y[c+92>>2]^(z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24))));w[a+28|0]=m;w[a+29|0]=m>>>8;w[a+30|0]=m>>>16;w[a+31|0]=m>>>24;l=h^(o&J^(l^I));w[a+24|0]=l;w[a+25|0]=l>>>8;w[a+26|0]=l>>>16;w[a+27|0]=l>>>24;k=g^(n&H^(k^G));w[a+20|0]=k;w[a+21|0]=k>>>8;w[a+22|0]=k>>>16;w[a+23|0]=k>>>24;j=f^(e&F^(j^E));w[a+16|0]=j;w[a+17|0]=j>>>8;w[a+18|0]=j>>>16;w[a+19|0]=j>>>24;i=D&p^(i^C)^q;w[a+12|0]=i;w[a+13|0]=i>>>8;w[a+14|0]=i>>>16;w[a+15|0]=i>>>24;h=h&B^(x^A)^o;w[a+8|0]=h;w[a+9|0]=h>>>8;w[a+10|0]=h>>>16;w[a+11|0]=h>>>24;g=g&v^(t^u)^n;w[a+4|0]=g;w[a+5|0]=g>>>8;w[a+6|0]=g>>>16;w[a+7|0]=g>>>24;f=e^(f&s^(r^K));w[a|0]=f;w[a+1|0]=f>>>8;w[a+2|0]=f>>>16;w[a+3|0]=f>>>24;a=y[c+124>>2];y[d+280>>2]=y[c+120>>2];y[d+284>>2]=a;a=y[c+116>>2];y[d+272>>2]=y[c+112>>2];y[d+276>>2]=a;a=y[c+100>>2];y[d+240>>2]=y[c+96>>2];y[d+244>>2]=a;a=y[c+108>>2];y[d+248>>2]=y[c+104>>2];y[d+252>>2]=a;a=y[c+116>>2];y[d+224>>2]=y[c+112>>2];y[d+228>>2]=a;a=y[c+124>>2];y[d+232>>2]=y[c+120>>2];y[d+236>>2]=a;a=d+256|0;ia(a,d+240|0,d+224|0);b=y[d+268>>2];y[c+120>>2]=y[d+264>>2];y[c+124>>2]=b;b=y[d+260>>2];y[c+112>>2]=y[d+256>>2];y[c+116>>2]=b;b=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=b;b=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=b;b=y[c+100>>2];y[d+192>>2]=y[c+96>>2];y[d+196>>2]=b;b=y[c+108>>2];y[d+200>>2]=y[c+104>>2];y[d+204>>2]=b;ia(a,d+208|0,d+192|0);b=y[d+268>>2];y[c+104>>2]=y[d+264>>2];y[c+108>>2]=b;b=y[d+260>>2];y[c+96>>2]=y[d+256>>2];y[c+100>>2]=b;b=c- -64|0;e=y[b+4>>2];y[d+176>>2]=y[b>>2];y[d+180>>2]=e;e=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;ia(a,d+176|0,d+160|0);e=y[d+268>>2];y[c+88>>2]=y[d+264>>2];y[c+92>>2]=e;e=y[d+260>>2];y[c+80>>2]=y[d+256>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[b+4>>2];y[d+128>>2]=y[b>>2];y[d+132>>2]=e;e=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=e;ia(a,d+144|0,d+128|0);e=y[d+268>>2];y[c+72>>2]=y[d+264>>2];y[c+76>>2]=e;e=y[d+260>>2];y[b>>2]=y[d+256>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+268>>2];y[c+56>>2]=y[d+264>>2];y[c+60>>2]=e;e=y[d+260>>2];y[c+48>>2]=y[d+256>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+268>>2];y[c+40>>2]=y[d+264>>2];y[c+44>>2]=e;e=y[d+260>>2];y[c+32>>2]=y[d+256>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+268>>2];y[c+24>>2]=y[d+264>>2];y[c+28>>2]=e;e=y[d+260>>2];y[c+16>>2]=y[d+256>>2];y[c+20>>2]=e;e=y[d+276>>2];y[d+16>>2]=y[d+272>>2];y[d+20>>2]=e;e=y[d+284>>2];y[d+24>>2]=y[d+280>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+268>>2];y[c+8>>2]=y[d+264>>2];y[c+12>>2]=a;a=y[d+260>>2];y[c>>2]=y[d+256>>2];y[c+4>>2]=a;y[c+12>>2]=i^y[c+12>>2];y[c+8>>2]=h^y[c+8>>2];y[c+4>>2]=g^y[c+4>>2];y[c>>2]=f^y[c>>2];y[b>>2]=j^y[b>>2];y[c+68>>2]=k^y[c+68>>2];y[c+72>>2]=l^y[c+72>>2];y[c+76>>2]=m^y[c+76>>2];T=d+288|0;}function Oe(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;d=T-288|0;T=d;u=y[c+16>>2];v=y[c+48>>2];f=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);x=y[c+20>>2];A=y[c+52>>2];g=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);B=y[c+24>>2];C=y[c+56>>2];h=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);D=y[c+28>>2];E=y[c+60>>2];e=y[c+32>>2];i=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);F=y[c+80>>2];G=y[c+112>>2];j=y[c+96>>2];k=y[c+36>>2];l=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);H=y[c+84>>2];I=y[c+116>>2];m=y[c+100>>2];n=y[c+40>>2];o=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);J=y[c+88>>2];K=y[c+120>>2];p=y[c+104>>2];q=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);r=y[c+44>>2];s=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);t=y[c+108>>2];b=r^(s^(y[c+92>>2]^t&y[c+124>>2]));w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=p&K^J^o^n;w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=m&I^H^l^k;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=e^(j&G^F^i);w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;b=E&r^D^h^t;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=n&C^B^g^p;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=k&A^x^f^m;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=e&v^u^q^j;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;a=y[c+124>>2];y[d+280>>2]=y[c+120>>2];y[d+284>>2]=a;a=y[c+116>>2];y[d+272>>2]=y[c+112>>2];y[d+276>>2]=a;a=y[c+100>>2];y[d+240>>2]=y[c+96>>2];y[d+244>>2]=a;a=y[c+108>>2];y[d+248>>2]=y[c+104>>2];y[d+252>>2]=a;a=y[c+116>>2];y[d+224>>2]=y[c+112>>2];y[d+228>>2]=a;a=y[c+124>>2];y[d+232>>2]=y[c+120>>2];y[d+236>>2]=a;a=d+256|0;ia(a,d+240|0,d+224|0);b=y[d+268>>2];y[c+120>>2]=y[d+264>>2];y[c+124>>2]=b;b=y[d+260>>2];y[c+112>>2]=y[d+256>>2];y[c+116>>2]=b;b=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=b;b=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=b;b=y[c+100>>2];y[d+192>>2]=y[c+96>>2];y[d+196>>2]=b;b=y[c+108>>2];y[d+200>>2]=y[c+104>>2];y[d+204>>2]=b;ia(a,d+208|0,d+192|0);b=y[d+268>>2];y[c+104>>2]=y[d+264>>2];y[c+108>>2]=b;b=y[d+260>>2];y[c+96>>2]=y[d+256>>2];y[c+100>>2]=b;b=c- -64|0;e=y[b+4>>2];y[d+176>>2]=y[b>>2];y[d+180>>2]=e;e=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;ia(a,d+176|0,d+160|0);e=y[d+268>>2];y[c+88>>2]=y[d+264>>2];y[c+92>>2]=e;e=y[d+260>>2];y[c+80>>2]=y[d+256>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[b+4>>2];y[d+128>>2]=y[b>>2];y[d+132>>2]=e;e=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=e;ia(a,d+144|0,d+128|0);e=y[d+268>>2];y[c+72>>2]=y[d+264>>2];y[c+76>>2]=e;e=y[d+260>>2];y[b>>2]=y[d+256>>2];y[b+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+268>>2];y[c+56>>2]=y[d+264>>2];y[c+60>>2]=e;e=y[d+260>>2];y[c+48>>2]=y[d+256>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+268>>2];y[c+40>>2]=y[d+264>>2];y[c+44>>2]=e;e=y[d+260>>2];y[c+32>>2]=y[d+256>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+268>>2];y[c+24>>2]=y[d+264>>2];y[c+28>>2]=e;e=y[d+260>>2];y[c+16>>2]=y[d+256>>2];y[c+20>>2]=e;e=y[d+276>>2];y[d+16>>2]=y[d+272>>2];y[d+20>>2]=e;e=y[d+284>>2];y[d+24>>2]=y[d+280>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+268>>2];y[c+8>>2]=y[d+264>>2];y[c+12>>2]=a;a=y[d+260>>2];y[c>>2]=y[d+256>>2];y[c+4>>2]=a;y[c+12>>2]=y[c+12>>2]^h;y[c+8>>2]=y[c+8>>2]^g;y[c+4>>2]=y[c+4>>2]^f;y[c>>2]=y[c>>2]^q;y[b>>2]=y[b>>2]^i;y[c+68>>2]=y[c+68>>2]^l;y[c+72>>2]=y[c+72>>2]^o;y[c+76>>2]=s^y[c+76>>2];T=d+288|0;}function Sb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;l=T-48|0;T=l;c=nc(a);a:{if(c){break a}c=-26;if(b-3>>>0<4294967294){break a}e=y[a+44>>2];c=y[a+48>>2];y[l+4>>2]=0;d=y[a+40>>2];y[l+32>>2]=c;y[l+16>>2]=-1;y[l+12>>2]=d;d=c<<3;i=d>>>0>>0?e:d;e=c<<2;c=(i>>>0)/(e>>>0)|0;y[l+24>>2]=c;y[l+28>>2]=c<<2;y[l+20>>2]=E(c,e);c=y[a+52>>2];y[l+40>>2]=b;y[l+36>>2]=c;b=T;k=b;c=b-1152&-64;T=c;e=l+4|0;b=-25;b:{c:{if(!e|!a){break c}d=Da(y[e+20>>2]<<3);y[e+4>>2]=d;b=-22;if(!d){break c}d:{b=y[e+16>>2];e:{if(!b){break e}d=b<<10;if(((d>>>0)/(b>>>0)|0)!=1024){break e}b=Da(12);y[e>>2]=b;if(!b){break e}y[b>>2]=0;y[b+4>>2]=0;b=Pc(c+128|0,d);y[10172]=b;f:{if(b){y[c+128>>2]=0;break f}b=y[c+128>>2];if(b){break d}}ta(y[e>>2]);y[e>>2]=0;}Rd(e,y[a+56>>2]);T=k;b=-22;break b}y[y[e>>2]>>2]=b;y[y[e>>2]+4>>2]=b;y[y[e>>2]+8>>2]=d;m=y[e+36>>2];b=c+128|0;Ja(b,0,0,64);y[c+124>>2]=y[a+48>>2];d=c+124|0;oa(b,d,4,0);y[c+124>>2]=y[a+4>>2];oa(b,d,4,0);y[c+124>>2]=y[a+44>>2];oa(b,d,4,0);y[c+124>>2]=y[a+40>>2];oa(b,d,4,0);y[c+124>>2]=19;oa(b,d,4,0);y[c+124>>2]=m;oa(b,d,4,0);y[c+124>>2]=y[a+12>>2];oa(b,d,4,0);d=y[a+8>>2];g:{if(!d){break g}oa(b,d,y[a+12>>2],0);if(!(w[a+56|0]&1)){break g}ja(y[a+8>>2],y[a+12>>2]);y[a+12>>2]=0;}y[c+124>>2]=y[a+20>>2];b=c+128|0;oa(b,c+124|0,4,0);d=y[a+16>>2];if(d){oa(b,d,y[a+20>>2],0);}y[c+124>>2]=y[a+28>>2];b=c+128|0;oa(b,c+124|0,4,0);d=y[a+24>>2];h:{if(!d){break h}oa(b,d,y[a+28>>2],0);if(!(z[a+56|0]&2)){break h}ja(y[a+24>>2],y[a+28>>2]);y[a+28>>2]=0;}y[c+124>>2]=y[a+36>>2];b=c+128|0;oa(b,c+124|0,4,0);d=y[a+32>>2];if(d){oa(b,d,y[a+36>>2],0);}Ia(c+128|0,c+48|0,64);ja(c+112|0,8);if(y[e+28>>2]){d=0;while(1){y[c+112>>2]=0;y[c+116>>2]=d;sc(c+128|0,1024,c+48|0,72);m=y[y[e>>2]+4>>2]+(E(y[e+24>>2],d)<<10)|0;b=0;while(1){h=b<<3;f=h+m|0;i=c+128|0;j=i+h|0;g=y[j+4>>2];y[f>>2]=y[j>>2];y[f+4>>2]=g;f=h|8;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;f=h|16;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;h=h|24;f=h+m|0;h=h+i|0;j=y[h+4>>2];y[f>>2]=y[h>>2];y[f+4>>2]=j;b=b+4|0;if((b|0)!=128){continue}break}y[c+112>>2]=1;sc(i,1024,c+48|0,72);m=(y[y[e>>2]+4>>2]+(E(y[e+24>>2],d)<<10)|0)+1024|0;b=0;while(1){h=b<<3;f=h+m|0;i=c+128|0;j=i+h|0;g=y[j+4>>2];y[f>>2]=y[j>>2];y[f+4>>2]=g;f=h|8;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;f=h|16;j=f+m|0;f=f+i|0;g=y[f+4>>2];y[j>>2]=y[f>>2];y[j+4>>2]=g;h=h|24;f=h+m|0;h=h+i|0;i=y[h+4>>2];y[f>>2]=y[h>>2];y[f+4>>2]=i;b=b+4|0;if((b|0)!=128){continue}break}d=d+1|0;if(d>>>0>2]){continue}break}}ja(c+128|0,1024);ja(c+48|0,72);b=0;}T=k;}c=b;if(b){break a}if(y[l+12>>2]){while(1){b=T-80|0;T=b;e=l+4|0;i:{if(!e|!y[e+28>>2]){break i}w[b+72|0]=0;y[b+64>>2]=o;c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b+48>>2]=y[b+64>>2];y[b+52>>2]=d;d=y[b+76>>2];y[b+56>>2]=y[b+72>>2];y[b+60>>2]=d;Pb(e,b+48|0);c=c+1|0;d=y[e+28>>2];if(c>>>0>>0){continue}break}w[b+72|0]=1;if(!d){break i}c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b+32>>2]=y[b+64>>2];y[b+36>>2]=d;d=y[b+76>>2];y[b+40>>2]=y[b+72>>2];y[b+44>>2]=d;Pb(e,b+32|0);c=c+1|0;d=y[e+28>>2];if(c>>>0>>0){continue}break}w[b+72|0]=2;if(!d){break i}c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b+16>>2]=y[b+64>>2];y[b+20>>2]=d;d=y[b+76>>2];y[b+24>>2]=y[b+72>>2];y[b+28>>2]=d;Pb(e,b+16|0);c=c+1|0;d=y[e+28>>2];if(c>>>0>>0){continue}break}w[b+72|0]=3;if(!d){break i}c=0;while(1){y[b+76>>2]=0;y[b+68>>2]=c;d=y[b+68>>2];y[b>>2]=y[b+64>>2];y[b+4>>2]=d;d=y[b+76>>2];y[b+8>>2]=y[b+72>>2];y[b+12>>2]=d;Pb(e,b);c=c+1|0;if(c>>>0>2]){continue}break}}T=b+80|0;o=o+1|0;if(o>>>0>2]){continue}break}}b=T-2048|0;T=b;c=l+4|0;if(!(!a|!c)){o=y[c+24>>2];f=y[y[c>>2]+4>>2]+(o<<10)|0;t(b+1024|0,f-1024|0,1024);j=y[c+28>>2];if(j>>>0>=2){m=1;while(1){e=(f+(E(m,o)<<10)|0)-1024|0;h=0;while(1){d=h<<3;i=b+1024|0;k=d+i|0;g=y[k>>2];n=d+e|0;p=y[n>>2];n=y[k+4>>2]^y[n+4>>2];y[k>>2]=g^p;y[k+4>>2]=n;g=d|8;k=g+i|0;n=y[k>>2];g=e+g|0;p=y[g>>2];g=y[k+4>>2]^y[g+4>>2];y[k>>2]=n^p;y[k+4>>2]=g;g=d|16;k=g+i|0;n=y[k>>2];g=e+g|0;p=y[g>>2];g=y[k+4>>2]^y[g+4>>2];y[k>>2]=n^p;y[k+4>>2]=g;k=i;i=d|24;d=k+i|0;k=y[d>>2];i=e+i|0;g=y[i>>2];i=y[d+4>>2]^y[i+4>>2];y[d>>2]=g^k;y[d+4>>2]=i;h=h+4|0;if((h|0)!=128){continue}break}m=m+1|0;if((j|0)!=(m|0)){continue}break}}e=b+1024|0;t(b,e,1024);sc(y[a>>2],y[a+4>>2],b,1024);ja(e,1024);ja(b,1024);Rd(c,y[a+56>>2]);}T=b+2048|0;c=0;}T=l+48|0;return c}function Qe(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=T-288|0;T=d;k=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);l=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);m=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);g=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);h=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);i=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);n=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);j=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=j^33620224;y[c+112>>2]=a;y[c+96>>2]=j^1427652059;y[c+80>>2]=a;a=c- -64|0;b=j^n;y[a>>2]=b;y[c+56>>2]=1110511904;y[c+60>>2]=-584534669;y[c+48>>2]=1427652059;y[c+52>>2]=-248528275;y[c+40>>2]=1496785429;y[c+44>>2]=1652156816;y[c+32>>2]=33620224;y[c+36>>2]=218629379;y[c+24>>2]=1110511904;y[c+28>>2]=-584534669;y[c+16>>2]=1427652059;y[c+20>>2]=-248528275;y[c>>2]=b;b=i^1652156816;y[c+124>>2]=b;f=h^1496785429;y[c+120>>2]=f;e=g^218629379;y[c+116>>2]=e;y[c+108>>2]=i^-584534669;y[c+104>>2]=h^1110511904;y[c+100>>2]=g^-248528275;y[c+92>>2]=b;y[c+88>>2]=f;y[c+84>>2]=e;b=i^m;y[c+76>>2]=b;f=h^l;y[c+72>>2]=f;e=g^k;y[c+68>>2]=e;y[c+12>>2]=b;y[c+8>>2]=f;y[c+4>>2]=e;f=0;while(1){b=y[c+124>>2];y[d+280>>2]=y[c+120>>2];y[d+284>>2]=b;b=y[c+116>>2];y[d+272>>2]=y[c+112>>2];y[d+276>>2]=b;b=y[c+100>>2];y[d+240>>2]=y[c+96>>2];y[d+244>>2]=b;b=y[c+108>>2];y[d+248>>2]=y[c+104>>2];y[d+252>>2]=b;b=y[c+116>>2];y[d+224>>2]=y[c+112>>2];y[d+228>>2]=b;b=y[c+124>>2];y[d+232>>2]=y[c+120>>2];y[d+236>>2]=b;b=d+256|0;ia(b,d+240|0,d+224|0);e=y[d+268>>2];y[c+120>>2]=y[d+264>>2];y[c+124>>2]=e;e=y[d+260>>2];y[c+112>>2]=y[d+256>>2];y[c+116>>2]=e;e=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=e;e=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=e;e=y[c+100>>2];y[d+192>>2]=y[c+96>>2];y[d+196>>2]=e;e=y[c+108>>2];y[d+200>>2]=y[c+104>>2];y[d+204>>2]=e;ia(b,d+208|0,d+192|0);e=y[d+268>>2];y[c+104>>2]=y[d+264>>2];y[c+108>>2]=e;e=y[d+260>>2];y[c+96>>2]=y[d+256>>2];y[c+100>>2]=e;e=y[a+4>>2];y[d+176>>2]=y[a>>2];y[d+180>>2]=e;e=y[a+12>>2];y[d+184>>2]=y[a+8>>2];y[d+188>>2]=e;e=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=e;e=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=e;ia(b,d+176|0,d+160|0);e=y[d+268>>2];y[c+88>>2]=y[d+264>>2];y[c+92>>2]=e;e=y[d+260>>2];y[c+80>>2]=y[d+256>>2];y[c+84>>2]=e;e=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=e;e=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=e;e=y[a+4>>2];y[d+128>>2]=y[a>>2];y[d+132>>2]=e;e=y[a+12>>2];y[d+136>>2]=y[a+8>>2];y[d+140>>2]=e;ia(b,d+144|0,d+128|0);e=y[d+268>>2];y[a+8>>2]=y[d+264>>2];y[a+12>>2]=e;e=y[d+260>>2];y[a>>2]=y[d+256>>2];y[a+4>>2]=e;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(b,d+112|0,d+96|0);e=y[d+268>>2];y[c+56>>2]=y[d+264>>2];y[c+60>>2]=e;e=y[d+260>>2];y[c+48>>2]=y[d+256>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(b,d+80|0,d- -64|0);e=y[d+268>>2];y[c+40>>2]=y[d+264>>2];y[c+44>>2]=e;e=y[d+260>>2];y[c+32>>2]=y[d+256>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(b,d+48|0,d+32|0);e=y[d+268>>2];y[c+24>>2]=y[d+264>>2];y[c+28>>2]=e;e=y[d+260>>2];y[c+16>>2]=y[d+256>>2];y[c+20>>2]=e;e=y[d+276>>2];y[d+16>>2]=y[d+272>>2];y[d+20>>2]=e;e=y[d+284>>2];y[d+24>>2]=y[d+280>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(b,d+16|0,d);b=y[d+268>>2];y[c+8>>2]=y[d+264>>2];y[c+12>>2]=b;b=y[d+260>>2];y[c>>2]=y[d+256>>2];y[c+4>>2]=b;y[c+12>>2]=y[c+12>>2]^m;y[c+8>>2]=y[c+8>>2]^l;y[c+4>>2]=y[c+4>>2]^k;y[c>>2]=y[c>>2]^n;y[a>>2]=j^y[a>>2];y[c+68>>2]=y[c+68>>2]^g;y[c+72>>2]=y[c+72>>2]^h;y[c+76>>2]=y[c+76>>2]^i;f=f+1|0;if((f|0)!=10){continue}break}T=d+288|0;}function _b(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;j=T+-64|0;H=y[a+60>>2];I=y[a+56>>2];C=y[a+52>>2];B=y[a+48>>2];J=y[a+44>>2];K=y[a+40>>2];L=y[a+36>>2];M=y[a+32>>2];N=y[a+28>>2];O=y[a+24>>2];P=y[a+20>>2];Q=y[a+16>>2];R=y[a+12>>2];S=y[a+8>>2];U=y[a+4>>2];V=y[a>>2];while(1){a:{if(!e&d>>>0>63|e){f=c;break a}y[j+56>>2]=0;y[j+60>>2]=0;y[j+48>>2]=0;y[j+52>>2]=0;y[j+40>>2]=0;y[j+44>>2]=0;y[j+32>>2]=0;y[j+36>>2]=0;y[j+24>>2]=0;y[j+28>>2]=0;y[j+16>>2]=0;y[j+20>>2]=0;y[j+8>>2]=0;y[j+12>>2]=0;y[j>>2]=0;y[j+4>>2]=0;h=0;while(1){w[h+j|0]=z[b+h|0];h=h+1|0;if(!e&d>>>0>h>>>0|e){continue}break}f=j;b=f;W=c;}D=20;g=V;p=U;q=S;t=R;h=Q;c=P;k=O;l=N;m=M;v=L;r=K;i=H;x=I;u=C;s=B;n=J;while(1){o=h;h=g+h|0;g=Bi(h^s,16);m=g+m|0;s=Bi(o^m,12);o=s;A=h+s|0;s=Bi(A^g,8);m=s+m|0;h=Bi(o^m,7);g=l+t|0;i=Bi(g^i,16);n=i+n|0;l=Bi(n^l,12);q=k+q|0;t=Bi(q^x,16);r=t+r|0;k=Bi(r^k,12);E=g+l|0;x=E+h|0;q=k+q|0;F=Bi(q^t,8);g=Bi(x^F,16);p=c+p|0;t=Bi(p^u,16);v=t+v|0;c=Bi(v^c,12);o=h;p=c+p|0;u=Bi(p^t,8);G=u+v|0;h=G+g|0;o=Bi(o^h,12);t=o+x|0;x=Bi(g^t,8);v=x+h|0;h=Bi(v^o,7);o=m;m=q;g=Bi(i^E,8);i=g+n|0;q=Bi(i^l,7);m=m+q|0;u=Bi(m^u,16);l=o+u|0;n=Bi(l^q,12);q=n+m|0;u=Bi(u^q,8);m=l+u|0;l=Bi(m^n,7);n=i;i=p;r=r+F|0;p=Bi(r^k,7);i=i+p|0;s=Bi(i^s,16);k=n+s|0;n=i;i=Bi(k^p,12);p=n+i|0;s=Bi(s^p,8);n=k+s|0;k=Bi(n^i,7);o=r;i=g;g=Bi(c^G,7);r=g+A|0;i=Bi(i^r,16);c=o+i|0;A=Bi(c^g,12);g=A+r|0;i=Bi(i^g,8);r=c+i|0;c=Bi(r^A,7);D=D-2|0;if(D){continue}break}D=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);A=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);E=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);F=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);G=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);o=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);X=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);Y=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);Z=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);_=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);$=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);aa=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);ba=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);ca=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);da=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);g=g+V^(z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24));w[f|0]=g;w[f+1|0]=g>>>8;w[f+2|0]=g>>>16;w[f+3|0]=g>>>24;g=i+H^da;w[f+60|0]=g;w[f+61|0]=g>>>8;w[f+62|0]=g>>>16;w[f+63|0]=g>>>24;g=x+I^ca;w[f+56|0]=g;w[f+57|0]=g>>>8;w[f+58|0]=g>>>16;w[f+59|0]=g>>>24;g=u+C^ba;w[f+52|0]=g;w[f+53|0]=g>>>8;w[f+54|0]=g>>>16;w[f+55|0]=g>>>24;g=s+B^aa;w[f+48|0]=g;w[f+49|0]=g>>>8;w[f+50|0]=g>>>16;w[f+51|0]=g>>>24;g=n+J^$;w[f+44|0]=g;w[f+45|0]=g>>>8;w[f+46|0]=g>>>16;w[f+47|0]=g>>>24;g=r+K^_;w[f+40|0]=g;w[f+41|0]=g>>>8;w[f+42|0]=g>>>16;w[f+43|0]=g>>>24;g=v+L^Z;w[f+36|0]=g;w[f+37|0]=g>>>8;w[f+38|0]=g>>>16;w[f+39|0]=g>>>24;g=m+M^Y;w[f+32|0]=g;w[f+33|0]=g>>>8;w[f+34|0]=g>>>16;w[f+35|0]=g>>>24;l=l+N^X;w[f+28|0]=l;w[f+29|0]=l>>>8;w[f+30|0]=l>>>16;w[f+31|0]=l>>>24;k=o^k+O;w[f+24|0]=k;w[f+25|0]=k>>>8;w[f+26|0]=k>>>16;w[f+27|0]=k>>>24;c=G^c+P;w[f+20|0]=c;w[f+21|0]=c>>>8;w[f+22|0]=c>>>16;w[f+23|0]=c>>>24;c=F^h+Q;w[f+16|0]=c;w[f+17|0]=c>>>8;w[f+18|0]=c>>>16;w[f+19|0]=c>>>24;c=E^t+R;w[f+12|0]=c;w[f+13|0]=c>>>8;w[f+14|0]=c>>>16;w[f+15|0]=c>>>24;c=A^q+S;w[f+8|0]=c;w[f+9|0]=c>>>8;w[f+10|0]=c>>>16;w[f+11|0]=c>>>24;c=D^p+U;w[f+4|0]=c;w[f+5|0]=c>>>8;w[f+6|0]=c>>>16;w[f+7|0]=c>>>24;B=B+1|0;C=!B+C|0;if(!e&d>>>0<=64){if(!e&d>>>0<=63){h=0;while(1){w[h+W|0]=z[f+h|0];h=h+1|0;if(d>>>0>h>>>0){continue}break}}y[a+52>>2]=C;y[a+48>>2]=B;}else {b=b- -64|0;c=f- -64|0;e=e-1|0;d=d+-64|0;e=d>>>0<4294967232?e+1|0:e;continue}break}}function xb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0;c=T-800|0;T=c;e=b+40|0;d=y[e>>2];f=y[b+80>>2];g=y[b+44>>2];h=y[b+84>>2];i=y[b+48>>2];n=y[b+88>>2];j=y[b+52>>2];q=y[b+92>>2];o=y[b+56>>2];r=y[b+96>>2];s=y[b+60>>2];t=y[b+100>>2];k=b- -64|0;u=y[k>>2];v=y[b+104>>2];x=y[b+68>>2];A=y[b+108>>2];B=y[b+72>>2];C=y[b+112>>2];l=y[b+76>>2];m=y[b+116>>2];y[c+324>>2]=l+m;y[c+320>>2]=B+C;y[c+316>>2]=x+A;y[c+312>>2]=u+v;y[c+308>>2]=s+t;y[c+304>>2]=o+r;y[c+300>>2]=j+q;y[c+296>>2]=i+n;y[c+292>>2]=g+h;y[c+288>>2]=d+f;y[c+36>>2]=m-l;y[c+32>>2]=C-B;y[c+28>>2]=A-x;y[c+24>>2]=v-u;y[c+20>>2]=t-s;y[c+16>>2]=r-o;y[c+12>>2]=q-j;y[c+8>>2]=n-i;y[c+4>>2]=h-g;y[c>>2]=f-d;d=c+288|0;ga(d,d,c);g=c+240|0;ga(g,b,e);f=c+192|0;fa(f,g);ga(f,d,f);y[c+436>>2]=0;y[c+440>>2]=0;y[c+444>>2]=0;y[c+448>>2]=0;y[c+452>>2]=0;y[c+456>>2]=0;y[c+460>>2]=0;y[c+464>>2]=0;y[c+468>>2]=0;y[c+432>>2]=1;h=c+576|0;cc(h,c+432|0,f);f=c+720|0;ga(f,h,d);q=c+672|0;ga(q,h,g);j=c+48|0;ga(j,f,q);d=b+120|0;ga(j,j,d);ga(c+528|0,b,1632);ga(c+480|0,e,1632);ga(c+624|0,f,2944);f=c+336|0;ga(f,d,j);n=c+384|0;pa(n,f);F=z[c+384|0];f=y[b+36>>2];d=y[b+32>>2];y[c+176>>2]=d;y[c+180>>2]=f;g=y[b+28>>2];f=y[b+24>>2];y[c+168>>2]=f;y[c+172>>2]=g;h=y[b+20>>2];g=y[b+16>>2];y[c+160>>2]=g;y[c+164>>2]=h;i=y[b+12>>2];h=y[b+8>>2];y[c+152>>2]=h;y[c+156>>2]=i;o=y[b+4>>2];i=y[b>>2];y[c+144>>2]=i;y[c+148>>2]=o;o=y[e>>2];r=y[b+44>>2];s=y[b+48>>2];t=y[b+52>>2];u=y[b+56>>2];v=y[b+60>>2];x=y[k>>2];A=y[b+68>>2];B=y[b+72>>2];C=y[b+76>>2];G=y[c+484>>2];k=y[c+148>>2];H=y[c+492>>2];l=y[c+156>>2];I=y[c+500>>2];m=y[c+164>>2];J=y[c+508>>2];p=y[c+172>>2];K=y[c+516>>2];E=y[c+180>>2];L=y[c+480>>2];M=y[c+488>>2];N=y[c+496>>2];D=y[c+504>>2];e=0-(F&1)|0;y[c+176>>2]=d^e&(d^y[c+512>>2]);y[c+168>>2]=f^e&(f^D);y[c+160>>2]=g^e&(g^N);y[c+152>>2]=h^e&(h^M);y[c+144>>2]=i^e&(i^L);y[c+180>>2]=E^e&(E^K);y[c+172>>2]=p^e&(p^J);y[c+164>>2]=m^e&(m^I);y[c+156>>2]=l^e&(l^H);y[c+148>>2]=k^e&(k^G);E=y[c+528>>2];F=y[c+532>>2];G=y[c+536>>2];H=y[c+540>>2];I=y[c+544>>2];J=y[c+548>>2];K=y[c+552>>2];L=y[c+556>>2];M=y[c+560>>2];N=y[c+564>>2];d=y[c+672>>2];D=y[c+624>>2];f=y[c+676>>2];P=y[c+628>>2];g=y[c+680>>2];Q=y[c+632>>2];h=y[c+684>>2];R=y[c+636>>2];i=y[c+688>>2];S=y[c+640>>2];k=y[c+692>>2];U=y[c+644>>2];l=y[c+696>>2];V=y[c+648>>2];m=y[c+700>>2];W=y[c+652>>2];p=y[c+704>>2];X=y[c+656>>2];O=y[c+708>>2];y[c+708>>2]=O^e&(y[c+660>>2]^O);y[c+704>>2]=p^e&(p^X);y[c+700>>2]=m^e&(m^W);y[c+696>>2]=l^e&(l^V);y[c+692>>2]=k^e&(k^U);y[c+688>>2]=i^e&(i^S);y[c+684>>2]=h^e&(h^R);y[c+680>>2]=g^e&(g^Q);y[c+676>>2]=f^e&(f^P);y[c+672>>2]=d^e&(d^D);d=c+96|0;ga(d,c+144|0,j);pa(n,d);f=y[b+80>>2];g=y[b+84>>2];h=y[b+88>>2];i=y[b+92>>2];j=y[b+96>>2];k=y[b+100>>2];l=y[b+104>>2];m=y[b+108>>2];p=y[b+112>>2];D=y[b+116>>2];b=0-(w[c+384|0]&1)|0;d=C^e&(C^N);y[c+420>>2]=D-(b&(0-d^d)^d);d=B^e&(B^M);y[c+416>>2]=p-(b&(0-d^d)^d);d=A^e&(A^L);y[c+412>>2]=m-(b&(0-d^d)^d);d=x^e&(x^K);y[c+408>>2]=l-(b&(0-d^d)^d);d=v^e&(v^J);y[c+404>>2]=k-(b&(0-d^d)^d);d=u^e&(u^I);y[c+400>>2]=j-(b&(0-d^d)^d);d=t^e&(t^H);y[c+396>>2]=i-(b&(0-d^d)^d);d=s^e&(s^G);y[c+392>>2]=h-(b&(0-d^d)^d);d=r^e&(r^F);y[c+388>>2]=g-(b&(0-d^d)^d);d=b;b=o^e&(o^E);y[c+384>>2]=f-(d&(0-b^b)^b);ga(n,q,n);pa(c+768|0,n);b=0-(w[c+768|0]&1)|0;d=y[c+384>>2];y[c+384>>2]=b&(0-d^d)^d;d=y[c+388>>2];y[c+388>>2]=b&(0-d^d)^d;d=y[c+392>>2];y[c+392>>2]=b&(0-d^d)^d;d=y[c+396>>2];y[c+396>>2]=b&(0-d^d)^d;d=y[c+400>>2];y[c+400>>2]=b&(0-d^d)^d;d=y[c+404>>2];y[c+404>>2]=b&(0-d^d)^d;d=y[c+408>>2];y[c+408>>2]=b&(0-d^d)^d;d=y[c+412>>2];y[c+412>>2]=b&(0-d^d)^d;d=y[c+416>>2];y[c+416>>2]=b&(0-d^d)^d;d=b;b=y[c+420>>2];y[c+420>>2]=d&(0-b^b)^b;pa(a,n);T=c+800|0;}function Fe(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;f=T-224|0;T=f;l=y[e+60>>2]^d>>>29;m=y[e+56>>2]^d<<3;h=y[e+52>>2]^c>>>29;j=y[e+48>>2]^c<<3;g=e- -64|0;while(1){c=y[e+92>>2];y[f+216>>2]=y[e+88>>2];y[f+220>>2]=c;c=y[e+84>>2];y[f+208>>2]=y[e+80>>2];y[f+212>>2]=c;c=y[g+4>>2];y[f+176>>2]=y[g>>2];y[f+180>>2]=c;c=y[g+12>>2];y[f+184>>2]=y[g+8>>2];y[f+188>>2]=c;c=y[e+84>>2];y[f+160>>2]=y[e+80>>2];y[f+164>>2]=c;c=y[e+92>>2];y[f+168>>2]=y[e+88>>2];y[f+172>>2]=c;d=f+192|0;ia(d,f+176|0,f+160|0);c=y[f+204>>2];y[e+88>>2]=y[f+200>>2];y[e+92>>2]=c;c=y[f+196>>2];y[e+80>>2]=y[f+192>>2];y[e+84>>2]=c;c=y[e+52>>2];y[f+144>>2]=y[e+48>>2];y[f+148>>2]=c;c=y[e+60>>2];y[f+152>>2]=y[e+56>>2];y[f+156>>2]=c;c=y[g+4>>2];y[f+128>>2]=y[g>>2];y[f+132>>2]=c;c=y[g+12>>2];y[f+136>>2]=y[g+8>>2];y[f+140>>2]=c;ia(d,f+144|0,f+128|0);c=y[f+204>>2];y[g+8>>2]=y[f+200>>2];y[g+12>>2]=c;c=y[f+196>>2];y[g>>2]=y[f+192>>2];y[g+4>>2]=c;c=y[e+36>>2];y[f+112>>2]=y[e+32>>2];y[f+116>>2]=c;c=y[e+44>>2];y[f+120>>2]=y[e+40>>2];y[f+124>>2]=c;c=y[e+52>>2];y[f+96>>2]=y[e+48>>2];y[f+100>>2]=c;c=y[e+60>>2];y[f+104>>2]=y[e+56>>2];y[f+108>>2]=c;ia(d,f+112|0,f+96|0);c=y[f+204>>2];y[e+56>>2]=y[f+200>>2];y[e+60>>2]=c;c=y[f+196>>2];y[e+48>>2]=y[f+192>>2];y[e+52>>2]=c;c=y[e+20>>2];y[f+80>>2]=y[e+16>>2];y[f+84>>2]=c;c=y[e+28>>2];y[f+88>>2]=y[e+24>>2];y[f+92>>2]=c;c=y[e+36>>2];y[f+64>>2]=y[e+32>>2];y[f+68>>2]=c;c=y[e+44>>2];y[f+72>>2]=y[e+40>>2];y[f+76>>2]=c;ia(d,f+80|0,f- -64|0);c=y[f+204>>2];y[e+40>>2]=y[f+200>>2];y[e+44>>2]=c;c=y[f+196>>2];y[e+32>>2]=y[f+192>>2];y[e+36>>2]=c;c=y[e+4>>2];y[f+48>>2]=y[e>>2];y[f+52>>2]=c;c=y[e+12>>2];y[f+56>>2]=y[e+8>>2];y[f+60>>2]=c;c=y[e+20>>2];y[f+32>>2]=y[e+16>>2];y[f+36>>2]=c;c=y[e+28>>2];y[f+40>>2]=y[e+24>>2];y[f+44>>2]=c;ia(d,f+48|0,f+32|0);c=y[f+204>>2];y[e+24>>2]=y[f+200>>2];y[e+28>>2]=c;c=y[f+196>>2];y[e+16>>2]=y[f+192>>2];y[e+20>>2]=c;c=y[f+212>>2];y[f+16>>2]=y[f+208>>2];y[f+20>>2]=c;c=y[f+220>>2];y[f+24>>2]=y[f+216>>2];y[f+28>>2]=c;c=y[e+4>>2];y[f>>2]=y[e>>2];y[f+4>>2]=c;c=y[e+12>>2];y[f+8>>2]=y[e+8>>2];y[f+12>>2]=c;ia(d,f+16|0,f);k=y[f+192>>2];d=y[f+196>>2];c=y[f+200>>2];n=l^y[f+204>>2];y[e+12>>2]=n;p=c^m;y[e+8>>2]=p;q=d^h;y[e+4>>2]=q;r=j^k;y[e>>2]=r;i=i+1|0;if((i|0)!=7){continue}break}a:{b:{c:{c=b-16|0;if(c){if((c|0)==16){break c}break b}s=y[e+16>>2];t=y[e+48>>2];u=y[e+32>>2];v=y[e+80>>2];x=y[e- -64>>2];g=y[e+20>>2];l=y[e+52>>2];m=y[e+36>>2];h=y[e+84>>2];j=y[e+68>>2];k=y[e+24>>2];i=y[e+56>>2];d=y[e+40>>2];c=y[e+88>>2];b=y[e+72>>2];e=n^(y[e+28>>2]^(y[e+60>>2]^(y[e+44>>2]^(y[e+92>>2]^y[e+76>>2]))));w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;b=p^(b^c^d^i^k);w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(g^(l^(h^j^m)));w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(s^(t^(u^(v^x))));w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;break a}j=y[e+32>>2];k=y[e+16>>2];i=y[e+36>>2];d=y[e+20>>2];c=y[e+40>>2];b=y[e+24>>2];h=n^(y[e+44>>2]^y[e+28>>2]);w[a+12|0]=h;w[a+13|0]=h>>>8;w[a+14|0]=h>>>16;w[a+15|0]=h>>>24;b=p^(b^c);w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=q^(d^i);w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=r^(j^k);w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;l=y[e+48>>2];m=y[e+80>>2];h=y[e- -64>>2];j=y[e+52>>2];k=y[e+84>>2];i=y[e+68>>2];d=y[e+56>>2];c=y[e+88>>2];b=y[e+72>>2];e=y[e+60>>2]^(y[e+92>>2]^y[e+76>>2]);w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;b=d^(b^c);w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=j^(k^i);w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=l^(h^m);w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;break a}if(!b){break a}o(a,0,b);}T=f+224|0;}function xh(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=-1;h=d-65|0;if(!(h>>>0<4294967232|c>>>0>64)){a:{if(!(c?b:0)){if((h&255)>>>0>191){b:{if(!e){i=725511199;h=-1694144372;c=-1377402159;b=1359893119;break b}i=(z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24))^725511199;h=(z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24))^-1694144372;c=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))^-1377402159;b=(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))^1359893119;}c:{if(!f){j=327033209;f=1541459225;g=-79577749;e=528734635;break c}e=f;j=(z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24))^327033209;f=(z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24))^1541459225;g=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))^-79577749;e=(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))^528734635;}o(a- -64|0,0,293);w[a+56|0]=j;w[a+57|0]=j>>>8;w[a+58|0]=j>>>16;w[a+59|0]=j>>>24;w[a+60|0]=f;w[a+61|0]=f>>>8;w[a+62|0]=f>>>16;w[a+63|0]=f>>>24;w[a+48|0]=g;w[a+49|0]=g>>>8;w[a+50|0]=g>>>16;w[a+51|0]=g>>>24;w[a+52|0]=e;w[a+53|0]=e>>>8;w[a+54|0]=e>>>16;w[a+55|0]=e>>>24;w[a+40|0]=i;w[a+41|0]=i>>>8;w[a+42|0]=i>>>16;w[a+43|0]=i>>>24;w[a+44|0]=h;w[a+45|0]=h>>>8;w[a+46|0]=h>>>16;w[a+47|0]=h>>>24;w[a+32|0]=c;w[a+33|0]=c>>>8;w[a+34|0]=c>>>16;w[a+35|0]=c>>>24;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;b=d^-222443256;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=103;w[a+5|0]=230;w[a+6|0]=9;w[a+7|0]=106;break a}na();s();}k=T-128|0;T=k;d:{if(!(!b|(d-65&255)>>>0<=191|(c-65&255)>>>0<=191)){e:{if(!e){i=725511199;h=-1694144372;g=-1377402159;e=1359893119;break e}i=(z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24))^725511199;h=(z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24))^-1694144372;g=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))^-1377402159;e=(z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24))^1359893119;}m=g;f:{if(!f){j=327033209;f=1541459225;l=-79577749;g=528734635;break f}g=f;j=(z[g+8|0]|z[g+9|0]<<8|(z[g+10|0]<<16|z[g+11|0]<<24))^327033209;f=(z[g+12|0]|z[g+13|0]<<8|(z[g+14|0]<<16|z[g+15|0]<<24))^1541459225;l=(z[g|0]|z[g+1|0]<<8|(z[g+2|0]<<16|z[g+3|0]<<24))^-79577749;g=(z[g+4|0]|z[g+5|0]<<8|(z[g+6|0]<<16|z[g+7|0]<<24))^528734635;}o(a- -64|0,0,293);w[a+56|0]=j;w[a+57|0]=j>>>8;w[a+58|0]=j>>>16;w[a+59|0]=j>>>24;w[a+60|0]=f;w[a+61|0]=f>>>8;w[a+62|0]=f>>>16;w[a+63|0]=f>>>24;w[a+48|0]=l;w[a+49|0]=l>>>8;w[a+50|0]=l>>>16;w[a+51|0]=l>>>24;w[a+52|0]=g;w[a+53|0]=g>>>8;w[a+54|0]=g>>>16;w[a+55|0]=g>>>24;w[a+40|0]=i;w[a+41|0]=i>>>8;w[a+42|0]=i>>>16;w[a+43|0]=i>>>24;w[a+44|0]=h;w[a+45|0]=h>>>8;w[a+46|0]=h>>>16;w[a+47|0]=h>>>24;w[a+32|0]=m;w[a+33|0]=m>>>8;w[a+34|0]=m>>>16;w[a+35|0]=m>>>24;w[a+36|0]=e;w[a+37|0]=e>>>8;w[a+38|0]=e>>>16;w[a+39|0]=e>>>24;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;e=(c<<8|d)^-222443256;w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;d=c>>>24^1779033703;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;o(k,0,128);if(c){t(k,b,c);}t(a+96|0,k,128);w[a+352|0]=128;w[a+353|0]=0;w[a+354|0]=0;w[a+355|0]=0;ja(k,128);T=k+128|0;break d}na();s();}}g=0;}return g|0}function Ca(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=T-704|0;T=j;g=a+80|0;e=y[a+72>>2]>>>3&127;c=g+e|0;a:{if(e>>>0>=112){e=128-e|0;if(e){t(c,39152,e);}Xb(a,g,j,j+640|0);o(g,0,112);break a}e=112-e|0;if(!e){break a}t(c,39152,e);}e=a- -64|0;d=y[e>>2];c=y[e+4>>2];i=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;k=f<<24;h=d&-16777216;f=h>>>24|0;y[a+192>>2]=k|h<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));c=e|f|i;y[a+196>>2]=c;d=y[a+72>>2];i=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+76>>2];k=f<<24;h=d&-16777216;f=h>>>24|0;y[a+200>>2]=k|h<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));c=e|f|i;y[a+204>>2]=c;Xb(a,g,j,j+640|0);d=y[a>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+4>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b|0]=c;w[b+1|0]=c>>>8;w[b+2|0]=c>>>16;w[b+3|0]=c>>>24;c=e|f|h;e=c|0;w[b+4|0]=e;w[b+5|0]=e>>>8;w[b+6|0]=e>>>16;w[b+7|0]=e>>>24;d=y[a+8>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+12>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+8|0]=c;w[b+9|0]=c>>>8;w[b+10|0]=c>>>16;w[b+11|0]=c>>>24;c=e|f|h;e=c|0;w[b+12|0]=e;w[b+13|0]=e>>>8;w[b+14|0]=e>>>16;w[b+15|0]=e>>>24;d=y[a+16>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+20>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+16|0]=c;w[b+17|0]=c>>>8;w[b+18|0]=c>>>16;w[b+19|0]=c>>>24;c=e|f|h;e=c|0;w[b+20|0]=e;w[b+21|0]=e>>>8;w[b+22|0]=e>>>16;w[b+23|0]=e>>>24;d=y[a+24>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+28>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+24|0]=c;w[b+25|0]=c>>>8;w[b+26|0]=c>>>16;w[b+27|0]=c>>>24;c=e|f|h;e=c|0;w[b+28|0]=e;w[b+29|0]=e>>>8;w[b+30|0]=e>>>16;w[b+31|0]=e>>>24;d=y[a+32>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+36>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+32|0]=c;w[b+33|0]=c>>>8;w[b+34|0]=c>>>16;w[b+35|0]=c>>>24;c=e|f|h;e=c|0;w[b+36|0]=e;w[b+37|0]=e>>>8;w[b+38|0]=e>>>16;w[b+39|0]=e>>>24;d=y[a+40>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+44>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+40|0]=c;w[b+41|0]=c>>>8;w[b+42|0]=c>>>16;w[b+43|0]=c>>>24;c=e|f|h;e=c|0;w[b+44|0]=e;w[b+45|0]=e>>>8;w[b+46|0]=e>>>16;w[b+47|0]=e>>>24;d=y[a+48>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=y[a+52>>2];i=f<<24;g=d&-16777216;f=g>>>24|0;c=i|g<<8|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));w[b+48|0]=c;w[b+49|0]=c>>>8;w[b+50|0]=c>>>16;w[b+51|0]=c>>>24;c=e|f|h;e=c|0;w[b+52|0]=e;w[b+53|0]=e>>>8;w[b+54|0]=e>>>16;w[b+55|0]=e>>>24;d=y[a+56>>2];h=d<<24|(d&65280)<<8;f=d&16711680;e=f>>>8|0;c=b;i=f<<24;g=d&-16777216;f=g>>>24|0;b=y[a+60>>2];b=i|g<<8|(((b&255)<<24|d>>>8)&-16777216|((b&16777215)<<8|d>>>24)&16711680|(b>>>8&65280|b>>>24));w[c+56|0]=b;w[c+57|0]=b>>>8;w[c+58|0]=b>>>16;w[c+59|0]=b>>>24;b=e|f|h;b=b|0;w[c+60|0]=b;w[c+61|0]=b>>>8;w[c+62|0]=b>>>16;w[c+63|0]=b>>>24;ja(j,704);ja(a,208);T=j+704|0;return 0}function ec(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0;b=T-2048|0;T=b;i=b+640|0;qa(i,a);c=y[a+36>>2];y[b+352>>2]=y[a+32>>2];y[b+356>>2]=c;c=y[a+28>>2];y[b+344>>2]=y[a+24>>2];y[b+348>>2]=c;c=y[a+20>>2];y[b+336>>2]=y[a+16>>2];y[b+340>>2]=c;c=y[a+12>>2];y[b+328>>2]=y[a+8>>2];y[b+332>>2]=c;c=y[a+4>>2];y[b+320>>2]=y[a>>2];y[b+324>>2]=c;c=y[a+44>>2];y[b+360>>2]=y[a+40>>2];y[b+364>>2]=c;c=y[a+52>>2];y[b+368>>2]=y[a+48>>2];y[b+372>>2]=c;c=y[a+60>>2];y[b+376>>2]=y[a+56>>2];y[b+380>>2]=c;d=a- -64|0;c=y[d+4>>2];y[b+384>>2]=y[d>>2];y[b+388>>2]=c;c=y[a+76>>2];y[b+392>>2]=y[a+72>>2];y[b+396>>2]=c;c=y[a+84>>2];y[b+400>>2]=y[a+80>>2];y[b+404>>2]=c;c=y[a+92>>2];y[b+408>>2]=y[a+88>>2];y[b+412>>2]=c;c=y[a+100>>2];y[b+416>>2]=y[a+96>>2];y[b+420>>2]=c;c=y[a+108>>2];y[b+424>>2]=y[a+104>>2];y[b+428>>2]=c;c=y[a+116>>2];y[b+432>>2]=y[a+112>>2];y[b+436>>2]=c;e=b+480|0;d=b+320|0;xa(e,d);c=b+160|0;f=b+600|0;ga(c,e,f);g=b+520|0;h=b+560|0;ga(b+200|0,g,h);ga(b+240|0,h,f);ga(b+280|0,e,g);sa(e,c,i);ga(d,e,f);l=b+360|0;ga(l,g,h);m=b+400|0;ga(m,h,f);n=b+440|0;ga(n,e,g);a=b+800|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+960|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1120|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1280|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1440|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);a=b+1600|0;qa(a,d);sa(e,c,a);ga(d,e,f);ga(l,g,h);ga(m,h,f);ga(n,e,g);qa(b+1760|0,d);y[b+32>>2]=0;y[b+36>>2]=0;y[b+24>>2]=0;y[b+28>>2]=0;y[b+16>>2]=0;y[b+20>>2]=0;y[b+8>>2]=0;y[b+12>>2]=0;y[b>>2]=0;y[b+4>>2]=0;y[b+44>>2]=0;y[b+48>>2]=0;y[b+40>>2]=1;y[b+52>>2]=0;y[b+56>>2]=0;y[b+60>>2]=0;y[b+64>>2]=0;y[b+68>>2]=0;y[b+72>>2]=0;y[b+76>>2]=0;y[b+80>>2]=1;o(b+84|0,0,76);e=b+120|0;j=b+2008|0;k=b+1968|0;i=b+80|0;d=b+40|0;a=252;while(1){c=y[b+36>>2];y[b+1960>>2]=y[b+32>>2];y[b+1964>>2]=c;c=y[b+28>>2];y[b+1952>>2]=y[b+24>>2];y[b+1956>>2]=c;c=y[b+20>>2];y[b+1944>>2]=y[b+16>>2];y[b+1948>>2]=c;c=y[b+12>>2];y[b+1936>>2]=y[b+8>>2];y[b+1940>>2]=c;c=y[b+4>>2];y[b+1928>>2]=y[b>>2];y[b+1932>>2]=c;c=y[d+36>>2];y[k+32>>2]=y[d+32>>2];y[k+36>>2]=c;c=y[d+28>>2];y[k+24>>2]=y[d+24>>2];y[k+28>>2]=c;c=y[d+20>>2];y[k+16>>2]=y[d+16>>2];y[k+20>>2]=c;c=y[d+12>>2];y[k+8>>2]=y[d+8>>2];y[k+12>>2]=c;c=y[d+4>>2];y[k>>2]=y[d>>2];y[k+4>>2]=c;c=y[i+36>>2];y[j+32>>2]=y[i+32>>2];y[j+36>>2]=c;c=y[i+28>>2];y[j+24>>2]=y[i+24>>2];y[j+28>>2]=c;c=y[i+20>>2];y[j+16>>2]=y[i+16>>2];y[j+20>>2]=c;c=y[i+12>>2];y[j+8>>2]=y[i+8>>2];y[j+12>>2]=c;c=y[i+4>>2];y[j>>2]=y[i>>2];y[j+4>>2]=c;c=a;q=w[a+33712|0];p=b+480|0;xa(p,b+1928|0);a:{if((q|0)>0){a=b+320|0;ga(a,p,f);ga(l,g,h);ga(m,h,f);ga(n,p,g);sa(p,a,(b+640|0)+E((q&254)>>>1|0,160)|0);break a}if((q|0)>=0){break a}a=b+320|0;p=b+480|0;ga(a,p,f);ga(l,g,h);ga(m,h,f);ga(n,p,g);Hb(p,a,(b+640|0)+E((0-q&254)>>>1|0,160)|0);}r=b+480|0;ga(b,r,f);ga(d,g,h);ga(i,h,f);ga(e,r,g);a=c-1|0;if(c){continue}break}s=y[b+40>>2];t=y[b+80>>2];u=y[b+44>>2];f=y[b+84>>2];g=y[b+48>>2];h=y[b+88>>2];j=y[b+52>>2];k=y[b+92>>2];l=y[b+56>>2];m=y[b+96>>2];n=y[b+60>>2];q=y[b+100>>2];p=y[b+64>>2];e=y[b+104>>2];i=y[b+68>>2];d=y[b+108>>2];c=y[b+72>>2];a=y[b+112>>2];y[b+676>>2]=y[b+76>>2]-y[b+116>>2];y[b+672>>2]=c-a;y[b+668>>2]=i-d;y[b+664>>2]=p-e;y[b+660>>2]=n-q;y[b+656>>2]=l-m;y[b+652>>2]=j-k;y[b+648>>2]=g-h;y[b+644>>2]=u-f;y[b+640>>2]=s-t;pa(r,b);c=ya(r,32);pa(r,b+640|0);a=ya(r,32);T=b+2048|0;return a&c}function $b(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=T-288|0;T=c;f=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);g=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);h=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);i=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);j=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);k=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);l=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);m=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);a=y[b+124>>2];y[c+280>>2]=y[b+120>>2];y[c+284>>2]=a;a=y[b+116>>2];y[c+272>>2]=y[b+112>>2];y[c+276>>2]=a;a=y[b+100>>2];y[c+240>>2]=y[b+96>>2];y[c+244>>2]=a;a=y[b+108>>2];y[c+248>>2]=y[b+104>>2];y[c+252>>2]=a;a=y[b+116>>2];y[c+224>>2]=y[b+112>>2];y[c+228>>2]=a;a=y[b+124>>2];y[c+232>>2]=y[b+120>>2];y[c+236>>2]=a;a=c+256|0;ia(a,c+240|0,c+224|0);e=y[c+268>>2];y[b+120>>2]=y[c+264>>2];y[b+124>>2]=e;e=y[c+260>>2];y[b+112>>2]=y[c+256>>2];y[b+116>>2]=e;e=y[b+84>>2];y[c+208>>2]=y[b+80>>2];y[c+212>>2]=e;e=y[b+92>>2];y[c+216>>2]=y[b+88>>2];y[c+220>>2]=e;e=y[b+100>>2];y[c+192>>2]=y[b+96>>2];y[c+196>>2]=e;e=y[b+108>>2];y[c+200>>2]=y[b+104>>2];y[c+204>>2]=e;ia(a,c+208|0,c+192|0);e=y[c+268>>2];y[b+104>>2]=y[c+264>>2];y[b+108>>2]=e;e=y[c+260>>2];y[b+96>>2]=y[c+256>>2];y[b+100>>2]=e;e=b- -64|0;d=y[e+4>>2];y[c+176>>2]=y[e>>2];y[c+180>>2]=d;d=y[b+76>>2];y[c+184>>2]=y[b+72>>2];y[c+188>>2]=d;d=y[b+84>>2];y[c+160>>2]=y[b+80>>2];y[c+164>>2]=d;d=y[b+92>>2];y[c+168>>2]=y[b+88>>2];y[c+172>>2]=d;ia(a,c+176|0,c+160|0);d=y[c+268>>2];y[b+88>>2]=y[c+264>>2];y[b+92>>2]=d;d=y[c+260>>2];y[b+80>>2]=y[c+256>>2];y[b+84>>2]=d;d=y[b+52>>2];y[c+144>>2]=y[b+48>>2];y[c+148>>2]=d;d=y[b+60>>2];y[c+152>>2]=y[b+56>>2];y[c+156>>2]=d;d=y[e+4>>2];y[c+128>>2]=y[e>>2];y[c+132>>2]=d;d=y[b+76>>2];y[c+136>>2]=y[b+72>>2];y[c+140>>2]=d;ia(a,c+144|0,c+128|0);d=y[c+268>>2];y[b+72>>2]=y[c+264>>2];y[b+76>>2]=d;d=y[c+260>>2];y[e>>2]=y[c+256>>2];y[e+4>>2]=d;d=y[b+36>>2];y[c+112>>2]=y[b+32>>2];y[c+116>>2]=d;d=y[b+44>>2];y[c+120>>2]=y[b+40>>2];y[c+124>>2]=d;d=y[b+52>>2];y[c+96>>2]=y[b+48>>2];y[c+100>>2]=d;d=y[b+60>>2];y[c+104>>2]=y[b+56>>2];y[c+108>>2]=d;ia(a,c+112|0,c+96|0);d=y[c+268>>2];y[b+56>>2]=y[c+264>>2];y[b+60>>2]=d;d=y[c+260>>2];y[b+48>>2]=y[c+256>>2];y[b+52>>2]=d;d=y[b+20>>2];y[c+80>>2]=y[b+16>>2];y[c+84>>2]=d;d=y[b+28>>2];y[c+88>>2]=y[b+24>>2];y[c+92>>2]=d;d=y[b+36>>2];y[c+64>>2]=y[b+32>>2];y[c+68>>2]=d;d=y[b+44>>2];y[c+72>>2]=y[b+40>>2];y[c+76>>2]=d;ia(a,c+80|0,c- -64|0);d=y[c+268>>2];y[b+40>>2]=y[c+264>>2];y[b+44>>2]=d;d=y[c+260>>2];y[b+32>>2]=y[c+256>>2];y[b+36>>2]=d;d=y[b+4>>2];y[c+48>>2]=y[b>>2];y[c+52>>2]=d;d=y[b+12>>2];y[c+56>>2]=y[b+8>>2];y[c+60>>2]=d;d=y[b+20>>2];y[c+32>>2]=y[b+16>>2];y[c+36>>2]=d;d=y[b+28>>2];y[c+40>>2]=y[b+24>>2];y[c+44>>2]=d;ia(a,c+48|0,c+32|0);d=y[c+268>>2];y[b+24>>2]=y[c+264>>2];y[b+28>>2]=d;d=y[c+260>>2];y[b+16>>2]=y[c+256>>2];y[b+20>>2]=d;d=y[c+276>>2];y[c+16>>2]=y[c+272>>2];y[c+20>>2]=d;d=y[c+284>>2];y[c+24>>2]=y[c+280>>2];y[c+28>>2]=d;d=y[b+4>>2];y[c>>2]=y[b>>2];y[c+4>>2]=d;d=y[b+12>>2];y[c+8>>2]=y[b+8>>2];y[c+12>>2]=d;ia(a,c+16|0,c);a=y[c+268>>2];y[b+8>>2]=y[c+264>>2];y[b+12>>2]=a;a=y[c+260>>2];y[b>>2]=y[c+256>>2];y[b+4>>2]=a;y[b+12>>2]=y[b+12>>2]^l;y[b+8>>2]=y[b+8>>2]^k;y[b+4>>2]=y[b+4>>2]^j;y[b>>2]=y[b>>2]^m;y[e>>2]=y[e>>2]^i;y[b+68>>2]=y[b+68>>2]^h;y[b+72>>2]=y[b+72>>2]^g;y[b+76>>2]=y[b+76>>2]^f;T=c+288|0;}function jb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-480|0;T=d;c=z[b|0];w[d+289|0]=c>>>4;w[d+288|0]=c&15;c=z[b+1|0];w[d+291|0]=c>>>4;w[d+290|0]=c&15;c=z[b+2|0];w[d+293|0]=c>>>4;w[d+292|0]=c&15;c=z[b+3|0];w[d+295|0]=c>>>4;w[d+294|0]=c&15;c=z[b+4|0];w[d+297|0]=c>>>4;w[d+296|0]=c&15;c=z[b+5|0];w[d+299|0]=c>>>4;w[d+298|0]=c&15;c=z[b+6|0];w[d+301|0]=c>>>4;w[d+300|0]=c&15;c=z[b+7|0];w[d+303|0]=c>>>4;w[d+302|0]=c&15;c=z[b+8|0];w[d+305|0]=c>>>4;w[d+304|0]=c&15;c=z[b+9|0];w[d+307|0]=c>>>4;w[d+306|0]=c&15;c=z[b+10|0];w[d+309|0]=c>>>4;w[d+308|0]=c&15;c=z[b+11|0];w[d+311|0]=c>>>4;w[d+310|0]=c&15;c=z[b+12|0];w[d+313|0]=c>>>4;w[d+312|0]=c&15;c=z[b+13|0];w[d+315|0]=c>>>4;w[d+314|0]=c&15;c=z[b+14|0];w[d+317|0]=c>>>4;w[d+316|0]=c&15;c=z[b+15|0];w[d+319|0]=c>>>4;w[d+318|0]=c&15;c=z[b+16|0];w[d+321|0]=c>>>4;w[d+320|0]=c&15;c=z[b+17|0];w[d+323|0]=c>>>4;w[d+322|0]=c&15;c=z[b+18|0];w[d+325|0]=c>>>4;w[d+324|0]=c&15;c=z[b+19|0];w[d+327|0]=c>>>4;w[d+326|0]=c&15;c=z[b+20|0];w[d+329|0]=c>>>4;w[d+328|0]=c&15;c=z[b+21|0];w[d+331|0]=c>>>4;w[d+330|0]=c&15;c=z[b+22|0];w[d+333|0]=c>>>4;w[d+332|0]=c&15;c=z[b+23|0];w[d+335|0]=c>>>4;w[d+334|0]=c&15;c=z[b+24|0];w[d+337|0]=c>>>4;w[d+336|0]=c&15;c=z[b+25|0];w[d+339|0]=c>>>4;w[d+338|0]=c&15;c=z[b+26|0];w[d+341|0]=c>>>4;w[d+340|0]=c&15;c=z[b+27|0];w[d+343|0]=c>>>4;w[d+342|0]=c&15;c=z[b+28|0];w[d+345|0]=c>>>4;w[d+344|0]=c&15;c=z[b+29|0];w[d+347|0]=c>>>4;w[d+346|0]=c&15;c=z[b+30|0];w[d+349|0]=c>>>4;w[d+348|0]=c&15;b=z[b+31|0];w[d+351|0]=b>>>4;w[d+350|0]=b&15;b=0;while(1){e=(d+288|0)+f|0;b=z[e|0]+b|0;c=b+8|0;w[e|0]=b-(c&240);b=z[e+1|0]+(c<<24>>24>>4)|0;c=b+8|0;w[e+1|0]=b-(c&240);b=z[e+2|0]+(c<<24>>24>>4)|0;c=b+8|0;w[e+2|0]=b-(c&240);b=c<<24>>24>>4;f=f+3|0;if((f|0)!=63){continue}break}w[d+351|0]=z[d+351|0]+b;y[a+32>>2]=0;y[a+36>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+8>>2]=0;y[a+12>>2]=0;y[a>>2]=0;y[a+4>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;f=a+40|0;y[f>>2]=1;y[a+52>>2]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=1;o(a+84|0,0,76);l=a+120|0;c=a+80|0;g=d+208|0;k=d+168|0;h=d+248|0;b=1;while(1){e=d+8|0;Kc(e,b>>>1|0,w[(d+288|0)+b|0]);i=d+128|0;fc(i,a,e);ga(a,i,h);ga(f,k,g);ga(c,g,h);ga(l,i,k);e=b>>>0<62;b=b+2|0;if(e){continue}break}b=y[a+36>>2];y[d+392>>2]=y[a+32>>2];y[d+396>>2]=b;b=y[a+28>>2];y[d+384>>2]=y[a+24>>2];y[d+388>>2]=b;b=y[a+20>>2];y[d+376>>2]=y[a+16>>2];y[d+380>>2]=b;b=y[a+12>>2];y[d+368>>2]=y[a+8>>2];y[d+372>>2]=b;b=y[a+4>>2];y[d+360>>2]=y[a>>2];y[d+364>>2]=b;b=y[f+4>>2];y[d+400>>2]=y[f>>2];y[d+404>>2]=b;b=y[f+12>>2];y[d+408>>2]=y[f+8>>2];y[d+412>>2]=b;b=y[f+20>>2];y[d+416>>2]=y[f+16>>2];y[d+420>>2]=b;b=y[f+28>>2];y[d+424>>2]=y[f+24>>2];y[d+428>>2]=b;b=y[f+36>>2];y[d+432>>2]=y[f+32>>2];y[d+436>>2]=b;b=y[c+4>>2];y[d+440>>2]=y[c>>2];y[d+444>>2]=b;b=y[c+12>>2];y[d+448>>2]=y[c+8>>2];y[d+452>>2]=b;b=y[c+20>>2];y[d+456>>2]=y[c+16>>2];y[d+460>>2]=b;b=y[c+28>>2];y[d+464>>2]=y[c+24>>2];y[d+468>>2]=b;b=y[c+36>>2];y[d+472>>2]=y[c+32>>2];y[d+476>>2]=b;j=d+360|0;xa(i,j);ga(j,i,h);e=d+400|0;ga(e,k,g);b=d+440|0;ga(b,g,h);xa(i,j);ga(j,i,h);ga(e,k,g);ga(b,g,h);xa(i,j);ga(j,i,h);ga(e,k,g);ga(b,g,h);xa(i,j);ga(a,i,h);ga(f,k,g);ga(c,g,h);ga(l,i,k);b=0;while(1){e=d+8|0;Kc(e,b>>>1|0,w[(d+288|0)+b|0]);j=d+128|0;fc(j,a,e);ga(a,j,h);ga(f,k,g);ga(c,g,h);ga(l,j,k);e=b>>>0<62;b=b+2|0;if(e){continue}break}T=d+480|0;}function gd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);h=d^1886610805;f=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);g=f^1936682341;i=d^1852142177;j=f^1819895653;d=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);f=d^1852075885;e=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);l=e^1685025377;k=d^2037671283;m=e^1952801890;d=c&-8;if(d){d=b+d|0;while(1){p=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);e=k^p;i=i+e|0;t=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);m=m^t;j=j+m|0;j=e>>>0>i>>>0?j+1|0:j;g=g+l|0;o=g+1|0;k=g;g=f+h|0;k=h>>>0>g>>>0?o:k;f=Ci(f,l,13)^g;h=i+f|0;n=W^k;l=j+n|0;n=Ci(f,n,17)^h;l=f>>>0>h>>>0?l+1|0:l;q=l^W;s=Ci(n,q,13);r=W;e=Ci(e,m,16);f=j^W;j=e^i;i=Ci(g,k,32);e=j+i|0;g=W+f|0;k=e>>>0>>0?g+1|0:g;i=q+k|0;o=i+1|0;g=i;i=e+n|0;g=i>>>0>>0?o:g;m=i^s;n=g^r;q=Ci(m,n,17);s=W;f=Ci(j,f,21);j=k^W;k=e^f;h=Ci(h,l,32);e=k+h|0;f=W+j|0;r=e>>>0>>0?f+1|0:f;h=r+n|0;o=h+1|0;f=h;h=e+m|0;n=h>>>0>>0?o:f;f=h^q;l=n^s;j=Ci(k,j,16);k=r^W;m=k;e=e^j;j=Ci(e,k,21);q=W;i=Ci(i,g,32);e=i+e|0;k=e^j;g=W+m|0;g=e>>>0>>0?g+1|0:g;m=g^q;i=Ci(h,n,32);j=W;h=e^p;g=g^t;b=b+8|0;if((d|0)!=(b|0)){continue}break}b=d;}e=c<<24;d=0;a:{switch((c&7)-1|0){case 6:e=e|z[b+6|0]<<16;case 5:e=e|z[b+5|0]<<8;case 4:e=e|z[b+4|0];case 3:d=z[b+3|0]<<24;case 2:d=d|z[b+2|0]<<16;case 1:d=d|z[b+1|0]<<8;case 0:d=z[b|0]|d;break;default:break a}}b=d^k;c=e^m;k=Ci(b,c,16);c=c+j|0;b=b+i|0;c=b>>>0>>0?c+1|0:c;j=b^k;k=c^W;m=Ci(j,k,21);n=W;i=g+l|0;o=i+1|0;g=i;i=f+h|0;h=h>>>0>i>>>0?o:g;g=h;p=Ci(i,h,32);h=j+p|0;j=m^h;k=W+k|0;k=h>>>0

>>0?k+1|0:k;m=n^k;n=Ci(j,m,16);p=W;f=Ci(f,l,13)^i;b=b+f|0;l=W^g;c=l+c|0;i=b>>>0>>0?c+1|0:c;g=Ci(b,i,32);c=j+g|0;j=n^c;m=W+m|0;g=c>>>0>>0?m+1|0:m;m=g^p;n=Ci(j,m,21);p=W;l=Ci(f,l,17)^b;f=l;b=h+f|0;i=W^i;h=i+k|0;h=b>>>0>>0?h+1|0:h;k=h;f=n;n=Ci(b,h,32);h=j+n|0;f=f^h;j=W+m|0;j=h>>>0>>0?j+1|0:j;m=j^p;n=Ci(f,m,16);p=W;o=c;i=Ci(l,i,13)^b;c=i;b=o+c|0;o=g;g=k^W;l=o+g|0;c=b>>>0>>0?l+1|0:l;k=c;c=Ci(b,c,32);l=m+W|0;c=f+(c^255)|0;m=c>>>0>>0?l+1|0:l;f=p^m;l=c^n;n=Ci(l,f,21);p=W;i=Ci(i,g,17)^b;d=d^h;b=i+d|0;g=k^W;e=g+(e^j)|0;d=b>>>0>>0?e+1|0:e;j=d;d=Ci(b,d,32);e=f+W|0;d=d+l|0;f=d>>>0>>0?e+1|0:e;e=f^p;h=d^n;l=Ci(h,e,16);k=W;i=Ci(i,g,13)^b;b=c+i|0;g=W^j;j=m+g|0;c=b>>>0>>0?j+1|0:j;j=c;c=Ci(b,c,32);o=k;e=e+W|0;c=c+h|0;k=c>>>0>>0?e+1|0:e;e=o^k;h=c^l;l=Ci(h,e,21);m=W;i=Ci(i,g,17);g=j^W;f=f+g|0;n=f+1|0;o=f;j=d;f=b^i;d=d+f|0;b=j>>>0>d>>>0?n:o;i=b;b=Ci(d,b,32);e=e+W|0;b=b+h|0;j=b>>>0>>0?e+1|0:e;e=j^m;h=b^l;l=Ci(h,e,16);m=W;f=Ci(f,g,13);i=i^W;g=k+i|0;f=d^f;d=c+f|0;c=d>>>0>>0?g+1|0:g;g=c;c=Ci(d,c,32);e=e+W|0;c=c+h|0;k=c>>>0>>0?e+1|0:e;e=k^m;h=c^l;l=Ci(h,e,21);m=W;f=Ci(f,i,17);i=g^W;g=j+i|0;o=g+1|0;j=g;g=d^f;d=b+g|0;f=d>>>0>>0?o:j;b=Ci(d,f,32);e=e+W|0;b=b+h|0;j=b>>>0>>0?e+1|0:e;e=j^m;h=b^l;l=Ci(h,e,16);m=W;i=Ci(g,i,13);f=f^W;g=k+f|0;i=d^i;d=c+i|0;c=d>>>0>>0?g+1|0:g;g=c;c=Ci(d,c,32);e=e+W|0;c=c+h|0;e=c>>>0>>0?e+1|0:e;h=Ci(c^l,e^m,21);l=W;d=Ci(i,f,17)^d;f=g^W;i=Ci(d,f,13);f=f+j|0;d=b+d|0;b=W^(b>>>0>d>>>0?f+1|0:f);d=d^i;h=Ci(d,b,17)^h;f=W^l;b=b+e|0;g=b+1|0;e=b;b=c+d|0;c=c>>>0>b>>>0?g:e;b=Ci(b,c,32)^h^b;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;b=c^(W^f);w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;return 0}function Fc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;c=T-624|0;T=c;d=c+480|0;fa(d,b);ga(d,1632,d);f=y[c+516>>2];y[c+276>>2]=f;g=y[c+512>>2];y[c+272>>2]=g;h=y[c+508>>2];y[c+268>>2]=h;i=y[c+504>>2];y[c+264>>2]=i;j=y[c+500>>2];y[c+260>>2]=j;k=y[c+496>>2];y[c+256>>2]=k;l=y[c+492>>2];y[c+252>>2]=l;m=y[c+488>>2];y[c+248>>2]=m;n=y[c+484>>2];y[c+244>>2]=n;p=y[c+480>>2];y[c+240>>2]=p+1;e=c+240|0;ga(e,e,33968);y[c+468>>2]=f-12055116;y[c+464>>2]=g-18696448;y[c+460>>2]=h-3247719;y[c+456>>2]=i-6275908;y[c+452>>2]=j-8787816;y[c+448>>2]=k+114729;y[c+444>>2]=l+6949391;y[c+440>>2]=m-15372611;y[c+436>>2]=n+13857413;y[c+432>>2]=p-10913610;o=c+192|0;ga(o,d,1584);y[c+228>>2]=0-y[c+228>>2];y[c+224>>2]=0-y[c+224>>2];y[c+220>>2]=0-y[c+220>>2];y[c+216>>2]=0-y[c+216>>2];y[c+212>>2]=0-y[c+212>>2];y[c+208>>2]=0-y[c+208>>2];y[c+204>>2]=0-y[c+204>>2];y[c+200>>2]=0-y[c+200>>2];y[c+196>>2]=0-y[c+196>>2];y[c+192>>2]=y[c+192>>2]^-1;ga(o,o,c+432|0);K=c+384|0;d=cc(K,e,o);e=c+336|0;ga(e,K,b);L=c+576|0;pa(L,e);N=z[c+576|0];B=y[c+420>>2];e=y[c+372>>2];C=y[c+416>>2];q=y[c+368>>2];D=y[c+412>>2];r=y[c+364>>2];E=y[c+408>>2];s=y[c+360>>2];F=y[c+404>>2];t=y[c+356>>2];G=y[c+400>>2];u=y[c+352>>2];H=y[c+396>>2];v=y[c+348>>2];I=y[c+392>>2];w=y[c+344>>2];J=y[c+388>>2];x=y[c+340>>2];M=y[c+384>>2];A=y[c+336>>2];b=d-1|0;y[c+612>>2]=b&f;y[c+608>>2]=b&g;y[c+604>>2]=b&h;y[c+600>>2]=b&i;y[c+596>>2]=b&j;y[c+592>>2]=b&k;y[c+588>>2]=b&l;y[c+584>>2]=b&m;y[c+580>>2]=b&n;y[c+576>>2]=p|0-d;d=0-(N&1)|0;A=b&(0-(A^d&(A^0-A))^M)^M;y[c+384>>2]=A;x=J^b&(J^0-(x^d&(x^0-x)));y[c+388>>2]=x;w=I^b&(I^0-(w^d&(w^0-w)));y[c+392>>2]=w;v=H^b&(H^0-(v^d&(v^0-v)));y[c+396>>2]=v;u=G^b&(G^0-(u^d&(u^0-u)));y[c+400>>2]=u;t=F^b&(F^0-(t^d&(t^0-t)));y[c+404>>2]=t;s=E^b&(E^0-(s^d&(s^0-s)));y[c+408>>2]=s;r=D^b&(D^0-(r^d&(r^0-r)));y[c+412>>2]=r;q=C^b&(C^0-(q^d&(q^0-q)));y[c+416>>2]=q;d=B^b&(B^0-(e^d&(e^0-e)));y[c+420>>2]=d;y[c+564>>2]=f;y[c+560>>2]=g;y[c+556>>2]=h;y[c+552>>2]=i;y[c+548>>2]=j;y[c+544>>2]=k;y[c+540>>2]=l;y[c+536>>2]=m;y[c+532>>2]=n;y[c+528>>2]=p-1;b=c+528|0;ga(b,b,L);ga(b,b,34016);f=y[c+192>>2];g=y[c+528>>2];h=y[c+196>>2];i=y[c+532>>2];j=y[c+200>>2];k=y[c+536>>2];l=y[c+204>>2];m=y[c+540>>2];n=y[c+208>>2];p=y[c+544>>2];e=y[c+212>>2];B=y[c+548>>2];C=y[c+216>>2];D=y[c+552>>2];E=y[c+220>>2];F=y[c+556>>2];G=y[c+224>>2];H=y[c+560>>2];I=y[c+228>>2];J=y[c+564>>2];y[c+180>>2]=d<<1;y[c+176>>2]=q<<1;y[c+172>>2]=r<<1;y[c+168>>2]=s<<1;y[c+164>>2]=t<<1;y[c+160>>2]=u<<1;y[c+156>>2]=v<<1;y[c+152>>2]=w<<1;y[c+148>>2]=x<<1;y[c+144>>2]=A<<1;y[c+564>>2]=J-I;y[c+560>>2]=H-G;y[c+556>>2]=F-E;y[c+552>>2]=D-C;y[c+548>>2]=B-e;y[c+544>>2]=p-n;y[c+540>>2]=m-l;y[c+536>>2]=k-j;y[c+532>>2]=i-h;y[c+528>>2]=g-f;d=c+144|0;ga(d,d,o);o=c+96|0;ga(o,b,34064);fa(c+288|0,K);b=y[c+324>>2];y[c+84>>2]=0-b;f=y[c+320>>2];y[c+80>>2]=0-f;g=y[c+316>>2];y[c+76>>2]=0-g;h=y[c+312>>2];y[c+72>>2]=0-h;i=y[c+308>>2];y[c+68>>2]=0-i;j=y[c+304>>2];y[c+64>>2]=0-j;k=y[c+300>>2];y[c+60>>2]=0-k;l=y[c+296>>2];y[c+56>>2]=0-l;m=y[c+292>>2];y[c+52>>2]=0-m;n=y[c+288>>2];y[c+48>>2]=1-n;y[c+36>>2]=b;y[c+32>>2]=f;y[c+28>>2]=g;y[c+24>>2]=h;y[c+20>>2]=i;y[c+16>>2]=j;y[c+12>>2]=k;y[c+8>>2]=l;y[c+4>>2]=m;y[c>>2]=n+1;ga(a,d,c);b=c+48|0;ga(a+40|0,b,o);ga(a+80|0,o,c);ga(a+120|0,d,b);T=c+624|0;}function Cc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=T+-64|0;T=g;a:{if((c-65&255)>>>0>191){f=-1;if(!(z[a+80|0]|z[a+81|0]<<8|(z[a+82|0]<<16|z[a+83|0]<<24)|(z[a+84|0]|z[a+85|0]<<8|(z[a+86|0]<<16|z[a+87|0]<<24)))){h=z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24);if(h>>>0>=129){d=a- -64|0;e=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);f=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);i=f;h=e+128|0;f=h>>>0<128?f+1|0:f;w[d|0]=h;w[d+1|0]=h>>>8;w[d+2|0]=h>>>16;w[d+3|0]=h>>>24;w[d+4|0]=f;w[d+5|0]=f>>>8;w[d+6|0]=f>>>16;w[d+7|0]=f>>>24;f=z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24);d=(i|0)==-1&e>>>0>4294967167;e=d+(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))|0;f=d>>>0>e>>>0?f+1|0:f;w[a+72|0]=e;w[a+73|0]=e>>>8;w[a+74|0]=e>>>16;w[a+75|0]=e>>>24;w[a+76|0]=f;w[a+77|0]=f>>>8;w[a+78|0]=f>>>16;w[a+79|0]=f>>>24;f=a+96|0;Eb(a,f);d=(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))-128|0;w[a+352|0]=d;w[a+353|0]=d>>>8;w[a+354|0]=d>>>16;w[a+355|0]=d>>>24;if(d>>>0>=129){break a}if(d){t(f,a+224|0,d);}h=z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24);}d=a- -64|0;f=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);j=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);e=j;i=f+h|0;e=i>>>0>>0?e+1|0:e;w[d|0]=i;w[d+1|0]=i>>>8;w[d+2|0]=i>>>16;w[d+3|0]=i>>>24;w[d+4|0]=e;w[d+5|0]=e>>>8;w[d+6|0]=e>>>16;w[d+7|0]=e>>>24;d=(e|0)==(j|0)&f>>>0>i>>>0|e>>>0>>0;f=z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24);e=d+(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))|0;f=e>>>0>>0?f+1|0:f;w[a+72|0]=e;w[a+73|0]=e>>>8;w[a+74|0]=e>>>16;w[a+75|0]=e>>>24;w[a+76|0]=f;w[a+77|0]=f>>>8;w[a+78|0]=f>>>16;w[a+79|0]=f>>>24;if(z[a+356|0]){w[a+88|0]=255;w[a+89|0]=255;w[a+90|0]=255;w[a+91|0]=255;w[a+92|0]=255;w[a+93|0]=255;w[a+94|0]=255;w[a+95|0]=255;}w[a+80|0]=255;w[a+81|0]=255;w[a+82|0]=255;w[a+83|0]=255;w[a+84|0]=255;w[a+85|0]=255;w[a+86|0]=255;w[a+87|0]=255;d=a+96|0;f=0;e=256-h|0;if(e){o(d+h|0,0,e);}Eb(a,d);e=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[g>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[g+4>>2]=e;e=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[g+8>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[g+12>>2]=e;e=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[g+16>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[g+20>>2]=e;e=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[g+24>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[g+28>>2]=e;e=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[g+32>>2]=z[a+32|0]|z[a+33|0]<<8|(z[a+34|0]<<16|z[a+35|0]<<24);y[g+36>>2]=e;e=z[a+44|0]|z[a+45|0]<<8|(z[a+46|0]<<16|z[a+47|0]<<24);y[g+40>>2]=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[g+44>>2]=e;e=z[a+52|0]|z[a+53|0]<<8|(z[a+54|0]<<16|z[a+55|0]<<24);y[g+48>>2]=z[a+48|0]|z[a+49|0]<<8|(z[a+50|0]<<16|z[a+51|0]<<24);y[g+52>>2]=e;e=z[a+60|0]|z[a+61|0]<<8|(z[a+62|0]<<16|z[a+63|0]<<24);y[g+56>>2]=z[a+56|0]|z[a+57|0]<<8|(z[a+58|0]<<16|z[a+59|0]<<24);y[g+60>>2]=e;if(c){t(b,g,c);}ja(a,64);ja(d,256);}T=g- -64|0;return f}na();s();}Q(1386,1234,306,1142);s();}function se(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-192|0;T=d;y[d+128>>2]=0;y[d+132>>2]=0;y[d+136>>2]=0;y[d+140>>2]=0;y[d+144>>2]=0;y[d+148>>2]=0;y[d+152>>2]=0;y[d+156>>2]=0;y[d+96>>2]=0;y[d+100>>2]=0;y[d+104>>2]=0;y[d+108>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+120>>2]=0;y[d+124>>2]=0;e=y[9821];y[d+160>>2]=y[9820];y[d+164>>2]=e;e=y[9823];y[d+168>>2]=y[9822];y[d+172>>2]=e;e=y[9825];y[d+176>>2]=y[9824];y[d+180>>2]=e;e=y[9827];y[d+184>>2]=y[9826];y[d+188>>2]=e;e=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);y[d+64>>2]=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);y[d+68>>2]=e;e=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);y[d+72>>2]=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);y[d+76>>2]=e;e=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);y[d+80>>2]=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);y[d+84>>2]=e;e=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);y[d+88>>2]=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);y[d+92>>2]=e;f=d+128|0;e=d- -64|0;Ec(f,e);Pa(f);c=y[d+156>>2];y[d+24>>2]=y[d+152>>2];y[d+28>>2]=c;c=y[d+148>>2];y[d+16>>2]=y[d+144>>2];y[d+20>>2]=c;c=y[d+140>>2];y[d+8>>2]=y[d+136>>2];y[d+12>>2]=c;c=y[d+132>>2];y[d>>2]=y[d+128>>2];y[d+4>>2]=c;y[d+120>>2]=0;y[d+124>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+104>>2]=0;y[d+108>>2]=0;y[d+96>>2]=0;y[d+100>>2]=0;c=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[d+64>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+68>>2]=c;c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+72>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+76>>2]=c;c=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+80>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+84>>2]=c;c=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+88>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+92>>2]=c;y[d+56>>2]=0;y[d+60>>2]=0;y[d+48>>2]=0;y[d+52>>2]=0;y[d+40>>2]=0;y[d+44>>2]=0;y[d+32>>2]=0;y[d+36>>2]=0;De(e,d);b=y[d+124>>2];y[d+184>>2]=y[d+120>>2];y[d+188>>2]=b;b=y[d+116>>2];y[d+176>>2]=y[d+112>>2];y[d+180>>2]=b;b=y[d+108>>2];y[d+168>>2]=y[d+104>>2];y[d+172>>2]=b;b=y[d+100>>2];y[d+160>>2]=y[d+96>>2];y[d+164>>2]=b;b=y[d+92>>2];y[d+152>>2]=y[d+88>>2];y[d+156>>2]=b;b=y[d+84>>2];y[d+144>>2]=y[d+80>>2];y[d+148>>2]=b;b=y[d+76>>2];y[d+136>>2]=y[d+72>>2];y[d+140>>2]=b;b=y[d+68>>2];y[d+128>>2]=y[d+64>>2];y[d+132>>2]=b;Pa(f);c=y[d+156>>2];b=y[d+152>>2];w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;w[a+28|0]=c;w[a+29|0]=c>>>8;w[a+30|0]=c>>>16;w[a+31|0]=c>>>24;c=y[d+148>>2];b=y[d+144>>2];w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+20|0]=c;w[a+21|0]=c>>>8;w[a+22|0]=c>>>16;w[a+23|0]=c>>>24;c=y[d+140>>2];b=y[d+136>>2];w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;c=y[d+132>>2];b=y[d+128>>2];w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=c;w[a+5|0]=c>>>8;w[a+6|0]=c>>>16;w[a+7|0]=c>>>24;ja(f,64);T=d+192|0;}function ta(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{if(!a){break a}d=a-8|0;b=y[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&2)){break a}b=y[d>>2];d=d-b|0;if(d>>>0>2];if(b>>>0<=255){e=y[d+8>>2];if((e|0)!=(c|0)){break e}j=40692,k=y[10173]&Bi(-2,b>>>3|0),y[j>>2]=k;break b}h=y[d+24>>2];if((c|0)!=(d|0)){b=y[d+8>>2];y[b+12>>2]=c;y[c+8>>2]=b;break c}e=y[d+20>>2];if(e){b=d+20|0;}else {e=y[d+16>>2];if(!e){break d}b=d+16|0;}while(1){g=b;c=e;b=c+20|0;e=y[c+20>>2];if(e){continue}b=c+16|0;e=y[c+16>>2];if(e){continue}break}y[g>>2]=0;break c}b=y[f+4>>2];if((b&3)!=3){break b}y[10175]=a;y[f+4>>2]=b&-2;y[d+4>>2]=a|1;y[f>>2]=a;return}y[e+12>>2]=c;y[c+8>>2]=e;break b}c=0;}if(!h){break b}b=y[d+28>>2];e=b<<2;f:{if(y[e+40996>>2]==(d|0)){y[e+40996>>2]=c;if(c){break f}j=40696,k=y[10174]&Bi(-2,b),y[j>>2]=k;break b}g:{if(y[h+16>>2]==(d|0)){y[h+16>>2]=c;break g}y[h+20>>2]=c;}if(!c){break b}}y[c+24>>2]=h;b=y[d+16>>2];if(b){y[c+16>>2]=b;y[b+24>>2]=c;}b=y[d+20>>2];if(!b){break b}y[c+20>>2]=b;y[b+24>>2]=c;}if(d>>>0>=f>>>0){break a}b=y[f+4>>2];if(!(b&1)){break a}h:{i:{j:{k:{if(!(b&2)){if(y[10179]==(f|0)){y[10179]=d;a=y[10176]+a|0;y[10176]=a;y[d+4>>2]=a|1;if(y[10178]!=(d|0)){break a}y[10175]=0;y[10178]=0;return}i=y[10178];if((i|0)==(f|0)){y[10178]=d;a=y[10175]+a|0;y[10175]=a;y[d+4>>2]=a|1;y[a+d>>2]=a;return}a=(b&-8)+a|0;c=y[f+12>>2];if(b>>>0<=255){e=y[f+8>>2];if((e|0)==(c|0)){j=40692,k=y[10173]&Bi(-2,b>>>3|0),y[j>>2]=k;break i}y[e+12>>2]=c;y[c+8>>2]=e;break i}h=y[f+24>>2];if((c|0)!=(f|0)){b=y[f+8>>2];y[b+12>>2]=c;y[c+8>>2]=b;break j}e=y[f+20>>2];if(e){b=f+20|0;}else {e=y[f+16>>2];if(!e){break k}b=f+16|0;}while(1){g=b;c=e;b=c+20|0;e=y[c+20>>2];if(e){continue}b=c+16|0;e=y[c+16>>2];if(e){continue}break}y[g>>2]=0;break j}y[f+4>>2]=b&-2;y[d+4>>2]=a|1;y[a+d>>2]=a;break h}c=0;}if(!h){break i}b=y[f+28>>2];e=b<<2;l:{if(y[e+40996>>2]==(f|0)){y[e+40996>>2]=c;if(c){break l}j=40696,k=y[10174]&Bi(-2,b),y[j>>2]=k;break i}m:{if(y[h+16>>2]==(f|0)){y[h+16>>2]=c;break m}y[h+20>>2]=c;}if(!c){break i}}y[c+24>>2]=h;b=y[f+16>>2];if(b){y[c+16>>2]=b;y[b+24>>2]=c;}b=y[f+20>>2];if(!b){break i}y[c+20>>2]=b;y[b+24>>2]=c;}y[d+4>>2]=a|1;y[a+d>>2]=a;if((d|0)!=(i|0)){break h}y[10175]=a;return}if(a>>>0<=255){b=(a&248)+40732|0;e=y[10173];a=1<<(a>>>3);n:{if(!(e&a)){y[10173]=a|e;a=b;break n}a=y[b+8>>2];}y[b+8>>2]=d;y[a+12>>2]=d;y[d+12>>2]=b;y[d+8>>2]=a;return}c=31;if(a>>>0<=16777215){b=H(a>>>8|0);c=(a>>>38-b&1|b<<1)^62;}y[d+28>>2]=c;y[d+16>>2]=0;y[d+20>>2]=0;b=(c<<2)+40996|0;o:{p:{e=y[10174];g=1<>2]=d;c=24;break q}c=a<<((c|0)!=31?25-(c>>>1|0)|0:0);b=y[b>>2];while(1){e=b;if((y[b+4>>2]&-8)==(a|0)){break p}b=c>>>29|0;c=c<<1;g=(b&4)+e|0;b=y[g+16>>2];if(b){continue}break}y[g+16>>2]=d;b=e;c=24;}e=d;g=d;a=8;break o}b=y[e+8>>2];y[b+12>>2]=d;y[e+8>>2]=d;c=8;g=0;a=24;}y[c+d>>2]=b;y[d+12>>2]=e;y[a+d>>2]=g;a=y[10181]-1|0;y[10181]=a?a:-1;}}function Ge(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0;d=T-224|0;T=d;j=y[c+16>>2];e=c- -64|0;k=y[e>>2];l=y[c+80>>2];m=y[c+32>>2];n=y[c+48>>2];f=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);o=y[c+20>>2];p=y[c+68>>2];q=y[c+84>>2];r=y[c+36>>2];s=y[c+52>>2];g=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);t=y[c+24>>2];u=y[c+72>>2];v=y[c+88>>2];x=y[c+40>>2];A=y[c+56>>2];h=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);i=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);b=i^(y[c+44>>2]&y[c+60>>2]^(y[c+28>>2]^(y[c+92>>2]^y[c+76>>2])));w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=x&A^(u^v^t)^g;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=r&s^(p^q^o)^f;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=m&n^(j^(k^l))^h;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;a=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=a;a=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=a;a=y[e+4>>2];y[d+176>>2]=y[e>>2];y[d+180>>2]=a;a=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=a;a=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=a;a=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=a;a=d+192|0;ia(a,d+176|0,d+160|0);b=y[d+204>>2];y[c+88>>2]=y[d+200>>2];y[c+92>>2]=b;b=y[d+196>>2];y[c+80>>2]=y[d+192>>2];y[c+84>>2]=b;b=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=b;b=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=b;b=y[e+4>>2];y[d+128>>2]=y[e>>2];y[d+132>>2]=b;b=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=b;ia(a,d+144|0,d+128|0);b=y[d+204>>2];y[c+72>>2]=y[d+200>>2];y[c+76>>2]=b;b=y[d+196>>2];y[e>>2]=y[d+192>>2];y[e+4>>2]=b;b=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=b;b=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=b;b=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=b;b=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=b;ia(a,d+112|0,d+96|0);b=y[d+204>>2];y[c+56>>2]=y[d+200>>2];y[c+60>>2]=b;b=y[d+196>>2];y[c+48>>2]=y[d+192>>2];y[c+52>>2]=b;b=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=b;b=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=b;b=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=b;b=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=b;ia(a,d+80|0,d- -64|0);b=y[d+204>>2];y[c+40>>2]=y[d+200>>2];y[c+44>>2]=b;b=y[d+196>>2];y[c+32>>2]=y[d+192>>2];y[c+36>>2]=b;b=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=b;b=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=b;b=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=b;b=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=b;ia(a,d+48|0,d+32|0);b=y[d+204>>2];y[c+24>>2]=y[d+200>>2];y[c+28>>2]=b;b=y[d+196>>2];y[c+16>>2]=y[d+192>>2];y[c+20>>2]=b;b=y[d+212>>2];y[d+16>>2]=y[d+208>>2];y[d+20>>2]=b;b=y[d+220>>2];y[d+24>>2]=y[d+216>>2];y[d+28>>2]=b;b=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=b;b=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=b;ia(a,d+16|0,d);a=y[d+192>>2];b=y[d+196>>2];e=y[d+200>>2];y[c+12>>2]=i^y[d+204>>2];y[c+8>>2]=e^g;y[c+4>>2]=b^f;y[c>>2]=a^h;T=d+224|0;}function Ee(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;d=T-224|0;T=d;g=y[c+16>>2];e=c- -64|0;f=y[e>>2];j=y[c+80>>2];k=y[c+32>>2];l=y[c+48>>2];h=y[c+20>>2];m=y[c+68>>2];n=y[c+84>>2];o=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);p=y[c+36>>2];q=y[c+52>>2];i=y[c+24>>2];r=y[c+72>>2];s=y[c+88>>2];t=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);u=y[c+40>>2];v=y[c+56>>2];x=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);b=y[c+44>>2]&y[c+60>>2]^(y[c+28>>2]^(y[c+76>>2]^(y[c+92>>2]^(z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24)))));w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;i=u&v^(i^(s^t^r));w[a+8|0]=i;w[a+9|0]=i>>>8;w[a+10|0]=i>>>16;w[a+11|0]=i>>>24;h=p&q^(h^(n^o^m));w[a+4|0]=h;w[a+5|0]=h>>>8;w[a+6|0]=h>>>16;w[a+7|0]=h>>>24;g=k&l^(g^(f^(j^x)));w[a|0]=g;w[a+1|0]=g>>>8;w[a+2|0]=g>>>16;w[a+3|0]=g>>>24;a=y[c+92>>2];y[d+216>>2]=y[c+88>>2];y[d+220>>2]=a;a=y[c+84>>2];y[d+208>>2]=y[c+80>>2];y[d+212>>2]=a;a=y[e+4>>2];y[d+176>>2]=y[e>>2];y[d+180>>2]=a;a=y[c+76>>2];y[d+184>>2]=y[c+72>>2];y[d+188>>2]=a;a=y[c+84>>2];y[d+160>>2]=y[c+80>>2];y[d+164>>2]=a;a=y[c+92>>2];y[d+168>>2]=y[c+88>>2];y[d+172>>2]=a;a=d+192|0;ia(a,d+176|0,d+160|0);f=y[d+204>>2];y[c+88>>2]=y[d+200>>2];y[c+92>>2]=f;f=y[d+196>>2];y[c+80>>2]=y[d+192>>2];y[c+84>>2]=f;f=y[c+52>>2];y[d+144>>2]=y[c+48>>2];y[d+148>>2]=f;f=y[c+60>>2];y[d+152>>2]=y[c+56>>2];y[d+156>>2]=f;f=y[e+4>>2];y[d+128>>2]=y[e>>2];y[d+132>>2]=f;f=y[c+76>>2];y[d+136>>2]=y[c+72>>2];y[d+140>>2]=f;ia(a,d+144|0,d+128|0);f=y[d+204>>2];y[c+72>>2]=y[d+200>>2];y[c+76>>2]=f;f=y[d+196>>2];y[e>>2]=y[d+192>>2];y[e+4>>2]=f;e=y[c+36>>2];y[d+112>>2]=y[c+32>>2];y[d+116>>2]=e;e=y[c+44>>2];y[d+120>>2]=y[c+40>>2];y[d+124>>2]=e;e=y[c+52>>2];y[d+96>>2]=y[c+48>>2];y[d+100>>2]=e;e=y[c+60>>2];y[d+104>>2]=y[c+56>>2];y[d+108>>2]=e;ia(a,d+112|0,d+96|0);e=y[d+204>>2];y[c+56>>2]=y[d+200>>2];y[c+60>>2]=e;e=y[d+196>>2];y[c+48>>2]=y[d+192>>2];y[c+52>>2]=e;e=y[c+20>>2];y[d+80>>2]=y[c+16>>2];y[d+84>>2]=e;e=y[c+28>>2];y[d+88>>2]=y[c+24>>2];y[d+92>>2]=e;e=y[c+36>>2];y[d+64>>2]=y[c+32>>2];y[d+68>>2]=e;e=y[c+44>>2];y[d+72>>2]=y[c+40>>2];y[d+76>>2]=e;ia(a,d+80|0,d- -64|0);e=y[d+204>>2];y[c+40>>2]=y[d+200>>2];y[c+44>>2]=e;e=y[d+196>>2];y[c+32>>2]=y[d+192>>2];y[c+36>>2]=e;e=y[c+4>>2];y[d+48>>2]=y[c>>2];y[d+52>>2]=e;e=y[c+12>>2];y[d+56>>2]=y[c+8>>2];y[d+60>>2]=e;e=y[c+20>>2];y[d+32>>2]=y[c+16>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+40>>2]=y[c+24>>2];y[d+44>>2]=e;ia(a,d+48|0,d+32|0);e=y[d+204>>2];y[c+24>>2]=y[d+200>>2];y[c+28>>2]=e;e=y[d+196>>2];y[c+16>>2]=y[d+192>>2];y[c+20>>2]=e;e=y[d+212>>2];y[d+16>>2]=y[d+208>>2];y[d+20>>2]=e;e=y[d+220>>2];y[d+24>>2]=y[d+216>>2];y[d+28>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;ia(a,d+16|0,d);a=y[d+192>>2];e=y[d+196>>2];f=y[d+200>>2];y[c+12>>2]=b^y[d+204>>2];y[c+8>>2]=f^i;y[c+4>>2]=e^h;y[c>>2]=a^g;T=d+224|0;}function bc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,y=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;a:{if(!d){x=1634760805;y=2036477234;A=857760878;B=1797285236;break a}y=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);A=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);x=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);B=z[d+12|0]|z[d+13|0]<<8|(z[d+14|0]<<16|z[d+15|0]<<24);}d=x;E=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);k=E;F=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);o=F;G=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);g=G;H=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);f=H;h=A;I=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);l=I;J=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);i=J;K=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);p=K;L=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);m=L;b=y;M=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);n=M;q=B;N=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);s=N;O=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);r=O;P=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);c=P;while(1){t=Bi(h+k|0,7)^m;C=Bi(t+h|0,9)^r;u=Bi(c+d|0,7)^f;D=Bi(u+d|0,9)^p;Q=Bi(D+u|0,13)^c;v=Bi(n+q|0,7)^g;i=Bi(v+q|0,9)^i;g=Bi(i+v|0,13)^n;f=Bi(i+g|0,18)^q;j=Bi(b+l|0,7)^s;c=Q^Bi(f+j|0,7);r=C^Bi(c+f|0,9);s=Bi(c+r|0,13)^j;q=Bi(r+s|0,18)^f;m=j;j=Bi(b+j|0,9)^o;f=Bi(m+j|0,13)^l;b=Bi(f+j|0,18)^b;n=Bi(b+t|0,7)^g;p=Bi(n+b|0,9)^D;m=Bi(n+p|0,13)^t;b=Bi(p+m|0,18)^b;g=Bi(t+C|0,13)^k;h=Bi(g+C|0,18)^h;l=Bi(h+u|0,7)^f;i=Bi(l+h|0,9)^i;f=Bi(i+l|0,13)^u;h=Bi(i+f|0,18)^h;d=Bi(D+Q|0,18)^d;k=Bi(d+v|0,7)^g;o=Bi(k+d|0,9)^j;g=Bi(k+o|0,13)^v;d=Bi(o+g|0,18)^d;R=R+2|0;if(R>>>0>>0){continue}break}e=q+B|0;w[a+60|0]=e;w[a+61|0]=e>>>8;w[a+62|0]=e>>>16;w[a+63|0]=e>>>24;e=s+N|0;w[a+56|0]=e;w[a+57|0]=e>>>8;w[a+58|0]=e>>>16;w[a+59|0]=e>>>24;e=r+O|0;w[a+52|0]=e;w[a+53|0]=e>>>8;w[a+54|0]=e>>>16;w[a+55|0]=e>>>24;c=c+P|0;w[a+48|0]=c;w[a+49|0]=c>>>8;w[a+50|0]=c>>>16;w[a+51|0]=c>>>24;c=n+M|0;w[a+44|0]=c;w[a+45|0]=c>>>8;w[a+46|0]=c>>>16;w[a+47|0]=c>>>24;b=b+y|0;w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;b=m+L|0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;b=p+K|0;w[a+32|0]=b;w[a+33|0]=b>>>8;w[a+34|0]=b>>>16;w[a+35|0]=b>>>24;b=i+J|0;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=l+I|0;w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;b=h+A|0;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=f+H|0;w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;b=g+G|0;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=o+F|0;w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;b=k+E|0;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=d+x|0;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;}function qe(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0;if(b-65>>>0<4294967232|g>>>0>64){a=-1;}else {j=T;r=j;j=j-512&-64;T=j;a:{b:{if(!(!(d|e)|c)|(!a|(b-65&255)>>>0<=191)|(!(g?f:1)|g>>>0>=65)){break b}c:{if(g){if(!f){break b}d:{if(!h){m=725511199;n=-1694144372;l=-1377402159;h=1359893119;break d}m=(z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24))^725511199;n=(z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24))^-1694144372;l=(z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24))^-1377402159;h=(z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24))^1359893119;}e:{if(!i){k=327033209;p=1541459225;q=-79577749;i=528734635;break e}k=(z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24))^327033209;p=(z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24))^1541459225;q=(z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24))^-79577749;i=(z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24))^528734635;}o(j- -64|0,0,293);y[j+56>>2]=k;y[j+60>>2]=p;y[j+48>>2]=q;y[j+52>>2]=i;y[j+40>>2]=m;y[j+44>>2]=n;y[j+32>>2]=l;y[j+36>>2]=h;y[j+24>>2]=1595750129;y[j+28>>2]=-1521486534;y[j+16>>2]=-23791573;y[j+20>>2]=1013904242;y[j+8>>2]=-2067093701;y[j+12>>2]=-1150833019;y[j>>2]=(g<<8|b)^-222443256;y[j+4>>2]=g>>>24^1779033703;h=128;i=128-g|0;if(i){o((j+384|0)+g|0,0,i);}if(g){t(j+384|0,f,g);}f=j+384|0;t(j+96|0,f,128);y[j+352>>2]=128;ja(f,128);break c}f:{if(!h){m=725511199;n=-1694144372;g=1359893119;f=-1377402159;break f}m=(z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24))^725511199;n=(z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24))^-1694144372;g=(z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24))^1359893119;f=(z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24))^-1377402159;}g:{if(!i){k=327033209;p=1541459225;l=-79577749;i=528734635;break g}k=(z[i+8|0]|z[i+9|0]<<8|(z[i+10|0]<<16|z[i+11|0]<<24))^327033209;p=(z[i+12|0]|z[i+13|0]<<8|(z[i+14|0]<<16|z[i+15|0]<<24))^1541459225;l=(z[i|0]|z[i+1|0]<<8|(z[i+2|0]<<16|z[i+3|0]<<24))^-79577749;i=(z[i+4|0]|z[i+5|0]<<8|(z[i+6|0]<<16|z[i+7|0]<<24))^528734635;}h=0;o(j- -64|0,0,293);y[j+56>>2]=k;y[j+60>>2]=p;y[j+48>>2]=l;y[j+52>>2]=i;y[j+40>>2]=m;y[j+44>>2]=n;y[j+32>>2]=f;y[j+36>>2]=g;y[j+24>>2]=1595750129;y[j+28>>2]=-1521486534;y[j+16>>2]=-23791573;y[j+20>>2]=1013904242;y[j+8>>2]=-2067093701;y[j+12>>2]=-1150833019;y[j>>2]=b^-222443256;y[j+4>>2]=1779033703;}if(d|e){l=j+96|0;f=256-h|0;m=f;if(!e&d>>>0>f>>>0|e){n=j+224|0;while(1){if(f){t(h+l|0,c,f);}y[j+352>>2]=y[j+352>>2]+f;g=y[j+68>>2];i=g;h=y[j+64>>2];k=h+128|0;g=k>>>0<128?i+1|0:i;y[j+64>>2]=k;y[j+68>>2]=g;g=y[j+76>>2];h=(i|0)==-1&h>>>0>4294967167;i=h;h=h+y[j+72>>2]|0;g=i>>>0>h>>>0?g+1|0:g;y[j+72>>2]=h;y[j+76>>2]=g;Eb(j,l);t(l,n,128);k=y[j+352>>2];h=k-128|0;y[j+352>>2]=h;c=c+f|0;g=m;i=d-g|0;f=384-k|0;m=f;e=e-(d>>>0>>0)|0;d=i;if(!e&i>>>0>f>>>0|e){continue}break}}if(d){t(h+l|0,c,d);}y[j+352>>2]=d+y[j+352>>2];}Cc(j,a,b);T=r;break a}na();s();}a=0;}return a}function Lc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=a+b|0;c=y[a+4>>2];a:{b:{if(c&1){break b}if(!(c&2)){break a}c=y[a>>2];b=c+b|0;c:{d:{e:{a=a-c|0;if((a|0)!=y[10178]){d=y[a+12>>2];if(c>>>0<=255){e=y[a+8>>2];if((e|0)!=(d|0)){break e}j=40692,k=y[10173]&Bi(-2,c>>>3|0),y[j>>2]=k;break b}g=y[a+24>>2];if((a|0)!=(d|0)){c=y[a+8>>2];y[c+12>>2]=d;y[d+8>>2]=c;break c}e=y[a+20>>2];if(e){c=a+20|0;}else {e=y[a+16>>2];if(!e){break d}c=a+16|0;}while(1){h=c;d=e;c=d+20|0;e=y[d+20>>2];if(e){continue}c=d+16|0;e=y[d+16>>2];if(e){continue}break}y[h>>2]=0;break c}c=y[f+4>>2];if((c&3)!=3){break b}y[10175]=b;y[f+4>>2]=c&-2;y[a+4>>2]=b|1;y[f>>2]=b;return}y[e+12>>2]=d;y[d+8>>2]=e;break b}d=0;}if(!g){break b}c=y[a+28>>2];e=c<<2;f:{if(y[e+40996>>2]==(a|0)){y[e+40996>>2]=d;if(d){break f}j=40696,k=y[10174]&Bi(-2,c),y[j>>2]=k;break b}g:{if(y[g+16>>2]==(a|0)){y[g+16>>2]=d;break g}y[g+20>>2]=d;}if(!d){break b}}y[d+24>>2]=g;c=y[a+16>>2];if(c){y[d+16>>2]=c;y[c+24>>2]=d;}c=y[a+20>>2];if(!c){break b}y[d+20>>2]=c;y[c+24>>2]=d;}h:{i:{j:{k:{c=y[f+4>>2];if(!(c&2)){if(y[10179]==(f|0)){y[10179]=a;b=y[10176]+b|0;y[10176]=b;y[a+4>>2]=b|1;if(y[10178]!=(a|0)){break a}y[10175]=0;y[10178]=0;return}i=y[10178];if((i|0)==(f|0)){y[10178]=a;b=y[10175]+b|0;y[10175]=b;y[a+4>>2]=b|1;y[a+b>>2]=b;return}b=(c&-8)+b|0;d=y[f+12>>2];if(c>>>0<=255){e=y[f+8>>2];if((e|0)==(d|0)){j=40692,k=y[10173]&Bi(-2,c>>>3|0),y[j>>2]=k;break i}y[e+12>>2]=d;y[d+8>>2]=e;break i}g=y[f+24>>2];if((d|0)!=(f|0)){c=y[f+8>>2];y[c+12>>2]=d;y[d+8>>2]=c;break j}e=y[f+20>>2];if(e){c=f+20|0;}else {e=y[f+16>>2];if(!e){break k}c=f+16|0;}while(1){h=c;d=e;c=d+20|0;e=y[d+20>>2];if(e){continue}c=d+16|0;e=y[d+16>>2];if(e){continue}break}y[h>>2]=0;break j}y[f+4>>2]=c&-2;y[a+4>>2]=b|1;y[a+b>>2]=b;break h}d=0;}if(!g){break i}c=y[f+28>>2];e=c<<2;l:{if(y[e+40996>>2]==(f|0)){y[e+40996>>2]=d;if(d){break l}j=40696,k=y[10174]&Bi(-2,c),y[j>>2]=k;break i}m:{if(y[g+16>>2]==(f|0)){y[g+16>>2]=d;break m}y[g+20>>2]=d;}if(!d){break i}}y[d+24>>2]=g;c=y[f+16>>2];if(c){y[d+16>>2]=c;y[c+24>>2]=d;}c=y[f+20>>2];if(!c){break i}y[d+20>>2]=c;y[c+24>>2]=d;}y[a+4>>2]=b|1;y[a+b>>2]=b;if((a|0)!=(i|0)){break h}y[10175]=b;return}if(b>>>0<=255){c=(b&248)+40732|0;d=y[10173];b=1<<(b>>>3);n:{if(!(d&b)){y[10173]=b|d;b=c;break n}b=y[c+8>>2];}y[c+8>>2]=a;y[b+12>>2]=a;y[a+12>>2]=c;y[a+8>>2]=b;return}d=31;if(b>>>0<=16777215){c=H(b>>>8|0);d=(b>>>38-c&1|c<<1)^62;}y[a+28>>2]=d;y[a+16>>2]=0;y[a+20>>2]=0;c=(d<<2)+40996|0;o:{e=y[10174];h=1<>2]=a;y[a+24>>2]=c;break p}d=b<<((d|0)!=31?25-(d>>>1|0)|0:0);c=y[c>>2];while(1){e=c;if((y[c+4>>2]&-8)==(b|0)){break o}c=d>>>29|0;d=d<<1;h=e+(c&4)|0;c=y[h+16>>2];if(c){continue}break}y[h+16>>2]=a;y[a+24>>2]=e;}y[a+12>>2]=a;y[a+8>>2]=a;return}b=y[e+8>>2];y[b+12>>2]=a;y[e+8>>2]=a;y[a+24>>2]=0;y[a+12>>2]=e;y[a+8>>2]=b;}}function Bf(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=T-400|0;T=k;if(c){y[c>>2]=0;y[c+4>>2]=0;}if(d){w[d|0]=255;}p=i;i=j;j=-1;m=f;a:{b:{l=m>>>0<17;f=g;c:{if(l&!g){break c}l=g-l|0;q=l;g=m-17|0;if(!l&g>>>0>=4294967279|l){break b}n=k+32|0;o=a+32|0;_a(n,64,0,o,a);l=k+96|0;Ga(l,n);ja(n,64);la(l,h,p,i);la(l,39312,0-p&15,0);y[k+88>>2]=0;y[k+92>>2]=0;y[k+80>>2]=0;y[k+84>>2]=0;y[k+72>>2]=0;y[k+76>>2]=0;y[k+64>>2]=0;y[k+68>>2]=0;y[k+56>>2]=0;y[k+60>>2]=0;y[k+48>>2]=0;y[k+52>>2]=0;y[k+40>>2]=0;y[k+44>>2]=0;y[k+32>>2]=0;y[k+36>>2]=0;w[k+32|0]=z[e|0];gb(n,n,64,0,o,1,a);h=z[k+32|0];w[k+32|0]=z[e|0];la(l,n,64,0);e=e+1|0;la(l,e,g,q);la(l,39312,m-1&15,0);y[k+24>>2]=p;y[k+28>>2]=i;i=k+24|0;la(l,i,8,0);m=m+47|0;f=m>>>0<47?f+1|0:f;y[k+24>>2]=m;y[k+28>>2]=f;la(l,i,8,0);Fa(l,k);ja(l,256);if($a(k,e+g|0,16)){ja(k,16);break c}gb(b,e,g,q,o,2,a);w[a+36|0]=z[a+36|0]^z[k|0];w[a+37|0]=z[a+37|0]^z[k+1|0];w[a+38|0]=z[a+38|0]^z[k+2|0];w[a+39|0]=z[a+39|0]^z[k+3|0];w[a+40|0]=z[a+40|0]^z[k+4|0];w[a+41|0]=z[a+41|0]^z[k+5|0];w[a+42|0]=z[a+42|0]^z[k+6|0];w[a+43|0]=z[a+43|0]^z[k+7|0];Ke(o);d:{if(!(h&2)){if(!ya(o,4)){break d}}b=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[k+376>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[k+380>>2]=b;b=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[k+368>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[k+372>>2]=b;b=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[k+360>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[k+364>>2]=b;b=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[k+352>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[k+356>>2]=b;b=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[k+384>>2]=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[k+388>>2]=b;b=k+352|0;Yb(b,b,40,0,o,a);b=y[k+380>>2];e=y[k+376>>2];w[a+24|0]=e;w[a+25|0]=e>>>8;w[a+26|0]=e>>>16;w[a+27|0]=e>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[k+372>>2];e=y[k+368>>2];w[a+16|0]=e;w[a+17|0]=e>>>8;w[a+18|0]=e>>>16;w[a+19|0]=e>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[k+364>>2];e=y[k+360>>2];w[a+8|0]=e;w[a+9|0]=e>>>8;w[a+10|0]=e>>>16;w[a+11|0]=e>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[k+356>>2];e=y[k+352>>2];w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=y[k+384>>2];e=y[k+388>>2];w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+40|0]=e;w[a+41|0]=e>>>8;w[a+42|0]=e>>>16;w[a+43|0]=e>>>24;}if(c){y[c>>2]=g;y[c+4>>2]=q;}j=0;if(!d){break c}w[d|0]=h;}T=k+400|0;break a}na();s();}return j|0}function ne(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0;h=T+-64|0;T=h;l=Da(32);a:{if(!l){a=-22;break a}y[h+28>>2]=0;y[h+32>>2]=0;y[h+24>>2]=16;y[h+20>>2]=e;y[h+16>>2]=d;y[h+12>>2]=c;y[h+8>>2]=32;y[h+4>>2]=l;y[h+36>>2]=0;y[h+40>>2]=0;y[h+60>>2]=0;y[h+56>>2]=1;y[h+52>>2]=1;y[h+48>>2]=b;y[h+44>>2]=a;a=Sb(h+4|0,g);b:{if(a){ja(l,32);break b}c:{if(!f){break c}i=h+4|0;e=T-32|0;T=e;a=-31;d:{e:{f:{switch(g-1|0){case 1:a=z[1439]|z[1440]<<8|(z[1441]<<16|z[1442]<<24);b=z[1435]|z[1436]<<8|(z[1437]<<16|z[1438]<<24);w[f+5|0]=b;w[f+6|0]=b>>>8;w[f+7|0]=b>>>16;w[f+8|0]=b>>>24;w[f+9|0]=a;w[f+10|0]=a>>>8;w[f+11|0]=a>>>16;w[f+12|0]=a>>>24;a=z[1434]|z[1435]<<8|(z[1436]<<16|z[1437]<<24);b=z[1430]|z[1431]<<8|(z[1432]<<16|z[1433]<<24);w[f|0]=b;w[f+1|0]=b>>>8;w[f+2|0]=b>>>16;w[f+3|0]=b>>>24;w[f+4|0]=a;w[f+5|0]=a>>>8;w[f+6|0]=a>>>16;w[f+7|0]=a>>>24;c=-12;b=12;break e;case 0:break f;default:break d}}a=z[1426]|z[1427]<<8|(z[1428]<<16|z[1429]<<24);w[f+8|0]=a;w[f+9|0]=a>>>8;w[f+10|0]=a>>>16;w[f+11|0]=a>>>24;a=z[1422]|z[1423]<<8|(z[1424]<<16|z[1425]<<24);b=z[1418]|z[1419]<<8|(z[1420]<<16|z[1421]<<24);w[f|0]=b;w[f+1|0]=b>>>8;w[f+2|0]=b>>>16;w[f+3|0]=b>>>24;w[f+4|0]=a;w[f+5|0]=a>>>8;w[f+6|0]=a>>>16;w[f+7|0]=a>>>24;c=-11;b=11;}a=nc(i);if(a){break d}w[e+13|0]=0;w[e+11|0]=49;w[e+12|0]=57;g:{c=c+128|0;d=e+11|0;a=Ha(d);if(c>>>0<=a>>>0){break g}b=b+f|0;g=a+1|0;if(g){t(b,d,g);}j=c-a|0;if(j>>>0<4){break g}g=a+b|0;w[g|0]=36;w[g+1|0]=109;w[g+2|0]=61;w[g+3|0]=0;a=y[i+44>>2];b=10;while(1){h:{c=b;b=b-1|0;k=b+(e+22|0)|0;d=(a>>>0)/10|0;w[k|0]=a-E(d,10)|48;if(a>>>0<10){break h}a=d;if(b){continue}}break}a=11-c|0;if(a){t(e+11|0,k,a);}b=e+11|0;w[b+a|0]=0;d=j-3|0;a=Ha(b);if(d>>>0<=a>>>0){break g}c=g+3|0;g=a+1|0;if(g){t(c,b,g);}j=d-a|0;if(j>>>0<4){break g}g=a+c|0;w[g|0]=44;w[g+1|0]=116;w[g+2|0]=61;w[g+3|0]=0;a=y[i+40>>2];b=10;while(1){i:{c=b;b=b-1|0;k=b+(e+22|0)|0;d=(a>>>0)/10|0;w[k|0]=a-E(d,10)|48;if(a>>>0<10){break i}a=d;if(b){continue}}break}a=11-c|0;if(a){t(e+11|0,k,a);}b=e+11|0;w[b+a|0]=0;d=j-3|0;a=Ha(b);if(d>>>0<=a>>>0){break g}c=g+3|0;g=a+1|0;if(g){t(c,b,g);}j=d-a|0;if(j>>>0<4){break g}g=a+c|0;w[g|0]=44;w[g+1|0]=112;w[g+2|0]=61;w[g+3|0]=0;a=y[i+48>>2];b=10;while(1){j:{c=b;b=b-1|0;k=b+(e+22|0)|0;d=(a>>>0)/10|0;w[k|0]=a-E(d,10)|48;if(a>>>0<10){break j}a=d;if(b){continue}}break}a=11-c|0;if(a){t(e+11|0,k,a);}b=e+11|0;w[b+a|0]=0;d=j-3|0;a=Ha(b);if(d>>>0<=a>>>0){break g}c=g+3|0;g=a+1|0;if(g){t(c,b,g);}d=d-a|0;if(d>>>0<2){break g}a=a+c|0;w[a|0]=36;w[a+1|0]=0;b=a+1|0;c=d-1|0;if(!Bc(b,c,y[i+16>>2],y[i+20>>2],3)){break g}a=-31;d=c;c=Ha(b);d=d-c|0;if(d>>>0<2){break d}a=b+c|0;w[a|0]=36;w[a+1|0]=0;a=Bc(a+1|0,d-1|0,y[i>>2],y[i+4>>2],3)?0:-31;break d}a=-31;}T=e+32|0;if(!a){break c}ja(l,32);ja(f,128);a=-31;break b}ja(l,32);a=0;}ta(l);}T=h- -64|0;return a}function ib(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0;c=T-512|0;T=c;d=-1;f=z[b+31|0];e=z[b|0];if(!((((((f^-1)&127|z[b+1|0]&(z[b+2|0]&(z[b+3|0]&(z[b+4|0]&(z[b+5|0]&(z[b+6|0]&(z[b+7|0]&(z[b+8|0]&(z[b+9|0]&(z[b+10|0]&(z[b+11|0]&(z[b+12|0]&(z[b+13|0]&(z[b+14|0]&(z[b+15|0]&(z[b+16|0]&(z[b+17|0]&(z[b+18|0]&(z[b+19|0]&(z[b+20|0]&(z[b+21|0]&(z[b+22|0]&(z[b+23|0]&(z[b+24|0]&(z[b+25|0]&(z[b+26|0]&(z[b+27|0]&(z[b+28|0]&(z[b+29|0]&z[b+30|0]))))))))))))))))))))))))))))^-1)&255)-1&236-e)>>>8|(e|z[41218]>>>2^f>>>7))&1)){f=c+336|0;cb(f,b);fa(c+288|0,f);b=y[c+324>>2];y[c+276>>2]=0-b;d=y[c+320>>2];y[c+272>>2]=0-d;e=y[c+316>>2];y[c+268>>2]=0-e;g=y[c+312>>2];y[c+264>>2]=0-g;h=y[c+308>>2];y[c+260>>2]=0-h;i=y[c+304>>2];y[c+256>>2]=0-i;j=y[c+300>>2];y[c+252>>2]=0-j;k=y[c+296>>2];y[c+248>>2]=0-k;l=y[c+292>>2];y[c+244>>2]=0-l;m=y[c+288>>2];y[c+240>>2]=1-m;n=c+144|0;q=c+240|0;fa(n,q);y[c+228>>2]=b;y[c+224>>2]=d;y[c+220>>2]=e;y[c+216>>2]=g;y[c+212>>2]=h;y[c+208>>2]=i;y[c+204>>2]=j;y[c+200>>2]=k;y[c+196>>2]=l;y[c+192>>2]=m+1;d=c+96|0;g=c+192|0;fa(d,g);b=c+48|0;ga(b,1584,n);e=y[c+96>>2];h=y[c+48>>2];i=y[c+100>>2];j=y[c+52>>2];k=y[c+104>>2];l=y[c+56>>2];m=y[c+108>>2];n=y[c+60>>2];o=y[c+112>>2];p=y[c+64>>2];r=y[c+116>>2];s=y[c+68>>2];t=y[c+120>>2];u=y[c+72>>2];v=y[c+124>>2];x=y[c+76>>2];A=y[c+128>>2];B=y[c+80>>2];y[c+84>>2]=0-(y[c+84>>2]+y[c+132>>2]|0);y[c+80>>2]=0-(A+B|0);y[c+76>>2]=0-(v+x|0);y[c+72>>2]=0-(t+u|0);y[c+68>>2]=0-(r+s|0);y[c+64>>2]=0-(o+p|0);y[c+60>>2]=0-(m+n|0);y[c+56>>2]=0-(k+l|0);y[c+52>>2]=0-(i+j|0);y[c+48>>2]=0-(e+h|0);ga(c,b,d);y[c+388>>2]=0;y[c+392>>2]=0;y[c+384>>2]=1;y[c+396>>2]=0;y[c+400>>2]=0;y[c+404>>2]=0;y[c+408>>2]=0;y[c+412>>2]=0;y[c+416>>2]=0;y[c+420>>2]=0;e=c+432|0;p=cc(e,c+384|0,c);ga(a,e,g);d=a+40|0;ga(d,e,a);ga(d,d,b);ga(a,a,f);f=y[a+36>>2]<<1;y[a+36>>2]=f;e=y[a+32>>2]<<1;y[a+32>>2]=e;g=y[a+28>>2]<<1;y[a+28>>2]=g;h=y[a+24>>2]<<1;y[a+24>>2]=h;i=y[a+20>>2]<<1;y[a+20>>2]=i;j=y[a+16>>2]<<1;y[a+16>>2]=j;k=y[a+12>>2]<<1;y[a+12>>2]=k;l=y[a+8>>2]<<1;y[a+8>>2]=l;m=y[a+4>>2]<<1;y[a+4>>2]=m;n=y[a>>2]<<1;y[a>>2]=n;o=c+480|0;pa(o,a);b=0-(w[c+480|0]&1)|0;y[a+36>>2]=f^b&(f^0-f);y[a+32>>2]=e^b&(e^0-e);y[a+28>>2]=g^b&(g^0-g);y[a+24>>2]=h^b&(h^0-h);y[a+20>>2]=i^b&(i^0-i);y[a+16>>2]=j^b&(j^0-j);y[a+12>>2]=k^b&(k^0-k);y[a+8>>2]=l^b&(l^0-l);y[a+4>>2]=m^b&(m^0-m);y[a>>2]=n^b&(n^0-n);ga(d,q,d);y[a+84>>2]=0;y[a+88>>2]=0;y[a+80>>2]=1;y[a+92>>2]=0;y[a+96>>2]=0;y[a+100>>2]=0;y[a+104>>2]=0;y[a+108>>2]=0;y[a+112>>2]=0;y[a+116>>2]=0;b=a+120|0;ga(b,a,d);pa(o,b);a=z[c+480|0];pa(o,d);d=0-(ya(o,32)|(1-p|a&1))|0;}T=c+512|0;return d}function Cf(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0;k=T-384|0;T=k;if(c){y[c>>2]=0;y[c+4>>2]=0;}a:{m=0|e;if(!f&m>>>0<4294967279){n=k+16|0;e=a+32|0;_a(n,64,0,e,a);l=k+80|0;Ga(l,n);ja(n,64);o=g;g=h|p;la(l,o,g,i);la(l,39312,0-g&15,0);y[k+16>>2]=0;y[k+20>>2]=0;y[k+72>>2]=0;y[k+76>>2]=0;y[k+64>>2]=0;y[k+68>>2]=0;y[k+56>>2]=0;y[k+60>>2]=0;y[k+48>>2]=0;y[k+52>>2]=0;y[k+40>>2]=0;y[k+44>>2]=0;y[k+32>>2]=0;y[k+36>>2]=0;y[k+24>>2]=0;y[k+28>>2]=0;w[k+16|0]=j;gb(n,n,64,0,e,1,a);la(l,n,64,0);w[b|0]=z[k+16|0];b=b+1|0;gb(b,d,m,f,e,2,a);la(l,b,m,f);la(l,39312,m&15,0);y[k+8>>2]=g;y[k+12>>2]=i;d=k+8|0;la(l,d,8,0);y[k+8>>2]=m- -64;y[k+12>>2]=f-((m>>>0<4294967232)-1|0);la(l,d,8,0);b=b+m|0;Fa(l,b);ja(l,256);w[a+36|0]=z[a+36|0]^z[b|0];w[a+37|0]=z[a+37|0]^z[b+1|0];w[a+38|0]=z[a+38|0]^z[b+2|0];w[a+39|0]=z[a+39|0]^z[b+3|0];w[a+40|0]=z[a+40|0]^z[b+4|0];w[a+41|0]=z[a+41|0]^z[b+5|0];w[a+42|0]=z[a+42|0]^z[b+6|0];w[a+43|0]=z[a+43|0]^z[b+7|0];Ke(e);b:{if(!(j&2)){if(!ya(e,4)){break b}}b=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[k+360>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[k+364>>2]=b;b=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[k+352>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[k+356>>2]=b;b=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[k+344>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[k+348>>2]=b;b=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[k+336>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[k+340>>2]=b;b=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[k+368>>2]=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[k+372>>2]=b;b=k+336|0;Yb(b,b,40,0,e,a);b=y[k+364>>2];d=y[k+360>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[k+356>>2];d=y[k+352>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[k+348>>2];d=y[k+344>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[k+340>>2];d=y[k+336>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=y[k+368>>2];d=y[k+372>>2];w[e|0]=1;w[e+1|0]=0;w[e+2|0]=0;w[e+3|0]=0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+40|0]=d;w[a+41|0]=d>>>8;w[a+42|0]=d>>>16;w[a+43|0]=d>>>24;}if(c){a=m+17|0;f=a>>>0<17?f+1|0:f;y[c>>2]=a;y[c+4>>2]=f;}T=k+384|0;break a}na();s();}return 0}function sc(a,b,c,d){var e=0,f=0,g=0;e=T;g=e;e=e-576&-64;T=e;y[e+188>>2]=b;a:{if(b>>>0<=64){f=e+192|0;if((Ja(f,0,0,b)|0)<0){break a}if((oa(f,e+188|0,4,0)|0)<0);if((oa(f,c,d,0)|0)<0);Ia(f,a,b);break a}f=e+192|0;if((Ja(f,0,0,64)|0)<0){break a}if((oa(f,e+188|0,4,0)|0)<0);if((oa(f,c,d,0)|0)<0);if((Ia(f,e+112|0,64)|0)<0){break a}c=y[e+140>>2];d=y[e+136>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=c;w[a+29|0]=c>>>8;w[a+30|0]=c>>>16;w[a+31|0]=c>>>24;c=y[e+132>>2];d=y[e+128>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=c;w[a+21|0]=c>>>8;w[a+22|0]=c>>>16;w[a+23|0]=c>>>24;c=y[e+124>>2];d=y[e+120>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;c=y[e+116>>2];d=y[e+112>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=c;w[a+5|0]=c>>>8;w[a+6|0]=c>>>16;w[a+7|0]=c>>>24;a=a+32|0;b=b-32|0;if(b>>>0>=65){while(1){c=y[e+172>>2];y[e+104>>2]=y[e+168>>2];y[e+108>>2]=c;c=y[e+164>>2];y[e+96>>2]=y[e+160>>2];y[e+100>>2]=c;c=y[e+156>>2];y[e+88>>2]=y[e+152>>2];y[e+92>>2]=c;c=y[e+148>>2];y[e+80>>2]=y[e+144>>2];y[e+84>>2]=c;c=y[e+140>>2];y[e+72>>2]=y[e+136>>2];y[e+76>>2]=c;c=y[e+132>>2];y[e+64>>2]=y[e+128>>2];y[e+68>>2]=c;c=y[e+124>>2];y[e+56>>2]=y[e+120>>2];y[e+60>>2]=c;c=y[e+116>>2];y[e+48>>2]=y[e+112>>2];y[e+52>>2]=c;if((Wb(e+112|0,64,e+48|0,64,0,0,0)|0)<0){break a}c=y[e+140>>2];d=y[e+136>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=c;w[a+29|0]=c>>>8;w[a+30|0]=c>>>16;w[a+31|0]=c>>>24;c=y[e+132>>2];d=y[e+128>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=c;w[a+21|0]=c>>>8;w[a+22|0]=c>>>16;w[a+23|0]=c>>>24;c=y[e+124>>2];d=y[e+120>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=c;w[a+13|0]=c>>>8;w[a+14|0]=c>>>16;w[a+15|0]=c>>>24;c=y[e+116>>2];d=y[e+112>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=c;w[a+5|0]=c>>>8;w[a+6|0]=c>>>16;w[a+7|0]=c>>>24;a=a+32|0;b=b-32|0;if(b>>>0>64){continue}break}}c=y[e+172>>2];y[e+104>>2]=y[e+168>>2];y[e+108>>2]=c;c=y[e+164>>2];y[e+96>>2]=y[e+160>>2];y[e+100>>2]=c;c=y[e+156>>2];y[e+88>>2]=y[e+152>>2];y[e+92>>2]=c;c=y[e+148>>2];y[e+80>>2]=y[e+144>>2];y[e+84>>2]=c;c=y[e+140>>2];y[e+72>>2]=y[e+136>>2];y[e+76>>2]=c;c=y[e+132>>2];y[e+64>>2]=y[e+128>>2];y[e+68>>2]=c;c=y[e+124>>2];y[e+56>>2]=y[e+120>>2];y[e+60>>2]=c;c=y[e+116>>2];y[e+48>>2]=y[e+112>>2];y[e+52>>2]=c;c=e+112|0;if(!b|(Wb(c,b,e+48|0,64,0,0,0)|0)<0){break a}t(a,c,b);}ja(e+192|0,384);T=g;}function Id(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,u=0,v=0,x=0,A=0,C=0,D=0,F=0,G=0,H=0;m=Ai(i,0,h,0);p=W;if(!p&m>>>0>=1073741824|p){y[10172]=22;return -1}if((g|0)==1|g>>>0>1){y[10172]=22;return -1}m=f;o=g;while(1){if(m|o){p=m;m=m&m-1;o=o-!p&o;r=r+1|0;q=r?q:q+1|0;continue}break}W=q;if(!(!W&r>>>0<2&(!g&f>>>0>=2|(g|0)!=0))){y[10172]=28;return -1}if(!(i?h:0)){y[10172]=28;return -1}a:{b:{if(!(33554431/(i>>>0)>>>0>>0|h>>>0>16777215)){if(!g&33554431/(h>>>0)>>>0>=f>>>0){break b}}break a}r=h<<7;x=E(r,i);v=E(f,r);m=v+x|0;if(x>>>0>m>>>0){break a}q=h<<8;m=(q+m|0)- -64|0;if(m>>>0<=q>>>0){break a}c:{if(m>>>0>B[a+8>>2]){u=-1;if(Ob(a));p=T-16|0;T=p;o=Pc(p+12|0,m);y[10172]=o;o=o?0:y[p+12>>2];y[a+4>>2]=o;y[a>>2]=o;y[a+8>>2]=o?m:0;T=p+16|0;if(!o){break c}}A=y[a+4>>2];Jd(b,c,d,e,A,x);u=x+A|0;m=u+v|0;p=m+(h<<7)|0;G=(p+r|0)+-64|0;F=f-1|0;o=h<<5;v=m+q|0;H=(m+r|0)+-64|0;while(1){q=E(r,D)+A|0;d=0;while(1){a=d<<2;e=a+q|0;y[a+m>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=a|4;l=e+m|0;e=e+q|0;y[l>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=a|8;l=e+m|0;e=e+q|0;y[l>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);a=a|12;e=a+m|0;a=a+q|0;y[e>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);d=d+4|0;if((o|0)!=(d|0)){continue}break}a=0;d=0;while(1){e=!r;if(!e){t(u+(E(a,o)<<2)|0,m,r);}Nb(m,p,v,h);if(!e){t(u+(E(o,a|1)<<2)|0,p,r);}Nb(p,m,v,h);C=0;e=0;a=a+2|0;d=a>>>0<2?d+1|0:d;if((g|0)==(d|0)&a>>>0>>0|d>>>0>>0){continue}break}while(1){a=u+(E(o,F&y[H>>2])<<2)|0;d=0;while(1){l=d<<2;n=l+m|0;y[n>>2]=y[n>>2]^y[a+l>>2];n=l|4;s=n+m|0;y[s>>2]=y[s>>2]^y[a+n>>2];n=l|8;s=n+m|0;y[s>>2]=y[s>>2]^y[a+n>>2];l=l|12;n=l+m|0;y[n>>2]=y[n>>2]^y[a+l>>2];d=d+4|0;if((o|0)!=(d|0)){continue}break}Nb(m,p,v,h);a=u+(E(o,F&y[G>>2])<<2)|0;d=0;while(1){l=d<<2;n=l+p|0;y[n>>2]=y[n>>2]^y[a+l>>2];n=l|4;s=n+p|0;y[s>>2]=y[s>>2]^y[a+n>>2];n=l|8;s=n+p|0;y[s>>2]=y[s>>2]^y[a+n>>2];l=l|12;n=l+p|0;y[n>>2]=y[n>>2]^y[a+l>>2];d=d+4|0;if((o|0)!=(d|0)){continue}break}Nb(p,m,v,h);d=0;C=C+2|0;a=C>>>0<2?e+1|0:e;e=a;if((g|0)==(a|0)&f>>>0>C>>>0|a>>>0>>0){continue}break}while(1){a=d<<2;e=a+q|0;l=y[a+m>>2];w[e|0]=l;w[e+1|0]=l>>>8;w[e+2|0]=l>>>16;w[e+3|0]=l>>>24;l=a|4;e=l+q|0;l=y[m+l>>2];w[e|0]=l;w[e+1|0]=l>>>8;w[e+2|0]=l>>>16;w[e+3|0]=l>>>24;l=a|8;e=l+q|0;l=y[m+l>>2];w[e|0]=l;w[e+1|0]=l>>>8;w[e+2|0]=l>>>16;w[e+3|0]=l>>>24;e=a|12;a=e+q|0;e=y[e+m>>2];w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;d=d+4|0;if((o|0)!=(d|0)){continue}break}D=D+1|0;if((D|0)!=(i|0)){continue}break}Jd(b,c,A,x,j,k);u=0;}return u}y[10172]=48;return -1}function ue(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-192|0;T=d;y[d+96>>2]=0;y[d+100>>2]=0;y[d+104>>2]=0;y[d+108>>2]=0;y[d+112>>2]=0;y[d+116>>2]=0;y[d+120>>2]=0;y[d+124>>2]=0;e=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[d+64>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+68>>2]=e;e=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+72>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+76>>2]=e;e=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+80>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+84>>2]=e;e=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+88>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+92>>2]=e;y[d+32>>2]=0;y[d+36>>2]=0;y[d+40>>2]=0;y[d+44>>2]=0;y[d+48>>2]=0;y[d+52>>2]=0;y[d+56>>2]=0;y[d+60>>2]=0;b=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);y[d>>2]=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);y[d+4>>2]=b;b=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);y[d+8>>2]=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);y[d+12>>2]=b;b=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);y[d+16>>2]=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);y[d+20>>2]=b;b=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);y[d+24>>2]=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);y[d+28>>2]=b;De(d- -64|0,d);c=y[d+124>>2];y[d+184>>2]=y[d+120>>2];y[d+188>>2]=c;b=y[d+116>>2];y[d+176>>2]=y[d+112>>2];y[d+180>>2]=b;b=y[d+108>>2];y[d+168>>2]=y[d+104>>2];y[d+172>>2]=b;b=y[d+100>>2];y[d+160>>2]=y[d+96>>2];y[d+164>>2]=b;b=y[d+92>>2];y[d+152>>2]=y[d+88>>2];y[d+156>>2]=b;b=y[d+84>>2];y[d+144>>2]=y[d+80>>2];y[d+148>>2]=b;b=y[d+76>>2];y[d+136>>2]=y[d+72>>2];y[d+140>>2]=b;b=y[d+68>>2];y[d+128>>2]=y[d+64>>2];y[d+132>>2]=b;b=d+128|0;Pa(b);e=y[d+156>>2];c=y[d+152>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=e;w[a+29|0]=e>>>8;w[a+30|0]=e>>>16;w[a+31|0]=e>>>24;e=y[d+148>>2];c=y[d+144>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=e;w[a+21|0]=e>>>8;w[a+22|0]=e>>>16;w[a+23|0]=e>>>24;e=y[d+140>>2];c=y[d+136>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;e=y[d+132>>2];c=y[d+128>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=e;w[a+5|0]=e>>>8;w[a+6|0]=e>>>16;w[a+7|0]=e>>>24;ja(b,64);T=d+192|0;}function Nb(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;e=((d<<7)+a|0)+-64|0;f=y[e+60>>2];y[c+56>>2]=y[e+56>>2];y[c+60>>2]=f;f=y[e+52>>2];y[c+48>>2]=y[e+48>>2];y[c+52>>2]=f;f=y[e+44>>2];y[c+40>>2]=y[e+40>>2];y[c+44>>2]=f;f=y[e+36>>2];y[c+32>>2]=y[e+32>>2];y[c+36>>2]=f;f=y[e+28>>2];y[c+24>>2]=y[e+24>>2];y[c+28>>2]=f;f=y[e+20>>2];y[c+16>>2]=y[e+16>>2];y[c+20>>2]=f;f=y[e+12>>2];y[c+8>>2]=y[e+8>>2];y[c+12>>2]=f;f=y[e+4>>2];y[c>>2]=y[e>>2];y[c+4>>2]=f;f=d<<6;i=d<<1;while(1){d=(h<<6)+a|0;y[c>>2]=y[c>>2]^y[d>>2];y[c+4>>2]=y[c+4>>2]^y[d+4>>2];y[c+8>>2]=y[c+8>>2]^y[d+8>>2];y[c+12>>2]=y[c+12>>2]^y[d+12>>2];y[c+16>>2]=y[c+16>>2]^y[d+16>>2];y[c+20>>2]=y[c+20>>2]^y[d+20>>2];y[c+24>>2]=y[c+24>>2]^y[d+24>>2];y[c+28>>2]=y[c+28>>2]^y[d+28>>2];y[c+32>>2]=y[c+32>>2]^y[d+32>>2];y[c+36>>2]=y[c+36>>2]^y[d+36>>2];y[c+40>>2]=y[c+40>>2]^y[d+40>>2];y[c+44>>2]=y[c+44>>2]^y[d+44>>2];y[c+48>>2]=y[c+48>>2]^y[d+48>>2];y[c+52>>2]=y[c+52>>2]^y[d+52>>2];y[c+56>>2]=y[c+56>>2]^y[d+56>>2];y[c+60>>2]=y[c+60>>2]^y[d+60>>2];Hd(c);g=y[c+60>>2];e=(h<<5)+b|0;y[e+56>>2]=y[c+56>>2];y[e+60>>2]=g;g=y[c+52>>2];y[e+48>>2]=y[c+48>>2];y[e+52>>2]=g;g=y[c+44>>2];y[e+40>>2]=y[c+40>>2];y[e+44>>2]=g;g=y[c+36>>2];y[e+32>>2]=y[c+32>>2];y[e+36>>2]=g;g=y[c+28>>2];y[e+24>>2]=y[c+24>>2];y[e+28>>2]=g;g=y[c+20>>2];y[e+16>>2]=y[c+16>>2];y[e+20>>2]=g;g=y[c+12>>2];y[e+8>>2]=y[c+8>>2];y[e+12>>2]=g;g=y[c+4>>2];y[e>>2]=y[c>>2];y[e+4>>2]=g;y[c>>2]=y[c>>2]^y[d- -64>>2];y[c+4>>2]=y[c+4>>2]^y[d+68>>2];y[c+8>>2]=y[c+8>>2]^y[d+72>>2];y[c+12>>2]=y[c+12>>2]^y[d+76>>2];y[c+16>>2]=y[c+16>>2]^y[d+80>>2];y[c+20>>2]=y[c+20>>2]^y[d+84>>2];y[c+24>>2]=y[c+24>>2]^y[d+88>>2];y[c+28>>2]=y[c+28>>2]^y[d+92>>2];y[c+32>>2]=y[c+32>>2]^y[d+96>>2];y[c+36>>2]=y[c+36>>2]^y[d+100>>2];y[c+40>>2]=y[c+40>>2]^y[d+104>>2];y[c+44>>2]=y[c+44>>2]^y[d+108>>2];y[c+48>>2]=y[c+48>>2]^y[d+112>>2];y[c+52>>2]=y[c+52>>2]^y[d+116>>2];y[c+56>>2]=y[c+56>>2]^y[d+120>>2];y[c+60>>2]=y[c+60>>2]^y[d+124>>2];Hd(c);d=e+f|0;e=y[c+60>>2];y[d+56>>2]=y[c+56>>2];y[d+60>>2]=e;e=y[c+52>>2];y[d+48>>2]=y[c+48>>2];y[d+52>>2]=e;e=y[c+44>>2];y[d+40>>2]=y[c+40>>2];y[d+44>>2]=e;e=y[c+36>>2];y[d+32>>2]=y[c+32>>2];y[d+36>>2]=e;e=y[c+28>>2];y[d+24>>2]=y[c+24>>2];y[d+28>>2]=e;e=y[c+20>>2];y[d+16>>2]=y[c+16>>2];y[d+20>>2]=e;e=y[c+12>>2];y[d+8>>2]=y[c+8>>2];y[d+12>>2]=e;e=y[c+4>>2];y[d>>2]=y[c>>2];y[d+4>>2]=e;h=h+2|0;if(i>>>0>h>>>0){continue}break}}function hc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,F=0;A=z[a+80|0]?0:16777216;o=y[a+36>>2];m=y[a+32>>2];n=y[a+28>>2];k=y[a+24>>2];l=y[a+20>>2];q=y[a+4>>2];B=E(q,5);s=y[a+8>>2];w=E(s,5);u=y[a+12>>2];v=E(u,5);x=y[a+16>>2];t=E(x,5);r=y[a>>2];while(1){g=((z[b+3|0]|z[b+4|0]<<8|(z[b+5|0]<<16|z[b+6|0]<<24))>>>2&67108863)+k|0;e=Ai(g,0,u,0);i=W;k=((z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24))&67108863)+l|0;h=Ai(k,0,x,0);l=h+e|0;e=W+i|0;e=h>>>0>l>>>0?e+1|0:e;n=((z[b+6|0]|z[b+7|0]<<8|(z[b+8|0]<<16|z[b+9|0]<<24))>>>4&67108863)+n|0;i=Ai(n,0,s,0);l=i+l|0;e=W+e|0;e=i>>>0>l>>>0?e+1|0:e;m=((z[b+9|0]|z[b+10|0]<<8|(z[b+11|0]<<16|z[b+12|0]<<24))>>>6|0)+m|0;i=Ai(m,0,q,0);l=i+l|0;e=W+e|0;e=i>>>0>l>>>0?e+1|0:e;o=o+A+((z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24))>>>8)|0;i=Ai(o,0,r,0);l=i+l|0;e=W+e|0;C=l;l=i>>>0>l>>>0?e+1|0:e;e=Ai(g,0,s,0);i=W;h=Ai(k,0,u,0);e=h+e|0;f=W+i|0;f=e>>>0>>0?f+1|0:f;h=Ai(n,0,q,0);i=h+e|0;e=W+f|0;e=h>>>0>i>>>0?e+1|0:e;h=Ai(m,0,r,0);i=h+i|0;e=W+e|0;e=h>>>0>i>>>0?e+1|0:e;h=Ai(o,0,t,0);i=h+i|0;e=W+e|0;D=i;i=h>>>0>i>>>0?e+1|0:e;e=Ai(g,0,q,0);j=W;f=Ai(k,0,s,0);h=f+e|0;e=W+j|0;e=f>>>0>h>>>0?e+1|0:e;j=Ai(n,0,r,0);h=j+h|0;f=W+e|0;f=h>>>0>>0?f+1|0:f;j=Ai(m,0,t,0);h=j+h|0;e=W+f|0;e=h>>>0>>0?e+1|0:e;j=Ai(o,0,v,0);h=j+h|0;e=W+e|0;F=h;h=h>>>0>>0?e+1|0:e;e=Ai(g,0,r,0);f=W;p=Ai(k,0,q,0);j=p+e|0;e=W+f|0;e=j>>>0

>>0?e+1|0:e;f=Ai(n,0,t,0);j=f+j|0;e=W+e|0;e=f>>>0>j>>>0?e+1|0:e;p=Ai(m,0,v,0);j=p+j|0;f=W+e|0;f=j>>>0

>>0?f+1|0:f;p=Ai(o,0,w,0);j=p+j|0;e=W+f|0;e=j>>>0

>>0?e+1|0:e;p=j;j=e;e=Ai(g,0,t,0);f=W;k=Ai(k,0,r,0);g=k+e|0;e=W+f|0;e=g>>>0>>0?e+1|0:e;k=Ai(n,0,v,0);g=k+g|0;e=W+e|0;e=g>>>0>>0?e+1|0:e;k=Ai(m,0,w,0);g=k+g|0;e=W+e|0;e=g>>>0>>0?e+1|0:e;k=Ai(o,0,B,0);g=k+g|0;f=W+e|0;f=g>>>0>>0?f+1|0:f;k=g;n=(f&67108863)<<6|g>>>26;g=n+p|0;e=j;e=g>>>0>>0?e+1|0:e;n=g;m=(e&67108863)<<6|g>>>26;g=m+F|0;e=h;e=g>>>0>>0?e+1|0:e;m=g;f=i;g=(e&67108863)<<6|g>>>26;e=g+D|0;o=e;f=e>>>0>>0?f+1|0:f;i=(f&67108863)<<6|e>>>26;g=i+C|0;e=l;e=E(((g>>>0>>0?e+1|0:e)&67108863)<<6|g>>>26,5)+(k&67108863)|0;k=(n&67108863)+(e>>>26|0)|0;n=m&67108863;m=o&67108863;o=g&67108863;l=e&67108863;b=b+16|0;d=d-(c>>>0<16)|0;c=c-16|0;if(!d&c>>>0>15|d){continue}break}y[a+36>>2]=o;y[a+32>>2]=m;y[a+28>>2]=n;y[a+24>>2]=k;y[a+20>>2]=l;}function Aa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;a:{if(!d){f=2036477234;g=857760878;e=1634760805;k=1797285236;break a}f=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);g=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);e=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);k=z[d+12|0]|z[d+13|0]<<8|(z[d+14|0]<<16|z[d+15|0]<<24);}h=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);m=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);i=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);n=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);j=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);t=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);o=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);d=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);p=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);q=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);c=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);while(1){l=c;r=b;b=c+e|0;c=Bi(r^b,16);e=c+o|0;o=Bi(l^e,12);l=o;r=b+o|0;s=Bi(r^c,8);o=s+e|0;b=Bi(l^o,7);c=d+k|0;h=Bi(c^h,16);n=h+n|0;d=Bi(n^d,12);l=p;k=f+p|0;f=Bi(k^m,16);p=f+j|0;e=Bi(l^p,12);j=f;f=e+k|0;j=Bi(j^f,8);u=c+d|0;k=u+b|0;c=Bi(j^k,16);g=g+q|0;m=Bi(g^i,16);i=m+t|0;q=Bi(i^q,12);g=q+g|0;l=b;b=Bi(g^m,8);v=b+i|0;i=v+c|0;l=Bi(l^i,12);k=l+k|0;m=Bi(c^k,8);t=m+i|0;c=Bi(t^l,7);h=Bi(h^u,8);n=h+n|0;d=Bi(n^d,7);f=d+f|0;i=Bi(f^b,16);b=i+o|0;d=Bi(b^d,12);f=d+f|0;i=Bi(i^f,8);o=b+i|0;d=Bi(o^d,7);j=j+p|0;b=Bi(j^e,7);g=b+g|0;p=Bi(g^s,16);e=p+n|0;s=Bi(b^e,12);g=s+g|0;b=Bi(p^g,8);n=e+b|0;p=Bi(n^s,7);l=j;j=h;e=Bi(q^v,7);h=e+r|0;j=Bi(j^h,16);q=l+j|0;r=Bi(e^q,12);e=r+h|0;h=Bi(j^e,8);j=q+h|0;q=Bi(j^r,7);x=x+1|0;if((x|0)!=10){continue}break}w[a|0]=e;w[a+1|0]=e>>>8;w[a+2|0]=e>>>16;w[a+3|0]=e>>>24;w[a+28|0]=h;w[a+29|0]=h>>>8;w[a+30|0]=h>>>16;w[a+31|0]=h>>>24;w[a+24|0]=m;w[a+25|0]=m>>>8;w[a+26|0]=m>>>16;w[a+27|0]=m>>>24;w[a+20|0]=i;w[a+21|0]=i>>>8;w[a+22|0]=i>>>16;w[a+23|0]=i>>>24;w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+12|0]=k;w[a+13|0]=k>>>8;w[a+14|0]=k>>>16;w[a+15|0]=k>>>24;w[a+8|0]=f;w[a+9|0]=f>>>8;w[a+10|0]=f>>>16;w[a+11|0]=f>>>24;w[a+4|0]=g;w[a+5|0]=g>>>8;w[a+6|0]=g>>>16;w[a+7|0]=g>>>24;return 0}function sa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=y[b+40>>2];e=y[b+4>>2];g=y[b+44>>2];h=y[b+8>>2];i=y[b+48>>2];j=y[b+12>>2];k=y[b+52>>2];l=y[b+16>>2];m=y[b+56>>2];n=y[b+20>>2];o=y[b+60>>2];p=y[b+24>>2];f=b- -64|0;q=y[f>>2];r=y[b+28>>2];s=y[b+68>>2];t=y[b+32>>2];u=y[b+72>>2];v=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=t+u;y[a+28>>2]=r+s;y[a+24>>2]=p+q;y[a+20>>2]=n+o;y[a+16>>2]=l+m;y[a+12>>2]=j+k;y[a+8>>2]=h+i;y[a+4>>2]=e+g;y[a>>2]=d+v;g=y[b+40>>2];d=y[b+4>>2];h=y[b+44>>2];i=y[b+8>>2];j=y[b+48>>2];k=y[b+12>>2];l=y[b+52>>2];m=y[b+16>>2];n=y[b+56>>2];o=y[b+20>>2];p=y[b+60>>2];q=y[b+24>>2];f=y[f>>2];e=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=t-s;y[a+68>>2]=r-e;e=a- -64|0;y[e>>2]=f-q;y[a+60>>2]=p-o;y[a+56>>2]=n-m;y[a+52>>2]=l-k;y[a+48>>2]=j-i;y[a+44>>2]=h-d;d=a+40|0;y[d>>2]=g-u;ga(a+80|0,a,c);ga(d,d,c+40|0);ga(a+120|0,c+120|0,b+120|0);ga(a,b+80|0,c+80|0);v=y[a+4>>2];z=y[a+8>>2];A=y[a+12>>2];B=y[a+16>>2];C=y[a+20>>2];D=y[a+24>>2];E=y[a+28>>2];F=y[a+32>>2];G=y[a+36>>2];b=y[d>>2];c=y[a+80>>2];g=y[a+44>>2];h=y[a+84>>2];i=y[a+48>>2];j=y[a+88>>2];k=y[a+52>>2];l=y[a+92>>2];m=y[a+56>>2];n=y[a+96>>2];o=y[a+60>>2];p=y[a+100>>2];f=y[e>>2];q=y[a+104>>2];r=y[a+68>>2];s=y[a+108>>2];t=y[a+72>>2];u=y[a+112>>2];H=y[a>>2];w=y[a+76>>2];x=y[a+116>>2];y[a+76>>2]=w+x;y[a+72>>2]=t+u;y[a+68>>2]=r+s;y[e>>2]=f+q;y[a+60>>2]=o+p;y[a+56>>2]=m+n;y[a+52>>2]=k+l;y[a+48>>2]=i+j;y[a+44>>2]=g+h;y[d>>2]=b+c;y[a+36>>2]=x-w;y[a+32>>2]=u-t;y[a+28>>2]=s-r;y[a+24>>2]=q-f;y[a+20>>2]=p-o;y[a+16>>2]=n-m;y[a+12>>2]=l-k;y[a+8>>2]=j-i;y[a+4>>2]=h-g;y[a>>2]=c-b;b=G<<1;c=y[a+156>>2];y[a+156>>2]=b-c;d=F<<1;e=y[a+152>>2];y[a+152>>2]=d-e;g=E<<1;h=y[a+148>>2];y[a+148>>2]=g-h;i=D<<1;j=y[a+144>>2];y[a+144>>2]=i-j;k=C<<1;l=y[a+140>>2];y[a+140>>2]=k-l;m=B<<1;n=y[a+136>>2];y[a+136>>2]=m-n;o=A<<1;p=y[a+132>>2];y[a+132>>2]=o-p;f=z<<1;q=y[a+128>>2];y[a+128>>2]=f-q;r=v<<1;s=y[a+124>>2];y[a+124>>2]=r-s;t=H<<1;u=y[a+120>>2];y[a+120>>2]=t-u;y[a+112>>2]=d+e;y[a+108>>2]=g+h;y[a+104>>2]=i+j;y[a+100>>2]=k+l;y[a+96>>2]=m+n;y[a+92>>2]=o+p;y[a+88>>2]=f+q;y[a+84>>2]=r+s;y[a+80>>2]=t+u;y[a+116>>2]=b+c;}function Hb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=y[b+40>>2];e=y[b+4>>2];g=y[b+44>>2];h=y[b+8>>2];i=y[b+48>>2];j=y[b+12>>2];k=y[b+52>>2];l=y[b+16>>2];m=y[b+56>>2];n=y[b+20>>2];o=y[b+60>>2];p=y[b+24>>2];f=b- -64|0;q=y[f>>2];r=y[b+28>>2];s=y[b+68>>2];t=y[b+32>>2];u=y[b+72>>2];v=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=t+u;y[a+28>>2]=r+s;y[a+24>>2]=p+q;y[a+20>>2]=n+o;y[a+16>>2]=l+m;y[a+12>>2]=j+k;y[a+8>>2]=h+i;y[a+4>>2]=e+g;y[a>>2]=d+v;g=y[b+40>>2];d=y[b+4>>2];h=y[b+44>>2];i=y[b+8>>2];j=y[b+48>>2];k=y[b+12>>2];l=y[b+52>>2];m=y[b+16>>2];n=y[b+56>>2];o=y[b+20>>2];p=y[b+60>>2];q=y[b+24>>2];f=y[f>>2];e=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=t-s;y[a+68>>2]=r-e;e=a- -64|0;y[e>>2]=f-q;y[a+60>>2]=p-o;y[a+56>>2]=n-m;y[a+52>>2]=l-k;y[a+48>>2]=j-i;y[a+44>>2]=h-d;d=a+40|0;y[d>>2]=g-u;ga(a+80|0,a,c+40|0);ga(d,d,c);ga(a+120|0,c+120|0,b+120|0);ga(a,b+80|0,c+80|0);v=y[a+4>>2];z=y[a+8>>2];A=y[a+12>>2];B=y[a+16>>2];C=y[a+20>>2];D=y[a+24>>2];E=y[a+28>>2];F=y[a+32>>2];G=y[a+36>>2];b=y[d>>2];c=y[a+80>>2];g=y[a+44>>2];h=y[a+84>>2];i=y[a+48>>2];j=y[a+88>>2];k=y[a+52>>2];l=y[a+92>>2];m=y[a+56>>2];n=y[a+96>>2];o=y[a+60>>2];p=y[a+100>>2];f=y[e>>2];q=y[a+104>>2];r=y[a+68>>2];s=y[a+108>>2];t=y[a+72>>2];u=y[a+112>>2];H=y[a>>2];w=y[a+76>>2];x=y[a+116>>2];y[a+76>>2]=w+x;y[a+72>>2]=t+u;y[a+68>>2]=r+s;y[e>>2]=f+q;y[a+60>>2]=o+p;y[a+56>>2]=m+n;y[a+52>>2]=k+l;y[a+48>>2]=i+j;y[a+44>>2]=g+h;y[d>>2]=b+c;y[a+36>>2]=x-w;y[a+32>>2]=u-t;y[a+28>>2]=s-r;y[a+24>>2]=q-f;y[a+20>>2]=p-o;y[a+16>>2]=n-m;y[a+12>>2]=l-k;y[a+8>>2]=j-i;y[a+4>>2]=h-g;y[a>>2]=c-b;b=y[a+156>>2];c=G<<1;y[a+156>>2]=b+c;d=y[a+152>>2];e=F<<1;y[a+152>>2]=d+e;g=y[a+148>>2];h=E<<1;y[a+148>>2]=g+h;i=y[a+144>>2];j=D<<1;y[a+144>>2]=i+j;k=y[a+140>>2];l=C<<1;y[a+140>>2]=k+l;m=y[a+136>>2];n=B<<1;y[a+136>>2]=m+n;o=y[a+132>>2];p=A<<1;y[a+132>>2]=o+p;f=y[a+128>>2];q=z<<1;y[a+128>>2]=f+q;r=y[a+124>>2];s=v<<1;y[a+124>>2]=r+s;t=y[a+120>>2];u=H<<1;y[a+120>>2]=t+u;y[a+112>>2]=e-d;y[a+108>>2]=h-g;y[a+104>>2]=j-i;y[a+100>>2]=l-k;y[a+96>>2]=n-m;y[a+92>>2]=p-o;y[a+88>>2]=q-f;y[a+84>>2]=s-r;y[a+80>>2]=u-t;y[a+116>>2]=c-b;}function fc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=y[b+40>>2];e=y[b+4>>2];g=y[b+44>>2];h=y[b+8>>2];i=y[b+48>>2];j=y[b+12>>2];k=y[b+52>>2];l=y[b+16>>2];m=y[b+56>>2];n=y[b+20>>2];o=y[b+60>>2];p=y[b+24>>2];f=b- -64|0;q=y[f>>2];r=y[b+28>>2];s=y[b+68>>2];t=y[b+32>>2];u=y[b+72>>2];v=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=t+u;y[a+28>>2]=r+s;y[a+24>>2]=p+q;y[a+20>>2]=n+o;y[a+16>>2]=l+m;y[a+12>>2]=j+k;y[a+8>>2]=h+i;y[a+4>>2]=e+g;y[a>>2]=d+v;g=y[b+40>>2];d=y[b+4>>2];h=y[b+44>>2];i=y[b+8>>2];j=y[b+48>>2];k=y[b+12>>2];l=y[b+52>>2];m=y[b+16>>2];n=y[b+56>>2];o=y[b+20>>2];p=y[b+60>>2];q=y[b+24>>2];f=y[f>>2];e=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=t-s;y[a+68>>2]=r-e;e=a- -64|0;y[e>>2]=f-q;y[a+60>>2]=p-o;y[a+56>>2]=n-m;y[a+52>>2]=l-k;y[a+48>>2]=j-i;y[a+44>>2]=h-d;d=a+40|0;y[d>>2]=g-u;ga(a+80|0,a,c);ga(d,d,c+40|0);ga(a+120|0,c+80|0,b+120|0);v=y[b+80>>2];z=y[b+84>>2];A=y[b+88>>2];B=y[b+92>>2];C=y[b+96>>2];D=y[b+100>>2];E=y[b+104>>2];F=y[b+108>>2];G=y[b+112>>2];H=y[b+116>>2];b=y[d>>2];c=y[a+80>>2];g=y[a+44>>2];h=y[a+84>>2];i=y[a+48>>2];j=y[a+88>>2];k=y[a+52>>2];l=y[a+92>>2];m=y[a+56>>2];n=y[a+96>>2];o=y[a+60>>2];p=y[a+100>>2];f=y[e>>2];q=y[a+104>>2];r=y[a+68>>2];s=y[a+108>>2];t=y[a+72>>2];u=y[a+112>>2];w=y[a+76>>2];x=y[a+116>>2];y[a+76>>2]=w+x;y[a+72>>2]=t+u;y[a+68>>2]=r+s;y[e>>2]=f+q;y[a+60>>2]=o+p;y[a+56>>2]=m+n;y[a+52>>2]=k+l;y[a+48>>2]=i+j;y[a+44>>2]=g+h;y[d>>2]=b+c;y[a+36>>2]=x-w;y[a+32>>2]=u-t;y[a+28>>2]=s-r;y[a+24>>2]=q-f;y[a+20>>2]=p-o;y[a+16>>2]=n-m;y[a+12>>2]=l-k;y[a+8>>2]=j-i;y[a+4>>2]=h-g;y[a>>2]=c-b;b=H<<1;c=y[a+156>>2];y[a+156>>2]=b-c;d=G<<1;e=y[a+152>>2];y[a+152>>2]=d-e;g=F<<1;h=y[a+148>>2];y[a+148>>2]=g-h;i=E<<1;j=y[a+144>>2];y[a+144>>2]=i-j;k=D<<1;l=y[a+140>>2];y[a+140>>2]=k-l;m=C<<1;n=y[a+136>>2];y[a+136>>2]=m-n;o=B<<1;p=y[a+132>>2];y[a+132>>2]=o-p;f=A<<1;q=y[a+128>>2];y[a+128>>2]=f-q;r=z<<1;s=y[a+124>>2];y[a+124>>2]=r-s;t=v<<1;u=y[a+120>>2];y[a+120>>2]=t-u;y[a+112>>2]=d+e;y[a+108>>2]=g+h;y[a+104>>2]=i+j;y[a+100>>2]=k+l;y[a+96>>2]=m+n;y[a+92>>2]=o+p;y[a+88>>2]=f+q;y[a+84>>2]=r+s;y[a+80>>2]=t+u;y[a+116>>2]=b+c;}function Ja(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=-1;f=d-65|0;if(!(f>>>0<4294967232|c>>>0>64)){a:{if(!(c?b:0)){if((f&255)>>>0<=191){na();s();}o(a- -64|0,0,293);w[a+56|0]=121;w[a+57|0]=33;w[a+58|0]=126;w[a+59|0]=19;w[a+60|0]=25;w[a+61|0]=205;w[a+62|0]=224;w[a+63|0]=91;w[a+48|0]=107;w[a+49|0]=189;w[a+50|0]=65;w[a+51|0]=251;w[a+52|0]=171;w[a+53|0]=217;w[a+54|0]=131;w[a+55|0]=31;w[a+40|0]=31;w[a+41|0]=108;w[a+42|0]=62;w[a+43|0]=43;w[a+44|0]=140;w[a+45|0]=104;w[a+46|0]=5;w[a+47|0]=155;w[a+32|0]=209;w[a+33|0]=130;w[a+34|0]=230;w[a+35|0]=173;w[a+36|0]=127;w[a+37|0]=82;w[a+38|0]=14;w[a+39|0]=81;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;b=d^-222443256;w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=103;w[a+5|0]=230;w[a+6|0]=9;w[a+7|0]=106;break a}e=T-128|0;T=e;b:{if(!(!b|(d-65&255)>>>0<=191|(c-65&255)>>>0<=191)){o(a- -64|0,0,293);w[a+56|0]=121;w[a+57|0]=33;w[a+58|0]=126;w[a+59|0]=19;w[a+60|0]=25;w[a+61|0]=205;w[a+62|0]=224;w[a+63|0]=91;w[a+48|0]=107;w[a+49|0]=189;w[a+50|0]=65;w[a+51|0]=251;w[a+52|0]=171;w[a+53|0]=217;w[a+54|0]=131;w[a+55|0]=31;w[a+40|0]=31;w[a+41|0]=108;w[a+42|0]=62;w[a+43|0]=43;w[a+44|0]=140;w[a+45|0]=104;w[a+46|0]=5;w[a+47|0]=155;w[a+32|0]=209;w[a+33|0]=130;w[a+34|0]=230;w[a+35|0]=173;w[a+36|0]=127;w[a+37|0]=82;w[a+38|0]=14;w[a+39|0]=81;w[a+24|0]=241;w[a+25|0]=54;w[a+26|0]=29;w[a+27|0]=95;w[a+28|0]=58;w[a+29|0]=245;w[a+30|0]=79;w[a+31|0]=165;w[a+16|0]=43;w[a+17|0]=248;w[a+18|0]=148;w[a+19|0]=254;w[a+20|0]=114;w[a+21|0]=243;w[a+22|0]=110;w[a+23|0]=60;w[a+8|0]=59;w[a+9|0]=167;w[a+10|0]=202;w[a+11|0]=132;w[a+12|0]=133;w[a+13|0]=174;w[a+14|0]=103;w[a+15|0]=187;d=(c<<8|d)^-222443256;w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;d=c>>>24^1779033703;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;o(e,0,128);if(c){t(e,b,c);}t(a+96|0,e,128);w[a+352|0]=128;w[a+353|0]=0;w[a+354|0]=0;w[a+355|0]=0;ja(e,128);T=e+128|0;break b}na();s();}}e=0;}return e|0}function Sa(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0;a:{if(!d){e=1797285236;i=2036477234;j=857760878;d=1634760805;break a}e=z[d+12|0]|z[d+13|0]<<8|(z[d+14|0]<<16|z[d+15|0]<<24);i=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);j=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);d=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);}f=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);h=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);g=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);r=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);q=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);s=20;o=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);p=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);l=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);m=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);n=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);b=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);c=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);while(1){k=Bi(c+j|0,7)^f;t=Bi(k+j|0,9)^q;l=Bi(d+o|0,7)^l;u=Bi(l+d|0,9)^h;v=Bi(u+l|0,13)^o;m=Bi(e+p|0,7)^m;g=Bi(m+e|0,9)^g;h=Bi(g+m|0,13)^p;e=Bi(g+h|0,18)^e;f=Bi(b+i|0,7)^r;o=v^Bi(e+f|0,7);q=t^Bi(o+e|0,9);r=Bi(o+q|0,13)^f;e=Bi(q+r|0,18)^e;n=Bi(f+i|0,9)^n;x=Bi(n+f|0,13)^b;b=Bi(x+n|0,18)^i;p=Bi(b+k|0,7)^h;h=Bi(p+b|0,9)^u;f=Bi(h+p|0,13)^k;i=Bi(f+h|0,18)^b;k=Bi(k+t|0,13)^c;c=Bi(k+t|0,18)^j;b=Bi(c+l|0,7)^x;g=Bi(b+c|0,9)^g;l=Bi(b+g|0,13)^l;j=Bi(g+l|0,18)^c;d=Bi(u+v|0,18)^d;c=Bi(d+m|0,7)^k;n=Bi(c+d|0,9)^n;m=Bi(c+n|0,13)^m;d=Bi(n+m|0,18)^d;k=s>>>0>2;s=s-2|0;if(k){continue}break}w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+28|0]=f;w[a+29|0]=f>>>8;w[a+30|0]=f>>>16;w[a+31|0]=f>>>24;w[a+24|0]=h;w[a+25|0]=h>>>8;w[a+26|0]=h>>>16;w[a+27|0]=h>>>24;w[a+20|0]=g;w[a+21|0]=g>>>8;w[a+22|0]=g>>>16;w[a+23|0]=g>>>24;w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+12|0]=e;w[a+13|0]=e>>>8;w[a+14|0]=e>>>16;w[a+15|0]=e>>>24;w[a+8|0]=i;w[a+9|0]=i>>>8;w[a+10|0]=i>>>16;w[a+11|0]=i>>>24;w[a+4|0]=j;w[a+5|0]=j>>>8;w[a+6|0]=j>>>16;w[a+7|0]=j>>>24;return 0}function cb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,A=0,B=0,C=0,D=0,E=0;r=z[b+31|0];s=z[b+30|0];t=z[b+29|0];u=z[b+6|0];v=z[b+5|0];w=z[b+4|0];x=z[b+9|0];A=z[b+8|0];B=z[b+7|0];C=z[b+12|0];l=z[b+11|0];m=z[b+10|0];p=z[b+15|0];n=z[b+14|0];D=z[b+13|0];i=z[b+28|0];k=z[b+27|0];j=z[b+26|0];h=z[b+25|0];f=z[b+24|0];e=z[b+23|0];E=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);d=z[b+21|0];g=d<<15;d=c;c=g;g=z[b+20|0];o=c|g<<7;g=d|d;c=z[b+22|0];c=c<<23|o;d=d|g;q=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);b=0;g=c;o=q+16777216|0;b=o>>>0<16777216?1:b;c=(b&33554431)<<7|o>>>25;g=g+c|0;b=(b>>>25|0)+d|0;d=g;c=d>>>0>>0?b+1|0:b;g=d+33554432|0;b=g>>>0<33554432?c+1|0:c;y[a+24>>2]=d-(g&-67108864);d=e>>>27|0;e=f<<13|e<<5;c=d|f>>>19|h>>>11;d=b;f=h<<21|e;d=(d&67108863)<<6|g>>>26;e=f+d|0;d=e;b=c;e=f+16777216|0;c=e>>>0<16777216?b+1|0:b;y[a+28>>2]=d-(e&1040187392);d=k>>>20|j>>>28|i>>>12;b=c;c=b>>>25|0;b=(b&33554431)<<7|e>>>25;e=b+(k<<12|j<<4|i<<20)|0;d=c+d|0;c=e;d=c>>>0>>0?d+1|0:d;b=d;i=c+33554432|0;e=i>>>0<33554432?b+1|0:b;y[a+32>>2]=c-(i&-67108864);j=q-(o&-33554432)|0;f=n<<10|D<<2|p<<18;h=n>>>22|p>>>14;c=l>>>21|m>>>29;l=l<<11|m<<3|C<<19;k=l+16777216|0;d=k>>>0<16777216?c+1|0:c;b=d>>>25|0;c=f;f=(d&33554431)<<7|k>>>25;d=c+f|0;c=b+h|0;c=d>>>0>>0?c+1|0:c;b=c;f=d+33554432|0;b=f>>>0<33554432?b+1|0:b;c=f;f=((b&67108863)<<6|c>>>26)+j|0;y[a+20>>2]=f;y[a+16>>2]=d-(c&-67108864);f=A<<13|B<<5|x<<21;h=0;m=v<<14|w<<6|u<<22;c=0;j=m+16777216|0;c=j>>>0<16777216?c+1|0:c;d=c>>>25|0;b=f;f=(c&33554431)<<7|j>>>25;c=b+f|0;b=d+h|0;b=c>>>0>>0?b+1|0:b;h=c+33554432|0;d=h>>>0<33554432?b+1|0:b;y[a+8>>2]=c-(h&-67108864);n=r<<18&33292288|(s<<10|t<<2);c=0;e=(e&67108863)<<6|i>>>26;i=e+n|0;b=c;e=n+16777216|0;c=e>>>0<16777216?b+1|0:b;y[a+36>>2]=i-(e&33554432);d=l+((d&67108863)<<6|h>>>26)|0;y[a+12>>2]=d-(k&234881024);f=m-(j&2113929216)|0;b=c;c=b>>>25|0;d=Ai((b&33554431)<<7|e>>>25,c,19,0);c=d+E|0;b=W;d=c>>>0>>0?b+1|0:b;b=c+33554432|0;d=b>>>0<33554432?d+1|0:d;e=((d&67108863)<<6|b>>>26)+f|0;y[a+4>>2]=e;y[a>>2]=c-(b&-67108864);}function va(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=T-704|0;T=o;a:{if(!(c|d)){break a}g=y[a+76>>2];f=g;g=(d<<3|c>>>29)+f|0;k=y[a+72>>2];i=c<<3;h=k+i|0;y[a+72>>2]=h;g=h>>>0>>0?g+1|0:g;y[a+76>>2]=g;e=a- -64|0;i=e;h=(f|0)==(g|0)&h>>>0>>0|f>>>0>g>>>0;g=y[e+4>>2];r=h;h=h+y[e>>2]|0;e=r>>>0>h>>>0?g+1|0:g;j=d>>>29|0;h=j+h|0;y[i>>2]=h;y[i+4>>2]=h>>>0>>0?e+1|0:e;h=a+80|0;i=((f&7)<<29|k>>>3)&127;g=i;e=128-g|0;k=e;j=0;r=0-(j+(g>>>0>128)|0)|0;g=r;if((d|0)==(g|0)&c>>>0>=e>>>0|d>>>0>g>>>0){s=e&3;f=0;g=0;b:{if(!j&(i^127)>>>0>=3|j){j=e&252;while(1){e=f+i|0;w[e+h|0]=z[b+f|0];e=f|1;q=i+e|0;w[h+q|0]=z[b+e|0];e=f|2;q=i+e|0;w[h+q|0]=z[b+e|0];e=f|3;q=i+e|0;w[h+q|0]=z[b+e|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((j|0)!=(m|0)|(n|0)!=(e|0)){continue}break}if(!(s|t)){break b}}while(1){e=f+i|0;w[e+h|0]=z[b+f|0];e=g;f=f+1|0;g=f?e:e+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((l|0)!=(s|0)|(t|0)!=(e|0)){continue}break}}f=o+640|0;Xb(a,h,o,f);b=b+k|0;d=d-((c>>>0>>0)+r|0)|0;c=c-k|0;if(!d&c>>>0>127|d){while(1){Xb(a,b,o,f);b=b+128|0;d=d-(c>>>0<128)|0;c=c-128|0;if(!d&c>>>0>127|d){continue}break}}c:{if(!(c|d)){break c}a=c&3;p=0;l=0;n=0;f=0;g=0;if(!d&c>>>0>=4|d){m=c&124;k=0;c=0;d=0;while(1){w[f+h|0]=z[b+f|0];e=f|1;w[e+h|0]=z[b+e|0];e=f|2;w[e+h|0]=z[b+e|0];e=f|3;w[e+h|0]=z[b+e|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;e=d;c=c+4|0;e=c>>>0<4?e+1|0:e;d=e;if((c|0)!=(m|0)|(k|0)!=(e|0)){continue}break}if(!(a|p)){break c}}while(1){w[f+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((a|0)!=(l|0)|(p|0)!=(e|0)){continue}break}}ja(o,704);break a}a=c&3;k=0;f=0;g=0;if(!d&c>>>0>=4|d){c=c&-4;while(1){e=f+i|0;w[e+h|0]=z[b+f|0];e=f|1;j=i+e|0;w[h+j|0]=z[b+e|0];e=f|2;j=i+e|0;w[h+j|0]=z[b+e|0];e=f|3;j=i+e|0;w[h+j|0]=z[b+e|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((c|0)!=(m|0)|(d|0)!=(e|0)){continue}break}if(!(a|k)){break a}}while(1){c=f+i|0;w[c+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((a|0)!=(l|0)|(k|0)!=(e|0)){continue}break}}T=o+704|0;return 0}function xe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;c=T-736|0;T=c;h=c+704|0;ha(h,b,b);e=c+224|0;ha(e,b,h);g=c+672|0;ha(g,b,e);f=c+640|0;ha(f,g,g);j=c+416|0;ha(j,h,f);h=c+320|0;ha(h,b,j);d=c+608|0;ha(d,f,f);f=c+288|0;ha(f,h,h);i=c+576|0;ha(i,j,f);m=c+448|0;ha(m,d,f);k=c+544|0;ha(k,i,i);i=c+384|0;ha(i,d,k);l=c+352|0;ha(l,e,i);e=c+192|0;ha(e,d,l);d=c+160|0;ha(d,g,e);ha(c+96|0,g,d);e=c+512|0;ha(e,k,l);d=c+480|0;ha(d,g,e);e=c+256|0;ha(e,m,d);ha(c+128|0,f,e);f=c- -64|0;ha(f,i,d);d=c+32|0;ha(d,g,f);ha(c,j,d);ha(a,h,c);g=0;while(1){ha(a,a,a);g=g+1|0;if((g|0)!=126){continue}break}ha(a,a,c+352|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+704|0);ha(a,a,c);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+160|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+256|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c- -64|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+96|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+320|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+512|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+192|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+480|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+128|0);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,a);ha(a,a,c+32|0);T=c+736|0;return 0-ya(b,32)|0}function Yd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=T-160|0;T=k;rb(b,c,32,0);w[b|0]=z[b|0]&248;w[b+31|0]=z[b+31|0]&63|64;jb(k,b);Wa(a,k);f=c;g=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);e=z[f+4|0]|z[f+5|0]<<8|(z[f+6|0]<<16|z[f+7|0]<<24);h=z[f+8|0]|z[f+9|0]<<8|(z[f+10|0]<<16|z[f+11|0]<<24);i=z[f+12|0]|z[f+13|0]<<8|(z[f+14|0]<<16|z[f+15|0]<<24);j=z[f+16|0]|z[f+17|0]<<8|(z[f+18|0]<<16|z[f+19|0]<<24);c=z[f+20|0]|z[f+21|0]<<8|(z[f+22|0]<<16|z[f+23|0]<<24);l=z[f+28|0]|z[f+29|0]<<8|(z[f+30|0]<<16|z[f+31|0]<<24);d=b;b=z[f+24|0]|z[f+25|0]<<8|(z[f+26|0]<<16|z[f+27|0]<<24);w[d+24|0]=b;w[d+25|0]=b>>>8;w[d+26|0]=b>>>16;w[d+27|0]=b>>>24;w[d+28|0]=l;w[d+29|0]=l>>>8;w[d+30|0]=l>>>16;w[d+31|0]=l>>>24;w[d+16|0]=j;w[d+17|0]=j>>>8;w[d+18|0]=j>>>16;w[d+19|0]=j>>>24;w[d+20|0]=c;w[d+21|0]=c>>>8;w[d+22|0]=c>>>16;w[d+23|0]=c>>>24;w[d+8|0]=h;w[d+9|0]=h>>>8;w[d+10|0]=h>>>16;w[d+11|0]=h>>>24;w[d+12|0]=i;w[d+13|0]=i>>>8;w[d+14|0]=i>>>16;w[d+15|0]=i>>>24;w[d|0]=g;w[d+1|0]=g>>>8;w[d+2|0]=g>>>16;w[d+3|0]=g>>>24;w[d+4|0]=e;w[d+5|0]=e>>>8;w[d+6|0]=e>>>16;w[d+7|0]=e>>>24;e=a;h=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);i=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);j=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);c=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);b=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);a=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);g=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);e=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);w[d+56|0]=e;w[d+57|0]=e>>>8;w[d+58|0]=e>>>16;w[d+59|0]=e>>>24;w[d+60|0]=g;w[d+61|0]=g>>>8;w[d+62|0]=g>>>16;w[d+63|0]=g>>>24;w[d+48|0]=b;w[d+49|0]=b>>>8;w[d+50|0]=b>>>16;w[d+51|0]=b>>>24;w[d+52|0]=a;w[d+53|0]=a>>>8;w[d+54|0]=a>>>16;w[d+55|0]=a>>>24;w[d+40|0]=j;w[d+41|0]=j>>>8;w[d+42|0]=j>>>16;w[d+43|0]=j>>>24;w[d+44|0]=c;w[d+45|0]=c>>>8;w[d+46|0]=c>>>16;w[d+47|0]=c>>>24;w[d+32|0]=h;w[d+33|0]=h>>>8;w[d+34|0]=h>>>16;w[d+35|0]=h>>>24;w[d+36|0]=i;w[d+37|0]=i>>>8;w[d+38|0]=i>>>16;w[d+39|0]=i>>>24;T=k+160|0;return 0}function Ra(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;o=y[b+4>>2];d=y[a+4>>2];p=y[b+8>>2];e=y[a+8>>2];q=y[b+12>>2];f=y[a+12>>2];r=y[b+16>>2];g=y[a+16>>2];s=y[b+20>>2];h=y[a+20>>2];t=y[b+24>>2];i=y[a+24>>2];n=y[b+28>>2];j=y[a+28>>2];u=y[b+32>>2];k=y[a+32>>2];v=y[b+36>>2];l=y[a+36>>2];c=0-c|0;m=y[a>>2];y[a>>2]=c&(m^y[b>>2])^m;y[a+36>>2]=l^c&(l^v);y[a+32>>2]=k^c&(k^u);y[a+28>>2]=j^c&(j^n);y[a+24>>2]=i^c&(i^t);y[a+20>>2]=h^c&(h^s);y[a+16>>2]=g^c&(g^r);y[a+12>>2]=f^c&(f^q);y[a+8>>2]=e^c&(e^p);y[a+4>>2]=d^c&(d^o);d=y[a+40>>2];o=y[b+40>>2];e=y[a+44>>2];p=y[b+44>>2];f=y[a+48>>2];q=y[b+48>>2];g=y[a+52>>2];r=y[b+52>>2];h=y[a+56>>2];s=y[b+56>>2];i=y[a+60>>2];t=y[b+60>>2];n=a- -64|0;j=y[n>>2];u=y[b- -64>>2];k=y[a+68>>2];v=y[b+68>>2];l=y[a+72>>2];m=y[b+72>>2];w=y[a+76>>2];y[a+76>>2]=w^c&(y[b+76>>2]^w);y[a+72>>2]=l^c&(l^m);y[a+68>>2]=k^c&(k^v);y[n>>2]=j^c&(j^u);y[a+60>>2]=i^c&(i^t);y[a+56>>2]=h^c&(h^s);y[a+52>>2]=g^c&(g^r);y[a+48>>2]=f^c&(f^q);y[a+44>>2]=e^c&(e^p);y[a+40>>2]=d^c&(d^o);d=y[a+80>>2];o=y[b+80>>2];e=y[a+84>>2];p=y[b+84>>2];f=y[a+88>>2];q=y[b+88>>2];g=y[a+92>>2];r=y[b+92>>2];h=y[a+96>>2];s=y[b+96>>2];i=y[a+100>>2];t=y[b+100>>2];j=y[a+104>>2];n=y[b+104>>2];k=y[a+108>>2];u=y[b+108>>2];l=y[a+112>>2];v=y[b+112>>2];m=y[a+116>>2];y[a+116>>2]=c&(m^y[b+116>>2])^m;y[a+112>>2]=l^c&(l^v);y[a+108>>2]=k^c&(k^u);y[a+104>>2]=j^c&(j^n);y[a+100>>2]=i^c&(i^t);y[a+96>>2]=h^c&(h^s);y[a+92>>2]=g^c&(g^r);y[a+88>>2]=f^c&(f^q);y[a+84>>2]=e^c&(e^p);y[a+80>>2]=d^c&(d^o);d=y[a+120>>2];o=y[b+120>>2];e=y[a+124>>2];p=y[b+124>>2];f=y[a+128>>2];q=y[b+128>>2];g=y[a+132>>2];r=y[b+132>>2];h=y[a+136>>2];s=y[b+136>>2];i=y[a+140>>2];t=y[b+140>>2];j=y[a+144>>2];n=y[b+144>>2];k=y[a+148>>2];u=y[b+148>>2];l=y[a+152>>2];v=y[b+152>>2];m=y[b+156>>2];b=y[a+156>>2];y[a+156>>2]=c&(m^b)^b;y[a+152>>2]=l^c&(l^v);y[a+148>>2]=k^c&(k^u);y[a+144>>2]=j^c&(j^n);y[a+140>>2]=i^c&(i^t);y[a+136>>2]=h^c&(h^s);y[a+132>>2]=g^c&(g^r);y[a+128>>2]=f^c&(f^q);y[a+124>>2]=e^c&(e^p);y[a+120>>2]=d^c&(d^o);}function Ac(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((h&-7)==1){a:{b:{c:{d:{e:{f:{g:{if(d){h:{i:{if(h>>>0<=3){while(1){l=i;j:{k:{l:{m:{while(1){k=w[c+l|0];j=k-65|0;j=j&(k-91&(j^-1))>>>8&255|(k+4&(k-58&(k+65488^-1))>>>8&255|(k+185&(k-123&(k+65439^-1))>>>8&255|(((k^16336)+1^-1)>>>8&63|((k^16340)+1^-1)>>>8&62)));j=(j-1&(k^65470)+1)>>>8&255|j;if((j|0)!=255){break m}j=0;if(!e){break h}if(ob(e,k)){l=l+1|0;if(l>>>0>=d>>>0){break l}continue}break}i=l;break h}o=j+(o<<6)|0;if(m>>>0>1){break k}m=m+6|0;break j}a=i+1|0;i=a>>>0>>0?d:a;break h}m=m-2|0;if(b>>>0<=n>>>0){break i}w[a+n|0]=o>>>m;n=n+1|0;}j=0;i=l+1|0;if(i>>>0>>0){continue}break}break h}while(1){n:{k=w[c+l|0];j=k-65|0;j=j&(k-91&(j^-1))>>>8&255|(k+4&(k-58&(k+65488^-1))>>>8&255|(k+185&(k-123&(k+65439^-1))>>>8&255|(((k^16288)+1^-1)>>>8&63|((k^16338)+1^-1)>>>8&62)));j=(j-1&(k^65470)+1)>>>8&255|j;if((j|0)==255){j=0;if(!e){break h}if(ob(e,k)){l=l+1|0;if(l>>>0>=d>>>0){break n}continue}i=l;break h}o=j+(o<<6)|0;o:{if(m>>>0<2){m=m+6|0;break o}m=m-2|0;if(b>>>0<=n>>>0){break i}w[a+n|0]=o>>>m;n=n+1|0;}j=0;i=l+1|0;if(i>>>0>=d>>>0){break h}l=i;continue}break}a=i+1|0;i=a>>>0>>0?d:a;break h}i=l;y[10172]=68;j=1;}if(m>>>0>4){break g}a=i;}else {a=0;}l=-1;if(j){i=a;break a}if((-1<>>1|0;if(!j){break p}if(!e){break e}i=a>>>0>d>>>0?a:d;while(1){if((a|0)==(i|0)){e=68;break d}q:{b=w[a+c|0];if((b|0)==61){j=j-1|0;break q}if(ob(e,b)){break q}e=28;i=a;break d}a=a+1|0;if(j){continue}break}}l=0;if(!e|a>>>0>=d>>>0){break f}while(1){if(!ob(e,w[a+c|0])){break f}a=a+1|0;if((d|0)!=(a|0)){continue}break}i=d;break b}l=-1;break a}i=a;break b}e=68;if(a>>>0>=d>>>0){i=a;break d}e=28;if(z[a+c|0]!=61){i=a;break d}i=a+1|0;if((j|0)==1){l=0;break b}if((d|0)==(i|0)){i=a>>>0>d>>>0?a:d;e=68;break d}if(z[c+i|0]==61){break c}}y[10172]=e;break a}i=a+2|0;l=0;}p=n;}r:{if(g){y[g>>2]=c+i;break r}if((d|0)==(i|0)){break r}y[10172]=28;l=-1;}if(f){y[f>>2]=p;}return l|0}na();s();}function cc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,z=0;d=T-320|0;T=d;e=d+240|0;fa(e,c);ga(e,e,c);fa(a,e);ga(a,a,c);ga(a,a,b);gc(a,a);ga(a,a,e);ga(a,a,b);e=d+192|0;fa(e,a);ga(e,e,c);f=y[b+4>>2];n=y[b+8>>2];p=y[b+12>>2];q=y[b+16>>2];r=y[b+20>>2];s=y[b+24>>2];t=y[b+28>>2];u=y[b+32>>2];v=y[b>>2];c=y[d+192>>2];e=y[d+196>>2];g=y[d+200>>2];h=y[d+204>>2];i=y[d+208>>2];j=y[d+212>>2];k=y[d+216>>2];l=y[d+220>>2];m=y[d+224>>2];o=y[d+228>>2];x=y[b+36>>2];y[d+180>>2]=o-x;y[d+176>>2]=m-u;y[d+172>>2]=l-t;y[d+168>>2]=k-s;y[d+164>>2]=j-r;y[d+160>>2]=i-q;y[d+156>>2]=h-p;y[d+152>>2]=g-n;y[d+148>>2]=e-f;y[d+144>>2]=c-v;y[d+132>>2]=o+x;y[d+128>>2]=m+u;y[d+124>>2]=l+t;y[d+120>>2]=k+s;y[d+116>>2]=j+r;y[d+112>>2]=i+q;y[d+108>>2]=h+p;y[d+104>>2]=g+n;y[d+100>>2]=e+f;y[d+96>>2]=c+v;f=d+48|0;ga(f,b,1632);y[d+84>>2]=o+y[d+84>>2];y[d+80>>2]=m+y[d+80>>2];y[d+76>>2]=l+y[d+76>>2];y[d+72>>2]=k+y[d+72>>2];y[d+68>>2]=j+y[d+68>>2];y[d+64>>2]=i+y[d+64>>2];y[d+60>>2]=h+y[d+60>>2];y[d+56>>2]=g+y[d+56>>2];y[d+52>>2]=e+y[d+52>>2];y[d+48>>2]=c+y[d+48>>2];pa(d,d+144|0);p=ya(d,32);pa(d,d+96|0);n=ya(d,32);pa(d,f);b=ya(d,32);ga(d,a,1632);m=y[a+4>>2];l=y[a+8>>2];k=y[a+12>>2];j=y[a+16>>2];i=y[a+20>>2];h=y[a+24>>2];g=y[a+28>>2];e=y[a+32>>2];f=y[a>>2];q=y[d>>2];r=y[d+4>>2];s=y[d+8>>2];t=y[d+12>>2];u=y[d+16>>2];v=y[d+20>>2];o=y[d+24>>2];x=y[d+28>>2];z=y[d+32>>2];b=0-(b|n)|0;c=y[a+36>>2];c=b&(c^y[d+36>>2])^c;y[a+36>>2]=c;e=e^b&(e^z);y[a+32>>2]=e;g=g^b&(g^x);y[a+28>>2]=g;h=h^b&(h^o);y[a+24>>2]=h;i=i^b&(i^v);y[a+20>>2]=i;j=j^b&(j^u);y[a+16>>2]=j;k=k^b&(k^t);y[a+12>>2]=k;l=l^b&(l^s);y[a+8>>2]=l;m=m^b&(m^r);y[a+4>>2]=m;f=f^b&(f^q);y[a>>2]=f;pa(d+288|0,a);b=0-(w[d+288|0]&1)|0;y[a+36>>2]=c^b&(c^0-c);y[a+32>>2]=e^b&(e^0-e);y[a+28>>2]=g^b&(g^0-g);y[a+24>>2]=h^b&(h^0-h);y[a+20>>2]=i^b&(i^0-i);y[a+16>>2]=j^b&(j^0-j);y[a+12>>2]=k^b&(k^0-k);y[a+8>>2]=l^b&(l^0-l);y[a+4>>2]=m^b&(m^0-m);y[a>>2]=f^b&(f^0-f);T=d+320|0;return n|p}function ab(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0,C=0;c=T-320|0;T=c;A=a+40|0;cb(A,b);y[a+84>>2]=0;y[a+88>>2]=0;y[a+80>>2]=1;y[a+92>>2]=0;y[a+96>>2]=0;y[a+100>>2]=0;y[a+104>>2]=0;y[a+108>>2]=0;y[a+112>>2]=0;y[a+116>>2]=0;d=c+240|0;fa(d,A);e=c+192|0;ga(e,d,1584);y[c+192>>2]=y[c+192>>2]+1;f=y[c+240>>2]-1|0;y[c+240>>2]=f;g=y[c+244>>2];h=y[c+248>>2];i=y[c+252>>2];j=y[c+256>>2];k=y[c+260>>2];l=y[c+264>>2];m=y[c+268>>2];n=y[c+272>>2];o=y[c+276>>2];ga(a,d,e);gc(a,a);ga(a,d,a);d=c+144|0;fa(d,a);ga(d,d,e);d=y[c+180>>2];y[c+132>>2]=d-o;e=y[c+176>>2];y[c+128>>2]=e-n;p=y[c+172>>2];y[c+124>>2]=p-m;q=y[c+168>>2];y[c+120>>2]=q-l;r=y[c+164>>2];y[c+116>>2]=r-k;s=y[c+160>>2];y[c+112>>2]=s-j;t=y[c+156>>2];y[c+108>>2]=t-i;u=y[c+152>>2];y[c+104>>2]=u-h;v=y[c+148>>2];y[c+100>>2]=v-g;x=y[c+144>>2];y[c+96>>2]=x-f;y[c+84>>2]=d+o;y[c+80>>2]=e+n;y[c+76>>2]=m+p;y[c+72>>2]=l+q;y[c+68>>2]=k+r;y[c+64>>2]=j+s;y[c+60>>2]=i+t;y[c+56>>2]=h+u;y[c+52>>2]=g+v;y[c+48>>2]=f+x;pa(c,c+96|0);n=ya(c,32);pa(c,c+48|0);p=ya(c,32);ga(c,a,1632);m=y[a+4>>2];l=y[a+8>>2];k=y[a+12>>2];j=y[a+16>>2];i=y[a+20>>2];h=y[a+24>>2];g=y[a+28>>2];f=y[a+32>>2];o=y[a>>2];q=y[c>>2];r=y[c+4>>2];s=y[c+8>>2];t=y[c+12>>2];u=y[c+16>>2];v=y[c+20>>2];x=y[c+24>>2];B=y[c+28>>2];C=y[c+32>>2];d=n-1|0;e=y[a+36>>2];e=d&(e^y[c+36>>2])^e;y[a+36>>2]=e;f=f^d&(f^C);y[a+32>>2]=f;g=g^d&(g^B);y[a+28>>2]=g;h=h^d&(h^x);y[a+24>>2]=h;i=i^d&(i^v);y[a+20>>2]=i;j=j^d&(j^u);y[a+16>>2]=j;k=k^d&(k^t);y[a+12>>2]=k;l=l^d&(l^s);y[a+8>>2]=l;m=m^d&(m^r);y[a+4>>2]=m;d=o^d&(o^q);y[a>>2]=d;pa(c+288|0,a);b=0-(w[c+288|0]&1^z[b+31|0]>>>7^z[41218]>>>2)|0;y[a+36>>2]=e^b&(e^0-e);y[a+32>>2]=f^b&(f^0-f);y[a+28>>2]=g^b&(g^0-g);y[a+24>>2]=h^b&(h^0-h);y[a+20>>2]=i^b&(i^0-i);y[a+16>>2]=j^b&(j^0-j);y[a+12>>2]=k^b&(k^0-k);y[a+8>>2]=l^b&(l^0-l);y[a+4>>2]=m^b&(m^0-m);y[a>>2]=d^b&(d^0-d);ga(a+120|0,a,A);T=c+320|0;return (n|p)-1|0}function xa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;c=T-48|0;T=c;fa(a,b);fa(a+80|0,b+40|0);Oc(a+120|0,b+80|0);i=y[b+40>>2];e=y[b+44>>2];d=y[b+4>>2];f=y[b+48>>2];j=y[b+8>>2];g=y[b+52>>2];k=y[b+12>>2];h=y[b+56>>2];p=y[b+16>>2];l=y[b+60>>2];q=y[b+20>>2];m=y[b- -64>>2];r=y[b+24>>2];n=y[b+68>>2];s=y[b+28>>2];o=y[b+72>>2];t=y[b+32>>2];v=y[b>>2];y[a+76>>2]=y[b+76>>2]+y[b+36>>2];y[a+72>>2]=o+t;y[a+68>>2]=n+s;w=a- -64|0;y[w>>2]=m+r;y[a+60>>2]=l+q;y[a+56>>2]=h+p;y[a+52>>2]=g+k;y[a+48>>2]=f+j;y[a+44>>2]=e+d;b=a+40|0;y[b>>2]=i+v;fa(c,b);i=y[a+80>>2];e=y[a+4>>2];d=y[a+84>>2];f=y[a+8>>2];j=y[a+88>>2];g=y[a+12>>2];k=y[a+92>>2];h=y[a+16>>2];p=y[a+96>>2];l=y[a+20>>2];q=y[a+100>>2];m=y[a+24>>2];r=y[a+104>>2];n=y[a+28>>2];s=y[a+108>>2];o=y[a+32>>2];t=y[a+112>>2];v=y[a>>2];u=y[a+116>>2];x=y[a+36>>2];z=u-x|0;y[a+116>>2]=z;A=t-o|0;y[a+112>>2]=A;B=s-n|0;y[a+108>>2]=B;C=r-m|0;y[a+104>>2]=C;D=q-l|0;y[a+100>>2]=D;E=p-h|0;y[a+96>>2]=E;F=k-g|0;y[a+92>>2]=F;G=j-f|0;y[a+88>>2]=G;H=d-e|0;y[a+84>>2]=H;I=i-v|0;y[a+80>>2]=I;u=u+x|0;y[a+76>>2]=u;o=o+t|0;y[a+72>>2]=o;n=n+s|0;y[a+68>>2]=n;m=m+r|0;y[w>>2]=m;l=l+q|0;y[a+60>>2]=l;h=h+p|0;y[a+56>>2]=h;g=g+k|0;y[a+52>>2]=g;f=f+j|0;y[a+48>>2]=f;e=e+d|0;y[a+44>>2]=e;d=b;b=i+v|0;y[d>>2]=b;i=y[c>>2];d=y[c+4>>2];j=y[c+8>>2];k=y[c+12>>2];p=y[c+16>>2];q=y[c+20>>2];r=y[c+24>>2];s=y[c+28>>2];t=y[c+32>>2];y[a+36>>2]=y[c+36>>2]-u;y[a+32>>2]=t-o;y[a+28>>2]=s-n;y[a+24>>2]=r-m;y[a+20>>2]=q-l;y[a+16>>2]=p-h;y[a+12>>2]=k-g;y[a+8>>2]=j-f;y[a+4>>2]=d-e;y[a>>2]=i-b;b=y[a+120>>2];i=y[a+124>>2];e=y[a+128>>2];d=y[a+132>>2];f=y[a+136>>2];j=y[a+140>>2];g=y[a+144>>2];k=y[a+148>>2];h=y[a+152>>2];y[a+156>>2]=y[a+156>>2]-z;y[a+152>>2]=h-A;y[a+148>>2]=k-B;y[a+144>>2]=g-C;y[a+140>>2]=j-D;y[a+136>>2]=f-E;y[a+132>>2]=d-F;y[a+128>>2]=e-G;y[a+124>>2]=i-H;y[a+120>>2]=b-I;T=c+48|0;}function La(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=T-288|0;T=o;a:{if(!(c|d)){break a}h=y[a+36>>2];f=h;e=(d<<3|c>>>29)+f|0;g=y[a+32>>2];j=c<<3;i=g+j|0;y[a+32>>2]=i;y[a+36>>2]=j>>>0>i>>>0?e+1|0:e;h=a+40|0;k=((f&7)<<29|g>>>3)&63;g=k;j=64-g|0;e=0;r=0-(e+(g>>>0>64)|0)|0;g=r;if((d|0)==(g|0)&c>>>0>=j>>>0|d>>>0>g>>>0){s=j&3;f=0;g=0;b:{if(!e&(k^63)>>>0>=3|e){t=j&124;while(1){e=f+k|0;w[e+h|0]=z[b+f|0];i=f|1;e=k+i|0;w[e+h|0]=z[b+i|0];i=f|2;e=k+i|0;w[e+h|0]=z[b+i|0];i=f|3;e=k+i|0;w[e+h|0]=z[b+i|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((m|0)!=(t|0)|(q|0)!=(e|0)){continue}break}if(!(s|q)){break b}}while(1){e=f+k|0;w[e+h|0]=z[b+f|0];e=g;f=f+1|0;g=f?e:e+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((l|0)!=(s|0)|(q|0)!=(e|0)){continue}break}}n=o+256|0;Tb(a,h,o,n);b=b+j|0;d=d-((c>>>0>>0)+r|0)|0;c=c-j|0;if(!d&c>>>0>63|d){while(1){Tb(a,b,o,n);b=b- -64|0;g=d-1|0;c=c+-64|0;d=c>>>0<4294967232?g+1|0:g;if(!d&c>>>0>63|d){continue}break}}c:{if(!(c|d)){break c}i=c&3;j=0;l=0;n=0;f=0;g=0;if(!d&c>>>0>=4|d){m=c&60;p=0;c=0;d=0;while(1){w[f+h|0]=z[b+f|0];a=f|1;w[a+h|0]=z[a+b|0];a=f|2;w[a+h|0]=z[a+b|0];a=f|3;w[a+h|0]=z[a+b|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;e=d;c=c+4|0;e=c>>>0<4?e+1|0:e;d=e;if((c|0)!=(m|0)|(p|0)!=(e|0)){continue}break}if(!(j|i)){break c}}while(1){w[f+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((i|0)!=(l|0)|(j|0)!=(e|0)){continue}break}}ja(o,288);break a}q=c&3;i=0;f=0;g=0;if(!d&c>>>0>=4|d){j=c&-4;while(1){a=f+k|0;w[a+h|0]=z[b+f|0];c=f|1;a=k+c|0;w[a+h|0]=z[b+c|0];c=f|2;a=k+c|0;w[a+h|0]=z[b+c|0];c=f|3;a=k+c|0;w[a+h|0]=z[b+c|0];f=f+4|0;g=f>>>0<4?g+1|0:g;e=p;m=m+4|0;e=m>>>0<4?e+1|0:e;p=e;if((j|0)!=(m|0)|(d|0)!=(e|0)){continue}break}if(!(i|q)){break a}}while(1){a=f+k|0;w[a+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=n;l=l+1|0;e=l?e:e+1|0;n=e;if((l|0)!=(q|0)|(i|0)!=(e|0)){continue}break}}T=o+288|0;return 0}function Mc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-160|0;T=d;e=z[41218];y[a+4>>2]=0;y[a+8>>2]=0;y[a>>2]=1;y[a+12>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+44>>2]=0;y[a+48>>2]=0;y[a+36>>2]=0;y[a+40>>2]=1;y[a+52>>2]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+64>>2]=0;y[a+68>>2]=0;y[a+72>>2]=0;y[a+76>>2]=0;y[a+80>>2]=1;o(a+84|0,0,76);e=e>>>2^(c&128)>>>7;c=c-((0-e&c)<<1)|0;Ra(a,b,z[41218]>>>2^((c^1)&255)-1>>>31);Ra(a,b+160|0,z[41218]>>>2^((c^2)&255)-1>>>31);Ra(a,b+320|0,z[41218]>>>2^((c^3)&255)-1>>>31);Ra(a,b+480|0,z[41218]>>>2^((c^4)&255)-1>>>31);Ra(a,b+640|0,z[41218]>>>2^((c^5)&255)-1>>>31);Ra(a,b+800|0,z[41218]>>>2^((c^6)&255)-1>>>31);Ra(a,b+960|0,z[41218]>>>2^((c^7)&255)-1>>>31);Ra(a,b+1120|0,z[41218]>>>2^((c^8)&255)-1>>>31);b=y[a+76>>2];y[d+32>>2]=y[a+72>>2];y[d+36>>2]=b;b=a- -64|0;c=y[b+4>>2];y[d+24>>2]=y[b>>2];y[d+28>>2]=c;b=y[a+60>>2];y[d+16>>2]=y[a+56>>2];y[d+20>>2]=b;b=y[a+52>>2];y[d+8>>2]=y[a+48>>2];y[d+12>>2]=b;b=y[a+44>>2];y[d>>2]=y[a+40>>2];y[d+4>>2]=b;b=y[a+36>>2];y[d+72>>2]=y[a+32>>2];y[d+76>>2]=b;b=y[a+28>>2];y[d+64>>2]=y[a+24>>2];y[d+68>>2]=b;b=y[a+20>>2];y[d+56>>2]=y[a+16>>2];y[d+60>>2]=b;b=y[a+12>>2];y[d+48>>2]=y[a+8>>2];y[d+52>>2]=b;b=y[a+4>>2];y[d+40>>2]=y[a>>2];y[d+44>>2]=b;b=y[a+92>>2];y[d+88>>2]=y[a+88>>2];y[d+92>>2]=b;b=y[a+84>>2];y[d+80>>2]=y[a+80>>2];y[d+84>>2]=b;b=y[a+100>>2];y[d+96>>2]=y[a+96>>2];y[d+100>>2]=b;b=y[a+108>>2];y[d+104>>2]=y[a+104>>2];y[d+108>>2]=b;b=y[a+116>>2];y[d+112>>2]=y[a+112>>2];y[d+116>>2]=b;b=y[a+120>>2];c=y[a+124>>2];f=y[a+128>>2];g=y[a+132>>2];h=y[a+136>>2];i=y[a+140>>2];j=y[a+144>>2];k=y[a+148>>2];l=y[a+152>>2];y[d+156>>2]=0-y[a+156>>2];y[d+152>>2]=0-l;y[d+148>>2]=0-k;y[d+144>>2]=0-j;y[d+140>>2]=0-i;y[d+136>>2]=0-h;y[d+132>>2]=0-g;y[d+128>>2]=0-f;y[d+124>>2]=0-c;y[d+120>>2]=0-b;Ra(a,d,e);T=d+160|0;}function lc(a,b,c,d,e,f){var g=0;y[f>>2]=8;a:{b:{g=a;a=!b&a>>>0<=32768;g=a?32768:g;c:{d:{a=a?0:b;if(!a&c>>>5>>>0<=g>>>0|a){if(c>>>0>=4096){break d}b=1;break c}y[e>>2]=1;b=(g>>>0)/(y[f>>2]<<2>>>0)|0;a=1;if(b>>>0<4){break a}a=2;if(b>>>0<8){break a}if(b>>>0<16){y[d>>2]=3;return}if(b>>>0<32){y[d>>2]=4;return}if(b>>>0<64){y[d>>2]=5;return}if(b>>>0<128){y[d>>2]=6;return}if(b>>>0<256){y[d>>2]=7;return}if(b>>>0<512){y[d>>2]=8;return}if(b>>>0<1024){y[d>>2]=9;return}if(b>>>0<2048){y[d>>2]=10;return}if(b>>>0<4096){y[d>>2]=11;return}if(b>>>0<8192){y[d>>2]=12;return}if(b>>>0<16384){y[d>>2]=13;return}if(b>>>0<32768){y[d>>2]=14;return}if(b>>>0<65536){y[d>>2]=15;return}if(b>>>0<131072){y[d>>2]=16;return}if(b>>>0<262144){y[d>>2]=17;return}if(b>>>0<524288){y[d>>2]=18;return}if(b>>>0<1048576){y[d>>2]=19;return}if(b>>>0<2097152){y[d>>2]=20;return}if(b>>>0<4194304){y[d>>2]=21;return}if(b>>>0<8388608){y[d>>2]=22;return}if(b>>>0<16777216){y[d>>2]=23;return}if(b>>>0>=33554432){break b}y[d>>2]=24;return}b=2;if(c>>>0<8192){break c}b=3;if(c>>>0<16384){break c}b=4;if(c>>>0<32768){break c}b=5;if(c>>>0<65536){break c}b=6;if(c>>>0<131072){break c}b=7;if(c>>>0<262144){break c}b=8;if(c>>>0<524288){break c}b=9;if(c>>>0<1048576){break c}b=10;if(c>>>0<2097152){break c}b=11;if(c>>>0<4194304){break c}b=12;if(c>>>0<8388608){break c}b=13;if(c>>>0<16777216){break c}b=14;if(c>>>0<33554432){break c}b=15;if(c>>>0<67108864){break c}b=16;if(c>>>0<134217728){break c}b=17;if(c>>>0<268435456){break c}b=18;if(c>>>0<536870912){break c}b=19;if(c>>>0<1073741824){break c}b=(c|0)>=0?20:21;}c=b;y[d>>2]=c;b=a;a=b>>>2|0;b=(b&3)<<30|g>>>2;d=c&31;if((c&63)>>>0>=32){c=0;a=a>>>d|0;}else {c=a>>>d|0;a=((1<>>d;}y[e>>2]=((!c&a>>>0>=1073741823|c?1073741823:a)>>>0)/B[f>>2];return}a=b>>>0<67108864?25:26;}y[d>>2]=a;}function Re(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=T-112|0;T=i;if(c|d){j=z[h+28|0]|z[h+29|0]<<8|(z[h+30|0]<<16|z[h+31|0]<<24);y[i+24>>2]=z[h+24|0]|z[h+25|0]<<8|(z[h+26|0]<<16|z[h+27|0]<<24);y[i+28>>2]=j;j=z[h+20|0]|z[h+21|0]<<8|(z[h+22|0]<<16|z[h+23|0]<<24);y[i+16>>2]=z[h+16|0]|z[h+17|0]<<8|(z[h+18|0]<<16|z[h+19|0]<<24);y[i+20>>2]=j;j=z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24);y[i+8>>2]=z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24);y[i+12>>2]=j;j=z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24);y[i>>2]=z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24);y[i+4>>2]=j;h=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[i+96>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[i+100>>2]=h;w[i+104|0]=f;w[i+111|0]=g>>>24;w[i+110|0]=g>>>16;w[i+109|0]=g>>>8;w[i+108|0]=g;w[i+107|0]=(g&16777215)<<8|f>>>24;w[i+106|0]=(g&65535)<<16|f>>>16;w[i+105|0]=(g&255)<<24|f>>>8;a:{if(!d&c>>>0>=64|d){while(1){h=0;vb(i+32|0,i+96|0,i,0);while(1){f=i+32|0;w[a+h|0]=z[f+h|0]^z[b+h|0];e=h|1;w[e+a|0]=z[e+f|0]^z[b+e|0];h=h+2|0;if((h|0)!=64){continue}break}e=z[i+104|0]+1|0;w[i+104|0]=e;e=z[i+105|0]+(e>>>8|0)|0;w[i+105|0]=e;e=z[i+106|0]+(e>>>8|0)|0;w[i+106|0]=e;e=z[i+107|0]+(e>>>8|0)|0;w[i+107|0]=e;e=z[i+108|0]+(e>>>8|0)|0;w[i+108|0]=e;e=z[i+109|0]+(e>>>8|0)|0;w[i+109|0]=e;e=z[i+110|0]+(e>>>8|0)|0;w[i+110|0]=e;w[i+111|0]=z[i+111|0]+(e>>>8|0);b=b- -64|0;a=a- -64|0;d=d-1|0;c=c+-64|0;d=c>>>0<4294967232?d+1|0:d;if(!d&c>>>0>63|d){continue}break}if(!(c|d)){break a}}h=0;vb(i+32|0,i+96|0,i,0);if((c|0)!=1|d){d=c&1;f=c&62;e=0;while(1){g=i+32|0;w[a+h|0]=z[g+h|0]^z[b+h|0];c=h|1;w[c+a|0]=z[c+g|0]^z[b+c|0];h=h+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}if(!d){break a}}w[a+h|0]=z[(i+32|0)+h|0]^z[b+h|0];}ja(i+32|0,64);ja(i,32);}T=i+112|0;return 0}function Xd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=T-192|0;T=d;za(d,32);rb(b,d,32,0);w[b|0]=z[b|0]&248;w[b+31|0]=z[b+31|0]&63|64;e=d+32|0;jb(e,b);Wa(a,e);f=d;e=y[d+28>>2];d=y[d+24>>2];w[b+24|0]=d;w[b+25|0]=d>>>8;w[b+26|0]=d>>>16;w[b+27|0]=d>>>24;w[b+28|0]=e;w[b+29|0]=e>>>8;w[b+30|0]=e>>>16;w[b+31|0]=e>>>24;e=y[f+20>>2];d=y[f+16>>2];w[b+16|0]=d;w[b+17|0]=d>>>8;w[b+18|0]=d>>>16;w[b+19|0]=d>>>24;w[b+20|0]=e;w[b+21|0]=e>>>8;w[b+22|0]=e>>>16;w[b+23|0]=e>>>24;e=y[f+12>>2];d=y[f+8>>2];w[b+8|0]=d;w[b+9|0]=d>>>8;w[b+10|0]=d>>>16;w[b+11|0]=d>>>24;w[b+12|0]=e;w[b+13|0]=e>>>8;w[b+14|0]=e>>>16;w[b+15|0]=e>>>24;e=y[f+4>>2];d=y[f>>2];w[b|0]=d;w[b+1|0]=d>>>8;w[b+2|0]=d>>>16;w[b+3|0]=d>>>24;w[b+4|0]=e;w[b+5|0]=e>>>8;w[b+6|0]=e>>>16;w[b+7|0]=e>>>24;c=a;g=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);h=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);i=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);e=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);d=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);a=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);j=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);c=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);w[b+56|0]=c;w[b+57|0]=c>>>8;w[b+58|0]=c>>>16;w[b+59|0]=c>>>24;w[b+60|0]=j;w[b+61|0]=j>>>8;w[b+62|0]=j>>>16;w[b+63|0]=j>>>24;w[b+48|0]=d;w[b+49|0]=d>>>8;w[b+50|0]=d>>>16;w[b+51|0]=d>>>24;w[b+52|0]=a;w[b+53|0]=a>>>8;w[b+54|0]=a>>>16;w[b+55|0]=a>>>24;w[b+40|0]=i;w[b+41|0]=i>>>8;w[b+42|0]=i>>>16;w[b+43|0]=i>>>24;w[b+44|0]=e;w[b+45|0]=e>>>8;w[b+46|0]=e>>>16;w[b+47|0]=e>>>24;w[b+32|0]=g;w[b+33|0]=g>>>8;w[b+34|0]=g>>>16;w[b+35|0]=g>>>24;w[b+36|0]=h;w[b+37|0]=h>>>8;w[b+38|0]=h>>>16;w[b+39|0]=h>>>24;ja(f,32);T=f+192|0;return 0}function te(a,b){a=a|0;b=b|0;var c=0,d=0;d=T+-64|0;T=d;c=z[b+60|0]|z[b+61|0]<<8|(z[b+62|0]<<16|z[b+63|0]<<24);y[d+56>>2]=z[b+56|0]|z[b+57|0]<<8|(z[b+58|0]<<16|z[b+59|0]<<24);y[d+60>>2]=c;c=z[b+52|0]|z[b+53|0]<<8|(z[b+54|0]<<16|z[b+55|0]<<24);y[d+48>>2]=z[b+48|0]|z[b+49|0]<<8|(z[b+50|0]<<16|z[b+51|0]<<24);y[d+52>>2]=c;c=z[b+44|0]|z[b+45|0]<<8|(z[b+46|0]<<16|z[b+47|0]<<24);y[d+40>>2]=z[b+40|0]|z[b+41|0]<<8|(z[b+42|0]<<16|z[b+43|0]<<24);y[d+44>>2]=c;c=z[b+36|0]|z[b+37|0]<<8|(z[b+38|0]<<16|z[b+39|0]<<24);y[d+32>>2]=z[b+32|0]|z[b+33|0]<<8|(z[b+34|0]<<16|z[b+35|0]<<24);y[d+36>>2]=c;c=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[d+24>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[d+28>>2]=c;c=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[d+16>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[d+20>>2]=c;c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[d+8>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[d+12>>2]=c;c=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[d>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[d+4>>2]=c;Pa(d);b=y[d+28>>2];c=y[d+24>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[d+20>>2];c=y[d+16>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[d+12>>2];c=y[d+8>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[d+4>>2];c=y[d>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;ja(d,64);T=d- -64|0;}function Xa(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-96|0;T=d;if(c>>>0>=65){Ub(a);La(a,b,c,0);Ua(a,d);c=32;b=d;}Ub(a);y[d+88>>2]=909522486;y[d+92>>2]=909522486;y[d+80>>2]=909522486;y[d+84>>2]=909522486;y[d+72>>2]=909522486;y[d+76>>2]=909522486;y[d+64>>2]=909522486;y[d+68>>2]=909522486;y[d+56>>2]=909522486;y[d+60>>2]=909522486;y[d+48>>2]=909522486;y[d+52>>2]=909522486;y[d+40>>2]=909522486;y[d+44>>2]=909522486;y[d+32>>2]=909522486;y[d+36>>2]=909522486;a:{if(!c){break a}k=c&3;if(c>>>0>=4){g=c&124;while(1){h=d+32|0;f=h+e|0;w[f|0]=z[f|0]^z[b+e|0];f=e|1;l=f+h|0;w[l|0]=z[l|0]^z[b+f|0];f=e|2;l=f+h|0;w[l|0]=z[l|0]^z[b+f|0];f=h;h=e|3;f=f+h|0;w[f|0]=z[f|0]^z[b+h|0];e=e+4|0;i=i+4|0;if((g|0)!=(i|0)){continue}break}if(!k){break a}}while(1){i=(d+32|0)+e|0;w[i|0]=z[i|0]^z[b+e|0];e=e+1|0;j=j+1|0;if((k|0)!=(j|0)){continue}break}}La(a,d+32|0,64,0);k=a+104|0;Ub(k);y[d+88>>2]=1549556828;y[d+92>>2]=1549556828;y[d+80>>2]=1549556828;y[d+84>>2]=1549556828;y[d+72>>2]=1549556828;y[d+76>>2]=1549556828;y[d+64>>2]=1549556828;y[d+68>>2]=1549556828;y[d+56>>2]=1549556828;y[d+60>>2]=1549556828;y[d+48>>2]=1549556828;y[d+52>>2]=1549556828;y[d+40>>2]=1549556828;y[d+44>>2]=1549556828;y[d+32>>2]=1549556828;y[d+36>>2]=1549556828;b:{if(!c){break b}h=c&3;j=0;e=0;if(c>>>0>=4){c=c&124;i=0;while(1){a=d+32|0;g=a+e|0;w[g|0]=z[g|0]^z[b+e|0];g=e|1;f=g+a|0;w[f|0]=z[f|0]^z[b+g|0];g=e|2;f=g+a|0;w[f|0]=z[f|0]^z[b+g|0];f=a;a=e|3;g=f+a|0;w[g|0]=z[g|0]^z[a+b|0];e=e+4|0;i=i+4|0;if((c|0)!=(i|0)){continue}break}if(!h){break b}}while(1){a=(d+32|0)+e|0;w[a|0]=z[a|0]^z[b+e|0];e=e+1|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}a=d+32|0;La(k,a,64,0);ja(a,64);ja(d,32);T=d+96|0;return 0}function Wb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(b-65>>>0<4294967232|g>>>0>64){a=-1;}else {h=T;m=h;h=h-512&-64;T=h;a:{b:{if(!(!(d|e)|c)|(!a|(b-65&255)>>>0<=191)|(!(g?f:1)|g>>>0>=65)){break b}c:{if(g){if(!f){break b}o(h- -64|0,0,293);y[h+56>>2]=327033209;y[h+60>>2]=1541459225;y[h+48>>2]=-79577749;y[h+52>>2]=528734635;y[h+40>>2]=725511199;y[h+44>>2]=-1694144372;y[h+32>>2]=-1377402159;y[h+36>>2]=1359893119;y[h+24>>2]=1595750129;y[h+28>>2]=-1521486534;y[h+16>>2]=-23791573;y[h+20>>2]=1013904242;y[h+8>>2]=-2067093701;y[h+12>>2]=-1150833019;y[h>>2]=(g<<8|b)^-222443256;y[h+4>>2]=g>>>24^1779033703;j=128;i=128-g|0;if(i){o((h+384|0)+g|0,0,i);}if(g){t(h+384|0,f,g);}f=h+384|0;t(h+96|0,f,128);y[h+352>>2]=128;ja(f,128);break c}o(h- -64|0,0,293);y[h+56>>2]=327033209;y[h+60>>2]=1541459225;y[h+48>>2]=-79577749;y[h+52>>2]=528734635;y[h+40>>2]=725511199;y[h+44>>2]=-1694144372;y[h+32>>2]=-1377402159;y[h+36>>2]=1359893119;y[h+24>>2]=1595750129;y[h+28>>2]=-1521486534;y[h+16>>2]=-23791573;y[h+20>>2]=1013904242;y[h+8>>2]=-2067093701;y[h+12>>2]=-1150833019;y[h>>2]=b^-222443256;y[h+4>>2]=1779033703;}if(d|e){l=h+96|0;f=256-j|0;if(!e&d>>>0>f>>>0|e){n=h+224|0;while(1){if(f){t(j+l|0,c,f);}y[h+352>>2]=y[h+352>>2]+f;g=y[h+68>>2];j=g;i=y[h+64>>2];k=i+128|0;g=k>>>0<128?g+1|0:g;y[h+64>>2]=k;y[h+68>>2]=g;g=y[h+76>>2];i=(j|0)==-1&i>>>0>4294967167;j=i;i=i+y[h+72>>2]|0;g=j>>>0>i>>>0?g+1|0:g;y[h+72>>2]=i;y[h+76>>2]=g;Eb(h,l);t(l,n,128);k=y[h+352>>2];j=k-128|0;y[h+352>>2]=j;c=c+f|0;g=f;i=d-g|0;e=e-(d>>>0>>0)|0;f=384-k|0;d=i;if(!e&f>>>0>>0|e){continue}break}}if(d){t(j+l|0,c,d);}y[h+352>>2]=d+y[h+352>>2];}Cc(h,a,b);T=m;break a}na();s();}a=0;}return a}function _e(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T-112|0;T=g;h=c;if(d|c){c=z[f+28|0]|z[f+29|0]<<8|(z[f+30|0]<<16|z[f+31|0]<<24);y[g+24>>2]=z[f+24|0]|z[f+25|0]<<8|(z[f+26|0]<<16|z[f+27|0]<<24);y[g+28>>2]=c;c=z[f+20|0]|z[f+21|0]<<8|(z[f+22|0]<<16|z[f+23|0]<<24);y[g+16>>2]=z[f+16|0]|z[f+17|0]<<8|(z[f+18|0]<<16|z[f+19|0]<<24);y[g+20>>2]=c;c=z[f+12|0]|z[f+13|0]<<8|(z[f+14|0]<<16|z[f+15|0]<<24);y[g+8>>2]=z[f+8|0]|z[f+9|0]<<8|(z[f+10|0]<<16|z[f+11|0]<<24);y[g+12>>2]=c;c=z[f+4|0]|z[f+5|0]<<8|(z[f+6|0]<<16|z[f+7|0]<<24);y[g>>2]=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);y[g+4>>2]=c;c=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[g+104>>2]=0;y[g+108>>2]=0;y[g+96>>2]=c;y[g+100>>2]=e;a:{if(!d&h>>>0>=64|d){while(1){c=0;ub(g+32|0,g+96|0,g,0);while(1){f=g+32|0;w[a+c|0]=z[f+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+f|0]^z[b+e|0];c=c+2|0;if((c|0)!=64){continue}break}c=z[g+104|0]+1|0;w[g+104|0]=c;c=z[g+105|0]+(c>>>8|0)|0;w[g+105|0]=c;c=z[g+106|0]+(c>>>8|0)|0;w[g+106|0]=c;c=z[g+107|0]+(c>>>8|0)|0;w[g+107|0]=c;c=z[g+108|0]+(c>>>8|0)|0;w[g+108|0]=c;c=z[g+109|0]+(c>>>8|0)|0;w[g+109|0]=c;c=z[g+110|0]+(c>>>8|0)|0;w[g+110|0]=c;w[g+111|0]=z[g+111|0]+(c>>>8|0);b=b- -64|0;a=a- -64|0;d=d-1|0;h=h+-64|0;d=h>>>0<4294967232?d+1|0:d;if(!d&h>>>0>63|d){continue}break}if(!(d|h)){break a}}c=0;ub(g+32|0,g+96|0,g,0);if((h|0)!=1|d){f=h&1;h=h&62;d=0;while(1){i=g+32|0;w[a+c|0]=z[i+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+i|0]^z[b+e|0];c=c+2|0;d=d+2|0;if((h|0)!=(d|0)){continue}break}if(!f){break a}}w[a+c|0]=z[(g+32|0)+c|0]^z[b+c|0];}ja(g+32|0,64);ja(g,32);}T=g+112|0;return 0}function Ye(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T-112|0;T=g;h=c;if(d|c){c=z[f+28|0]|z[f+29|0]<<8|(z[f+30|0]<<16|z[f+31|0]<<24);y[g+24>>2]=z[f+24|0]|z[f+25|0]<<8|(z[f+26|0]<<16|z[f+27|0]<<24);y[g+28>>2]=c;c=z[f+20|0]|z[f+21|0]<<8|(z[f+22|0]<<16|z[f+23|0]<<24);y[g+16>>2]=z[f+16|0]|z[f+17|0]<<8|(z[f+18|0]<<16|z[f+19|0]<<24);y[g+20>>2]=c;c=z[f+12|0]|z[f+13|0]<<8|(z[f+14|0]<<16|z[f+15|0]<<24);y[g+8>>2]=z[f+8|0]|z[f+9|0]<<8|(z[f+10|0]<<16|z[f+11|0]<<24);y[g+12>>2]=c;c=z[f+4|0]|z[f+5|0]<<8|(z[f+6|0]<<16|z[f+7|0]<<24);y[g>>2]=z[f|0]|z[f+1|0]<<8|(z[f+2|0]<<16|z[f+3|0]<<24);y[g+4>>2]=c;c=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[g+104>>2]=0;y[g+108>>2]=0;y[g+96>>2]=c;y[g+100>>2]=e;a:{if(!d&h>>>0>=64|d){while(1){c=0;tb(g+32|0,g+96|0,g,0);while(1){f=g+32|0;w[a+c|0]=z[f+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+f|0]^z[b+e|0];c=c+2|0;if((c|0)!=64){continue}break}c=z[g+104|0]+1|0;w[g+104|0]=c;c=z[g+105|0]+(c>>>8|0)|0;w[g+105|0]=c;c=z[g+106|0]+(c>>>8|0)|0;w[g+106|0]=c;c=z[g+107|0]+(c>>>8|0)|0;w[g+107|0]=c;c=z[g+108|0]+(c>>>8|0)|0;w[g+108|0]=c;c=z[g+109|0]+(c>>>8|0)|0;w[g+109|0]=c;c=z[g+110|0]+(c>>>8|0)|0;w[g+110|0]=c;w[g+111|0]=z[g+111|0]+(c>>>8|0);b=b- -64|0;a=a- -64|0;d=d-1|0;h=h+-64|0;d=h>>>0<4294967232?d+1|0:d;if(!d&h>>>0>63|d){continue}break}if(!(d|h)){break a}}c=0;tb(g+32|0,g+96|0,g,0);if((h|0)!=1|d){f=h&1;h=h&62;d=0;while(1){i=g+32|0;w[a+c|0]=z[i+c|0]^z[b+c|0];e=c|1;w[e+a|0]=z[e+i|0]^z[b+e|0];c=c+2|0;d=d+2|0;if((h|0)!=(d|0)){continue}break}if(!f){break a}}w[a+c|0]=z[(g+32|0)+c|0]^z[b+c|0];}ja(g+32|0,64);ja(g,32);}T=g+112|0;return 0}function ve(a,b){a=a|0;b=b|0;var c=0,d=0;c=T-128|0;T=c;y[c+64>>2]=0;y[c+68>>2]=0;y[c+72>>2]=0;y[c+76>>2]=0;y[c+80>>2]=0;y[c+84>>2]=0;y[c+88>>2]=0;y[c+92>>2]=0;w[c+64|0]=1;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;y[c+56>>2]=0;y[c+60>>2]=0;d=y[9821];y[c+96>>2]=y[9820];y[c+100>>2]=d;d=y[9823];y[c+104>>2]=y[9822];y[c+108>>2]=d;d=y[9825];y[c+112>>2]=y[9824];y[c+116>>2]=d;d=y[9827];y[c+120>>2]=y[9826];y[c+124>>2]=d;d=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[c+24>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[c+28>>2]=d;d=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[c+16>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[c+20>>2]=d;d=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[c+8>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[c+12>>2]=d;d=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[c>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[c+4>>2]=d;b=c- -64|0;Ec(b,c);Pa(b);d=y[c+92>>2];b=y[c+88>>2];w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;w[a+28|0]=d;w[a+29|0]=d>>>8;w[a+30|0]=d>>>16;w[a+31|0]=d>>>24;d=y[c+84>>2];b=y[c+80>>2];w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+20|0]=d;w[a+21|0]=d>>>8;w[a+22|0]=d>>>16;w[a+23|0]=d>>>24;d=y[c+76>>2];b=y[c+72>>2];w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;w[a+12|0]=d;w[a+13|0]=d>>>8;w[a+14|0]=d>>>16;w[a+15|0]=d>>>24;d=y[c+68>>2];b=y[c+64>>2];w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;T=c+128|0;} +function Ze(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-112|0;T=f;h=b;g=c;if(b|g){b=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+24>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);y[f+28>>2]=b;b=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+16>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+20>>2]=b;b=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+8>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+12>>2]=b;b=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+4>>2]=b;b=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);c=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+104>>2]=0;y[f+108>>2]=0;y[f+96>>2]=b;y[f+100>>2]=c;a:{if(!g&h>>>0>=64|g){while(1){tb(a,f+96|0,f,0);b=z[f+104|0]+1|0;w[f+104|0]=b;b=z[f+105|0]+(b>>>8|0)|0;w[f+105|0]=b;b=z[f+106|0]+(b>>>8|0)|0;w[f+106|0]=b;b=z[f+107|0]+(b>>>8|0)|0;w[f+107|0]=b;b=z[f+108|0]+(b>>>8|0)|0;w[f+108|0]=b;b=z[f+109|0]+(b>>>8|0)|0;w[f+109|0]=b;b=z[f+110|0]+(b>>>8|0)|0;w[f+110|0]=b;w[f+111|0]=z[f+111|0]+(b>>>8|0);a=a- -64|0;g=g-1|0;h=h+-64|0;g=h>>>0<4294967232?g+1|0:g;if(!g&h>>>0>63|g){continue}break}if(!(g|h)){break a}}c=0;tb(f+32|0,f+96|0,f,0);d=h&3;b=0;if(!g&h>>>0>=4|g){h=h&60;e=0;while(1){g=f+32|0;w[a+b|0]=z[g+b|0];i=b|1;w[i+a|0]=z[g+i|0];i=b|2;w[i+a|0]=z[g+i|0];i=b|3;w[i+a|0]=z[g+i|0];b=b+4|0;e=e+4|0;if((h|0)!=(e|0)){continue}break}if(!d){break a}}while(1){w[a+b|0]=z[(f+32|0)+b|0];b=b+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}ja(f+32|0,64);ja(f,32);}T=f+112|0;return 0}function Se(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=T-112|0;T=f;if(b|c){g=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+24>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);y[f+28>>2]=g;g=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+16>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+20>>2]=g;g=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+8>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+12>>2]=g;g=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+4>>2]=g;e=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);d=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+104>>2]=0;y[f+108>>2]=0;y[f+96>>2]=e;y[f+100>>2]=d;a:{if(!c&b>>>0>=64|c){while(1){vb(a,f+96|0,f,0);d=z[f+104|0]+1|0;w[f+104|0]=d;d=z[f+105|0]+(d>>>8|0)|0;w[f+105|0]=d;d=z[f+106|0]+(d>>>8|0)|0;w[f+106|0]=d;d=z[f+107|0]+(d>>>8|0)|0;w[f+107|0]=d;d=z[f+108|0]+(d>>>8|0)|0;w[f+108|0]=d;d=z[f+109|0]+(d>>>8|0)|0;w[f+109|0]=d;d=z[f+110|0]+(d>>>8|0)|0;w[f+110|0]=d;w[f+111|0]=z[f+111|0]+(d>>>8|0);a=a- -64|0;c=c-1|0;b=b+-64|0;c=b>>>0<4294967232?c+1|0:c;if(!c&b>>>0>63|c){continue}break}if(!(b|c)){break a}}d=0;vb(f+32|0,f+96|0,f,0);g=b&3;e=0;if(!c&b>>>0>=4|c){c=b&60;b=0;while(1){j=f+32|0;h=j;w[a+e|0]=z[h+e|0];i=e|1;w[i+a|0]=z[h+i|0];i=e|2;w[i+a|0]=z[h+i|0];h=e|3;w[h+a|0]=z[h+j|0];e=e+4|0;b=b+4|0;if((c|0)!=(b|0)){continue}break}if(!g){break a}}while(1){w[a+e|0]=z[(f+32|0)+e|0];e=e+1|0;d=d+1|0;if((g|0)!=(d|0)){continue}break}}ja(f+32|0,64);ja(f,32);}T=f+112|0;return 0}function $e(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-112|0;T=f;h=b;g=c;if(b|g){b=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+24>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);y[f+28>>2]=b;b=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+16>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+20>>2]=b;b=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+8>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+12>>2]=b;b=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+4>>2]=b;b=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);c=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+104>>2]=0;y[f+108>>2]=0;y[f+96>>2]=b;y[f+100>>2]=c;a:{if(!g&h>>>0>=64|g){while(1){ub(a,f+96|0,f,0);b=z[f+104|0]+1|0;w[f+104|0]=b;b=z[f+105|0]+(b>>>8|0)|0;w[f+105|0]=b;b=z[f+106|0]+(b>>>8|0)|0;w[f+106|0]=b;b=z[f+107|0]+(b>>>8|0)|0;w[f+107|0]=b;b=z[f+108|0]+(b>>>8|0)|0;w[f+108|0]=b;b=z[f+109|0]+(b>>>8|0)|0;w[f+109|0]=b;b=z[f+110|0]+(b>>>8|0)|0;w[f+110|0]=b;w[f+111|0]=z[f+111|0]+(b>>>8|0);a=a- -64|0;g=g-1|0;h=h+-64|0;g=h>>>0<4294967232?g+1|0:g;if(!g&h>>>0>63|g){continue}break}if(!(g|h)){break a}}c=0;ub(f+32|0,f+96|0,f,0);d=h&3;b=0;if(!g&h>>>0>=4|g){h=h&60;e=0;while(1){g=f+32|0;w[a+b|0]=z[g+b|0];i=b|1;w[i+a|0]=z[g+i|0];i=b|2;w[i+a|0]=z[g+i|0];i=b|3;w[i+a|0]=z[g+i|0];b=b+4|0;e=e+4|0;if((h|0)!=(e|0)){continue}break}if(!d){break a}}while(1){w[a+b|0]=z[(f+32|0)+b|0];b=b+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}ja(f+32|0,64);ja(f,32);}T=f+112|0;return 0}function we(a,b){a=a|0;b=b|0;var c=0,d=0;c=T-128|0;T=c;y[c+64>>2]=0;y[c+68>>2]=0;y[c+72>>2]=0;y[c+76>>2]=0;y[c+80>>2]=0;y[c+84>>2]=0;y[c+88>>2]=0;y[c+92>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+48>>2]=0;y[c+52>>2]=0;y[c+56>>2]=0;y[c+60>>2]=0;d=y[9821];y[c+96>>2]=y[9820];y[c+100>>2]=d;d=y[9823];y[c+104>>2]=y[9822];y[c+108>>2]=d;d=y[9825];y[c+112>>2]=y[9824];y[c+116>>2]=d;d=y[9827];y[c+120>>2]=y[9826];y[c+124>>2]=d;d=z[b+4|0]|z[b+5|0]<<8|(z[b+6|0]<<16|z[b+7|0]<<24);y[c>>2]=z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24);y[c+4>>2]=d;d=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[c+8>>2]=z[b+8|0]|z[b+9|0]<<8|(z[b+10|0]<<16|z[b+11|0]<<24);y[c+12>>2]=d;d=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[c+16>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[c+20>>2]=d;d=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);y[c+24>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);y[c+28>>2]=d;b=c- -64|0;Ec(b,c);Pa(b);d=y[c+92>>2];b=y[c+88>>2];w[a+24|0]=b;w[a+25|0]=b>>>8;w[a+26|0]=b>>>16;w[a+27|0]=b>>>24;w[a+28|0]=d;w[a+29|0]=d>>>8;w[a+30|0]=d>>>16;w[a+31|0]=d>>>24;d=y[c+84>>2];b=y[c+80>>2];w[a+16|0]=b;w[a+17|0]=b>>>8;w[a+18|0]=b>>>16;w[a+19|0]=b>>>24;w[a+20|0]=d;w[a+21|0]=d>>>8;w[a+22|0]=d>>>16;w[a+23|0]=d>>>24;d=y[c+76>>2];b=y[c+72>>2];w[a+8|0]=b;w[a+9|0]=b>>>8;w[a+10|0]=b>>>16;w[a+11|0]=b>>>24;w[a+12|0]=d;w[a+13|0]=d>>>8;w[a+14|0]=d>>>16;w[a+15|0]=d>>>24;d=y[c+68>>2];b=y[c+64>>2];w[a|0]=b;w[a+1|0]=b>>>8;w[a+2|0]=b>>>16;w[a+3|0]=b>>>24;w[a+4|0]=d;w[a+5|0]=d>>>8;w[a+6|0]=d>>>16;w[a+7|0]=d>>>24;T=c+128|0;}function kc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;a:{g=y[a+56>>2];e=y[a+60>>2];if(g|e){h=16-g|0;k=h;f=0-((g>>>0>16)+e|0)|0;h=(f|0)==(d|0)&c>>>0>h>>>0|d>>>0>f>>>0;j=h?k:c;h=h?f:d;k=h;if(h|j){p=j&3;h=a- -64|0;f=0;g=0;b:{if(!k&j>>>0>=4|k){l=j&-4;while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];m=f|1;e=m+y[a+56>>2]|0;w[e+h|0]=z[b+m|0];m=f|2;e=m+y[a+56>>2]|0;w[e+h|0]=z[b+m|0];m=f|3;e=m+y[a+56>>2]|0;w[e+h|0]=z[b+m|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;n=n+4|0;i=n>>>0<4?i+1|0:i;if((l|0)!=(n|0)|(i|0)!=(k|0)){continue}break}if(!(p|r)){break b}}while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];e=g;f=f+1|0;g=f?e:e+1|0;e=q;o=o+1|0;e=o?e:e+1|0;q=e;if((o|0)!=(p|0)|(r|0)!=(e|0)){continue}break}}g=y[a+56>>2];e=y[a+60>>2];}i=e+k|0;g=g+j|0;i=g>>>0>>0?i+1|0:i;y[a+56>>2]=g;y[a+60>>2]=i;if(!i&g>>>0<16){break a}hc(a,a- -64|0,16,0);y[a+56>>2]=0;y[a+60>>2]=0;g=c;c=g-j|0;d=d-((g>>>0>>0)+k|0)|0;b=b+j|0;}if(!d&c>>>0>=16|d){g=c&-16;hc(a,b,g,d);c=c&15;d=0;b=b+g|0;}if(!(c|d)){break a}j=c&3;k=0;h=a- -64|0;o=0;q=0;f=0;g=0;c:{if(!d&c>>>0>=4|d){p=c&12;n=0;i=0;while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];l=f|1;e=l+y[a+56>>2]|0;w[e+h|0]=z[b+l|0];l=f|2;e=l+y[a+56>>2]|0;w[e+h|0]=z[b+l|0];l=f|3;e=l+y[a+56>>2]|0;w[e+h|0]=z[b+l|0];e=g;f=f+4|0;g=f>>>0<4?e+1|0:e;n=n+4|0;i=n>>>0<4?i+1|0:i;if((n|0)!=(p|0)|(i|0)!=(r|0)){continue}break}if(!(j|k)){break c}}while(1){e=f+y[a+56>>2]|0;w[e+h|0]=z[b+f|0];f=f+1|0;g=f?g:g+1|0;e=q;o=o+1|0;e=o?e:e+1|0;q=e;if((j|0)!=(o|0)|(k|0)!=(e|0)){continue}break}}i=d+y[a+60>>2]|0;b=c+y[a+56>>2]|0;i=b>>>0>>0?i+1|0:i;y[a+56>>2]=b;y[a+60>>2]=i;}}function Ua(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;e=T-288|0;T=e;f=a+40|0;c=y[a+32>>2]>>>3&63;d=f+c|0;a:{if(c>>>0>=56){c=64-c|0;if(c){t(d,39616,c);}Tb(a,f,e,e+256|0);c=f;y[c+48>>2]=0;y[c+52>>2]=0;y[c+40>>2]=0;y[c+44>>2]=0;y[c+32>>2]=0;y[c+36>>2]=0;y[c+24>>2]=0;y[c+28>>2]=0;y[c+16>>2]=0;y[c+20>>2]=0;y[c+8>>2]=0;y[c+12>>2]=0;y[c>>2]=0;y[c+4>>2]=0;break a}c=56-c|0;if(!c){break a}t(d,39616,c);}d=y[a+32>>2];c=d&16711680;h=c>>>8|0;g=c<<24;c=d&-16777216;i=c>>>24|0;g=g|c<<8;c=y[a+36>>2];y[a+96>>2]=g|(((c&255)<<24|d>>>8)&-16777216|((c&16777215)<<8|d>>>24)&16711680|(c>>>8&65280|c>>>24));c=h|i|(d<<24|(d&65280)<<8);y[a+100>>2]=c;Tb(a,f,e,e+256|0);c=y[a>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b|0]=c;w[b+1|0]=c>>>8;w[b+2|0]=c>>>16;w[b+3|0]=c>>>24;c=y[a+4>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;c=y[a+8>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+8|0]=c;w[b+9|0]=c>>>8;w[b+10|0]=c>>>16;w[b+11|0]=c>>>24;c=y[a+12>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+12|0]=c;w[b+13|0]=c>>>8;w[b+14|0]=c>>>16;w[b+15|0]=c>>>24;c=y[a+16>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+16|0]=c;w[b+17|0]=c>>>8;w[b+18|0]=c>>>16;w[b+19|0]=c>>>24;c=y[a+20>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;c=y[a+24>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+24|0]=c;w[b+25|0]=c>>>8;w[b+26|0]=c>>>16;w[b+27|0]=c>>>24;c=y[a+28>>2];c=Di(c&16711935,8)|Di(c,24)&16711935;w[b+28|0]=c;w[b+29|0]=c>>>8;w[b+30|0]=c>>>16;w[b+31|0]=c>>>24;ja(e,288);ja(a,104);T=e+288|0;return 0}function Fg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=T;j=f;f=f-512&-64;T=f;g=a?a:b;if(g){i=-1;h=f+96|0;if(!Ea(h,d,e)){d=f+128|0;Ja(d,0,0,64);oa(d,h,32,0);ja(h,32);oa(d,c,32,0);oa(d,e,32,0);c=f+32|0;Ia(d,c,64);ja(d,384);w[g|0]=z[f+32|0];a=b?b:a;w[a|0]=z[f+64|0];w[g+1|0]=z[f+33|0];w[a+1|0]=z[f+65|0];w[g+2|0]=z[f+34|0];w[a+2|0]=z[f+66|0];w[g+3|0]=z[f+35|0];w[a+3|0]=z[f+67|0];w[g+4|0]=z[f+36|0];w[a+4|0]=z[f+68|0];w[g+5|0]=z[f+37|0];w[a+5|0]=z[f+69|0];w[g+6|0]=z[f+38|0];w[a+6|0]=z[f+70|0];w[g+7|0]=z[f+39|0];w[a+7|0]=z[f+71|0];w[g+8|0]=z[f+40|0];w[a+8|0]=z[f+72|0];w[g+9|0]=z[f+41|0];w[a+9|0]=z[f+73|0];w[g+10|0]=z[f+42|0];w[a+10|0]=z[f+74|0];w[g+11|0]=z[f+43|0];w[a+11|0]=z[f+75|0];w[g+12|0]=z[f+44|0];w[a+12|0]=z[f+76|0];w[g+13|0]=z[f+45|0];w[a+13|0]=z[f+77|0];w[g+14|0]=z[f+46|0];w[a+14|0]=z[f+78|0];w[g+15|0]=z[f+47|0];w[a+15|0]=z[f+79|0];w[g+16|0]=z[f+48|0];w[a+16|0]=z[f+80|0];w[g+17|0]=z[f+49|0];w[a+17|0]=z[f+81|0];w[g+18|0]=z[f+50|0];w[a+18|0]=z[f+82|0];w[g+19|0]=z[f+51|0];w[a+19|0]=z[f+83|0];w[g+20|0]=z[f+52|0];w[a+20|0]=z[f+84|0];w[g+21|0]=z[f+53|0];w[a+21|0]=z[f+85|0];w[g+22|0]=z[f+54|0];w[a+22|0]=z[f+86|0];w[g+23|0]=z[f+55|0];w[a+23|0]=z[f+87|0];w[g+24|0]=z[f+56|0];w[a+24|0]=z[f+88|0];w[g+25|0]=z[f+57|0];w[a+25|0]=z[f+89|0];w[g+26|0]=z[f+58|0];w[a+26|0]=z[f+90|0];w[g+27|0]=z[f+59|0];w[a+27|0]=z[f+91|0];w[g+28|0]=z[f+60|0];w[a+28|0]=z[f+92|0];w[g+29|0]=z[f+61|0];w[a+29|0]=z[f+93|0];w[g+30|0]=z[f+62|0];w[a+30|0]=z[f+94|0];w[g+31|0]=z[f+63|0];w[a+31|0]=z[f+95|0];ja(c,64);i=0;}T=j;return i|0}na();s();}function Eg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=T;j=f;f=f-512&-64;T=f;g=a?a:b;if(g){i=-1;h=f+96|0;if(!Ea(h,d,e)){d=f+128|0;Ja(d,0,0,64);oa(d,h,32,0);ja(h,32);oa(d,e,32,0);oa(d,c,32,0);c=f+32|0;Ia(d,c,64);ja(d,384);a=b?b:a;w[a|0]=z[f+32|0];w[g|0]=z[f+64|0];w[a+1|0]=z[f+33|0];w[g+1|0]=z[f+65|0];w[a+2|0]=z[f+34|0];w[g+2|0]=z[f+66|0];w[a+3|0]=z[f+35|0];w[g+3|0]=z[f+67|0];w[a+4|0]=z[f+36|0];w[g+4|0]=z[f+68|0];w[a+5|0]=z[f+37|0];w[g+5|0]=z[f+69|0];w[a+6|0]=z[f+38|0];w[g+6|0]=z[f+70|0];w[a+7|0]=z[f+39|0];w[g+7|0]=z[f+71|0];w[a+8|0]=z[f+40|0];w[g+8|0]=z[f+72|0];w[a+9|0]=z[f+41|0];w[g+9|0]=z[f+73|0];w[a+10|0]=z[f+42|0];w[g+10|0]=z[f+74|0];w[a+11|0]=z[f+43|0];w[g+11|0]=z[f+75|0];w[a+12|0]=z[f+44|0];w[g+12|0]=z[f+76|0];w[a+13|0]=z[f+45|0];w[g+13|0]=z[f+77|0];w[a+14|0]=z[f+46|0];w[g+14|0]=z[f+78|0];w[a+15|0]=z[f+47|0];w[g+15|0]=z[f+79|0];w[a+16|0]=z[f+48|0];w[g+16|0]=z[f+80|0];w[a+17|0]=z[f+49|0];w[g+17|0]=z[f+81|0];w[a+18|0]=z[f+50|0];w[g+18|0]=z[f+82|0];w[a+19|0]=z[f+51|0];w[g+19|0]=z[f+83|0];w[a+20|0]=z[f+52|0];w[g+20|0]=z[f+84|0];w[a+21|0]=z[f+53|0];w[g+21|0]=z[f+85|0];w[a+22|0]=z[f+54|0];w[g+22|0]=z[f+86|0];w[a+23|0]=z[f+55|0];w[g+23|0]=z[f+87|0];w[a+24|0]=z[f+56|0];w[g+24|0]=z[f+88|0];w[a+25|0]=z[f+57|0];w[g+25|0]=z[f+89|0];w[a+26|0]=z[f+58|0];w[g+26|0]=z[f+90|0];w[a+27|0]=z[f+59|0];w[g+27|0]=z[f+91|0];w[a+28|0]=z[f+60|0];w[g+28|0]=z[f+92|0];w[a+29|0]=z[f+61|0];w[g+29|0]=z[f+93|0];w[a+30|0]=z[f+62|0];w[g+30|0]=z[f+94|0];w[a+31|0]=z[f+63|0];w[g+31|0]=z[f+95|0];ja(c,64);i=0;}T=j;return i|0}na();s();}function ef(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0;n=b;b=e;e=0;b=b|e;h=T-128|0;T=h;p=a;o(a,0,102);l=22;q=c|e;a:{{c:{if(d){break c}lc(b,f,g,h+16|0,h+12|0,h+8|0);i=h+96|0;za(i,32);l=28;b=h+32|0;d=y[h+16>>2];a=y[h+12>>2];c=y[h+8>>2];f=Ai(a,0,c,0);g=W;d:{if(!g&f>>>0>1073741823|g|d>>>0>63){break d}w[b|0]=36;w[b+1|0]=55;w[b+2|0]=36;w[b+4|0]=z[(c&63)+1024|0];w[b+3|0]=z[d+1024|0];w[b+8|0]=z[(c>>>24&63)+1024|0];w[b+7|0]=z[(c>>>18&63)+1024|0];w[b+6|0]=z[(c>>>12&63)+1024|0];w[b+5|0]=z[(c>>>6&63)+1024|0];c=b+9|0;if(!c){break d}j=b+58|0;if((c|0)==(j|0)){break d}w[c|0]=z[(a&63)+1024|0];c=j-c|0;if((c|0)==1){break d}w[b+10|0]=z[(a>>>6&63)+1024|0];if((c|0)==2){break d}w[b+11|0]=z[(a>>>12&63)+1024|0];if((c|0)==3){break d}w[b+12|0]=z[(a>>>18&63)+1024|0];if((c|0)==4){break d}w[b+13|0]=z[(a>>>24&63)+1024|0];c=b+14|0;if(!c){break d}g=j-c|0;a=0;while(1){e:{d=c;if(a>>>0>=32){break e}c=z[a+i|0];f=a+1|0;m=f>>>0>=32;f:{if(m){k=0;break f}c=z[f+i|0]<<8|c;f=a+2|0;if(f>>>0>=32){k=0;break f}c=z[f+i|0]<<16|c;k=1;f=a+3|0;}a=f;if(!g){break d}w[d|0]=z[(c&63)+1024|0];if((g|0)==1){break d}w[d+1|0]=z[(c>>>6&63)+1024|0];r=d+g|0;f=d+2|0;g:{if(m){break g}if((g|0)==2){break d}w[d+2|0]=z[(c>>>12&63)+1024|0];f=d+3|0;if(!k){break g}if((g|0)==3){break d}w[d+3|0]=z[(c>>>18|0)+1024|0];f=d+4|0;}c=f;g=r-c|0;if(c){continue}break d}break}if(d>>>0>=j>>>0){break d}w[d|0]=0;e=b;}if(!e){break c}a=h+20|0;if(mc(a));b=Gd(a,n,q,b,p);Ob(a);if(!b){break c}a=0;break a}y[10172]=l;}a=-1;}T=h+128|0;return a|0}function Qa(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;o=y[b+4>>2];d=y[a+4>>2];p=y[b+8>>2];e=y[a+8>>2];q=y[b+12>>2];f=y[a+12>>2];r=y[b+16>>2];g=y[a+16>>2];s=y[b+20>>2];h=y[a+20>>2];t=y[b+24>>2];i=y[a+24>>2];m=y[b+28>>2];j=y[a+28>>2];u=y[b+32>>2];k=y[a+32>>2];v=y[b+36>>2];l=y[a+36>>2];c=0-c|0;n=y[a>>2];y[a>>2]=c&(n^y[b>>2])^n;y[a+36>>2]=l^c&(l^v);y[a+32>>2]=k^c&(k^u);y[a+28>>2]=j^c&(j^m);y[a+24>>2]=i^c&(i^t);y[a+20>>2]=h^c&(h^s);y[a+16>>2]=g^c&(g^r);y[a+12>>2]=f^c&(f^q);y[a+8>>2]=e^c&(e^p);y[a+4>>2]=d^c&(d^o);d=y[a+40>>2];o=y[b+40>>2];e=y[a+44>>2];p=y[b+44>>2];f=y[a+48>>2];q=y[b+48>>2];g=y[a+52>>2];r=y[b+52>>2];h=y[a+56>>2];s=y[b+56>>2];i=y[a+60>>2];t=y[b+60>>2];m=a- -64|0;j=y[m>>2];u=y[b- -64>>2];k=y[a+68>>2];v=y[b+68>>2];l=y[a+72>>2];n=y[b+72>>2];w=y[a+76>>2];y[a+76>>2]=w^c&(y[b+76>>2]^w);y[a+72>>2]=l^c&(l^n);y[a+68>>2]=k^c&(k^v);y[m>>2]=j^c&(j^u);y[a+60>>2]=i^c&(i^t);y[a+56>>2]=h^c&(h^s);y[a+52>>2]=g^c&(g^r);y[a+48>>2]=f^c&(f^q);y[a+44>>2]=e^c&(e^p);y[a+40>>2]=d^c&(d^o);d=y[a+80>>2];o=y[b+80>>2];e=y[a+84>>2];p=y[b+84>>2];f=y[a+88>>2];q=y[b+88>>2];g=y[a+92>>2];r=y[b+92>>2];h=y[a+96>>2];s=y[b+96>>2];i=y[a+100>>2];t=y[b+100>>2];j=y[a+104>>2];m=y[b+104>>2];k=y[a+108>>2];u=y[b+108>>2];l=y[a+112>>2];v=y[b+112>>2];n=y[b+116>>2];b=y[a+116>>2];y[a+116>>2]=c&(n^b)^b;y[a+112>>2]=l^c&(l^v);y[a+108>>2]=k^c&(k^u);y[a+104>>2]=j^c&(j^m);y[a+100>>2]=i^c&(i^t);y[a+96>>2]=h^c&(h^s);y[a+92>>2]=g^c&(g^r);y[a+88>>2]=f^c&(f^q);y[a+84>>2]=e^c&(e^p);y[a+80>>2]=d^c&(d^o);}function bb(a,b){var c=0,d=0,e=0;c=T-192|0;T=c;e=c+144|0;fa(e,b);d=c+96|0;fa(d,e);fa(d,d);ga(d,b,d);ga(e,e,d);b=c+48|0;fa(b,e);ga(d,d,b);fa(b,d);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(d,b,d);fa(b,d);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(b,b,d);fa(c,b);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(b,c,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(d,b,d);fa(b,d);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);ga(b,b,d);fa(c,b);b=1;while(1){fa(c,c);b=b+1|0;if((b|0)!=100){continue}break}b=c+48|0;ga(b,c,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);fa(b,b);d=c+96|0;ga(d,b,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);ga(a,d,c+144|0);T=c+192|0;}function Kh(a){a=a|0;var b=0,c=0,d=0;c=T-48|0;T=c;b=z[a+28|0]|z[a+29|0]<<8|(z[a+30|0]<<16|z[a+31|0]<<24);y[c+24>>2]=z[a+24|0]|z[a+25|0]<<8|(z[a+26|0]<<16|z[a+27|0]<<24);y[c+28>>2]=b;b=z[a+20|0]|z[a+21|0]<<8|(z[a+22|0]<<16|z[a+23|0]<<24);y[c+16>>2]=z[a+16|0]|z[a+17|0]<<8|(z[a+18|0]<<16|z[a+19|0]<<24);y[c+20>>2]=b;b=z[a+12|0]|z[a+13|0]<<8|(z[a+14|0]<<16|z[a+15|0]<<24);y[c+8>>2]=z[a+8|0]|z[a+9|0]<<8|(z[a+10|0]<<16|z[a+11|0]<<24);y[c+12>>2]=b;b=z[a+4|0]|z[a+5|0]<<8|(z[a+6|0]<<16|z[a+7|0]<<24);y[c>>2]=z[a|0]|z[a+1|0]<<8|(z[a+2|0]<<16|z[a+3|0]<<24);y[c+4>>2]=b;b=z[a+40|0]|z[a+41|0]<<8|(z[a+42|0]<<16|z[a+43|0]<<24);y[c+32>>2]=z[a+36|0]|z[a+37|0]<<8|(z[a+38|0]<<16|z[a+39|0]<<24);y[c+36>>2]=b;Yb(c,c,40,0,a+32|0,a);b=y[c+28>>2];d=y[c+24>>2];w[a+24|0]=d;w[a+25|0]=d>>>8;w[a+26|0]=d>>>16;w[a+27|0]=d>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[c+20>>2];d=y[c+16>>2];w[a+16|0]=d;w[a+17|0]=d>>>8;w[a+18|0]=d>>>16;w[a+19|0]=d>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[c+12>>2];d=y[c+8>>2];w[a+8|0]=d;w[a+9|0]=d>>>8;w[a+10|0]=d>>>16;w[a+11|0]=d>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[c+4>>2];d=y[c>>2];w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;d=y[c+36>>2];b=y[c+32>>2];w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;w[a+36|0]=b;w[a+37|0]=b>>>8;w[a+38|0]=b>>>16;w[a+39|0]=b>>>24;w[a+40|0]=d;w[a+41|0]=d>>>8;w[a+42|0]=d>>>16;w[a+43|0]=d>>>24;T=c+48|0;}function gc(a,b){var c=0,d=0,e=0;d=T-144|0;T=d;e=d+96|0;fa(e,b);c=d+48|0;fa(c,e);fa(c,c);ga(c,b,c);ga(e,e,c);fa(e,e);ga(e,c,e);fa(c,e);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(e,c,e);fa(c,e);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,e);fa(d,c);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);fa(d,d);ga(c,d,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(e,c,e);fa(c,e);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);ga(c,c,e);fa(d,c);c=1;while(1){fa(d,d);c=c+1|0;if((c|0)!=100){continue}break}c=d+48|0;ga(c,d,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);fa(c,c);e=d+96|0;ga(e,c,e);fa(e,e);fa(e,e);ga(a,e,b);T=d+144|0;}function Qc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,x=0,A=0,B=0;c=T-320|0;T=c;g=a+40|0;cb(g,b);y[a+84>>2]=0;y[a+88>>2]=0;y[a+80>>2]=1;y[a+92>>2]=0;y[a+96>>2]=0;y[a+100>>2]=0;y[a+104>>2]=0;y[a+108>>2]=0;y[a+112>>2]=0;y[a+116>>2]=0;f=c+240|0;fa(f,g);e=c+192|0;ga(e,f,1584);i=-1;h=y[c+240>>2]-1|0;y[c+240>>2]=h;y[c+192>>2]=y[c+192>>2]+1;j=y[c+244>>2];k=y[c+248>>2];l=y[c+252>>2];m=y[c+256>>2];n=y[c+260>>2];o=y[c+264>>2];p=y[c+268>>2];q=y[c+272>>2];r=y[c+276>>2];d=c+144|0;fa(d,e);ga(d,d,e);fa(a,d);ga(a,a,e);ga(a,a,f);gc(a,a);ga(a,a,d);ga(a,a,f);d=c+96|0;fa(d,a);ga(d,d,e);e=y[c+132>>2];y[c+84>>2]=e-r;d=y[c+128>>2];y[c+80>>2]=d-q;f=y[c+124>>2];y[c+76>>2]=f-p;s=y[c+120>>2];y[c+72>>2]=s-o;t=y[c+116>>2];y[c+68>>2]=t-n;u=y[c+112>>2];y[c+64>>2]=u-m;v=y[c+108>>2];y[c+60>>2]=v-l;x=y[c+104>>2];y[c+56>>2]=x-k;A=y[c+100>>2];y[c+52>>2]=A-j;B=y[c+96>>2];y[c+48>>2]=B-h;pa(c,c+48|0);a:{if(!ya(c,32)){y[c+36>>2]=e+r;y[c+32>>2]=d+q;y[c+28>>2]=f+p;y[c+24>>2]=o+s;y[c+20>>2]=n+t;y[c+16>>2]=m+u;y[c+12>>2]=l+v;y[c+8>>2]=k+x;y[c+4>>2]=j+A;y[c>>2]=h+B;e=c+288|0;pa(e,c);if(!ya(e,32)){break a}ga(a,a,1632);}pa(c+288|0,a);if((w[c+288|0]&1)==(z[b+31|0]>>>7|0)){y[a>>2]=0-y[a>>2];y[a+36>>2]=0-y[a+36>>2];y[a+32>>2]=0-y[a+32>>2];y[a+28>>2]=0-y[a+28>>2];y[a+24>>2]=0-y[a+24>>2];y[a+20>>2]=0-y[a+20>>2];y[a+16>>2]=0-y[a+16>>2];y[a+12>>2]=0-y[a+12>>2];y[a+8>>2]=0-y[a+8>>2];y[a+4>>2]=0-y[a+4>>2];}ga(a+120|0,a,g);i=0;}T=c+320|0;return i}function Kc(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=T-128|0;T=d;e=z[41218];y[a+4>>2]=0;y[a+8>>2]=0;y[a>>2]=1;y[a+12>>2]=0;y[a+16>>2]=0;y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+40>>2]=1;o(a+44|0,0,76);b=E(b,960)+2992|0;e=e>>>2^(c&128)>>>7;c=c-((0-e&c)<<1)|0;Qa(a,b,z[41218]>>>2^((c^1)&255)-1>>>31);Qa(a,b+120|0,z[41218]>>>2^((c^2)&255)-1>>>31);Qa(a,b+240|0,z[41218]>>>2^((c^3)&255)-1>>>31);Qa(a,b+360|0,z[41218]>>>2^((c^4)&255)-1>>>31);Qa(a,b+480|0,z[41218]>>>2^((c^5)&255)-1>>>31);Qa(a,b+600|0,z[41218]>>>2^((c^6)&255)-1>>>31);Qa(a,b+720|0,z[41218]>>>2^((c^7)&255)-1>>>31);Qa(a,b+840|0,z[41218]>>>2^((c^8)&255)-1>>>31);b=y[a+76>>2];y[d+40>>2]=y[a+72>>2];y[d+44>>2]=b;b=a- -64|0;c=y[b+4>>2];y[d+32>>2]=y[b>>2];y[d+36>>2]=c;b=y[a+60>>2];y[d+24>>2]=y[a+56>>2];y[d+28>>2]=b;b=y[a+52>>2];y[d+16>>2]=y[a+48>>2];y[d+20>>2]=b;b=y[a+44>>2];y[d+8>>2]=y[a+40>>2];y[d+12>>2]=b;b=y[a+4>>2];y[d+48>>2]=y[a>>2];y[d+52>>2]=b;b=y[a+12>>2];y[d+56>>2]=y[a+8>>2];y[d+60>>2]=b;b=y[a+20>>2];y[d+64>>2]=y[a+16>>2];y[d+68>>2]=b;b=y[a+28>>2];y[d+72>>2]=y[a+24>>2];y[d+76>>2]=b;b=y[a+36>>2];y[d+80>>2]=y[a+32>>2];y[d+84>>2]=b;b=y[a+80>>2];c=y[a+84>>2];f=y[a+88>>2];g=y[a+92>>2];h=y[a+96>>2];i=y[a+100>>2];j=y[a+104>>2];k=y[a+108>>2];l=y[a+112>>2];y[d+124>>2]=0-y[a+116>>2];y[d+120>>2]=0-l;y[d+116>>2]=0-k;y[d+112>>2]=0-j;y[d+108>>2]=0-i;y[d+104>>2]=0-h;y[d+100>>2]=0-g;y[d+96>>2]=0-f;y[d+92>>2]=0-c;y[d+88>>2]=0-b;Qa(a,d+8|0,e);T=d+128|0;}function Te(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=T-304|0;T=c;w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];b=z[b+31|0];w[a|0]=z[a|0]&248;w[a+31|0]=b&63|64;jb(c+48|0,a);b=y[c+128>>2];d=y[c+88>>2];e=y[c+132>>2];f=y[c+92>>2];g=y[c+136>>2];h=y[c+96>>2];i=y[c+140>>2];j=y[c+100>>2];k=y[c+144>>2];l=y[c+104>>2];m=y[c+148>>2];n=y[c+108>>2];o=y[c+152>>2];p=y[c+112>>2];q=y[c+156>>2];r=y[c+116>>2];s=y[c+160>>2];t=y[c+120>>2];u=y[c+124>>2];v=y[c+164>>2];y[c+292>>2]=u+v;y[c+288>>2]=s+t;y[c+284>>2]=q+r;y[c+280>>2]=o+p;y[c+276>>2]=m+n;y[c+272>>2]=k+l;y[c+268>>2]=i+j;y[c+264>>2]=g+h;y[c+260>>2]=e+f;y[c+256>>2]=b+d;y[c+244>>2]=v-u;y[c+240>>2]=s-t;y[c+236>>2]=q-r;y[c+232>>2]=o-p;y[c+228>>2]=m-n;y[c+224>>2]=k-l;y[c+220>>2]=i-j;y[c+216>>2]=g-h;y[c+212>>2]=e-f;y[c+208>>2]=b-d;b=c+208|0;bb(b,b);ga(c,c+256|0,b);pa(a,c);T=c+304|0;return 0}function zb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,z=0,A=0,B=0,C=0,D=0;b=T-320|0;T=b;d=b+240|0;fa(d,a);e=b+192|0;fa(e,a+40|0);c=b+144|0;fa(c,a+80|0);a=y[b+240>>2];f=y[b+192>>2];g=y[b+244>>2];h=y[b+196>>2];i=y[b+248>>2];j=y[b+200>>2];k=y[b+252>>2];l=y[b+204>>2];m=y[b+256>>2];n=y[b+208>>2];o=y[b+260>>2];p=y[b+212>>2];q=y[b+264>>2];r=y[b+216>>2];s=y[b+268>>2];t=y[b+220>>2];u=y[b+272>>2];v=y[b+224>>2];y[b+84>>2]=y[b+228>>2]-y[b+276>>2];y[b+80>>2]=v-u;y[b+76>>2]=t-s;y[b+72>>2]=r-q;y[b+68>>2]=p-o;y[b+64>>2]=n-m;y[b+60>>2]=l-k;y[b+56>>2]=j-i;y[b+52>>2]=h-g;y[b+48>>2]=f-a;a=b+48|0;ga(a,a,c);ga(b,d,e);ga(b,b,1584);fa(b+96|0,c);c=y[b+48>>2];d=y[b+96>>2];e=y[b>>2];f=y[b+52>>2];g=y[b+100>>2];h=y[b+4>>2];i=y[b+56>>2];j=y[b+104>>2];k=y[b+8>>2];l=y[b+60>>2];m=y[b+108>>2];n=y[b+12>>2];o=y[b+64>>2];p=y[b+112>>2];q=y[b+16>>2];r=y[b+68>>2];s=y[b+116>>2];t=y[b+20>>2];u=y[b+72>>2];v=y[b+120>>2];w=y[b+24>>2];x=y[b+76>>2];z=y[b+124>>2];A=y[b+28>>2];B=y[b+80>>2];C=y[b+128>>2];D=y[b+32>>2];y[b+84>>2]=y[b+84>>2]-(y[b+132>>2]+y[b+36>>2]|0);y[b+80>>2]=B-(C+D|0);y[b+76>>2]=x-(z+A|0);y[b+72>>2]=u-(v+w|0);y[b+68>>2]=r-(s+t|0);y[b+64>>2]=o-(p+q|0);y[b+60>>2]=l-(m+n|0);y[b+56>>2]=i-(j+k|0);y[b+52>>2]=f-(g+h|0);y[b+48>>2]=c-(d+e|0);c=b+288|0;pa(c,a);a=ya(c,32);T=b+320|0;return a}function Bc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{f:{if((e&-7)!=1){break f}f=(d>>>0)/3|0;h=f<<2;f=E(f,-3)+d|0;g:{if(!f){break g}if(!(e&2)){h=h+4|0;break g}h=((f>>>1|0)+h|0)+2|0;}if(b>>>0<=h>>>0){break f}h:{if(e>>>0>=4){if(!d){e=0;break b}f=0;e=0;break h}if(!d){e=0;break b}f=0;e=0;break e}while(1){j=z[c+i|0]|j<<8;f=f|8;while(1){f=f-6|0;g=j>>>f&63;k=g+65510>>>8|0;l=g+65484>>>8|0;w[a+e|0]=((g^16321)+1^-1)>>>8&45|((g+32705^-1)>>>8&95|(l&(g+71&(k^-1))|k&g+65)|g+252&g+65474>>>8&(l^-1));e=e+1|0;if(f>>>0>5){continue}break}i=i+1|0;if((i|0)!=(d|0)){continue}break}if(!f){break c}i=45;g=95;d=32705;break d}na();s();}while(1){j=z[c+i|0]|j<<8;f=f|8;while(1){f=f-6|0;g=j>>>f&63;k=g+65510>>>8|0;l=g+65484>>>8|0;w[a+e|0]=((g^16321)+1^-1)>>>8&43|((g+16321^-1)>>>8&47|(l&(g+71&(k^-1))|k&g+65)|g+252&g+65474>>>8&(l^-1));e=e+1|0;if(f>>>0>5){continue}break}i=i+1|0;if((i|0)!=(d|0)){continue}break}if(!f){break c}i=43;g=47;d=16321;}c=j<<6-f&63;f=c+65510>>>8|0;j=c+65484>>>8|0;w[a+e|0]=((c^16321)+1^-1)>>>8&i|(g&(c+d^-1)>>>8|(j&(c+71&(f^-1))|f&c+65)|c+252&c+65474>>>8&(j^-1));e=e+1|0;}if(e>>>0>h>>>0){break a}}i:{if(e>>>0>=h>>>0){h=e;break i}c=h-e|0;if(!c){break i}o(a+e|0,61,c);}c=h+1|0;b=(b>>>0>c>>>0?b:c)-h|0;if(b){o(a+h|0,0,b);}return a|0}Q(1104,1218,231,1503);s();}function oa(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(c|d){a:{l=a+224|0;k=a+96|0;f=z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24);g=a- -64|0;while(1){e=f+k|0;i=256-f|0;if(!d&c>>>0<=i>>>0){if(c){t(e,b,c);}b=c+(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))|0;w[a+352|0]=b;w[a+353|0]=b>>>8;w[a+354|0]=b>>>16;w[a+355|0]=b>>>24;break a}if(i){t(e,b,i);}e=i+(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))|0;w[a+352|0]=e;w[a+353|0]=e>>>8;w[a+354|0]=e>>>16;w[a+355|0]=e>>>24;f=z[g+4|0]|z[g+5|0]<<8|(z[g+6|0]<<16|z[g+7|0]<<24);m=f;h=z[g|0]|z[g+1|0]<<8|(z[g+2|0]<<16|z[g+3|0]<<24);j=h+128|0;f=j>>>0<128?f+1|0:f;e=g;w[e|0]=j;w[e+1|0]=j>>>8;w[e+2|0]=j>>>16;w[e+3|0]=j>>>24;w[e+4|0]=f;w[e+5|0]=f>>>8;w[e+6|0]=f>>>16;w[e+7|0]=f>>>24;f=z[a+76|0]|z[a+77|0]<<8|(z[a+78|0]<<16|z[a+79|0]<<24);e=(m|0)==-1&h>>>0>4294967167;h=e+(z[a+72|0]|z[a+73|0]<<8|(z[a+74|0]<<16|z[a+75|0]<<24))|0;f=e>>>0>h>>>0?f+1|0:f;w[a+72|0]=h;w[a+73|0]=h>>>8;w[a+74|0]=h>>>16;w[a+75|0]=h>>>24;w[a+76|0]=f;w[a+77|0]=f>>>8;w[a+78|0]=f>>>16;w[a+79|0]=f>>>24;Eb(a,k);t(k,l,128);f=(z[a+352|0]|z[a+353|0]<<8|(z[a+354|0]<<16|z[a+355|0]<<24))-128|0;e=f;w[a+352|0]=e;w[a+353|0]=e>>>8;w[a+354|0]=e>>>16;w[a+355|0]=e>>>24;b=b+i|0;d=d-(c>>>0>>0)|0;c=c-i|0;if(d|c){continue}break}}}return 0}function zh(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{if(d){if(e){break i}i=1;e=0;while(1){l=z[c+h|0];j=(l&223)-55&255;n=(j+65526^j+65520)>>>8|0;l=l^48;o=l+65526>>>8|0;if(!((n|o)&255)){break g}if(b>>>0<=m>>>0){break h}j=j&n|l&o;j:{if(!(k&255)){e=j<<4;break j}w[a+m|0]=e|j;m=m+1|0;}k=k^-1;h=h+1|0;if((h|0)!=(d|0)){continue}break}h=d;break g}a=0;if(!g){break a}break c}while(1){k:{l:{m:{n:{o:{j=z[c+h|0];i=(j&223)-55&255;l=(i+65526^i+65520)>>>8|0;n=j^48;o=n+65526>>>8|0;if(!((l|o)&255)){if(k&255){break f}i=0;if(!ob(e,j)){break d}k=h+1|0;h=k;if(h>>>0>>0){break o}break d}if(b>>>0<=m>>>0){break h}i=i&l|n&o;if(!(k&255)){break n}w[a+m|0]=i|p;k=k^-1;m=m+1|0;break k}while(1){j=z[c+h|0];l=(j&223)-55&255;n=(l+65526^l+65520)>>>8|0;o=j^48;p=o+65526>>>8|0;if(!((n|p)&255)){if(!ob(e,j)){break d}h=h+1|0;if(h>>>0>>0){continue}break m}break}if(b>>>0<=m>>>0){break l}i=l&n|o&p;}p=i<<4;k=255;break k}h=d>>>0>k>>>0?d:k;break d}k=0;break h}i=1;h=h+1|0;if(h>>>0>>0){continue}break}break g}y[10172]=68;i=0;}if(!(k&255)){break e}}y[10172]=28;i=-1;h=h-1|0;m=0;break d}m=i?m:0;i=i-1|0;}if(g){break c}if((d|0)!=(h|0)){break b}a=i;break a}y[g>>2]=c+h;a=i;break a}y[10172]=28;a=-1;}if(f){y[f>>2]=m;}return a|0}function oe(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=T-16|0;T=e;j=y[a+20>>2];y[a+20>>2]=0;k=y[a+4>>2];y[a+4>>2]=0;h=-26;a:{b:{c:{d:{switch(c-1|0){case 1:if(pb(b,1182,9)){break b}b=b+9|0;break c;case 0:break d;default:break a}}if(pb(b,1173,8)){break b}b=b+8|0;}if(z[b|0]!=36|z[b+1|0]!=118|z[b+2|0]!=61){break b}f=b+3|0;i=z[f|0];if((i-58&255)>>>0<246){break b}b=0;g=i;c=f;while(1){d=c;if(b>>>0>429496729){break b}c=(g&255)-48|0;b=E(b,10);if(c>>>0>(b^-1)>>>0){break b}b=b+c|0;c=d+1|0;g=z[c|0];if((g-58&255)>>>0>245){continue}break}if((i|0)==48&(d|0)!=(f|0)|(c|0)==(f|0)){break b}if((b|0)!=19){break a}if((g&255)!=36|z[d+2|0]!=109|z[d+3|0]!=61){break b}b=e+12|0;c=zc(d+4|0,b);if(!c){break b}y[a+44>>2]=y[e+12>>2];if(z[c|0]!=44|z[c+1|0]!=116|z[c+2|0]!=61){break b}c=zc(c+3|0,b);if(!c){break b}y[a+40>>2]=y[e+12>>2];if(z[c|0]!=44|z[c+1|0]!=112|z[c+2|0]!=61){break b}c=zc(c+3|0,b);if(!c){break b}d=y[e+12>>2];y[a+48>>2]=d;y[a+52>>2]=d;if(z[c|0]!=36){break b}y[e+12>>2]=j;f=y[a+16>>2];c=c+1|0;d=c;g=Ha(c);c=e+8|0;if(Ac(f,j,d,g,0,b,c,3)){break b}y[a+20>>2]=y[e+12>>2];d=y[e+8>>2];if(z[d|0]!=36){break b}y[e+12>>2]=k;d=d+1|0;if(Ac(y[a>>2],k,d,Ha(d),0,b,c,3)){break b}y[a+4>>2]=y[e+12>>2];b=y[e+8>>2];h=nc(a);if(h){break a}h=z[b|0]?-32:0;break a}h=-32;}T=e+16|0;return h}function Hd(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;c=y[a+60>>2];q=y[a+56>>2];p=y[a+52>>2];n=y[a+48>>2];b=y[a+44>>2];d=y[a+40>>2];r=y[a+36>>2];m=y[a+32>>2];e=y[a+28>>2];f=y[a+24>>2];g=y[a+20>>2];h=y[a+16>>2];i=y[a+12>>2];j=y[a+8>>2];k=y[a+4>>2];l=y[a>>2];while(1){o=Bi(g+k|0,7)^r;s=Bi(o+g|0,9)^p;h=Bi(l+n|0,7)^h;t=Bi(h+l|0,9)^m;u=Bi(t+h|0,13)^n;i=Bi(b+c|0,7)^i;e=Bi(i+c|0,9)^e;m=Bi(e+i|0,13)^b;c=Bi(e+m|0,18)^c;b=Bi(d+f|0,7)^q;n=u^Bi(c+b|0,7);p=s^Bi(n+c|0,9);q=Bi(n+p|0,13)^b;c=Bi(p+q|0,18)^c;j=Bi(b+d|0,9)^j;f=Bi(j+b|0,13)^f;d=Bi(f+j|0,18)^d;b=Bi(d+o|0,7)^m;m=Bi(b+d|0,9)^t;r=Bi(b+m|0,13)^o;d=Bi(m+r|0,18)^d;k=Bi(o+s|0,13)^k;g=Bi(k+s|0,18)^g;f=Bi(g+h|0,7)^f;e=Bi(f+g|0,9)^e;h=Bi(e+f|0,13)^h;g=Bi(h+e|0,18)^g;l=Bi(t+u|0,18)^l;k=Bi(l+i|0,7)^k;j=Bi(k+l|0,9)^j;i=Bi(j+k|0,13)^i;l=Bi(i+j|0,18)^l;o=v>>>0<6;v=v+2|0;if(o){continue}break}y[a>>2]=y[a>>2]+l;y[a+4>>2]=y[a+4>>2]+k;y[a+8>>2]=y[a+8>>2]+j;y[a+12>>2]=y[a+12>>2]+i;y[a+16>>2]=y[a+16>>2]+h;y[a+20>>2]=y[a+20>>2]+g;y[a+24>>2]=y[a+24>>2]+f;y[a+28>>2]=y[a+28>>2]+e;y[a+32>>2]=y[a+32>>2]+m;y[a+36>>2]=y[a+36>>2]+r;y[a+40>>2]=y[a+40>>2]+d;y[a+44>>2]=y[a+44>>2]+b;y[a+48>>2]=y[a+48>>2]+n;y[a+52>>2]=y[a+52>>2]+p;y[a+56>>2]=y[a+56>>2]+q;y[a+60>>2]=y[a+60>>2]+c;}function Dd(a,b,c,d){var e=0,f=0;e=T-320|0;T=e;f=-1;a:{if(!dc(c)){break a}if(yb(c)){break a}if(ab(e,c)){break a}if(!ec(e)){break a}w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];c=z[b+31|0];if(d){w[a|0]=z[a|0]&248;c=c|64;}w[a+31|0]=c&127;c=e+160|0;Nc(c,a,e);Wa(a,c);if((z[a+31|0]&127|(z[a+30|0]|(z[a+29|0]|(z[a+28|0]|(z[a+27|0]|(z[a+26|0]|(z[a+25|0]|(z[a+24|0]|(z[a+23|0]|(z[a+22|0]|(z[a+21|0]|(z[a+20|0]|(z[a+19|0]|(z[a+18|0]|(z[a+17|0]|(z[a+16|0]|(z[a+15|0]|(z[a+14|0]|(z[a+13|0]|(z[a+12|0]|(z[a+11|0]|(z[a+10|0]|(z[a+9|0]|(z[a+8|0]|(z[a+7|0]|(z[a+6|0]|(z[a+5|0]|(z[a+4|0]|(z[a+3|0]|(z[a+2|0]|(z[a+1|0]|z[a|0]^1)))))))))))))))))))))))))))))))-1&256){break a}f=ya(b,32)?-1:0;}T=e+320|0;return f}function Gd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=T-48|0;T=k;if(e){za(e,102);}a:{if(z[d|0]!=36|z[d+1|0]!=55|z[d+2|0]!=36){break a}l=eb(z[d+3|0]);if(!l){break a}g=Mb(k+12|0,d+4|0);if(!g){break a}j=Mb(k+8|0,g);if(!j){break a}h=Ha(j)+1|0;while(1){b:{g=0;if(!h){break b}h=h-1|0;g=j+h|0;if(z[g|0]!=36){continue}}break}i=g-j|0;c:{if(g){break c}i=Ha(j);}g=i;h=g+(j-d|0)|0;i=h+45|0;if(i>>>0>102|g>>>0>i>>>0){break a}i=a;m=b;n=c;l=l-1024|0;a=l&31;if((l&63)>>>0>=32){b=1<>>32-a;}if(Id(i,m,n,j,g,c,b,y[k+12>>2],y[k+8>>2],k+16|0,32)){break a}if(h){t(e,d,h);}a=e+h|0;w[a|0]=36;c=(h^-1)+102|0;f=a+1|0;a=0;while(1){d:{b=f;d=a;if(d>>>0>31){g=f;break d}h=d+1|0;a=31-d|0;i=a>>>0>=2?2:a;a=h+i|0;g=0;j=0;l=k+16|0;f=z[l+d|0];e:{if(!i){break e}f=z[h+l|0]<<8|f;d=d+2|0;if((d|0)==(a|0)){break e}j=1;f=z[d+l|0]<<16|f;}if(!c){break d}w[b|0]=z[(f&63)+1024|0];if((c|0)==1){break d}w[b+1|0]=z[(f>>>6&63)+1024|0];i=b+c|0;d=b+2|0;f:{if((a|0)==(h|0)){break f}if((c|0)==2){break d}w[b+2|0]=z[(f>>>12&63)+1024|0];d=b+3|0;if(!j){break f}if((c|0)==3){break d}w[b+3|0]=z[(f>>>18|0)+1024|0];d=b+4|0;}f=d;c=i-f|0;if(f){continue}}break}ja(k+16|0,32);f=0;if(!g|e+102>>>0<=g>>>0){break a}w[g|0]=0;f=e;}T=k+48|0;return f}function qa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;c=y[b+40>>2];e=y[b+4>>2];f=y[b+44>>2];g=y[b+8>>2];h=y[b+48>>2];i=y[b+12>>2];j=y[b+52>>2];k=y[b+16>>2];l=y[b+56>>2];m=y[b+20>>2];n=y[b+60>>2];o=y[b+24>>2];d=b- -64|0;p=y[d>>2];q=y[b+28>>2];r=y[b+68>>2];s=y[b+32>>2];t=y[b+72>>2];u=y[b>>2];y[a+36>>2]=y[b+36>>2]+y[b+76>>2];y[a+32>>2]=s+t;y[a+28>>2]=q+r;y[a+24>>2]=o+p;y[a+20>>2]=m+n;y[a+16>>2]=k+l;y[a+12>>2]=i+j;y[a+8>>2]=g+h;y[a+4>>2]=e+f;y[a>>2]=c+u;c=y[b+40>>2];e=y[b+4>>2];f=y[b+44>>2];g=y[b+8>>2];h=y[b+48>>2];i=y[b+12>>2];j=y[b+52>>2];k=y[b+16>>2];l=y[b+56>>2];m=y[b+20>>2];n=y[b+60>>2];o=y[b+24>>2];d=y[d>>2];p=y[b+28>>2];q=y[b+68>>2];r=y[b+32>>2];s=y[b+72>>2];t=y[b>>2];y[a+76>>2]=y[b+76>>2]-y[b+36>>2];y[a+72>>2]=s-r;y[a+68>>2]=q-p;y[a- -64>>2]=d-o;y[a+60>>2]=n-m;y[a+56>>2]=l-k;y[a+52>>2]=j-i;y[a+48>>2]=h-g;y[a+44>>2]=f-e;y[a+40>>2]=c-t;c=y[b+84>>2];y[a+80>>2]=y[b+80>>2];y[a+84>>2]=c;c=y[b+92>>2];y[a+88>>2]=y[b+88>>2];y[a+92>>2]=c;c=y[b+100>>2];y[a+96>>2]=y[b+96>>2];y[a+100>>2]=c;c=y[b+108>>2];y[a+104>>2]=y[b+104>>2];y[a+108>>2]=c;c=y[b+116>>2];y[a+112>>2]=y[b+112>>2];y[a+116>>2]=c;ga(a+120|0,b+120|0,1680);}function jc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0;c=y[a+56>>2];d=y[a+60>>2];if(c|d){f=a- -64|0;w[f+c|0]=1;l=c+1|0;d=l?d:d+1|0;a:{if(!d&l>>>0>15|d){break a}d=15-c|0;if(!d){break a}o((a+c|0)+65|0,0,d);}w[a+80|0]=1;hc(a,f,16,0);}l=y[a+52>>2];j=y[a+48>>2];f=y[a+44>>2];c=y[a+24>>2];g=y[a+28>>2]+(c>>>26|0)|0;e=y[a+32>>2]+(g>>>26|0)|0;m=y[a+36>>2]+(e>>>26|0)|0;h=y[a+20>>2]+E(m>>>26|0,5)|0;i=h&67108863;d=i+5|0;p=e&67108863;k=g&67108863;c=(c&67108863)+(h>>>26|0)|0;h=c+(d>>>26|0)|0;q=k+(h>>>26|0)|0;r=p+(q>>>26|0)|0;s=(m&67108863)+(r>>>26|0)|0;e=s-67108864|0;g=e>>31;n=h;h=(e>>>31|0)-1|0;e=h&67108863;c=c&g|n&e;i=c<<26|(d&e|g&i);d=i+y[a+40>>2]|0;w[b|0]=d;w[b+1|0]=d>>>8;w[b+2|0]=d>>>16;w[b+3|0]=d>>>24;i=d>>>0>>0;d=0;k=g&k|e&q;c=k<<20|c>>>6;n=c;c=c+f|0;d=n>>>0>c>>>0?1:d;f=c;c=c+i|0;d=f>>>0>c>>>0?d+1|0:d;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;c=0;e=g&p|e&r;f=e<<14|k>>>12;j=f+j|0;f=f>>>0>j>>>0?1:c;c=j;j=d;c=c+d|0;d=f;d=c>>>0>>0?d+1|0:d;w[b+8|0]=c;w[b+9|0]=c>>>8;w[b+10|0]=c>>>16;w[b+11|0]=c>>>24;c=(h&s|g&m)<<8|e>>>18;c=c+l|0;d=c+d|0;w[b+12|0]=d;w[b+13|0]=d>>>8;w[b+14|0]=d>>>16;w[b+15|0]=d>>>24;ja(a,88);}function Cd(a,b,c){var d=0,e=0;d=T-160|0;T=d;w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];e=z[b+31|0];if(c){w[a|0]=z[a|0]&248;e=e|64;}w[a+31|0]=e&127;jb(d,a);Wa(a,d);c=-1;if(!((z[a+31|0]&127|(z[a+30|0]|(z[a+29|0]|(z[a+28|0]|(z[a+27|0]|(z[a+26|0]|(z[a+25|0]|(z[a+24|0]|(z[a+23|0]|(z[a+22|0]|(z[a+21|0]|(z[a+20|0]|(z[a+19|0]|(z[a+18|0]|(z[a+17|0]|(z[a+16|0]|(z[a+15|0]|(z[a+14|0]|(z[a+13|0]|(z[a+12|0]|(z[a+11|0]|(z[a+10|0]|(z[a+9|0]|(z[a+8|0]|(z[a+7|0]|(z[a+6|0]|(z[a+5|0]|(z[a+4|0]|(z[a+3|0]|(z[a+2|0]|(z[a+1|0]|z[a|0]^1)))))))))))))))))))))))))))))))-1&256)){c=ya(b,32)?-1:0;}T=d+160|0;return c}function Ea(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-16|0;T=d;w[d+15|0]=0;e=-1;if(!(X[y[9954]](a,b,c)|0)){w[d+15|0]=z[a|0]|z[d+15|0];w[d+15|0]=z[a+1|0]|z[d+15|0];w[d+15|0]=z[a+2|0]|z[d+15|0];w[d+15|0]=z[a+3|0]|z[d+15|0];w[d+15|0]=z[a+4|0]|z[d+15|0];w[d+15|0]=z[a+5|0]|z[d+15|0];w[d+15|0]=z[a+6|0]|z[d+15|0];w[d+15|0]=z[a+7|0]|z[d+15|0];w[d+15|0]=z[a+8|0]|z[d+15|0];w[d+15|0]=z[a+9|0]|z[d+15|0];w[d+15|0]=z[a+10|0]|z[d+15|0];w[d+15|0]=z[a+11|0]|z[d+15|0];w[d+15|0]=z[a+12|0]|z[d+15|0];w[d+15|0]=z[a+13|0]|z[d+15|0];w[d+15|0]=z[a+14|0]|z[d+15|0];w[d+15|0]=z[a+15|0]|z[d+15|0];w[d+15|0]=z[a+16|0]|z[d+15|0];w[d+15|0]=z[a+17|0]|z[d+15|0];w[d+15|0]=z[a+18|0]|z[d+15|0];w[d+15|0]=z[a+19|0]|z[d+15|0];w[d+15|0]=z[a+20|0]|z[d+15|0];w[d+15|0]=z[a+21|0]|z[d+15|0];w[d+15|0]=z[a+22|0]|z[d+15|0];w[d+15|0]=z[a+23|0]|z[d+15|0];w[d+15|0]=z[a+24|0]|z[d+15|0];w[d+15|0]=z[a+25|0]|z[d+15|0];w[d+15|0]=z[a+26|0]|z[d+15|0];w[d+15|0]=z[a+27|0]|z[d+15|0];w[d+15|0]=z[a+28|0]|z[d+15|0];w[d+15|0]=z[a+29|0]|z[d+15|0];w[d+15|0]=z[a+30|0]|z[d+15|0];w[d+15|0]=z[a+31|0]|z[d+15|0];e=(z[d+15|0]<<23)-8388608>>31;}T=d+16|0;return e|0}function Xc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if((d|0)==1|d>>>0>1){y[10172]=22;break b}d=T-128|0;T=d;y[d+64>>2]=0;y[d+56>>2]=0;y[d+60>>2]=0;y[d+48>>2]=0;y[d+52>>2]=0;y[d+40>>2]=0;y[d+44>>2]=0;y[d+32>>2]=0;y[d+36>>2]=0;y[d+24>>2]=0;y[d+28>>2]=0;y[d+16>>2]=0;y[d+20>>2]=0;f=Ha(a);y[d+28>>2]=f;y[d+44>>2]=f;y[d+12>>2]=f;g=Da(f);y[d+40>>2]=g;h=Da(f);y[d+24>>2]=h;i=Da(f);y[d+8>>2]=i;c:{d:{if(!i|(!g|!h)){break d}f=Da(f);if(!f){break d}a=oe(d+8|0,a,e);if(a){ta(y[d+40>>2]);ta(y[d+24>>2]);ta(y[d+8>>2]);ta(f);break c}i=y[d+28>>2];j=y[d+24>>2];a=y[d+60>>2];k=y[d+52>>2];l=y[d+48>>2];g=y[d+12>>2];za(f,g);h=Da(g);e:{if(!h){a=-22;break e}y[d+92>>2]=0;y[d+96>>2]=0;y[d+88>>2]=i;y[d+84>>2]=j;y[d+80>>2]=c;y[d+76>>2]=b;y[d+72>>2]=g;y[d+68>>2]=h;y[d+100>>2]=0;y[d+104>>2]=0;y[d+124>>2]=0;y[d+120>>2]=a;y[d+116>>2]=a;y[d+112>>2]=k;y[d+108>>2]=l;a=Sb(d+68|0,e);if(!(a|!g)){t(f,h,g);}ja(h,g);ta(h);}ta(y[d+40>>2]);ta(y[d+24>>2]);if(!a){a=$a(f,y[d+8>>2],y[d+12>>2])?-35:0;}ta(f);ta(y[d+8>>2]);break c}ta(g);ta(h);ta(i);a=-22;}T=d+128|0;b=a;if(!a){break a}if((a|0)!=-35){break b}y[10172]=28;}b=-1;}return b}function db(a,b){a=a|0;b=b|0;var c=0;c=T-16|0;y[c+12>>2]=a;y[c+8>>2]=b;x[c+6>>1]=0;x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]]^z[y[c+8>>2]];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+1|0]^z[y[c+8>>2]+1|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+2|0]^z[y[c+8>>2]+2|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+3|0]^z[y[c+8>>2]+3|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+4|0]^z[y[c+8>>2]+4|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+5|0]^z[y[c+8>>2]+5|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+6|0]^z[y[c+8>>2]+6|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+7|0]^z[y[c+8>>2]+7|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+8|0]^z[y[c+8>>2]+8|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+9|0]^z[y[c+8>>2]+9|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+10|0]^z[y[c+8>>2]+10|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+11|0]^z[y[c+8>>2]+11|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+12|0]^z[y[c+8>>2]+12|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+13|0]^z[y[c+8>>2]+13|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+14|0]^z[y[c+8>>2]+14|0];x[c+6>>1]=A[c+6>>1]|z[y[c+12>>2]+15|0]^z[y[c+8>>2]+15|0];x[c+6>>1]=A[c+6>>1];x[c+6>>1]=A[c+6>>1]-1;x[c+6>>1]=A[20608]>>>2^A[c+6>>1]>>>15;return A[c+6>>1]-1|0}function pa(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=y[b+32>>2];g=y[b+28>>2];h=y[b+24>>2];i=y[b+20>>2];j=y[b+16>>2];k=y[b+12>>2];c=y[b+4>>2];d=y[b>>2];e=y[b+36>>2];b=y[b+8>>2];d=E((f+(g+(h+(i+(j+(k+((c+(d+(E(e,19)+16777216>>>25|0)>>26)>>25)+b>>26)>>25)>>26)>>25)>>26)>>25)>>26)+e>>25,19)+d|0;w[a|0]=d;w[a+2|0]=d>>>16;w[a+1|0]=d>>>8;c=c+(d>>26)|0;w[a+5|0]=c>>>14;w[a+4|0]=c>>>6;w[a+3|0]=d>>>24&3|c<<2;b=b+(c>>25)|0;w[a+8|0]=b>>>13;w[a+7|0]=b>>>5;w[a+6|0]=b<<3|(c&29360128)>>>22;d=(b>>26)+k|0;w[a+11|0]=d>>>11;w[a+10|0]=d>>>3;w[a+9|0]=d<<5|(b&65011712)>>>21;c=(d>>25)+j|0;w[a+15|0]=c>>>18;w[a+14|0]=c>>>10;w[a+13|0]=c>>>2;b=(c>>26)+i|0;w[a+16|0]=b;w[a+12|0]=c<<6|(d&33030144)>>>19;w[a+18|0]=b>>>16;w[a+17|0]=b>>>8;c=(b>>25)+h|0;w[a+21|0]=c>>>15;w[a+20|0]=c>>>7;w[a+19|0]=b>>>24&1|c<<1;b=(c>>26)+g|0;w[a+24|0]=b>>>13;w[a+23|0]=b>>>5;w[a+22|0]=b<<3|(c&58720256)>>>23;c=(b>>25)+f|0;w[a+27|0]=c>>>12;w[a+26|0]=c>>>4;w[a+25|0]=c<<4|(b&31457280)>>>21;b=e+(c>>26)|0;w[a+30|0]=b>>>10;w[a+29|0]=b>>>2;w[a+31|0]=(b&33292288)>>>18;w[a+28|0]=b<<6|(c&66060288)>>>20;}function Va(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=T-192|0;T=g;if(c>>>0>=129){Za(a);va(a,b,c,0);Ca(a,g);c=64;b=g;}Za(a);o(g- -64|0,54,128);a:{if(!c){break a}k=c&3;if(c>>>0>=4){f=c&252;while(1){h=g- -64|0;e=h+d|0;w[e|0]=z[e|0]^z[b+d|0];e=d|1;l=e+h|0;w[l|0]=z[l|0]^z[b+e|0];e=d|2;l=e+h|0;w[l|0]=z[l|0]^z[b+e|0];e=h;h=d|3;e=e+h|0;w[e|0]=z[e|0]^z[b+h|0];d=d+4|0;i=i+4|0;if((f|0)!=(i|0)){continue}break}if(!k){break a}}while(1){i=(g- -64|0)+d|0;w[i|0]=z[i|0]^z[b+d|0];d=d+1|0;j=j+1|0;if((k|0)!=(j|0)){continue}break}}d=g- -64|0;va(a,d,128,0);k=a+208|0;Za(k);o(d,92,128);b:{if(!c){break b}h=c&3;j=0;d=0;if(c>>>0>=4){c=c&252;i=0;while(1){a=g- -64|0;f=a+d|0;w[f|0]=z[f|0]^z[b+d|0];f=d|1;e=f+a|0;w[e|0]=z[e|0]^z[b+f|0];f=d|2;e=f+a|0;w[e|0]=z[e|0]^z[b+f|0];e=a;a=d|3;f=e+a|0;w[f|0]=z[f|0]^z[a+b|0];d=d+4|0;i=i+4|0;if((c|0)!=(i|0)){continue}break}if(!h){break b}}while(1){a=(g- -64|0)+d|0;w[a|0]=z[a|0]^z[b+d|0];d=d+1|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}a=g- -64|0;va(k,a,128,0);ja(a,128);ja(g,64);T=g+192|0;return 0}function mh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b;d=z[c+32|0]|z[c+33|0]<<8|(z[c+34|0]<<16|z[c+35|0]<<24);e=z[c+36|0]|z[c+37|0]<<8|(z[c+38|0]<<16|z[c+39|0]<<24);f=z[c+40|0]|z[c+41|0]<<8|(z[c+42|0]<<16|z[c+43|0]<<24);g=z[c+44|0]|z[c+45|0]<<8|(z[c+46|0]<<16|z[c+47|0]<<24);h=z[c+48|0]|z[c+49|0]<<8|(z[c+50|0]<<16|z[c+51|0]<<24);b=z[c+52|0]|z[c+53|0]<<8|(z[c+54|0]<<16|z[c+55|0]<<24);i=z[c+60|0]|z[c+61|0]<<8|(z[c+62|0]<<16|z[c+63|0]<<24);c=z[c+56|0]|z[c+57|0]<<8|(z[c+58|0]<<16|z[c+59|0]<<24);w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=i;w[a+29|0]=i>>>8;w[a+30|0]=i>>>16;w[a+31|0]=i>>>24;w[a+16|0]=h;w[a+17|0]=h>>>8;w[a+18|0]=h>>>16;w[a+19|0]=h>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;w[a+8|0]=f;w[a+9|0]=f>>>8;w[a+10|0]=f>>>16;w[a+11|0]=f>>>24;w[a+12|0]=g;w[a+13|0]=g>>>8;w[a+14|0]=g>>>16;w[a+15|0]=g>>>24;w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=e;w[a+5|0]=e>>>8;w[a+6|0]=e>>>16;w[a+7|0]=e>>>24;return 0}function nh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;c=b;d=z[c|0]|z[c+1|0]<<8|(z[c+2|0]<<16|z[c+3|0]<<24);e=z[c+4|0]|z[c+5|0]<<8|(z[c+6|0]<<16|z[c+7|0]<<24);f=z[c+8|0]|z[c+9|0]<<8|(z[c+10|0]<<16|z[c+11|0]<<24);g=z[c+12|0]|z[c+13|0]<<8|(z[c+14|0]<<16|z[c+15|0]<<24);h=z[c+16|0]|z[c+17|0]<<8|(z[c+18|0]<<16|z[c+19|0]<<24);b=z[c+20|0]|z[c+21|0]<<8|(z[c+22|0]<<16|z[c+23|0]<<24);i=z[c+28|0]|z[c+29|0]<<8|(z[c+30|0]<<16|z[c+31|0]<<24);c=z[c+24|0]|z[c+25|0]<<8|(z[c+26|0]<<16|z[c+27|0]<<24);w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=i;w[a+29|0]=i>>>8;w[a+30|0]=i>>>16;w[a+31|0]=i>>>24;w[a+16|0]=h;w[a+17|0]=h>>>8;w[a+18|0]=h>>>16;w[a+19|0]=h>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;w[a+8|0]=f;w[a+9|0]=f>>>8;w[a+10|0]=f>>>16;w[a+11|0]=f>>>24;w[a+12|0]=g;w[a+13|0]=g>>>8;w[a+14|0]=g>>>16;w[a+15|0]=g>>>24;w[a|0]=d;w[a+1|0]=d>>>8;w[a+2|0]=d>>>16;w[a+3|0]=d>>>24;w[a+4|0]=e;w[a+5|0]=e>>>8;w[a+6|0]=e>>>16;w[a+7|0]=e>>>24;return 0}function pi(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=T+-64|0;T=h;if(c|d){y[h+8>>2]=2036477234;y[h+12>>2]=1797285236;y[h>>2]=1634760805;y[h+4>>2]=857760878;y[h+16>>2]=z[g|0]|z[g+1|0]<<8|(z[g+2|0]<<16|z[g+3|0]<<24);y[h+20>>2]=z[g+4|0]|z[g+5|0]<<8|(z[g+6|0]<<16|z[g+7|0]<<24);y[h+24>>2]=z[g+8|0]|z[g+9|0]<<8|(z[g+10|0]<<16|z[g+11|0]<<24);y[h+28>>2]=z[g+12|0]|z[g+13|0]<<8|(z[g+14|0]<<16|z[g+15|0]<<24);y[h+32>>2]=z[g+16|0]|z[g+17|0]<<8|(z[g+18|0]<<16|z[g+19|0]<<24);y[h+36>>2]=z[g+20|0]|z[g+21|0]<<8|(z[g+22|0]<<16|z[g+23|0]<<24);y[h+40>>2]=z[g+24|0]|z[g+25|0]<<8|(z[g+26|0]<<16|z[g+27|0]<<24);g=z[g+28|0]|z[g+29|0]<<8|(z[g+30|0]<<16|z[g+31|0]<<24);y[h+48>>2]=f;y[h+44>>2]=g;y[h+52>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[h+56>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[h+60>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);_b(h,b,a,c,d);ja(h,64);}T=h- -64|0;return 0}function ri(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T+-64|0;T=f;if(b|c){y[f+8>>2]=2036477234;y[f+12>>2]=1797285236;y[f>>2]=1634760805;y[f+4>>2]=857760878;y[f+16>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+20>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f+24>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+28>>2]=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+32>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+36>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+40>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+48>>2]=0;y[f+44>>2]=e;y[f+52>>2]=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);y[f+56>>2]=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);y[f+60>>2]=z[d+8|0]|z[d+9|0]<<8|(z[d+10|0]<<16|z[d+11|0]<<24);if(b){o(a,0,b);}_b(f,a,a,b,c);ja(f,64);}T=f- -64|0;return 0}function Vf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=T;f=g-192&-64;T=f;y[f+64>>2]=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))&67108863;y[f+68>>2]=(z[e+3|0]|z[e+4|0]<<8|(z[e+5|0]<<16|z[e+6|0]<<24))>>>2&67108611;y[f+72>>2]=(z[e+6|0]|z[e+7|0]<<8|(z[e+8|0]<<16|z[e+9|0]<<24))>>>4&67092735;y[f+76>>2]=(z[e+9|0]|z[e+10|0]<<8|(z[e+11|0]<<16|z[e+12|0]<<24))>>>6&66076671;h=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+84>>2]=0;y[f+88>>2]=0;y[f+92>>2]=0;y[f+96>>2]=0;y[f+100>>2]=0;y[f+80>>2]=h>>>8&1048575;y[f+104>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+108>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+112>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);w[f+144|0]=0;y[f+120>>2]=0;y[f+124>>2]=0;y[f+116>>2]=e;e=f- -64|0;kc(e,b,c,d);b=f+48|0;jc(e,b);a=db(a,b);T=g;return a|0}function jf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=c;c=d;k=g|0;d=T;g=d;f=d-512&-64;T=f;d=-1;h=f- -64|0;i=f+32|0;if(!nb(h,i)){d=f+128|0;Ja(d,0,0,24);oa(d,h,32,0);oa(d,e,32,0);j=f+96|0;Ia(d,j,24);d=$d(a+32|0,b,k,c,j,e,i);b=y[f+92>>2];c=y[f+88>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[f+84>>2];c=y[f+80>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[f+76>>2];c=y[f+72>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[f+68>>2];c=y[f+64>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;ja(i,32);ja(h,32);ja(j,24);}T=g;return d|0}function Wf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=c;c=d;k=g|0;d=T;g=d;f=d-512&-64;T=f;d=-1;h=f- -64|0;i=f+32|0;if(!nb(h,i)){d=f+128|0;Ja(d,0,0,24);oa(d,h,32,0);oa(d,e,32,0);j=f+96|0;Ia(d,j,24);d=Bd(a+32|0,b,k,c,j,e,i);b=y[f+92>>2];c=y[f+88>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[f+84>>2];c=y[f+80>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[f+76>>2];c=y[f+72>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[f+68>>2];c=y[f+64>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;ja(i,32);ja(h,32);ja(j,24);}T=g;return d|0}function qi(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=T+-64|0;T=i;if(c|d){y[i+8>>2]=2036477234;y[i+12>>2]=1797285236;y[i>>2]=1634760805;y[i+4>>2]=857760878;y[i+16>>2]=z[h|0]|z[h+1|0]<<8|(z[h+2|0]<<16|z[h+3|0]<<24);y[i+20>>2]=z[h+4|0]|z[h+5|0]<<8|(z[h+6|0]<<16|z[h+7|0]<<24);y[i+24>>2]=z[h+8|0]|z[h+9|0]<<8|(z[h+10|0]<<16|z[h+11|0]<<24);y[i+28>>2]=z[h+12|0]|z[h+13|0]<<8|(z[h+14|0]<<16|z[h+15|0]<<24);y[i+32>>2]=z[h+16|0]|z[h+17|0]<<8|(z[h+18|0]<<16|z[h+19|0]<<24);y[i+36>>2]=z[h+20|0]|z[h+21|0]<<8|(z[h+22|0]<<16|z[h+23|0]<<24);y[i+40>>2]=z[h+24|0]|z[h+25|0]<<8|(z[h+26|0]<<16|z[h+27|0]<<24);h=z[h+28|0]|z[h+29|0]<<8|(z[h+30|0]<<16|z[h+31|0]<<24);y[i+48>>2]=f;y[i+52>>2]=g;y[i+44>>2]=h;y[i+56>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[i+60>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);_b(i,b,a,c,d);ja(i,64);}T=i- -64|0;return 0}function si(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T+-64|0;T=f;if(b|c){y[f+8>>2]=2036477234;y[f+12>>2]=1797285236;y[f>>2]=1634760805;y[f+4>>2]=857760878;y[f+16>>2]=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);y[f+20>>2]=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[f+24>>2]=z[e+8|0]|z[e+9|0]<<8|(z[e+10|0]<<16|z[e+11|0]<<24);y[f+28>>2]=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+32>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+36>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+40>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);y[f+48>>2]=0;y[f+52>>2]=0;y[f+44>>2]=e;y[f+56>>2]=z[d|0]|z[d+1|0]<<8|(z[d+2|0]<<16|z[d+3|0]<<24);y[f+60>>2]=z[d+4|0]|z[d+5|0]<<8|(z[d+6|0]<<16|z[d+7|0]<<24);if(b){o(a,0,b);}_b(f,a,a,b,c);ja(f,64);}T=f- -64|0;return 0}function og(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;g=T;f=g-128&-64;T=f;y[f>>2]=(z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24))&67108863;y[f+4>>2]=(z[e+3|0]|z[e+4|0]<<8|(z[e+5|0]<<16|z[e+6|0]<<24))>>>2&67108611;y[f+8>>2]=(z[e+6|0]|z[e+7|0]<<8|(z[e+8|0]<<16|z[e+9|0]<<24))>>>4&67092735;y[f+12>>2]=(z[e+9|0]|z[e+10|0]<<8|(z[e+11|0]<<16|z[e+12|0]<<24))>>>6&66076671;h=z[e+12|0]|z[e+13|0]<<8|(z[e+14|0]<<16|z[e+15|0]<<24);y[f+20>>2]=0;y[f+24>>2]=0;y[f+28>>2]=0;y[f+32>>2]=0;y[f+36>>2]=0;y[f+16>>2]=h>>>8&1048575;y[f+40>>2]=z[e+16|0]|z[e+17|0]<<8|(z[e+18|0]<<16|z[e+19|0]<<24);y[f+44>>2]=z[e+20|0]|z[e+21|0]<<8|(z[e+22|0]<<16|z[e+23|0]<<24);y[f+48>>2]=z[e+24|0]|z[e+25|0]<<8|(z[e+26|0]<<16|z[e+27|0]<<24);e=z[e+28|0]|z[e+29|0]<<8|(z[e+30|0]<<16|z[e+31|0]<<24);w[f+80|0]=0;y[f+56>>2]=0;y[f+60>>2]=0;y[f+52>>2]=e;kc(f,b,c,d);jc(f,a);T=g;return 0}function Bb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=T-352|0;T=h;Aa(h,f,g,0);a:{b:{if(!(!((!e&a-c>>>0>>0|(e|0)!=0)&a>>>0>c>>>0)&(!e&c-a>>>0>=d>>>0|a>>>0>=c>>>0))){if(d){t(a,c,d);}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;g=(e|0)!=0;c=g|!e&d>>>0>=32;i=c?32:d;k=c?0:e;g=g|!e&d>>>0>32;c=a;break b}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;j=(e|0)!=0;g=j|!e&d>>>0>=32;i=g?32:d;k=g?0:e;g=j|!e&d>>>0>32;if(d|e){break b}m=1;break a}if(i){t(h- -64|0,c,i);}m=0;}l=h+32|0;j=k;n=i+32|0;j=n>>>0<32?j+1|0:j;o=j;j=f+16|0;Zb(l,l,n,o,j,h);Ga(h+96|0,l);if(!(!i|m)){t(a,h- -64|0,i);}ja(h+32|0,64);if(g){hb(a+i|0,c+i|0,d-i|0,e-(k+(d>>>0>>0)|0)|0,j,1,0,h);}ja(h,32);c=h+96|0;la(c,a,d,e);Fa(c,b);ja(c,256);T=h+352|0;return 0}function Ab(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=T-352|0;T=h;Sa(h,f,g,0);a:{b:{if(!(!((!e&a-c>>>0>>0|(e|0)!=0)&a>>>0>c>>>0)&(!e&c-a>>>0>=d>>>0|a>>>0>=c>>>0))){if(d){t(a,c,d);}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;g=(e|0)!=0;c=g|!e&d>>>0>=32;i=c?32:d;k=c?0:e;g=g|!e&d>>>0>32;c=a;break b}y[h+56>>2]=0;y[h+60>>2]=0;y[h+48>>2]=0;y[h+52>>2]=0;y[h+40>>2]=0;y[h+44>>2]=0;y[h+32>>2]=0;y[h+36>>2]=0;j=(e|0)!=0;g=j|!e&d>>>0>=32;i=g?32:d;k=g?0:e;g=j|!e&d>>>0>32;if(d|e){break b}m=1;break a}if(i){t(h- -64|0,c,i);}m=0;}l=h+32|0;j=k;n=i+32|0;j=n>>>0<32?j+1|0:j;o=j;j=f+16|0;Gb(l,l,n,o,j,h);Ga(h+96|0,l);if(!(!i|m)){t(a,h- -64|0,i);}ja(h+32|0,64);if(g){sb(a+i|0,c+i|0,d-i|0,e-(k+(d>>>0>>0)|0)|0,j,1,0,h);}ja(h,32);c=h+96|0;la(c,a,d,e);Fa(c,b);ja(c,256);T=h+352|0;return 0}function Qf(a,b){a=a|0;b=b|0;var c=0;y[a>>2]=(z[b|0]|z[b+1|0]<<8|(z[b+2|0]<<16|z[b+3|0]<<24))&67108863;y[a+4>>2]=(z[b+3|0]|z[b+4|0]<<8|(z[b+5|0]<<16|z[b+6|0]<<24))>>>2&67108611;y[a+8>>2]=(z[b+6|0]|z[b+7|0]<<8|(z[b+8|0]<<16|z[b+9|0]<<24))>>>4&67092735;y[a+12>>2]=(z[b+9|0]|z[b+10|0]<<8|(z[b+11|0]<<16|z[b+12|0]<<24))>>>6&66076671;c=z[b+12|0]|z[b+13|0]<<8|(z[b+14|0]<<16|z[b+15|0]<<24);y[a+20>>2]=0;y[a+24>>2]=0;y[a+28>>2]=0;y[a+32>>2]=0;y[a+36>>2]=0;y[a+16>>2]=c>>>8&1048575;y[a+40>>2]=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);y[a+44>>2]=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);y[a+48>>2]=z[b+24|0]|z[b+25|0]<<8|(z[b+26|0]<<16|z[b+27|0]<<24);b=z[b+28|0]|z[b+29|0]<<8|(z[b+30|0]<<16|z[b+31|0]<<24);w[a+80|0]=0;y[a+56>>2]=0;y[a+60>>2]=0;y[a+52>>2]=b;return 0}function Pg(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-320|0;T=d;e=-1;if(!ib(d,c)){w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];w[a+31|0]=z[b+31|0]&127;b=d+160|0;Nc(b,a,d);xb(a,b);e=ya(a,32)?-1:0;}T=d+320|0;return e|0}function wd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-480|0;T=f;Va(f,e,32);Na(f,b,c,d);Ya(f,f+416|0);b=y[f+444>>2];c=y[f+440>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;b=y[f+436>>2];c=y[f+432>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[f+428>>2];c=y[f+424>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[f+420>>2];c=y[f+416>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;T=f+480|0;return 0}function Og(a,b){a=a|0;b=b|0;var c=0;c=T-160|0;T=c;w[a|0]=z[b|0];w[a+1|0]=z[b+1|0];w[a+2|0]=z[b+2|0];w[a+3|0]=z[b+3|0];w[a+4|0]=z[b+4|0];w[a+5|0]=z[b+5|0];w[a+6|0]=z[b+6|0];w[a+7|0]=z[b+7|0];w[a+8|0]=z[b+8|0];w[a+9|0]=z[b+9|0];w[a+10|0]=z[b+10|0];w[a+11|0]=z[b+11|0];w[a+12|0]=z[b+12|0];w[a+13|0]=z[b+13|0];w[a+14|0]=z[b+14|0];w[a+15|0]=z[b+15|0];w[a+16|0]=z[b+16|0];w[a+17|0]=z[b+17|0];w[a+18|0]=z[b+18|0];w[a+19|0]=z[b+19|0];w[a+20|0]=z[b+20|0];w[a+21|0]=z[b+21|0];w[a+22|0]=z[b+22|0];w[a+23|0]=z[b+23|0];w[a+24|0]=z[b+24|0];w[a+25|0]=z[b+25|0];w[a+26|0]=z[b+26|0];w[a+27|0]=z[b+27|0];w[a+28|0]=z[b+28|0];w[a+29|0]=z[b+29|0];w[a+30|0]=z[b+30|0];w[a+31|0]=z[b+31|0]&127;jb(c,a);xb(a,c);a=ya(a,32);T=c+160|0;return (a?-1:0)|0}function oh(a,b){a=a|0;b=b|0;var c=0,d=0;d=T+-64|0;T=d;rb(d,b,32,0);w[d|0]=z[d|0]&248;w[d+31|0]=z[d+31|0]&63|64;b=y[d+20>>2];c=y[d+16>>2];w[a+16|0]=c;w[a+17|0]=c>>>8;w[a+18|0]=c>>>16;w[a+19|0]=c>>>24;w[a+20|0]=b;w[a+21|0]=b>>>8;w[a+22|0]=b>>>16;w[a+23|0]=b>>>24;b=y[d+12>>2];c=y[d+8>>2];w[a+8|0]=c;w[a+9|0]=c>>>8;w[a+10|0]=c>>>16;w[a+11|0]=c>>>24;w[a+12|0]=b;w[a+13|0]=b>>>8;w[a+14|0]=b>>>16;w[a+15|0]=b>>>24;b=y[d+4>>2];c=y[d>>2];w[a|0]=c;w[a+1|0]=c>>>8;w[a+2|0]=c>>>16;w[a+3|0]=c>>>24;w[a+4|0]=b;w[a+5|0]=b>>>8;w[a+6|0]=b>>>16;w[a+7|0]=b>>>24;b=y[d+28>>2];c=y[d+24>>2];w[a+24|0]=c;w[a+25|0]=c>>>8;w[a+26|0]=c>>>16;w[a+27|0]=c>>>24;w[a+28|0]=b;w[a+29|0]=b>>>8;w[a+30|0]=b>>>16;w[a+31|0]=b>>>24;ja(d,64);T=d- -64|0;return 0}function tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=T+-64|0;T=e;rb(e,c,32,0);c=y[e+28>>2];d=y[e+24>>2];w[b+24|0]=d;w[b+25|0]=d>>>8;w[b+26|0]=d>>>16;w[b+27|0]=d>>>24;w[b+28|0]=c;w[b+29|0]=c>>>8;w[b+30|0]=c>>>16;w[b+31|0]=c>>>24;c=y[e+20>>2];d=y[e+16>>2];w[b+16|0]=d;w[b+17|0]=d>>>8;w[b+18|0]=d>>>16;w[b+19|0]=d>>>24;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;c=y[e+12>>2];d=y[e+8>>2];w[b+8|0]=d;w[b+9|0]=d>>>8;w[b+10|0]=d>>>16;w[b+11|0]=d>>>24;w[b+12|0]=c;w[b+13|0]=c>>>8;w[b+14|0]=c>>>16;w[b+15|0]=c>>>24;c=y[e+4>>2];d=y[e>>2];w[b|0]=d;w[b+1|0]=d>>>8;w[b+2|0]=d>>>16;w[b+3|0]=d>>>24;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;ja(e,64);a=wb(a,b);T=e- -64|0;return a|0}function xi(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0;j=T;l=j;j=j-192&-32;T=j;Qe(i,h,j- -64|0);h=0;if(g>>>0>63){i=64;while(1){Pe(f+h|0,j- -64|0);h=i;i=i- -64|0;if(i>>>0<=g>>>0){continue}break}}i=h|32;if(i>>>0<=g>>>0){while(1){$b(f+h|0,j- -64|0);h=i;i=i+32|0;if(i>>>0<=g>>>0){continue}break}}i=g&31;if(i){k=32-i|0;if(k){o(i|j+32,0,k);}if(i){t(j+32|0,f+h|0,i);}$b(j+32|0,j- -64|0);}f=32;h=0;if(e>>>0>=32){while(1){Oe(a+h|0,d+h|0,j- -64|0);h=f;f=f+32|0;if(f>>>0<=e>>>0){continue}break}}f=e&31;a:{if(!f){break a}i=32-f|0;if(i){o(f|j+32,0,i);}i=!f;if(!i){t(j+32|0,d+h|0,f);}Oe(j,j+32|0,j- -64|0);if(i){break a}t(a+h|0,j,f);}Ne(b,c,g,e,j- -64|0);T=l;return 0}function Ng(a,b){a=a|0;b=b|0;var c=0,d=0;d=T+-64|0;T=d;Ya(a,d);c=y[d+28>>2];a=y[d+24>>2];w[b+24|0]=a;w[b+25|0]=a>>>8;w[b+26|0]=a>>>16;w[b+27|0]=a>>>24;w[b+28|0]=c;w[b+29|0]=c>>>8;w[b+30|0]=c>>>16;w[b+31|0]=c>>>24;c=y[d+20>>2];a=y[d+16>>2];w[b+16|0]=a;w[b+17|0]=a>>>8;w[b+18|0]=a>>>16;w[b+19|0]=a>>>24;w[b+20|0]=c;w[b+21|0]=c>>>8;w[b+22|0]=c>>>16;w[b+23|0]=c>>>24;c=y[d+12>>2];a=y[d+8>>2];w[b+8|0]=a;w[b+9|0]=a>>>8;w[b+10|0]=a>>>16;w[b+11|0]=a>>>24;w[b+12|0]=c;w[b+13|0]=c>>>8;w[b+14|0]=c>>>16;w[b+15|0]=c>>>24;c=y[d+4>>2];a=y[d>>2];w[b|0]=a;w[b+1|0]=a>>>8;w[b+2|0]=a>>>16;w[b+3|0]=a>>>24;w[b+4|0]=c;w[b+5|0]=c>>>8;w[b+6|0]=c>>>16;w[b+7|0]=c>>>24;T=d- -64|0;return 0}function Pc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;if(b>>>0>4294967168){return 48}a:{if(b>>>0>=4294967168){y[10172]=48;c=0;break a}f=b>>>0<11?16:b+11&-8;b=Da(f+76|0);c=0;if(!b){break a}c=b-8|0;b:{if(!(b&63)){b=c;break b}g=b-4|0;h=y[g>>2];b=(b+63&-64)-8|0;b=(b-c>>>0<=15?64:0)+b|0;d=b-c|0;e=(h&-8)-d|0;if(!(h&3)){c=y[c>>2];y[b+4>>2]=e;y[b>>2]=c+d;break b}y[b+4>>2]=e|y[b+4>>2]&1|2;e=b+e|0;y[e+4>>2]=y[e+4>>2]|1;y[g>>2]=d|y[g>>2]&1|2;e=c+d|0;y[e+4>>2]=y[e+4>>2]|1;Lc(c,d);}c=y[b+4>>2];c:{if(!(c&3)){break c}d=c&-8;if(d>>>0<=f+16>>>0){break c}y[b+4>>2]=f|c&1|2;c=b+f|0;f=d-f|0;y[c+4>>2]=f|3;d=b+d|0;y[d+4>>2]=y[d+4>>2]|1;Lc(c,f);}c=b+8|0;}if(!c){return 48}y[a>>2]=c;return 0}function le(a,b,c,d,e,f,g,h,i,j,k){if(b){o(a,0,b);}if((c|0)==1|c>>>0>1){y[10172]=22;return -1}a:{if(!c&b>>>0<=15){break a}if(!(!(f|i)&j>>>0<2147483649)){y[10172]=22;return -1}if(!((!i&h>>>0>=3|(i|0)!=0)&j>>>0>8191)|(a|0)==(d|0)){break a}if((k|0)==1){c=T+-64|0;T=c;if(a){za(a,b);}i=j>>>10|0;f=Da(b);b:{if(!f){d=-22;break b}y[c+28>>2]=0;y[c+32>>2]=0;y[c+24>>2]=16;y[c+20>>2]=g;y[c+16>>2]=e;y[c+12>>2]=d;y[c+8>>2]=b;y[c+4>>2]=f;y[c+36>>2]=0;y[c+40>>2]=0;y[c+60>>2]=0;y[c+56>>2]=1;y[c+52>>2]=1;y[c+48>>2]=i;y[c+44>>2]=h;d=Sb(c+4|0,1);if(!(!b|(d|!a))){t(a,f,b);}ja(f,b);ta(f);}T=c- -64|0;return d?-1:0}y[10172]=28;return -1}y[10172]=28;return -1}function cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=a;e=T-32|0;T=e;lc(b,c,d,e+28|0,e+20|0,e+12|0);a=0;a:{b:{c:{while(1){d:{if(!z[a+f|0]){b=a;break d}b=a+1|0;if(!z[f+b|0]){break d}b=a+2|0;if(!z[f+b|0]){break d}a=a+3|0;if((a|0)!=102){continue}break c}break}if((b|0)!=101){break c}c=e+8|0;d=e+16|0;a=0;e:{if(z[f|0]!=36|z[f+1|0]!=55|z[f+2|0]!=36){break e}b=eb(z[f+3|0]);y[e+24>>2]=b?b-1024|0:0;if(!b){break e}b=Mb(c,f+4|0);if(!b){break e}a=Mb(d,b);}if(a){break b}y[10172]=28;a=-1;break a}y[10172]=28;a=-1;break a}a=1;if(y[e+28>>2]!=y[e+24>>2]|y[e+12>>2]!=y[e+8>>2]){break a}a=y[e+20>>2]!=y[e+16>>2];}T=e+32|0;return a|0}function Qb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0;h=T-96|0;T=h;Sa(h,f,g,0);g=h+32|0;i=f+16|0;ac(g,32,0,i,h);f=-1;a:{b:{if(Jb(c,b,d,e,g)){break b}f=0;if(!a){break a}c:{d:{if(!(!((!e&b-a>>>0>>0|(e|0)!=0)&a>>>0>>0)&(!e&a-b>>>0>=d>>>0|a>>>0<=b>>>0))){if(d){t(a,b,d);}b=a;break d}if(!(d|e)){break c}}j=h- -64|0;f=!e&d>>>0>=32|(e|0)!=0;c=f?32:d;g=f?0:e;k=!c;if(!k){t(j,b,c);}f=h+32|0;l=f;f=g;m=c+32|0;f=m>>>0<32?f+1|0:f;Gb(l,l,m,f,i,h);if(!k){t(a,j,c);}ja(h+32|0,64);f=0;if(!e&d>>>0<33){break b}sb(a+c|0,b+c|0,d-c|0,e-(g+(c>>>0>d>>>0)|0)|0,i,1,0,h);break b}a=h+32|0;Gb(a,a,32,0,i,h);ja(a,64);}ja(h,32);}T=h+96|0;return f}function ce(a,b,c,d,e,f,g,h,i,j,k){if(b){o(a,0,b);}if((c|0)==1|c>>>0>1){y[10172]=22;return -1}a:{if(!c&b>>>0<=15){break a}if(!(!(f|i)&j>>>0<2147483649)){y[10172]=22;return -1}if(!(!!(h|i)&j>>>0>8191)|(a|0)==(d|0)){break a}if((k|0)==2){c=T+-64|0;T=c;if(a){za(a,b);}i=j>>>10|0;f=Da(b);b:{if(!f){d=-22;break b}y[c+28>>2]=0;y[c+32>>2]=0;y[c+24>>2]=16;y[c+20>>2]=g;y[c+16>>2]=e;y[c+12>>2]=d;y[c+8>>2]=b;y[c+4>>2]=f;y[c+36>>2]=0;y[c+40>>2]=0;y[c+60>>2]=0;y[c+56>>2]=1;y[c+52>>2]=1;y[c+48>>2]=i;y[c+44>>2]=h;d=Sb(c+4|0,2);if(!(!b|(d|!a))){t(a,f,b);}ja(f,b);ta(f);}T=c- -64|0;return d?-1:0}y[10172]=28;return -1}y[10172]=28;return -1}function Rb(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0;h=T-96|0;T=h;Aa(h,f,g,0);g=h+32|0;i=f+16|0;Fb(g,32,0,i,h);f=-1;a:{b:{if(Jb(c,b,d,e,g)){break b}f=0;if(!a){break a}c:{d:{if(!(!((!e&b-a>>>0>>0|(e|0)!=0)&a>>>0>>0)&(!e&a-b>>>0>=d>>>0|a>>>0<=b>>>0))){if(d){t(a,b,d);}b=a;break d}if(!(d|e)){break c}}j=h- -64|0;f=!e&d>>>0>=32|(e|0)!=0;c=f?32:d;g=f?0:e;k=!c;if(!k){t(j,b,c);}f=h+32|0;l=f;f=g;m=c+32|0;f=m>>>0<32?f+1|0:f;Zb(l,l,m,f,i,h);if(!k){t(a,j,c);}f=0;if(!e&d>>>0<33){break b}hb(a+c|0,b+c|0,d-c|0,e-(g+(c>>>0>d>>>0)|0)|0,i,1,0,h);break b}a=h+32|0;Zb(a,a,32,0,i,h);}ja(h,32);}T=h+96|0;return f} +function ia(a,b,c){var d=0,e=0,f=0;d=y[b+12>>2];e=y[b+8>>2];f=y[b+4>>2];b=y[b>>2];y[a>>2]=y[c>>2]^(y[(d>>>22&1020)+37408>>2]^(y[(e>>>14&1020)+36384>>2]^(y[(f>>>6&1020)+35360>>2]^y[((b&255)<<2)+34336>>2])));y[a+4>>2]=y[c+4>>2]^(y[(b>>>22&1020)+37408>>2]^(y[(d>>>14&1020)+36384>>2]^(y[(e>>>6&1020)+35360>>2]^y[((f&255)<<2)+34336>>2])));y[a+8>>2]=y[c+8>>2]^(y[(f>>>22&1020)+37408>>2]^(y[(b>>>14&1020)+36384>>2]^(y[(d>>>6&1020)+35360>>2]^y[((e&255)<<2)+34336>>2])));y[a+12>>2]=y[c+12>>2]^(y[(e>>>22&1020)+37408>>2]^(y[(f>>>14&1020)+36384>>2]^(y[(b>>>6&1020)+35360>>2]^y[((d&255)<<2)+34336>>2])));}function yd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0;k=T-400|0;T=k;y[k+4>>2]=0;l=k+16|0;Aa(l,i,j,0);j=z[i+20|0]|z[i+21|0]<<8|(z[i+22|0]<<16|z[i+23|0]<<24);y[k+8>>2]=z[i+16|0]|z[i+17|0]<<8|(z[i+18|0]<<16|z[i+19|0]<<24);y[k+12>>2]=j;j=k+80|0;_a(j,64,0,k+4|0,l);i=k+144|0;Ga(i,j);ja(j,64);la(i,f,g,h);la(i,39776,0-g&15,0);la(i,b,c,d);la(i,39776,0-c&15,0);y[k+72>>2]=g;y[k+76>>2]=h;f=k+72|0;la(i,f,8,0);y[k+72>>2]=c;y[k+76>>2]=d;la(i,f,8,0);f=k+48|0;Fa(i,f);ja(i,256);i=db(f,e);ja(f,16);a:{if(!a){break a}if(i){if(c){o(a,0,c);}i=-1;break a}Be(a,b,c,d,k+4|0,k+16|0);i=0;}ja(k+16|0,32);T=k+400|0;return i}function Jd(a,b,c,d,e,f){var g=0,h=0;g=T-496|0;T=g;h=g+288|0;Xa(h,a,b);Ka(h,c,d,0);if(f){a=0;b=0;while(1){b=b+1|0;c=Di(b&16711935,8)|Di(b,24)&16711935;w[g+76|0]=c;w[g+77|0]=c>>>8;w[g+78|0]=c>>>16;w[g+79|0]=c>>>24;c=g+80|0;t(c,g+288|0,208);Ka(c,g+76|0,4,0);qb(c,g+32|0);c=y[g+60>>2];y[g+24>>2]=y[g+56>>2];y[g+28>>2]=c;c=y[g+52>>2];y[g+16>>2]=y[g+48>>2];y[g+20>>2]=c;c=y[g+44>>2];y[g+8>>2]=y[g+40>>2];y[g+12>>2]=c;c=y[g+36>>2];y[g>>2]=y[g+32>>2];y[g+4>>2]=c;c=f-a|0;c=c>>>0>=32?32:c;if(c){t(a+e|0,g,c);}a=b<<5;if(f>>>0>a>>>0){continue}break}}ja(g+288|0,208);T=g+496|0;}function Kd(a,b,c,d,e,f){var g=0,h=0,i=0;g=T-32|0;T=g;h=-1;i=c>>>0<32;a:{if(i&!d){break a}Zd(g,32,0,e,f);if(Jb(b+16|0,b+32|0,c-32|0,d-i|0,g)){break a}rc(a,b,c,d,e,f);w[a+24|0]=0;w[a+25|0]=0;w[a+26|0]=0;w[a+27|0]=0;w[a+28|0]=0;w[a+29|0]=0;w[a+30|0]=0;w[a+31|0]=0;w[a+16|0]=0;w[a+17|0]=0;w[a+18|0]=0;w[a+19|0]=0;w[a+20|0]=0;w[a+21|0]=0;w[a+22|0]=0;w[a+23|0]=0;w[a+8|0]=0;w[a+9|0]=0;w[a+10|0]=0;w[a+11|0]=0;w[a+12|0]=0;w[a+13|0]=0;w[a+14|0]=0;w[a+15|0]=0;w[a|0]=0;w[a+1|0]=0;w[a+2|0]=0;w[a+3|0]=0;w[a+4|0]=0;w[a+5|0]=0;w[a+6|0]=0;w[a+7|0]=0;h=0;}T=g+32|0;return h}function di(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-496|0;T=f;w[f+15|0]=1;a:{if(b>>>0<=16320){if(b>>>0>=64){g=64;while(1){i=g;g=f+80|0;Va(g,e,64);if(h){Na(g,(a+h|0)+-64|0,64,0);}g=f+80|0;Na(g,c,d,0);Na(g,f+15|0,1,0);Ya(g,a+h|0);w[f+15|0]=z[f+15|0]+1;h=i;g=h- -64|0;if(g>>>0<=b>>>0){continue}break}}b=b&63;if(b){h=f+80|0;Va(h,e,64);if(i){Na(h,(a+i|0)+-64|0,64,0);}e=f+80|0;Na(e,c,d,0);Na(e,f+15|0,1,0);c=f+16|0;Ya(e,c);if(b){t(a+i|0,c,b);}ja(f+16|0,64);}ja(f+80|0,416);a=0;break a}y[10172]=28;a=-1;}T=f+496|0;return a|0}function zd(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=T-384|0;T=l;y[l+4>>2]=0;m=l+16|0;Aa(m,j,k,0);k=z[j+20|0]|z[j+21|0]<<8|(z[j+22|0]<<16|z[j+23|0]<<24);y[l+8>>2]=z[j+16|0]|z[j+17|0]<<8|(z[j+18|0]<<16|z[j+19|0]<<24);y[l+12>>2]=k;k=l- -64|0;n=l+4|0;_a(k,64,0,n,m);j=l+128|0;Ga(j,k);ja(k,64);la(j,g,h,i);la(j,39776,0-h&15,0);Be(a,d,e,f,n,m);la(j,a,e,f);la(j,39776,0-e&15,0);y[l+56>>2]=h;y[l+60>>2]=i;a=l+56|0;la(j,a,8,0);y[l+56>>2]=e;y[l+60>>2]=f;la(j,a,8,0);Fa(j,b);ja(j,256);if(c){y[c>>2]=16;y[c+4>>2]=0;}ja(l+16|0,32);T=l+384|0;return 0}function Ch(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=T-256|0;T=f;w[f+15|0]=1;a:{if(b>>>0<=8160){if(b>>>0>=32){g=32;while(1){i=g;g=f+48|0;Xa(g,e,32);if(h){Ka(g,(a+h|0)-32|0,32,0);}g=f+48|0;Ka(g,c,d,0);Ka(g,f+15|0,1,0);qb(g,a+h|0);w[f+15|0]=z[f+15|0]+1;h=i;g=h+32|0;if(g>>>0<=b>>>0){continue}break}}b=b&31;if(b){h=f+48|0;Xa(h,e,32);if(i){Ka(h,(a+i|0)-32|0,32,0);}e=f+48|0;Ka(e,c,d,0);Ka(e,f+15|0,1,0);c=f+16|0;qb(e,c);if(b){t(a+i|0,c,b);}ja(f+16|0,32);}ja(f+48|0,208);a=0;break a}y[10172]=28;a=-1;}T=f+256|0;return a|0}function nc(a){var b=0,c=0,d=0;if(!a){return -25}if(!y[a>>2]){return -1}if(B[a+4>>2]<16){return -2}if(!(y[a+8>>2]|!y[a+12>>2])){return -18}b=y[a+20>>2];if(!y[a+16>>2]){return b?-19:-6}if(b>>>0<8){return -6}if(!(y[a+24>>2]|!y[a+28>>2])){return -20}if(!(y[a+32>>2]|!y[a+36>>2])){return -21}b=y[a+48>>2];if(!b){return -16}if(b>>>0>16777215){return -17}d=-14;c=y[a+44>>2];a:{if(c>>>0<8){break a}if(c>>>0>2097152){return -15}if(b<<3>>>0>c>>>0){break a}if(!y[a+40>>2]){return -12}a=y[a+52>>2];if(!a){return -28}d=a>>>0>16777215?-29:0;}return d}function ob(a,b){var c=0,d=0,e=0;d=b;a:{b:{c:{b=b&255;if(b){if(a&3){while(1){c=z[a|0];if(!c|(b|0)==(c|0)){break a}a=a+1|0;if(a&3){continue}break}}c=y[a>>2];if(((c|16843008-c)&-2139062144)!=-2139062144){break c}e=E(b,16843009);while(1){b=c^e;if(((16843008-b|b)&-2139062144)!=-2139062144){break c}c=y[a+4>>2];b=a+4|0;a=b;if(((16843008-c|c)&-2139062144)==-2139062144){continue}break}break b}a=Ha(a)+a|0;break a}b=a;}while(1){a=b;c=z[a|0];if(!c){break a}b=a+1|0;if((c|0)!=(d&255)){continue}break}}return z[a|0]==(d&255)?a:0}function he(a,b,c,d,e){var f=0,g=0,h=0;f=T+-64|0;T=f;h=Ha(a);a:{if(!(!c&h>>>0<128)){y[10172]=28;a=-1;break a}y[f+60>>2]=0;y[f+52>>2]=0;y[f+56>>2]=0;y[f+44>>2]=0;y[f+48>>2]=0;c=0;b:{if(!h){break b}c=h;}g=Da(c);if(!(!g|!(z[g-4|0]&3))){ja(g,c);}if(!g){a=-1;break a}y[f+12>>2]=g;y[f+20>>2]=g;y[f+24>>2]=h;y[f+4>>2]=g;y[f+16>>2]=h;y[f+28>>2]=0;y[f+32>>2]=0;y[f+8>>2]=h;y[f+36>>2]=0;y[f+40>>2]=0;c:{if(oe(f+4|0,a,e)){y[10172]=28;a=-1;break c}a=y[f+44>>2]!=(b|0)|y[f+48>>2]!=(d>>>10|0);}ta(g);}T=f- -64|0;return a}function rb(a,b,c,d){var e=0,f=0;e=T-208|0;T=e;y[e+72>>2]=0;y[e+76>>2]=0;y[e+64>>2]=0;y[e+68>>2]=0;f=y[9613];y[e>>2]=y[9612];y[e+4>>2]=f;f=y[9615];y[e+8>>2]=y[9614];y[e+12>>2]=f;f=y[9617];y[e+16>>2]=y[9616];y[e+20>>2]=f;f=y[9619];y[e+24>>2]=y[9618];y[e+28>>2]=f;f=y[9621];y[e+32>>2]=y[9620];y[e+36>>2]=f;f=y[9623];y[e+40>>2]=y[9622];y[e+44>>2]=f;f=y[9625];y[e+48>>2]=y[9624];y[e+52>>2]=f;f=y[9627];y[e+56>>2]=y[9626];y[e+60>>2]=f;va(e,b,c,d);Ca(e,a);T=e+208|0;return 0}function ff(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0;k=0|e;h=h|l;e=T-16|0;T=e;b=b|l;if(b){o(a,0,b);}f=c|f;a:{if((f|0)==1|f>>>0>1){y[10172]=22;a=-1;break a}if(!c&b>>>0>=16|c){lc(h,i,j,e+12|0,e+8|0,e+4|0);if((a|0)==(d|0)){y[10172]=28;a=-1;break a}h=d;d=y[e+12>>2];c=d&31;if((d&63)>>>0>=32){d=1<>>32-c;}a=Fd(h,k,g,32,f,d,y[e+4>>2],y[e+8>>2],a,b);break a}y[10172]=28;a=-1;}T=e+16|0;return a|0}function ji(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;g=T-16|0;T=g;a:{b:{if(!d){b=-1;break b}f=d-1|0;c:{if(!(f&d)){h=c^-1;f=f&h;break c}h=c^-1;f=f-((c>>>0)%(d>>>0)|0)|0;}if(f>>>0>=h>>>0){break a}c=c+f|0;if(c>>>0>=e>>>0){b=-1;break b}if(a){y[a>>2]=c+1;}a=b+c|0;b=0;w[g+15|0]=0;c=0;while(1){e=a-c|0;h=e;i=z[e|0]&z[g+15|0];e=(c^f)-1>>>24|0;w[h|0]=i|e&128;w[g+15|0]=e|z[g+15|0];c=c+1|0;if((d|0)!=(c|0)){continue}break}}T=g+16|0;return b|0}na();s();}function Mh(a,b,c){a=a|0;b=b|0;c=c|0;za(b,24);Aa(a,b,c,0);w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;c=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);b=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);w[a+44|0]=0;w[a+45|0]=0;w[a+46|0]=0;w[a+47|0]=0;w[a+48|0]=0;w[a+49|0]=0;w[a+50|0]=0;w[a+51|0]=0;w[a+36|0]=c;w[a+37|0]=c>>>8;w[a+38|0]=c>>>16;w[a+39|0]=c>>>24;w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;return 0}function Lh(a,b,c){a=a|0;b=b|0;c=c|0;Aa(a,b,c,0);w[a+32|0]=1;w[a+33|0]=0;w[a+34|0]=0;w[a+35|0]=0;c=z[b+16|0]|z[b+17|0]<<8|(z[b+18|0]<<16|z[b+19|0]<<24);b=z[b+20|0]|z[b+21|0]<<8|(z[b+22|0]<<16|z[b+23|0]<<24);w[a+44|0]=0;w[a+45|0]=0;w[a+46|0]=0;w[a+47|0]=0;w[a+48|0]=0;w[a+49|0]=0;w[a+50|0]=0;w[a+51|0]=0;w[a+36|0]=c;w[a+37|0]=c>>>8;w[a+38|0]=c>>>16;w[a+39|0]=c>>>24;w[a+40|0]=b;w[a+41|0]=b>>>8;w[a+42|0]=b>>>16;w[a+43|0]=b>>>24;return 0}function Za(a){a=a|0;var b=0;y[a+72>>2]=0;y[a+76>>2]=0;b=a- -64|0;y[b>>2]=0;y[b+4>>2]=0;b=y[9613];y[a>>2]=y[9612];y[a+4>>2]=b;b=y[9615];y[a+8>>2]=y[9614];y[a+12>>2]=b;b=y[9617];y[a+16>>2]=y[9616];y[a+20>>2]=b;b=y[9619];y[a+24>>2]=y[9618];y[a+28>>2]=b;b=y[9621];y[a+32>>2]=y[9620];y[a+36>>2]=b;b=y[9623];y[a+40>>2]=y[9622];y[a+44>>2]=b;b=y[9625];y[a+48>>2]=y[9624];y[a+52>>2]=b;b=y[9627];y[a+56>>2]=y[9626];y[a+60>>2]=b;return 0}function ya(a,b){var c=0,d=0,e=0,f=0,g=0;c=T-16|0;w[c+15|0]=0;a:{if(!b){break a}e=b&3;if(b>>>0>=4){g=b&-4;while(1){b=a+d|0;w[c+15|0]=z[b|0]|z[c+15|0];w[c+15|0]=z[b+1|0]|z[c+15|0];w[c+15|0]=z[b+2|0]|z[c+15|0];w[c+15|0]=z[b+3|0]|z[c+15|0];d=d+4|0;f=f+4|0;if((g|0)!=(f|0)){continue}break}if(!e){break a}}b=0;while(1){w[c+15|0]=z[a+d|0]|z[c+15|0];d=d+1|0;b=b+1|0;if((e|0)!=(b|0)){continue}break}}return z[c+15|0]-1>>>31|0}function dc(a){return (((z[a+31|0]^-1)&127|z[a+1|0]&(z[a+2|0]&(z[a+3|0]&(z[a+4|0]&(z[a+5|0]&(z[a+6|0]&(z[a+7|0]&(z[a+8|0]&(z[a+9|0]&(z[a+10|0]&(z[a+11|0]&(z[a+12|0]&(z[a+13|0]&(z[a+14|0]&(z[a+15|0]&(z[a+16|0]&(z[a+17|0]&(z[a+18|0]&(z[a+19|0]&(z[a+20|0]&(z[a+21|0]&(z[a+22|0]&(z[a+23|0]&(z[a+24|0]&(z[a+25|0]&(z[a+26|0]&(z[a+27|0]&(z[a+28|0]&(z[a+30|0]&z[a+29|0]))))))))))))))))))))))))))))^255)-1&236-z[a|0]^-1)>>>8&1}function $a(a,b,c){var d=0,e=0,f=0;d=T-16|0;y[d+12>>2]=a;y[d+8>>2]=b;a=0;w[d+7|0]=0;a:{if(!c){break a}if((c|0)!=1){b=c&1;f=c&-2;c=0;while(1){w[d+7|0]=z[d+7|0]|z[y[d+12>>2]+a|0]^z[y[d+8>>2]+a|0];e=a|1;w[d+7|0]=z[d+7|0]|z[e+y[d+12>>2]|0]^z[y[d+8>>2]+e|0];a=a+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}if(!b){break a}}w[d+7|0]=z[d+7|0]|z[y[d+12>>2]+a|0]^z[y[d+8>>2]+a|0];}return (z[d+7|0]-1>>>31|0)-1|0}function df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;e=a;g=c;c=0;d=T-128|0;T=d;a:{b:{while(1){if(!z[c+e|0]){a=c;break b}a=c+1|0;if(!z[e+a|0]){break b}a=c+2|0;if(!z[e+a|0]){break b}c=c+3|0;if((c|0)!=102){continue}break}c=-1;break a}c=-1;if((a|0)!=101){break a}f=d+4|0;if(mc(f));a=d+16|0;o(a,0,102);b=Gd(f,b,g,e,a);Ob(f);if(!b){break a}c=$a(a,e,102);ja(a,102);}T=d+128|0;return c|0}function Od(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0;k=T-352|0;T=k;m=k+32|0;_a(m,64,0,i,j);l=k+96|0;Ga(l,m);ja(m,64);la(l,f,g,h);la(l,39744,0-g&15,0);la(l,b,c,d);la(l,39744,0-c&15,0);y[k+24>>2]=g;y[k+28>>2]=h;f=k+24|0;la(l,f,8,0);y[k+24>>2]=c;y[k+28>>2]=d;la(l,f,8,0);Fa(l,k);ja(l,256);f=db(k,e);ja(k,16);a:{if(!a){break a}if(f){if(c){o(a,0,c);}f=-1;break a}gb(a,b,c,d,i,1,j);f=0;}T=k+352|0;return f}function yb(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;while(1){c=z[a+d|0];b=d+2688|0;e=c^z[b|0]|e;f=c^z[b+192|0]|f;g=c^z[b+160|0]|g;h=c^z[b+128|0]|h;i=c^z[b+96|0]|i;j=c^z[b- -64|0]|j;k=c^z[b+32|0]|k;d=d+1|0;if((d|0)!=31){continue}break}a=z[a+31|0]&127;b=a^127;return (((b|f)&255)-1|(((b|g)&255)-1|(((b|h)&255)-1|(((a^122|i)&255)-1|(((a^5|j)&255)-1|(((a|k)&255)-1|((a|e)&255)-1))))))>>>8&1}function ed(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:{b:{c:{d:{if(!e&d>>>0<64){break d}e=e-1|0;h=e+1|0;g=e;e=d+-64|0;d=e>>>0<4294967232?h:g;if(!d&e>>>0>4294967231|d){break d}g=c;c=c- -64|0;if(!pc(g,c,e,d,f,0)){break c}if(!a|!e){break d}o(a,0,e);}d=-1;if(!b){break b}y[b>>2]=0;y[b+4>>2]=0;d=-1;break a}if(b){y[b>>2]=e;y[b+4>>2]=d;}d=0;if(!a|!e){break b}t(a,c,e);}}return d|0}function Ci(a,b,c){var d=0,e=0,f=0,g=0;g=c&63;f=g;e=f&31;if(f>>>0>=32){f=-1>>>e|0;}else {d=-1>>>e|0;f=d|(1<>>0>=32){d=f<>>32-e|d<>>0>=32){d=-1<>>32-d;}a=c&a;b=b&d;d=e&31;if(e>>>0>=32){c=0;a=b>>>d|0;}else {c=b>>>d|0;a=((1<>>d;}a=a|g;W=c|f;return a}function ld(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=T-32|0;T=g;h=z[e|0]|z[e+1|0]<<8|(z[e+2|0]<<16|z[e+3|0]<<24);e=z[e+4|0]|z[e+5|0]<<8|(z[e+6|0]<<16|z[e+7|0]<<24);y[g+24>>2]=0;y[g+28>>2]=0;y[g+16>>2]=h;y[g+20>>2]=e;y[g+8>>2]=0;y[g+12>>2]=0;y[g>>2]=c;y[g+4>>2]=d;a:{if(b-65>>>0<=4294967246){y[10172]=28;a=-1;break a}a=qe(a,b,0,0,0,f,32,g,g+16|0);}T=g+32|0;return a|0}function vd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=T-512|0;T=f;g=f+32|0;Va(g,e,32);Na(g,b,c,d);Ya(g,f+448|0);b=y[f+476>>2];y[f+24>>2]=y[f+472>>2];y[f+28>>2]=b;b=y[f+468>>2];y[f+16>>2]=y[f+464>>2];y[f+20>>2]=b;b=y[f+460>>2];y[f+8>>2]=y[f+456>>2];y[f+12>>2]=b;b=y[f+452>>2];y[f>>2]=y[f+448>>2];y[f+4>>2]=b;b=kb(a,f);c=$a(f,a,32);T=f+512|0;return ((a|0)==(f|0)?-1:b)|c}function Pd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0;k=T-352|0;T=k;m=k+32|0;Fb(m,64,0,i,j);l=k+96|0;Ga(l,m);ja(m,64);la(l,f,g,h);y[k+24>>2]=g;y[k+28>>2]=h;f=k+24|0;la(l,f,8,0);la(l,b,c,d);y[k+24>>2]=c;y[k+28>>2]=d;la(l,f,8,0);Fa(l,k);ja(l,256);f=db(k,e);ja(k,16);a:{if(!a){break a}if(f){if(c){o(a,0,c);}f=-1;break a}hb(a,b,c,d,i,1,0,j);f=0;}T=k+352|0;return f}function Qd(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=T-336|0;T=l;n=l+16|0;_a(n,64,0,j,k);m=l+80|0;Ga(m,n);ja(n,64);la(m,g,h,i);la(m,39744,0-h&15,0);gb(a,d,e,f,j,1,k);la(m,a,e,f);la(m,39744,0-e&15,0);y[l+8>>2]=h;y[l+12>>2]=i;a=l+8|0;la(m,a,8,0);y[l+8>>2]=e;y[l+12>>2]=f;la(m,a,8,0);Fa(m,b);ja(m,256);if(c){y[c>>2]=16;y[c+4>>2]=0;}T=l+336|0;return 0}function Wc(a,b,c){var d=0;d=T-16|0;y[d+12>>2]=a;y[d+8>>2]=b;a=0;x[d+6>>1]=0;while(1){x[d+6>>1]=A[d+6>>1]|z[y[d+12>>2]+a|0]^z[y[d+8>>2]+a|0];b=a|1;x[d+6>>1]=A[d+6>>1]|z[b+y[d+12>>2]|0]^z[b+y[d+8>>2]|0];a=a+2|0;if((c|0)!=(a|0)){continue}break}x[d+6>>1]=A[d+6>>1];x[d+6>>1]=A[d+6>>1]-1;x[d+6>>1]=A[20608]>>>2^A[d+6>>1]>>>15;return A[d+6>>1]-1|0}function ii(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=T-16|0;y[e+12>>2]=0;if(d-1>>>0>>0){f=c-1|0;j=f+b|0;c=0;b=0;while(1){g=z[j-c|0];i=((g^128)-1&(y[e+12>>2]-1&h-1))>>>8&1;y[e+12>>2]=y[e+12>>2]|0-i&c;b=b|i;h=h|g;c=c+1|0;if((d|0)!=(c|0)){continue}break}y[a>>2]=f-y[e+12>>2];a=(b&255)-1|0;}else {a=-1;}return a|0}function Ah(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;if(!(d>>>0>2147483646|d<<1>>>0>=b>>>0)){b=0;if(d){while(1){e=(b<<1)+a|0;g=z[b+c|0];f=g&15;w[e+1|0]=((f<<8)+(f+65526&55552)|0)+22272>>>8;f=e;e=g>>>4|0;w[f|0]=((e+65526>>>8&217)+e|0)+87;b=b+1|0;if((d|0)!=(b|0)){continue}break}b=d<<1;}else {b=0;}w[b+a|0]=0;return a|0}na();s();}function zc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;f=z[a|0];a:{if((f-58&255)>>>0<246){break a}c=f;d=a;while(1){g=d;if(e>>>0>429496729){break a}c=(c&255)-48|0;e=E(e,10);if(c>>>0>(e^-1)>>>0){break a}e=e+c|0;d=d+1|0;c=z[d|0];if((c-58&255)>>>0>245){continue}break}if((f|0)==48&(a|0)!=(g|0)|(a|0)==(d|0)){break a}y[b>>2]=e;h=d;}return h}function fd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=T-16|0;T=g;h=a- -64|0;if(d){t(h,c,d);}c=0;qc(a,g+8|0,h,d,e,f,0);a:{if(y[g+12>>2]|y[g+8>>2]!=64){if(b){y[b>>2]=0;y[b+4>>2]=0;}b=d- -64|0;if(b){o(a,0,b);}c=-1;break a}if(!b){break a}y[b>>2]=d- -64;y[b+4>>2]=e-((d>>>0<4294967232)-1|0);}T=g+16|0;return c|0}function eb(a){var b=0,c=0,d=0,e=0;b=65;c=1024;d=a&255;a:{b:{if((d|0)!=z[1024]){d=E(d,16843009);while(1){e=d^y[c>>2];if(((e|16843008-e)&-2139062144)!=-2139062144){break b}c=c+4|0;b=b-4|0;if(b>>>0>3){continue}break}}if(!b){break a}}a=a&255;while(1){if((a|0)==z[c|0]){return c}c=c+1|0;b=b-1|0;if(b){continue}break}}return 0}function Rf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=T-112|0;T=e;y[e+40>>2]=0;y[e+44>>2]=0;f=y[9833];y[e+8>>2]=y[9832];y[e+12>>2]=f;f=y[9835];y[e+16>>2]=y[9834];y[e+20>>2]=f;f=y[9837];y[e+24>>2]=y[9836];y[e+28>>2]=f;f=y[9839];y[e+32>>2]=y[9838];y[e+36>>2]=f;f=e+8|0;La(f,b,c,d);Ua(f,a);T=e+112|0;return 0}function Sd(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=T-336|0;T=l;n=l+16|0;Fb(n,64,0,j,k);m=l+80|0;Ga(m,n);ja(n,64);la(m,g,h,i);y[l+8>>2]=h;y[l+12>>2]=i;g=l+8|0;la(m,g,8,0);hb(a,d,e,f,j,1,0,k);la(m,a,e,f);y[l+8>>2]=e;y[l+12>>2]=f;la(m,g,8,0);Fa(m,b);ja(m,256);if(c){y[c>>2]=16;y[c+4>>2]=0;}T=l+336|0;return 0}function Ld(a,b,c,d,e,f){if(!d&c>>>0>=32|d){rc(a,b,c,d,e,f);Zc(a+16|0,a+32|0,c-32|0,d-(c>>>0<32)|0,a);w[a+8|0]=0;w[a+9|0]=0;w[a+10|0]=0;w[a+11|0]=0;w[a+12|0]=0;w[a+13|0]=0;w[a+14|0]=0;w[a+15|0]=0;w[a|0]=0;w[a+1|0]=0;w[a+2|0]=0;w[a+3|0]=0;w[a+4|0]=0;w[a+5|0]=0;w[a+6|0]=0;w[a+7|0]=0;a=0;}else {a=-1;}return a}function Ha(a){var b=0,c=0,d=0;a:{b:{b=a;if(!(b&3)){break b}if(!z[b|0]){return 0}while(1){b=b+1|0;if(!(b&3)){break b}if(z[b|0]){continue}break}break a}while(1){c=b;b=b+4|0;d=y[c>>2];if(((d|16843008-d)&-2139062144)==-2139062144){continue}break}while(1){b=c;c=b+1|0;if(z[b|0]){continue}break}}return b-a|0}function Mb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{c=eb(z[b|0]);if(!c){break a}d=eb(z[b+1|0]);if(!d){break a}e=eb(z[b+2|0]);if(!e){break a}f=eb(z[b+3|0]);if(!f){break a}g=eb(z[b+4|0]);if(!g){break a}y[a>>2]=c-1024|d-1024<<6|e-1024<<12|f-1024<<18|g-1024<<24;return b+5|0}y[a>>2]=0;return 0}function Hf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;b=0|b;e=e|l;h=h|l;a:{b:{switch(k-1|0){case 0:a=le(a,b,c,d,e,f,g,h,i,j,1);break a;case 1:a=ce(a,b,c,d,e,f,g,h,i,j,2);break a;default:break b}}y[10172]=28;a=-1;}return a|0}function Tc(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;m=-1;l=d>>>0<32;a:{if(l&!e){break a}l=e-l|0;n=d-32|0;if(!l&n>>>0>4294967263|l|(!h&g>>>0>4294967263|h)){break a}m=X[y[k>>2]](a,c,n,(c+d|0)-32|0,32,f,g,i,j)|0;}if(b){y[b>>2]=m?0:d-32|0;y[b+4>>2]=m?0:e-(d>>>0<32)|0;}return m}function Gc(a,b){var c=0,d=0,e=0,f=0;c=T-896|0;T=c;d=c+848|0;cb(d,b);e=c+800|0;cb(e,b+32|0);f=c+320|0;Fc(f,d);b=c+160|0;Fc(b,e);d=c+640|0;qa(d,b);b=c+480|0;sa(b,f,d);d=c+600|0;ga(c,b,d);e=c+520|0;f=c+560|0;ga(c+40|0,e,f);ga(c+80|0,f,d);ga(c+120|0,b,e);xb(a,c);T=c+896|0;}function lg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;h=0|h;c=-1;e=e|l;if(!f&e>>>0>=16|f){c=Pd(a,d,e-16|0,f-(e>>>0<16)|0,(d+e|0)-16|0,g,h,i,j,k);}if(b){y[b>>2]=c?0:e-16|0;y[b+4>>2]=c?0:f-(e>>>0<16)|0;}return c|0}function jg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;h=0|h;c=-1;e=e|l;if(!f&e>>>0>=16|f){c=Od(a,d,e-16|0,f-(e>>>0<16)|0,(d+e|0)-16|0,g,h,i,j,k);}if(b){y[b>>2]=c?0:e-16|0;y[b+4>>2]=c?0:f-(e>>>0<16)|0;}return c|0}function fg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;h=0|h;c=-1;e=e|l;if(!f&e>>>0>=16|f){c=yd(a,d,e-16|0,f-(e>>>0<16)|0,(d+e|0)-16|0,g,h,i,j,k);}if(b){y[b>>2]=c?0:e-16|0;y[b+4>>2]=c?0:f-(e>>>0<16)|0;}return c|0}function qg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;i=0;g=i|g;a:{d=d|i;if(!e&d>>>0<4294967280){Sd(a,a+d|0,0,c,d,e,f,g,h,j,k);if(b){a=d+16|0;e=a>>>0<16?e+1|0:e;y[b>>2]=a;y[b+4>>2]=e;}break a}na();s();}return 0}function ng(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;i=0;g=i|g;a:{d=d|i;if(!e&d>>>0<4294967280){Qd(a,a+d|0,0,c,d,e,f,g,h,j,k);if(b){a=d+16|0;e=a>>>0<16?e+1|0:e;y[b>>2]=a;y[b+4>>2]=e;}break a}na();s();}return 0}function hg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;i=0;g=i|g;a:{d=d|i;if(!e&d>>>0<4294967280){zd(a,a+d|0,0,c,d,e,f,g,h,j,k);if(b){a=d+16|0;e=a>>>0<16?e+1|0:e;y[b>>2]=a;y[b+4>>2]=e;}break a}na();s();}return 0}function hf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T;i=g;h=g-448&-64;T=h;g=-1;if(!d&c>>>0>=48|d){g=h- -64|0;Ja(g,0,0,24);oa(g,b,32,0);oa(g,e,32,0);e=h+32|0;Ia(g,e,24);g=_d(a,b+32|0,c-32|0,d-(c>>>0<32)|0,e,b,f);}T=i;return g|0}function Uf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=T;i=g;h=g-448&-64;T=h;g=-1;if(!d&c>>>0>=48|d){g=h- -64|0;Ja(g,0,0,24);oa(g,b,32,0);oa(g,e,32,0);e=h+32|0;Ia(g,e,24);g=Ad(a,b+32|0,c-32|0,d-(c>>>0<32)|0,e,b,f);}T=i;return g|0}function ai(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;f=-1;e=d+640|0;a:{if(ab(e,b)){break a}if(!zb(e)){break a}b=d+480|0;if(ab(b,c)){break a}if(!zb(b)){break a}qa(d,b);b=d+160|0;sa(b,e,d);c=d+320|0;Ib(c,b);Wa(a,c);f=0;}T=d+800|0;return f|0}function $h(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;f=-1;e=d+640|0;a:{if(ab(e,b)){break a}if(!zb(e)){break a}b=d+480|0;if(ab(b,c)){break a}if(!zb(b)){break a}qa(d,b);b=d+160|0;Hb(b,e,d);c=d+320|0;Ib(c,b);Wa(a,c);f=0;}T=d+800|0;return f|0}function Ke(a){var b=0,c=0,d=0,e=0,f=0;b=1;while(1){d=b;b=a+e|0;c=d+z[b|0]|0;w[b|0]=c;c=z[b+1|0]+(c>>>8|0)|0;w[b+1|0]=c;c=z[b+2|0]+(c>>>8|0)|0;w[b+2|0]=c;d=b;b=z[b+3|0]+(c>>>8|0)|0;w[d+3|0]=b;b=b>>>8|0;e=e+4|0;f=f+4|0;if((f|0)!=4){continue}break}}function ke(a,b,c,d,e,f,g){var h=0;h=T-16|0;T=h;o(a,0,128);a:{if(!(!(d|f)&g>>>0<2147483649)){y[10172]=22;a=-1;break a}if(!((!f&e>>>0>=3|(f|0)!=0)&g>>>0>8191)){y[10172]=28;a=-1;break a}za(h,16);a=ne(e,g>>>10|0,b,c,h,a,1)?-1:0;}T=h+16|0;return a}function Rd(a,b){var c=0;a:{if(!(b&4)){break a}b=y[a>>2];if(b){ja(y[b+4>>2],y[a+16>>2]<<10);}b=y[a+4>>2];if(!b){break a}ja(b,y[a+20>>2]<<3);}ta(y[a+4>>2]);y[a+4>>2]=0;b=y[a>>2];b:{if(!b){break b}c=y[b>>2];if(!c){break b}ta(c);}ta(b);y[a>>2]=0;}function of(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;j=d;d=e;i=T+-64|0;T=i;a:{if(Ea(i+32|0,h,g)){e=-1;break a}e=-1;if(Aa(i,39680,i+32|0,0));e=Bb(a,b,c,j,d,f,i);ja(i,32);}T=i- -64|0;return e|0}function lf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;j=d;d=e;i=T+-64|0;T=i;a:{if(Ea(i+32|0,h,g)){e=-1;break a}e=-1;if(Aa(i,39680,i+32|0,0));e=Rb(a,b,c,j,d,f,i);ja(i,32);}T=i- -64|0;return e|0}function Vc(a,b,c,d,e,f,g,h,i,j,k){a:{if(!(!e&d>>>0>4294967263|(e|0)!=0|(!h&g>>>0>=4294967264|(h|0)!=0))){a=X[y[k>>2]](a,a+d|0,32,c,d,f,g,i,j)|0;if(b){c=d+32|0;d=c>>>0<32?e+1|0:e;y[b>>2]=a?0:c;y[b+4>>2]=a?0:d;}break a}na();s();}return a}function pf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;a:{d=T-16|0;T=d;if(!c){if(b|c){while(1){w[d+15|0]=0;f=a+e|0,g=P(39864,d+15|0,0)|0,w[f|0]=g;e=e+1|0;if((b|0)!=(e|0)){continue}break}}T=d+16|0;break a}Q(1346,1192,198,1092);s();}}function ag(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=T-544|0;T=f;g=f- -64|0;Va(g,e,32);va(g,b,c,d);b=f+480|0;Ca(g,b);c=f+272|0;va(c,b,64,0);Ca(c,f);ja(b,64);b=xd(a,f);c=$a(f,a,64);T=f+544|0;return ((a|0)==(f|0)?-1:b)|c}function cg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;f=T-272|0;T=f;g=f+32|0;Xa(g,e,32);La(g,b,c,d);b=f+240|0;Ua(g,b);c=f+136|0;La(c,b,32,0);Ua(c,f);ja(b,32);b=kb(a,f);c=$a(f,a,32);T=f+272|0;return ((a|0)==(f|0)?-1:b)|c}function Jc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;b=32;c=1;while(1){d=b-2|0;e=z[d+a|0];f=z[d+2912|0];b=b-1|0;g=z[b+2912|0];h=z[a+b|0];b=(g^h)-1>>8&c;i=e-f>>8&b|(h-g>>8&c|i);c=b&(e^f)-1>>8;b=d;if(b){continue}break}return (i|0)!=0}function be(a,b,c,d,e,f,g){var h=0;h=T-16|0;T=h;o(a,0,128);a:{if(!(!(d|f)&g>>>0<2147483649)){y[10172]=22;a=-1;break a}if(!(!!(e|f)&g>>>0>8191)){y[10172]=28;a=-1;break a}za(h,16);a=ne(e,g>>>10|0,b,c,h,a,2)?-1:0;}T=h+16|0;return a}function Ub(a){a=a|0;var b=0;y[a+32>>2]=0;y[a+36>>2]=0;b=y[9833];y[a>>2]=y[9832];y[a+4>>2]=b;b=y[9835];y[a+8>>2]=y[9834];y[a+12>>2]=b;b=y[9837];y[a+16>>2]=y[9836];y[a+20>>2]=b;b=y[9839];y[a+24>>2]=y[9838];y[a+28>>2]=b;return 0}function _d(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0;h=T+-64|0;T=h;i=-1;j=c>>>0<16;a:{if(j&!d){break a}k=h+32|0;if(Ea(k,g,f)){break a}if(Aa(h,39680,k,0));i=Rb(a,b+16|0,b,c-16|0,d-j|0,e,h);ja(h,32);}T=h- -64|0;return i}function Gf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;c=0|c;e=e|i;a:{b:{switch(h-1|0){case 1:a=be(a,b,c,d,e,f,g);break a;default:na();s();case 0:break b}}a=ke(a,b,c,d,e,f,g);}return a|0}function Ai(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=E(e,f);g=c&65535;h=a&65535;i=E(g,h);f=(i>>>16|0)+E(f,g)|0;e=(f&65535)+E(e,h)|0;W=(E(b,c)+j|0)+E(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function pb(a,b,c){var d=0,e=0;if(!c){return 0}d=z[a|0];if(d){a:{while(1){e=z[b|0];if((e|0)!=(d|0)|!e){break a}c=c-1|0;if(!c){break a}b=b+1|0;d=z[a+1|0];a=a+1|0;if(d){continue}break}d=0;}}else {d=0;}return d-z[b|0]|0}function gb(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=d;i=c+63|0;h=i>>>0<63?h+1|0:h;j=h>>>6|0;h=(h&63)<<26|i>>>6;i=0-h|0;if(!((j+((h|0)!=0)|0)==1&f>>>0>i>>>0|((d|0)==1|d>>>0>1))){return X[y[9965]](a,b,c,d,e,f,g)|0}na();s();}function Xh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;e=-1;f=d+640|0;a:{if(ib(f,b)){break a}b=d+480|0;if(ib(b,c)){break a}qa(d,b);b=d+160|0;sa(b,f,d);c=d+320|0;Ib(c,b);xb(a,c);e=0;}T=d+800|0;return e|0}function Wh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=T-800|0;T=d;e=-1;f=d+640|0;a:{if(ib(f,b)){break a}b=d+480|0;if(ib(b,c)){break a}qa(d,b);b=d+160|0;Hb(b,f,d);c=d+320|0;Ib(c,b);xb(a,c);e=0;}T=d+800|0;return e|0}function td(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=T+-64|0;T=h;a:{if(Ea(h+32|0,g,f)){f=-1;break a}f=-1;if(Sa(h,39760,h+32|0,0));f=Ld(a,b,c,d,e,h);ja(h,32);}T=h- -64|0;return f|0}function sd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=T+-64|0;T=h;a:{if(Ea(h+32|0,g,f)){f=-1;break a}f=-1;if(Sa(h,39760,h+32|0,0));f=Kd(a,b,c,d,e,h);ja(h,32);}T=h- -64|0;return f|0}function $d(a,b,c,d,e,f,g){var h=0;h=T+-64|0;T=h;if(!d&c>>>0<4294967280){a:{if(Ea(h+32|0,g,f)){g=-1;break a}g=-1;if(Aa(h,39680,h+32|0,0));g=Bb(a+16|0,a,b,c,d,e,h);ja(h,32);}T=h- -64|0;return g}na();s();}function Ec(a,b){var c=0,d=0,e=0,f=0,g=0;while(1){d=a+e|0;c=z[d|0]-(z[b+e|0]+c|0)|0;w[d|0]=c;d=e|1;f=d+a|0;c=z[f|0]-(z[b+d|0]+(c>>>8&1)|0)|0;w[f|0]=c;c=c>>>8&1;e=e+2|0;g=g+2|0;if((g|0)!=64){continue}break}}function De(a,b){var c=0,d=0,e=0,f=0,g=0;while(1){d=a+e|0;c=z[b+e|0]+(z[d|0]+c|0)|0;w[d|0]=c;d=e|1;f=d+a|0;c=z[b+d|0]+(z[f|0]+(c>>>8|0)|0)|0;w[f|0]=c;c=c>>>8|0;e=e+2|0;g=g+2|0;if((g|0)!=32){continue}break}}function lb(a){var b=0,c=0,d=0;c=y[9948];a=a+7|0;b=a>>>0<7?1:b;d=a&-8;a=d+c|0;a:{if(!(a>>>0>>0?b+1|0:b)){if(a>>>0<=Y()<<16>>>0){break a}if(S(a|0)|0){break a}}y[10172]=48;return -1}y[9948]=a;return c}function mi(a){a=a|0;var b=0,c=0,d=0;b=T-16|0;T=b;if(a>>>0>=2){c=(0-a>>>0)%(a>>>0)|0;while(1){w[b+15|0]=0;d=P(39864,b+15|0,0)|0;if(c>>>0>d>>>0){continue}break}c=(d>>>0)%(a>>>0)|0;}T=b+16|0;return c|0}function Yf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=d;d=e;j=i|0;i=T-32|0;T=i;e=-1;if(!mb(i,g,h)){e=Qb(a,b,c,j,d,f,i);ja(i,32);}T=i+32|0;return e|0}function $f(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0;i=d;d=e;j=i|0;i=T-32|0;T=i;e=-1;if(!mb(i,g,h)){e=Ab(a,b,c,j,d,f,i);ja(i,32);}T=i+32|0;return e|0}function za(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=T-16|0;T=c;if(b){while(1){w[c+15|0]=0;e=a+d|0,f=P(39864,c+15|0,0)|0,w[e|0]=f;d=d+1|0;if((d|0)!=(b|0)){continue}break}}T=c+16|0;}function qf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=T-32|0;T=i;Sa(i,e,h,0);h=a;a=0;a=sb(h,b,a|c,d,e+16|0,a|f,g,i);ja(i,32);T=i+32|0;return a|0}function dg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-240|0;T=f;Xa(f,e,32);La(f,b,c,d);b=f+208|0;Ua(f,b);c=f+104|0;La(c,b,32,0);Ua(c,a);ja(b,32);T=f+240|0;return 0}function bg(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-480|0;T=f;Va(f,e,32);va(f,b,c,d);b=f+416|0;Ca(f,b);c=f+208|0;va(c,b,64,0);Ca(c,a);ja(b,64);T=f+480|0;return 0}function Ad(a,b,c,d,e,f,g){var h=0,i=0,j=0;h=T-32|0;T=h;i=-1;j=c>>>0<16;a:{if(j&!d){break a}if(mb(h,f,g)){break a}i=Qb(a,b+16|0,b,c-16|0,d-j|0,e,h);ja(h,32);}T=h+32|0;return i}function We(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=T-32|0;T=i;Aa(i,e,h,0);h=a;a=0;a=hb(h,b,a|c,d,e+16|0,a|f,g,i);T=i+32|0;return a|0}function Wa(a,b){var c=0,d=0,e=0;c=T-176|0;T=c;d=c+96|0;bb(d,b+80|0);e=c+48|0;ga(e,b,d);ga(c,b+40|0,d);pa(a,c);pa(c+144|0,e);w[a+31|0]=z[a+31|0]^z[c+144|0]<<7;T=c+176|0;}function Fd(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;k=T-16|0;T=k;m=-1;l=k+4|0;if(!mc(l)){m=(n=-1,o=Id(l,a,b,c,d,e,f,g,h,i,j),p=Ob(l),p?n:o);}T=k+16|0;return m}function Uc(a,b,c,d,e,f,g,h,i,j,k,l){if(c){y[c>>2]=32;y[c+4>>2]=0;}if(!(!i&h>>>0<4294967264&(!f&e>>>0<=4294967263))){na();s();}return X[y[l>>2]](a,b,32,d,e,g,h,j,k)|0}function bi(a){a=a|0;var b=0,c=0;b=T-160|0;T=b;a:{if(!dc(a)){break a}if(yb(a)){break a}if(ab(b,a)){break a}if(!zb(b)){break a}c=(ec(b)|0)!=0;}T=b+160|0;return c|0}function Pf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;l=a;a=0;return le(l,a|b,c,d,a|e,f,g,a|h,i,j,k)|0}function Kf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var l=0;l=a;a=0;return ce(l,a|b,c,d,a|e,f,g,a|h,i,j,k)|0}function Ff(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a:{if(!pb(a,1564,10)){a=ae(a,b,c,d);break a}if(!pb(a,1554,9)){a=je(a,b,c,d);break a}y[10172]=28;a=-1;}return a|0}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a:{if(!pb(a,1564,10)){a=ge(a,b,c,d);break a}if(!pb(a,1554,9)){a=ie(a,b,c,d);break a}y[10172]=28;a=-1;}return a|0}function Bd(a,b,c,d,e,f,g){var h=0,i=0;h=T-32|0;T=h;if(!d&c>>>0<4294967280){i=-1;if(!mb(h,f,g)){i=Ab(a+16|0,a,b,c,d,e,h);ja(h,32);}T=h+32|0;return i}na();s();}function rg(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;j=a;a=0;return Sd(j,b,c,d,a|e,f,g,a|h,i,k,l)|0}function pg(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;j=a;a=0;return Qd(j,b,c,d,a|e,f,g,a|h,i,k,l)|0}function ig(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;j=a;a=0;return zd(j,b,c,d,a|e,f,g,a|h,i,k,l)|0}function yg(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;k=k|0;l=l|0;return Uc(a,b,c,d,e,f,g,h,i,k,l,39832)|0}function ug(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;k=k|0;l=l|0;return Uc(a,b,c,d,e,f,g,h,i,k,l,39840)|0}function mg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;b=a;a=0;return Pd(b,c,a|d,e,f,g,a|h,i,j,k)|0}function kg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;b=a;a=0;return Od(b,c,a|d,e,f,g,a|h,i,j,k)|0}function gg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;b=a;a=0;return yd(b,c,a|d,e,f,g,a|h,i,j,k)|0}function pd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=16|d){a=Qb(a,b+16|0,b,c-16|0,d-(c>>>0<16)|0,e,f);}else {a=-1;}return a|0}function Yc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=16|d){a=Rb(a,b+16|0,b,c-16|0,d-(c>>>0<16)|0,e,f);}else {a=-1;}return a|0}function Ve(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;g=T-32|0;T=g;Aa(g,e,f,0);a=hb(a,b,c,d,e+16|0,0,0,g);T=g+32|0;return a|0}function zg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;return Vc(a,b,c,d,e,f,g,h,j,k,39832)|0}function xg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Tc(a,b,d,e,f,g,h,i,j,k,39836)|0}function wg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Sc(a,c,d,e,f,g,h,i,j,k,39836)|0}function vg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;return Vc(a,b,c,d,e,f,g,h,j,k,39840)|0}function tg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Tc(a,b,d,e,f,g,h,i,j,k,39844)|0}function sg(a,b,c,d,e,f,g,h,i,j,k){a=a|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;return Sc(a,c,d,e,f,g,h,i,j,k,39844)|0}function Sc(a,b,c,d,e,f,g,h,i,j,k){if(!d&c>>>0>4294967263|d|(!h&g>>>0>4294967263|h)){a=-1;}else {a=X[y[k>>2]](a,b,c,e,32,f,g,i,j)|0;}return a}function yh(a,b){a=a|0;b=b|0;var c=0;if((b&-7)!=1){na();s();}c=a;a=(a>>>0)/3|0;c=c+E(a,-3)|0;return ((c&3?b&2?c+1|0:4:0)+(a<<2)|0)+1|0}function fi(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-416|0;T=f;Va(f,b,c);Na(f,d,e,0);Ya(f,a);ja(f,4);T=f+416|0;return 0}function Dh(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-208|0;T=f;Xa(f,b,c);Ka(f,d,e,0);qb(f,a);ja(f,4);T=f+208|0;return 0}function nf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}return Bb(a+16|0,a,b,c,d,e,f)|0}function bf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}Bb(a+16|0,a,b,c,d,e,f);return 0}function _f(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}return Ab(a+16|0,a,b,c,d,e,f)|0}function Df(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if(!d&c>>>0>=4294967280|d){na();s();}Ab(a+16|0,a,b,c,d,e,f);return 0}function Xe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=T-32|0;T=f;Aa(f,d,e,0);a=Fb(a,b,c,d+16|0,f);T=f+32|0;return a|0}function yf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=a;a=0;return hb(i,b,a|c,d,e,a|f,g,h)|0}function sf(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0;i=a;a=0;return sb(i,b,a|c,d,e,a|f,g,h)|0}function gf(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;return Fd(a,b,c,d,e,f,g,h,i,j)|0}function rh(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-32|0;T=d;e=-1;if(!Ea(d,c,b)){e=Aa(a,39680,d,0);}T=d+32|0;return e|0}function mb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=T-32|0;T=d;e=-1;if(!Ea(d,c,b)){e=Sa(a,39760,d,0);}T=d+32|0;return e|0}function Ya(a,b){a=a|0;b=b|0;var c=0;c=T+-64|0;T=c;Ca(a,c);a=a+208|0;va(a,c,64,0);Ca(a,b);ja(c,64);T=c- -64|0;return 0}function Ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=T+-64|0;T=e;Ca(a,e);a=qc(b,c,e,64,0,d,1);T=e- -64|0;return a|0}function Ib(a,b){var c=0,d=0,e=0;c=b+120|0;ga(a,b,c);d=b+40|0;e=b+80|0;ga(a+40|0,d,e);ga(a+80|0,e,c);ga(a+120|0,b,d);}function qb(a,b){a=a|0;b=b|0;var c=0;c=T-32|0;T=c;Ua(a,c);a=a+104|0;La(a,c,32,0);Ua(a,b);ja(c,32);T=c+32|0;return 0}function hd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=a;a=0;return be(h,b,a|c,d,a|e,f,g)|0}function Tf(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return qe(a,b,c,d,e,f,g,h,i)|0}function Of(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;h=a;a=0;return ke(h,b,a|c,d,a|e,f,g)|0}function rc(a,b,c,d,e,f){var g=0;g=T-32|0;T=g;Sa(g,e,f,0);a=sb(a,b,c,d,e+16|0,0,0,g);ja(g,32);T=g+32|0;return a}function ye(a){a=a|0;while(1){za(a,32);w[a+31|0]=z[a+31|0]&31;if(!Jc(a)){continue}if(ya(a,32)){continue}break}}function Td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=T+-64|0;T=d;Ca(a,d);a=pc(b,d,64,0,c,1);T=d- -64|0;return a|0}function ki(){var a=0,b=0;a=y[10307];a:{if(!a){break a}a=y[a+20>>2];if(!a){break a}b=X[a|0]()|0;}return b|0}function Zd(a,b,c,d,e){var f=0;f=T-32|0;T=f;Sa(f,d,e,0);a=ac(a,b,c,d+16|0,f);ja(f,32);T=f+32|0;return a}function Ia(a,b,c){a=a|0;b=b|0;c=c|0;if(c>>>0>=256){Q(1366,1279,107,1123);s();}return Cc(a,b,c)|0}function vf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return gb(a,b,c,d,e,f,g)|0}function rd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ab(a,b,c,d,e,f,g)|0}function qd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Qb(a,b,c,d,e,f,g)|0}function od(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Wb(a,b,c,d,e,f,g)|0}function mf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return $d(a,b,c,d,e,f,g)|0}function kf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return _d(a,b,c,d,e,f,g)|0}function hb(a,b,c,d,e,f,g,h){if((d|0)==1|d>>>0>1){na();s();}return X[y[9964]](a,b,c,d,e,f,g,h)|0}function _c(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Rb(a,b,c,d,e,f,g)|0}function Zf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Bd(a,b,c,d,e,f,g)|0}function Xf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Ad(a,b,c,d,e,f,g)|0}function $c(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;return Bb(a,b,c,d,e,f,g)|0}function ni(){var a=0,b=0;a=T-16|0;T=a;w[a+15|0]=0;b=P(39864,a+15|0,0)|0;T=a+16|0;return b|0}function Zb(a,b,c,d,e,f){if((d|0)==1|d>>>0>1){na();s();}return X[y[9964]](a,b,c,d,e,0,0,f)|0}function Di(a,b){var c=0,d=0;c=b&31;d=(-1<>>c|0;c=a;a=0-b&31;return d|(c&-1>>>a)<>>0>1){na();s();}return X[y[9965]](a,b,c,d,e,0,f)|0}function ti(){var a=0;if(y[10305]){a=1;}else {Ae();za(41200,16);y[10305]=1;a=0;}return a|0}function dd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;qc(a,b,c,d,e,f,0);return 0}function Ob(a){var b=0;b=y[a>>2];if(b){ta(b);}y[a>>2]=0;y[a+4>>2]=0;y[a+8>>2]=0;return 0}function Bi(a,b){var c=0,d=0;c=b&31;d=(-1>>>c&a)<>>a}function xf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Zb(a,b,c,d,e,f)|0}function uf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Yb(a,b,c,d,e,f)|0}function rf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gb(a,b,c,d,e,f)|0}function ad(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return rc(a,b,c,d,e,f)|0}function Lb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Ld(a,b,c,d,e,f)|0}function Kb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Kd(a,b,c,d,e,f)|0}function _a(a,b,c,d,e){if((c|0)==1|c>>>0>1){na();s();}return X[y[9963]](a,b,c,d,e)|0}function Fb(a,b,c,d,e){if((c|0)==1|c>>>0>1){na();s();}return X[y[9962]](a,b,c,d,e)|0}function Be(a,b,c,d,e,f){if((d|0)==1|d>>>0>1){na();s();}X[y[9965]](a,b,c,d,e,1,f)|0;}function cd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return pc(a,b,c,d,e,0)|0}function zf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Fb(a,b,c,d,e)|0}function wf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return _a(a,b,c,d,e)|0}function tf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return ac(a,b,c,d,e)|0}function kd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Zc(a,b,c,d,e)|0}function jd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Jb(a,b,c,d,e)|0}function bd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Zd(a,b,c,d,e)|0}function Ae(){var a=0;a=T-16|0;T=a;w[a+15|0]=0;P(39900,a+15|0,0)|0;T=a+16|0;}function Yh(a){a=a|0;var b=0;b=T-160|0;T=b;a=ib(b,a);T=b+160|0;return !a|0}function Gg(a,b,c){a=a|0;b=b|0;c=c|0;Wb(b,32,c,32,0,0,0);return wb(a,b)|0}function Uh(a){a=a|0;var b=0;b=T+-64|0;T=b;za(b,64);Gc(a,b);T=b- -64|0;}function vb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bc(a,b,c,d,20);return 0}function ub(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bc(a,b,c,d,12);return 0}function tb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;bc(a,b,c,d,8);return 0}function Zh(a){a=a|0;var b=0;b=T-32|0;T=b;za(b,32);Hc(a,b);T=b+32|0;}function ud(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Na(a,b,c,d)|0}function sb(a,b,c,d,e,f,g,h){return X[y[9957]](a,b,c,d,e,f,g,h)|0}function nd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return oa(a,b,c,d)|0}function md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return rb(a,b,c,d)|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return la(a,b,c,d)|0}function ic(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return va(a,b,c,d)|0}function hh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ud(a,b,c,d)|0}function fh(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ja(a,b,c,d)|0}function eg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ka(a,b,c,d)|0}function Sf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return La(a,b,c,d)|0}function Nf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return je(a,b,c,d)|0}function Mf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ie(a,b,c,d)|0}function Lf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ge(a,b,c,d)|0}function Jf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ae(a,b,c,d)|0}function If(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;kc(a,b,c,d);return 0}function Gb(a,b,c,d,e,f){return X[y[9957]](a,b,c,d,e,0,0,f)|0}function mc(a){y[a>>2]=0;y[a+4>>2]=0;y[a+8>>2]=0;return 0}function hi(a,b,c){a=a|0;b=b|0;c=c|0;return Na(a,b,c,0)|0}function Xg(a,b,c){a=a|0;b=b|0;c=c|0;return Dd(a,b,c,1)|0}function Wg(a,b,c){a=a|0;b=b|0;c=c|0;return Dd(a,b,c,0)|0}function Fh(a,b,c){a=a|0;b=b|0;c=c|0;return Ka(a,b,c,0)|0}function na(){var a=0;a=y[10306];if(a){X[a|0]();}Ic();s();}function ze(a,b,c){a=a|0;b=b|0;c=c|0;return Va(a,b,c)|0}function kh(a,b,c){a=a|0;b=b|0;c=c|0;return Yd(a,b,c)|0}function gh(a,b,c){a=a|0;b=b|0;c=c|0;return Td(a,b,c)|0}function eh(a,b,c){a=a|0;b=b|0;c=c|0;return Ia(a,b,c)|0}function ch(a,b,c){a=a|0;b=b|0;c=c|0;return tc(a,b,c)|0}function ah(a,b,c){a=a|0;b=b|0;c=c|0;return mb(a,b,c)|0}function Hg(a,b,c){a=a|0;b=b|0;c=c|0;return Ea(a,b,c)|0}function Gh(a,b,c){a=a|0;b=b|0;c=c|0;return Xa(a,b,c)|0}function nb(a,b){a=a|0;b=b|0;za(b,32);return wb(a,b)|0}function li(a,b,c){a=a|0;b=b|0;c=c|0;_a(a,b,0,38432,c);}function wb(a,b){a=a|0;b=b|0;return X[y[9955]](a,b)|0}function gi(a,b){a=a|0;b=b|0;Ya(a,b);ja(a,4);return 0}function ac(a,b,c,d,e){return X[y[9956]](a,b,c,d,e)|0}function Zc(a,b,c,d,e){return X[y[9949]](a,b,c,d,e)|0}function Jb(a,b,c,d,e){return X[y[9950]](a,b,c,d,e)|0}function Ga(a,b){a=a|0;b=b|0;return X[y[9951]](a,b)|0}function Fa(a,b){a=a|0;b=b|0;return X[y[9953]](a,b)|0}function Eh(a,b){a=a|0;b=b|0;qb(a,b);ja(a,4);return 0}function zi(a){if(a){return 31-H(a-1^a)|0}return 32}function la(a,b,c,d){return X[y[9952]](a,b,c,d)|0}function xd(a,b){a=a|0;b=b|0;return Wc(a,b,64)|0}function kb(a,b){a=a|0;b=b|0;return Wc(a,b,32)|0}function Vg(a,b){a=a|0;b=b|0;return Cd(a,b,1)|0}function Ug(a,b){a=a|0;b=b|0;return Cd(a,b,0)|0}function re(a,b,c){a=a|0;b=b|0;c=c|0;ha(a,b,c);}function Ph(a,b,c){a=a|0;b=b|0;c=c|0;ue(a,b,c);}function Oh(a,b,c){a=a|0;b=b|0;c=c|0;se(a,b,c);}function jh(a,b){a=a|0;b=b|0;return Xd(a,b)|0}function bh(a,b){a=a|0;b=b|0;return nb(a,b)|0}function _h(a,b){a=a|0;b=b|0;Hc(a,b);return 0}function Vh(a,b){a=a|0;b=b|0;Gc(a,b);return 0}function Sh(a,b){a=a|0;b=b|0;return xe(a,b)|0}function Sg(a,b){a=a|0;b=b|0;return Ga(a,b)|0}function Rg(a,b){a=a|0;b=b|0;return Fa(a,b)|0}function Ig(a,b){a=a|0;b=b|0;return wb(a,b)|0}function Af(a,b){a=a|0;b=b|0;jc(a,b);return 0}function je(a,b,c,d){return Xc(a,b,c,d,1)}function ie(a,b,c,d){return he(a,b,c,d,1)}function ge(a,b,c,d){return he(a,b,c,d,2)}function ae(a,b,c,d){return Xc(a,b,c,d,2)}function Na(a,b,c,d){va(a,b,c,d);return 0}function Ka(a,b,c,d){La(a,b,c,d);return 0}function Rh(a,b){a=a|0;b=b|0;we(a,b);}function Qh(a,b){a=a|0;b=b|0;ve(a,b);}function Nh(a,b){a=a|0;b=b|0;te(a,b);}function ih(a){a=a|0;return Vd(a)|0}function Vd(a){a=a|0;Za(a);return 0}function ja(a,b){if(b){o(a,0,b);}}function wc(){return -2147483648}function uc(){return 1073741824}function uh(){return 134217728}function th(){return 536870912}function de(){return 268435456}function ra(a){a=a|0;za(a,32);}function me(){return 33554432}function ei(a){a=a|0;za(a,64);}function ee(){return 67108864}function Je(a){a=a|0;za(a,16);}function Ed(){return 16777216}function Yg(){return 524288}function ci(){return 16320}function Zg(){return 32768}function Th(a){a=a|0;ye(a);}function xc(){return 8192}function wh(){return 1554}function sh(){return 1156}function qh(){return 1538}function oi(){return 1089}function lh(){return 1454}function fe(){return 1564}function dh(){return 1476}function _g(){return 1575}function Tg(){return 1521}function Qg(){return 1494}function Nd(){return 1338}function Mg(){return 1486}function Lg(){return 1531}function Kg(){return 1462}function Jg(){return 1443}function Dg(){return 1332}function Cg(){return 1547}function Bh(){return 8160}function yc(){return 128}function pe(){return 384}function Rc(){return 256}function Dc(){return 416}function Cb(){return 208}function Ag(){return 104}function $g(){return 102}function ua(){return 64}function ma(){return 16}function ka(){return 32}function Wd(){return -65}function Ta(){return -17}function Md(){return 48}function Ma(){return 24}function Le(){return -33}function Jh(){return 52}function Ih(){return 17}function Hh(){return -18}function Ce(){return 12}function Bg(){return 26}function wa(){return -1}function vh(){return 6}function vc(){return 4}function fb(){return 2}function Vb(){return 3}function Oa(){return 8}function Db(){return 1}function Ba(){return 0}function Ic(){R();s();}function yi(){} +// EMSCRIPTEN_END_FUNCS +a=z;m();var X=[null,og,Vf,Qf,If,Af,Ue,Te,Se,Re,xi,wi,vi,ui,si,ri,qi,pi];function Y(){return v.byteLength/65536|0}function ba(ca){ca=ca|0;var Z=Y()|0;var _=Z+ca|0;if(Z<_&&_<65536){var $=new ArrayBuffer(E(_,65536));var aa=new Int8Array($);aa.set(w);w=new Int8Array($);x=new Int16Array($);y=new Int32Array($);z=new Uint8Array($);A=new Uint16Array($);B=new Uint32Array($);v=$;a=z;}return Z}return {e:Object.create(Object.prototype,{grow:{value:ba},buffer:{get:function(){return v}}}),f:yi,g:ma,h:Ba,i:ma,j:ka,k:Le,l:Je,m:zg,n:yg,o:xg,p:wg,q:ka,r:Ba,s:ka,t:ka,u:Le,v:ra,w:vg,x:ug,y:tg,z:sg,A:Ba,B:rg,C:qg,D:pg,E:ng,F:mg,G:lg,H:kg,I:jg,J:ka,K:Ce,L:Ba,M:ma,N:Ta,O:ra,P:ka,Q:Oa,R:Ba,S:ma,T:Ta,U:ra,V:ig,W:hg,X:gg,Y:fg,Z:ka,_:Ma,$:Ba,aa:ma,ba:Ta,ca:ra,da:ka,ea:ka,fa:Kg,ga:wd,ha:vd,ia:ra,ja:ka,ka,la:Cb,ma:ra,na:Xa,oa:eg,pa:qb,qa:dg,ra:cg,sa:ua,ta:ka,ua:Dc,va:ra,wa:Va,xa:ud,ya:Ya,za:bg,Aa:ag,Ba:ka,Ca:ka,Da:Dc,Ea:ra,Fa:ze,Ga:ud,Ha:Ng,Ia:wd,Ja:vd,Ka:ka,La:ka,Ma:ka,Na:ka,Oa:Ma,Pa:ka,Qa:ma,Ra:ma,Sa:Ta,Ta:dh,Ua:ch,Va:bh,Wa:ah,Xa:Lb,Ya:Kb,Za:td,_a:sd,$a:rd,ab:$f,bb:_f,cb:Zf,db:qd,eb:Yf,fb:pd,gb:Xf,hb:Wf,ib:Uf,jb:Md,kb:tc,lb:nb,mb,nb:Lb,ob:Kb,pb:td,qb:sd,rb:ka,sb:ka,tb:ka,ub:ka,vb:Ma,wb:ka,xb:ma,yb:ma,zb:Ta,Ab:Aa,Bb:ka,Cb:ma,Db:ka,Eb:ma,Fb:Sa,Gb:ka,Hb:ma,Ib:ka,Jb:ma,Kb:vb,Lb:ua,Mb:ma,Nb:ka,Ob:ma,Pb:ub,Qb:ua,Rb:ma,Sb:ka,Tb:ma,Ub:tb,Vb:ua,Wb:ma,Xb:ka,Yb:ma,Zb:ma,_b:ua,$b:ka,ac:ma,bc:ua,cc:ka,dc:Nd,ec:pe,fc:od,gc:fh,hc:nd,ic:eh,jc:ra,kc:ma,lc:ua,mc:ka,nc:ma,oc:ua,pc:ka,qc:ma,rc:ma,sc:pe,tc:ra,uc:od,vc:Tf,wc:Ja,xc:xh,yc:nd,zc:Ia,Ac:ua,Bc:md,Cc:Lg,Dc:ka,Ec:Ag,Fc:Ub,Gc:Sf,Hc:Ua,Ic:Rf,Jc:ua,Kc:Cb,Lc:Za,Mc:ic,Nc:Ca,Oc:md,Pc:ma,Qc:ua,Rc:Oa,Sc:ka,Tc:ld,Uc:Nd,Vc:ma,Wc:ua,Xc:Oa,Yc:ka,Zc:ld,_c:ra,$c:Gh,ad:Fh,bd:Eh,cd:Dh,dd:ra,ed:Ch,fd:ka,gd:Ba,hd:Bh,id:Cb,jd:ze,kd:hi,ld:gi,md:fi,nd:ei,od:di,pd:ua,qd:Ba,rd:ci,sd:Dc,td:Gg,ud:nb,vd:Fg,wd:Eg,xd:ka,yd:ka,zd:ka,Ad:ka,Bd:Dg,Cd:Rc,Dd:ma,Ed:ka,Fd:kd,Gd:jd,Hd:Sg,Id:id,Jd:Rg,Kd:Qg,Ld:ra,Md:kd,Nd:jd,Od:Ga,Pd:id,Qd:Fa,Rd:ma,Sd:ka,Td:Rc,Ud:ra,Vd:Db,Wd:ma,Xd:wa,Yd:Ba,Zd:wa,_d:ma,$d:yc,ae:wh,be:Vb,ce:wa,de:xc,ee:wc,fe:vc,ge:me,he:vh,ie:uh,je:Oa,ke:th,le:Pf,me:Of,ne:Nf,oe:Mf,pe:Lf,qe:fb,re:ma,se:wa,te:Ba,ue:wa,ve:ma,we:yc,xe:fe,ye:Db,ze:wa,Ae:xc,Be:wc,Ce:fb,De:ee,Ee:Vb,Fe:de,Ge:vc,He:uc,Ie:Kf,Je:hd,Ke:Jf,Le:Db,Me:fb,Ne:fb,Oe:ma,Pe:wa,Qe:Ba,Re:wa,Se:ma,Te:yc,Ue:fe,Ve:Db,We:wa,Xe:xc,Ye:wc,Ze:fb,_e:ee,$e:Vb,af:de,bf:vc,cf:uc,df:Hf,ef:hd,ff:Gf,gf:Ff,hf:Ef,jf:sh,kf:Jg,lf:Ig,mf:Hg,nf:ka,of:ka,pf:Ea,qf:wb,rf:ka,sf:ka,tf:ka,uf:Ma,vf:ka,wf:ma,xf:ma,yf:Ta,zf:Mg,Af:Lb,Bf:Kb,Cf:ra,Df:rd,Ef:Df,Ff:qd,Gf:pd,Hf:Lb,If:Kb,Jf:ka,Kf:Ma,Lf:ka,Mf:ma,Nf:ma,Of:Ta,Pf:ra,Qf:ra,Rf:Mh,Sf:Lh,Tf:Kh,Uf:Cf,Vf:Bf,Wf:Jh,Xf:Ih,Yf:Ma,Zf:ka,_f:Hh,$f:Ba,ag:Db,bg:fb,cg:Vb,dg:Oa,eg:ma,fg:Tg,gg:gd,hg:Je,ig:Oa,jg:ma,kg:gd,lg:Cb,mg:ua,ng:ka,og:ka,pg:ua,qg:Wd,rg:lh,sg:kh,tg:jh,ug:fd,vg:ed,wg:dd,xg:cd,yg:ih,zg:ic,Ag:hh,Bg:gh,Cg:Cb,Dg:ua,Eg:ka,Fg:ka,Gg:ua,Hg:Wd,Ig:nh,Jg:mh,Kg:Vd,Lg:ic,Mg:Ud,Ng:Td,Og:Yd,Pg:Xd,Qg:ph,Rg:oh,Sg:cd,Tg:ed,Ug:dd,Vg:fd,Wg:ka,Xg:Oa,Yg:wa,Zg:ka,_g:Ce,$g:wa,ah:zf,bh:yf,ch:xf,dh:wf,eh:vf,fh:uf,gh:ra,hh:ra,ih:ka,jh:Ma,kh:wa,lh:qh,mh:bd,nh:ad,oh:ra,ph:ka,qh:Oa,rh:wa,sh:tf,th:sf,uh:rf,vh:ra,wh:bd,xh:qf,yh:ad,zh:ka,Ah:Ma,Bh:wa,Ch:ra,Dh:ma,Eh:ka,Fh:ua,Gh:db,Hh:kb,Ih:xd,Jh:oi,Kh:ni,Lh:Ae,Mh:mi,Nh:za,Oh:li,Ph:ka,Qh:ki,Rh:pf,Sh:Ah,Th:zh,Uh:yh,Vh:Bc,Wh:Ac,Xh:ti,Yh:ji,Zh:ii,_h:Cg,$h:Bg,ai:fb,bi:Ba,ci:tc,di:nb,ei:rh,fi:$c,gi:of,hi:nf,ii:mf,ji:_c,ki:lf,li:Yc,mi:kf,ni:ka,oi:ka,pi:ka,qi:ka,ri:Ma,si:ma,ti:Ta,ui:jf,vi:hf,wi:Md,xi:bi,yi:ai,zi:$h,Ai:_h,Bi:Zh,Ci:ye,Di:xe,Ei:we,Fi:ve,Gi:ue,Hi:te,Ii:se,Ji:re,Ki:ka,Li:ua,Mi:ka,Ni:ua,Oi:ka,Pi:Yh,Qi:Xh,Ri:Wh,Si:Vh,Ti:Uh,Ui:Th,Vi:Sh,Wi:Rh,Xi:Qh,Yi:Ph,Zi:Oh,_i:re,$i:Nh,aj:ka,bj:ua,cj:ua,dj:ka,ej:gf,fj:ma,gj:wa,hj:Ba,ij:wa,jj:ka,kj:$g,lj:_g,mj:Zg,nj:wa,oj:Ed,pj:wa,qj:Yg,rj:Ed,sj:me,tj:uc,uj:ff,vj:ef,wj:df,xj:cf,yj:Xg,zj:Wg,Aj:Vg,Bj:Ug,Cj:ka,Dj:ka,Ej:Pg,Fj:Og,Gj:ka,Hj:ka,Ij:$c,Jj:bf,Kj:_c,Lj:Yc,Mj:ka,Nj:Ma,Oj:ma,Pj:Ta,Qj:ma,Rj:ma,Sj:af,Tj:$e,Uj:_e,Vj:ka,Wj:Oa,Xj:wa,Yj:ra,Zj:Ze,_j:Ye,$j:ka,ak:Oa,bk:wa,ck:ra,dk:ka,ek:Ma,fk:wa,gk:Xe,hk:We,ik:Ve,jk:ra,kk:Da,lk:ta}}return da(ea)} +// EMSCRIPTEN_END_ASM + + +)(info);},instantiate:function(binary,info){return {then:function(ok){var module=new WebAssembly.Module(binary);ok({instance:new WebAssembly.Instance(module,info)});}}},RuntimeError:Error,isWasm2js:true};{wasmBinary=[];}var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(onPreRuns);}function initRuntime(){wasmExports["f"]();}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(onPostRuns);}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(file){}function getWasmBinary(file){}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason);}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency();return wasmExports}addRunDependency();function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst));});})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports$1=receiveInstantiationResult(result);return exports$1}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module);}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies);};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":return HEAP8[ptr];case "i8":return HEAP8[ptr];case "i16":return HEAP16[ptr>>1];case "i32":return HEAP32[ptr>>2];case "i64":abort("to do getValue(i64) use WASM_BIGINT");case "float":return HEAPF32[ptr>>2];case "double":return HEAPF64[ptr>>3];case "*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`);}}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":HEAP8[ptr]=value;break;case "i8":HEAP8[ptr]=value;break;case "i16":HEAP16[ptr>>1]=value;break;case "i32":HEAP32[ptr>>2]=value;break;case "i64":abort("to do setValue(i64) use WASM_BIGINT");case "float":HEAPF32[ptr>>2]=value;break;case "double":HEAPF64[ptr>>3]=value;break;case "*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`);}}var UTF8Decoder=new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>{if(!ptr)return "";var end=findStringEnd(HEAPU8,ptr,maxBytesToRead,ignoreNul);return UTF8Decoder.decode(HEAPU8.subarray(ptr,end))};var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var __abort_js=()=>abort("");var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4;}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};{if(Module["noExitRuntime"])Module["noExitRuntime"];if(Module["print"])Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])Module["arguments"];if(Module["thisProgram"])Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()();}}}Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;var ASM_CONSTS={39864:()=>Module.getRandomValue(),39900:()=>{if(Module.getRandomValue===undefined){try{var window_="object"===typeof window?window:self;var crypto_=typeof window_.crypto!=="undefined"?window_.crypto:window_.msCrypto;crypto_=crypto_===undefined?crypto:crypto_;var randomValuesStandard=function(){var buf=new Uint32Array(1);crypto_.getRandomValues(buf);return buf[0]>>>0};randomValuesStandard();Module.getRandomValue=randomValuesStandard;}catch(e){try{var crypto=null;var randomValueNodeJS=function(){var buf=crypto["randomBytes"](4);return (buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0};randomValueNodeJS();Module.getRandomValue=randomValueNodeJS;}catch(e){throw "No secure random number generator found"}}}}};var wasmMemory;function assignWasmExports(wasmExports){Module["_crypto_aead_aegis128l_keybytes"]=wasmExports["g"];Module["_crypto_aead_aegis128l_nsecbytes"]=wasmExports["h"];Module["_crypto_aead_aegis128l_npubbytes"]=wasmExports["i"];Module["_crypto_aead_aegis128l_abytes"]=wasmExports["j"];Module["_crypto_aead_aegis128l_messagebytes_max"]=wasmExports["k"];Module["_crypto_aead_aegis128l_keygen"]=wasmExports["l"];Module["_crypto_aead_aegis128l_encrypt"]=wasmExports["m"];Module["_crypto_aead_aegis128l_encrypt_detached"]=wasmExports["n"];Module["_crypto_aead_aegis128l_decrypt"]=wasmExports["o"];Module["_crypto_aead_aegis128l_decrypt_detached"]=wasmExports["p"];Module["_crypto_aead_aegis256_keybytes"]=wasmExports["q"];Module["_crypto_aead_aegis256_nsecbytes"]=wasmExports["r"];Module["_crypto_aead_aegis256_npubbytes"]=wasmExports["s"];Module["_crypto_aead_aegis256_abytes"]=wasmExports["t"];Module["_crypto_aead_aegis256_messagebytes_max"]=wasmExports["u"];Module["_crypto_aead_aegis256_keygen"]=wasmExports["v"];Module["_crypto_aead_aegis256_encrypt"]=wasmExports["w"];Module["_crypto_aead_aegis256_encrypt_detached"]=wasmExports["x"];Module["_crypto_aead_aegis256_decrypt"]=wasmExports["y"];Module["_crypto_aead_aegis256_decrypt_detached"]=wasmExports["z"];Module["_crypto_aead_aes256gcm_is_available"]=wasmExports["A"];Module["_crypto_aead_chacha20poly1305_encrypt_detached"]=wasmExports["B"];Module["_crypto_aead_chacha20poly1305_encrypt"]=wasmExports["C"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt_detached"]=wasmExports["D"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt"]=wasmExports["E"];Module["_crypto_aead_chacha20poly1305_decrypt_detached"]=wasmExports["F"];Module["_crypto_aead_chacha20poly1305_decrypt"]=wasmExports["G"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt_detached"]=wasmExports["H"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt"]=wasmExports["I"];Module["_crypto_aead_chacha20poly1305_ietf_keybytes"]=wasmExports["J"];Module["_crypto_aead_chacha20poly1305_ietf_npubbytes"]=wasmExports["K"];Module["_crypto_aead_chacha20poly1305_ietf_nsecbytes"]=wasmExports["L"];Module["_crypto_aead_chacha20poly1305_ietf_abytes"]=wasmExports["M"];Module["_crypto_aead_chacha20poly1305_ietf_messagebytes_max"]=wasmExports["N"];Module["_crypto_aead_chacha20poly1305_ietf_keygen"]=wasmExports["O"];Module["_crypto_aead_chacha20poly1305_keybytes"]=wasmExports["P"];Module["_crypto_aead_chacha20poly1305_npubbytes"]=wasmExports["Q"];Module["_crypto_aead_chacha20poly1305_nsecbytes"]=wasmExports["R"];Module["_crypto_aead_chacha20poly1305_abytes"]=wasmExports["S"];Module["_crypto_aead_chacha20poly1305_messagebytes_max"]=wasmExports["T"];Module["_crypto_aead_chacha20poly1305_keygen"]=wasmExports["U"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt_detached"]=wasmExports["V"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt"]=wasmExports["W"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt_detached"]=wasmExports["X"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt"]=wasmExports["Y"];Module["_crypto_aead_xchacha20poly1305_ietf_keybytes"]=wasmExports["Z"];Module["_crypto_aead_xchacha20poly1305_ietf_npubbytes"]=wasmExports["_"];Module["_crypto_aead_xchacha20poly1305_ietf_nsecbytes"]=wasmExports["$"];Module["_crypto_aead_xchacha20poly1305_ietf_abytes"]=wasmExports["aa"];Module["_crypto_aead_xchacha20poly1305_ietf_messagebytes_max"]=wasmExports["ba"];Module["_crypto_aead_xchacha20poly1305_ietf_keygen"]=wasmExports["ca"];Module["_crypto_auth_bytes"]=wasmExports["da"];Module["_crypto_auth_keybytes"]=wasmExports["ea"];Module["_crypto_auth_primitive"]=wasmExports["fa"];Module["_crypto_auth"]=wasmExports["ga"];Module["_crypto_auth_verify"]=wasmExports["ha"];Module["_crypto_auth_keygen"]=wasmExports["ia"];Module["_crypto_auth_hmacsha256_bytes"]=wasmExports["ja"];Module["_crypto_auth_hmacsha256_keybytes"]=wasmExports["ka"];Module["_crypto_auth_hmacsha256_statebytes"]=wasmExports["la"];Module["_crypto_auth_hmacsha256_keygen"]=wasmExports["ma"];Module["_crypto_auth_hmacsha256_init"]=wasmExports["na"];Module["_crypto_auth_hmacsha256_update"]=wasmExports["oa"];Module["_crypto_auth_hmacsha256_final"]=wasmExports["pa"];Module["_crypto_auth_hmacsha256"]=wasmExports["qa"];Module["_crypto_auth_hmacsha256_verify"]=wasmExports["ra"];Module["_crypto_auth_hmacsha512_bytes"]=wasmExports["sa"];Module["_crypto_auth_hmacsha512_keybytes"]=wasmExports["ta"];Module["_crypto_auth_hmacsha512_statebytes"]=wasmExports["ua"];Module["_crypto_auth_hmacsha512_keygen"]=wasmExports["va"];Module["_crypto_auth_hmacsha512_init"]=wasmExports["wa"];Module["_crypto_auth_hmacsha512_update"]=wasmExports["xa"];Module["_crypto_auth_hmacsha512_final"]=wasmExports["ya"];Module["_crypto_auth_hmacsha512"]=wasmExports["za"];Module["_crypto_auth_hmacsha512_verify"]=wasmExports["Aa"];Module["_crypto_auth_hmacsha512256_bytes"]=wasmExports["Ba"];Module["_crypto_auth_hmacsha512256_keybytes"]=wasmExports["Ca"];Module["_crypto_auth_hmacsha512256_statebytes"]=wasmExports["Da"];Module["_crypto_auth_hmacsha512256_keygen"]=wasmExports["Ea"];Module["_crypto_auth_hmacsha512256_init"]=wasmExports["Fa"];Module["_crypto_auth_hmacsha512256_update"]=wasmExports["Ga"];Module["_crypto_auth_hmacsha512256_final"]=wasmExports["Ha"];Module["_crypto_auth_hmacsha512256"]=wasmExports["Ia"];Module["_crypto_auth_hmacsha512256_verify"]=wasmExports["Ja"];Module["_crypto_box_seedbytes"]=wasmExports["Ka"];Module["_crypto_box_publickeybytes"]=wasmExports["La"];Module["_crypto_box_secretkeybytes"]=wasmExports["Ma"];Module["_crypto_box_beforenmbytes"]=wasmExports["Na"];Module["_crypto_box_noncebytes"]=wasmExports["Oa"];Module["_crypto_box_zerobytes"]=wasmExports["Pa"];Module["_crypto_box_boxzerobytes"]=wasmExports["Qa"];Module["_crypto_box_macbytes"]=wasmExports["Ra"];Module["_crypto_box_messagebytes_max"]=wasmExports["Sa"];Module["_crypto_box_primitive"]=wasmExports["Ta"];Module["_crypto_box_seed_keypair"]=wasmExports["Ua"];Module["_crypto_box_keypair"]=wasmExports["Va"];Module["_crypto_box_beforenm"]=wasmExports["Wa"];Module["_crypto_box_afternm"]=wasmExports["Xa"];Module["_crypto_box_open_afternm"]=wasmExports["Ya"];Module["_crypto_box"]=wasmExports["Za"];Module["_crypto_box_open"]=wasmExports["_a"];Module["_crypto_box_detached_afternm"]=wasmExports["$a"];Module["_crypto_box_detached"]=wasmExports["ab"];Module["_crypto_box_easy_afternm"]=wasmExports["bb"];Module["_crypto_box_easy"]=wasmExports["cb"];Module["_crypto_box_open_detached_afternm"]=wasmExports["db"];Module["_crypto_box_open_detached"]=wasmExports["eb"];Module["_crypto_box_open_easy_afternm"]=wasmExports["fb"];Module["_crypto_box_open_easy"]=wasmExports["gb"];Module["_crypto_box_seal"]=wasmExports["hb"];Module["_crypto_box_seal_open"]=wasmExports["ib"];Module["_crypto_box_sealbytes"]=wasmExports["jb"];Module["_crypto_box_curve25519xsalsa20poly1305_seed_keypair"]=wasmExports["kb"];Module["_crypto_box_curve25519xsalsa20poly1305_keypair"]=wasmExports["lb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenm"]=wasmExports["mb"];Module["_crypto_box_curve25519xsalsa20poly1305_afternm"]=wasmExports["nb"];Module["_crypto_box_curve25519xsalsa20poly1305_open_afternm"]=wasmExports["ob"];Module["_crypto_box_curve25519xsalsa20poly1305"]=wasmExports["pb"];Module["_crypto_box_curve25519xsalsa20poly1305_open"]=wasmExports["qb"];Module["_crypto_box_curve25519xsalsa20poly1305_seedbytes"]=wasmExports["rb"];Module["_crypto_box_curve25519xsalsa20poly1305_publickeybytes"]=wasmExports["sb"];Module["_crypto_box_curve25519xsalsa20poly1305_secretkeybytes"]=wasmExports["tb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenmbytes"]=wasmExports["ub"];Module["_crypto_box_curve25519xsalsa20poly1305_noncebytes"]=wasmExports["vb"];Module["_crypto_box_curve25519xsalsa20poly1305_zerobytes"]=wasmExports["wb"];Module["_crypto_box_curve25519xsalsa20poly1305_boxzerobytes"]=wasmExports["xb"];Module["_crypto_box_curve25519xsalsa20poly1305_macbytes"]=wasmExports["yb"];Module["_crypto_box_curve25519xsalsa20poly1305_messagebytes_max"]=wasmExports["zb"];Module["_crypto_core_hchacha20"]=wasmExports["Ab"];Module["_crypto_core_hchacha20_outputbytes"]=wasmExports["Bb"];Module["_crypto_core_hchacha20_inputbytes"]=wasmExports["Cb"];Module["_crypto_core_hchacha20_keybytes"]=wasmExports["Db"];Module["_crypto_core_hchacha20_constbytes"]=wasmExports["Eb"];Module["_crypto_core_hsalsa20"]=wasmExports["Fb"];Module["_crypto_core_hsalsa20_outputbytes"]=wasmExports["Gb"];Module["_crypto_core_hsalsa20_inputbytes"]=wasmExports["Hb"];Module["_crypto_core_hsalsa20_keybytes"]=wasmExports["Ib"];Module["_crypto_core_hsalsa20_constbytes"]=wasmExports["Jb"];Module["_crypto_core_salsa20"]=wasmExports["Kb"];Module["_crypto_core_salsa20_outputbytes"]=wasmExports["Lb"];Module["_crypto_core_salsa20_inputbytes"]=wasmExports["Mb"];Module["_crypto_core_salsa20_keybytes"]=wasmExports["Nb"];Module["_crypto_core_salsa20_constbytes"]=wasmExports["Ob"];Module["_crypto_core_salsa2012"]=wasmExports["Pb"];Module["_crypto_core_salsa2012_outputbytes"]=wasmExports["Qb"];Module["_crypto_core_salsa2012_inputbytes"]=wasmExports["Rb"];Module["_crypto_core_salsa2012_keybytes"]=wasmExports["Sb"];Module["_crypto_core_salsa2012_constbytes"]=wasmExports["Tb"];Module["_crypto_core_salsa208"]=wasmExports["Ub"];Module["_crypto_core_salsa208_outputbytes"]=wasmExports["Vb"];Module["_crypto_core_salsa208_inputbytes"]=wasmExports["Wb"];Module["_crypto_core_salsa208_keybytes"]=wasmExports["Xb"];Module["_crypto_core_salsa208_constbytes"]=wasmExports["Yb"];Module["_crypto_generichash_bytes_min"]=wasmExports["Zb"];Module["_crypto_generichash_bytes_max"]=wasmExports["_b"];Module["_crypto_generichash_bytes"]=wasmExports["$b"];Module["_crypto_generichash_keybytes_min"]=wasmExports["ac"];Module["_crypto_generichash_keybytes_max"]=wasmExports["bc"];Module["_crypto_generichash_keybytes"]=wasmExports["cc"];Module["_crypto_generichash_primitive"]=wasmExports["dc"];Module["_crypto_generichash_statebytes"]=wasmExports["ec"];Module["_crypto_generichash"]=wasmExports["fc"];Module["_crypto_generichash_init"]=wasmExports["gc"];Module["_crypto_generichash_update"]=wasmExports["hc"];Module["_crypto_generichash_final"]=wasmExports["ic"];Module["_crypto_generichash_keygen"]=wasmExports["jc"];Module["_crypto_generichash_blake2b_bytes_min"]=wasmExports["kc"];Module["_crypto_generichash_blake2b_bytes_max"]=wasmExports["lc"];Module["_crypto_generichash_blake2b_bytes"]=wasmExports["mc"];Module["_crypto_generichash_blake2b_keybytes_min"]=wasmExports["nc"];Module["_crypto_generichash_blake2b_keybytes_max"]=wasmExports["oc"];Module["_crypto_generichash_blake2b_keybytes"]=wasmExports["pc"];Module["_crypto_generichash_blake2b_saltbytes"]=wasmExports["qc"];Module["_crypto_generichash_blake2b_personalbytes"]=wasmExports["rc"];Module["_crypto_generichash_blake2b_statebytes"]=wasmExports["sc"];Module["_crypto_generichash_blake2b_keygen"]=wasmExports["tc"];Module["_crypto_generichash_blake2b"]=wasmExports["uc"];Module["_crypto_generichash_blake2b_salt_personal"]=wasmExports["vc"];Module["_crypto_generichash_blake2b_init"]=wasmExports["wc"];Module["_crypto_generichash_blake2b_init_salt_personal"]=wasmExports["xc"];Module["_crypto_generichash_blake2b_update"]=wasmExports["yc"];Module["_crypto_generichash_blake2b_final"]=wasmExports["zc"];Module["_crypto_hash_bytes"]=wasmExports["Ac"];Module["_crypto_hash"]=wasmExports["Bc"];Module["_crypto_hash_primitive"]=wasmExports["Cc"];Module["_crypto_hash_sha256_bytes"]=wasmExports["Dc"];Module["_crypto_hash_sha256_statebytes"]=wasmExports["Ec"];Module["_crypto_hash_sha256_init"]=wasmExports["Fc"];Module["_crypto_hash_sha256_update"]=wasmExports["Gc"];Module["_crypto_hash_sha256_final"]=wasmExports["Hc"];Module["_crypto_hash_sha256"]=wasmExports["Ic"];Module["_crypto_hash_sha512_bytes"]=wasmExports["Jc"];Module["_crypto_hash_sha512_statebytes"]=wasmExports["Kc"];Module["_crypto_hash_sha512_init"]=wasmExports["Lc"];Module["_crypto_hash_sha512_update"]=wasmExports["Mc"];Module["_crypto_hash_sha512_final"]=wasmExports["Nc"];Module["_crypto_hash_sha512"]=wasmExports["Oc"];Module["_crypto_kdf_blake2b_bytes_min"]=wasmExports["Pc"];Module["_crypto_kdf_blake2b_bytes_max"]=wasmExports["Qc"];Module["_crypto_kdf_blake2b_contextbytes"]=wasmExports["Rc"];Module["_crypto_kdf_blake2b_keybytes"]=wasmExports["Sc"];Module["_crypto_kdf_blake2b_derive_from_key"]=wasmExports["Tc"];Module["_crypto_kdf_primitive"]=wasmExports["Uc"];Module["_crypto_kdf_bytes_min"]=wasmExports["Vc"];Module["_crypto_kdf_bytes_max"]=wasmExports["Wc"];Module["_crypto_kdf_contextbytes"]=wasmExports["Xc"];Module["_crypto_kdf_keybytes"]=wasmExports["Yc"];Module["_crypto_kdf_derive_from_key"]=wasmExports["Zc"];Module["_crypto_kdf_keygen"]=wasmExports["_c"];Module["_crypto_kdf_hkdf_sha256_extract_init"]=wasmExports["$c"];Module["_crypto_kdf_hkdf_sha256_extract_update"]=wasmExports["ad"];Module["_crypto_kdf_hkdf_sha256_extract_final"]=wasmExports["bd"];Module["_crypto_kdf_hkdf_sha256_extract"]=wasmExports["cd"];Module["_crypto_kdf_hkdf_sha256_keygen"]=wasmExports["dd"];Module["_crypto_kdf_hkdf_sha256_expand"]=wasmExports["ed"];Module["_crypto_kdf_hkdf_sha256_keybytes"]=wasmExports["fd"];Module["_crypto_kdf_hkdf_sha256_bytes_min"]=wasmExports["gd"];Module["_crypto_kdf_hkdf_sha256_bytes_max"]=wasmExports["hd"];Module["_crypto_kdf_hkdf_sha256_statebytes"]=wasmExports["id"];Module["_crypto_kdf_hkdf_sha512_extract_init"]=wasmExports["jd"];Module["_crypto_kdf_hkdf_sha512_extract_update"]=wasmExports["kd"];Module["_crypto_kdf_hkdf_sha512_extract_final"]=wasmExports["ld"];Module["_crypto_kdf_hkdf_sha512_extract"]=wasmExports["md"];Module["_crypto_kdf_hkdf_sha512_keygen"]=wasmExports["nd"];Module["_crypto_kdf_hkdf_sha512_expand"]=wasmExports["od"];Module["_crypto_kdf_hkdf_sha512_keybytes"]=wasmExports["pd"];Module["_crypto_kdf_hkdf_sha512_bytes_min"]=wasmExports["qd"];Module["_crypto_kdf_hkdf_sha512_bytes_max"]=wasmExports["rd"];Module["_crypto_kdf_hkdf_sha512_statebytes"]=wasmExports["sd"];Module["_crypto_kx_seed_keypair"]=wasmExports["td"];Module["_crypto_kx_keypair"]=wasmExports["ud"];Module["_crypto_kx_client_session_keys"]=wasmExports["vd"];Module["_crypto_kx_server_session_keys"]=wasmExports["wd"];Module["_crypto_kx_publickeybytes"]=wasmExports["xd"];Module["_crypto_kx_secretkeybytes"]=wasmExports["yd"];Module["_crypto_kx_seedbytes"]=wasmExports["zd"];Module["_crypto_kx_sessionkeybytes"]=wasmExports["Ad"];Module["_crypto_kx_primitive"]=wasmExports["Bd"];Module["_crypto_onetimeauth_statebytes"]=wasmExports["Cd"];Module["_crypto_onetimeauth_bytes"]=wasmExports["Dd"];Module["_crypto_onetimeauth_keybytes"]=wasmExports["Ed"];Module["_crypto_onetimeauth"]=wasmExports["Fd"];Module["_crypto_onetimeauth_verify"]=wasmExports["Gd"];Module["_crypto_onetimeauth_init"]=wasmExports["Hd"];Module["_crypto_onetimeauth_update"]=wasmExports["Id"];Module["_crypto_onetimeauth_final"]=wasmExports["Jd"];Module["_crypto_onetimeauth_primitive"]=wasmExports["Kd"];Module["_crypto_onetimeauth_keygen"]=wasmExports["Ld"];Module["_crypto_onetimeauth_poly1305"]=wasmExports["Md"];Module["_crypto_onetimeauth_poly1305_verify"]=wasmExports["Nd"];Module["_crypto_onetimeauth_poly1305_init"]=wasmExports["Od"];Module["_crypto_onetimeauth_poly1305_update"]=wasmExports["Pd"];Module["_crypto_onetimeauth_poly1305_final"]=wasmExports["Qd"];Module["_crypto_onetimeauth_poly1305_bytes"]=wasmExports["Rd"];Module["_crypto_onetimeauth_poly1305_keybytes"]=wasmExports["Sd"];Module["_crypto_onetimeauth_poly1305_statebytes"]=wasmExports["Td"];Module["_crypto_onetimeauth_poly1305_keygen"]=wasmExports["Ud"];Module["_crypto_pwhash_argon2i_alg_argon2i13"]=wasmExports["Vd"];Module["_crypto_pwhash_argon2i_bytes_min"]=wasmExports["Wd"];Module["_crypto_pwhash_argon2i_bytes_max"]=wasmExports["Xd"];Module["_crypto_pwhash_argon2i_passwd_min"]=wasmExports["Yd"];Module["_crypto_pwhash_argon2i_passwd_max"]=wasmExports["Zd"];Module["_crypto_pwhash_argon2i_saltbytes"]=wasmExports["_d"];Module["_crypto_pwhash_argon2i_strbytes"]=wasmExports["$d"];Module["_crypto_pwhash_argon2i_strprefix"]=wasmExports["ae"];Module["_crypto_pwhash_argon2i_opslimit_min"]=wasmExports["be"];Module["_crypto_pwhash_argon2i_opslimit_max"]=wasmExports["ce"];Module["_crypto_pwhash_argon2i_memlimit_min"]=wasmExports["de"];Module["_crypto_pwhash_argon2i_memlimit_max"]=wasmExports["ee"];Module["_crypto_pwhash_argon2i_opslimit_interactive"]=wasmExports["fe"];Module["_crypto_pwhash_argon2i_memlimit_interactive"]=wasmExports["ge"];Module["_crypto_pwhash_argon2i_opslimit_moderate"]=wasmExports["he"];Module["_crypto_pwhash_argon2i_memlimit_moderate"]=wasmExports["ie"];Module["_crypto_pwhash_argon2i_opslimit_sensitive"]=wasmExports["je"];Module["_crypto_pwhash_argon2i_memlimit_sensitive"]=wasmExports["ke"];Module["_crypto_pwhash_argon2i"]=wasmExports["le"];Module["_crypto_pwhash_argon2i_str"]=wasmExports["me"];Module["_crypto_pwhash_argon2i_str_verify"]=wasmExports["ne"];Module["_crypto_pwhash_argon2i_str_needs_rehash"]=wasmExports["oe"];Module["_crypto_pwhash_argon2id_str_needs_rehash"]=wasmExports["pe"];Module["_crypto_pwhash_argon2id_alg_argon2id13"]=wasmExports["qe"];Module["_crypto_pwhash_argon2id_bytes_min"]=wasmExports["re"];Module["_crypto_pwhash_argon2id_bytes_max"]=wasmExports["se"];Module["_crypto_pwhash_argon2id_passwd_min"]=wasmExports["te"];Module["_crypto_pwhash_argon2id_passwd_max"]=wasmExports["ue"];Module["_crypto_pwhash_argon2id_saltbytes"]=wasmExports["ve"];Module["_crypto_pwhash_argon2id_strbytes"]=wasmExports["we"];Module["_crypto_pwhash_argon2id_strprefix"]=wasmExports["xe"];Module["_crypto_pwhash_argon2id_opslimit_min"]=wasmExports["ye"];Module["_crypto_pwhash_argon2id_opslimit_max"]=wasmExports["ze"];Module["_crypto_pwhash_argon2id_memlimit_min"]=wasmExports["Ae"];Module["_crypto_pwhash_argon2id_memlimit_max"]=wasmExports["Be"];Module["_crypto_pwhash_argon2id_opslimit_interactive"]=wasmExports["Ce"];Module["_crypto_pwhash_argon2id_memlimit_interactive"]=wasmExports["De"];Module["_crypto_pwhash_argon2id_opslimit_moderate"]=wasmExports["Ee"];Module["_crypto_pwhash_argon2id_memlimit_moderate"]=wasmExports["Fe"];Module["_crypto_pwhash_argon2id_opslimit_sensitive"]=wasmExports["Ge"];Module["_crypto_pwhash_argon2id_memlimit_sensitive"]=wasmExports["He"];Module["_crypto_pwhash_argon2id"]=wasmExports["Ie"];Module["_crypto_pwhash_argon2id_str"]=wasmExports["Je"];Module["_crypto_pwhash_argon2id_str_verify"]=wasmExports["Ke"];Module["_crypto_pwhash_alg_argon2i13"]=wasmExports["Le"];Module["_crypto_pwhash_alg_argon2id13"]=wasmExports["Me"];Module["_crypto_pwhash_alg_default"]=wasmExports["Ne"];Module["_crypto_pwhash_bytes_min"]=wasmExports["Oe"];Module["_crypto_pwhash_bytes_max"]=wasmExports["Pe"];Module["_crypto_pwhash_passwd_min"]=wasmExports["Qe"];Module["_crypto_pwhash_passwd_max"]=wasmExports["Re"];Module["_crypto_pwhash_saltbytes"]=wasmExports["Se"];Module["_crypto_pwhash_strbytes"]=wasmExports["Te"];Module["_crypto_pwhash_strprefix"]=wasmExports["Ue"];Module["_crypto_pwhash_opslimit_min"]=wasmExports["Ve"];Module["_crypto_pwhash_opslimit_max"]=wasmExports["We"];Module["_crypto_pwhash_memlimit_min"]=wasmExports["Xe"];Module["_crypto_pwhash_memlimit_max"]=wasmExports["Ye"];Module["_crypto_pwhash_opslimit_interactive"]=wasmExports["Ze"];Module["_crypto_pwhash_memlimit_interactive"]=wasmExports["_e"];Module["_crypto_pwhash_opslimit_moderate"]=wasmExports["$e"];Module["_crypto_pwhash_memlimit_moderate"]=wasmExports["af"];Module["_crypto_pwhash_opslimit_sensitive"]=wasmExports["bf"];Module["_crypto_pwhash_memlimit_sensitive"]=wasmExports["cf"];Module["_crypto_pwhash"]=wasmExports["df"];Module["_crypto_pwhash_str"]=wasmExports["ef"];Module["_crypto_pwhash_str_alg"]=wasmExports["ff"];Module["_crypto_pwhash_str_verify"]=wasmExports["gf"];Module["_crypto_pwhash_str_needs_rehash"]=wasmExports["hf"];Module["_crypto_pwhash_primitive"]=wasmExports["jf"];Module["_crypto_scalarmult_primitive"]=wasmExports["kf"];Module["_crypto_scalarmult_base"]=wasmExports["lf"];Module["_crypto_scalarmult"]=wasmExports["mf"];Module["_crypto_scalarmult_bytes"]=wasmExports["nf"];Module["_crypto_scalarmult_scalarbytes"]=wasmExports["of"];Module["_crypto_scalarmult_curve25519"]=wasmExports["pf"];Module["_crypto_scalarmult_curve25519_base"]=wasmExports["qf"];Module["_crypto_scalarmult_curve25519_bytes"]=wasmExports["rf"];Module["_crypto_scalarmult_curve25519_scalarbytes"]=wasmExports["sf"];Module["_crypto_secretbox_keybytes"]=wasmExports["tf"];Module["_crypto_secretbox_noncebytes"]=wasmExports["uf"];Module["_crypto_secretbox_zerobytes"]=wasmExports["vf"];Module["_crypto_secretbox_boxzerobytes"]=wasmExports["wf"];Module["_crypto_secretbox_macbytes"]=wasmExports["xf"];Module["_crypto_secretbox_messagebytes_max"]=wasmExports["yf"];Module["_crypto_secretbox_primitive"]=wasmExports["zf"];Module["_crypto_secretbox"]=wasmExports["Af"];Module["_crypto_secretbox_open"]=wasmExports["Bf"];Module["_crypto_secretbox_keygen"]=wasmExports["Cf"];Module["_crypto_secretbox_detached"]=wasmExports["Df"];Module["_crypto_secretbox_easy"]=wasmExports["Ef"];Module["_crypto_secretbox_open_detached"]=wasmExports["Ff"];Module["_crypto_secretbox_open_easy"]=wasmExports["Gf"];Module["_crypto_secretbox_xsalsa20poly1305"]=wasmExports["Hf"];Module["_crypto_secretbox_xsalsa20poly1305_open"]=wasmExports["If"];Module["_crypto_secretbox_xsalsa20poly1305_keybytes"]=wasmExports["Jf"];Module["_crypto_secretbox_xsalsa20poly1305_noncebytes"]=wasmExports["Kf"];Module["_crypto_secretbox_xsalsa20poly1305_zerobytes"]=wasmExports["Lf"];Module["_crypto_secretbox_xsalsa20poly1305_boxzerobytes"]=wasmExports["Mf"];Module["_crypto_secretbox_xsalsa20poly1305_macbytes"]=wasmExports["Nf"];Module["_crypto_secretbox_xsalsa20poly1305_messagebytes_max"]=wasmExports["Of"];Module["_crypto_secretbox_xsalsa20poly1305_keygen"]=wasmExports["Pf"];Module["_crypto_secretstream_xchacha20poly1305_keygen"]=wasmExports["Qf"];Module["_crypto_secretstream_xchacha20poly1305_init_push"]=wasmExports["Rf"];Module["_crypto_secretstream_xchacha20poly1305_init_pull"]=wasmExports["Sf"];Module["_crypto_secretstream_xchacha20poly1305_rekey"]=wasmExports["Tf"];Module["_crypto_secretstream_xchacha20poly1305_push"]=wasmExports["Uf"];Module["_crypto_secretstream_xchacha20poly1305_pull"]=wasmExports["Vf"];Module["_crypto_secretstream_xchacha20poly1305_statebytes"]=wasmExports["Wf"];Module["_crypto_secretstream_xchacha20poly1305_abytes"]=wasmExports["Xf"];Module["_crypto_secretstream_xchacha20poly1305_headerbytes"]=wasmExports["Yf"];Module["_crypto_secretstream_xchacha20poly1305_keybytes"]=wasmExports["Zf"];Module["_crypto_secretstream_xchacha20poly1305_messagebytes_max"]=wasmExports["_f"];Module["_crypto_secretstream_xchacha20poly1305_tag_message"]=wasmExports["$f"];Module["_crypto_secretstream_xchacha20poly1305_tag_push"]=wasmExports["ag"];Module["_crypto_secretstream_xchacha20poly1305_tag_rekey"]=wasmExports["bg"];Module["_crypto_secretstream_xchacha20poly1305_tag_final"]=wasmExports["cg"];Module["_crypto_shorthash_bytes"]=wasmExports["dg"];Module["_crypto_shorthash_keybytes"]=wasmExports["eg"];Module["_crypto_shorthash_primitive"]=wasmExports["fg"];Module["_crypto_shorthash"]=wasmExports["gg"];Module["_crypto_shorthash_keygen"]=wasmExports["hg"];Module["_crypto_shorthash_siphash24_bytes"]=wasmExports["ig"];Module["_crypto_shorthash_siphash24_keybytes"]=wasmExports["jg"];Module["_crypto_shorthash_siphash24"]=wasmExports["kg"];Module["_crypto_sign_statebytes"]=wasmExports["lg"];Module["_crypto_sign_bytes"]=wasmExports["mg"];Module["_crypto_sign_seedbytes"]=wasmExports["ng"];Module["_crypto_sign_publickeybytes"]=wasmExports["og"];Module["_crypto_sign_secretkeybytes"]=wasmExports["pg"];Module["_crypto_sign_messagebytes_max"]=wasmExports["qg"];Module["_crypto_sign_primitive"]=wasmExports["rg"];Module["_crypto_sign_seed_keypair"]=wasmExports["sg"];Module["_crypto_sign_keypair"]=wasmExports["tg"];Module["_crypto_sign"]=wasmExports["ug"];Module["_crypto_sign_open"]=wasmExports["vg"];Module["_crypto_sign_detached"]=wasmExports["wg"];Module["_crypto_sign_verify_detached"]=wasmExports["xg"];Module["_crypto_sign_init"]=wasmExports["yg"];Module["_crypto_sign_update"]=wasmExports["zg"];Module["_crypto_sign_final_create"]=wasmExports["Ag"];Module["_crypto_sign_final_verify"]=wasmExports["Bg"];Module["_crypto_sign_ed25519ph_statebytes"]=wasmExports["Cg"];Module["_crypto_sign_ed25519_bytes"]=wasmExports["Dg"];Module["_crypto_sign_ed25519_seedbytes"]=wasmExports["Eg"];Module["_crypto_sign_ed25519_publickeybytes"]=wasmExports["Fg"];Module["_crypto_sign_ed25519_secretkeybytes"]=wasmExports["Gg"];Module["_crypto_sign_ed25519_messagebytes_max"]=wasmExports["Hg"];Module["_crypto_sign_ed25519_sk_to_seed"]=wasmExports["Ig"];Module["_crypto_sign_ed25519_sk_to_pk"]=wasmExports["Jg"];Module["_crypto_sign_ed25519ph_init"]=wasmExports["Kg"];Module["_crypto_sign_ed25519ph_update"]=wasmExports["Lg"];Module["_crypto_sign_ed25519ph_final_create"]=wasmExports["Mg"];Module["_crypto_sign_ed25519ph_final_verify"]=wasmExports["Ng"];Module["_crypto_sign_ed25519_seed_keypair"]=wasmExports["Og"];Module["_crypto_sign_ed25519_keypair"]=wasmExports["Pg"];Module["_crypto_sign_ed25519_pk_to_curve25519"]=wasmExports["Qg"];Module["_crypto_sign_ed25519_sk_to_curve25519"]=wasmExports["Rg"];Module["_crypto_sign_ed25519_verify_detached"]=wasmExports["Sg"];Module["_crypto_sign_ed25519_open"]=wasmExports["Tg"];Module["_crypto_sign_ed25519_detached"]=wasmExports["Ug"];Module["_crypto_sign_ed25519"]=wasmExports["Vg"];Module["_crypto_stream_chacha20_keybytes"]=wasmExports["Wg"];Module["_crypto_stream_chacha20_noncebytes"]=wasmExports["Xg"];Module["_crypto_stream_chacha20_messagebytes_max"]=wasmExports["Yg"];Module["_crypto_stream_chacha20_ietf_keybytes"]=wasmExports["Zg"];Module["_crypto_stream_chacha20_ietf_noncebytes"]=wasmExports["_g"];Module["_crypto_stream_chacha20_ietf_messagebytes_max"]=wasmExports["$g"];Module["_crypto_stream_chacha20"]=wasmExports["ah"];Module["_crypto_stream_chacha20_xor_ic"]=wasmExports["bh"];Module["_crypto_stream_chacha20_xor"]=wasmExports["ch"];Module["_crypto_stream_chacha20_ietf"]=wasmExports["dh"];Module["_crypto_stream_chacha20_ietf_xor_ic"]=wasmExports["eh"];Module["_crypto_stream_chacha20_ietf_xor"]=wasmExports["fh"];Module["_crypto_stream_chacha20_ietf_keygen"]=wasmExports["gh"];Module["_crypto_stream_chacha20_keygen"]=wasmExports["hh"];Module["_crypto_stream_keybytes"]=wasmExports["ih"];Module["_crypto_stream_noncebytes"]=wasmExports["jh"];Module["_crypto_stream_messagebytes_max"]=wasmExports["kh"];Module["_crypto_stream_primitive"]=wasmExports["lh"];Module["_crypto_stream"]=wasmExports["mh"];Module["_crypto_stream_xor"]=wasmExports["nh"];Module["_crypto_stream_keygen"]=wasmExports["oh"];Module["_crypto_stream_salsa20_keybytes"]=wasmExports["ph"];Module["_crypto_stream_salsa20_noncebytes"]=wasmExports["qh"];Module["_crypto_stream_salsa20_messagebytes_max"]=wasmExports["rh"];Module["_crypto_stream_salsa20"]=wasmExports["sh"];Module["_crypto_stream_salsa20_xor_ic"]=wasmExports["th"];Module["_crypto_stream_salsa20_xor"]=wasmExports["uh"];Module["_crypto_stream_salsa20_keygen"]=wasmExports["vh"];Module["_crypto_stream_xsalsa20"]=wasmExports["wh"];Module["_crypto_stream_xsalsa20_xor_ic"]=wasmExports["xh"];Module["_crypto_stream_xsalsa20_xor"]=wasmExports["yh"];Module["_crypto_stream_xsalsa20_keybytes"]=wasmExports["zh"];Module["_crypto_stream_xsalsa20_noncebytes"]=wasmExports["Ah"];Module["_crypto_stream_xsalsa20_messagebytes_max"]=wasmExports["Bh"];Module["_crypto_stream_xsalsa20_keygen"]=wasmExports["Ch"];Module["_crypto_verify_16_bytes"]=wasmExports["Dh"];Module["_crypto_verify_32_bytes"]=wasmExports["Eh"];Module["_crypto_verify_64_bytes"]=wasmExports["Fh"];Module["_crypto_verify_16"]=wasmExports["Gh"];Module["_crypto_verify_32"]=wasmExports["Hh"];Module["_crypto_verify_64"]=wasmExports["Ih"];Module["_randombytes_implementation_name"]=wasmExports["Jh"];Module["_randombytes_random"]=wasmExports["Kh"];Module["_randombytes_stir"]=wasmExports["Lh"];Module["_randombytes_uniform"]=wasmExports["Mh"];Module["_randombytes_buf"]=wasmExports["Nh"];Module["_randombytes_buf_deterministic"]=wasmExports["Oh"];Module["_randombytes_seedbytes"]=wasmExports["Ph"];Module["_randombytes_close"]=wasmExports["Qh"];Module["_randombytes"]=wasmExports["Rh"];Module["_sodium_bin2hex"]=wasmExports["Sh"];Module["_sodium_hex2bin"]=wasmExports["Th"];Module["_sodium_base64_encoded_len"]=wasmExports["Uh"];Module["_sodium_bin2base64"]=wasmExports["Vh"];Module["_sodium_base642bin"]=wasmExports["Wh"];Module["_sodium_init"]=wasmExports["Xh"];Module["_sodium_pad"]=wasmExports["Yh"];Module["_sodium_unpad"]=wasmExports["Zh"];Module["_sodium_version_string"]=wasmExports["_h"];Module["_sodium_library_version_major"]=wasmExports["$h"];Module["_sodium_library_version_minor"]=wasmExports["ai"];Module["_sodium_library_minimal"]=wasmExports["bi"];Module["_crypto_box_curve25519xchacha20poly1305_seed_keypair"]=wasmExports["ci"];Module["_crypto_box_curve25519xchacha20poly1305_keypair"]=wasmExports["di"];Module["_crypto_box_curve25519xchacha20poly1305_beforenm"]=wasmExports["ei"];Module["_crypto_box_curve25519xchacha20poly1305_detached_afternm"]=wasmExports["fi"];Module["_crypto_box_curve25519xchacha20poly1305_detached"]=wasmExports["gi"];Module["_crypto_box_curve25519xchacha20poly1305_easy_afternm"]=wasmExports["hi"];Module["_crypto_box_curve25519xchacha20poly1305_easy"]=wasmExports["ii"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached_afternm"]=wasmExports["ji"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached"]=wasmExports["ki"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy_afternm"]=wasmExports["li"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy"]=wasmExports["mi"];Module["_crypto_box_curve25519xchacha20poly1305_seedbytes"]=wasmExports["ni"];Module["_crypto_box_curve25519xchacha20poly1305_publickeybytes"]=wasmExports["oi"];Module["_crypto_box_curve25519xchacha20poly1305_secretkeybytes"]=wasmExports["pi"];Module["_crypto_box_curve25519xchacha20poly1305_beforenmbytes"]=wasmExports["qi"];Module["_crypto_box_curve25519xchacha20poly1305_noncebytes"]=wasmExports["ri"];Module["_crypto_box_curve25519xchacha20poly1305_macbytes"]=wasmExports["si"];Module["_crypto_box_curve25519xchacha20poly1305_messagebytes_max"]=wasmExports["ti"];Module["_crypto_box_curve25519xchacha20poly1305_seal"]=wasmExports["ui"];Module["_crypto_box_curve25519xchacha20poly1305_seal_open"]=wasmExports["vi"];Module["_crypto_box_curve25519xchacha20poly1305_sealbytes"]=wasmExports["wi"];Module["_crypto_core_ed25519_is_valid_point"]=wasmExports["xi"];Module["_crypto_core_ed25519_add"]=wasmExports["yi"];Module["_crypto_core_ed25519_sub"]=wasmExports["zi"];Module["_crypto_core_ed25519_from_uniform"]=wasmExports["Ai"];Module["_crypto_core_ed25519_random"]=wasmExports["Bi"];Module["_crypto_core_ed25519_scalar_random"]=wasmExports["Ci"];Module["_crypto_core_ed25519_scalar_invert"]=wasmExports["Di"];Module["_crypto_core_ed25519_scalar_negate"]=wasmExports["Ei"];Module["_crypto_core_ed25519_scalar_complement"]=wasmExports["Fi"];Module["_crypto_core_ed25519_scalar_add"]=wasmExports["Gi"];Module["_crypto_core_ed25519_scalar_reduce"]=wasmExports["Hi"];Module["_crypto_core_ed25519_scalar_sub"]=wasmExports["Ii"];Module["_crypto_core_ed25519_scalar_mul"]=wasmExports["Ji"];Module["_crypto_core_ed25519_bytes"]=wasmExports["Ki"];Module["_crypto_core_ed25519_nonreducedscalarbytes"]=wasmExports["Li"];Module["_crypto_core_ed25519_uniformbytes"]=wasmExports["Mi"];Module["_crypto_core_ed25519_hashbytes"]=wasmExports["Ni"];Module["_crypto_core_ed25519_scalarbytes"]=wasmExports["Oi"];Module["_crypto_core_ristretto255_is_valid_point"]=wasmExports["Pi"];Module["_crypto_core_ristretto255_add"]=wasmExports["Qi"];Module["_crypto_core_ristretto255_sub"]=wasmExports["Ri"];Module["_crypto_core_ristretto255_from_hash"]=wasmExports["Si"];Module["_crypto_core_ristretto255_random"]=wasmExports["Ti"];Module["_crypto_core_ristretto255_scalar_random"]=wasmExports["Ui"];Module["_crypto_core_ristretto255_scalar_invert"]=wasmExports["Vi"];Module["_crypto_core_ristretto255_scalar_negate"]=wasmExports["Wi"];Module["_crypto_core_ristretto255_scalar_complement"]=wasmExports["Xi"];Module["_crypto_core_ristretto255_scalar_add"]=wasmExports["Yi"];Module["_crypto_core_ristretto255_scalar_sub"]=wasmExports["Zi"];Module["_crypto_core_ristretto255_scalar_mul"]=wasmExports["_i"];Module["_crypto_core_ristretto255_scalar_reduce"]=wasmExports["$i"];Module["_crypto_core_ristretto255_bytes"]=wasmExports["aj"];Module["_crypto_core_ristretto255_nonreducedscalarbytes"]=wasmExports["bj"];Module["_crypto_core_ristretto255_hashbytes"]=wasmExports["cj"];Module["_crypto_core_ristretto255_scalarbytes"]=wasmExports["dj"];Module["_crypto_pwhash_scryptsalsa208sha256_ll"]=wasmExports["ej"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_min"]=wasmExports["fj"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_max"]=wasmExports["gj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_min"]=wasmExports["hj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_max"]=wasmExports["ij"];Module["_crypto_pwhash_scryptsalsa208sha256_saltbytes"]=wasmExports["jj"];Module["_crypto_pwhash_scryptsalsa208sha256_strbytes"]=wasmExports["kj"];Module["_crypto_pwhash_scryptsalsa208sha256_strprefix"]=wasmExports["lj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_min"]=wasmExports["mj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_max"]=wasmExports["nj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_min"]=wasmExports["oj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_max"]=wasmExports["pj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"]=wasmExports["qj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"]=wasmExports["rj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"]=wasmExports["sj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"]=wasmExports["tj"];Module["_crypto_pwhash_scryptsalsa208sha256"]=wasmExports["uj"];Module["_crypto_pwhash_scryptsalsa208sha256_str"]=wasmExports["vj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_verify"]=wasmExports["wj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_needs_rehash"]=wasmExports["xj"];Module["_crypto_scalarmult_ed25519"]=wasmExports["yj"];Module["_crypto_scalarmult_ed25519_noclamp"]=wasmExports["zj"];Module["_crypto_scalarmult_ed25519_base"]=wasmExports["Aj"];Module["_crypto_scalarmult_ed25519_base_noclamp"]=wasmExports["Bj"];Module["_crypto_scalarmult_ed25519_bytes"]=wasmExports["Cj"];Module["_crypto_scalarmult_ed25519_scalarbytes"]=wasmExports["Dj"];Module["_crypto_scalarmult_ristretto255"]=wasmExports["Ej"];Module["_crypto_scalarmult_ristretto255_base"]=wasmExports["Fj"];Module["_crypto_scalarmult_ristretto255_bytes"]=wasmExports["Gj"];Module["_crypto_scalarmult_ristretto255_scalarbytes"]=wasmExports["Hj"];Module["_crypto_secretbox_xchacha20poly1305_detached"]=wasmExports["Ij"];Module["_crypto_secretbox_xchacha20poly1305_easy"]=wasmExports["Jj"];Module["_crypto_secretbox_xchacha20poly1305_open_detached"]=wasmExports["Kj"];Module["_crypto_secretbox_xchacha20poly1305_open_easy"]=wasmExports["Lj"];Module["_crypto_secretbox_xchacha20poly1305_keybytes"]=wasmExports["Mj"];Module["_crypto_secretbox_xchacha20poly1305_noncebytes"]=wasmExports["Nj"];Module["_crypto_secretbox_xchacha20poly1305_macbytes"]=wasmExports["Oj"];Module["_crypto_secretbox_xchacha20poly1305_messagebytes_max"]=wasmExports["Pj"];Module["_crypto_shorthash_siphashx24_bytes"]=wasmExports["Qj"];Module["_crypto_shorthash_siphashx24_keybytes"]=wasmExports["Rj"];Module["_crypto_shorthash_siphashx24"]=wasmExports["Sj"];Module["_crypto_stream_salsa2012"]=wasmExports["Tj"];Module["_crypto_stream_salsa2012_xor"]=wasmExports["Uj"];Module["_crypto_stream_salsa2012_keybytes"]=wasmExports["Vj"];Module["_crypto_stream_salsa2012_noncebytes"]=wasmExports["Wj"];Module["_crypto_stream_salsa2012_messagebytes_max"]=wasmExports["Xj"];Module["_crypto_stream_salsa2012_keygen"]=wasmExports["Yj"];Module["_crypto_stream_salsa208"]=wasmExports["Zj"];Module["_crypto_stream_salsa208_xor"]=wasmExports["_j"];Module["_crypto_stream_salsa208_keybytes"]=wasmExports["$j"];Module["_crypto_stream_salsa208_noncebytes"]=wasmExports["ak"];Module["_crypto_stream_salsa208_messagebytes_max"]=wasmExports["bk"];Module["_crypto_stream_salsa208_keygen"]=wasmExports["ck"];Module["_crypto_stream_xchacha20_keybytes"]=wasmExports["dk"];Module["_crypto_stream_xchacha20_noncebytes"]=wasmExports["ek"];Module["_crypto_stream_xchacha20_messagebytes_max"]=wasmExports["fk"];Module["_crypto_stream_xchacha20"]=wasmExports["gk"];Module["_crypto_stream_xchacha20_xor_ic"]=wasmExports["hk"];Module["_crypto_stream_xchacha20_xor"]=wasmExports["ik"];Module["_crypto_stream_xchacha20_keygen"]=wasmExports["jk"];Module["_malloc"]=wasmExports["kk"];Module["_free"]=wasmExports["lk"];wasmExports["dynCall_iiiji"];wasmExports["dynCall_iiij"];wasmExports["dynCall_iijii"];wasmExports["dynCall_iiijiji"];wasmExports["dynCall_iiijiii"];wasmMemory=wasmExports["e"];wasmExports["__indirect_function_table"];}var wasmImports={b:___assert_fail,c:__abort_js,a:_emscripten_asm_const_int,d:_emscripten_resize_heap};function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun();},1);}else {doRun();}}var wasmExports;createWasm();run(); + }); + }; +var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename$1!="undefined"){_scriptName=__filename$1;}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href;}var scriptDirectory="";if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname$1+"/";if(process.argv.length>1){process.argv[1].replace(/\\/g,"/");}process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module;}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href;}catch{}}else;console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;function binaryDecode(bin){for(var i=0,l=bin.length,o=new Uint8Array(l),c;i>8&c;}return o}var HEAP8,HEAPU8,HEAP16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift());}}callRuntimeCallbacks(onPreRuns);}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift());}}callRuntimeCallbacks(onPostRuns);}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return binaryDecode('asmî(```~```````` ``~~` ``~`~`~``~`~``` `\n`~~` ~~`~`~`~~`~~`~~~`~``~` ~`\n~``~`~aaabacad ¼º          ! "      #$%  &\'\r     \n\n \n\r  \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n      \r\r\rp@€€AÂ ¡Øef\ngh\ni jñkðlÎmÍnÌoËp qr s tñuvÊwÉxÈyÇzAÆBÅCÄDÃEÂFÁGÀH¾I JéKL\nM)NO P$QR\nS)TU½V¼W»XºY Z"_$\naa)baca da eaØfa¯ga®haia ja kaLlama-na¹oaBpa¸qa·rasa ta€uava+wa­xa.ya¶zaµAa Ba Ca€DaEaæFa­GaÝHa¯Ia®Ja Ka La Ma Na"Oa Pa\nQa\nRa)SaïTaîUaíVaìWaTXaSYa¬Za«_aª$a´ab³bb²cb©db±eb¨fb°gb¯hb®ib¿jbukb>lb=mbTnbSob¬pb«qb rb sb tb ub"vb wb\nxb\nyb)zbAb Bb\nCb Db\nEb(Fb Gb\nHb Ib\nJbFKbLb\nMb Nb\nObEPbQb\nRb Sb\nTbDUbVb\nWb Xb\nYb\nZb_b $b\nacbc ccÀdcÜec§fcógc¦hcòicjc\nkclc mc\nncoc pc\nqc\nrcÜsctc§uc­vcwcˆxc¦yczcAc¥BcÙCc DcÏEc^Fc«Gc*HcªIcJcLKc/LclMcNc¥Oc\nPcQc$Rc Sc¤TcÀUc\nVcWc$Xc Yc¤Zc_c‘$cadbdŽcddded fdgdŒhdLidæjd®kd­ld¬md«ndªodpdqd©rd€sdÕtd>udÔvdÓwd xd yd zd AdÒBd“Cd\nDd Ed£Fd¢Gd•Hd¡Id”JdàKdLd£Md¢Nd•Od¡Pd”Qd\nRd Sd“TdUdMVd\nWdXdYdZd\n_d{$d‡ae_becezdeyeexfeØge†he…ie$je„ke©le¨me¦ne¥oe¤pe7qe\nreseteue\nve{weÔxeMyezezAeyBe7CeÓDe_EeÒFexGewHe£Ie Je¢KeMLe7Me7Ne\nOePeQeRe\nSe{TeÔUeMVeWezXeyYe7ZeÓ_e_$eÒafxbfwcf¡df ef ffŸgfžhfƒjf×kf†lfÖmf nf ofpf†qf rf sf tf"uf vf\nwf\nxf)yfÚzfTAfSBfCfªDfœEf©Ff¨GfTHfSIf Jf"Kf Lf\nMf\nNf)OfPfQf—Rf–Sf•Tf›UfšVf”Wf“Xf"Yf Zf’_f$fMag7bg_cg$dg\negáfgŸggðhg$ig\njgŸkgLlgmg ng ogpgÉqgùrgøsg÷tgžugvgœwg›xgöyglzgõAgôBgLCgDg Eg FgGgÉHgûIgúJgÈKglLgÇMgÆNgËOgÊPg€QgÿRg›SgTgœUgžVg Wg$XgYg Zgé_g$g™ah˜bh–ch•dh”eh“fhghhh ih"jhkhlhšmh™nhoh ph$qhrh’sh‘thuhvhšwhxh™yh zh"AhBhCh\nDh EhFh5Gh<Hh°IhµJh´KhçLh³MhNh±Oh Ph°QhŽRh‹ShŠTh‰Uh~Vh}WhºXh²Yh¯ZhÑ_hÐ$h7aibiuci>di‚ei˜figiŒhi‹ii—jiŠki–li‰mi ni oi pi qi"ri\nsi)tiˆui‡vi¿wi¨xi§yi¦zi¥Ai¤BiåCiäDiãEiâFiáGiàHißIiÞJi KiLi MiNi Oi£Pi¢Qi¡Ri SiŸTižUiViœWi›XišYi™ZiÞ_i˜$i ajbjcj dj†ej\nfjgjhjij jjëkjêljémjnj·ojpjèqj·rjØsjwtj…uj„vjƒwj‚xjçyjæzjåAjäBj Cj DjßEjÞFj Gj Hj˜IjJj—Kj–Lj Mj"Nj\nOj)Pj\nQj\nRj€SjÿTjþUj Vj$WjXjYjýZjü_j $j$akbkck dk"ekfkûgkúhkùikjkkk (A ¿¬§—ø÷öõô½¼»¹¸·¶ \nݔ\nºË~ ( "At¬" ¬"~ (" ¬" ("!At¬" ~| ("At¬" (""At¬"~| ("¬" ("#At¬"~| ( "Al¬" ¬"~| ($"A&l¬" ("At¬"~|  ~ ~| ¬" ~|  ~|  ~|  ~ !¬" ~|  ~| A&l¬" ¬"~|  At¬~|  ~|"B€€€|"B‡|"B€€€|"B‡|"\n \nB€€€|" B€€€àƒ}>  ~  "¬"\r~| Al¬"\n ~|  ~|  At¬"~|  ~|  \n~  \r~|  ~|  ~|  ~| A&l¬ ~ #¬"\r \r~| \n ~|  ~|  ~|  ~|"\nB€€€|"\rB‡|"B€€€|"B‡|" B€€€|"B€€€àƒ}> ~  ~|  ~|  ~|  ~| B‡|" B€€€|" B€€€ðƒ}>  ~  ~| ~|  ~|  ~| B‡|" B€€€|"B€€€ðƒ}> ~  ~|  ~|  ~|  ~|  ¬"~| B‡|" B€€€|"B€€€àƒ}>  B€€€ðƒ}  B€€€`ƒ} B‡|"B€€€|"Bˆ|>  B€€€àƒ}>  ~  ~| ~|  ~|  ~| B‡|" B€€€|"B€€€ðƒ}>$  B€€€ðƒ} \n \rB€€€`ƒ} B‡B~|"B€€€|"Bˆ|>  B€€€àƒ}>  \'~  ("*¬" ("+At¬"~ 4" 4"~| (",¬"\r 4"~| ( "-¬" ( ".At¬"~| ("/¬" 4"~| ("0¬" ("1At¬"~| ("2¬" 4" ~| ("3Al¬" ($"4At¬"~| ( "5Al¬" 4 "\n~| ($"Al¬" ("At¬"~|  ~  +¬"~| \r .¬"~|  ~|  1¬"~| ~| 2Al¬" 4¬"~| \n ~|  ¬"~|  ~| ~  ~|  \r~|  ~| ~| 0Al¬" ~| \n ~| ~|  ~|  ~|""B€€€|"#B‡|"$B€€€|"%B‡|" B€€€|"B€€€àƒ}> ~  ~| \r~| -Al¬" ~| \n /Al¬"~|  ~|  ~| ~|  ~|  ~| ~  ~| ,Al¬"! ~| \n ~|  ~|  ~|  ~|  ~|  ~|  ~| *Al¬ ~  ~| \n !~|  ~|  ~|  ~|  ~| ~|  ~|  ~|"!B€€€|"&B‡|"\'B€€€|"(B‡|" B€€€|")B€€€àƒ}>  ~  ~| \r ~|  ~|  ~|  ~|  ~| 3¬"~|  ~|  \n~| B‡|" B€€€|"B€€€ðƒ}>  ~  ~| \r ~| ~|  ~| \n ~|  ~|  ~|  ~|  ~| )B‡|" B€€€|"B€€€ðƒ}> ~  \n~|  \r~|  ~|  ~|  ~|  ~|  ~| 5¬" ~|  ~| B‡|" B€€€|"B€€€àƒ}> $ %B€€€ðƒ} " #B€€€`ƒ} B‡|"B€€€|"Bˆ|>  B€€€àƒ}> \n ~  ~| \r ~|  ~|  ~|  ~|  ~|  ~| ~| ¬~| B‡|" B€€€|"B€€€ðƒ}>$ \' (B€€€ðƒ} ! &B€€€`ƒ} B‡B~|"B€€€|"Bˆ|>  B€€€àƒ}> ñ6~ 3 1B†B€€üƒ„" (":AvAÿÿÿq­"~ 3 1B†B€€üƒ„" ("9AvAÿÿÿq­" ~| 5BˆBÿÿÿƒ" (";AvAÿÿÿq­"~| (\n"s!  6 B7 AtA¤Àj!@Aø½("A t"qE@Aø½  r6  6A!A  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6A! !A ! "  (" 6  6A!A!A !  j 6  6 j 6A”¾A”¾(Ak"A 6 AÀ ’~#AÀk" $@ P\r )H" B†|"7H A@k" )  V­| B=ˆ|7 AÐj! B€ BˆBÿƒ"}" X@ Bƒ!B!@ Bÿ…BZ@ Büƒ!\n@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" \nR\r P\r @  |§j  §j-: B|! B|" R\r A€j"\ra  §j!  }"BÿV@@  \ra A€j! B€}"BÿV\r @ P\r Bƒ!B!B! BZ@ Büƒ!B!@ §"j j-: Ar"\rj  \rj-: Ar"\rj  \rj-: Ar"j j-: B|! B|" R\r P\r @ §"j j-: B|! B|" R\r AÀ  Bƒ!B! BZ@ B|ƒ!@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" R\r P\r @  |§j  §j-: B|! B|" R\r AÀj$A A Æ#Ak"A:@ E\r Aq! AO@ A|q!@  j"- -r:  - -r:  - -r:  - -r: Aj! Aj" G\r E\r A!@  j- -r: Aj! Aj" G\r -AkAv … #A0k"$  AÐj A(j Aøj AÐj ((! (,! (! (0! (! (4! ( ! (8!\n (! (j! @@@ At(¤À"E@A!  A! A AvkA AGt!@@ (Axq k" O\r ! "\rA! !  ("   AvAqj("F ! At! \r rE@A!A t"A kr q"E\r hAt(¤À! E\r @ (Axq k" I!   !  ! ("  ( "\r E\r Aü½( kO\r (!  ( "G@ (" 6 6  (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6  Aü½("M@Aˆ¾(!@  k"AO@ j" Ar6 j 6 Ar6  Ar6 j" (Ar6A!A! Aü½ 6Aˆ¾ 6 Aj! A€¾("I@A€¾  k"6AŒ¾AŒ¾(" j"6  Ar6 Ar6 Aj! A! A/j"AÌÁ(@AÔÁ(  AØÁB7AÐÁB€ €€€€7AÌÁ \nA jApqAتժs6AàÁA6A°ÁA6A€ "j"A k"q" M\rA¬Á("@A¤Á(" j" M\r  I\r @A°Á-AqE@@@@@AŒ¾("@A´Á!@ (" M@   (jI\r ("\r AA"AF\r !AÐÁ("Ak" q@  k  jA kqj!  M\rA¬Á("@A¤Á(" j" M\r I\r A" G\r   k q"A" ( (jF\r ! AF\r A0j M@ !  AÔÁ("  kjA kq"AAF\r  j! !  AG\r A°ÁA°Á(Ar6 A!AA! AF\r AF\r M\r k" A(jM\r A¤ÁA¤Á( j"6A¨Á( I@A¨Á 6 @AŒ¾("@A´Á!@  (" ("jF\r ("\r  A„¾("A ME@A„¾ 6 A!A¸Á 6A´Á 6A”¾A6A˜¾AÌÁ(6AÀÁA6@ At" Aœ¾j"6¤¾  6¨¾ Aj"A G\r A€¾ A(k"Ax kAq"k"6AŒ¾  j"6  Ar6 jA(6A¾AÜÁ(6   M\r  K\r ( Aq\r  j6AŒ¾ Ax kAq"j"6A€¾A€¾( j" k"6  Ar6  jA(6A¾AÜÁ(6  A!  A!  A„¾( K@A„¾ 6  j!A´Á!@@  ("G@ ("\r  - AqE\r A´Á!@@ (" M@   (j"I\r (!  A€¾ A(k"Ax kAq"k"6AŒ¾  j"6  Ar6 jA(6A¾AÜÁ(6  A\' kAqjA/k" AjI"A6 A¼Á)7 A´Á)7A¼Á Aj6A¸Á 6A´Á 6AÀÁA6 Aj!@ A6 Aj Aj! I\r  F\r  (A~q6   k"Ar6  6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6  ( ! 6  6 A !A  A! AÿÿÿM@ A& Avg"kvAq AtrA>s!  6 B7 AtA¤Àj!@@Aø½("A t"qE@Aø½  r6  6  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6  6A! "!A  (" 6  6  6A!A!A j 6  j 6 A€¾(" M\rA€¾ k"6AŒ¾AŒ¾(" j"6  Ar6 Ar6 Aj!  Að½A06A!  6 ( j6 Ax kAqj" Ar6 Ax kAqj"  j"k!@AŒ¾( F@AŒ¾ 6A€¾A€¾( j"6  Ar6  Aˆ¾( F@Aˆ¾ 6Aü½Aü½( j"6  Ar6 j 6  ("AqAF@ Axq! ( !@ AÿM@ (" F@Aô½Aô½(A~ Avwq6   6  6  (!@  G@ (" 6  6  @ (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6  A! E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½Aø½(A~ wq6  @  (F@  6   6 E\r  6 ("@  6 6 ("E\r  6 6  j!  j"(!  A~q6  Ar6  j 6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6  ( ! 6  6  6  6  A! AÿÿÿM@ A& Avg"kvAq AtrA>s!  6 B7 AtA¤Àj!@@Aø½("A t"qE@Aø½  r6 6  A AvkA AGt! (!@ "(Axq F\r Av! At! Aqj"("\r  6  6  6  6  (" 6 6 A6  6  6 Aj!  @ E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½ A~ wq"6  @  (F@  6   6 E\r 6 ("@ 6  6 ("E\r 6  6 @ AM@   j"Ar6 j" (Ar6   Ar6  j" Ar6  j 6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6  ( ! 6  6  6  6  A! AÿÿÿM@ A& Avg"kvAq AtrA>s!  6 B7 AtA¤Àj!@@ A t"qE@Aø½  r6  6  6  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6  6  6  6  (" 6  6 A6  6  6 Aj!  @ E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½ A~ wq6  @  (F@ 6  6 E\r 6 ("@ 6  6 ("E\r 6  6 @ AM@   j"Ar6 j" (Ar6   Ar6  j" Ar6  j 6 @ AxqAœ¾j!Aˆ¾(!A Avt" qE@Aô½  r6  ( ! 6  6  6  6 Aˆ¾ 6Aü½ 6 Aj! \nAj$ È#Ak"$ A:A!  Aˆ·(E@  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  -\n -r:  - -r:  - -r:  -\r -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r:  - -r: -AtA€€€kAu! Aj$  }@@ "AqE\r -E@A @ Aj"AqE\r -\r  @ "Aj!A€‚„ ("k rA€‚„xqA€‚„xF\r @ "Aj! -\r  k " A€O@AÖ\nAÿ AëAã   éA!@ AÀK\r AÁk"A@I\r@ A E@ AÿqA¿M@ A@kAA¥ü BùÂø›‘£³ðÛ78 Bëú†Ú¿µöÁ70 BŸØùÙ‘ڂ›7( Bхšïúϔ‡Ñ7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­Bˆ’÷•ÿÌù„ê…7  #A€k"$@ AÁkAÿqA¿M\r E\r AÁkAÿqA¿M\r A@kAA¥ü BùÂø›‘£³ðÛ78 Bëú†Ú¿µöÁ70 BŸØùÙ‘ڂ›7( Bхšïúϔ‡Ñ7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­ ­B†„Bˆ’÷•ÿÌù„ê…7 AA€ü @   ü\n Aàj A€ü\n A€6à A€ A€j$A   \r A!  \r  !A ì~#A k" $@ P\r ) " B†|7 A(j! BÀ BˆB?ƒ"}" X@ Bƒ!B!@ B?…BZ@ Büƒ!\n@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" \nR\r P\r @  |§j  §j-: B|! B|" R\r A€j"\r]  §j!  }"B?V@@  \r] A@k! B@|"B?V\r @ P\r Bƒ!B!B! BZ@ B<ƒ!B!@ §"j j-: Ar"\rj  \rj-: Ar"\rj  \rj-: Ar"j j-: B|! B|" R\r P\r @ §"j j-: B|! B|" R\r A   Bƒ!B! BZ@ B|ƒ!@  |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B„" |§j  §j-: B|! B|" R\r P\r @  |§j  §j-: B|! B|" R\r A j$A A \r  A A ÷~ (,"AvAÿÿÿq­ ( B\r† B†„ B†„" \rBˆ| B€€€|"B€€€ðƒ}> B † B†„ B†„ Bˆ|" B€€€|"B€€€àƒ}>  B€€€ðƒ} B\n† B†„ B†„ \nB † B†„ B†„" B€€€|"\nBˆ|" B€€€|" Bˆ|> B€€€àƒ}> B\r† B†„ B†„ B† B†„ B†„"B€€€|"Bˆ|" B€€€|"B€€€àƒ}> B†B€€ðƒ B\n† B†„„" Bˆ| B€€€|"B€€€ƒ}>$ Bˆ | \nB€€€ðƒ}>  B€€€ðƒ}  BˆB~|"B€€€|"Bˆ|>  B€€€àƒ}> •#Ak" 6  6 A;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (-sr;  / ( - (- sr;  / ( -\n (-\nsr;  / ( - (- sr;  / ( - (- sr;  / ( -\r (-\rsr;  / ( - (-sr;  / ( - (-sr;  /;  /Ak; A€Â/Av /Avs; /Ak ™AÁ!A€!@@ Aÿq"A€-G@ A‚„l!@A€‚„ ( s"k rA€‚„xqA€‚„xG\r Aj! Ak"AK\r E\r Aÿq!@ -F@  Aj! Ak"\r A A ?@ ­B€€€€ B?|Bˆ}V\r B€€€€Z\r     A´·(  \' B€€€€Z@     A°·( § #A€k"$A! -"AsAÿq - - - - - - - - - -\n - - -\r - - - - - - - - - - - - - - - - -qqqqqqqqqqqqqqqqqqqqqqqqqqqqqAsrAÿqAkAì -"kqAv A‚Â-Av AvsrrAqE@ AÐj"\r 4 A j \r A (Ä"k6” A (À"k6 A (¼"k6Œ A (¸"k6ˆ A (´"k6„ A (°"k6€ A (¬"k6ü A (¨" k6ø A (¤"\nk6ô A ( " k6ð Aj" Aðj"  6ä  6à  6Ü  6Ø  6Ô  6Ð  6Ì  6È  \n6Ä  Aj6À Aàj" AÀj" A0j"A°  (`! (0! (d! (4! (h! (8! (l! (I Aj!\r  ) 7ˆ  )7€  )7ø  )7ð  )7è  )7  )7˜  )7   )7¨  ) 7°  )7¸  )7À  )7È  )7Ð  ) 7Ø  Aèj"\n \n   Aj"   A¸j"    \n \n          \n \n          \n         A!@ Aj" Av A j j,Œ A€j" i          A>I Aj!\r Aàj$ ±#Ak" 6  6A! A;@  / ( j- ( j-sr;  / Ar" ( j- ( j-sr; Aj"A G\r  /;  /Ak; A€Â/Av /Avs; /Ak 4#A k"$A!   E@ Aж A(! A j$   A  AŒ·( €@@@ "Aÿq"@ Aq@@ -"E\r  F\r Aj"Aq\r A€‚„ ("k rA€‚„xqA€‚„xG\r A‚„l!@A€‚„  s"k rA€‚„xqA€‚„xG\r (! Aj"! A€‚„ krA€‚„xqA€‚„xF\r   j  ! @ "-"E\r Aj!  AÿqG\r "A - AÿqF ` E@A -"@@  -"G\r E\r Ak"E\r Aj! -! Aj! \r A! A -k W~@Að¶("­ ­B|Bøÿÿÿƒ|"BÿÿÿÿX@ §"?AtM\r \r Að½A06A Að¶ 6  9#A k"$ * Aèj" B ! * A  A j$A –#AÐk"$ B7H B7@ A°¬)7 A¸¬)7 AÀ¬)7 AȬ)7 AЬ)7 Aج)7( Aà¬)70 Aè¬)78      AÐj$A    AeA    A eA    AeA ¡,~#A k"$ A(j"(! (P! (,!\r (T! (0! (X! (4! (\\! (8! (`! (    q  qr"At A vr­| B ˆ|">    \rq  qrAt Avr­| B ˆ|> AØ Ý~@ )8"BR@ B }"   V"BR~ Bƒ! A@k!\nB!@ BZ@ B|ƒ!@ \n )8 |§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: B|! B|" R\r P\r @ \n )8 |§j  §j-: B|! B|" R\r )8  |"78 BT\r A@kBk B78  }!  §j! BZ@  Bpƒ"k Bƒ!  §j! P\r Bƒ! A@k!\nB!B!@ BZ@ B ƒ! B!@ \n )8 |§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: \n B„" )8|§j  §j-: B|! B|" R\r P\r @ \n )8 |§j  §j-: B|! B|" R\r )8 |78 š A6 @ @B€€ B€€X" Av­Z@ A€ O\rA  A6A § (Atn"AI\rA AI\r AI@ A6 A I@ A6 AÀI@ A6 A€I@ A6 A€I@ A6 A€I@ A6 A€I@ A 6 A€I@ A\n6 A€ I@ A 6 A€ÀI@ A 6 A€€I@ A\r6 A€€I@ A6 A€€I@ A6 A€€I@ A6 A€€I@ A6 A€€ I@ A6 A€€ÀI@ A6 A€€€I@ A6 A€€€I@ A6 A€€€I@ A6 A€€€I@ A6 A€€€O\r A6 A A€ÀI\rA A€€I\rA A€€I\rA A€€I\rA A€€I\rA A€€I\rA A€€ I\rA A€€ÀI\rA\n A€€€I\rA A€€€I\rA A€€€I\rA\r A€€€I\rA A€€€I\rA A€€€ I\rA A€€€ÀI\rA A€€€€I\rA A€€€€I\rA A€€€€I\rAA AN "6 Bÿÿÿÿ Bˆ ­ˆ" BÿÿÿÿZ§ (n6 AA A€€€ I 6 û E@Ag (E@A (AI@A~ @ (\r ( E\rAn (! (E@AmAz  AI@Az @ (\r (E\rAl @ ( \r ($E\rAk (0"E@Ap AÿÿÿK@Ao Ar!@ (,"AI\r A€€€K@Aq  AtI\r ((E@At (4"E@Ad AcA AÿÿÿK!  ¨~#A€k"$ A€j A€ü\nA!@ At" A€j"j" ) j)…7  Ar"j" ) j)…7  Ar"j" ) j)…7  Ar"j" ) j)…7 Aj"A€G\r  A€ü\nA!A!@  At"j" )  j)…7  Ar"j" )  j)…7  Ar"j" )  j)…7  Ar"j" )  j)…7 Aj"A€G\r @ A€j Atj" )8" )"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )x…B ‰" )X"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" )(" )"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )h…B ‰" )H" | B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B‰" ) " )"\n| \nB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\n )`…B ‰" A@k")"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|"\n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|" …B ‰" )0" )"\r| \rB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\r )p…B ‰" )P"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|"\r …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7  …B0‰" 7x  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7P   …B‰7(   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"  …B‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n …B0‰"…B ‰"\n| B†Bþÿÿÿƒ \nBÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n…B0‰"7`  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7X   …B‰70   …B‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|" …B ‰"  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7h  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7   …B‰78    …B‰"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B ‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7p  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7H   …B‰7 Aj"AG\r A!@ A€j Atj" )ˆ" )ˆ"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )ˆ…B ‰" )ˆ"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" )ˆ" )"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" )ˆ…B ‰" )ˆ" | B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B‰" )€" )"\n| \nB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\n )€…B ‰" )€"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|"\n| Bÿÿÿÿƒ \nB†Bþÿÿÿƒ~|" …B ‰" )€" )€"\r| \rB†Bþÿÿÿƒ Bÿÿÿÿƒ~|"\r )€…B ‰" )€"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B(‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|"\r …B0‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7  …B0‰" 7ˆ  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" 7€   …B‰7ˆ   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"  …B‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n …B0‰"…B ‰"\n| B†Bþÿÿÿƒ \nBÿÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" \n…B0‰"7€  7   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7ˆ   …B‰7€   …B‰" \r| Bÿÿÿÿƒ \rB†Bþÿÿÿƒ~|" …B ‰"  | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"| Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7ˆ  7€   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7€   …B‰7ˆ    …B‰"| B†Bþÿÿÿƒ Bÿÿÿÿƒ~|" …B ‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B(‰" | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|" …B0‰"7€  7ˆ   | Bÿÿÿÿƒ B†Bþÿÿÿƒ~|"7ˆ   …B‰7€ Aj"AG\r  A€ü\nA!@  At"j" ) A€j" j)…7  Ar"j" )  j)…7  Ar"j" ) A€j j)…7  Ar"j" ) A€j j)…7 Aj"A€G\r A€j$ ¨$\'#AÐk"$A!\n@ A j"ŠE\r H\r gE\r H\r A€j" ‘\r A€j"\n/ @ \nA¶B" \n B  \n B  \n   \n AÀj" % Aj! ! !\nA!A!#Aàk"$@ Aàj" j  Avj-" AqvAq:  Ar"j AqvAq: Aj"A€G\r Aþ!@ "Aj!@  Aàj"j" -E\r AþK\r@  j","E\r At" ,"j" AL@ : A:   k"AqH\r : !@ Aàj j"-E@ A:  A: Aj"A€G\r E\r@ Aj" Aàjj","E\r At" ," j"\rAN@ k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  \r: A: A  AOAj"AF\r@ Aj" Aàjj"," E\r At" ,"\rj"AN@ \r k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: AF\r@ Aj" Aàjj"," E\r At" ,"\rj"AN@ \r k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: AF\r@ Aj" Aàjj"," E\r At" ,"\rj"AN@ \r k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: AF\r Aj" Aàjj","E\r At" ,"j" AN@  k"AqH\r :@ Aàj j"-@ A: Aj"A€G\r  A:  : A: Ak! A€G\r A!@ Aà\rj" j \n Avj-" AqvAq:  Ar"j  AqvAq: Aj"A€G\r A!Aþ!@ "Aj!@  Aà\rj"j"\n-E\r AþK\r@  j"," E\r At" \n,"j"AL@ \n : A:   k"AqH\r \n : !@ Aà\rj j" -E@ A:  A: Aj"A€G\r E\r@ Aj" Aà\rjj" ,"E\r At" \n,"j" AN@  k" AqH\r \n :@ Aà\rj j" -@ A: Aj"A€G\r  A:  \n : A: A  AOAj" AF\r@ Aj" Aà\rjj","E\r At" \n," j"\rAN@ k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n \r: A: AF\r@ Aj" Aà\rjj","E\r At" \n," j"\rAN@ k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n \r: A: AF\r@ Aj" Aà\rjj","E\r At" \n," j"\rAN@ k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n \r: A: AF\r Aj" Aà\rjj"," E\r At" \n,"j"AN@  k"AqH\r \n :@ Aà\rj j"-@ A: Aj"A€G\r  A:  \n : A: Ak! A€G\r Aàj"\n   ) 7À  )7¸  )7°  )7¨  )7   )(7È  )07Ð  )87Ø  A@k)7à  )H7è  )P7ð  )X7ø  )`7€  )h7ˆ  )p7 AÀj" A j"   A¸j" A(j Aèj" Aj" AÐj   Aøj     \n    AÈj"  Aðj"   A˜j"\n   A€j"            \n   A j"            \n   AÀj"            \n   Aàj"            \n   A€\nj"            \n   A  j"            \n   AÀ j  B7 B7 B7 B7 B7 B7, A(j""A6 B74 B7< B7D B7T B€€€€7L B7\\ B7d B7l A6t AÐj!#Aÿ!@@@@ Aàj" j-\r Aà\rj" j-\r  Ak"j-E@  j-E\r ! AH\r@ AÀj" @ " Aàjj,"AJ@ A j"       \n    Aàj AþqAvA lj  AN\r A j" AÀj"      \n    AàjA kAþqAvA ljQ @ Aà\rj j,"AJ@ A j" AÀj"      \n    AþqAvAølAÀ\rji  AN\r A j AÀj"      \n   ( ! (È!\r (¤! (Ì! (¨! (Ð! (¬! (Ô! (°! (Ø! (´! (Ü! (¸! (à! (¼! (ä! (À! (è!  (ì" (Ä"!k6Œ   k6ˆ   k6„   k6€   k6ü   k6ø   k6ô   k6ð   k6ì  \r k6è  !j6ä   j6à   j6Ü   j6Ø   j6Ô   j6Ð   j6Ì   j6È   j6Ä  \rj6À  A kAþqAvAølAÀ\rj"A(j   AÐj \n (”! (! (Œ! (ˆ!! („!$ (€!% (ü!& (ø!\' (ô!( (ð!) (è! (! (ì! (”!\r (ð! (˜! (ô! (œ! (ø! ( ! (ü! (¤! (€! (¨! („! (¬! (ˆ! (°!  (Œ"* (´"+j6Œ   j6ˆ   j6„   j6€   j6ü   j6ø   j6ô   j6ð  \rj6ì   j6è  + *k6ä   k6à   k6Ü   k6Ø   k6Ô   k6Ð   k6Ì   k6È  \r k6Ä   k6À  )At" (¸"k6  (At" (¼"\rk6”  \'At" (À"k6˜  &At" (Ä"k6œ  %At" (È"k6   $At" (Ì"k6¤  !At" (Ð"k6¨  At" (Ô"k6¬  At" (Ø"k6°  At" (Ü"k6´   j6¸  \rj6¼   j6À   j6Ä   j6È   j6Ì   j6Ð   j6Ô   j6Ø   j6Ü  AÀj  "  #   Ak! AJ\r  Ak! \r Aàj$ A j" ,A  < F A 1r!\n AÐj$ \n ª"5~#A°k";$ ;Aàj"</ @ AvAÿÿÿq­ 3 1B†B€€üƒ„" ~  ("?AvAÿÿÿq­"~| 5BˆBÿÿÿƒ" ~|  Av­ 1B†„ 1B†„BˆBÿÿÿƒ|") #B˜Ú~  0B€€€ÿÿÿÿƒ} Bˆ|"B“Ø(~| "Bçö\'~| $BӌC~| %BÑ«~| (Bˆ|| )B€€@}"(B€€€ƒ}"| B€€@}"0B€€€ƒ}") . 4 5B€€€ƒ} Bƒ¡V~ !BÑ«~| 2| 3B€€€ƒ}  !BӌC~| BÑ«~| #Bƒ¡V~| 1B€€€ƒ} ~  ~|  ~| \r ~|  ~| ~|  ~|  ~| ~| \n ~| ~  ~|  ~|  ~|  ~| \r ~| ~|  ~|  ~| ~| \n ~|"1B€€@}"2Bˆ|"3B€€@}"4Bˆ|"5B€€@}"7B‡|"B€€@}"6B‡|"Bƒ¡V~ BÑ«~|| /B€€€ƒ} & BÑ«~ BӌC~|  6B€€€ƒ}"Bƒ¡V~| %B˜Ú~ $B“Ø(~| ,| * %B“Ø(~| +B€€€ƒ}  ~  ~|  ~|  ~|  ~|  ~| (\n"Av­ 1B†„ 1B†„BˆBÿÿÿƒ| AvAÿÿÿq­  ~  ~|  ~|  ~|  ~||"*B€€@}"+Bˆ|",B€€@}".Bˆ|"/B€€@}"6B‡| -B€€€ƒ}"-B€€@}"8B‡|| \'B€€€ƒ}"&B€€@}"\'B‡|"9B€€@}":B‡| )B€€@}")B€€€ƒ} 9 :B€€€ƒ} & \'B€€€ƒ} BӌC~ Bçö\'~| BÑ«~| -| 8B€€€ƒ} 5 7B€€€ƒ} BӌC~ !Bçö\'~| #BÑ«~| "Bƒ¡V~| 3| 4B€€€ƒ} Bçö\'~ !B˜Ú~| #BӌC~| 1| "BÑ«~| $Bƒ¡V~| 2B€€€ƒ} (Av­  ~  ~|  ~| \r ~| ~|  ~|  ~| ~|  ~|  ~| ~| \n ~|| (Bˆ|"B€€@}"Bˆ|"B€€@}" B‡|"B€€@}"\nB‡|"Bƒ¡V~| / B˜Ú~| 6B€€€ƒ} Bçö\'~| BӌC~| BÑ«~|  \nB€€€ƒ}"Bƒ¡V~|"\nB€€@}" B‡|" B€€@}"\rB‡| \rB€€€ƒ} \n B€€€ƒ} B“Ø(~ ,| .B€€€ƒ} B˜Ú~| Bçö\'~|  B€€€ƒ} B˜Ú~ !B“Ø(~| #Bçö\'~| "BӌC~| $BÑ«~| %Bƒ¡V~| | B€€€ƒ} 0B‡|"B€€@}"B‡|"Bƒ¡V~| BӌC~| BÑ«~| * +B€€€ƒ}  ~  ~|  ~|  ~| 5BˆBÿÿÿƒ|  ~  ~|  ~| ("Av­ 1B†„ 1B†„BˆBÿÿÿƒ|" B€€@}"\nBˆ|" B€€@}" Bˆ| B“Ø(~| B˜Ú~| BÑ«~| Bçö\'~| BӌC~|"\rB€€@}"B‡|"B€€@}"B‡|   B€€€ƒ} )B‡|"B€€@}"B‡"Bƒ¡V~| B€€€ƒ} \r BÑ«~| B€€€ƒ} B€€€ƒ} B“Ø(~| BӌC~| B˜Ú~| Bçö\'~| AvAÿÿÿq­  ~  ~||  ~ 3 1B†B€€üƒ„|" B€€@}" Bˆ|"\rB€€@}"Bˆ| \nB€€€ƒ} Bçö\'~| B“Ø(~| B˜Ú~|"B€€@}" B‡|"\nB€€@}"B‡| \n BӌC~| B€€€ƒ}  Bçö\'~| B€€€ƒ} \r B€€€ƒ} B˜Ú~| B“Ø(~| B€€€ÿÿÿƒ} B“Ø(~|"B€€@}"B‡|"B€€@}" B‡|  B˜Ú~| B€€€ƒ}  B€€€ƒ} B“Ø(~|"B‡|" B‡|"\nB‡|" B‡|" B‡|"\rB‡|"B‡|"B‡|"B‡|"B‡|"B‡  B€€€ƒ}|"B‡"B“Ø(~ Bÿÿÿƒ|"< Bˆ<! B˜Ú~ Bÿÿÿƒ| B‡|"B ˆ<$ Bˆ<# BˆBƒ B†„<" Bçö\'~ \nBÿÿÿƒ| B‡|"Bˆ<& B† B€€àƒBˆ„<% BӌC~ Bÿÿÿƒ| B‡|"B ˆ<) Bˆ<( B† B€€ÿƒBˆ„<\' BÑ«~ Bÿÿÿƒ| B‡|"B ˆ<, Bˆ<+ B† B€€øƒBˆ„<* Bƒ¡V~ \rBÿÿÿƒ| B‡|"Bˆ<. B† B€€ÀƒBˆ„<- Bÿÿÿƒ B‡|"B\nˆ<1 Bˆ<0 B† B€€þƒBˆ„</ Bÿÿÿƒ B‡|"B\rˆ<4 Bˆ<3 Bÿÿÿƒ B‡|"<5 B† B€€ðƒBˆ„<2 Bˆ<6 Bÿÿÿƒ B‡|"B ˆ<9 Bˆ<8 BˆBƒ B†„<7 Bÿÿÿƒ B‡|"Bˆ<; B† B€€àƒBˆ„<: B‡" Bÿÿÿƒ|"Bˆ<? B ˆ<> B† B€€ÿƒBˆ„<< § §jAv­<= AÀ AÀ @ BÀ7 ;A°j$A >#A k"$   A(   AjB A”·( A  A j$ Z#A@j"$  B C  )7  )7  )7  )7 AÀ AŒ·( A@k$ °#" AÀkA@q"$  6¼@ AÀM@ AÀj"AA AH\r  A¼jB AH\r   ­ AH\r    AÀj"AAAÀAH\r  A¼jB AH\r   ­ AH\r  AðjAÀAH\r )ˆ7 )€7 )x7 )p7 A j! A k"AÁO@@  )¨7h  ) 7`  )˜7X  )7P  )ˆ7H  )€7@  )x78  )p70 AðjAÀ A0jBÀAA`AH\r )ˆ7 )€7 )x7 )p7 A j! A k"AÀK\r  )¨7h  ) 7`  )˜7X  )7P  )ˆ7H  )€7@  )x78  )p70 Aðj"  A0jBÀAA`AH\r E\r  ü\n AÀjA€$ A€€€€ A A€€€€x A€À A€ Ž@ -"A:kAÿqAöI\r ! !@ ! A™³æÌK\r AÿqA0k" A\nl"AsK\r  j! Aj"-"A:kAÿqAõK\r F\r A0F Gq\r  6 !  ñ AyqAF@@@@@@@@ @@ AM@@ ! @@@@@  j," AÐÿsAjAsAvA?q AÔÿsAjAsAvA>qr A¹j Aûk AŸÿjAsqAvqAÿqr Aj A:k AÐÿjAsqAvqAÿqr AÛk AÁk"\nAsqAv \nqAÿqr"\nAk A¾ÿsAjqAvAÿq \nr"\nAÿG\rA!\n E\r  ?@ Aj" O\r  !  \n Atj! AK\r Aj!   Aj" I!  Ak!  \rM\r \rj  v: \rAj!\r A!\n Aj" I\r  @@  j," A ÿsAjAsAvA?q AÒÿsAjAsAvA>qr A¹j Aûk AŸÿjAsqAvqAÿqr Aj A:k AÐÿjAsqAvqAÿqr AÛk AÁk"\nAsqAv \nqAÿqr"\nAk A¾ÿsAjqAvAÿq \nr"\nAÿF@A!\n E\r  ?@ Aj" O\r  !  \n Atj!@ AI@ Aj!  Ak!  \rM\r \rj  v: \rAj!\r A!\n Aj" O\r !   Aj" I!  !Að½AÄ6A!\n AK\r A !A! \n@ !  A tAsq@ !  @ Aq\r Av"\nE\r E\r  K!@ F@AÄ!  @ j,"A=F@ \nAk!\n   ?\rA! !  Aj! \n\r A! E\r O\r@  j,?E\r Aj" G\r !  A!  !  AÄ! O@ !  A! j-A=G@ !  Aj! \nAF@A!   F@  K!AÄ!   j-A=F\r Að½ 6  Aj!A! \r! @ @   j6   F\rAð½A6A! @  6   •@@@@@ AyqAG\r An"At!@ A}l j"E\r AqE@ Aj!  Av jAj!  M\r@ AO@ E@A!  A!A!  E@A!  A!A!  @  j- Atr! Ar!@ j  Ak"vA?q"AÇj AæÿjAv"\nAsq AÌÿjAv" q \n AÁjqr AÁÿjAsAvAßqr Aüj AÂÿjAvq Asqr AÁÿsAjAsAvA-qr: Aj! AK\r Aj" G\r E\rAÁÿ!A-! Aß   @  j- Atr! Ar!@ j  Ak"vA?q"AÇj AæÿjAv"\nAsq AÌÿjAv" q \n AÁjqr AÁÿjAsAvA/qr Aüj AÂÿjAvq Asqr AÁÿsAjAsAvA+qr: Aj! AK\r Aj" G\r E\rAÁÿ!A+! A/ ! j A ktA?q"AÇj AæÿjAv"Asq AÌÿjAv"q  AÁjqr   jAsAvqr Aüj AÂÿjAvq Asqr AÁÿsAjAsAvqr: Aj!  K\r @  O@ !   k"E\r jA= ü  Aj"  K k"@ jA ü  AÐA AçAß  ˜~#A@j"$@ AÁkAÿqA¿K@A! )PP@ (à"AO@ A@k" )"B€|7 )H Bÿ~V­|7H Aàj"N (àA€k"6à AO\r @  Aàj ü\n (à! A@k" )" ­|" 7 )H  V­|7H -ä@ B7X B7P Aàj!A!A€ k"@  jA ü N  )7  )7  )7  )7  ) 7  )(7(  )070  )878 @   ü\n AÀ A€ A@k$   Aê\nAÒ A²Aö A  j@ j" -   j-jk": Ar"j" -  j- AvAqjk": AvAq! Aj! Aj"AÀG\r ° #A k"$ (, Bˆ§s! (( §Ats! ($ Bˆ§s!\n ( §Ats! A@k!@  )x7˜  )p7  )`7ð  )h7ø  )p7à  )x7è A€j" Aðj Aàj  )ˆ7x  )€7p  )P7Ð  )X7Ø  )`7À  )h7È  AÐj AÀj  )ˆ7h  )€7`  )7°  )7¸  )P7   )X7¨  A°j A j  )ˆ7X  )€7P  )07  )87˜  )7€  )7ˆ  Aj A€j  )ˆ7  )€7  ) 7p  )(7x  )07`  )87h  Aðj Aàj  )ˆ78  )€70  )7P  )7X  ) 7@  )(7H  AÐj A@k  )ˆ7(  )€7  )70  )78  )7  )7(  A0j A j  )ˆ7  )€7  )7  )˜7  )7  )7  Aj   )ˆ7  )€7  ( s"\r6  ( s"6  ( \ns"6  ( s"6  ( s"6  (D \ns"6D  (H s"6H  (L s"6L Aj" AG\r @@@@ Ak (! (0! ( ! (`! (P!\n (! (4! ($! (d! (T! (! (8! ((! (h! (X! ( (< (, (\\ (lssss s \rs6     ssss s s6   ssss s s6    \nssss s s6  (! (0! ( ! (! (4!\n ($! (! (8! ((! ( (< (,ss \rs6  ss s6 \n ss s6   ss s6 (P! A@k(! (p! (`! (T!\n (D! (t! (d!\r (X! (H! (x! (h! (\\ (L (| (lsss6    sss6 \n \rsss6    sss6  E\r A ü A j$ ƒ #A k"$ (! (0! (! (! (4! (! (! (8! ( ! (! ( A&l¬ ~ $¬" ~| Al¬" #At¬"~|  ~|  ~|  ~|B†"B€€€|"B‡  ~  !¬"~|  ~|  ~|  \r~|B†|"B€€€|"B‡  \r~  ~|  \n~| ~|  ~|  ~|B†|" B€€€|"B€€€àƒ}> ~  ~|  \n~|  ~|  ~|B† B‡|" B€€€|" B€€€ðƒ}>  ~  \r~| \n ~|  ~|  ~|B† B‡|" B€€€|"B€€€ðƒ}> \n ~  ~|  ~|  ~|  ~|  &¬"~|B† B‡|" B€€€|"B€€€àƒ}>  B€€€ðƒ}  B€€€`ƒ} B‡|"B€€€|" Bˆ|>  B€€€àƒ}>  \n~  ~| ~|  ~|  ~|B† B‡|" B€€€|"B€€€ðƒ}>$  B€€€ðƒ}  B€€€`ƒ} B‡B~|"B€€€|"Bˆ|>  B€€€àƒ}> ­  j!@@ ("Aq\r AqE\r (" j!@@@ k"Aˆ¾(G@ ( ! AÿM@  ("G\rAô½Aô½(A~ Avwq6  (! G@ (" 6  6  (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6  ("AqAG\rAü½ 6  A~q6 Ar6  6  6  6  A! E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½Aø½(A~ wq6  @ (F@  6   6 E\r  6 ("@  6  6 ("E\r  6  6 @@@@ ("AqE@AŒ¾( F@AŒ¾ 6A€¾A€¾( j"6 Ar6 Aˆ¾(G\rAü½A6Aˆ¾A6 Aˆ¾(" F@Aˆ¾ 6Aü½Aü½( j"6 Ar6 j 6 Axq j! ( ! AÿM@ (" F@Aô½Aô½(A~ Avwq6   6  6  (!  G@ (" 6  6  (" Aj ("E\r Aj !@ ! "Aj! ("\r Aj! ("\r A6   A~q6 Ar6 j 6  A! E\r@ ("At"(¤À F@ A¤Àj 6 \rAø½Aø½(A~ wq6  @  (F@  6   6 E\r  6 ("@  6  6 ("E\r  6  6 Ar6 j 6 G\rAü½ 6 AÿM@ AøqAœ¾j!Aô½("A Avt"qE@Aô½  r6   ( !  6  6 6 6 A! AÿÿÿM@ A& Avg"kvAq AtrA>s! 6 B7 AtA¤Àj!@@Aø½("A t"qE@Aø½  r6  6 6  A AvkA AGt! (!@ "(Axq F\r Av! At!  Aqj"("\r  6 6 6 6 (" 6  6 A6 6 6 ‰#AÀk"$ A(j" 4 B7T A6P B7\\ B7d B7l A6t Aðj"  AÀj" A° A!  (ðAk"6ð  (ÀAj6À (ô! (ø!\n (ü! (€! („!\r (ˆ! (Œ! (! (”! Aj"        j   Aàj"      („" k6T  (€" k6P  (|" k6L  (x" k6H  (t" \rk6D  (p" k6@  (l" k6<  (h" \nk68  (d" k64  (`" k60  A0j\r@ A E@   j6$   j6   j6   j6  \r j6  j6  j6  \n j6  j6   j6 A j" \r A E\r Aà  A j \r - Aq -AvF@ A (k6 A ($k6$ A ( k6 A (k6 A (k6 A (k6 A (k6 A ( k6 A (k6 A (k6 Aøj A! AÀj$  þ A€K@A0  A€O@Að½A06A  AA A jAxq A I"AÌj"E\r Ak!@ A?qE@ !  Ak"("Axq A?jA@qAk"AÀA  kAMj" k"k! AqE@ (!  6   j6    (AqrAr6  j" (Ar6   (AqrAr6  j" (Ar6   @ ("AqE\r Axq" AjM\r   AqrAr6  j"  k"Ar6  j" (Ar6   Aj "E@A0 6A A€  A„·(  Aü¶( -~ ­ ­B †„"BZ Aj  B}  ZA    ­ ­B †„  Z    ­ ­B †„  K   ­ ­B †„  t  ­ ­B †„  Ì   ­ ­B †„ Ar    ­ ­B †„ þ    ­ ­B †„ ü    ­ ­B †„ ý   ­ ­B †„ â   ­ ­B †„ ­ ­B †„ Ð   ­ ­B †„A€·(   ­ ­B †„ Aø¶(   ­ ­B †„ Aô¶(   ­ ­B †„  ã   ­ ­B †„C   ­ ­B †„    ­ ­B †„  ` -~ ­ ­B †„"BZ Aj  B}  YA    ­ ­B †„  Y    ­ ­B †„  J   ­ ­B †„   ð   ­ ­B †„   ñ   ­ ­B †„#   ­ ­B †„ Û   ­ ­B †„ Ü ²#Ak" 6  6A! A;@  / ( j- ( j-sr;  / Ar" ( j- ( j-sr; Aj"AÀG\r  /;  /Ak; A€Â/Av /Avs; /Ak á#Ak"$ A6 Aj"  A  )7 AÐj"BÀ Aj 0 Aj" Aü¶( AÀ   A€·( Aà¶B }BƒA€·(   A€·( Aà¶B }BƒA€·(  7H  AÈj"BA€·(  7H  BA€·(  A0j"A„·( A€  5! A@ E\r @ §"@ A ü A!    Aj AjèA! AjA  Aj$  ¬#A€k" $ A6 Aj"\n  A )7 A@k"BÀ Aj" \n0 A€j" Aü¶( AÀ   A€·( Aà¶B }BƒA€·(   \nè  A€·( Aà¶B }BƒA€·( 78  A8j"BA€·( 78  BA€·(  A„·( A€ @ B7 AjA  A€j$A J#A k"$A!@ BT\r   =\r Aj  B}  Y! A  A j$  O#A k"$ BðÿÿÿT@A!   =E@ Aj    J! A  A j$   è#A k"$ -: -: -: -: -: -: -: -: -: - : -\n:\n - : - : -\r:\r -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -!  -Aøq: AÀr  Aÿq:  ; ,A! -Aÿq - - - - - - - - - - - - - - - - - -\r - - -\n - - - - - - - - - -AsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrAkA€qE@AA A ! A j$  Ž#AÀk"$A!@ gE\r H\r  2\r hE\r -: -: -: -: -: -: -: -: -: - : -\n:\n - : - : -\r:\r -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -: -!  -Aøq: AÀr  Aÿq: A j" Ž , -Aÿq - - - - - - - - - - - - - - - - - -\r - - -\n - - - - - - - - - -AsrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrAkA€q\rAA A ! AÀj$  A€€€ I#Ak" $A! Aj"\nB7 \nA6A \n        » \nW Aj$ å#A0k"$ @ Aæ @ -A$G\r -A7G\r -A$G\r -6"\nE\r A j AjU"E\r Aj U"E\r  k Aj!@A E\r  Ak"j" -A$G\r "@  k   " j"A-j" AæK\r K\r    B \nA€k­† ( ( AjA »\r @   ü\n  j"A$: AsAæj! Aj!A!@@ ! "AK@ !  Aj"AA k" AO" j! Aj"\n j-!A!A E\r  \nj-At r!A Aj"F\r  \nj-At r!A ! E\r  A?qA€j-: AF\r  AvA?qA€j-:  j Aj F\r AF\r  A vA?qA€j-: Aj E\r AF\r  AvA€j-: Aj "k! \r AjA A! E\r  AæjO\r A: ! A0j$  ½ (q! A!@ j A j"\n j-  j-s: Ar"j  \nj-  j-s: Aj! Aj" G\r E\r j A j j-  j-s: A jAÀ A  Aðj$A „~#Aðk"$ BR@  )7  )7  )7  )7 )! B7h  7`@ BÀZ@@ Aàj AF  -hAj":h  -i Avj":i  -j Avj":j  -k Avj":k  -l Avj":l  -m Avj":m  -n Avj":n  -o Avj:o A@k! B@|"B?V\r P\r A! A j Aàj AF §"Aq!A! BZ@ As"?k6  - 2s"6x   ,s" k6H   /s"6t   .s" k6D   1s"6p   0s" k6@   5s"6l   4s" k6<   7s" 6h  6s" k68   :s"6d  \n 8s"\n k64  >s" 6`   q!A!@ j A j" j-  j-s: Ar"j  j-  j-s: Aj! Aj" G\r E\r j A j j-  j-s: A jAÀ A  Aðj$A ‹~#Aðk"$ ­ ­B †„"\nBR@  )7  )7  )7  )7 )! B7h  7`@ \nBÀZ@@ Aàj AD  -hAj":h  -i Avj":i  -j Avj":j  -k Avj":k  -l Avj":l  -m Avj":m  -n Avj":n  -o Avj:o A@k! \nB@|"\nB?V\r \nP\r A! A j Aàj AD \n§"Aq!A! \nBZ@ Aq!A!@ j A j" j-  j-s: Ar"j  j-  j-s: Aj! Aj" G\r E\r j A j j-  j-s: A jAÀ A  Aðj$A ‹~#Aðk"$ ­ ­B †„"\nBR@  )7  )7  )7  )7 )! B7h  7`@ \nBÀZ@@ Aàj AE  -hAj":h  -i Avj":i  -j Avj":j  -k Avj":k  -l Avj":l  -m Avj":m  -n Avj":n  -o Avj:o A@k! \nB@|"\nB?V\r \nP\r A! A j Aàj AE \n§"Aq!A! \nBZ@ AE@ A€j"AAA  B    B    Aàj"A A j    Î! )X7 )P7 )H7 )@7 A  A  A $    ­ ­B †„   Í d~ ­ ­B †„!#A@j"$@ A j  @A!  A! A€¶ A jA\r     Z! A  A@k$    ­ ­B †„   Î .~ ­ ­B †„"BðÿÿÿZ@ Aj    K d~ ­ ­B †„!#A@j"$@ A j  @A!  A! A€¶ A jA\r     K! A  A@k$  x~@#Ak"$ ­ ­B †„"B€€€€T@ BR@ §!@ A: jA¸· AjA: Aj" G\r Aj$  AÂ\nA¨ AÆAÄ N#A k"$   A(  ­ ­B †„ Aj ­ ­B †„ A”·( A  A j$  ­ ­B †„ B A”·( (  ­ ­B †„  ­ ­B †„ A”·(  ­ ­B †„  A·(   ­ ­B †„  b   ­ ­B †„   8  ­ ­B †„  0   ­ ­B †„  c \n mA  ­ ­B †„  ­ ­B †„ 9  ­ ­B †„  O ª~ ­ ­B †„!\n ­ ­B †„! #Ak"$ @ B7 @ Aÿ: A!\r@@ \nBT\r \nB}" BïÿÿÿZ\r A j"BÀ A j" 0 Aàj" Aü¶( AÀ   A€·( A³B }BƒA€·( B7X B7P B7H B7@ B78 B70 B7( B7  -:  BÀ A 8 - !  -:  BÀA€·(  Aj" A€·( A³ \nB}BƒA€·(  7  Aj"BA€·(  \nB/|7  BA€·(  A„·( A€   §jA1@ A    A 8 -$ -s:$ -% -s:% -& -s:& -\' -s:\' -( -s:( -) -s:) -* -s:* -+ -s:+ ó@ AqE@ AE\r  )7ø  )7ð  )7è  )7à  )$7€ Aàj" B( b )ø7 )ð7 )è7 )à7 )€!\n A6 \n7$ @  7 A!\r E\r  : Aj$ \r   Û~ ­ ­B †„!\n ­ ­B †„! #A€k"$ @ B7 \nBïÿÿÿT@ Aj"BÀ A j" 0 AÐj" Aü¶( AÀ   A€·( A³B }BƒA€·( B7 B7H B7@ B78 B70 B7( B7 B7  :  BÀ A 8  BÀA€·(  -: Aj"  \n A 8   \nA€·( A³ \nBƒA€·(  7  Aj"BA€·(  \nB@}7  BA€·(   \n§j"A„·( A€ -$ -s:$ -% -s:% -& -s:& -\' -s:\' -( -s:( -) -s:) -* -s:* -+ -s:+ ó@ AqE@ AE\r  )7è  )7à  )7Ø  )7Ð  )$7ð AÐj" B(  b )è7 )à7 )Ø7 )Ð7 )ð! A6 7$ @  \nB|7 A€j$A   1~ ­ ­B †„"BðÿÿÿZ@ Aj    JA  nA P~ ­ ­B †„! Aœ A\n@E@  A[  A’ A @E@  A[  Að½A6A N~ ­ ­B †„! Aœ A\n@E@  Ï  A’ A @E@  Õ  Að½A6A Q~ ­ ­B †„! ­ ­B †„! @@@ Ak   Ð     Ö s~ ­ ­B †„! ­ ­B †„! ­ ­B †„!\r@@@ \nAk   \r A×    \r AÑ  Að½A6A   ­ ­B †„Ï - ­ ­B †„  ­ ­B †„  ­ ­B †„ \nÑ  ­ ­B †„ A[  ­ ­B †„ A[   ­ ­B †„Õ ´ (Aÿÿÿq6 (AvAƒþÿq6 (AvAÿÿq6 ( AvAÿÿÀq6 ( ! B7 B7 A6$ AvAÿÿ?q6 (6( (6, (60 (! A:P B78 64A   ­ ­B †„ ­ ­B †„ Ö - ­ ­B †„  ­ ­B †„  ­ ­B †„ \n× l#Aðk"$ B7( A ³)7 A¨³)7 A°³)7 A¸³)7 Aj"  ­ ­B †„!  * Aðj$A   ­ ­B †„! ä#"AÀkA@q"$  (Aÿÿÿq6@  (AvAƒþÿq6D  (AvAÿÿq6H  ( AvAÿÿÀq6L ( ! B7T B7\\ A6d  AvAÿÿ?q6P  (6h  (6l  (6p (! A: B7x  6t A@k"  n  A0j"m 5 $    ­ ­B †„    Ý x~#" AÀkA@q"$A! ­ ­B †„" B0Z@ A@k"AAA  B    B    A j"A A j B }   ³! $  ¿~ ­ ­B †„! #" A€kA@q"$A! A@k" A j">E@ A€j"AAA  B    B    Aàj"A A j    ´! )X7 )P7 )H7 )@7 A  A  A $    ­ ­B †„   ³ H~ ­ ­B †„!#A k"$A!   =E@     Y! A  A j$    ­ ­B †„   ´ .~ ­ ­B †„"BðÿÿÿZ@ Aj    J H~ ­ ­B †„!#A k"$A!   =E@     J! A  A j$  }#A k"$ A@k" A +   ­ ­B †„  Aàj" Aj" BÀ   AÀ °!  AÀ1 A j$A  Fr ]#Aàk"$  A +   ­ ­B †„  A j" AÐj" BÀ   AÀ Aàj$A y#Ak"$ A j" A -   ­ ­B †„!  Aðj"* Aˆj" B !  * A  :  -^: -?:  -_: AÀA! $   ž#"! A€kA@q"$  "@A! Aàj"  E@ A€j"AAAÀ  B   A   B    B    A j"AÀ A€  - :  " -@:  -!: -A:  -": -B:  -#: -C:  -$: -D:  -%: -E:  -&: -F:  -\': -G:  -(: -H:  -): -I:  -*:\n -J:\n  -+: -K:  -,: -L:  --:\r -M:\r  -.: -N:  -/: -O:  -0: -P:  -1: -Q:  -2: -R:  -3: -S:  -4: -T:  -5: -U:  -6: -V:  -7: -W:  -8: -X:  -9: -Y:  -:: -Z:  -;: -[:  -<: -\\:  -=: -]:  ->: -^:  -?: -_: AÀA! $    A B AA` AŒ·( \n   A£ A¶ Aû AÎ #A€k"$ A j" A +   #  AÀj.  )Ø7  )Ð7  )È7  )À7  \n  u AÄ W#A@j"$@ A j  @A!  A! Aж A jA(\r    ½! A  A@k$  W#A@j"$@ A j  @A!  A! Aж A jA(\r    ¾! A  A@k$  \n       Æ \r   Ç  È Ê  Ë A® :~ ) ! )(! )0! )87 7 7 7A :~ )! )! )! )7 7 7 7A ‹@@@ BÀT\r B@|"B¿ÿÿÿV\r  A@k"  ArE\r E\r §"E\r A ü A! E\r B7A @  7 A! E\r §"E\r  ü\n  ˆ#Ak"$ A@k! §"@   ü\n A! Aj   As@ )BÀR@ @ B7 A@k"@ A ü A!  E\r  B@}7 Aj$      AsA m#A@j"$  B C  -Aøq:  -A?qAÀr: )7 )7 )7 )7 AÀ A@k$A ç\n\'~#A€k"$A!@ H\r Aàj" ‘\r hE\rA! A (¬"k6$ A (¨"k6 A (¤" k6 A ( "k6 A (œ"\nk6 A (˜"k6 A (”" k6 A ("k6 A (Œ" k6 A (ˆ"k6  3  ("\r¬" \nAt¬""~ 4" ¬"~| ("¬" ¬"~| ( "¬" At¬"#~| ("¬" ¬"~| ("¬"$ At¬"%~| ("¬". Aj¬"~| ("Al¬" At¬"&~| ( "Al¬" ¬"~| ($"Al¬" At¬"\'~|  ~  \n¬"(~|  ¬")~|  ~|  ¬"*~|  $~| Al¬" ¬"+~|  ~|  ¬",~|  ~|  #~  ~|  ~|  %~|  ~| Al¬"- &~|  ~|  \'~|  ~|  "~|"0B€€€|"1B‡|"2B€€€|"3B‡|" B€€€|"!B€€€àƒ}>H   %~  ~|  ~| Al¬" &~| Al¬" ~| \' -~|  ~|  "~|  ~|  #~|  ~  *~| Al¬"/ +~|  ~| ,~|  -~|  (~|  ~|  )~|  ~| \rAl¬ &~  ~|  /~|  \'~|  ~| " -~|  ~|  #~|  ~|  %~|"/B€€€|"4B‡|"5B€€€|"6B‡|" B€€€|"7B€€€àƒ}>8   ~  ,~|  (~|  ~|  )~|  $~| * .~| ¬" ~|  +~|  ~| !B‡|"! !B€€€|"!B€€€ðƒ}>L   ~  )~|  *~|  ~| +~|  -~|  ,~|  ~|  (~|  ~| 7B‡|" B€€€|"B€€€ðƒ}><   \'~  ~|  ~|  "~|  ~| # $~|  .~|  %~| ¬" ~|  &~| !B‡|" B€€€|"B€€€àƒ}>P  2 3B€€€ðƒ} 0 1B€€€`ƒ} B‡|"B€€€|"Bˆ|>D   B€€€àƒ}>@   ~  +~|  ,~|  ~|  (~|  $~| ) .~|  ~|  *~| ¬ ~| B‡|" B€€€|"B€€€ðƒ}>T  5 6B€€€ðƒ} / 4B€€€`ƒ} B‡B~|"B€€€|"Bˆ|>4   B€€€àƒ}>0 A0j\r A€j$  A‚ 4#A k"$A!   E@ A€¶ A! A j$  A„ A€€€€ A€€€À A A’ Ï~A!@ AÀK\r AÁk"A@I\r@ A E@ AÿqA¿K@~ E@BŸØùÙ‘ڂ›!Bхšïúϔ‡Ñ  )BŸØùÙ‘ڂ›…! )Bхšïúϔ‡Ñ… !\n~ E@BùÂø›‘£³ðÛ! Bëú†Ú¿µöÁ  )BùÂø›‘£³ðۅ! )Bëú†Ú¿µöÁ… ! A@kAA¥ü 78 70 7( \n7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­Bˆ’÷•ÿÌù„ê…7A   E\r  #A€k"$@ AÁkAÿqA¿M\r E\r AÁkAÿqA¿M\r~ E@BŸØùÙ‘ڂ›!Bхšïúϔ‡Ñ  )BŸØùÙ‘ڂ›…! )Bхšïúϔ‡Ñ… !\n~ E@BùÂø›‘£³ðÛ! Bëú†Ú¿µöÁ  )BùÂø›‘£³ðۅ! )Bëú†Ú¿µöÁ… ! A@kAA¥ü 78 70 7( \n7 Bñíôø¥§ý§¥7 B«ðÓô¯î¼·<7 B»Îª¦ØÐë³»7 ­ ­B†„Bˆ’÷•ÿÌù„ê…7 AA€ü @   ü\n Aàj A€ü\n A€6à A€ A€j$A   \r A!  = AyqAG@ An"A}lj"AjA AqA Aq AtjAj £ @@@@@@@@ @ \rA!A!@  j-" AßqA7kAÿq" Aöÿj AðÿjsAv"\r A0s" AöÿjAv"rAÿqE\r  \nM\r \rq qr! @ AÿqE@ At!  \nj  r: \nAj!\n As! Aj" G\r !  A E\r  @@@@@  j-" AßqA7kAÿq"Aöÿj AðÿjsAv" A0s"\rAöÿjAv"rAÿqE@ Aÿq\r A!  ?E\r Aj" !  K\r  \nM\r  q \r qr" AÿqE\r \nj  r: As! \nAj!\n  @  j-" AßqA7kAÿq" Aöÿj AðÿjsAv"\r A0s"AöÿjAv"rAÿqE@  ?E\r  Aj"K\r   \nM\r \rq  qr At!Aÿ!    K!  A!  A! Aj" I\r  Að½AÄ6A! AÿqE\r Að½A6A! Ak!A!\n  \nA !\n Ak! \r  G\r     j6   Að½A6A @  \n6 @ AþÿÿÿK\r  AtM\rA! @ Atj"  j-"Aq"At AöÿjA€²qjA€®jAv:  Av" AöÿjAvAÙqjA×j: Aj" G\r AtA jA:   Aà? ­~#A€k"$ A: Aà?M@ A O@ ­! A !@ ! A0j" A - @  jA kB   A0j"     AjB   jB  -Aj: ! A j" M\r Aq"@ A0j" A - @  jA kB   A0j"  ­   AjB   Aj"B @ j  ü\n AjA  A0jAÐA  Að½A6A A€j$ 8#AÐk"$   -   ­   B A AÐj$A  B AA  ­ \n  - An A A4 •~#A0k"$  )7  )7  )7  )7  )$7  B( A j b )7 )7 )7 )7 ) ! A6 7$ A0j$ -~  A A6 )! B7, 7$A 3~ A  A A6 )! B7, 7$A à  ß  á â ã ä  å "#A@j"$ AÀ ˆ A@k$ ˆA e#A k"$A!@ A€j" :\r Aàj" :\r   A j"  Q AÀj" R GA! A j$  e#A k"$A!@ A€j" :\r Aàj" :\r   A j"   AÀj" R GA! A j$  #A k"$  : A j$E !#A k"$ A  ‰ A j$ ‰A s#A k"$A!@ A€j" 2\r IE\r Aàj" 2\r IE\r   A j"  Q AÀj" R ,A! A j$  s#A k"$A!@ A€j" 2\r IE\r Aàj" 2\r IE\r   A j"   AÀj" R ,A! A j$  @#A k"$@ gE\r H\r  2\r IE\r hAG! A j$  AÀÿ º~#Aðk"$ A: AÀÿM@ AÀO@ ­! AÀ!@ ! AÐj" AÀ+ @  jA@jBÀ# AÐj"  #  AjB#  j.  -Aj: ! A@k" M\r A?q"@ AÐj" AÀ+ @  jA@jBÀ# AÐj"  ­#  AjB#  Aj". @ j  ü\n AjAÀ AÐjA A  Að½A6A Aðj$ AÀ 8#A k"$   +   ­#  . A A j$A  . AA  ­# ¥#Ak"A6 A!  AkK  Ak"j!A!A!A!@  ( "A  k-" A€sAk Ak AkqqAvAq"k qr6  r!  r! Aj" G\r  ( k6 AÿqAkA &@AŒÂ("E\r ("E\r !   ­A ¬ 0 Ú#Ak"$@@ E@A!    Ak"qE@  As"q  As!   pk " O\r   j"M@A!  @ Aj6  j!A! A:A!@ k" - -q  sAkAv"A€qr:  - r: Aj" G\r Aj$   M#Ak"$ AO@A k p!@ A:A¸· AjA" I\r  p! Aj$  (#Ak"$ A:A¸· AjA Aj$ AÁ Ç#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (!  60  6,  (64  (68  (6<   d AÀ A@k$A ½#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (!  70  6,  (68  (6<   d AÀ A@k$A Ø#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (! A60  6,  (64  (68  (6< §"@ A ü  d AÀ A@k$A Î#A@j"$ BR@ B²ÚˆËÇ®™ë7 BåðÁ‹æ™37  (6  (6  (6  ( 6  (6  (6$  (6( (! B70  6,  (68  (6< §"@ A ü  d AÀ A@k$A %A„Â(AçAðÁAA„ÂA6A §~#A k" $   A°jïA! AK@A !@  j A°jî "A j" M\r  Ar"O@@  j"(! (!\r (! ( ! )ˆ7ˆ )€7€ )ð7ð )ø7ø )€7à )ˆ7è Aj" Aðj Aàj )˜7ˆ )7€ )à7Ð )è7Ø )ð7À )ø7È  AÐj AÀj )˜7ø )7ð )Ð7° )Ø7¸ )à7  )è7¨  A°j A j )˜7è )7à )À7 )È7˜ )Ð7€ )Ø7ˆ  Aj A€j )˜7Ø )7Ð )°7ð )¸7ø )À7à )È7è  Aðj Aàj )˜7È )7À )€7Ð )ˆ7Ø )°7À )¸7È  AÐj AÀj  (œs6¼ (˜s6¸ \r (”s6´  (s6° "Aj" M\r Aq" @A k"@ A j rA ü @ A j  j ü\n ( ! (¤! (¨! (¬! )ˆ"!7ˆ )€""7€ )ð7° )ø7¸ "7  !7¨ Aj"\r A°j A j )˜7ˆ )7€ )à7 )è7˜ )ð7€ )ø7ˆ \r Aj A€j )˜7ø )7ð )Ð7p )Ø7x )à7` )è7h \r Aðj Aàj )˜7è )7à )À7P )È7X )Ð7@ )Ø7H \r AÐj A@k )˜7Ø )7Ð )°70 )¸78 )À7 )È7( \r A0j A j )˜7È )7À )€7 )ˆ7 )°7 )¸7 \r Aj   (œs6¼  (˜s6¸  (”s6´ (s6° @ E@A!A! AI\r@ Aj  j A°jê "Aj" M\r  A!A! AI\r@ j  j A°jê "Aj" M\r Aq"@ j Aj !  j! A°j! #Aðk"\n$ \nAÀj j!A k"E"E@ A ü E"E@ \nAÀj  ü\n (! A@k"(! (P! ( ! (0! (! (D! (T! ($! (4! (! (H! (X! ((!\r (8! \n(À! \n(Ä! \n(È! \n (, (buflen <= BLAKE2B_BLOCKBYTES$argon2i$v=$argon2id$v=curve25519ed25519hmacsha512256curve25519xsalsa20poly1305sodium_bin2base64siphash24sha512xsalsa201.0.20$argon2i$$argon2id$$7$¶xYÿ…rÓ½nÿ\nj)À˜èyÿ¼< ÿ™qÎÿ·âþ´\rHÿ° þÓɆÿži5` ½§×ûÿŸL€þjeáÿü’ ®A\r \'Yñ²þ\nå¦ÿ{Ý*þÔR€0Ñówy@ÿ2ãœÿnÅgAÀ\r À…;Œ½ñ$ÿø%Ã`Ü7·L>ÿÃB=2L¤á¤LÿL=£ÿu>Q‘@ÿvA¢sÖÿŠ.|æôÿ\nŠ4¸ôL)¾ôÿ{ªzÿbDyՓVeÿ¡g›ŒYCÿïå¾C µÆð‰þîE¼ÿC—î*lÿåUq2D‡ÿj 2gÿP¨#˜ÿ¨¹8YèÿeÒü)úG̪Oÿ.ïÿPMï½ÖKÿù&PLÿ¾UuV䪜ØÐÃϤÿ–BLÿ¯áÿPbLÛòÆ¢r.ژ›+ñþ› hÿ3»¥¯BT ÷:#A5þEì¿-†õ£{Ý nÿ4¥ºÖGé°`òï69YŠSTÿˆ d\\Žxþh|¾µ±>ÿú)U˜‚*`üö——?þï…> 8œ-§½ÿŽ…³ƒVÓ»³–þúªÿÒ£N%4—cMîœÕÿÕÀÑI.TA)6ÎOɃ’þªoÿ±!2þ«&ËÿN÷tÑݙ…€²:,É\';½ü1åÒu»uµ³¸rÛ0^“õ)8}\rÌþô­w,Ý þTêù Æì~êÿ/c¨þªâ™ÿf³ØâzÿzB™þ¶õ†ãäÖ9ëÿØ­8ÿµçÒw€ÿ_ˆÿn~3©·ÿ‚bþE°^ÿtãÙò‘ÿÊ­i\'ÿ.¯Eä/:ÿ×àEþÏ8Eÿþ‹ÿÏÔÿÊ~ÿ_Õ`ÿ °!ÈÏÿñ*€þ#!Àÿøåāxûg—ÿ4pÿŒ8Bÿ(âõÿÙF%þ¬Ö ÿHC†’ÀÖÿ,&pD¸KÿÎZû•덵ª:tôï\\f­bé‰`1Ë›”” ÿÓz "†ÿÛ̈†)ÿàS+þU÷mþ©ˆ0îwÛÿç­ÕÎþþºÿ~ o*Ho4ìþ`?“¿þÍNÀÿjí»ÛL¯ó»þiY­UY¢ó”vÑþ!ž ‹£.ÿ]F(l*ŽþoüŽÿ›ß3å§ÿIü›ÿ^t ÿ˜ Úÿœî%ÿ³êÏÿųÿš¤áÄh\n#þÑÔòÿaýÞþ¸eåÞ¤ˆ‡ÿόþ’aóÀþÉT!ÿo\nNÿ“Q²ÿ¡î×ÿ!5×ÿ)µÐÿ狝³ËÝÿÿ¹q½â¬ÿqBÖÿÊ>-ÿf@ÿN®þ…uDÿA  AÀ °&蕏²\'°EÃô‰òï˜ðÕ߬ÓÆ39±8ˆmSüÇjp=MØOº< v\rg* Sú,9ÌÆNÇýw’¬zìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÓõ\\cX֜÷¢ÞùÞAÿ ¬ñý@] j?9ÓWþ ÒºX¼tþAØÿÈ=ØB”ÿû\\$²áÿ…;Œ½ñ$ÿø%Ã`Ü7·L>ÿÃB=2L¤á¤LÿL=£ÿu>Q‘@ÿvA¢sÖÿŠ.|æôÿ\nŠ4¸ôL)¾ôÿ{ªzÿbDyՓVeÿ¡g›ŒYCÿïå¾C µÆð‰þîE¼ÿêq<ÿ%ÿ9ÿE²¶þ€Ð³v}þÖÿñ2MÿUËÅÿӇúÿ0dÿ»Õ´þXiSўsb®<þ«7nÿÙµÿ¼ª’œfþWÖ®ÿrz›é,ªïÖìê¯Û1j=ÿBÐÿjnÿQêÿ×kÀÿC—î*lÿåUq2D‡ÿj 2gÿP¨#˜ÿ¨¹8YèÿeÒü)úG̪Oÿ.ïÿPMï½ÖKÿù&PLÿ¾UuV䪜ØÐÃϤÿ–BLÿ¯áÿPbLÛòÆ¢r.ژ›+ñþ› hÿ² üþdnÔ§éï£ÿ—e’\nÿþžFþGùäX2D: ÿ¿hBÿÀ2Uÿ³Šÿ&úÉsP ƒæq}X“ZDÇýLžÿvqúþBK.æÚ+åxº”D+ˆ|î»kÅÿT5öÿ3tþÿ3»¥¯BT ÷:#A5þEì¿-†õ£{Ý nÿ4¥ºÖGé°`òï69YŠSTÿˆ d\\Žxþh|¾µ±>ÿú)U˜‚*`üö——?þï…> 8œ-§½ÿŽ…³ƒVÓ»³–þúªÿDqÿÞº;ÿBñEHVœlþ7§Ym4Ûþ\r°ÿÄ,jÿï•Gÿ¤Œ}ÿŸ­3)ç‘>!Šo]¹SEs.a—ÿä1ÙâqKêþÁ™ ÿ¶0`ÿ\r€ÃùþEÁ;„%Qþ}j<Öð©¤ãBÒ£N%4—cMîœÕÿÕÀÑI.TA)6ÎOɃ’þªoÿ±!2þ«&ËÿN÷tÑݙ…€²:,É\';½ü1åÒu»uµ³¸rÛ0^“õ)8}\rÌþô­w,Ý þTêù Æì~êÿ>݁YÖÿ7‹þD¿ÿ̲#ÃÙ/3Î&ö¥ÎþžW$Ù4’ÿ}{×ÿU<ÿ«\rÚõXþü#<7Ö ÿ…e8à þ“@ê‘¢rv}øüúe^Äÿƍâþ3*¶‡ þm¬ÒÿÅìÂñAš0œ/ÿ™C7ÿÚ¥"þJ´³ÚBGXzcÔµÛÿ\\*çÿïšõM·ÿ^QªÕØ«]G4^ø—¡þÅÑBÿ®ôþ¢0·1=ðþ¶]ÃÇäÈÿ‰-íÿl”ZOíÿ\'?Mÿ5RÏŽvÿeè\\CÈXÿ!¨Šÿ•áHÑÿ,õ¨ÜíÿÓiþî݀PõþoþÞ_¾ß ñ’LÔÿlÍhÿ?u™E0#äoÀ!ÁÿpÖ¾þs˜—fX3JøâǏþÌ¢eÿÐa½õhæöÿ”EnX4þâµYÿÐ/Zþr¡Pÿ!tø³˜WÿE±Xîÿ: qME;y4ÿ˜îS4Áç\'éÿÇ"ŠÞD­[9òþÜÒÿÀöþ—#»Ãì¥o]ÎÔ÷…š…Ñÿ›ç\n@N&zùdaÿ>[ùø…MÅ?¨þt\nR¸ìqþÔËÂÿ=düþ$Êÿw[™ÿOgg«þí×oÿØ5Eïð•Ýÿ&áÞèÿ´þvR…ÿ9ѱ‹è…ž°.þÂs.X÷åg¿ÝÞ¯þ•ë,—äþÚigŽUҕ¾ÿÕA^þu†àÿRÆuÝÜ£e$År%h¬¦þ ¶QH¼ÿa¼ÿE\nǓ‘ÿ sAÖ¯ÿÙ­ÑP¦÷åþ§·|ÿZÌþ¯;ðÿ )øl(3ÿ±Ãþ–ú~Š[Ax<ÞÿõÁïÖ½ÿ€Pš¢MÜkêÍJÿ6¦gÿtH ä^/ÿÈÿ#ÖYÿ=°ŒÿSâ£ÿK‚¬€&_‰˜ÿ×|ŸO]”RþÂûÿ(ÊLÿû~àc>þÏáÿ`D̺ÿƒçÿ*€þ4Û=þfËH ÿº¤Õzw…ò‘Ðüèÿ[Õ¶ÿúþù×J¥o« ßå{"\\‚ÿM›-Ëÿ;àNˆ÷ly Oú½ÿ`ãüþ&ñ>>®}ÿ›o]ÿ\næÎaÅ(ÿ19þAú\rû–ÿÜmÒÿ®¦þ,½ë#“ÿ%÷ÿHÿgkÿ÷Z5,*ð;?XN$q§´¾GÁÿǞ¤ÿ:¬M! A?™M!ÿ¬þfäÝÿWþ’)VÿŠÌïþlÿ»ò‡ÒÐD-þI`>Q<ÿª$ÿù#Õm6ÿ#áÿê=8ÿ:ُ|Xì~BÑ&·ÿ"îÿ®‘f_ÓÄ™þ.Tèÿu"’çúJÿ†d\\»ÃÿªÆpx*ÑFCQ¨d©­ k#u>`;ÿQ E‡ï¾ÿÜü£Ü:ÿ‰‰¼ÿSfm`LêÞÒÿ¹®Í<žÕÿ\rñÖ¬Œ]hòÀœû+uáQžèÚâËé—ÿu+ÿò/ÿ!‰û,þõÿ·Ö}þ(y•ºžÕÿYãEXþˇáɮ˓G¸y)þ^NàÖðþ$´û‡ç£ŠÔÒùtþX»1þ>ÿŸLÓÖ3RmuäþgßËÿKüšGÜÿ\r[¨`ÿµ¶…ú37êêÔþ¯?ž\'ð4ž½$ÿÕ(U ´÷ÿfTaÿEޔ‹zÿÜÕëèËÿy9“ãš5“HáR†0þS<ÿ‘H©"gïÆé/tÿ¸j ÿ·S$°æ"gHÛ¢†õ*ž •`þ¥,ÊïHþז*B$„ׯV®VÿŜÿ1è‡þg¶Rý€°™²zõú\n첉j„()2˜ÿ|i&æ¿K+ª,ƒÿ,\rÿíÿ›ŸmdÿpµÿhÜl7Ӄc Õÿ˜—‘ÿîŸa›!lQg>m"ÿú›´ GÃÿ&F‘Ÿ_õEåeˆðOàNnyÿø¨|»€÷“ëþO „F: µ£ÿO‰…ÿ%ª ÿóUÿ°ç×ÿ̖¤ÿï×\'ÿ.Wœþ£Xÿ¬"èB,fÿ6)þìcWÿ){©4r+u†(›†çÏ[þ#„&ÿf}þ$ã…ÿvqÿ\r|˜`JX’Îÿ§¿Üþ¢Xÿ¶du4Q.j EPÉÑö¬ 0àÓXtâŸzb‚Aìêáâ ÿÏâ{YÖ;p‡XZôËÿ1 &lºYpe.ÌÿÌ-þOÿÝÿ3Iÿ*eÿñÊ ãi2ìO4ÅÿhÊдeÅNÿbMË)¹ñ#Á|#›ÿÏ5À }£ùž¹ÿƒ0]oÿ=yçEÈ$ÿ¹0¹ÿoîÿ\'2ÿc×£ÿWÔÿ¤“ÿ€#lßnÿÂL²Je´ó/0®+ÿR­ý6rÀÿ(7[×l°ÿ 8àéLÑbÊþò},Á]þ˱‡°pGÕÿÎ;°CÕþ*7Ðÿ×næ³§ÿ6ü¾Ý̶þ³žAÿQÂڟªßà ÿ&Åb¨¤%X¤ºn`$†êòåúyòþpÿ/^ ïÿQ†™þÖý¨ÿC|àõ_J,þmÜÿ²YYü$LÆ.ÿLMo†êˆÿ\'^¹HêÿFD‡ÿçfþM猧/:”avÿá¦Îÿn²Öÿ´ƒ¢á\rÚNÿr™!bh̯ru§ÎKÊÄS:@CŠ/oÄ÷€ÿ‰ààþžpϚdÿ†%kƀOÿћÿ£þ¹þ<óÛpþÙAÈ\rtþ{<Äÿà;¸þòYÄ{Kþ•ÎEþ0çtßÿÑ AÈPb%¸þ”?"‹ðAÿِ„ÿ8&-þÇxÒl±¦ÿ ÞÜ~wþ¥k ÿRÜøñ¯ˆÿ©ŠT ‰NÿâvPÿ4„ÿ?`‹ÿ˜ú\'¼›è3–þ(èÿðå ÿ‰¯ÿKIaÚÔ ‡¢k¹Õùkÿ(òFÛȝ\rCRPÿÄùÿ‘•2H’^L”ûAÀ¸ÔÉÿ{é¢÷­H¢WÛþ~†YŸ þ¦iIäqx·ÿB£mԏ ÿŸç¨ÿ€Z9:þY4\nÿý£‘Òÿ\nU.µgˆ þ~¼Ñÿ"#o×ÛÿÔ ÖþevèŅÿß§mÿíPVÿF‹^žÁ¿›3ÿ¾sN‡Ïÿù\nµ}é_¬\rþªÕ¡ÿ\'ìŠÿ_]Wÿ¾€_}Φ–ŸãžÿΞxÿ*€e²xœmƒÚ,þ÷¨ÎÿÔppäÿZ%ÅÞlþÏSÿ Zóÿóô¬XsÿÍtz¿æÁ´d Ù%`ÿšNœëêÿβ²ÿ•Àû¶ú‡öi|Ámÿҕÿ©ª`nÿu 2{(ÿÁ½c"ã 0PFþÓ3ì-zõþ,®­%éÿžA«zE×ÿZPÿƒj`þãr‡Í1wþ°>@ÿR3ÿñóÿ‚\rþ€Ùóÿ¢þZvñöÆöÿ7vÿȟ£ŒkyU¡vÿ&•œ/î ¦¦Kbµÿ2JB/‹áŸLŽÿî¸ Ï5ÿ·Àº« ®ÿ¿LÝ÷ªÛ¬2þÙ éË~Dÿ·\\0§·A1þ?þªÿ;àþ0?ÿN‚þ(Ãú„pþ#ːh©¨Ïýÿh(&þ^äX΀ÿÔ7zÿßêßÅýµµ‘fvì™$ÿÔÙHÿ&þŠ>>˜ŒæÜcÿÔÿ”Éçô{ þ«Ò3:%ÿÿÿô·‘þò¦J„yØ)_Ãrþ…—ÿœâçÿ÷Mÿö”sþá\\QÿÞPöþª{YÿJǍÿŠˆFÿ]K\\ݓ1þ4~âå|. µÍ@4ƒþ—žÔƒ@NΫ拿ýnþg÷§@((*¥ñÿ;Käþ|ó½ÿÄ\\²ÿ‚ŒVÿY8“ÆÿËøžþ¢ ¬â‚*ÿ§ÿ$$ÿ0X¤þ¨ªÜbGÖ[ÐOŸLɦ*ÖÿEÿÿ€}ÿ¾Œ’SÚÿ×îHz5½t¥ÿTBÿÖÐÿÕn…è,žçE¢@Èþ[:h¶:»þùäˆË†LþcÝéKþÖþPEš@˜øþìˆÊÿi™þ•¯#ÿ|yéºúÆþ„勉P®ÿ¥}DÊ”þëïø‡¸ve^ÿzHFþE‚’ÞøEvÿR×þ¼Jÿå§ÂþuBÿAê8þÕœ—;]þ-ÿº~¤ÿ ïrcÛ4ÿc`¦þ>¾~ÿlÞ¨Kâ®æâÇÿ(kþŠšÇÿ^ßâÿ«&£±þ-vÿÞѾQÿv{è\rÕeÿ{7{þö¥2cLÿŒÖ ÿaACÿ ®VN@÷` ‡CB7óÿ“Ì`ÿ!ÿb3S™ÕÐÿ¸6ÿÚ 1Cöþ•Hÿ\rH*OÖ*&‹ÿ•»¤„õT¸þxÆhÿ~Ú`8uêÿ\rÖþD/\nÿ§š„þ˜&ÆB²YÿÈ.«ÿ\rcSÿÒ»ýÿª-*ŠÑ|Ö¢ æœf$pþ“C4×{ÿé«6ÿb‰>÷Ú\'ÿçÚì÷¿ÒT¥°\\ÿÔ^ÿJãX(™ƓÿÎCõþðÚÿ=Õÿa·jÃèëþ_VšÑ0ÍþvÑñÿðxßÕŸ£“ÿ\rÚ]UDþFPÿ½ŒRaþÿcc¿ÿ„T…ÿkÚtÿpz.i  ?ÿDÞ\'Øý\\±iÍÿ•ÉÃ*á ÿ(¢s Q¥ÚÛ´þ’üÿ’Ïá´‡`£p± Ûÿ… Áþ+N2Aqy;Ùÿn^p¬o`$U{G–ÿÐI¼À §Õõ" æ\\¢Ž\'ÿ×ZbaY^OÓZð_Ü~f°â$àþ#çèsUS‚ÒIõÿ/rÿDAÅ;H>ÿ·…­þ]yvÿ;±QÿêE­ÿ̀±Üô3ôÑIÞMÿ£`þ–•ÓžþË6‹¡à;mÿÞ*-ÿВfÿ쎻2Íõÿ\nJYþ0OŽÞL‚ÿ¦?ì \rÿ1¸ô»qfÚeý™9¶þ –*ƒíñ8ŒD[¤¬ÿN‘ºþC4ÍÛρms6:øxÿ³ÿÁìBÿÿÿýÀ0ÿEÙÖÿ@e’ß}#ÿëI³ÿù§âá¯\na¢:jp«T¬ÿ…Œ²ÿ†õŽaZ}ÿºË¹ÿßMÿÀ\\jÆsÿ٘ø«²xÿä†5°6Áúû5Õ\nd"Çj—ôþ¬àWÿíÿýUÿ\'tÿ¬hdûFÿÔЊÿýÓú°1¥L{ÿ%Ú ÿ\\‡\n~rÿFàÿ÷ùD<ñÒ½ÿÃÙ»—q—\\®ç>²ÿÛ·á!ÿ͵P9¸øÿC´ÿZ{]ÿ\'¢ÿ`ø4ÿTBŒ"äÿЦn¼›š¾ÆÿÖP;ÿHâÇÙùè¡G•¾ÉÙ¯_þq“CÿŠÇÿ̶SÎæ›ÿºÌ<\n}Uÿè`ÿÿY÷ÿÕþ¯èÁQ+œþ E“øÆ1†<#vöÿ1Xþþäºÿ¶ApÛÿ~4ÿ½51ÿp&7ÿâe£þЅ=ÿ‰E®¾v‘ÿ!sÓ¢a€ÿ¸þt¨ÿøŠ—ÿbôðºv‚røëÿi­È |Gÿ^$¤¯A’ÿîñªþÊÆÅäGŠþ-ömÿÂ4ž…»°SüšþY½ÝÿªIü”:}$D3þ*E±ÿ¨LVÿ&dÌÿ&5#¯aáîýÿQQ‡ÒÿþëIkÏsRˆTcþψd¤ePÐMÿ„Ïíÿÿ!¦nœ_Uÿ%¹o–j#ÿ¦—LrW‡ÿŸÂ@ zÿèeþ­wbšGÜþ¿95ÿ¨è ÿà cÿڜ¥—™£Ù\r”ÅqY•¡þÏi„ãÿ6æ^ÿ…­Ìÿ\\·ÿXüþf!ZŸaµÚ›ÿðrwjÖ5ÿ¥¾s˜[áÿXj,ÿÐ=q—4|¿œÿn6ì¦ÿ\'ÏåǼä¼þdëöÚ·kÁÿΠ_Lï“Ï¡u3¦ÿ4u\nþI8ãÿ˜Áá„^ˆÿe¿Ñ kåÿÆ+´dÒvrC™ÿXÿYš\\ÜxŒÿrÏÿüsúÿ"ÎHŠ…ÿ²|WKaå\\þðCƒÿv{ãþ’xhÿ‘Õÿ»FÿÛw6­-–”øSHË驎k8÷ù&-òPÿég`RFÉoQ\'ÿ¡·NÿÂê!ÿDãŒþØÎtFëÿhO¤æ]þևœš»òþ¼ƒÿ$m®Ÿpñn•$¥Ú¦².I]+ þø½íf›É]Ãÿñ‹ýÿobÿlA£þ›O¾ÿI®Áþö(0ÿkX þÊaUÿýÌÿqòBn ÂþкQ<¼h§ÿ|¦aþ҅Ž8ò‰þ)o‚o—:oՍÿ·¬ñÿ&Äÿ¹{ÿ. öõiw¡ÿÎ-ÿÊJÿS|sԍSÑþ‹èÿ¬6­þ2÷„ֽՐ¸ißþøÿ“ðÿ¼H36¼´þÜ´ÿS £½óÿ:ÑÂÿWI<j1õùÜ­§v Ãÿ~ínŸ%ÿ;R/´»V¼”Ðd%…ÿpÁ¼œÿTjÿ…áÊìoÿ(e¬¬1þ36Jÿû¹¸ÿ]›àÿ´ùà沒H96þ²>¸wÍH¹ïýÿ=ÚÄC8ÿê «.ÛäÐlêÿ?èÿ¥5Ç…äÿ4ÍkJîŒÿ–œÛþגּÿû½ßþ ŽÓÿÚŠñÄP$bþêÇ=íÜÿö9%ŽŽÿ>+î_þÙÿÕð\'Ü®ÿšÍ0þ\rÀÿô"6þŒ›ðµþ›Á<¦€ÿ$‘8ÿ–ðÛx3‘R™*Œì’k\\ø½\n?ˆòÓ\'Ê¡­ºÿÒÌïþ)Ñ¢ÿ¶þŸÿ¬t4ÃgÞþÍE;5)Ú0ÂPÒòҼϻ¡¡þ؈áqú¸?ßbþM¨¢;5¯É\nÿ‹à“ÁšÿÔ½ þÈ®ÿ2…q^³Z­¶‡^±q+Y×ÿˆüjÿ{†SþõBÿR1\'Üàa±M;Y=›Ë«Üÿ\\N‹‘!µÿ©7–³‹ìxþb{cÿ¨ÉÂþ.êÖ¿…1ÿc©w¾»#s-ÿùƒHp{ÿÖ1µþ¦é"\\ÅfþýäÍÿ;É*b.Û%#ÿ©Ã&^|Áœ+ß_H…þxοzÅïÿ±»Oÿþ.ú§¾TËq¦ÿù½þHÊÿÐGIÿÏH\nÒQLÿXÐÀÿ~ókÿîxÿÇyêÿ‰ ;ÿ$Ü{ÿ”³<þð Ba$&ÿs]ÿ`gçÿŞ;À¤ðÊÊ9ÿ®0YM›*L×ô—é0Qï4þã‚%ÿøt]|„v­þÀëSÿn¯çû¶ù]þT¸€Lµ>¯€ºd5ˆþmâÝé:cJ †\r 47ÿYŒ¯";T¥wÿàâêÿH¦ÿ{sÿÖöúGÙܹÔ#Lÿ&}¯½aÒrî,ÿ)¼©þ-ºšQ\\„ ÁyÐbÿ\rQ,ÿ˜RG:ÿÐr¿þ2&“šØÃe<ú×ÿé„ëÿg¯Ž\\nþîñ-ÿ™Ùïa¨/ÿùU¯>ÿ9þ6Þç~¦-uþ½`ÿäL2Èô^ƘxD"Eÿ A þeZ§ÅxÿD6¹ÿ)Ú¼q¨0Xi½R ÿ¹]¤äðíÿB¶5«Å\\ÿk éÇxÿN1\nÿmªiÿZÿôqÿJ: >ÜöÿyšÈþÒ²ÿ~9+úÿeo/Vñÿ=F–ÿ5IÿžÑVŠíJ¤_¼Ž<þ¢tøÿ»¯ —ÑoAþˆ\'ÿXl1ÿƒGÿÝ×þhi]ÿìþ‡ÓÿnÔIåéC§þÃÐÿ„Ýÿ3ÙZCë2ÿßҏ³5‚éjÆÙ­Üÿpåÿ¯š]þGËöÿ0B…ÿˆæÿÝqþëoÕªx_þûÝ-‚žþi^Ùÿò4´þÕD-ÿh&ôžL¡È`ÿÏ5\rÿ»C”ª6øw¢²ÿS **À’Ÿ£ÿ·èoMåÿG5L"öˆ/ÿÛ\'¶ÿ\\àÉŽÿE¶ñÿ£võ mjªµ÷ÿN/îÿTÒ°ÿÕk‹\'& H–H‚EÍM›þŽ…Go¬þâ*;ÿ³×!€ñêü\r¸OnIÿö½ªÏÚJšEÿŠö1ÿ› d}JiÿZU=ÿ#å±ÿ>}Áÿ™V¼IxÔÑ{öþ‡Ñ&ÿ—:,\\EÖÿ Xÿü™¦ÿýÏpÿ°{þ …ÿá¿>]F™µ*h¿àÿÈȌÿùê%•9Ã8Ðÿþ‚Fÿ ­ðÿÜÇndsÿ„åùäéßÿ%ØÑþ²±Ñÿ·-¥þàar‰a¨ÿáÞ¬¥\r1ÒëÌÿüþF —è¾4þSø]ÿ>×M¯¯³ÿ 2By0Ð?©ÑÿÒÈà»,I¢R °ÿLÁÿ;§+š¾¾¼èëËÿêmÿ6AŸ{„ÿ÷d½›ß˜Å!›;,ÿ–]ðWÿ_GϧUÿ¼˜tÿ\n‰Ã]6bað¨ÿ”¼†k—Lý«Z„À’6àB6þæºåÿ\'¶Ä”û‚ÿAƒlþ€ ©1§þÇþ”ÿûƒ»þÿUR>²:ÿþ„¤Õ\'†ü’þ%5Qÿ›†Rͧîÿ^-´ÿ„(¡þop6KÙ³æÝë^¿ÿó0ʑËÿ\'v*ÿuýþÞ+û26©êPDДËóþ‘‡þü¹bÿ&#HÿÓ$Ü(Y¨@ÅþÞïÿS×þ´Ÿi:sºtjÿå÷ÛÿvÁÊ®·¦¡HÉk“þíˆJéæjio¨@àåf—¯ÿÂîäÿþúÔ»íyCû`Å ·_ÌÍYŠ@Ý%ÿßÿ²0ÓÿñÈZÿ§Ñ`ÿ9‚Ý.rÈÿ=¸B7¶þn¶!«¾èÿr^Ý/çþÿpSv×ÿ­(þÀÁÿî’ÿ«Ávÿeê5þƒÔpYÀkеÙÿç•èŒì~ Çÿ Oµþ“¶Êÿm¶ÿ1ÔáJ£Ë¯é”p3ÁÁ ÿ‡ù–ã‚ÌÛòÍîÐuÿôpå"%P¼ÿ&-ÎþðZáÿ/ÿ*àLºó§ „ÿ3}‹‡ñÛ¬å…ÿöÖ2ç Ïÿ¿~S´£ªÿõ8²¤ÓÿÊb9vÿƒYþ!3ó•[ÿý4#©Cþ1Xÿ³$ÿ¥Œ·:½—XK©BBeÇÿØÇyÄÿOËþðâQÿ^\nÿSÁðÿÌÁƒÿ^VÚ(3ÁÑò±f¹÷žmt&‡[߯•ÜBÿV<è`%ÿáz¢×»¨ÿž.8«¢èðez 3 ÿ5îÿÙèþ}©”\rèf” %¥aäƒ)Þóÿþ<íjq;„½\\piÐÕ0T³ÿ»yçþØmÿ¢ÝkþIïÃÿú9ÿ•‡Yÿ¹s£ÿpú9»ÿ¡`¤/ó ûþCê¸ÿ)¡¯`ÿ ¬4þ°·ÿÆÁU|y‰ÿ—2rÿÜË<ÿÏï&kÿ7î^þF˜^ÕÜMxEÿU¤¾ÿËêQ&1%þ=|‰N1þ¨÷0_¤üi©‡ýä†@¦KQIÿÏÒ\nêj–ÿ^"ZÿþŸ9þ܅c‹“´þ¹)9ÿ½aLA»ßÿà¬%ÿ">_çðMj~þ@˜[b›âû5ÿêÓÿËÞÿ¤°Ýþç³zÍ$†ÿ}F—þaäü¬þ0ZÑÿ–àRT†ñÄ.gqêÿ.eyþ(|úÿ‡-òþ ù¨ÿŒlƒÿ£«2­ÇÿXގÿÈ_žŽÀ£ÿu‡o|ì AþD&Aÿã®þôõ&ð2Ðÿ¡?ú<Ñïz#!æþŸqjÿäÍ`‰Ò®þ´ÔÿYbš"X‹§¢pAnÅñ%©B8ƒÿ\nÉSþ…ý»ÿ±p-þÄûÄú—ÿîèÖÿ–ÑÍðvGLSìc[*úƒ`@ÿvÞ#qÖËÿzw¸ÿB$Ì@ù’Y‹†>‡hée¼T1ùÐÖKÿςMÿs¯ë«‰ÿ¯‘º7õ‡ÿšVµd:öÿmÇ<ÿR̆ÿ×1æŒåÀÿÞÁûÿQˆÿ³•¢ÿ\'ÿ_Kþ¿QÞñQZÿk1Éÿôӝތ•ÿAÛ8þ½öZÿ²;0Û4b"×»ÿ¯©\\O¡ÿìÈ“êåáŨë35ýx®Å¨ÿÊu«£ÎrUZÿ)\nÿÂcA7Øþ¢’t2ÎÔÿ@’ÿžžƒd¥‚ÿ¬ÿ}5 ÿÁ1 ÿµ®É‡Éÿd•ÛbO*cþ`0ÿÅùSþh•OÿënˆþR€,ÿA)$þXÓ\n»y»b†Ç«¼³þÒ îÿB{‚þ4ê=0qþVxÿw²õWÉòÑÊrU”¡gÃ01«ÿŠC‚¶Izþ”‚Óåš ›žTi=±Â ÿ¦YV6S»ù(uÿm×ÿ5’,?/³ÂØþTˆˆ±\rÿHóºÿu}ÿÓ:Óÿ]OßZXõÿ‹ÑoÿFÞ/\nöOÿÆÙ²ãá N~³ÿ>+~g”#¥þõð”=3ŽQІ‰sÿÓwìÿŸõøÿ†ˆÿæ‹: ¤þrUÿ1¦¶ÿFTU¶.5] ¦¡ÿ7¢²ÿ-¸¼’,þ©Z1x²ñ{ÿñǽB2ÿƏeþ½ó‡ÿþKaWvûší6œ«’ÏÿƒÄöÿˆ@q—è9ðÚs1=ÿ@Iü©ÿ(„\nZÉÁÿüyðºÎ)+Æa‘d·ÌØPþ¬–AùåÄþh{IÿMh`þ‚´h{9ÜÊåÿfùÓVèÿ¶NÑïá¤j\r ÿxIÿ†CéSþµ·ìp0@ƒÿñØóÿAÁâÎñdþd†¦ÿíÊÅ7\rQ |fÿ(ä±vµ砆ÿw»ÊŽ<ÿ€&½ÿ¦É–Ïx6¸¬ òÌþ…Bæ"&¸pP 3¥þ¿ó7:I’þ›§Íÿdh˜ÿÅþÏÿ­÷î\nÊï—ò^;\'ÿðfÿ\n\\šÿåTÛÿ¡PÐZÌðÛ®ÿžf‘5²Lÿ4l¨SÞkÓ$mv:8í ÇªÑ‰G/V ÆòÔ0ˆ\\¬ºæ—i`¿åŠP¿þð؂ÿb+þ¨Ä1ý[Iy=’\'?hÿ¸¥pþ~ëbPÕbÿ{ÿœXÒ¸bÿ¯{ÿfSåÜAt–úÿ\\ŽÜÿ"÷BÿÌá³þ—Q—G(ìÿŠ?>Oðÿ·¹µv2?ãÀ{c:2à›ÿáßþÜàMÿ,{€¯øÔȖ;·ÿ“a–̵ý%G‘UwšÈº€ùÿS|W¨3õ|—çÿÐðÅ|¾¹0:öéè}bÿ\rþÿõ±‚ÿlŽ#«}òþŒ "ÿ¥¡¢ÎÍe÷"d‘9\'F9vÌËÿò¢¥ôÆtâ€o™ÿŒ6¶ƒÿO@ þ^0qŠ2þÁÿ÷ÅC7hÍ_ÿ0%B7œ?@RJÿÈ5GþïC}àÞ߉]ÿàÊÿ ܄Æ&ëfV<+Qˆé$þÏò”¤¢?3.àÿr0Oÿ ¯âÞÁÿ/ èÿÿ]iþ*æŠRÐ+ô\'&ÿbÐÿ@•¶ÿúÑ»<þ1Úÿ©tÍÿwxœt“ÿ„5mÿ\r\nÊnS§Û‰ÿ‚ÿ2§ÿ<Ÿ/ÿ€þ^½¦DSßזZ¨AãS3ÿÍ«Bÿ6»<˜f-ÿwšáð÷ˆdŲÿ‹GßÿÌR)Î*ÿœÀÝÿØ{ôÿÚÚ¹ÿ»ºïÿü¬ ÿÃ4®µþ»dsÿÓN°ÿÁ“ÕhÿZÉ\nÿP{B!ºcþÎ\nåê5ҊÜþG7§HáVv¾¼þÁe«ù¬ÿ^ž·þ]lÿ°]LÿIcOÿJ@þö.Acñþö—fÿ,5Ðþ;fꚯ¤ÿXò o&ÿ¶¾ÿs°þ©<zíñZL?>JxÿzÃnw²Þò҂!.þœ()§’p1£oÿy°ëLÏÿÆ)ëÕU$Ö1\\mÿÈþ¨ìÑ\'|ìÕZ$¸ÿCUªÿ&#þƒ|Dÿï›#ÿ6ɤÄuÿ1Íà~qu¶ËŸß‡M°æ°ÿ¾å×ÿc%µÿ3Šÿ½Yÿ10¥þ˜-÷ªlÞPÊEgþ́ÿ´ü>þÒ[ÿ’nþÿÛ¢ßüÕ;!ÎôÓ0k Ðp;ÑmMØþ"¹ÿöc8ÿ³‹ÿ¹2ÿTYJúbÿá*ÈÿÀÙÍÿÒ§c„_+æ9þ Ëÿc¼?ÿwÁûþPi6èµ½·EpÿЫ¥ÿ/m´ÿ{S¥’¢4ÿš ÿ—ãZÿ’‰aþ=é)ÿ^*7ÿl¤ì˜Dþ\nŒƒÿ\njOþóž‰C²Bþ±{Æÿ>"ÅX*ÿ•_±ÿ˜Æÿ•þqÿáZ£ÿ}Ù÷à€BxþÀ ÿ2ÝÍ1ÔFéÿ¤Ñ Ý4Ûþ¬àôÿ^8Îò³ÿ[¤æ.Šÿ½æÜ9/=ÿo ±[˜æbaW~ÆY‘ÿ§OkùM éæÿ–Vþ< Á—%$þ¹–óÿäÔS¬—´É©›ô<êŽëCÚ<ÀqKtóÏÿA¬›QœÿPH!þçmÿŽkþ}„ÿ°;ÿ–É:ΩÉÐyâ(¬ÿ–=^ÿ89œÿ<‘ÿ-l•ÿÿÑUþÀ Òcb]þ˜—á¹Üë,ÿ ¬þGÿ\r@]þ8Ʊ>ø¶ñ¦e”ÿNQ…ÿÞ×¼©ÿèa1p<ÿÙåûwlŠ\'{þƒ1ë„T‘‚æ”ÿJ»õ6ÿ¹ÛñÂäÿñÊfiqʛëO ²ÿœïȔ=s÷Òÿ1݇:½#. QAÿ4ž¹ÿ}t.ÿJŒ\rÿÒ\\¬þ“GÙàýþsl´ÿ‘:0þÛ±ÿœÿ<š“òý†W5Kå0ÃÞÿ¯2ÿœÒxÿÐ#Þÿø³\neÿÂøÿžÌeÿhþÅÿO>²¬e`’ûÿA\nœ‰¥ÿtçò×#ÿ+¡O;•öûB°È!ÿPnŽÿáä8Bÿ{/‘þ„¤C®¬ýrWaWúÜT`[Èÿ%};Av¡4ñÿí¬ÿ°¿ÿÿA‚þß¾æeýçÿ’#múM1{Z›V ÿÚÕAo]<]©ÿ¶ºþý‰öÿÕ0þLîÿø\\Fÿcà‹¸ ÿ¤Ð̓ÆWÖǂÖ_ݕÞ&«þÅnÕ+sŒþ×±v`4Buží@¶ÿ.?®ÿž_¾ÿáͱÿ+Žÿ¬cÔÿô»“3™ÿätþeÏö–ÿ†ç}†âMAbì‚!ÿn>Elÿq‘Sþ¡çÿƒµ<Ùѱÿå”Ôþƒ¸u±»ÿ°fP2T—ÿ}6ÿ…ÿ³‹àè"uªÿ§ü«ÿIÎþú#HOìÜåÿ)Ê­ÿcLîÿÆàÿlÆÃÿ$`ìž;ÿjdWnâãêޚ]wÿJp¤ÿC[ÿ‘!ÿf։ÿ¯ægþ£ö¦]÷tþ§àÿÜ9«ÎT{äÿxww “´/áÿhȹþ¥rMNÔ-š±ÿÄyþR¶Z¾ “Å_ï˜ÿ ëGV’wÿ¬†Ö<ƒÄ¡á‚xþ_È3içÒÿ: ”ÿ+¨Ýÿ|íŽÆÓ2þ.õg¤øT˜FÐÿ´u±FO¹óJ •œÏÅÄ¡õ5ï]öþ‹ð1ÿÄX$ÿ¢&{€È®Lgÿ­©"þØ«ÿr3ˆäÂn–8þjöŸ¸Oÿ–Mðÿ›P¢5©ÿ—VD^\\nþbu•ÿùMæÿý\nŒÖ|\\þ#vëY095¦¸=ÿ³ÿÂÖø=þ;nöyQþ¦äj@ÿEè†ÿòÜ5þ.ÜUq•÷ÿa³gÿ¾ ‡Ñ¶_4ªÎÿzÈÌÿ¨d’<•þF<(z4±ÿöÓeÿ®í3x­~ïœÿ½ËĀXÿé…âÿ}­ÿÉl2{d;ÿþ£ݔµÿֈ9þÞ´‰ÿÏX6ÿ!ûÿCÖ4ÒÐdQª^‘(5àoçþ#ôÿâÇÃþîæÙÙ¤þ©ÝÚ.¢ÇÏ£ÿls¢`»ÿvçãê³ÿ"½Ôþô»ù¾\rP‚Y߅­ ÞÆÿBJ§Ø]ÿ›¨ÆB‘Df.¬ZšØ€Kÿ (3ž|ð1ìʰÿ—|Àÿ&Á¾_¶=£“|ÿÿ¥3ÿ(þ×`NV‘Úþ$ÊÿV o)Èÿíla9>,u¸-ñt˜Üÿ¥¼úƒ<,}ÿAÜûÿK2¸5Z€ÿçPÂÿˆ»ÿ-:¡ÿG“"®ù þ#ïD±ÿsn:î¾±Wõ¦ÿ¾1÷ÿ’S¸ÿ­\'ÿ’×hŽßx•È›ÿÔϑµÙ­ Wÿÿ#µwß¡Èß^ÿFºÿÀCUÿ2©˜{ÿ8ó³þDˆ\'Œ¼þýÐÿÈs‡+¬åÿœh»—û§4‡—™H“Åkþ”žÿîÎ~™‰ÿX˜ÅþD§üŸ¥ÿïN6ÿ?7ÿ&Þ^í· ÿÎÌÒ\'öþJç‡l³suvt„üÿ‘¡iCR%âÿîâäÿÌցþ¢{dÿ¹yê-lçB8ÿ„ˆ€¬àBþ¯¼æßâþòÛE¸wR¢8r{¢gUÿ1ïcþœ‡×oÿ§þ\'Ä֐&Où¨}›aœÿ4Ûÿ–,•¥ÿ(·ÄMéÿvÒÿª‡æÿÖwÆéð#ý4ÿuf0ÿ̚ÿ³ˆ±ÿ•‚YÿüŸF<k´¾<ÿ8¶;ÿnG6ÿƁÿ•àWÿߘÿжÿúœÍì-ÐÿO”òeFÑgN®e¬ÿ˜ˆí¿ÂˆqP}˜›–5ÿÄtõïrIþRÿ|}êÿ(4¿*Ҟÿ›„¥²*@\\(ÿ$UMÿ²äv‰B`þsâBnðEþ—oP§®ìÿãlkÿ¼òAÿ·Qÿ9εÿ/"µÿÕðžGK_œ(ÿfÒQ«Çäÿš")ã¯KïÊå_LÀ1u{Wãá‚}>?ÿÆ«þ$\rþ‘ºÎ”ÿôÿ#¦–Û\\äÔ\\Æ<þ>…ÈÿÉ);}îmÿ´£îŒzR Xÿŝ/ÿ™^9X¶T¡U²’|¦¦ÿÐߜ¶ò›y¹Sœ®þšvÿºSèß:yÿX#}ÿª•þ¤ ‚ÿ›Ä¡`ˆ#¢%û.òÿÙ¼9®âÎé9»ˆþ{½ ÿÉuÿº$ÌçØPNi†ÿ”ËDQ}þø¥Èÿ֐‡—7¦ÿ&ë[.šßþ–ÿ#™´ÿ}°+bÿØzæÿé  9¹ þðqÿ þ[lmÆË“(†äÿ|º(ÿrb„þ¦„cE, òîÿ¸5;„fÿ4 óþ“ßÈÿ{S³þ‡Éÿ%8—<ãÿZIœˬ»P—/ÿ^‰çÿ$¿;ÿáѵÿJ×Õþv³ÿ™6Á2çhHŒãšÿ¶âþ`á\\ÿsªþúNøK­ÿ5Yÿ´vH­@ή…ß¹>…ÿÖ bÅЫ§ôÿçµ–Ú¹÷©a¥‹÷ÿ/x•gø3²¦{„ ¡ÿ=®+ÃE/¿",N9ê4ÿ(ÿö^’Sä€?ƒ³»ÿMœ›ÿwV¤ªÐ’ÿЅšÿ”›:ÿ¢xèþü՛ñ\r*^2ƒ³ªpŒS—ÿ7wTŒ#ïÿ™-Cì¯\'6—gÿž*AÿÄï‡þV5˕a/þØ#ÿFFg$Zÿ(­¸0\r£ÛÙÿQÿݪlþéÐ]dÉùþV$#ÿњãÉûÿ½§þd9\r€)ÅdK–Ìëÿ‘®;xø•ÿU7árÒ5þÇÌw÷J?ûCh—‡‚POY7ÿuæÿ`Õ‘Eñx•ó_ÿr*ƒHš5ÿI>mÄf˜) Ìÿz& ú\n‘Ï}”öôÞÿ) UpÕ~¢ùVGÆÿQ b\'ÿÌG-Ko‰ê;ç 0_ÿÌrĵÿ3ñ§þ]mŽh-ë µÿ4p¤LþÊÿ®¢=ë“ÿ+@¹þé}ÙóX§þJ1œÌB|Ö{&Ýv’pìrb±—YÇWÅp¹•¡,`¥ø³ÿ¼ÛØþ(>\róŽåãÎÿ¬Ê#ÿu°áÿRn&*õÿSa1«\nòwxè=Ôð“ÿs8ÿ‘ïþÊûÿùõÿcu︳ÿöí3ÿ%ï‰ÿ¦p¦ÿQ¼!ÿ¹úŽÿ6»­ÐpÉö+äh¸XÿÔ4Äÿ3ulÿþu›.[ÿWÿWãÌSSŸLãŸÕ—lu³þ‰ÑR&Ÿ\ns…Éß¶œnÄ]ÿ9<é§iÿšÅ¤`"ºÿ“…%Üc¾§Tÿ‘«ÂÅûþ_N…ÿüøóÿá]ƒÿ»†ÄÿؙªvžþŒvVž-Ó)ÿ“dþqtLÿÓlg0ÁfE3_ÿk€‰«éZ|j¡¶¯Lìȍ¬ÿ£:hé´4ÿðýÿ¢qþÿ&ïŠþ4.¦ñe!þƒºœoÐ>ÿ|^ ÿ¬þp®8ÿ¼cÿCŠû}:€œ˜®ÿ² ÷ÿüTžRÅþ¬ÈSÿ%\'.jϧ½"ƒ²ÎÕ¡âÒH3iÿa-»ÿN¸ßÿ°ûO Vÿt%²RMÕRTÿâeÔ¯XÇÿõ^÷¬vmÿ¦¹¾ƒµxWþ]ÿ†ðIÿ õÿ‹¢gÿ³bþÙÌp“ßxÿ5\n󦌖}PÈÿmÛÿ[Úÿüü/þmœtÿs1ÌWÓÿ”ÊÙÿUùÿõ†LY©ÿò-æ;b¬ÿrI„þN›1ÿž~T1¯+ÿ¶Tÿg#hÁmÿCݚɬþ¢X¥ÿ}›åÿšÜgï\\ÜmÿÊÆ^Ž$6,ëâžÿªûÖÿ¹M aJòÛ£•ÿð#vÿßrXþÀÇj%ÿÉ¡vÿaYcà:gÿeǓþÞÿ\n—\nO‹²ÿxòÊÛÕ>}#ÿlÿæ!SÿQ-Øà>ÖÙ}b™™ÿ³°jþƒ]Šÿm>$ÿ²y ÿxüFÜø%ÌXg€Üûÿìãj1Æÿ<8kcrîÜÌ^I»Yš"NÙ¥ÿÃùÿ æýÿ͇õüÿT͆p%ž ç[íÿ¿ªÌÿ˜ÞmÀ1Á¦’ÿèµÿiŽ4ÿgýÈ¥ÃÙÿ4½ÿ{› þW‚6ÿNx=ÿ8))}ÿW¨õÖ¥FÔ©ÿÛÓÂþH]¤ÿÅ!gÿ+Žƒá¬ôiDDáˆT\rÿ‚9(þ‹M8T–56_\r±þ_sºuvÿô¦ñÿ º‡²jËÿaÚ]+ý-¤˜‹vï`þë™Óÿ¨nÿ2ï°r)èÁú5þ oþˆz)ÿalCטÿŒÑÔ*½£Ê*2ÿjj½ÿ¾DÙÿé:uåÜóÅ%x6þœ†ÿ$=«þ¥ˆdÿÔèZ®\nØÆAÿ @tqsÿøgç}ÿ Å¸#ßIùÿ{.þ‡8%ÿ­\råw¡"ÿõ=IÍ}p‰h†Ùöÿ펏AŸfÿl¤¾Ûu­ÿ"%xþÈEP|ÚþJ ÿºšÇÿGÇühQŸÈ\'Ó=Àî[”Ù ;[Õÿ Q·ÿæzÿrˑw´BÿHŠ´à•jwRhÿЌ+b ¶ÿÍe†ÿe&_ŦÿËñ“>Бÿ…öû©\r÷¸Žþ$ÈÿXÍß[4ÿºäÒ÷êøÿæEþ°º‡ÿîÍ4‹O+°Ùþ óCòoé,# ÿãrQG ÿ&i¿u2ÿQO?DAÿ$nÿMñÿâ-ûŽÎx{Ñþîÿ€~ÿ[Þ×ÿ¢¿VðI‡¹Qþ,ñ£ÔÛÒÿp¢›Ïev¨H8ÿÄ4H¬òÿ~ÿ’`;ÿ¢y˜þŒ_ÃþÈþR–¢w+‘þ̬Nÿ¦àŸhíÿõ~Ðÿâ;ÕuÙŘHíÜþZçÿ¼Ô@¸L@Ϭ¯Ðþ¯J%ŠÓþ”}Â\nYQ¨Ëeÿ+ÕÑëõ6#âÿ ~Fâ}^þœuÿ9øpæ0@ÿ¤\\¦àÖæÿ$x7+ÿûõjb¥Jkjþ56ÿZ²–x{ÿôYrú=ÿþ™RM9îZ_ßæì4/þg”¤ÿyÏ$¹ÿKJ» e.0ÿïÒÿMìÿoMÌÿ=HaÿÇÙûÿ*×̅‘Éÿ9æ’ëdƒI#þlÆÿ¶OÒÿRgˆöl°"<ÿJrþ¨ªNÿïÿ•)¨:yO³†ÿçy‡ÿ®Ñbÿóz¾«¦ÍÔt0lBÿ¢Þ¶wÕ\'ùÿþßäÿ·¥Æ…¾0|Ðmÿw¯Uÿ Ñy0«½ÿÃG†ˆÛ3ÿ¶[þ1ŸH#võÿpºãÿ;‰‰,£rg<þՖ¢\nqÿÂhH܃tÿ²O\\ËúÕþ]Á½ÿ‚ÿ"þÔ¼—ˆÿeSÿÔΦåîIÿ—Jÿ¨Wכ¼…ÿ¦IðO…ÿ²ÓQÿËH£þÁ¨¥¤ÇþÿÌAH[¦JfÿÈ*ÿÂqãÿBÐåØdÿï\né>ÿ{\n²$®ÿwÛÇ-£¾¨*¦9Æÿ~¥çûldÿ=åyÿ:vŠLÏ\r"pþY¨%Ðiÿ#É×ÿ(jeþïr(gâþönÿ?§:„ðŽžXÿIžÿ^Y’æ6’-­O©sº÷T@ƒCàýÿϽ@šQ-¸6ÿWÔàÿ`Iÿ!ë4BPÿû®›ÿ³%ê¤]þ]¯ýÆEWÿàj.cÒ>¼rÿ,ꩯ÷ÿm‰ÿå¶\'À¥^þõeÙ¿X`Ä^cÿjî þ5~ó^eÿ.“É||ÿ Ú\r¦0ûíÿ›ú|ÿj”’ÿ¶\rÊ=§Ù˜þ܂-ÿÈæÿ7AWÿ]¿aþrû i\\ύÏ\rþ20ÿº”tÿÓ+á%"¢þ¤Ò*ÿD`ÿ¶Öÿõu‰ÿBÃ2K SþPŒ¤ ¥$änãñZ4Ôß ÿ‹ó9 qKö·¿ÿÕ¿EÿæŽÃÄÿŠ«/ÿ@?j©ÖÿÏ®8XI…ÿ¶…Œ±ÿ“¸5ÿ\nã¡ÿxØôÿIMéî‹;AéFûØ)¸™ÿ Ëp’“ýWem,R…ÿô–5ÿ^˜èÿ;]\'ÿX“ÜÿNQ\r /üÿ rÿ]k\'ÿvÓ¹wÑÿãÛþXiìÿ¢nÿ$¦nÿ[ìÝÿBêtoôþ\né ·þ¿òڜ5þ)­o¥övs[ÿ€T<§ËW\róä±q’ÿªæþü™ÿ‘á+Fçÿzi~þVö”ÿn%šþÑ[D‘>ä¥ÿ7Ýùþ²Ò[S’âþE’º]Òhþ­çº&½zŒÿû\rpÿin]ûHªÀßÿÊá]䙓Çþmªøeöÿ²| ÿ²þfþ7A}Ö´·`“-uþ„¿ù°Ëþˆ·6ÿ’ê±’eVÿ,{!јÀZ)þS}ÿÕ¬Rש\r" ÑdÿTùÅìÿÙºæ1 °ÿovaÿíhëO;\\þEù ÿ#¬JvDÞ|¥ÿ´B#ÿV®ö+Joÿ~Vÿäê[òÕþE,ëÿÜ´#øÿf/\\ÿðÍfÿq櫹ÉÿÂöFÿz»†FÇÿ•–ÿu?gAh{ÿÔ6XS†óÿˆ5g©´±1o6§Ã=×ÿl<*F¹¢ÿ•(ÿö&þ¾w&ÿ=w`¡Ûÿ*Ëݱò¤ÿõŸ\ntÄ]Íþ€³}íöÿ•¢ÙÿW%þŒîÀ Áaâ&\nˆ?ÿåHÒþ&†\\ÿNÚÐh$Tÿ Áÿò¯=ÿ¿©.³““ÿq¾‹þ}¬Küþ×$ÁÿE•ÿnvË]ùЉ@þ&F™tÞ¡J{ÁcOÿv;^ÿ= +’±.“¿ÿ& 3<:bÿoÂMš[ôŒ(­\nûËÑ2þl‚Nä´Z®ú®<)«tcRÿvÁ‹ÿ»­ÆþÚo8¹{Øùž44´]ÿÉ [ÿ8-¦þ„›Ëÿ:èn4ÓYÿý¢ W·‘ˆ,^zõU¼«“\\Æh_®Ýæ4÷÷ëÿ‰®5ÿ#ÌÿGãÖèR 0ãÿªI¸ÿÆûüþ,p"ƒeƒÿH¨»„‡}ÿŠhaÿÿóhTÿ‡Øâÿ‹í¼‰–P8ŒÿV©§ÿÂNÿÜ´ÿ\rÁu‰Ôÿà—1ô¯Ác¯ÿcšÿA>ÿœÒ7ÿòôÿú•žXÙÿÏ†þûè.œûÿ«8¸ÿï3ꎊƒÿþó\nÉÂ?aKÒï¢ÀÈuÖóGÞþ6(èÿL·oþWÿÖOˆÿØÄԄŒþƒý|lÿ×KLÞ7þé¶?D«¿þ4oÞÿ\niMÿPªëXÿ-çy”à=öTý.ÛÿïL!1”þæ%EC†þŽ›^ÓþÕ*ÿä÷þü°\rÿ\'þñôÿÿª-\nþýÞùÞr„ÿ/ÿ´£³T^—ÿYÑRþå4©ÿÕìÖ8äÿ‡w—ÿpÉÁS 5þ—B¢éa[ƒNµx5ÿu_?ÿíu¹¿~ˆÿwé·9a/É»ÿ§¥w-d~bþ‘–_ÿx6˜Ñbhoþ¸”ùëØ.øÊ”ÿ9_òá£é÷èÿG«ÿgô1ÿTg]ÿDyôRà\r)O+ÿùΧÿ×4þÀ ÿ÷o<eJ&ÿ[Tþ\rÿÆç×þôšÈ߉íӄ_@Îÿ>÷ÿéƒy]MÍÌ4þQ½ˆ´ÛŠ^Ì+Œþ¼¯Ûobÿ—?¢ÿÓ2Gþ’5’-Sþ²Rîÿ…TÿâÆ]ÿÉaÿxv#ÿr2çÿ¢åœÿÓ r\'sÿÎԆÅÙ ÿt^þÇ×ÛÿKßùýtµÿè×hÿä‚öÿ¹uVï=íW…ÿ}’‰þ̨ß.¨õšiÜÔ¡ÿkEÿ‰ÚµÿñTÆÿ‚zÓÿ™ÿ¾±v`Y²ÿ0þz`iÿu6èÿ"~iÿÌC¦è4Šÿӓ 6,×þ3ì-¾Dj“á]-þìÿ=¡ÜsÀì‘þo¨©à:?ÿ¤¼RêKàž†ÑDnÙ¦ÙFᦻÁÿXÿ\n͌uÀœ8&|l«×7ÿ_ýԛ‡¨ÿö²™þšDJè=`þi„;!Lǽ°‚ÿ hþKÆfÿéplÜÿræFŒÂ…ÿ9ž¤þ’Pÿ©ÄaU·‚FžÞ;íêÿ`ÿè¯aÿ yøþX#ÂÛ´üþJãÃãI¸n¡ÿ1餀5/RyÿÁ¾:0®uÿ„ (\n†3ÿð °ÿn9’uïevÿ6TL͸ÿ/HÿNpUÿÁ2B]4ÿi† mHÿ:œû#Ì, uþ2kÂD¥ÿon¢žS(þLÖê:ØÍÿ«`“ÿ(ãr°ãñFù·ˆT‹ÿ÷ÿ-@8ÿ¡ô"98iÊS€“Ðg\nÿJŠAÿaPdÿÖ®!ÿ2†Jÿn—‚þoT¬TÇKþø;pÿز ·_îþªÍÜÃå‡bLíÿâ[RÛ\'ÿá¾ÇÙÈyÿQ³ÿŒAβÏWþúü.ÿhYný½žÿÖžÿ õ6ÿ5·\\ÈÂÿ’!qÑÿëj+ÿ§4èåÝ3úÝA“WÿO{ÄAÄßÿL,UñDÊ·ùÿAÔÔÿ !šG;P¯Â;ÿH d ôæÐ8;KþPÂÂÈþ Ÿs„÷o]9ÿ:í †Þ‡ÿz£l{+¾ÿû½ÎþP¶HÿÐöà< ¡Ï&m[ØÓÿˆNnb£hÿPyÿ­²·hÿ3ÿÒÿ>ìþ7àÿr\'ôÀ¼úÿäL5bTQÿ­Ë=þ“27ÿÌë¿4ÅôX+Óþ¿w¼çšBQ¡\\Á úãx{7â¸H…¨\nþ‡œÿ)gÿ0Ê:º•Qÿ¼†ïëµ½þً¼ÿJ0R.Úå½ýû2å ÿӍ¿€ôÿ©çzþV/½ÿ„·ÿ%²–ÿ3‰ýÈNi2‚<„£[þç»ÀOïf¤ÿÀRµgÿð ê{¤ÿ…éÿÊòò<ºõñÇÿàtžþ¿}[ÿàVÏy%çÿã Æÿ™ïÿyèÙþKpR_ 9þ3Öiÿ”ÜaÇb$œÑ þ\nÔ4Ù´7þÔªèÿØTÿú‡cþÎ)•$F6ÄÉÿWtþ뫖£êʇ´Ð_þ{œ]·>K‰ë¶Ìáÿÿ֋Òÿsÿ o4œýûÿ%¥þ ‚Ój5þ*cšÙ=þØ \\ÿÈÅpþ“&Ç$üxþk©M{ŸÿÏKf£¯Ä,ðxº°þ\rbLÿí|ñÿ蒼ÿÈ`àÌ)ÐÈ\rá`ÿ¯œÄ÷Ð~>¸ôþ«QUsž6@-ÿŠr‡GÍã/“ÚçBýÑô­ÿvþ–Ðÿ¹2ÿVpÏÿKq×?’+ÿáþã>ÿÿÖþ-ÍÿWŗþÒR×ÿõø÷ÿ€øFá÷WZxFÕõ\\\r…â/µ\\£iÿ…þè²=ÿæ•ÿ1žäd=þtóûÿMK\\QۓÿL£þþÕöè%˜þa,dÉ%2Ôô9®«·ÿùJp¦œÞÝaÿó]IþûedÿØÙ]ÿþŠ»ÿ޾4ÿ;˱ÿÈ^4sržÿ¥˜h~câÿvôkÈÁZåyXœ ]þ}ñÓÿíÿ¥šÿ¸àÿú˜ÿqM÷«ÿí±Ìÿ4‰‘ÿ¶ràê•\nogɁîŽN4(ÿnÕ¥þ<Ïý>×E`aÿ1-Êxyÿë‹0Æ-"ÿ¶2ƒÒ[ÿ.6€¯{iÿƍNþCôïÿõ6gþN&òÿ\\ùþû®Wÿ‹?lÿ"f"˜Båvþ2c©•v˜²yŸZeæÿwD$ è·7ÿ`ÿ¡)Áÿ?‹Þ³óÿdÿR5‡‰9•cðªÿæäþ1´Rÿ=R+nõÙÇ}=.ý4ÅÛӟÁ7yiþ·©wªÿ˲‹ÿ‡(¶ÿ¬\rÊÿA²”Ï+z5J¡0ãրþV óÿdVõD†ÿ=+˜T^ÿ¾<úþïvèÿֈ%qLkÿ]hdÎÿn–šäg¹Ú12þ‡M‹ÿ¹N¡”ÿaéÿϔ•ÿ ¨[€«ÿþ o÷\'»–ÿŠè•u>Dÿ?ؼÿëê þ9 ÿ ñ©<¿ ƒÿíŸ{ÿ^Å^þtþÿ\\³aþya\\ÿªp•øøãP`mKÀJ Zâÿ¡jDÐrÿr*ÿþJJÿ÷³–þyŒ<“FÈÿÖ(¡ÿ¡¼ÉÿA‡ÿòsü>/Ê´•ÿþ‚7í¥ºÿ\n©ÂœmÚÿpŒ{ÿh€ßþ±Žlÿy%Ûÿ€Mÿol[ÀK®õÿì>ÿ+@™ã­þíz„YºÿŽR€þüT®Z³±óÖWÿg<¢ÿЂÿ ‚‹ÎÛÿ^ٝÿïææÿtsŸþ¤k_3ÚØ}ÆÿŒÊ€þ _Dÿ7 ]þ®™ÿ̬`E nÕ&1þPÕv}rFFCÿŽIÿƒz¹ÿó2þ‚í(ҟŒŗAÿT™BÃ~Zîìv»fÿ…ÿ»Eæ8Å\\ÕE^ÿPŠåÎæÞoæ[éwÿ Yb”J…ÿ3ö´ÿä±p:½lÿÂËíþÑÓ\n#Vâ£‹þ8Kÿ>Ztµ<©Š¢ÔþQ§ÍZpÿ!pãS—u±àIÿ®ÙÿæÌOÿMèÿrNêà9~þ 1ò“¥h¶Œÿ§„ {DáW\'ûlÆÁy‡Ïÿ¬F2Dtÿe¯(ÿøié¦ËnÅÚ×þþ¨âý` g)·Ëþd÷JÿÕ~„Ò“,Çê”/µ›[ž6i¯ÿN‘þfš_€Ïþ4|ìÿ‚TGÝóӘªÏÞjÇ·T^þ\\È8ÿжsŽ`’…ˆäa–7ûBŒfÊg—øÿ3¸ÏÊÆY7Åáþ©_ùÿBADÿ¼ê~¦ßdpïôÂ:\'¶ô,þ¯D³ÿ˜v𰢂ÙrÌþ­~Nÿ!Þÿ$[ÿó ë׫—×õÿ¨/¤þñ’ÏE´Dóq5Hþû-n¨DDOÿnF_þ®[ÿ!Î_ÿ‰)ÿ»™þ#ÿpÿ ‘¹þ2% p1f¾ÿêó©ÿaæGÿf=LÔìÿ¤aÆ;’£Ä8=µbÁû“åÿb½ÿ.6ÎÿêRö·g&m>Ì\nðà’uÿŽšxEÔ#ÐcvyÿÿHÂuÅÿ}šO™Ö^Åÿ¹7“ÿ>þNþR™nf?ÿlR¡ÿi»ÔPŠ\'<ÿ]ÿH ºÒû¾§ÿä,þ€CèÖùkþˆ‘Vÿ„.°½»ãÿÐŒÙÓt2Qºþ‹ú@Ƈ›d Îþ»¢Óÿ¼?þÐ1UT¿ñÀòÿ™~‘ꢢÿæaØ@‡~¾”ß4+ÿ\'½@ˆî¯Ä¹bâÕÿŸôâ¯< éŽ´óÏÿE˜Ye¤þ‹¿Ñ[y “\'º{ÿ?sæÿ]§ÆÿÕÜÿ³œÿBzÖ Ùÿ->ÿjO’þ3‰cÿWdçÿ¯‘èÿe¸ÿ® }R%¡$rÿ0ގÿõºš®Ýþ?r›ÿ‡7 P‡~ú³ìÚ-‘“Iù½„½ÀÿߎÆÿHÿú5íþ ÓqþÕk8ÿ®“’ÿ`~0Ám%¢^ǝùþ€»ÿÍ1²þ]¤*ÿ+wëX·íÿÚÒÿkþ*æ\ncÿ¢âÛí[²ËÐ2_þÎÐ_ÿ÷¿YþnêOÿ¥=ózpÿöö¹þg{écæÛ[üÿÇÞÿ³õéÿÓñêoúÀÿUTˆe:2ÿƒ­œþw-3ÿvéþòZÖ^ŸÛêÿbL\\þP6æäçþ5ßÿq8v„ÿ«Òì8ñžÿºsÿå®0,rr¦ÿIâÿÍYô‰ãKø­8Jxöþw ÿQxÆÿˆzbÿ’ñÝmÂNÿßñFÖÈ©ÿa¾/ÿ/g®ÿc\\Hþvé´ÿÁ#éþå ÿÞüÆÌ+GÿÇT¬†f¾oîaþæ(æãÍ@þÈ á¦ÞqE3ÿŸ§¸JàtþžÐéÁt~ÿÔ …ÿ:ŒÌ$3ÿè+ëFµÿ@8’þ©Tÿâ\rÿÈ2°ÿ4Õõþ¨Ña¿G7"Nœè:¹J½ºŽ•þ@Eÿ¡Ë“ÿ°—¿ˆçËþ£¶‰¡~ûþé BDÏB%]r`þ\\÷ÿ,«EÊw ÿ¼v2ÿSˆÿGRFã ëyµ)šG†åþÊÿ$)˜š?Iÿ"¶|yݖÿÌÕ)¬WZ’ÿm‚GkÈÿóf½Ñþ.XuÎã¿nýÿm€þ†U3ÿ‰±pØ"ÿƒÐÿy•ªr¦Pÿqðzè³úDn´þÒªwßl¤ÿÏOéÿåâþÑbQÿODƒ¹dª¢ÿ¢kÿ9 dȵÿA¦¥†Ìh§¨¤O’‡;F2€ÿfw\rþã‡¢Ž³ÿ dÞàÛž]Ãÿꍉ}ÿîÎ/ÿabÿtn ÿ`sM[ãèÿøþOÿ\\åþXƋÎKúMÎÿô{ŠEÜ —ƒ§ÿíD§þǽ–£«Šÿ3¼ÿ_‰þ”â³µkÐÿ†Rÿ—e-ÿÊáàH“0Š—ÿÃ@Îþíڞj‰þý½éÿgÿÂaÿ²-©þÆá›\'0uÿ‡jsa&µ–/AÿS‚åþö&\\ïšþ[c¡o!ÿîÙòÿƒ¹ÃÿÕ¿žÿ)–Ú„©ƒYTü«F€ÿ£øËþ2´ÿ|LUûoPcBïÿší¶ÿÝ~…þJÌcÿA“wÿc8§ÿOø•ÿt›äÿí+þE‰ ÿúñ[zÿÍùóÔ<ÿ0¶°0¿ÿËy˜þ-JÕÿ>Zþõ£æÿ¹jtÿS#Ÿ !ÿP">W®ÿ­eUÊ$Qþ EÌÿ@á»:Î^V/åVõ?‘¾%\'mû‰“ê¢y‘ÿtÎÿÅè¹ÿ·¾ŒÿI þÿ‹òÿªZïÿaB»ÿõµ‡þވ4õ3þË/N˜eØI}þ`!ëÒIÿ+ÑXmzhäþªòËò̇ÿÊéÿAŸGdŒ_N–\rûkv¶:}ÿ&lÿ½Ñÿ›}q£[ÿyO¾ÿ†ïlÿL/ø£äïo\nX•Kÿ×ë履ÿ/—lÿkѼéçcþʔÿ®#ŠÿnDÿEµkfRfí\\$íÿÝ¢S7Êÿ‡ê‡ÿúÞA^¨þõøÒÿ§lÉþÿ¡oÍþˆ\rtd°„ÿ+×~ÿ±…‚ÿžO”Cà% Îÿ>"níh¯ÿP„oÿŽ®HTå´þi³Œ@øÿéŠõC{þÚyÔÿ?_ÚՅ‰ÿ¶Rÿ0 ôrѯLÿµ–ÿºåÿ¤o罋wʾÿÚj@ÿDë?þ`¬ÿ»/ ×ûÿQTYD:€^q\\ÐÿaSþ ¼ï ¤<͘À£bÿ¸<Ù¶‹m;xÿÀû©Òðÿ%¬\\þ”Óõÿ³A4ý\rs¹®Îr¼•ÿíZ­+ÇÀÿXlq4#LB”ÿÝÿ—ñrÿ¾Ñèb2Ǘ–ÕÿJ$5(‡Aÿ¬E®íUc_)8\' ±ÿÈjÚþ¹DTÿ[º=þCÿ\rô¦ÿcrÆÇn£ÿÁº|ïönDë.Ôdÿµì^þ¤LpÿxfOÊÀåȰ×)@ôÿθN§-? #ÿ; ŽÿÌ ÿÛ^åzp½imÿ@ÐJÿû7âÆ,Lї˜MÿÒ.É«Eÿ,Óç¾%àÿõÄ>ÿ©µÞÿ"ÓwñÅÿå#˜E(ÿ²â¡”³ÁÛÂþ(Î3ÿç\\úC™ª”ñªERÿyçÿ\\r¸>æáÉWÿ’`¢ÿµòÜ­»Ýâ>ªÿ8~Ùu\rãÿ³,›ÿÝSëÑÐ*¥ûQ…|õÉþaÓÿSÖ¦š$ ÿø/Zیÿ¡Ù&þԓ?ÿBT”Ïæ†YNzÿà›ÿRˆJ²œÐÿº1ÿÞÒ喾ÿU¢4ÿ)TÿI{Tþ]–w ×ÿÌÿŽñ4ÿä4}LÏ×§úþ¯¤æ7Ïim»õÿ¡,Ü)e€ÿ§^]ÖkÿvHþP=êÿy¯}‹©ûa\'“þúÄ1ÿ¥³nþßF»ÿŽ}š³Šÿv°*\n®™œ\\f¨\r¡ÿ úÅ´ÿË£,W $¡™ÿ{üãPþÄáºþ{¬U)ÿâo·Õç—;ÿB“!ÿöÿэtÿhpX¡¬S׿þ/o—-&4„-̊€mþéu†ÿó¾­þñìðRìþ(ß¡ÿn¶áÿ{®ï‡ò‘3њ–sþÙ¤üÿ7œET^ÿÿèI-Ôÿ`Å;þ`û!&ÇI@¬÷ÿut8ÿä>Šgöå¤ÿôvÉþV Ÿÿm"‰UÓº\nÁÁþz±zîfÿ¢Ú«lÙ¡žª"°/›µä ÿœK]Îbÿ:š# ó¸þCuBÿæå{É*n†ä²þºlvÿ:šÿR©>ÿrsïÄ2ÿ­0Áÿ“Tÿ–†“þ_èImã4þ¿‰\n(ÌþL4aÿ¤ë~þ|¼J¶y#ÿñþUÚÖÿT–þQuÿ Ÿ˜þBÝÿã\n<‡fн–u³\\„ˆÿxǁOþ¶ AÚ£©ö“Æÿk&N¯ÍÿÖúþ/Xÿ¤/Ìÿ+7ÿƒ†ÏþtdÖ`ŒKjܐà ¬Qÿdz4ÿ%T˪p® [Eôuƒ\\!˜¯ÿŒ™kÿû‡+þWŠÿÆê“þy˜TÿÍe› Hjþl™ÿ½åºÁ°ÿ®•Ñî‚éÖ~=âf9£Æo3ÿ-ONsÒ\nÿÚ ÿž‹ÆÿÓR»þP…Sæó…†ÿ(ˆMkOÿ·U\\±ÌÊ£G“ÿ˜E¾¬3¼úÒ¬ÿÓòqYYÿ@Boþt˜*¡\'ÿ6PþjÑsg|aÝæbÿç²ÀxþÙËÿ|žOp‘÷\\ú0£µÁÿ%/Žþ½¥ÿ.’ðK€)ÈþWyÕqì-ú Rlçáïwÿ§½ÿ»ä„ÿn½"^,Ì¢4ÅN¼ñþ9ô’/Îd3}k”þÃM˜ýZÿ3%"w&ÿÅv™¼Ó—tþõA4ÿ´ýn/±Ñ¡cÿvÞÊ}³ü{6~ÿ‘9¿7ºy\nóŠÍÓåÿ}œñþ”œ¹ÿã¼ÿ|) ÿ"Îþ9SÌ%ÿ*`bwf¸¾nRÚÿÈÌÀÿɑvu̒„ bÀÂyj¡øíX|ÔÍ«Zÿø0؍%æÿ|Ëþž¨ÿÖøp»ÿK…ïÿJãóÿú“FÖx¢§ ³ÿžÚMÑamQÿô!³ÿ949ÿA¬ÒÿùGÑÿŽ©îž½™ÿ®þgþb!Læÿq‹4ÿ:Ô¨×ÉÿøÌ×ßD ÿ9š·þ/çyj¦‰QˆŠ¥+3ç‹=9_;þvbÿ—?ì^¾úÿ©¹rú:ÿKia×߆qc£€>pcj“£Ã\n!ͶÖ®ÿ&çÿ5¶ßb*Ÿÿ÷\r(¼Ò±ÿÿ=”þ‰-ÿYtþ~&rû2òþy†€ÿÌù§þ¥ë×ʱó…>ð‚¾n¯ÿ’%Òyÿ\'‚ŽúTÿÈÏ _hÿ ô®†è~§{þÁ•ÿèéïÕFpÿüt þòÞÜÿÍUã¹:v÷?tM±ÿ>õÈþ?%ÿk5èþ2ÝÓ¢Ûþ^+¶>¶þ NÈÿ‡Œªë¸ä¯5ŠþP:Mÿ˜É?Ä"¸«°šy;Î&c\'¬PMþ†—º!ñþ^ýßÿ,rül~9ÿÉ(\rÿ\'åÿ\'ï—y3ÿ™–ø\nê®ÿvöþÈõ&E¡ò²–q8‚«iXlÿ1*jû©BE]•9þ¤oZ¼ZÿÌÅ(Õ2Ô`„ÿXŠ´þä’|ÿ¸ö÷AuVÿýfÒþþy$‰sÿ<؆;âa°ŽGÑ¡½T3þ›úHÕTëÿ-Þàÿª*5ÿN§uº(ÿ}±gÿEáBãXK¬©-ã$Fÿ2 ÿ‹Á·çþÚE2ì8¡Ճ*Š‘,þˆå(ÿ1?#ÿ=‘õÿeÀþè§q˜h&y¹Úy‹Óþwð#A½Ùþ»³¢ÿ »æ>øÿçÿÜøl 粏P[ƒ]eÿ\'ÿú²ìþ‹ .̼&þõs4ÿ¿qIþ¿lEÿEõ˲ªcªAøo%l™ÿ@%EX>þY”ÿ¿Dàñ\'5)Ëíÿ‘~ÂÿÝ*ýÿc—aýßJs1ÿ¯Hÿ;°Ë|·ùääc Ïþ¨ÀÃÿ̰þ˜ê«M%Uÿ!x‡ÿŽÂãÖ:Õ»}ÿè.<ÿ¾t*þ—²ÿ3>íþÌìÁÂè<¬"ÿ½¸þg_ÿé$þ) ÿævõ-CՕÿŸ ÿ»¤ã  NÃ+Åá0Ž)þě<ÿßÇ‘ˆœüu©þ‘âîïkmµ¼ÿæp1þIªíÿç·ãÿPÜÂkÍe.4ÅÒ«$ÿXZÿ8—`»ÿÿ*NÈþFFô}¨ÌDŠ|×FfBÈþ4äu܏þËø{8®ÿº—¤ÿ3èРä+ÿùD¾?\rÿõûýóó óýÿõÿÿA¬‰ +vÁ_epÿPü¡þòjÆÿ…²äßpßîUþ3ó>+‹þËA\nAà‰ W3M푪Vÿ6&3ÿñ€eÿ)yJÿìN›©—iþœ)HÂf¯ÿ΢eÿ.{¨ýÿÓ¯—þÃÛ`8v¾þþÑõÿ™d~þèÿ5¸òÿǤÝAàŠ A€‹ ñ&àëz|;A¸®VãúñŸÄjÚ ëœ2±ý†b_I¸_œ•¼£PŒ$±Ð±Uœƒï[D\\ÄXކØ"NÝПWìÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿíÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÆcc¥ø||„îww™ö{{ÿòò\rÖkk½Þoo±‘ÅÅT`00PÎgg©V++}çþþµ××bM««æìvvšÊÊE‚‚‰ÉÉ@ú}}‡ïúú²YYëŽGGÉûðð A­­ì³ÔÔg_¢¢ýE¯¯ê#œœ¿S¤¤÷ärr–›ÀÀ[u··Âáýý=““®L&&jl66Z~??Aõ÷÷ƒÌÌOh44\\Q¥¥ôÑåå4ùññâqq“«ØØsb11S*? •ÇÇRF##eÃÃ^0(7––¡\n/ššµ $6€€›ßââ=Íëë&N\'\'i²²ÍêuuŸ ƒƒžX,,t4.6-Ünn²´ZZî[  û¤RRöv;;M·ÖÖa}³³ÎR)){Ýãã>^//q„„—¦SSõ¹ÑÑhÁíí,@ `ãüüy±±È¶[[íÔjj¾ËËFg¾¾Ùr99K”JJޘLLÔ°XXè…ÏÏJ»ÐÐkÅïï*Oªªåíûû†CCŚMM×f33U……”ŠEEÏéùùþ PPðx<!–KKÝa½½Ü\r‹‹†ŠŠ…àpp|>>BqµµÄÌffªHHØ÷ööÂaa£j55_®WWùi¹¹Ð††‘™ÁÁX:\'\'žž¹Ùáá8ëøø+˜˜³"3Òii»©ÙÙpŽŽ‰3””§-››¶<"‡‡’Ééé ‡ÎÎIªUUÿP((x¥ßßzŒŒY¡¡ø ‰‰€\r\re¿¿Ú׿æ1„BBÆÐhh¸‚AAÃ)™™°Z--w{°°Ë¨TTüm»»Ö,:¥Æcc„ø||™îwwö{{\rÿòò½Ökk±ÞooT‘ÅÅP`00©Îgg}V++çþþbµ×׿M««šìvvEÊʝ‚‚@‰Éɇú}}ïúúë²YYɎGG ûððìA­­g³ÔÔý_¢¢êE¯¯¿#œœ÷S¤¤–ärr[›ÀÀÂu··áýý®=““jL&&Zl66A~??õ÷÷OƒÌÌ\\h44ôQ¥¥4Ñååùññ“âqqs«ØØSb11?* R•ÇÇeF##^ÃÃ(0¡7––\nµ/šš 6$›€€=ßââ&ÍëëiN\'\'Ͳ²Ÿêuu žƒƒtX,,.4-6²Ünnî´ZZû[  ö¤RRMv;;a·ÖÖÎ}³³{R))>Ýããq^//—„„õ¦SSh¹ÑÑ,Áíí`@ ãüüÈy±±í¶[[¾ÔjjFËËÙg¾¾Kr99ޔJJԘLLè°XXJ…ÏÏk»ÐÐ*ÅïïåOªªíûûņCCךMMUf33”……ÏŠEEéùùþð PPDx<<º%ŸŸãK¨¨ó¢QQþ]££À€@@Š­?’’¼!Hp88ñõõßc¼¼Áw¶¶u¯ÚÚcB!!0 åÿÿýóóm¿ÒÒLÍÍ 5&/Ãììá¾__¢5——̈DD9.W“ÄÄòU§§‚ü~~Gz==¬Èddçº]]+2•æss À``˜ÑžOO£ÜÜfD""~T**«;ƒ ˆˆÊŒFF)ÇîîÓk¸¸<(y§ÞÞâ¼^^ v­ÛÛ;ÛààVd22Nt::\n\nےII\n lH$$ä¸\\\\]ŸÂÂn½ÓÓïC¬¬¦Äbb¨9‘‘¤1••7Óää‹òyy2ÕççC‹ÈÈYn77·ÚmmŒd±ÕÕҜNNàI©©´Øllú¬VVóôô%Ïêê¯ÊeeŽôzzéG®®ÕoººˆðxxoJ%%r\\..$8ñW¦¦Çs´´Q—ÆÆ#Ëèè|¡Ýݜètt!>ݖKKÜa½½†\r‹‹…ŠŠàppB|>>ÄqµµªÌffؐHH÷öö£Âaa_j55ù®WWÐi¹¹‘††X™ÁÁ\':¹\'žž8Ùááëøø³+˜˜3"»Òiip©ÙىŽŽ§3””¶-››"<’‡‡ ÉééI‡ÎÎÿªUUxP((z¥ßߏŒŒøY¡¡€ ‰‰\r\rÚe¿¿1×ææÆ„BB¸ÐhhÂAA°)™™wZ--Ë{°°ü¨TTÖm»»:,c¥Æc|„ø|w™îw{ö{ò\rÿòk½Öko±ÞoÅT‘Å0P`0g©Îg+}V+þçþ×bµ×«æM«všìvÊEÊ‚‚É@‰É}‡ú}úïúYë²YGɎGð ûð­ìA­Ôg³Ô¢ý_¢¯êE¯œ¿#œ¤÷S¤r–ärÀ[›À·Âu·ýáý“®=“&jL&6Zl6?A~?÷õ÷ÌOƒÌ4\\h4¥ôQ¥å4Ñåñùñq“âqØs«Ø1Sb1?* ÇR•Ç#eF#Ã^Ã(0–¡7–\nšµ/š 6$€›€â=ßâë&Íë\'iN\'²Í²uŸêu  ƒžƒ,tX,.4-6n²ÜnZî´Z û[ Rö¤R;Mv;Öa·Ö³Î}³){R)ã>Ýã/q^/„—„Sõ¦SÑh¹Ñí,Áí `@ üãü±Èy±[í¶[j¾ÔjËFË¾Ùg¾9Kr9JޔJLԘLXè°XÏJ…ÏÐk»Ðï*ÅïªåOªûíûCņCMךM3Uf3…”…EϊEùéùþPð PKݖK½Üa½‹†\r‹Š…Špàp>B|>µÄqµfªÌfHؐHö÷öa£Âa5_j5Wù®W¹Ði¹†‘†ÁX™Á\':ž¹\'žá8Ùáøëø˜³+˜3"i»ÒiÙp©ÙމŽ”§3”›¶-›"<‡’‡é ÉéÎI‡ÎUÿªU(xP(ßz¥ßŒŒ¡øY¡‰€ ‰\r\r¿Úe¿æ1׿BƄBh¸ÐhAÂA™°)™-wZ-°Ë{°Tü¨T»Öm»:,cc¥Æ||„øww™î{{öòò\rÿkk½Öoo±ÞÅÅT‘00P`gg©Î++}Vþþç××bµ««æMvvšìÊÊE‚‚ÉÉ@‰}}‡úúúïYYë²GGɎðð û­­ìAÔÔg³¢¢ý_¯¯êEœœ¿#¤¤÷Srr–äÀÀ[›··Âuýýᓓ®=&&jL66Zl??A~÷÷õÌÌOƒ44\\h¥¥ôQåå4Ñññùqq“âØØs«11Sb?* ÇÇR•##eFÃÃ^(0––¡7\nššµ/ 6$€€›ââ=ßëë&Í\'\'iN²²ÍuuŸê ƒƒž,,tX.4-6nn²ÜZZî´  û[RRö¤;;MvÖÖa·³³Î})){Rãã>Ý//q^„„—SSõ¦ÑÑh¹íí,Á `@üüã±±Èy[[í¶jj¾ÔËËF¾¾Ùg99KrJJޔLLԘXXè°ÏÏJ…ÐÐk»ïï*ŪªåOûûíCCņMMך33Uf……”EEϊùùéþPPð <KKݖ½½Üa‹‹†\rŠŠ…ppà>>B|µµÄqffªÌHHؐöö÷aa£Â55_jWWù®¹¹Ði††‘ÁÁX™\':žž¹\'áá8Ùøø똘³+3"ii»ÒÙÙp©ŽŽ‰””§3››¶-"<‡‡’éé ÉÎÎI‡UUÿª((xPßßz¥ŒŒ¡¡øY‰‰€ \r\r¿¿Úeææ1×BBƄhh¸ÐAA™™°)--wZ°°Ë{TTü¨»»Öm:,LibsodiumDRGɼógæ j;§Ê„…®g»+ø”þrón<ñ6_:õO¥Ñ‚æ­RQl>+Œh›k½Aû«Ùƒy!~Íà["®(ט/ŠBÍeï#‘D7q/;MìÏûÀµ¼Û‰¥Ûµé8µHó[ÂV9жññY›O¯¤‚?’mÚÕ^«B£˜ªؾopE[ƒŒ²äN¾…1$â´ÿÕÃ} Uo‰{òt]¾r±–;þ±Þ€5Ç%§ܛ”&iÏtñ›ÁÒJñžÁi›äã%O8†G¾ïµÕŒ‹ÆÁeœ¬wÌ¡ $u+Yo,é-ƒä¦nª„tJÔûA½Ü©°\\µSƒÚˆùv«ßfîRQ>˜2´-mÆ1¨?!û˜È\'°äï¾ÇY¿Â¨=ó àÆ%§\n“G‘§Õo‚àQcÊpn\ng))ü/ÒF…\n·\'&É&\\8!.í*ÄZüm,Mß³•\r8SÞc¯‹Ts\ne¨²w<»\njvæ®íG.Ɂ;5‚…,r’dñL¡è¿¢0B¼Kf¨‘—øÐp‹KÂ0¾T£QlÇRïÖè’Ñ©eU$™Ö* qW…5ô¸Ñ»2p jÈÐÒ¸Á¤S«AQl7™ëŽßLwH\'¨H›áµ¼°4cZÉų 9ˊAãJªØNsãcwOʜ[£¸²Öóo.hü²ï]t`/Coc¥xr«ð¡xȄì9dnj(c#úÿ¾é½‚ÞëlP¤yƲ÷£ù¾+SrãòxqƜa&êÎ>\'ÊÂÀ!Ǹ†ÑëàÍÖ}ÚêxÑnîO}õºorªgð¦˜È¢Å}c\n®\rù¾˜?G5 q„}#õwÛ(“$Ç@{«Ê2¼¾É\n¾žË¾ÔÅL*~eüœ)YìúÖ:«oË_XGJŒDl€Að² íÓõ\\cX֜÷¢ÞùÞA³ A ³ ¡gæ j…®g»rón<:õO¥RQŒh›«ÙƒÍà[˜/ŠB‘D7qÏûÀµ¥Ûµé[ÂV9ññY¤‚?’Õ^«˜ªØ[ƒ¾…1$Ã} Ut]¾rþ±Þ€§ܛtñ›ÁÁi›ä†G¾ïƝÁÌ¡ $o,é-ª„tJÜ©°\\ڈùvRQ>˜mÆ1¨È\'°ÇY¿ó àÆG‘§ÕQcÊg))…\n·\'8!.üm,M\r8STs\ne»\njv.Ɂ…,r’¡è¿¢Kf¨p‹K£QlÇè’Ñ$™Ö…5ôp jÁ¤l7LwH\'µ¼°4³ 9JªØNOʜ[óo.htoc¥xxȄnjúÿ¾ëlP¤÷£ù¾òxqƀA¶ !SigEd25519 no Ed25519 collisionsAð¶ E¡ \n \r')}function getBinarySync(file){return file}async function getWasmBinary(binaryFile){return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason);}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency();return wasmExports}addRunDependency();function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst));});})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports$1=receiveInstantiationResult(result);return exports$1}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module);}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback();}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies);};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":return HEAP8[ptr];case "i8":return HEAP8[ptr];case "i16":return HEAP16[ptr>>1];case "i32":return HEAP32[ptr>>2];case "i64":abort("to do getValue(i64) use WASM_BIGINT");case "float":return HEAPF32[ptr>>2];case "double":return HEAPF64[ptr>>3];case "*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`);}}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case "i1":HEAP8[ptr]=value;break;case "i8":HEAP8[ptr]=value;break;case "i16":HEAP16[ptr>>1]=value;break;case "i32":HEAP32[ptr>>2]=value;break;case "i64":abort("to do setValue(i64) use WASM_BIGINT");case "float":HEAPF32[ptr>>2]=value;break;case "double":HEAPF64[ptr>>3]=value;break;case "*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`);}}var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023);}}return str};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var __abort_js=()=>abort("");var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4;}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};for(var base64ReverseLookup=new Uint8Array(123),i=25;i>=0;--i){base64ReverseLookup[48+i]=52+i;base64ReverseLookup[65+i]=i;base64ReverseLookup[97+i]=26+i;}base64ReverseLookup[43]=62;base64ReverseLookup[47]=63;{if(Module["noExitRuntime"])Module["noExitRuntime"];if(Module["print"])Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])Module["arguments"];if(Module["thisProgram"])Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()();}}}Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;var ASM_CONSTS={39864:()=>Module.getRandomValue(),39900:()=>{if(Module.getRandomValue===undefined){try{var window_="object"===typeof window?window:self;var crypto_=typeof window_.crypto!=="undefined"?window_.crypto:window_.msCrypto;crypto_=crypto_===undefined?crypto:crypto_;var randomValuesStandard=function(){var buf=new Uint32Array(1);crypto_.getRandomValues(buf);return buf[0]>>>0};randomValuesStandard();Module.getRandomValue=randomValuesStandard;}catch(e){try{var crypto=null;var randomValueNodeJS=function(){var buf=crypto["randomBytes"](4);return (buf[0]<<24|buf[1]<<16|buf[2]<<8|buf[3])>>>0};randomValueNodeJS();Module.getRandomValue=randomValueNodeJS;}catch(e){throw "No secure random number generator found"}}}}};var wasmMemory;function assignWasmExports(wasmExports){Module["_crypto_aead_aegis128l_keybytes"]=wasmExports["f"];Module["_crypto_aead_aegis128l_nsecbytes"]=wasmExports["g"];Module["_crypto_aead_aegis128l_npubbytes"]=wasmExports["h"];Module["_crypto_aead_aegis128l_abytes"]=wasmExports["i"];Module["_crypto_aead_aegis128l_messagebytes_max"]=wasmExports["j"];Module["_crypto_aead_aegis128l_keygen"]=wasmExports["k"];Module["_crypto_aead_aegis128l_encrypt"]=wasmExports["l"];Module["_crypto_aead_aegis128l_encrypt_detached"]=wasmExports["m"];Module["_crypto_aead_aegis128l_decrypt"]=wasmExports["n"];Module["_crypto_aead_aegis128l_decrypt_detached"]=wasmExports["o"];Module["_crypto_aead_aegis256_keybytes"]=wasmExports["p"];Module["_crypto_aead_aegis256_nsecbytes"]=wasmExports["q"];Module["_crypto_aead_aegis256_npubbytes"]=wasmExports["r"];Module["_crypto_aead_aegis256_abytes"]=wasmExports["s"];Module["_crypto_aead_aegis256_messagebytes_max"]=wasmExports["t"];Module["_crypto_aead_aegis256_keygen"]=wasmExports["u"];Module["_crypto_aead_aegis256_encrypt"]=wasmExports["v"];Module["_crypto_aead_aegis256_encrypt_detached"]=wasmExports["w"];Module["_crypto_aead_aegis256_decrypt"]=wasmExports["x"];Module["_crypto_aead_aegis256_decrypt_detached"]=wasmExports["y"];Module["_crypto_aead_aes256gcm_is_available"]=wasmExports["z"];Module["_crypto_aead_chacha20poly1305_encrypt_detached"]=wasmExports["A"];Module["_crypto_aead_chacha20poly1305_encrypt"]=wasmExports["B"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt_detached"]=wasmExports["C"];Module["_crypto_aead_chacha20poly1305_ietf_encrypt"]=wasmExports["D"];Module["_crypto_aead_chacha20poly1305_decrypt_detached"]=wasmExports["E"];Module["_crypto_aead_chacha20poly1305_decrypt"]=wasmExports["F"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt_detached"]=wasmExports["G"];Module["_crypto_aead_chacha20poly1305_ietf_decrypt"]=wasmExports["H"];Module["_crypto_aead_chacha20poly1305_ietf_keybytes"]=wasmExports["I"];Module["_crypto_aead_chacha20poly1305_ietf_npubbytes"]=wasmExports["J"];Module["_crypto_aead_chacha20poly1305_ietf_nsecbytes"]=wasmExports["K"];Module["_crypto_aead_chacha20poly1305_ietf_abytes"]=wasmExports["L"];Module["_crypto_aead_chacha20poly1305_ietf_messagebytes_max"]=wasmExports["M"];Module["_crypto_aead_chacha20poly1305_ietf_keygen"]=wasmExports["N"];Module["_crypto_aead_chacha20poly1305_keybytes"]=wasmExports["O"];Module["_crypto_aead_chacha20poly1305_npubbytes"]=wasmExports["P"];Module["_crypto_aead_chacha20poly1305_nsecbytes"]=wasmExports["Q"];Module["_crypto_aead_chacha20poly1305_abytes"]=wasmExports["R"];Module["_crypto_aead_chacha20poly1305_messagebytes_max"]=wasmExports["S"];Module["_crypto_aead_chacha20poly1305_keygen"]=wasmExports["T"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt_detached"]=wasmExports["U"];Module["_crypto_aead_xchacha20poly1305_ietf_encrypt"]=wasmExports["V"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt_detached"]=wasmExports["W"];Module["_crypto_aead_xchacha20poly1305_ietf_decrypt"]=wasmExports["X"];Module["_crypto_aead_xchacha20poly1305_ietf_keybytes"]=wasmExports["Y"];Module["_crypto_aead_xchacha20poly1305_ietf_npubbytes"]=wasmExports["Z"];Module["_crypto_aead_xchacha20poly1305_ietf_nsecbytes"]=wasmExports["_"];Module["_crypto_aead_xchacha20poly1305_ietf_abytes"]=wasmExports["$"];Module["_crypto_aead_xchacha20poly1305_ietf_messagebytes_max"]=wasmExports["aa"];Module["_crypto_aead_xchacha20poly1305_ietf_keygen"]=wasmExports["ba"];Module["_crypto_auth_bytes"]=wasmExports["ca"];Module["_crypto_auth_keybytes"]=wasmExports["da"];Module["_crypto_auth_primitive"]=wasmExports["ea"];Module["_crypto_auth"]=wasmExports["fa"];Module["_crypto_auth_verify"]=wasmExports["ga"];Module["_crypto_auth_keygen"]=wasmExports["ha"];Module["_crypto_auth_hmacsha256_bytes"]=wasmExports["ia"];Module["_crypto_auth_hmacsha256_keybytes"]=wasmExports["ja"];Module["_crypto_auth_hmacsha256_statebytes"]=wasmExports["ka"];Module["_crypto_auth_hmacsha256_keygen"]=wasmExports["la"];Module["_crypto_auth_hmacsha256_init"]=wasmExports["ma"];Module["_crypto_auth_hmacsha256_update"]=wasmExports["na"];Module["_crypto_auth_hmacsha256_final"]=wasmExports["oa"];Module["_crypto_auth_hmacsha256"]=wasmExports["pa"];Module["_crypto_auth_hmacsha256_verify"]=wasmExports["qa"];Module["_crypto_auth_hmacsha512_bytes"]=wasmExports["ra"];Module["_crypto_auth_hmacsha512_keybytes"]=wasmExports["sa"];Module["_crypto_auth_hmacsha512_statebytes"]=wasmExports["ta"];Module["_crypto_auth_hmacsha512_keygen"]=wasmExports["ua"];Module["_crypto_auth_hmacsha512_init"]=wasmExports["va"];Module["_crypto_auth_hmacsha512_update"]=wasmExports["wa"];Module["_crypto_auth_hmacsha512_final"]=wasmExports["xa"];Module["_crypto_auth_hmacsha512"]=wasmExports["ya"];Module["_crypto_auth_hmacsha512_verify"]=wasmExports["za"];Module["_crypto_auth_hmacsha512256_bytes"]=wasmExports["Aa"];Module["_crypto_auth_hmacsha512256_keybytes"]=wasmExports["Ba"];Module["_crypto_auth_hmacsha512256_statebytes"]=wasmExports["Ca"];Module["_crypto_auth_hmacsha512256_keygen"]=wasmExports["Da"];Module["_crypto_auth_hmacsha512256_init"]=wasmExports["Ea"];Module["_crypto_auth_hmacsha512256_update"]=wasmExports["Fa"];Module["_crypto_auth_hmacsha512256_final"]=wasmExports["Ga"];Module["_crypto_auth_hmacsha512256"]=wasmExports["Ha"];Module["_crypto_auth_hmacsha512256_verify"]=wasmExports["Ia"];Module["_crypto_box_seedbytes"]=wasmExports["Ja"];Module["_crypto_box_publickeybytes"]=wasmExports["Ka"];Module["_crypto_box_secretkeybytes"]=wasmExports["La"];Module["_crypto_box_beforenmbytes"]=wasmExports["Ma"];Module["_crypto_box_noncebytes"]=wasmExports["Na"];Module["_crypto_box_zerobytes"]=wasmExports["Oa"];Module["_crypto_box_boxzerobytes"]=wasmExports["Pa"];Module["_crypto_box_macbytes"]=wasmExports["Qa"];Module["_crypto_box_messagebytes_max"]=wasmExports["Ra"];Module["_crypto_box_primitive"]=wasmExports["Sa"];Module["_crypto_box_seed_keypair"]=wasmExports["Ta"];Module["_crypto_box_keypair"]=wasmExports["Ua"];Module["_crypto_box_beforenm"]=wasmExports["Va"];Module["_crypto_box_afternm"]=wasmExports["Wa"];Module["_crypto_box_open_afternm"]=wasmExports["Xa"];Module["_crypto_box"]=wasmExports["Ya"];Module["_crypto_box_open"]=wasmExports["Za"];Module["_crypto_box_detached_afternm"]=wasmExports["_a"];Module["_crypto_box_detached"]=wasmExports["$a"];Module["_crypto_box_easy_afternm"]=wasmExports["ab"];Module["_crypto_box_easy"]=wasmExports["bb"];Module["_crypto_box_open_detached_afternm"]=wasmExports["cb"];Module["_crypto_box_open_detached"]=wasmExports["db"];Module["_crypto_box_open_easy_afternm"]=wasmExports["eb"];Module["_crypto_box_open_easy"]=wasmExports["fb"];Module["_crypto_box_seal"]=wasmExports["gb"];Module["_crypto_box_seal_open"]=wasmExports["hb"];Module["_crypto_box_sealbytes"]=wasmExports["ib"];Module["_crypto_box_curve25519xsalsa20poly1305_seed_keypair"]=wasmExports["jb"];Module["_crypto_box_curve25519xsalsa20poly1305_keypair"]=wasmExports["kb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenm"]=wasmExports["lb"];Module["_crypto_box_curve25519xsalsa20poly1305_afternm"]=wasmExports["mb"];Module["_crypto_box_curve25519xsalsa20poly1305_open_afternm"]=wasmExports["nb"];Module["_crypto_box_curve25519xsalsa20poly1305"]=wasmExports["ob"];Module["_crypto_box_curve25519xsalsa20poly1305_open"]=wasmExports["pb"];Module["_crypto_box_curve25519xsalsa20poly1305_seedbytes"]=wasmExports["qb"];Module["_crypto_box_curve25519xsalsa20poly1305_publickeybytes"]=wasmExports["rb"];Module["_crypto_box_curve25519xsalsa20poly1305_secretkeybytes"]=wasmExports["sb"];Module["_crypto_box_curve25519xsalsa20poly1305_beforenmbytes"]=wasmExports["tb"];Module["_crypto_box_curve25519xsalsa20poly1305_noncebytes"]=wasmExports["ub"];Module["_crypto_box_curve25519xsalsa20poly1305_zerobytes"]=wasmExports["vb"];Module["_crypto_box_curve25519xsalsa20poly1305_boxzerobytes"]=wasmExports["wb"];Module["_crypto_box_curve25519xsalsa20poly1305_macbytes"]=wasmExports["xb"];Module["_crypto_box_curve25519xsalsa20poly1305_messagebytes_max"]=wasmExports["yb"];Module["_crypto_core_hchacha20"]=wasmExports["zb"];Module["_crypto_core_hchacha20_outputbytes"]=wasmExports["Ab"];Module["_crypto_core_hchacha20_inputbytes"]=wasmExports["Bb"];Module["_crypto_core_hchacha20_keybytes"]=wasmExports["Cb"];Module["_crypto_core_hchacha20_constbytes"]=wasmExports["Db"];Module["_crypto_core_hsalsa20"]=wasmExports["Eb"];Module["_crypto_core_hsalsa20_outputbytes"]=wasmExports["Fb"];Module["_crypto_core_hsalsa20_inputbytes"]=wasmExports["Gb"];Module["_crypto_core_hsalsa20_keybytes"]=wasmExports["Hb"];Module["_crypto_core_hsalsa20_constbytes"]=wasmExports["Ib"];Module["_crypto_core_salsa20"]=wasmExports["Jb"];Module["_crypto_core_salsa20_outputbytes"]=wasmExports["Kb"];Module["_crypto_core_salsa20_inputbytes"]=wasmExports["Lb"];Module["_crypto_core_salsa20_keybytes"]=wasmExports["Mb"];Module["_crypto_core_salsa20_constbytes"]=wasmExports["Nb"];Module["_crypto_core_salsa2012"]=wasmExports["Ob"];Module["_crypto_core_salsa2012_outputbytes"]=wasmExports["Pb"];Module["_crypto_core_salsa2012_inputbytes"]=wasmExports["Qb"];Module["_crypto_core_salsa2012_keybytes"]=wasmExports["Rb"];Module["_crypto_core_salsa2012_constbytes"]=wasmExports["Sb"];Module["_crypto_core_salsa208"]=wasmExports["Tb"];Module["_crypto_core_salsa208_outputbytes"]=wasmExports["Ub"];Module["_crypto_core_salsa208_inputbytes"]=wasmExports["Vb"];Module["_crypto_core_salsa208_keybytes"]=wasmExports["Wb"];Module["_crypto_core_salsa208_constbytes"]=wasmExports["Xb"];Module["_crypto_generichash_bytes_min"]=wasmExports["Yb"];Module["_crypto_generichash_bytes_max"]=wasmExports["Zb"];Module["_crypto_generichash_bytes"]=wasmExports["_b"];Module["_crypto_generichash_keybytes_min"]=wasmExports["$b"];Module["_crypto_generichash_keybytes_max"]=wasmExports["ac"];Module["_crypto_generichash_keybytes"]=wasmExports["bc"];Module["_crypto_generichash_primitive"]=wasmExports["cc"];Module["_crypto_generichash_statebytes"]=wasmExports["dc"];Module["_crypto_generichash"]=wasmExports["ec"];Module["_crypto_generichash_init"]=wasmExports["fc"];Module["_crypto_generichash_update"]=wasmExports["gc"];Module["_crypto_generichash_final"]=wasmExports["hc"];Module["_crypto_generichash_keygen"]=wasmExports["ic"];Module["_crypto_generichash_blake2b_bytes_min"]=wasmExports["jc"];Module["_crypto_generichash_blake2b_bytes_max"]=wasmExports["kc"];Module["_crypto_generichash_blake2b_bytes"]=wasmExports["lc"];Module["_crypto_generichash_blake2b_keybytes_min"]=wasmExports["mc"];Module["_crypto_generichash_blake2b_keybytes_max"]=wasmExports["nc"];Module["_crypto_generichash_blake2b_keybytes"]=wasmExports["oc"];Module["_crypto_generichash_blake2b_saltbytes"]=wasmExports["pc"];Module["_crypto_generichash_blake2b_personalbytes"]=wasmExports["qc"];Module["_crypto_generichash_blake2b_statebytes"]=wasmExports["rc"];Module["_crypto_generichash_blake2b_keygen"]=wasmExports["sc"];Module["_crypto_generichash_blake2b"]=wasmExports["tc"];Module["_crypto_generichash_blake2b_salt_personal"]=wasmExports["uc"];Module["_crypto_generichash_blake2b_init"]=wasmExports["vc"];Module["_crypto_generichash_blake2b_init_salt_personal"]=wasmExports["wc"];Module["_crypto_generichash_blake2b_update"]=wasmExports["xc"];Module["_crypto_generichash_blake2b_final"]=wasmExports["yc"];Module["_crypto_hash_bytes"]=wasmExports["zc"];Module["_crypto_hash"]=wasmExports["Ac"];Module["_crypto_hash_primitive"]=wasmExports["Bc"];Module["_crypto_hash_sha256_bytes"]=wasmExports["Cc"];Module["_crypto_hash_sha256_statebytes"]=wasmExports["Dc"];Module["_crypto_hash_sha256_init"]=wasmExports["Ec"];Module["_crypto_hash_sha256_update"]=wasmExports["Fc"];Module["_crypto_hash_sha256_final"]=wasmExports["Gc"];Module["_crypto_hash_sha256"]=wasmExports["Hc"];Module["_crypto_hash_sha512_bytes"]=wasmExports["Ic"];Module["_crypto_hash_sha512_statebytes"]=wasmExports["Jc"];Module["_crypto_hash_sha512_init"]=wasmExports["Kc"];Module["_crypto_hash_sha512_update"]=wasmExports["Lc"];Module["_crypto_hash_sha512_final"]=wasmExports["Mc"];Module["_crypto_hash_sha512"]=wasmExports["Nc"];Module["_crypto_kdf_blake2b_bytes_min"]=wasmExports["Oc"];Module["_crypto_kdf_blake2b_bytes_max"]=wasmExports["Pc"];Module["_crypto_kdf_blake2b_contextbytes"]=wasmExports["Qc"];Module["_crypto_kdf_blake2b_keybytes"]=wasmExports["Rc"];Module["_crypto_kdf_blake2b_derive_from_key"]=wasmExports["Sc"];Module["_crypto_kdf_primitive"]=wasmExports["Tc"];Module["_crypto_kdf_bytes_min"]=wasmExports["Uc"];Module["_crypto_kdf_bytes_max"]=wasmExports["Vc"];Module["_crypto_kdf_contextbytes"]=wasmExports["Wc"];Module["_crypto_kdf_keybytes"]=wasmExports["Xc"];Module["_crypto_kdf_derive_from_key"]=wasmExports["Yc"];Module["_crypto_kdf_keygen"]=wasmExports["Zc"];Module["_crypto_kdf_hkdf_sha256_extract_init"]=wasmExports["_c"];Module["_crypto_kdf_hkdf_sha256_extract_update"]=wasmExports["$c"];Module["_crypto_kdf_hkdf_sha256_extract_final"]=wasmExports["ad"];Module["_crypto_kdf_hkdf_sha256_extract"]=wasmExports["bd"];Module["_crypto_kdf_hkdf_sha256_keygen"]=wasmExports["cd"];Module["_crypto_kdf_hkdf_sha256_expand"]=wasmExports["dd"];Module["_crypto_kdf_hkdf_sha256_keybytes"]=wasmExports["ed"];Module["_crypto_kdf_hkdf_sha256_bytes_min"]=wasmExports["fd"];Module["_crypto_kdf_hkdf_sha256_bytes_max"]=wasmExports["gd"];Module["_crypto_kdf_hkdf_sha256_statebytes"]=wasmExports["hd"];Module["_crypto_kdf_hkdf_sha512_extract_init"]=wasmExports["id"];Module["_crypto_kdf_hkdf_sha512_extract_update"]=wasmExports["jd"];Module["_crypto_kdf_hkdf_sha512_extract_final"]=wasmExports["kd"];Module["_crypto_kdf_hkdf_sha512_extract"]=wasmExports["ld"];Module["_crypto_kdf_hkdf_sha512_keygen"]=wasmExports["md"];Module["_crypto_kdf_hkdf_sha512_expand"]=wasmExports["nd"];Module["_crypto_kdf_hkdf_sha512_keybytes"]=wasmExports["od"];Module["_crypto_kdf_hkdf_sha512_bytes_min"]=wasmExports["pd"];Module["_crypto_kdf_hkdf_sha512_bytes_max"]=wasmExports["qd"];Module["_crypto_kdf_hkdf_sha512_statebytes"]=wasmExports["rd"];Module["_crypto_kx_seed_keypair"]=wasmExports["sd"];Module["_crypto_kx_keypair"]=wasmExports["td"];Module["_crypto_kx_client_session_keys"]=wasmExports["ud"];Module["_crypto_kx_server_session_keys"]=wasmExports["vd"];Module["_crypto_kx_publickeybytes"]=wasmExports["wd"];Module["_crypto_kx_secretkeybytes"]=wasmExports["xd"];Module["_crypto_kx_seedbytes"]=wasmExports["yd"];Module["_crypto_kx_sessionkeybytes"]=wasmExports["zd"];Module["_crypto_kx_primitive"]=wasmExports["Ad"];Module["_crypto_onetimeauth_statebytes"]=wasmExports["Bd"];Module["_crypto_onetimeauth_bytes"]=wasmExports["Cd"];Module["_crypto_onetimeauth_keybytes"]=wasmExports["Dd"];Module["_crypto_onetimeauth"]=wasmExports["Ed"];Module["_crypto_onetimeauth_verify"]=wasmExports["Fd"];Module["_crypto_onetimeauth_init"]=wasmExports["Gd"];Module["_crypto_onetimeauth_update"]=wasmExports["Hd"];Module["_crypto_onetimeauth_final"]=wasmExports["Id"];Module["_crypto_onetimeauth_primitive"]=wasmExports["Jd"];Module["_crypto_onetimeauth_keygen"]=wasmExports["Kd"];Module["_crypto_onetimeauth_poly1305"]=wasmExports["Ld"];Module["_crypto_onetimeauth_poly1305_verify"]=wasmExports["Md"];Module["_crypto_onetimeauth_poly1305_init"]=wasmExports["Nd"];Module["_crypto_onetimeauth_poly1305_update"]=wasmExports["Od"];Module["_crypto_onetimeauth_poly1305_final"]=wasmExports["Pd"];Module["_crypto_onetimeauth_poly1305_bytes"]=wasmExports["Qd"];Module["_crypto_onetimeauth_poly1305_keybytes"]=wasmExports["Rd"];Module["_crypto_onetimeauth_poly1305_statebytes"]=wasmExports["Sd"];Module["_crypto_onetimeauth_poly1305_keygen"]=wasmExports["Td"];Module["_crypto_pwhash_argon2i_alg_argon2i13"]=wasmExports["Ud"];Module["_crypto_pwhash_argon2i_bytes_min"]=wasmExports["Vd"];Module["_crypto_pwhash_argon2i_bytes_max"]=wasmExports["Wd"];Module["_crypto_pwhash_argon2i_passwd_min"]=wasmExports["Xd"];Module["_crypto_pwhash_argon2i_passwd_max"]=wasmExports["Yd"];Module["_crypto_pwhash_argon2i_saltbytes"]=wasmExports["Zd"];Module["_crypto_pwhash_argon2i_strbytes"]=wasmExports["_d"];Module["_crypto_pwhash_argon2i_strprefix"]=wasmExports["$d"];Module["_crypto_pwhash_argon2i_opslimit_min"]=wasmExports["ae"];Module["_crypto_pwhash_argon2i_opslimit_max"]=wasmExports["be"];Module["_crypto_pwhash_argon2i_memlimit_min"]=wasmExports["ce"];Module["_crypto_pwhash_argon2i_memlimit_max"]=wasmExports["de"];Module["_crypto_pwhash_argon2i_opslimit_interactive"]=wasmExports["ee"];Module["_crypto_pwhash_argon2i_memlimit_interactive"]=wasmExports["fe"];Module["_crypto_pwhash_argon2i_opslimit_moderate"]=wasmExports["ge"];Module["_crypto_pwhash_argon2i_memlimit_moderate"]=wasmExports["he"];Module["_crypto_pwhash_argon2i_opslimit_sensitive"]=wasmExports["ie"];Module["_crypto_pwhash_argon2i_memlimit_sensitive"]=wasmExports["je"];Module["_crypto_pwhash_argon2i"]=wasmExports["ke"];Module["_crypto_pwhash_argon2i_str"]=wasmExports["le"];Module["_crypto_pwhash_argon2i_str_verify"]=wasmExports["me"];Module["_crypto_pwhash_argon2i_str_needs_rehash"]=wasmExports["ne"];Module["_crypto_pwhash_argon2id_str_needs_rehash"]=wasmExports["oe"];Module["_crypto_pwhash_argon2id_alg_argon2id13"]=wasmExports["pe"];Module["_crypto_pwhash_argon2id_bytes_min"]=wasmExports["qe"];Module["_crypto_pwhash_argon2id_bytes_max"]=wasmExports["re"];Module["_crypto_pwhash_argon2id_passwd_min"]=wasmExports["se"];Module["_crypto_pwhash_argon2id_passwd_max"]=wasmExports["te"];Module["_crypto_pwhash_argon2id_saltbytes"]=wasmExports["ue"];Module["_crypto_pwhash_argon2id_strbytes"]=wasmExports["ve"];Module["_crypto_pwhash_argon2id_strprefix"]=wasmExports["we"];Module["_crypto_pwhash_argon2id_opslimit_min"]=wasmExports["xe"];Module["_crypto_pwhash_argon2id_opslimit_max"]=wasmExports["ye"];Module["_crypto_pwhash_argon2id_memlimit_min"]=wasmExports["ze"];Module["_crypto_pwhash_argon2id_memlimit_max"]=wasmExports["Ae"];Module["_crypto_pwhash_argon2id_opslimit_interactive"]=wasmExports["Be"];Module["_crypto_pwhash_argon2id_memlimit_interactive"]=wasmExports["Ce"];Module["_crypto_pwhash_argon2id_opslimit_moderate"]=wasmExports["De"];Module["_crypto_pwhash_argon2id_memlimit_moderate"]=wasmExports["Ee"];Module["_crypto_pwhash_argon2id_opslimit_sensitive"]=wasmExports["Fe"];Module["_crypto_pwhash_argon2id_memlimit_sensitive"]=wasmExports["Ge"];Module["_crypto_pwhash_argon2id"]=wasmExports["He"];Module["_crypto_pwhash_argon2id_str"]=wasmExports["Ie"];Module["_crypto_pwhash_argon2id_str_verify"]=wasmExports["Je"];Module["_crypto_pwhash_alg_argon2i13"]=wasmExports["Ke"];Module["_crypto_pwhash_alg_argon2id13"]=wasmExports["Le"];Module["_crypto_pwhash_alg_default"]=wasmExports["Me"];Module["_crypto_pwhash_bytes_min"]=wasmExports["Ne"];Module["_crypto_pwhash_bytes_max"]=wasmExports["Oe"];Module["_crypto_pwhash_passwd_min"]=wasmExports["Pe"];Module["_crypto_pwhash_passwd_max"]=wasmExports["Qe"];Module["_crypto_pwhash_saltbytes"]=wasmExports["Re"];Module["_crypto_pwhash_strbytes"]=wasmExports["Se"];Module["_crypto_pwhash_strprefix"]=wasmExports["Te"];Module["_crypto_pwhash_opslimit_min"]=wasmExports["Ue"];Module["_crypto_pwhash_opslimit_max"]=wasmExports["Ve"];Module["_crypto_pwhash_memlimit_min"]=wasmExports["We"];Module["_crypto_pwhash_memlimit_max"]=wasmExports["Xe"];Module["_crypto_pwhash_opslimit_interactive"]=wasmExports["Ye"];Module["_crypto_pwhash_memlimit_interactive"]=wasmExports["Ze"];Module["_crypto_pwhash_opslimit_moderate"]=wasmExports["_e"];Module["_crypto_pwhash_memlimit_moderate"]=wasmExports["$e"];Module["_crypto_pwhash_opslimit_sensitive"]=wasmExports["af"];Module["_crypto_pwhash_memlimit_sensitive"]=wasmExports["bf"];Module["_crypto_pwhash"]=wasmExports["cf"];Module["_crypto_pwhash_str"]=wasmExports["df"];Module["_crypto_pwhash_str_alg"]=wasmExports["ef"];Module["_crypto_pwhash_str_verify"]=wasmExports["ff"];Module["_crypto_pwhash_str_needs_rehash"]=wasmExports["gf"];Module["_crypto_pwhash_primitive"]=wasmExports["hf"];Module["_crypto_scalarmult_primitive"]=wasmExports["jf"];Module["_crypto_scalarmult_base"]=wasmExports["kf"];Module["_crypto_scalarmult"]=wasmExports["lf"];Module["_crypto_scalarmult_bytes"]=wasmExports["mf"];Module["_crypto_scalarmult_scalarbytes"]=wasmExports["nf"];Module["_crypto_scalarmult_curve25519"]=wasmExports["of"];Module["_crypto_scalarmult_curve25519_base"]=wasmExports["pf"];Module["_crypto_scalarmult_curve25519_bytes"]=wasmExports["qf"];Module["_crypto_scalarmult_curve25519_scalarbytes"]=wasmExports["rf"];Module["_crypto_secretbox_keybytes"]=wasmExports["sf"];Module["_crypto_secretbox_noncebytes"]=wasmExports["tf"];Module["_crypto_secretbox_zerobytes"]=wasmExports["uf"];Module["_crypto_secretbox_boxzerobytes"]=wasmExports["vf"];Module["_crypto_secretbox_macbytes"]=wasmExports["wf"];Module["_crypto_secretbox_messagebytes_max"]=wasmExports["xf"];Module["_crypto_secretbox_primitive"]=wasmExports["yf"];Module["_crypto_secretbox"]=wasmExports["zf"];Module["_crypto_secretbox_open"]=wasmExports["Af"];Module["_crypto_secretbox_keygen"]=wasmExports["Bf"];Module["_crypto_secretbox_detached"]=wasmExports["Cf"];Module["_crypto_secretbox_easy"]=wasmExports["Df"];Module["_crypto_secretbox_open_detached"]=wasmExports["Ef"];Module["_crypto_secretbox_open_easy"]=wasmExports["Ff"];Module["_crypto_secretbox_xsalsa20poly1305"]=wasmExports["Gf"];Module["_crypto_secretbox_xsalsa20poly1305_open"]=wasmExports["Hf"];Module["_crypto_secretbox_xsalsa20poly1305_keybytes"]=wasmExports["If"];Module["_crypto_secretbox_xsalsa20poly1305_noncebytes"]=wasmExports["Jf"];Module["_crypto_secretbox_xsalsa20poly1305_zerobytes"]=wasmExports["Kf"];Module["_crypto_secretbox_xsalsa20poly1305_boxzerobytes"]=wasmExports["Lf"];Module["_crypto_secretbox_xsalsa20poly1305_macbytes"]=wasmExports["Mf"];Module["_crypto_secretbox_xsalsa20poly1305_messagebytes_max"]=wasmExports["Nf"];Module["_crypto_secretbox_xsalsa20poly1305_keygen"]=wasmExports["Of"];Module["_crypto_secretstream_xchacha20poly1305_keygen"]=wasmExports["Pf"];Module["_crypto_secretstream_xchacha20poly1305_init_push"]=wasmExports["Qf"];Module["_crypto_secretstream_xchacha20poly1305_init_pull"]=wasmExports["Rf"];Module["_crypto_secretstream_xchacha20poly1305_rekey"]=wasmExports["Sf"];Module["_crypto_secretstream_xchacha20poly1305_push"]=wasmExports["Tf"];Module["_crypto_secretstream_xchacha20poly1305_pull"]=wasmExports["Uf"];Module["_crypto_secretstream_xchacha20poly1305_statebytes"]=wasmExports["Vf"];Module["_crypto_secretstream_xchacha20poly1305_abytes"]=wasmExports["Wf"];Module["_crypto_secretstream_xchacha20poly1305_headerbytes"]=wasmExports["Xf"];Module["_crypto_secretstream_xchacha20poly1305_keybytes"]=wasmExports["Yf"];Module["_crypto_secretstream_xchacha20poly1305_messagebytes_max"]=wasmExports["Zf"];Module["_crypto_secretstream_xchacha20poly1305_tag_message"]=wasmExports["_f"];Module["_crypto_secretstream_xchacha20poly1305_tag_push"]=wasmExports["$f"];Module["_crypto_secretstream_xchacha20poly1305_tag_rekey"]=wasmExports["ag"];Module["_crypto_secretstream_xchacha20poly1305_tag_final"]=wasmExports["bg"];Module["_crypto_shorthash_bytes"]=wasmExports["cg"];Module["_crypto_shorthash_keybytes"]=wasmExports["dg"];Module["_crypto_shorthash_primitive"]=wasmExports["eg"];Module["_crypto_shorthash"]=wasmExports["fg"];Module["_crypto_shorthash_keygen"]=wasmExports["gg"];Module["_crypto_shorthash_siphash24_bytes"]=wasmExports["hg"];Module["_crypto_shorthash_siphash24_keybytes"]=wasmExports["ig"];Module["_crypto_shorthash_siphash24"]=wasmExports["jg"];Module["_crypto_sign_statebytes"]=wasmExports["kg"];Module["_crypto_sign_bytes"]=wasmExports["lg"];Module["_crypto_sign_seedbytes"]=wasmExports["mg"];Module["_crypto_sign_publickeybytes"]=wasmExports["ng"];Module["_crypto_sign_secretkeybytes"]=wasmExports["og"];Module["_crypto_sign_messagebytes_max"]=wasmExports["pg"];Module["_crypto_sign_primitive"]=wasmExports["qg"];Module["_crypto_sign_seed_keypair"]=wasmExports["rg"];Module["_crypto_sign_keypair"]=wasmExports["sg"];Module["_crypto_sign"]=wasmExports["tg"];Module["_crypto_sign_open"]=wasmExports["ug"];Module["_crypto_sign_detached"]=wasmExports["vg"];Module["_crypto_sign_verify_detached"]=wasmExports["wg"];Module["_crypto_sign_init"]=wasmExports["xg"];Module["_crypto_sign_update"]=wasmExports["yg"];Module["_crypto_sign_final_create"]=wasmExports["zg"];Module["_crypto_sign_final_verify"]=wasmExports["Ag"];Module["_crypto_sign_ed25519ph_statebytes"]=wasmExports["Bg"];Module["_crypto_sign_ed25519_bytes"]=wasmExports["Cg"];Module["_crypto_sign_ed25519_seedbytes"]=wasmExports["Dg"];Module["_crypto_sign_ed25519_publickeybytes"]=wasmExports["Eg"];Module["_crypto_sign_ed25519_secretkeybytes"]=wasmExports["Fg"];Module["_crypto_sign_ed25519_messagebytes_max"]=wasmExports["Gg"];Module["_crypto_sign_ed25519_sk_to_seed"]=wasmExports["Hg"];Module["_crypto_sign_ed25519_sk_to_pk"]=wasmExports["Ig"];Module["_crypto_sign_ed25519ph_init"]=wasmExports["Jg"];Module["_crypto_sign_ed25519ph_update"]=wasmExports["Kg"];Module["_crypto_sign_ed25519ph_final_create"]=wasmExports["Lg"];Module["_crypto_sign_ed25519ph_final_verify"]=wasmExports["Mg"];Module["_crypto_sign_ed25519_seed_keypair"]=wasmExports["Ng"];Module["_crypto_sign_ed25519_keypair"]=wasmExports["Og"];Module["_crypto_sign_ed25519_pk_to_curve25519"]=wasmExports["Pg"];Module["_crypto_sign_ed25519_sk_to_curve25519"]=wasmExports["Qg"];Module["_crypto_sign_ed25519_verify_detached"]=wasmExports["Rg"];Module["_crypto_sign_ed25519_open"]=wasmExports["Sg"];Module["_crypto_sign_ed25519_detached"]=wasmExports["Tg"];Module["_crypto_sign_ed25519"]=wasmExports["Ug"];Module["_crypto_stream_chacha20_keybytes"]=wasmExports["Vg"];Module["_crypto_stream_chacha20_noncebytes"]=wasmExports["Wg"];Module["_crypto_stream_chacha20_messagebytes_max"]=wasmExports["Xg"];Module["_crypto_stream_chacha20_ietf_keybytes"]=wasmExports["Yg"];Module["_crypto_stream_chacha20_ietf_noncebytes"]=wasmExports["Zg"];Module["_crypto_stream_chacha20_ietf_messagebytes_max"]=wasmExports["_g"];Module["_crypto_stream_chacha20"]=wasmExports["$g"];Module["_crypto_stream_chacha20_xor_ic"]=wasmExports["ah"];Module["_crypto_stream_chacha20_xor"]=wasmExports["bh"];Module["_crypto_stream_chacha20_ietf"]=wasmExports["ch"];Module["_crypto_stream_chacha20_ietf_xor_ic"]=wasmExports["dh"];Module["_crypto_stream_chacha20_ietf_xor"]=wasmExports["eh"];Module["_crypto_stream_chacha20_ietf_keygen"]=wasmExports["fh"];Module["_crypto_stream_chacha20_keygen"]=wasmExports["gh"];Module["_crypto_stream_keybytes"]=wasmExports["hh"];Module["_crypto_stream_noncebytes"]=wasmExports["ih"];Module["_crypto_stream_messagebytes_max"]=wasmExports["jh"];Module["_crypto_stream_primitive"]=wasmExports["kh"];Module["_crypto_stream"]=wasmExports["lh"];Module["_crypto_stream_xor"]=wasmExports["mh"];Module["_crypto_stream_keygen"]=wasmExports["nh"];Module["_crypto_stream_salsa20_keybytes"]=wasmExports["oh"];Module["_crypto_stream_salsa20_noncebytes"]=wasmExports["ph"];Module["_crypto_stream_salsa20_messagebytes_max"]=wasmExports["qh"];Module["_crypto_stream_salsa20"]=wasmExports["rh"];Module["_crypto_stream_salsa20_xor_ic"]=wasmExports["sh"];Module["_crypto_stream_salsa20_xor"]=wasmExports["th"];Module["_crypto_stream_salsa20_keygen"]=wasmExports["uh"];Module["_crypto_stream_xsalsa20"]=wasmExports["vh"];Module["_crypto_stream_xsalsa20_xor_ic"]=wasmExports["wh"];Module["_crypto_stream_xsalsa20_xor"]=wasmExports["xh"];Module["_crypto_stream_xsalsa20_keybytes"]=wasmExports["yh"];Module["_crypto_stream_xsalsa20_noncebytes"]=wasmExports["zh"];Module["_crypto_stream_xsalsa20_messagebytes_max"]=wasmExports["Ah"];Module["_crypto_stream_xsalsa20_keygen"]=wasmExports["Bh"];Module["_crypto_verify_16_bytes"]=wasmExports["Ch"];Module["_crypto_verify_32_bytes"]=wasmExports["Dh"];Module["_crypto_verify_64_bytes"]=wasmExports["Eh"];Module["_crypto_verify_16"]=wasmExports["Fh"];Module["_crypto_verify_32"]=wasmExports["Gh"];Module["_crypto_verify_64"]=wasmExports["Hh"];Module["_randombytes_implementation_name"]=wasmExports["Ih"];Module["_randombytes_random"]=wasmExports["Jh"];Module["_randombytes_stir"]=wasmExports["Kh"];Module["_randombytes_uniform"]=wasmExports["Lh"];Module["_randombytes_buf"]=wasmExports["Mh"];Module["_randombytes_buf_deterministic"]=wasmExports["Nh"];Module["_randombytes_seedbytes"]=wasmExports["Oh"];Module["_randombytes_close"]=wasmExports["Ph"];Module["_randombytes"]=wasmExports["Qh"];Module["_sodium_bin2hex"]=wasmExports["Rh"];Module["_sodium_hex2bin"]=wasmExports["Sh"];Module["_sodium_base64_encoded_len"]=wasmExports["Th"];Module["_sodium_bin2base64"]=wasmExports["Uh"];Module["_sodium_base642bin"]=wasmExports["Vh"];Module["_sodium_init"]=wasmExports["Wh"];Module["_sodium_pad"]=wasmExports["Xh"];Module["_sodium_unpad"]=wasmExports["Yh"];Module["_sodium_version_string"]=wasmExports["Zh"];Module["_sodium_library_version_major"]=wasmExports["_h"];Module["_sodium_library_version_minor"]=wasmExports["$h"];Module["_sodium_library_minimal"]=wasmExports["ai"];Module["_crypto_box_curve25519xchacha20poly1305_seed_keypair"]=wasmExports["bi"];Module["_crypto_box_curve25519xchacha20poly1305_keypair"]=wasmExports["ci"];Module["_crypto_box_curve25519xchacha20poly1305_beforenm"]=wasmExports["di"];Module["_crypto_box_curve25519xchacha20poly1305_detached_afternm"]=wasmExports["ei"];Module["_crypto_box_curve25519xchacha20poly1305_detached"]=wasmExports["fi"];Module["_crypto_box_curve25519xchacha20poly1305_easy_afternm"]=wasmExports["gi"];Module["_crypto_box_curve25519xchacha20poly1305_easy"]=wasmExports["hi"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached_afternm"]=wasmExports["ii"];Module["_crypto_box_curve25519xchacha20poly1305_open_detached"]=wasmExports["ji"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy_afternm"]=wasmExports["ki"];Module["_crypto_box_curve25519xchacha20poly1305_open_easy"]=wasmExports["li"];Module["_crypto_box_curve25519xchacha20poly1305_seedbytes"]=wasmExports["mi"];Module["_crypto_box_curve25519xchacha20poly1305_publickeybytes"]=wasmExports["ni"];Module["_crypto_box_curve25519xchacha20poly1305_secretkeybytes"]=wasmExports["oi"];Module["_crypto_box_curve25519xchacha20poly1305_beforenmbytes"]=wasmExports["pi"];Module["_crypto_box_curve25519xchacha20poly1305_noncebytes"]=wasmExports["qi"];Module["_crypto_box_curve25519xchacha20poly1305_macbytes"]=wasmExports["ri"];Module["_crypto_box_curve25519xchacha20poly1305_messagebytes_max"]=wasmExports["si"];Module["_crypto_box_curve25519xchacha20poly1305_seal"]=wasmExports["ti"];Module["_crypto_box_curve25519xchacha20poly1305_seal_open"]=wasmExports["ui"];Module["_crypto_box_curve25519xchacha20poly1305_sealbytes"]=wasmExports["vi"];Module["_crypto_core_ed25519_is_valid_point"]=wasmExports["wi"];Module["_crypto_core_ed25519_add"]=wasmExports["xi"];Module["_crypto_core_ed25519_sub"]=wasmExports["yi"];Module["_crypto_core_ed25519_from_uniform"]=wasmExports["zi"];Module["_crypto_core_ed25519_random"]=wasmExports["Ai"];Module["_crypto_core_ed25519_scalar_random"]=wasmExports["Bi"];Module["_crypto_core_ed25519_scalar_invert"]=wasmExports["Ci"];Module["_crypto_core_ed25519_scalar_negate"]=wasmExports["Di"];Module["_crypto_core_ed25519_scalar_complement"]=wasmExports["Ei"];Module["_crypto_core_ed25519_scalar_add"]=wasmExports["Fi"];Module["_crypto_core_ed25519_scalar_reduce"]=wasmExports["Gi"];Module["_crypto_core_ed25519_scalar_sub"]=wasmExports["Hi"];Module["_crypto_core_ed25519_scalar_mul"]=wasmExports["Ii"];Module["_crypto_core_ed25519_bytes"]=wasmExports["Ji"];Module["_crypto_core_ed25519_nonreducedscalarbytes"]=wasmExports["Ki"];Module["_crypto_core_ed25519_uniformbytes"]=wasmExports["Li"];Module["_crypto_core_ed25519_hashbytes"]=wasmExports["Mi"];Module["_crypto_core_ed25519_scalarbytes"]=wasmExports["Ni"];Module["_crypto_core_ristretto255_is_valid_point"]=wasmExports["Oi"];Module["_crypto_core_ristretto255_add"]=wasmExports["Pi"];Module["_crypto_core_ristretto255_sub"]=wasmExports["Qi"];Module["_crypto_core_ristretto255_from_hash"]=wasmExports["Ri"];Module["_crypto_core_ristretto255_random"]=wasmExports["Si"];Module["_crypto_core_ristretto255_scalar_random"]=wasmExports["Ti"];Module["_crypto_core_ristretto255_scalar_invert"]=wasmExports["Ui"];Module["_crypto_core_ristretto255_scalar_negate"]=wasmExports["Vi"];Module["_crypto_core_ristretto255_scalar_complement"]=wasmExports["Wi"];Module["_crypto_core_ristretto255_scalar_add"]=wasmExports["Xi"];Module["_crypto_core_ristretto255_scalar_sub"]=wasmExports["Yi"];Module["_crypto_core_ristretto255_scalar_mul"]=wasmExports["Zi"];Module["_crypto_core_ristretto255_scalar_reduce"]=wasmExports["_i"];Module["_crypto_core_ristretto255_bytes"]=wasmExports["$i"];Module["_crypto_core_ristretto255_nonreducedscalarbytes"]=wasmExports["aj"];Module["_crypto_core_ristretto255_hashbytes"]=wasmExports["bj"];Module["_crypto_core_ristretto255_scalarbytes"]=wasmExports["cj"];Module["_crypto_pwhash_scryptsalsa208sha256_ll"]=wasmExports["dj"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_min"]=wasmExports["ej"];Module["_crypto_pwhash_scryptsalsa208sha256_bytes_max"]=wasmExports["fj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_min"]=wasmExports["gj"];Module["_crypto_pwhash_scryptsalsa208sha256_passwd_max"]=wasmExports["hj"];Module["_crypto_pwhash_scryptsalsa208sha256_saltbytes"]=wasmExports["ij"];Module["_crypto_pwhash_scryptsalsa208sha256_strbytes"]=wasmExports["jj"];Module["_crypto_pwhash_scryptsalsa208sha256_strprefix"]=wasmExports["kj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_min"]=wasmExports["lj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_max"]=wasmExports["mj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_min"]=wasmExports["nj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_max"]=wasmExports["oj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_interactive"]=wasmExports["pj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_interactive"]=wasmExports["qj"];Module["_crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive"]=wasmExports["rj"];Module["_crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive"]=wasmExports["sj"];Module["_crypto_pwhash_scryptsalsa208sha256"]=wasmExports["tj"];Module["_crypto_pwhash_scryptsalsa208sha256_str"]=wasmExports["uj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_verify"]=wasmExports["vj"];Module["_crypto_pwhash_scryptsalsa208sha256_str_needs_rehash"]=wasmExports["wj"];Module["_crypto_scalarmult_ed25519"]=wasmExports["xj"];Module["_crypto_scalarmult_ed25519_noclamp"]=wasmExports["yj"];Module["_crypto_scalarmult_ed25519_base"]=wasmExports["zj"];Module["_crypto_scalarmult_ed25519_base_noclamp"]=wasmExports["Aj"];Module["_crypto_scalarmult_ed25519_bytes"]=wasmExports["Bj"];Module["_crypto_scalarmult_ed25519_scalarbytes"]=wasmExports["Cj"];Module["_crypto_scalarmult_ristretto255"]=wasmExports["Dj"];Module["_crypto_scalarmult_ristretto255_base"]=wasmExports["Ej"];Module["_crypto_scalarmult_ristretto255_bytes"]=wasmExports["Fj"];Module["_crypto_scalarmult_ristretto255_scalarbytes"]=wasmExports["Gj"];Module["_crypto_secretbox_xchacha20poly1305_detached"]=wasmExports["Hj"];Module["_crypto_secretbox_xchacha20poly1305_easy"]=wasmExports["Ij"];Module["_crypto_secretbox_xchacha20poly1305_open_detached"]=wasmExports["Jj"];Module["_crypto_secretbox_xchacha20poly1305_open_easy"]=wasmExports["Kj"];Module["_crypto_secretbox_xchacha20poly1305_keybytes"]=wasmExports["Lj"];Module["_crypto_secretbox_xchacha20poly1305_noncebytes"]=wasmExports["Mj"];Module["_crypto_secretbox_xchacha20poly1305_macbytes"]=wasmExports["Nj"];Module["_crypto_secretbox_xchacha20poly1305_messagebytes_max"]=wasmExports["Oj"];Module["_crypto_shorthash_siphashx24_bytes"]=wasmExports["Pj"];Module["_crypto_shorthash_siphashx24_keybytes"]=wasmExports["Qj"];Module["_crypto_shorthash_siphashx24"]=wasmExports["Rj"];Module["_crypto_stream_salsa2012"]=wasmExports["Sj"];Module["_crypto_stream_salsa2012_xor"]=wasmExports["Tj"];Module["_crypto_stream_salsa2012_keybytes"]=wasmExports["Uj"];Module["_crypto_stream_salsa2012_noncebytes"]=wasmExports["Vj"];Module["_crypto_stream_salsa2012_messagebytes_max"]=wasmExports["Wj"];Module["_crypto_stream_salsa2012_keygen"]=wasmExports["Xj"];Module["_crypto_stream_salsa208"]=wasmExports["Yj"];Module["_crypto_stream_salsa208_xor"]=wasmExports["Zj"];Module["_crypto_stream_salsa208_keybytes"]=wasmExports["_j"];Module["_crypto_stream_salsa208_noncebytes"]=wasmExports["$j"];Module["_crypto_stream_salsa208_messagebytes_max"]=wasmExports["ak"];Module["_crypto_stream_salsa208_keygen"]=wasmExports["bk"];Module["_crypto_stream_xchacha20_keybytes"]=wasmExports["ck"];Module["_crypto_stream_xchacha20_noncebytes"]=wasmExports["dk"];Module["_crypto_stream_xchacha20_messagebytes_max"]=wasmExports["ek"];Module["_crypto_stream_xchacha20"]=wasmExports["fk"];Module["_crypto_stream_xchacha20_xor_ic"]=wasmExports["gk"];Module["_crypto_stream_xchacha20_xor"]=wasmExports["hk"];Module["_crypto_stream_xchacha20_keygen"]=wasmExports["ik"];Module["_malloc"]=wasmExports["jk"];Module["_free"]=wasmExports["kk"];wasmExports["dynCall_iiiji"];wasmExports["dynCall_iiij"];wasmExports["dynCall_iijii"];wasmExports["dynCall_iiijiji"];wasmExports["dynCall_iiijiii"];wasmMemory=wasmExports["e"];wasmExports["__indirect_function_table"];}var wasmImports={b:___assert_fail,c:__abort_js,a:_emscripten_asm_const_int,d:_emscripten_resize_heap};function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;Module["onRuntimeInitialized"]?.();postRun();}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun();},1);}else {doRun();}}var wasmExports;createWasm();run(); + }).catch(function() { + return _Module.useBackupModule(); + }); +const e = Module; + +let a;const r={},t$1=e.ready.then(function(){function t(){if(a._sodium_init()<0)throw new Error("libsodium was not correctly initialized.");for(var e=["crypto_aead_aegis128l_decrypt","crypto_aead_aegis128l_decrypt_detached","crypto_aead_aegis128l_encrypt","crypto_aead_aegis128l_encrypt_detached","crypto_aead_aegis128l_keygen","crypto_aead_aegis256_decrypt","crypto_aead_aegis256_decrypt_detached","crypto_aead_aegis256_encrypt","crypto_aead_aegis256_encrypt_detached","crypto_aead_aegis256_keygen","crypto_aead_chacha20poly1305_decrypt","crypto_aead_chacha20poly1305_decrypt_detached","crypto_aead_chacha20poly1305_encrypt","crypto_aead_chacha20poly1305_encrypt_detached","crypto_aead_chacha20poly1305_ietf_decrypt","crypto_aead_chacha20poly1305_ietf_decrypt_detached","crypto_aead_chacha20poly1305_ietf_encrypt","crypto_aead_chacha20poly1305_ietf_encrypt_detached","crypto_aead_chacha20poly1305_ietf_keygen","crypto_aead_chacha20poly1305_keygen","crypto_aead_xchacha20poly1305_ietf_decrypt","crypto_aead_xchacha20poly1305_ietf_decrypt_detached","crypto_aead_xchacha20poly1305_ietf_encrypt","crypto_aead_xchacha20poly1305_ietf_encrypt_detached","crypto_aead_xchacha20poly1305_ietf_keygen","crypto_auth","crypto_auth_hmacsha256","crypto_auth_hmacsha256_final","crypto_auth_hmacsha256_init","crypto_auth_hmacsha256_keygen","crypto_auth_hmacsha256_update","crypto_auth_hmacsha256_verify","crypto_auth_hmacsha512","crypto_auth_hmacsha512256","crypto_auth_hmacsha512256_final","crypto_auth_hmacsha512256_init","crypto_auth_hmacsha512256_keygen","crypto_auth_hmacsha512256_update","crypto_auth_hmacsha512256_verify","crypto_auth_hmacsha512_final","crypto_auth_hmacsha512_init","crypto_auth_hmacsha512_keygen","crypto_auth_hmacsha512_update","crypto_auth_hmacsha512_verify","crypto_auth_keygen","crypto_auth_verify","crypto_box_beforenm","crypto_box_curve25519xchacha20poly1305_beforenm","crypto_box_curve25519xchacha20poly1305_detached","crypto_box_curve25519xchacha20poly1305_detached_afternm","crypto_box_curve25519xchacha20poly1305_easy","crypto_box_curve25519xchacha20poly1305_easy_afternm","crypto_box_curve25519xchacha20poly1305_keypair","crypto_box_curve25519xchacha20poly1305_open_detached","crypto_box_curve25519xchacha20poly1305_open_detached_afternm","crypto_box_curve25519xchacha20poly1305_open_easy","crypto_box_curve25519xchacha20poly1305_open_easy_afternm","crypto_box_curve25519xchacha20poly1305_seal","crypto_box_curve25519xchacha20poly1305_seal_open","crypto_box_curve25519xchacha20poly1305_seed_keypair","crypto_box_detached","crypto_box_easy","crypto_box_easy_afternm","crypto_box_keypair","crypto_box_open_detached","crypto_box_open_easy","crypto_box_open_easy_afternm","crypto_box_seal","crypto_box_seal_open","crypto_box_seed_keypair","crypto_core_ed25519_add","crypto_core_ed25519_from_hash","crypto_core_ed25519_from_uniform","crypto_core_ed25519_is_valid_point","crypto_core_ed25519_random","crypto_core_ed25519_scalar_add","crypto_core_ed25519_scalar_complement","crypto_core_ed25519_scalar_invert","crypto_core_ed25519_scalar_mul","crypto_core_ed25519_scalar_negate","crypto_core_ed25519_scalar_random","crypto_core_ed25519_scalar_reduce","crypto_core_ed25519_scalar_sub","crypto_core_ed25519_sub","crypto_core_hchacha20","crypto_core_hsalsa20","crypto_core_ristretto255_add","crypto_core_ristretto255_from_hash","crypto_core_ristretto255_is_valid_point","crypto_core_ristretto255_random","crypto_core_ristretto255_scalar_add","crypto_core_ristretto255_scalar_complement","crypto_core_ristretto255_scalar_invert","crypto_core_ristretto255_scalar_mul","crypto_core_ristretto255_scalar_negate","crypto_core_ristretto255_scalar_random","crypto_core_ristretto255_scalar_reduce","crypto_core_ristretto255_scalar_sub","crypto_core_ristretto255_sub","crypto_generichash","crypto_generichash_blake2b_salt_personal","crypto_generichash_final","crypto_generichash_init","crypto_generichash_keygen","crypto_generichash_update","crypto_hash","crypto_hash_sha256","crypto_hash_sha256_final","crypto_hash_sha256_init","crypto_hash_sha256_update","crypto_hash_sha512","crypto_hash_sha512_final","crypto_hash_sha512_init","crypto_hash_sha512_update","crypto_kdf_derive_from_key","crypto_kdf_keygen","crypto_kx_client_session_keys","crypto_kx_keypair","crypto_kx_seed_keypair","crypto_kx_server_session_keys","crypto_onetimeauth","crypto_onetimeauth_final","crypto_onetimeauth_init","crypto_onetimeauth_keygen","crypto_onetimeauth_update","crypto_onetimeauth_verify","crypto_pwhash","crypto_pwhash_scryptsalsa208sha256","crypto_pwhash_scryptsalsa208sha256_ll","crypto_pwhash_scryptsalsa208sha256_str","crypto_pwhash_scryptsalsa208sha256_str_verify","crypto_pwhash_str","crypto_pwhash_str_needs_rehash","crypto_pwhash_str_verify","crypto_scalarmult","crypto_scalarmult_base","crypto_scalarmult_ed25519","crypto_scalarmult_ed25519_base","crypto_scalarmult_ed25519_base_noclamp","crypto_scalarmult_ed25519_noclamp","crypto_scalarmult_ristretto255","crypto_scalarmult_ristretto255_base","crypto_secretbox_detached","crypto_secretbox_easy","crypto_secretbox_keygen","crypto_secretbox_open_detached","crypto_secretbox_open_easy","crypto_secretstream_xchacha20poly1305_init_pull","crypto_secretstream_xchacha20poly1305_init_push","crypto_secretstream_xchacha20poly1305_keygen","crypto_secretstream_xchacha20poly1305_pull","crypto_secretstream_xchacha20poly1305_push","crypto_secretstream_xchacha20poly1305_rekey","crypto_shorthash","crypto_shorthash_keygen","crypto_shorthash_siphashx24","crypto_sign","crypto_sign_detached","crypto_sign_ed25519_pk_to_curve25519","crypto_sign_ed25519_sk_to_curve25519","crypto_sign_ed25519_sk_to_pk","crypto_sign_ed25519_sk_to_seed","crypto_sign_final_create","crypto_sign_final_verify","crypto_sign_init","crypto_sign_keypair","crypto_sign_open","crypto_sign_seed_keypair","crypto_sign_update","crypto_sign_verify_detached","crypto_stream_chacha20","crypto_stream_chacha20_ietf_xor","crypto_stream_chacha20_ietf_xor_ic","crypto_stream_chacha20_keygen","crypto_stream_chacha20_xor","crypto_stream_chacha20_xor_ic","crypto_stream_keygen","crypto_stream_xchacha20_keygen","crypto_stream_xchacha20_xor","crypto_stream_xchacha20_xor_ic","randombytes_buf","randombytes_buf_deterministic","randombytes_close","randombytes_random","randombytes_set_implementation","randombytes_stir","randombytes_uniform","sodium_version_string"],t=[x,k,S,T,w,Y,B,A,M,I,K,N,L,O,U,C,P,R,X,G,D,F,V,H,W,q,z,j,J,Q,Z,$,ee,ae,re,te,_e,ne,se,ce,he,oe,pe,ye,ie,le,ue,de,ve,ge,be,fe,me,Ee,xe,ke,Se,Te,we,Ye,Be,Ae,Me,Ie,Ke,Ne,Le,Oe,Ue,Ce,Pe,Re,Xe,Ge,De,Fe,Ve,He,We,qe,ze,je,Je,Qe,Ze,$e,ea,aa,ra,ta,_a,na,sa,ca,ha,oa,pa,ya,ia,la,ua,da,va,ga,ba,fa,ma,Ea,xa,ka,Sa,Ta,wa,Ya,Ba,Aa,Ma,Ia,Ka,Na,La,Oa,Ua,Ca,Pa,Ra,Xa,Ga,Da,Fa,Va,Ha,Wa,qa,za,ja,Ja,Qa,Za,$a,er,ar,rr,tr,_r,nr,sr,cr,hr,or,pr,yr,ir,lr,ur,dr,vr,gr,br,fr,mr,Er,xr,kr,Sr,Tr,wr,Yr,Br,Ar,Mr,Ir,Kr,Nr,Lr,Or,Ur,Cr,Pr,Rr,Xr,Gr,Dr,Fr,Vr,Hr,Wr,qr],_=0;_=240?(p=4,h=true):y>=224?(p=3,h=true):y>=192?(p=2,h=true):y<128&&(p=1,h=true);}while(!h);for(var i=p-(c.length-o),l=0;l>8&-39)<<8|87+(a=e[n]>>>4)+(a-10>>8&-39),_+=String.fromCharCode(255&t)+String.fromCharCode(t>>>8);return _}var c={ORIGINAL:1,ORIGINAL_NO_PADDING:3,URLSAFE:5,URLSAFE_NO_PADDING:7};function h(e){if(void 0===e)return c.URLSAFE_NO_PADDING;if(e!==c.ORIGINAL&&e!==c.ORIGINAL_NO_PADDING&&e!==c.URLSAFE&&e!==c.URLSAFE_NO_PADDING)throw new Error("unsupported base64 variant");return e}function o(e,r){r=h(r);var t=[];e=E(t,e,"input");var _,s=0|Math.floor(e.length/3),c=e.length-3*s,o=4*s+(0!==c?2&r?2+(c>>>1):4:0),p=new l(o+1),y=u(e);return t.push(y),t.push(p.address),0===a._sodium_bin2base64(p.address,p.length,y,e.length,r)&&b(t,"conversion failed"),p.length=o,_=n(p.to_Uint8Array()),g(t),_}function p(e,a){var r=a||"uint8array";if(!y(r))throw new Error(r+" output format is not available");if(e instanceof l){if("uint8array"===r)return e.to_Uint8Array();if("text"===r)return n(e.to_Uint8Array());if("hex"===r)return s(e.to_Uint8Array());if("base64"===r)return o(e.to_Uint8Array(),c.URLSAFE_NO_PADDING);throw new Error('What is output format "'+r+'"?')}if("object"==typeof e){for(var t=Object.keys(e),_={},h=0;h=BigInt(0)){const e=r>>BigInt(32);e>BigInt(4294967295)&&f(c,"subkey_id cannot be more than 64 bits"),o=Number(e),h=Number(r&BigInt(4294967295));}else "number"==typeof r&&(0|r)===r&&r>=0?h=r:f(c,"subkey_id must be an unsigned integer or bigint");"string"!=typeof t&&f(c,"ctx must be a string"),(t=_(t+"\0")).length-1!==a._crypto_kdf_contextbytes()&&f(c,"invalid ctx length");var y=u(t);t.length,c.push(y),n=E(c,n,"key");var d,v=0|a._crypto_kdf_keybytes();n.length!==v&&f(c,"invalid key length"),d=u(n),c.push(d);var b=new l(0|e),x=b.address;c.push(x),a._crypto_kdf_derive_from_key(x,e,h,o,y,d);var k=p(b,s);return g(c),k}function Aa(e){var r=[];i(e);var t=new l(0|a._crypto_kdf_keybytes()),_=t.address;r.push(_),a._crypto_kdf_keygen(_);var n=p(t,e);return g(r),n}function Ma(e,r,t,_){var n=[];i(_),e=E(n,e,"clientPublicKey");var s,c=0|a._crypto_kx_publickeybytes();e.length!==c&&f(n,"invalid clientPublicKey length"),s=u(e),n.push(s),r=E(n,r,"clientSecretKey");var h,o=0|a._crypto_kx_secretkeybytes();r.length!==o&&f(n,"invalid clientSecretKey length"),h=u(r),n.push(h),t=E(n,t,"serverPublicKey");var y,d=0|a._crypto_kx_publickeybytes();t.length!==d&&f(n,"invalid serverPublicKey length"),y=u(t),n.push(y);var v=new l(0|a._crypto_kx_sessionkeybytes()),m=v.address;n.push(m);var x=new l(0|a._crypto_kx_sessionkeybytes()),k=x.address;if(n.push(k),!(0|a._crypto_kx_client_session_keys(m,k,s,h,y))){var S=p({sharedRx:v,sharedTx:x},_);return g(n),S}b(n,"invalid usage");}function Ia(e){var r=[];i(e);var t=new l(0|a._crypto_kx_publickeybytes()),_=t.address;r.push(_);var n=new l(0|a._crypto_kx_secretkeybytes()),s=n.address;if(r.push(s),!(0|a._crypto_kx_keypair(_,s))){var c={publicKey:p(t,e),privateKey:p(n,e),keyType:"x25519"};return g(r),c}b(r,"internal error");}function Ka(e,r){var t=[];i(r),e=E(t,e,"seed");var _,n=0|a._crypto_kx_seedbytes();e.length!==n&&f(t,"invalid seed length"),_=u(e),t.push(_);var s=new l(0|a._crypto_kx_publickeybytes()),c=s.address;t.push(c);var h=new l(0|a._crypto_kx_secretkeybytes()),o=h.address;if(t.push(o),!(0|a._crypto_kx_seed_keypair(c,o,_))){var y={publicKey:p(s,r),privateKey:p(h,r),keyType:"x25519"};return g(t),y}b(t,"internal error");}function Na(e,r,t,_){var n=[];i(_),e=E(n,e,"serverPublicKey");var s,c=0|a._crypto_kx_publickeybytes();e.length!==c&&f(n,"invalid serverPublicKey length"),s=u(e),n.push(s),r=E(n,r,"serverSecretKey");var h,o=0|a._crypto_kx_secretkeybytes();r.length!==o&&f(n,"invalid serverSecretKey length"),h=u(r),n.push(h),t=E(n,t,"clientPublicKey");var y,d=0|a._crypto_kx_publickeybytes();t.length!==d&&f(n,"invalid clientPublicKey length"),y=u(t),n.push(y);var v=new l(0|a._crypto_kx_sessionkeybytes()),m=v.address;n.push(m);var x=new l(0|a._crypto_kx_sessionkeybytes()),k=x.address;if(n.push(k),!(0|a._crypto_kx_server_session_keys(m,k,s,h,y))){var S=p({sharedRx:v,sharedTx:x},_);return g(n),S}b(n,"invalid usage");}function La(e,r,t){var _=[];i(t);var n=u(e=E(_,e,"message")),s=e.length;_.push(n),r=E(_,r,"key");var c,h=0|a._crypto_onetimeauth_keybytes();r.length!==h&&f(_,"invalid key length"),c=u(r),_.push(c);var o=new l(0|a._crypto_onetimeauth_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_onetimeauth(y,n,s,0,c))){var d=p(o,t);return g(_),d}b(_,"invalid usage");}function Oa(e,r){var t=[];i(r),m(t,e,"state_address");var _=new l(0|a._crypto_onetimeauth_bytes()),n=_.address;if(t.push(n),!(0|a._crypto_onetimeauth_final(e,n))){var s=(a._free(e),p(_,r));return g(t),s}b(t,"invalid usage");}function Ua(e,r){var t=[];i(r);var _=null;null!=e&&(_=u(e=E(t,e,"key")),e.length,t.push(_));var n=new l(144).address;if(!(0|a._crypto_onetimeauth_init(n,_))){var s=n;return g(t),s}b(t,"invalid usage");}function Ca(e){var r=[];i(e);var t=new l(0|a._crypto_onetimeauth_keybytes()),_=t.address;r.push(_),a._crypto_onetimeauth_keygen(_);var n=p(t,e);return g(r),n}function Pa(e,r,t){var _=[];i(t),m(_,e,"state_address");var n=u(r=E(_,r,"message_chunk")),s=r.length;_.push(n),0|a._crypto_onetimeauth_update(e,n,s)&&b(_,"invalid usage"),g(_);}function Ra(e,r,t){var _=[];e=E(_,e,"hash");var n,s=0|a._crypto_onetimeauth_bytes();e.length!==s&&f(_,"invalid hash length"),n=u(e),_.push(n);var c=u(r=E(_,r,"message")),h=r.length;_.push(c),t=E(_,t,"key");var o,p=0|a._crypto_onetimeauth_keybytes();t.length!==p&&f(_,"invalid key length"),o=u(t),_.push(o);var y=!(0|a._crypto_onetimeauth_verify(n,c,h,0,o));return g(_),y}function Xa(e,r,t,_,n,s,c){var h=[];i(c),m(h,e,"keyLength"),("number"!=typeof e||(0|e)!==e||e<0)&&f(h,"keyLength must be an unsigned integer");var o=u(r=E(h,r,"password")),y=r.length;h.push(o),t=E(h,t,"salt");var d,v=0|a._crypto_pwhash_saltbytes();t.length!==v&&f(h,"invalid salt length"),d=u(t),h.push(d),m(h,_,"opsLimit"),("number"!=typeof _||(0|_)!==_||_<0)&&f(h,"opsLimit must be an unsigned integer"),m(h,n,"memLimit"),("number"!=typeof n||(0|n)!==n||n<0)&&f(h,"memLimit must be an unsigned integer"),m(h,s,"algorithm"),("number"!=typeof s||(0|s)!==s||s<0)&&f(h,"algorithm must be an unsigned integer");var x=new l(0|e),k=x.address;if(h.push(k),!(0|a._crypto_pwhash(k,e,0,o,y,0,d,_,0,n,s))){var S=p(x,c);return g(h),S}b(h,"invalid usage");}function Ga(e,r,t,_,n,s){var c=[];i(s),m(c,e,"keyLength"),("number"!=typeof e||(0|e)!==e||e<0)&&f(c,"keyLength must be an unsigned integer");var h=u(r=E(c,r,"password")),o=r.length;c.push(h),t=E(c,t,"salt");var y,d=0|a._crypto_pwhash_scryptsalsa208sha256_saltbytes();t.length!==d&&f(c,"invalid salt length"),y=u(t),c.push(y),m(c,_,"opsLimit"),("number"!=typeof _||(0|_)!==_||_<0)&&f(c,"opsLimit must be an unsigned integer"),m(c,n,"memLimit"),("number"!=typeof n||(0|n)!==n||n<0)&&f(c,"memLimit must be an unsigned integer");var v=new l(0|e),x=v.address;if(c.push(x),!(0|a._crypto_pwhash_scryptsalsa208sha256(x,e,0,h,o,0,y,_,0,n))){var k=p(v,s);return g(c),k}b(c,"invalid usage");}function Da(e,r,t,_,n,s,c){var h=[];i(c);var o=u(e=E(h,e,"password")),y=e.length;h.push(o);var d=u(r=E(h,r,"salt")),v=r.length;h.push(d),m(h,t,"opsLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(h,"opsLimit must be an unsigned integer"),m(h,_,"r"),("number"!=typeof _||(0|_)!==_||_<0)&&f(h,"r must be an unsigned integer"),m(h,n,"p"),("number"!=typeof n||(0|n)!==n||n<0)&&f(h,"p must be an unsigned integer"),m(h,s,"keyLength"),("number"!=typeof s||(0|s)!==s||s<0)&&f(h,"keyLength must be an unsigned integer");var x=new l(0|s),k=x.address;if(h.push(k),!(0|a._crypto_pwhash_scryptsalsa208sha256_ll(o,y,d,v,t,0,_,n,k,s))){var S=p(x,c);return g(h),S}b(h,"invalid usage");}function Fa(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"password")),c=e.length;n.push(s),m(n,r,"opsLimit"),("number"!=typeof r||(0|r)!==r||r<0)&&f(n,"opsLimit must be an unsigned integer"),m(n,t,"memLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(n,"memLimit must be an unsigned integer");var h=new l(0|a._crypto_pwhash_scryptsalsa208sha256_strbytes()).address;if(n.push(h),!(0|a._crypto_pwhash_scryptsalsa208sha256_str(h,s,c,0,r,0,t))){var o=a.UTF8ToString(h);return g(n),o}b(n,"invalid usage");}function Va(e,r,t){var n=[];i(t),"string"!=typeof e&&f(n,"hashed_password must be a string");var s=u(e=_(e+"\0"));e.length,n.push(s);var c=u(r=E(n,r,"password")),h=r.length;n.push(c);var o=!(0|a._crypto_pwhash_scryptsalsa208sha256_str_verify(s,c,h,0));return g(n),o}function Ha(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"password")),c=e.length;n.push(s),m(n,r,"opsLimit"),("number"!=typeof r||(0|r)!==r||r<0)&&f(n,"opsLimit must be an unsigned integer"),m(n,t,"memLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(n,"memLimit must be an unsigned integer");var h=new l(0|a._crypto_pwhash_strbytes()).address;if(n.push(h),!(0|a._crypto_pwhash_str(h,s,c,0,r,0,t))){var o=a.UTF8ToString(h);return g(n),o}b(n,"invalid usage");}function Wa(e,r,t,n){var s=[];i(n),"string"!=typeof e&&f(s,"hashed_password must be a string");var c=u(e=_(e+"\0"));e.length,s.push(c),m(s,r,"opsLimit"),("number"!=typeof r||(0|r)!==r||r<0)&&f(s,"opsLimit must be an unsigned integer"),m(s,t,"memLimit"),("number"!=typeof t||(0|t)!==t||t<0)&&f(s,"memLimit must be an unsigned integer");var h=!!(0|a._crypto_pwhash_str_needs_rehash(c,r,0,t));return g(s),h}function qa(e,r,t){var n=[];i(t),"string"!=typeof e&&f(n,"hashed_password must be a string");var s=u(e=_(e+"\0"));e.length,n.push(s);var c=u(r=E(n,r,"password")),h=r.length;n.push(c);var o=!(0|a._crypto_pwhash_str_verify(s,c,h,0));return g(n),o}function za(e,r,t){var _=[];i(t),e=E(_,e,"privateKey");var n,s=0|a._crypto_scalarmult_scalarbytes();e.length!==s&&f(_,"invalid privateKey length"),n=u(e),_.push(n),r=E(_,r,"publicKey");var c,h=0|a._crypto_scalarmult_bytes();r.length!==h&&f(_,"invalid publicKey length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult(y,n,c))){var d=p(o,t);return g(_),d}b(_,"weak public key");}function ja(e,r){var t=[];i(r),e=E(t,e,"privateKey");var _,n=0|a._crypto_scalarmult_scalarbytes();e.length!==n&&f(t,"invalid privateKey length"),_=u(e),t.push(_);var s=new l(0|a._crypto_scalarmult_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_base(c,_))){var h=p(s,r);return g(t),h}b(t,"unknown error");}function Ja(e,r,t){var _=[];i(t),e=E(_,e,"n");var n,s=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==s&&f(_,"invalid n length"),n=u(e),_.push(n),r=E(_,r,"p");var c,h=0|a._crypto_scalarmult_ed25519_bytes();r.length!==h&&f(_,"invalid p length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_ed25519_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult_ed25519(y,n,c))){var d=p(o,t);return g(_),d}b(_,"invalid point or scalar is 0");}function Qa(e,r){var t=[];i(r),e=E(t,e,"scalar");var _,n=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==n&&f(t,"invalid scalar length"),_=u(e),t.push(_);var s=new l(0|a._crypto_scalarmult_ed25519_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_ed25519_base(c,_))){var h=p(s,r);return g(t),h}b(t,"scalar is 0");}function Za(e,r){var t=[];i(r),e=E(t,e,"scalar");var _,n=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==n&&f(t,"invalid scalar length"),_=u(e),t.push(_);var s=new l(0|a._crypto_scalarmult_ed25519_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_ed25519_base_noclamp(c,_))){var h=p(s,r);return g(t),h}b(t,"scalar is 0");}function $a(e,r,t){var _=[];i(t),e=E(_,e,"n");var n,s=0|a._crypto_scalarmult_ed25519_scalarbytes();e.length!==s&&f(_,"invalid n length"),n=u(e),_.push(n),r=E(_,r,"p");var c,h=0|a._crypto_scalarmult_ed25519_bytes();r.length!==h&&f(_,"invalid p length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_ed25519_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult_ed25519_noclamp(y,n,c))){var d=p(o,t);return g(_),d}b(_,"invalid point or scalar is 0");}function er(e,r,t){var _=[];i(t),e=E(_,e,"scalar");var n,s=0|a._crypto_scalarmult_ristretto255_scalarbytes();e.length!==s&&f(_,"invalid scalar length"),n=u(e),_.push(n),r=E(_,r,"element");var c,h=0|a._crypto_scalarmult_ristretto255_bytes();r.length!==h&&f(_,"invalid element length"),c=u(r),_.push(c);var o=new l(0|a._crypto_scalarmult_ristretto255_bytes()),y=o.address;if(_.push(y),!(0|a._crypto_scalarmult_ristretto255(y,n,c))){var d=p(o,t);return g(_),d}b(_,"result is identity element");}function ar(e,r){var t=[];i(r),e=E(t,e,"scalar");var _,n=0|a._crypto_core_ristretto255_scalarbytes();e.length!==n&&f(t,"invalid scalar length"),_=u(e),t.push(_);var s=new l(0|a._crypto_core_ristretto255_bytes()),c=s.address;if(t.push(c),!(0|a._crypto_scalarmult_ristretto255_base(c,_))){var h=p(s,r);return g(t),h}b(t,"scalar is 0");}function rr(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"message")),c=e.length;n.push(s),r=E(n,r,"nonce");var h,o=0|a._crypto_secretbox_noncebytes();r.length!==o&&f(n,"invalid nonce length"),h=u(r),n.push(h),t=E(n,t,"key");var y,d=0|a._crypto_secretbox_keybytes();t.length!==d&&f(n,"invalid key length"),y=u(t),n.push(y);var v=new l(0|c),m=v.address;n.push(m);var x=new l(0|a._crypto_secretbox_macbytes()),k=x.address;if(n.push(k),!(0|a._crypto_secretbox_detached(m,k,s,c,0,h,y))){var S=p({mac:x,cipher:v},_);return g(n),S}b(n,"invalid usage");}function tr(e,r,t,_){var n=[];i(_);var s=u(e=E(n,e,"message")),c=e.length;n.push(s),r=E(n,r,"nonce");var h,o=0|a._crypto_secretbox_noncebytes();r.length!==o&&f(n,"invalid nonce length"),h=u(r),n.push(h),t=E(n,t,"key");var y,d=0|a._crypto_secretbox_keybytes();t.length!==d&&f(n,"invalid key length"),y=u(t),n.push(y);var v=new l(c+a._crypto_secretbox_macbytes()|0),m=v.address;if(n.push(m),!(0|a._crypto_secretbox_easy(m,s,c,0,h,y))){var x=p(v,_);return g(n),x}b(n,"invalid usage");}function _r(e){var r=[];i(e);var t=new l(0|a._crypto_secretbox_keybytes()),_=t.address;r.push(_),a._crypto_secretbox_keygen(_);var n=p(t,e);return g(r),n}function nr(e,r,t,_,n){var s=[];i(n);var c=u(e=E(s,e,"ciphertext")),h=e.length;s.push(c),r=E(s,r,"mac");var o,y=0|a._crypto_secretbox_macbytes();r.length!==y&&f(s,"invalid mac length"),o=u(r),s.push(o),t=E(s,t,"nonce");var d,v=0|a._crypto_secretbox_noncebytes();t.length!==v&&f(s,"invalid nonce length"),d=u(t),s.push(d),_=E(s,_,"key");var m,x=0|a._crypto_secretbox_keybytes();_.length!==x&&f(s,"invalid key length"),m=u(_),s.push(m);var k=new l(0|h),S=k.address;if(s.push(S),!(0|a._crypto_secretbox_open_detached(S,c,o,h,0,d,m))){var T=p(k,n);return g(s),T}b(s,"wrong secret key for the given ciphertext");}function sr(e,r,t,_){var n=[];i(_),e=E(n,e,"ciphertext");var s,c=a._crypto_secretbox_macbytes(),h=e.length;h>>0;return g([]),r}function Vr(e,r){var t=[];i(r);for(var _=a._malloc(24),n=0;n<6;n++)a.setValue(_+4*n,a.Runtime.addFunction(e[["implementation_name","random","stir","uniform","buf","close"][n]]),"i32");0|a._randombytes_set_implementation(_)&&b(t,"unsupported implementation"),g(t);}function Hr(e){i(e),a._randombytes_stir();}function Wr(e,r){var t=[];i(r),m(t,e,"upper_bound"),("number"!=typeof e||(0|e)!==e||e<0)&&f(t,"upper_bound must be an unsigned integer");var _=a._randombytes_uniform(e)>>>0;return g(t),_}function qr(){var e=a._sodium_version_string(),r=a.UTF8ToString(e);return g([]),r}l.prototype.to_Uint8Array=function(){var e=new Uint8Array(this.length);return e.set(a.HEAPU8.subarray(this.address,this.address+this.length)),e},r.add=function(e,a){if(!(e instanceof Uint8Array&&a instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be added");var r=e.length,t=0,_=0;if(a.length!==e.length)throw new TypeError("Arguments must have the same length");for(_=0;_>=8,t+=e[_]+a[_],e[_]=255&t;},r.base64_variants=c,r.compare=function(e,a){if(!(e instanceof Uint8Array&&a instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be compared");if(e.length!==a.length)throw new TypeError("Only instances of identical length can be compared");for(var r=0,t=1,_=e.length;_-- >0;)r|=a[_]-e[_]>>8&t,t&=(a[_]^e[_])-1>>8;return r+r+t-1},r.from_base64=function(e,r){r=h(r);var t,_=[],n=new l(3*(e=E(_,e,"input")).length/4),s=u(e),c=d(4),o=d(4);return _.push(s),_.push(n.address),_.push(c),_.push(o),0!==a._sodium_base642bin(n.address,n.length,s,e.length,0,c,o,r)&&b(_,"invalid input"),a.getValue(o,"i32")-s!==e.length&&b(_,"incomplete input"),n.length=a.getValue(c,"i32"),t=n.to_Uint8Array(),g(_),t},r.from_hex=function(e){var r,t=[],_=new l((e=E(t,e,"input")).length/2),n=u(e),s=d(4);return t.push(n),t.push(_.address),t.push(s),0!==a._sodium_hex2bin(_.address,_.length,n,e.length,0,0,s)&&b(t,"invalid input"),a.getValue(s,"i32")-n!==e.length&&b(t,"incomplete input"),r=_.to_Uint8Array(),g(t),r},r.from_string=_,r.increment=function(e){if(!(e instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be incremented");for(var a=256,r=0,t=e.length;r>=8,a+=e[r],e[r]=255&a;},r.is_zero=function(e){if(!(e instanceof Uint8Array))throw new TypeError("Only Uint8Array instances can be checked");for(var a=0,r=0,t=e.length;r 0");var t,_=[],n=d(4),s=1,c=0,h=0|e.length,o=new l(h+r);_.push(n),_.push(o.address);for(var p=o.address,y=o.address+h+r;p>>48|h>>>32|h>>>16|h))-1>>16);return 0!==a._sodium_pad(n,o.address,e.length,r,o.length)&&b(_,"internal error"),o.length=a.getValue(n,"i32"),t=o.to_Uint8Array(),g(_),t},r.unpad=function(e,r){if(!(e instanceof Uint8Array))throw new TypeError("buffer must be a Uint8Array");if((r|=0)<=0)throw new Error("block size must be > 0");var t=[],_=u(e),n=d(4);return t.push(_),t.push(n),0!==a._sodium_unpad(n,_,e.length,r)&&b(t,"unsupported/invalid padding"),e=(e=new Uint8Array(e)).subarray(0,a.getValue(n,"i32")),g(t),e},r.ready=t$1,r.symbols=function(){return Object.keys(r).sort()},r.to_base64=o,r.to_hex=s,r.to_string=n; + +function t(key, fallback) { + return window.__XFTP_I18N__?.[key] ?? fallback; +} + +class WorkerBackend { + worker; + pending = /* @__PURE__ */ new Map(); + nextId = 1; + progressCb = null; + ready; + constructor() { + this.worker = new Worker(new URL(/* @vite-ignore */ ""+new URL('crypto.worker.js', import.meta.url).href+"", import.meta.url), { type: "module" }); + let rejectReady; + this.ready = new Promise((resolve, reject) => { + rejectReady = reject; + this.worker.onmessage = (e) => { + if (e.data?.type === "ready") { + this.worker.onmessage = (e2) => this.handleMessage(e2.data); + resolve(); + } else { + reject(new Error("Worker: unexpected first message")); + } + }; + }); + this.worker.onerror = (e) => { + rejectReady(new Error("Worker failed to load: " + e.message)); + for (const p of this.pending.values()) p.reject(new Error("Worker error: " + e.message)); + this.pending.clear(); + }; + } + handleMessage(msg) { + if (msg.type === "progress") { + this.progressCb?.(msg.done, msg.total); + return; + } + const p = this.pending.get(msg.id); + if (!p) return; + this.pending.delete(msg.id); + if (msg.type === "error") { + p.reject(new Error(msg.message)); + } else { + p.resolve(msg); + } + } + async send(msg, transfer) { + await this.ready; + const id = this.nextId++; + return new Promise((resolve, reject) => { + this.pending.set(id, { resolve, reject }); + this.worker.postMessage({ ...msg, id }, transfer ?? []); + }); + } + toTransferable(data) { + if (data.byteOffset !== 0 || data.byteLength !== data.buffer.byteLength) { + return data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength); + } + return data.buffer; + } + async encrypt(data, fileName, onProgress) { + this.progressCb = onProgress ?? null; + const buf = this.toTransferable(data); + const resp = await this.send({ type: "encrypt", data: buf, fileName }, [buf]); + this.progressCb = null; + return { digest: resp.digest, key: resp.key, nonce: resp.nonce, chunkSizes: resp.chunkSizes }; + } + async readChunk(offset, size) { + const resp = await this.send({ type: "readChunk", offset, size }); + return new Uint8Array(resp.data); + } + async decryptAndStoreChunk(dhSecret, nonce, body, digest, chunkNo) { + const dhSecretCopy = new Uint8Array(dhSecret); + const nonceCopy = new Uint8Array(nonce); + const digestCopy = new Uint8Array(digest); + const buf = this.toTransferable(body); + const hex = (b, n = 8) => { + const u = b instanceof ArrayBuffer ? new Uint8Array(b) : b; + return Array.from(u.slice(0, n)).map((x) => x.toString(16).padStart(2, "0")).join(""); + }; + console.log(`[BACKEND-DBG] chunk=${chunkNo} body.len=${body.length} body.byteOff=${body.byteOffset} buf.byteLen=${buf.byteLength} nonce=${hex(nonceCopy, 24)} dhSecret=${hex(dhSecretCopy)} digest=${hex(digestCopy, 32)} buf[0..8]=${hex(buf)} body[-8..]=${hex(body.slice(-8))}`); + await this.send( + { type: "decryptAndStoreChunk", dhSecret: dhSecretCopy, nonce: nonceCopy, body: buf, chunkDigest: digestCopy, chunkNo }, + [buf] + ); + } + async verifyAndDecrypt(params, onProgress) { + this.progressCb = onProgress ?? null; + const resp = await this.send({ + type: "verifyAndDecrypt", + size: params.size, + digest: params.digest, + key: params.key, + nonce: params.nonce + }); + this.progressCb = null; + return { header: resp.header, content: new Uint8Array(resp.content) }; + } + async cleanup() { + await this.send({ type: "cleanup" }); + this.worker.terminate(); + } +} +function createCryptoBackend() { + if (typeof Worker === "undefined") { + throw new Error(t("workersRequired", "Web Workers required — update your browser")); + } + return new WorkerBackend(); +} + +const B64URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; +const B64_DECODE = new Uint8Array(128); +B64_DECODE.fill(255); +for (let i = 0; i < 64; i++) B64_DECODE[B64URL.charCodeAt(i)] = i; +function base64urlEncode(data) { + let result = ""; + const len = data.length; + let i = 0; + for (; i + 2 < len; i += 3) { + const b0 = data[i], b1 = data[i + 1], b2 = data[i + 2]; + result += B64URL[b0 >>> 2]; + result += B64URL[(b0 & 3) << 4 | b1 >>> 4]; + result += B64URL[(b1 & 15) << 2 | b2 >>> 6]; + result += B64URL[b2 & 63]; + } + if (i < len) { + const b0 = data[i]; + result += B64URL[b0 >>> 2]; + if (i + 1 < len) { + const b1 = data[i + 1]; + result += B64URL[(b0 & 3) << 4 | b1 >>> 4]; + result += B64URL[(b1 & 15) << 2]; + result += "="; + } else { + result += B64URL[(b0 & 3) << 4]; + result += "=="; + } + } + return result; +} +function base64urlDecode$1(s) { + let end = s.length; + while (end > 0 && s.charCodeAt(end - 1) === 61) end--; + const n = end; + const out = new Uint8Array(n * 3 >>> 2); + let j = 0, i = 0; + for (; i + 3 < n; i += 4) { + const a = B64_DECODE[s.charCodeAt(i)], b = B64_DECODE[s.charCodeAt(i + 1)]; + const c = B64_DECODE[s.charCodeAt(i + 2)], d = B64_DECODE[s.charCodeAt(i + 3)]; + out[j++] = a << 2 | b >>> 4; + out[j++] = (b & 15) << 4 | c >>> 2; + out[j++] = (c & 3) << 6 | d; + } + if (n - i >= 2) { + const a = B64_DECODE[s.charCodeAt(i)], b = B64_DECODE[s.charCodeAt(i + 1)]; + out[j++] = a << 2 | b >>> 4; + if (n - i >= 3) { + const c = B64_DECODE[s.charCodeAt(i + 2)]; + out[j++] = (b & 15) << 4 | c >>> 2; + } + } + return out; +} +const kb = (n) => n * 1024; +const mb = (n) => n * 1048576; +function encodeFileSize(bytes) { + const ks = Math.floor(bytes / 1024); + if (bytes % 1024 !== 0) return String(bytes); + const ms = Math.floor(ks / 1024); + if (ks % 1024 !== 0) return ks + "kb"; + const gs = Math.floor(ms / 1024); + if (ms % 1024 !== 0) return ms + "mb"; + return gs + "gb"; +} +function decodeFileSize(s) { + if (s.endsWith("gb")) return parseInt(s) * 1073741824; + if (s.endsWith("mb")) return parseInt(s) * 1048576; + if (s.endsWith("kb")) return parseInt(s) * 1024; + return parseInt(s); +} +function encodeServerReplica(r) { + let s = r.chunkNo + ":" + base64urlEncode(r.replicaId) + ":" + base64urlEncode(r.replicaKey); + if (r.digest !== null) s += ":" + base64urlEncode(r.digest); + if (r.chunkSize !== null) s += ":" + encodeFileSize(r.chunkSize); + return s; +} +function decodeServerReplica(server, s) { + const parts = s.split(":"); + if (parts.length < 3) throw new Error("invalid server replica: " + s); + return { + chunkNo: parseInt(parts[0]), + server, + replicaId: base64urlDecode$1(parts[1]), + replicaKey: base64urlDecode$1(parts[2]), + digest: parts.length >= 4 ? base64urlDecode$1(parts[3]) : null, + chunkSize: parts.length >= 5 ? decodeFileSize(parts[4]) : null + }; +} +function unfoldChunksToReplicas(defChunkSize, chunks) { + const result = []; + for (const c of chunks) { + c.replicas.forEach((r, idx) => { + result.push({ + chunkNo: c.chunkNo, + server: r.server, + replicaId: r.replicaId, + replicaKey: r.replicaKey, + digest: idx === 0 ? c.digest : null, + chunkSize: c.chunkSize !== defChunkSize && idx === 0 ? c.chunkSize : null + }); + }); + } + return result; +} +function encodeFileReplicas(defChunkSize, chunks) { + const flat = unfoldChunksToReplicas(defChunkSize, chunks); + flat.sort((a, b) => a.server < b.server ? -1 : a.server > b.server ? 1 : 0); + const groups = []; + for (const r of flat) { + if (groups.length === 0 || groups[groups.length - 1].server !== r.server) { + groups.push({ server: r.server, chunks: [encodeServerReplica(r)] }); + } else { + groups[groups.length - 1].chunks.push(encodeServerReplica(r)); + } + } + return groups; +} +function bytesEqual(a, b) { + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false; + return true; +} +function foldReplicasToChunks(defChunkSize, replicas) { + const sizes = /* @__PURE__ */ new Map(); + const digests = /* @__PURE__ */ new Map(); + for (const r of replicas) { + if (r.chunkSize !== null) { + const existing = sizes.get(r.chunkNo); + if (existing !== void 0 && existing !== r.chunkSize) + throw new Error("different size in chunk replicas"); + sizes.set(r.chunkNo, r.chunkSize); + } + if (r.digest !== null) { + const existing = digests.get(r.chunkNo); + if (existing !== void 0 && !bytesEqual(existing, r.digest)) + throw new Error("different digest in chunk replicas"); + digests.set(r.chunkNo, r.digest); + } + } + const chunkMap = /* @__PURE__ */ new Map(); + for (const r of replicas) { + const existing = chunkMap.get(r.chunkNo); + if (existing) { + existing.replicas.push({ server: r.server, replicaId: r.replicaId, replicaKey: r.replicaKey }); + } else { + const digest = digests.get(r.chunkNo); + if (!digest) throw new Error("no digest for chunk"); + chunkMap.set(r.chunkNo, { + chunkNo: r.chunkNo, + chunkSize: sizes.get(r.chunkNo) ?? defChunkSize, + digest, + replicas: [{ server: r.server, replicaId: r.replicaId, replicaKey: r.replicaKey }] + }); + } + } + return Array.from(chunkMap.values()).sort((a, b) => a.chunkNo - b.chunkNo); +} +function encodeFileDescription(fd) { + const lines = []; + lines.push("chunkSize: " + encodeFileSize(fd.chunkSize)); + lines.push("digest: " + base64urlEncode(fd.digest)); + lines.push("key: " + base64urlEncode(fd.key)); + lines.push("nonce: " + base64urlEncode(fd.nonce)); + lines.push("party: " + fd.party); + if (fd.redirect !== null) { + lines.push("redirect:"); + lines.push(" digest: " + base64urlEncode(fd.redirect.digest)); + lines.push(" size: " + fd.redirect.size); + } + const groups = encodeFileReplicas(fd.chunkSize, fd.chunks); + lines.push("replicas:"); + for (const g of groups) { + lines.push("- chunks:"); + for (const c of g.chunks) { + lines.push(" - " + c); + } + lines.push(" server: " + g.server); + } + lines.push("size: " + encodeFileSize(fd.size)); + return lines.join("\n") + "\n"; +} +function decodeFileDescription(yaml) { + const lines = yaml.split("\n"); + const topLevel = {}; + const replicaGroups = []; + let redirect = null; + let i = 0; + while (i < lines.length) { + const line = lines[i]; + if (line.length === 0) { + i++; + continue; + } + if (line === "replicas:") { + i++; + while (i < lines.length && lines[i].startsWith("- ")) { + const group = { server: "", chunks: [] }; + i = parseReplicaItem(lines, i, group); + replicaGroups.push(group); + } + } else if (line === "redirect:") { + i++; + let digestStr = "", sizeStr = ""; + while (i < lines.length && lines[i].startsWith(" ")) { + const kv = lines[i].substring(2); + const ci = kv.indexOf(": "); + if (ci >= 0) { + const k = kv.substring(0, ci), v = kv.substring(ci + 2); + if (k === "digest") digestStr = v; + if (k === "size") sizeStr = v; + } + i++; + } + redirect = { size: parseInt(sizeStr), digest: base64urlDecode$1(digestStr) }; + } else { + const ci = line.indexOf(": "); + if (ci >= 0) topLevel[line.substring(0, ci)] = line.substring(ci + 2); + i++; + } + } + const chunkSize = decodeFileSize(topLevel["chunkSize"]); + const serverReplicas = []; + for (const g of replicaGroups) { + for (const c of g.chunks) serverReplicas.push(decodeServerReplica(g.server, c)); + } + return { + party: topLevel["party"], + size: decodeFileSize(topLevel["size"]), + digest: base64urlDecode$1(topLevel["digest"]), + key: base64urlDecode$1(topLevel["key"]), + nonce: base64urlDecode$1(topLevel["nonce"]), + chunkSize, + chunks: foldReplicasToChunks(chunkSize, serverReplicas), + redirect + }; +} +function parseReplicaItem(lines, startIdx, group) { + let i = startIdx; + const first = lines[i].substring(2); + i = parseReplicaField(first, lines, i + 1, group); + while (i < lines.length && lines[i].startsWith(" ") && !lines[i].startsWith("- ")) { + i = parseReplicaField(lines[i].substring(2), lines, i + 1, group); + } + return i; +} +function parseReplicaField(entry, lines, nextIdx, group) { + if (entry === "chunks:" || entry.startsWith("chunks:")) { + let i = nextIdx; + while (i < lines.length && lines[i].startsWith(" - ")) { + group.chunks.push(lines[i].substring(4)); + i++; + } + return i; + } + const ci = entry.indexOf(": "); + if (ci >= 0) { + const k = entry.substring(0, ci), v = entry.substring(ci + 2); + if (k === "server") group.server = v; + } + return nextIdx; +} +function validateFileDescription(fd) { + for (let i = 0; i < fd.chunks.length; i++) { + if (fd.chunks[i].chunkNo !== i + 1) return "chunk numbers are not sequential"; + } + let total = 0; + for (const c of fd.chunks) total += c.chunkSize; + if (total !== fd.size) return "chunks total size is different than file size"; + return null; +} + +function base64urlDecode(s) { + let b64 = s.replace(/-/g, "+").replace(/_/g, "/"); + while (b64.length % 4 !== 0) b64 += "="; + const bin = atob(b64); + const bytes = new Uint8Array(bin.length); + for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i); + return bytes; +} +function parseXFTPServer(address) { + const m = address.match(/^xftp:\/\/([A-Za-z0-9_-]+={0,2})@(.+)$/); + if (!m) throw new Error("parseXFTPServer: invalid address format"); + const keyHash = base64urlDecode(m[1]); + if (keyHash.length !== 32) throw new Error("parseXFTPServer: keyHash must be 32 bytes"); + const hostPart = m[2]; + const firstHost = hostPart.split(",")[0]; + const colonIdx = firstHost.lastIndexOf(":"); + let host; + let port; + if (colonIdx > 0) { + host = firstHost.substring(0, colonIdx); + port = firstHost.substring(colonIdx + 1); + } else { + host = firstHost; + port = "443"; + } + return { keyHash, host, port }; +} +function formatXFTPServer(srv) { + return "xftp://" + base64urlEncode(srv.keyHash) + "@" + srv.host + ":" + srv.port; +} +function getDescriptionServers(fd) { + const seen = /* @__PURE__ */ new Set(); + const servers = []; + for (const chunk of fd.chunks) { + for (const replica of chunk.replicas) { + if (!seen.has(replica.server)) { + seen.add(replica.server); + servers.push(parseXFTPServer(replica.server)); + } + } + } + return servers; +} +function serverOrigin(server) { + return server.port === "443" ? `https://${server.host}` : `https://${server.host}:${server.port}`; +} + +var define_XFTP_SERVERS_default = ["xftp://da1aH3nOT-9G8lV7bWamhxpDYdJ1xmW7j3JpGaDR5Ug=@xftp1.simplex.im", "xftp://5vog2Imy1ExJB_7zDZrkV1KDWi96jYFyy9CL6fndBVw=@xftp2.simplex.im", "xftp://PYa32DdYNFWi0uZZOprWQoQpIk5qyjRJ3EF7bVpbsn8=@xftp3.simplex.im", "xftp://k_GgQl40UZVV0Y4BX9ZTyMVqX5ZewcLW0waQIl7AYDE=@xftp4.simplex.im", "xftp://-bIo6o8wuVc4wpZkZD3tH-rCeYaeER_0lz1ffQcSJDs=@xftp5.simplex.im", "xftp://6nSvtY9pJn6PXWTAIMNl95E1Kk1vD7FM2TeOA64CFLg=@xftp6.simplex.im"]; +const serverAddresses = define_XFTP_SERVERS_default; +function getServers() { + const addrs = window.__XFTP_SERVERS__ ?? serverAddresses; + return addrs.map(parseXFTPServer); +} + +const SIZE = 120; +const LINE_WIDTH = 8; +const RADIUS = (SIZE - LINE_WIDTH) / 2; +const CENTER = SIZE / 2; +const LERP_SPEED = 0.12; +function createProgressRing() { + const canvas = document.createElement("canvas"); + canvas.width = SIZE * devicePixelRatio; + canvas.height = SIZE * devicePixelRatio; + canvas.style.width = SIZE + "px"; + canvas.style.height = SIZE + "px"; + canvas.className = "progress-ring"; + const ctx = canvas.getContext("2d"); + ctx.scale(devicePixelRatio, devicePixelRatio); + let displayed = 0; + let target = 0; + let animId = 0; + let spinAngle = 0; + let spinning = false; + let fillResolve = null; + function getColors() { + const appEl = document.querySelector("[data-xftp-app]") ?? document.getElementById("app"); + const s = appEl ? getComputedStyle(appEl) : null; + return { + bg: s?.getPropertyValue("--xftp-ring-bg").trim() || "#e0e0e0", + fg: s?.getPropertyValue("--xftp-ring-fg").trim() || "#3b82f6", + text: s?.getPropertyValue("--xftp-ring-text").trim() || "#333", + done: s?.getPropertyValue("--xftp-ring-done").trim() || "#16a34a" + }; + } + function drawBgRing(c, color) { + ctx.beginPath(); + ctx.arc(CENTER, CENTER, RADIUS, 0, 2 * Math.PI); + ctx.strokeStyle = color ?? c.bg; + ctx.lineWidth = LINE_WIDTH; + ctx.lineCap = "round"; + ctx.stroke(); + } + function render(fraction) { + const c = getColors(); + ctx.clearRect(0, 0, SIZE, SIZE); + drawBgRing(c, fraction >= 1 ? c.done : void 0); + if (fraction > 0 && fraction < 1) { + ctx.beginPath(); + ctx.arc(CENTER, CENTER, RADIUS, -Math.PI / 2, -Math.PI / 2 + 2 * Math.PI * fraction); + ctx.strokeStyle = c.fg; + ctx.lineWidth = LINE_WIDTH; + ctx.lineCap = "round"; + ctx.stroke(); + } + if (fraction >= 1) { + ctx.strokeStyle = c.done; + ctx.lineWidth = 5; + ctx.lineCap = "round"; + ctx.lineJoin = "round"; + ctx.beginPath(); + ctx.moveTo(CENTER - 18, CENTER + 2); + ctx.lineTo(CENTER - 4, CENTER + 16); + ctx.lineTo(CENTER + 22, CENTER - 14); + ctx.stroke(); + } else { + const pct = Math.round(fraction * 100); + ctx.fillStyle = c.text; + ctx.font = "600 20px system-ui, sans-serif"; + ctx.textAlign = "center"; + ctx.textBaseline = "middle"; + ctx.fillText(pct + "%", CENTER, CENTER); + } + } + function tick() { + if (spinning) return; + const diff = target - displayed; + if (Math.abs(diff) < 2e-3) { + displayed = target; + render(displayed); + animId = 0; + return; + } + displayed += diff * LERP_SPEED; + render(displayed); + animId = requestAnimationFrame(tick); + } + function startTick() { + if (!animId && !spinning) { + animId = requestAnimationFrame(tick); + } + } + function stopAnim() { + if (animId) { + cancelAnimationFrame(animId); + animId = 0; + } + spinning = false; + if (fillResolve) { + fillResolve(); + fillResolve = null; + } + } + function spinFrame() { + const c = getColors(); + ctx.clearRect(0, 0, SIZE, SIZE); + drawBgRing(c); + ctx.beginPath(); + ctx.arc(CENTER, CENTER, RADIUS, spinAngle, spinAngle + Math.PI * 0.75); + ctx.strokeStyle = c.fg; + ctx.lineWidth = LINE_WIDTH; + ctx.lineCap = "round"; + ctx.stroke(); + spinAngle += 0.06; + if (spinning) animId = requestAnimationFrame(spinFrame); + } + function redraw() { + if (spinning) return; + render(displayed); + } + const mql = matchMedia("(prefers-color-scheme: dark)"); + mql.addEventListener("change", redraw); + const observer = new MutationObserver(redraw); + observer.observe(document.documentElement, { attributes: true, attributeFilter: ["class"] }); + render(0); + return { + canvas, + update(fraction) { + stopAnim(); + if (fraction === 0 && target > 0 || fraction >= 1) { + displayed = fraction; + target = fraction; + render(fraction); + return; + } + target = fraction; + startTick(); + }, + fillTo(fraction, durationMs) { + stopAnim(); + const from = displayed; + const start = performance.now(); + return new Promise((resolve) => { + fillResolve = resolve; + function frame() { + const t = Math.min(1, (performance.now() - start) / durationMs); + const eased = 1 - (1 - t) * (1 - t); + displayed = from + (fraction - from) * eased; + target = displayed; + render(displayed); + if (t < 1) { + animId = requestAnimationFrame(frame); + } else { + animId = 0; + fillResolve = null; + resolve(); + } + } + animId = requestAnimationFrame(frame); + }); + }, + setIndeterminate(on) { + stopAnim(); + if (on) { + spinning = true; + spinFrame(); + } + }, + destroy() { + stopAnim(); + mql.removeEventListener("change", redraw); + observer.disconnect(); + } + }; +} + +/*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +/* eslint-disable space-unary-ops */ + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + + +//const Z_FILTERED = 1; +//const Z_HUFFMAN_ONLY = 2; +//const Z_RLE = 3; +const Z_FIXED$1 = 4; +//const Z_DEFAULT_STRATEGY = 0; + +/* Possible values of the data_type field (though see inflate()) */ +const Z_BINARY = 0; +const Z_TEXT = 1; +//const Z_ASCII = 1; // = Z_TEXT +const Z_UNKNOWN$1 = 2; + +/*============================================================================*/ + + +function zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } } + +// From zutil.h + +const STORED_BLOCK = 0; +const STATIC_TREES = 1; +const DYN_TREES = 2; +/* The three kinds of block type */ + +const MIN_MATCH$1 = 3; +const MAX_MATCH$1 = 258; +/* The minimum and maximum match lengths */ + +// From deflate.h +/* =========================================================================== + * Internal compression state. + */ + +const LENGTH_CODES$1 = 29; +/* number of length codes, not counting the special END_BLOCK code */ + +const LITERALS$1 = 256; +/* number of literal bytes 0..255 */ + +const L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; +/* number of Literal or Length codes, including the END_BLOCK code */ + +const D_CODES$1 = 30; +/* number of distance codes */ + +const BL_CODES$1 = 19; +/* number of codes used to transfer the bit lengths */ + +const HEAP_SIZE$1 = 2 * L_CODES$1 + 1; +/* maximum heap size */ + +const MAX_BITS$1 = 15; +/* All codes must not exceed MAX_BITS bits */ + +const Buf_size = 16; +/* size of bit buffer in bi_buf */ + + +/* =========================================================================== + * Constants + */ + +const MAX_BL_BITS = 7; +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +const END_BLOCK = 256; +/* end of block literal code */ + +const REP_3_6 = 16; +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +const REPZ_3_10 = 17; +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +const REPZ_11_138 = 18; +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +/* eslint-disable comma-spacing,array-bracket-spacing */ +const extra_lbits = /* extra bits for each length code */ + new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]); + +const extra_dbits = /* extra bits for each distance code */ + new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]); + +const extra_blbits = /* extra bits for each bit length code */ + new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]); + +const bl_order = + new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]); +/* eslint-enable comma-spacing,array-bracket-spacing */ + +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +// We pre-fill arrays with 0 to avoid uninitialized gaps + +const DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + +// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 +const static_ltree = new Array((L_CODES$1 + 2) * 2); +zero$1(static_ltree); +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +const static_dtree = new Array(D_CODES$1 * 2); +zero$1(static_dtree); +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +const _dist_code = new Array(DIST_CODE_LEN); +zero$1(_dist_code); +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +const _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); +zero$1(_length_code); +/* length code for each normalized match length (0 == MIN_MATCH) */ + +const base_length = new Array(LENGTH_CODES$1); +zero$1(base_length); +/* First normalized length for each code (0 = MIN_MATCH) */ + +const base_dist = new Array(D_CODES$1); +zero$1(base_dist); +/* First normalized distance for each code (0 = distance of 1) */ + + +function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ + + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; +} + + +let static_l_desc; +let static_d_desc; +let static_bl_desc; + + +function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ +} + + + +const d_code = (dist) => { + + return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; +}; + + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +const put_short = (s, w) => { +// put_byte(s, (uch)((w) & 0xff)); +// put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +}; + + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +const send_bits = (s, value, length) => { + + if (s.bi_valid > (Buf_size - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short(s, s.bi_buf); + s.bi_buf = value >> (Buf_size - s.bi_valid); + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; + } +}; + + +const send_code = (s, c, tree) => { + + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); +}; + + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +const bi_reverse = (code, len) => { + + let res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; +}; + + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +const bi_flush = (s) => { + + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } +}; + + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +const gen_bitlen = (s, desc) => { +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ + + const tree = desc.dyn_tree; + const max_code = desc.max_code; + const stree = desc.stat_desc.static_tree; + const has_stree = desc.stat_desc.has_stree; + const extra = desc.stat_desc.extra_bits; + const base = desc.stat_desc.extra_base; + const max_length = desc.stat_desc.max_length; + let h; /* heap index */ + let n, m; /* iterate over the tree elements */ + let bits; /* bit length */ + let xbits; /* extra bits */ + let f; /* frequency */ + let overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS$1; bits++) { + s.bl_count[bits] = 0; + } + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + + for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) { continue; } /* not a leaf node */ + + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } + + // Tracev((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } +}; + + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +const gen_codes = (tree, max_code, bl_count) => { +// ct_data *tree; /* the tree to decorate */ +// int max_code; /* largest code with non zero frequency */ +// ushf *bl_count; /* number of codes at each bit length */ + + const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ + let code = 0; /* running code value */ + let bits; /* bit index */ + let n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS$1; bits++) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1< { + + let n; /* iterates over tree elements */ + let bits; /* bit counter */ + let length; /* length value */ + let code; /* code value */ + let dist; /* distance index */ + const bl_count = new Array(MAX_BITS$1 + 1); + /* number of codes at each bit length for an optimal tree */ + + // do check in _tr_init() + //if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +/*#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif*/ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES$1 - 1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + _length_code[length++] = code; + } + } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + _dist_code[dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES$1; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { + _dist_code[256 + dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS$1; bits++) { + bl_count[bits] = 0; + } + + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes(static_ltree, L_CODES$1 + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES$1; n++) { + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); + } + + // Now data ready and we can init static trees + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); + + //static_init_done = true; +}; + + +/* =========================================================================== + * Initialize a new block. + */ +const init_block = (s) => { + + let n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.sym_next = s.matches = 0; +}; + + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +const bi_windup = (s) => +{ + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; +}; + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +const smaller = (tree, n, m, depth) => { + + const _n2 = n * 2; + const _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); +}; + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +const pqdownheap = (s, tree, k) => { +// deflate_state *s; +// ct_data *tree; /* the tree to restore */ +// int k; /* node to move down */ + + const v = s.heap[k]; + let j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s.heap[j], s.depth)) { break; } + + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; +}; + + +// inlined manually +// const SMALLEST = 1; + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +const compress_block = (s, ltree, dtree) => { +// deflate_state *s; +// const ct_data *ltree; /* literal tree */ +// const ct_data *dtree; /* distance tree */ + + let dist; /* distance of matched string */ + let lc; /* match length or unmatched char (if dist == 0) */ + let sx = 0; /* running index in sym_buf */ + let code; /* the code to send */ + let extra; /* number of extra bits to send */ + + if (s.sym_next !== 0) { + do { + dist = s.pending_buf[s.sym_buf + sx++] & 0xff; + dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; + lc = s.pending_buf[s.sym_buf + sx++]; + if (dist === 0) { + send_code(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + //Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra !== 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and sym_buf is ok: */ + //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); + + } while (sx < s.sym_next); + } + + send_code(s, END_BLOCK, ltree); +}; + + +/* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ +const build_tree = (s, desc) => { +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ + + const tree = desc.dyn_tree; + const stree = desc.stat_desc.static_tree; + const has_stree = desc.stat_desc.has_stree; + const elems = desc.stat_desc.elems; + let n, m; /* iterate over heap elements */ + let max_code = -1; /* largest code with non zero frequency */ + let node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE$1; + + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; + + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap(s, tree, 1/*SMALLEST*/); + /***/ + + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; + + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap(s, tree, 1/*SMALLEST*/); + + } while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes(tree, max_code, s.bl_count); +}; + + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +const scan_tree = (s, tree, max_code) => { +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ + + let n; /* iterates over all tree elements */ + let prevlen = -1; /* last emitted length */ + let curlen; /* length of current code */ + + let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + let count = 0; /* repeat count of the current code */ + let max_count = 7; /* max repeat count */ + let min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; + + } else if (curlen !== 0) { + + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; + + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; + + } else { + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + } + + count = 0; + prevlen = curlen; + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } +}; + + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +const send_tree = (s, tree, max_code) => { +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ + + let n; /* iterates over all tree elements */ + let prevlen = -1; /* last emitted length */ + let curlen; /* length of current code */ + + let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + let count = 0; /* repeat count of the current code */ + let max_count = 7; /* max repeat count */ + let min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); + + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); + + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); + } + + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } +}; + + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +const build_bl_tree = (s) => { + + let max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; +}; + + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +const send_all_trees = (s, lcodes, dcodes, blcodes) => { +// deflate_state *s; +// int lcodes, dcodes, blcodes; /* number of codes for each tree */ + + let rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +}; + + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "block list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +const detect_data_type = (s) => { + /* block_mask is the bit mask of block-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + let block_mask = 0xf3ffc07f; + let n; + + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>>= 1) { + if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY; + } + } + + /* Check for textual ("allow-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + for (n = 32; n < LITERALS$1; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + } + + /* There are no "block-listed" or "allow-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +}; + + +let static_init_done = false; + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +const _tr_init$1 = (s) => +{ + + if (!static_init_done) { + tr_static_init(); + static_init_done = true; + } + + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); + + s.bi_buf = 0; + s.bi_valid = 0; + + /* Initialize the first block of the first file: */ + init_block(s); +}; + + +/* =========================================================================== + * Send a stored block + */ +const _tr_stored_block$1 = (s, buf, stored_len, last) => { +//DeflateState *s; +//charf *buf; /* input block */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ + + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ + bi_windup(s); /* align on byte boundary */ + put_short(s, stored_len); + put_short(s, ~stored_len); + if (stored_len) { + s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); + } + s.pending += stored_len; +}; + + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +const _tr_align$1 = (s) => { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); +}; + + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and write out the encoded block. + */ +const _tr_flush_block$1 = (s, buf, stored_len, last) => { +//DeflateState *s; +//charf *buf; /* input block, or NULL if too old */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ + + let opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + let max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { + + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN$1) { + s.strm.data_type = detect_data_type(s); + } + + /* Construct the literal and distance trees */ + build_tree(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + + build_tree(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->sym_next / 3)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block$1(s, buf, stored_len, last); + + } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { + + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); + } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); +}; + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +const _tr_tally$1 = (s, dist, lc) => { +// deflate_state *s; +// unsigned dist; /* distance of matched string */ +// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + + s.pending_buf[s.sym_buf + s.sym_next++] = dist; + s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; + s.pending_buf[s.sym_buf + s.sym_next++] = lc; + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; + } + + return (s.sym_next === s.sym_end); +}; + +var _tr_init_1 = _tr_init$1; +var _tr_stored_block_1 = _tr_stored_block$1; +var _tr_flush_block_1 = _tr_flush_block$1; +var _tr_tally_1 = _tr_tally$1; +var _tr_align_1 = _tr_align$1; + +var trees = { + _tr_init: _tr_init_1, + _tr_stored_block: _tr_stored_block_1, + _tr_flush_block: _tr_flush_block_1, + _tr_tally: _tr_tally_1, + _tr_align: _tr_align_1 +}; + +// Note: adler32 takes 12% for level 0 and 2% for level 6. +// It isn't worth it to make additional optimizations as in original. +// Small size is preferable. + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +const adler32 = (adler, buf, len, pos) => { + let s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; + + while (len !== 0) { + // Set limit ~ twice less than 5552, to keep + // s2 in 31-bits, because we force signed ints. + // in other case %= will fail. + n = len > 2000 ? 2000 : len; + len -= n; + + do { + s1 = (s1 + buf[pos++]) |0; + s2 = (s2 + s1) |0; + } while (--n); + + s1 %= 65521; + s2 %= 65521; + } + + return (s1 | (s2 << 16)) |0; +}; + + +var adler32_1 = adler32; + +// Note: we can't get significant speed boost here. +// So write code to minimize size - no pregenerated tables +// and array tools dependencies. + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +// Use ordinary array, since untyped makes no boost here +const makeTable = () => { + let c, table = []; + + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + } + table[n] = c; + } + + return table; +}; + +// Create table on load. Just 255 signed longs. Not a problem. +const crcTable = new Uint32Array(makeTable()); + + +const crc32 = (crc, buf, len, pos) => { + const t = crcTable; + const end = pos + len; + + crc ^= -1; + + for (let i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; +}; + + +var crc32_1 = crc32; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +var messages = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +var constants$2 = { + + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + Z_TREES: 6, + + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_NEED_DICT: 2, + Z_ERRNO: -1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + Z_MEM_ERROR: -4, + Z_BUF_ERROR: -5, + //Z_VERSION_ERROR: -6, + + /* compression levels */ + Z_NO_COMPRESSION: 0, + Z_BEST_SPEED: 1, + Z_BEST_COMPRESSION: 9, + Z_DEFAULT_COMPRESSION: -1, + + + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + + /* Possible values of the data_type field (though see inflate()) */ + Z_BINARY: 0, + Z_TEXT: 1, + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees; + + + + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + +const { + Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1, + Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1, + Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1, + Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1, + Z_UNKNOWN, + Z_DEFLATED: Z_DEFLATED$2 +} = constants$2; + +/*============================================================================*/ + + +const MAX_MEM_LEVEL = 9; +/* Maximum value for memLevel in deflateInit2 */ +const MAX_WBITS$1 = 15; +/* 32K LZ77 window */ +const DEF_MEM_LEVEL = 8; + + +const LENGTH_CODES = 29; +/* number of length codes, not counting the special END_BLOCK code */ +const LITERALS = 256; +/* number of literal bytes 0..255 */ +const L_CODES = LITERALS + 1 + LENGTH_CODES; +/* number of Literal or Length codes, including the END_BLOCK code */ +const D_CODES = 30; +/* number of distance codes */ +const BL_CODES = 19; +/* number of codes used to transfer the bit lengths */ +const HEAP_SIZE = 2 * L_CODES + 1; +/* maximum heap size */ +const MAX_BITS = 15; +/* All codes must not exceed MAX_BITS bits */ + +const MIN_MATCH = 3; +const MAX_MATCH = 258; +const MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + +const PRESET_DICT = 0x20; + +const INIT_STATE = 42; /* zlib header -> BUSY_STATE */ +//#ifdef GZIP +const GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ +//#endif +const EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ +const NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ +const COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ +const HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ +const BUSY_STATE = 113; /* deflate -> FINISH_STATE */ +const FINISH_STATE = 666; /* stream complete */ + +const BS_NEED_MORE = 1; /* block not completed, need more input or more output */ +const BS_BLOCK_DONE = 2; /* block flush performed */ +const BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ +const BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ + +const OS_CODE = 0x03; // Unix :) . Don't detect, use this default. + +const err = (strm, errorCode) => { + strm.msg = messages[errorCode]; + return errorCode; +}; + +const rank = (f) => { + return ((f) * 2) - ((f) > 4 ? 9 : 0); +}; + +const zero = (buf) => { + let len = buf.length; while (--len >= 0) { buf[len] = 0; } +}; + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +const slide_hash = (s) => { + let n, m; + let p; + let wsize = s.w_size; + + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = (m >= wsize ? m - wsize : 0); + } while (--n); + n = wsize; +//#ifndef FASTEST + p = n; + do { + m = s.prev[--p]; + s.prev[p] = (m >= wsize ? m - wsize : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +//#endif +}; + +/* eslint-disable new-cap */ +let HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask; +// This hash causes less collisions, https://github.com/nodeca/pako/issues/135 +// But breaks binary compatibility +//let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask; +let HASH = HASH_ZLIB; + + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). + */ +const flush_pending = (strm) => { + const s = strm.state; + + //_tr_flush_bits(s); + let len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { return; } + + strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; + } +}; + + +const flush_block_only = (s, last) => { + _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending(s.strm); +}; + + +const put_byte = (s, b) => { + s.pending_buf[s.pending++] = b; +}; + + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +const putShortMSB = (s, b) => { + + // put_byte(s, (Byte)(b >> 8)); +// put_byte(s, (Byte)(b & 0xff)); + s.pending_buf[s.pending++] = (b >>> 8) & 0xff; + s.pending_buf[s.pending++] = b & 0xff; +}; + + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->input buffer and copying from it. + * (See also flush_pending()). + */ +const read_buf = (strm, buf, start, size) => { + + let len = strm.avail_in; + + if (len > size) { len = size; } + if (len === 0) { return 0; } + + strm.avail_in -= len; + + // zmemcpy(buf, strm->next_in, len); + buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); + if (strm.state.wrap === 1) { + strm.adler = adler32_1(strm.adler, buf, len, start); + } + + else if (strm.state.wrap === 2) { + strm.adler = crc32_1(strm.adler, buf, len, start); + } + + strm.next_in += len; + strm.total_in += len; + + return len; +}; + + +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +const longest_match = (s, cur_match) => { + + let chain_length = s.max_chain_length; /* max hash chain length */ + let scan = s.strstart; /* current string */ + let match; /* matched string */ + let len; /* length of current match */ + let best_len = s.prev_length; /* best match length so far */ + let nice_match = s.nice_match; /* stop if match long enough */ + const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? + s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; + + const _win = s.window; // shortcut + + const wmask = s.w_mask; + const prev = s.prev; + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + + const strend = s.strstart + MAX_MATCH; + let scan_end1 = _win[scan + best_len - 1]; + let scan_end = _win[scan + best_len]; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s.prev_length >= s.good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if (nice_match > s.lookahead) { nice_match = s.lookahead; } + + // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + // Assert(cur_match < s->strstart, "no future"); + match = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ + + if (_win[match + best_len] !== scan_end || + _win[match + best_len - 1] !== scan_end1 || + _win[match] !== _win[scan] || + _win[++match] !== _win[scan + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + /*jshint noempty:false*/ + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + scan < strend); + + // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (strend - scan); + scan = strend - MAX_MATCH; + + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { + break; + } + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; +}; + + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +const fill_window = (s) => { + + const _w_size = s.w_size; + let n, more, str; + + //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = s.window_size - s.lookahead - s.strstart; + + // JS ints have 32 bit, block below not needed + /* Deal with !@#$% 64K limit: */ + //if (sizeof(int) <= 2) { + // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + // more = wsize; + // + // } else if (more == (unsigned)(-1)) { + // /* Very unlikely, but possible on 16 bit machine if + // * strstart == 0 && lookahead == 1 (input done a byte at time) + // */ + // more--; + // } + //} + + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { + + s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + /* we now have strstart >= MAX_DIST */ + s.block_start -= _w_size; + if (s.insert > s.strstart) { + s.insert = s.strstart; + } + slide_hash(s); + more += _w_size; + } + if (s.strm.avail_in === 0) { + break; + } + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + //Assert(more >= 2, "more < 2"); + n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s.lookahead + s.insert >= MIN_MATCH) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + + /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ + s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); +//#if MIN_MATCH != 3 +// Call update_hash() MIN_MATCH-3 more times +//#endif + while (s.insert) { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = str; + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH) { + break; + } + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ +// if (s.high_water < s.window_size) { +// const curr = s.strstart + s.lookahead; +// let init = 0; +// +// if (s.high_water < curr) { +// /* Previous high water mark below current data -- zero WIN_INIT +// * bytes or up to end of window, whichever is less. +// */ +// init = s.window_size - curr; +// if (init > WIN_INIT) +// init = WIN_INIT; +// zmemzero(s->window + curr, (unsigned)init); +// s->high_water = curr + init; +// } +// else if (s->high_water < (ulg)curr + WIN_INIT) { +// /* High water mark at or above current data, but below current data +// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up +// * to end of window, whichever is less. +// */ +// init = (ulg)curr + WIN_INIT - s->high_water; +// if (init > s->window_size - s->high_water) +// init = s->window_size - s->high_water; +// zmemzero(s->window + s->high_water, (unsigned)init); +// s->high_water += init; +// } +// } +// +// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, +// "not enough room for search"); +}; + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. + */ +const deflate_stored = (s, flush) => { + + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. + */ + let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; + + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + let len, left, have, last = 0; + let used = s.strm.avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. + */ + len = 65535/* MAX_STORED */; /* maximum deflate stored block length */ + have = (s.bi_valid + 42) >> 3; /* number of header bytes */ + if (s.strm.avail_out < have) { /* need room for header */ + break; + } + /* maximum stored block length that will fit in avail_out: */ + have = s.strm.avail_out - have; + left = s.strstart - s.block_start; /* bytes left in window */ + if (len > left + s.strm.avail_in) { + len = left + s.strm.avail_in; /* limit len to the input */ + } + if (len > have) { + len = have; /* limit len to the output */ + } + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) || + flush === Z_NO_FLUSH$2 || + len !== left + s.strm.avail_in)) { + break; + } + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0; + _tr_stored_block(s, 0, 0, last); + + /* Replace the lengths in the dummy stored block with len. */ + s.pending_buf[s.pending - 4] = len; + s.pending_buf[s.pending - 3] = len >> 8; + s.pending_buf[s.pending - 2] = ~len; + s.pending_buf[s.pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s.strm); + +//#ifdef ZLIB_DEBUG +// /* Update debugging counts for the data about to be copied. */ +// s->compressed_len += len << 3; +// s->bits_sent += len << 3; +//#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) { + left = len; + } + //zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); + s.strm.next_out += left; + s.strm.avail_out -= left; + s.strm.total_out += left; + s.block_start += left; + len -= left; + } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s.strm, s.strm.output, s.strm.next_out, len); + s.strm.next_out += len; + s.strm.avail_out -= len; + s.strm.total_out += len; + } + } while (last === 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s.strm.avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s.w_size) { /* supplant the previous history */ + s.matches = 2; /* clear hash */ + //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); + s.strstart = s.w_size; + s.insert = s.strstart; + } + else { + if (s.window_size - s.strstart <= used) { + /* Slide the window down. */ + s.strstart -= s.w_size; + //zmemcpy(s->window, s->window + s->w_size, s->strstart); + s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); + if (s.matches < 2) { + s.matches++; /* add a pending slide_hash() */ + } + if (s.insert > s.strstart) { + s.insert = s.strstart; + } + } + //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); + s.strstart += used; + s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; + } + s.block_start = s.strstart; + } + if (s.high_water < s.strstart) { + s.high_water = s.strstart; + } + + /* If the last block was written to next_out, then done. */ + if (last) { + return BS_FINISH_DONE; + } + + /* If flushing and all input has been consumed, then done. */ + if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 && + s.strm.avail_in === 0 && s.strstart === s.block_start) { + return BS_BLOCK_DONE; + } + + /* Fill the window with any remaining input. */ + have = s.window_size - s.strstart; + if (s.strm.avail_in > have && s.block_start >= s.w_size) { + /* Slide the window down. */ + s.block_start -= s.w_size; + s.strstart -= s.w_size; + //zmemcpy(s->window, s->window + s->w_size, s->strstart); + s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); + if (s.matches < 2) { + s.matches++; /* add a pending slide_hash() */ + } + have += s.w_size; /* more space now */ + if (s.insert > s.strstart) { + s.insert = s.strstart; + } + } + if (have > s.strm.avail_in) { + have = s.strm.avail_in; + } + if (have) { + read_buf(s.strm, s.window, s.strstart, have); + s.strstart += have; + s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; + } + if (s.high_water < s.strstart) { + s.high_water = s.strstart; + } + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s.bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have; + min_block = have > s.w_size ? s.w_size : have; + left = s.strstart - s.block_start; + if (left >= min_block || + ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 && + s.strm.avail_in === 0 && left <= have)) { + len = left > have ? have : left; + last = flush === Z_FINISH$3 && s.strm.avail_in === 0 && + len === left ? 1 : 0; + _tr_stored_block(s, s.block_start, len, last); + s.block_start += len; + flush_pending(s.strm); + } + + /* We've done all we can with the available input and output. */ + return last ? BS_FINISH_STARTED : BS_NEED_MORE; +}; + + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +const deflate_fast = (s, flush) => { + + let hash_head; /* head of the hash chain */ + let bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; /* flush the current block */ + } + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + } + if (s.match_length >= MIN_MATCH) { + // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only + + /*** _tr_tally_dist(s, s.strstart - s.match_start, + s.match_length - MIN_MATCH, bflush); ***/ + bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); + + s.lookahead -= s.match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { + s.match_length--; /* string at strstart already in table */ + do { + s.strstart++; + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s.match_length !== 0); + s.strstart++; + } else + { + s.strstart += s.match_length; + s.match_length = 0; + s.ins_h = s.window[s.strstart]; + /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ + s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); + +//#if MIN_MATCH != 3 +// Call UPDATE_HASH() MIN_MATCH-3 more times +//#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s.window[s.strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +}; + +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +const deflate_slow = (s, flush) => { + + let hash_head; /* head of hash chain */ + let bflush; /* set if current block must be flushed */ + + let max_insert; + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + + /* Find the longest match, discarding those <= prev_length. + */ + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH - 1; + + if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + + if (s.match_length <= 5 && + (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s.match_length = MIN_MATCH - 1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + //check_match(s, s.strstart-1, s.prev_match, s.prev_length); + + /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, + s.prev_length - MIN_MATCH, bflush);***/ + bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + /*** INSERT_STRING(s, s.strstart, hash_head); ***/ + s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]); + hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h]; + s.head[s.ins_h] = s.strstart; + /***/ + } + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH - 1; + s.strstart++; + + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + } else if (s.match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); + + if (bflush) { + /*** FLUSH_BLOCK_ONLY(s, 0) ***/ + flush_block_only(s, false); + /***/ + } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + //Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s.match_available) { + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); + + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + return BS_BLOCK_DONE; +}; + + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +const deflate_rle = (s, flush) => { + + let bflush; /* set if current block must be flushed */ + let prev; /* byte at distance one to match */ + let scan, strend; /* scan goes up to strend for length of run */ + + const _win = s.window; + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s.lookahead <= MAX_MATCH) { + fill_window(s); + if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s.match_length = 0; + if (s.lookahead >= MIN_MATCH && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH; + do { + /*jshint noempty:false*/ + } while (prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + scan < strend); + s.match_length = MAX_MATCH - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; + } + } + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s.match_length >= MIN_MATCH) { + //check_match(s, s.strstart, s.strstart - 1, s.match_length); + + /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ + bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); + + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +}; + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +const deflate_huff = (s, flush) => { + + let bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s.lookahead === 0) { + fill_window(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s.match_length = 0; + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +}; + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +function Config(good_length, max_lazy, nice_length, max_chain, func) { + + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; +} + +const configuration_table = [ + /* good lazy nice chain */ + new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ + new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ + new Config(4, 5, 16, 8, deflate_fast), /* 2 */ + new Config(4, 6, 32, 32, deflate_fast), /* 3 */ + + new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ + new Config(8, 16, 32, 32, deflate_slow), /* 5 */ + new Config(8, 16, 128, 128, deflate_slow), /* 6 */ + new Config(8, 32, 128, 256, deflate_slow), /* 7 */ + new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ + new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ +]; + + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +const lm_init = (s) => { + + s.window_size = 2 * s.w_size; + + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + + /* Set the default configuration parameters: + */ + s.max_lazy_match = configuration_table[s.level].max_lazy; + s.good_match = configuration_table[s.level].good_length; + s.nice_match = configuration_table[s.level].nice_length; + s.max_chain_length = configuration_table[s.level].max_chain; + + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + s.ins_h = 0; +}; + + +function DeflateState() { + this.strm = null; /* pointer back to this zlib stream */ + this.status = 0; /* as the name implies */ + this.pending_buf = null; /* output still pending */ + this.pending_buf_size = 0; /* size of pending_buf */ + this.pending_out = 0; /* next pending byte to output to the stream */ + this.pending = 0; /* nb of bytes in the pending buffer */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.gzhead = null; /* gzip header information to write */ + this.gzindex = 0; /* where in extra, name, or comment */ + this.method = Z_DEFLATED$2; /* can only be DEFLATED */ + this.last_flush = -1; /* value of flush param for previous deflate call */ + + this.w_size = 0; /* LZ77 window size (32K by default) */ + this.w_bits = 0; /* log2(w_size) (8..16) */ + this.w_mask = 0; /* w_size - 1 */ + + this.window = null; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. + */ + + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + this.prev = null; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + this.head = null; /* Heads of the hash chains or NIL. */ + + this.ins_h = 0; /* hash index of string to be inserted */ + this.hash_size = 0; /* number of elements in hash table */ + this.hash_bits = 0; /* log2(hash_size) */ + this.hash_mask = 0; /* hash_size-1 */ + + this.hash_shift = 0; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + this.match_length = 0; /* length of best match */ + this.prev_match = 0; /* previous match */ + this.match_available = 0; /* set if previous match exists */ + this.strstart = 0; /* start of string to insert */ + this.match_start = 0; /* start of matching string */ + this.lookahead = 0; /* number of valid bytes ahead in window */ + + this.prev_length = 0; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + this.max_chain_length = 0; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + this.max_lazy_match = 0; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ + // That's alias to max_lazy_match, don't use directly + //this.max_insert_length = 0; + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + this.level = 0; /* compression level (1..9) */ + this.strategy = 0; /* favor or force Huffman coding*/ + + this.good_match = 0; + /* Use a faster search when the previous match is longer than this */ + + this.nice_match = 0; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + + /* Didn't use ct_data typedef below to suppress compiler warning */ + + // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + // Use flat array of DOUBLE size, with interleaved fata, + // because JS does not support effective + this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); + this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); + this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); + zero(this.dyn_ltree); + zero(this.dyn_dtree); + zero(this.bl_tree); + + this.l_desc = null; /* desc. for literal tree */ + this.d_desc = null; /* desc. for distance tree */ + this.bl_desc = null; /* desc. for bit length tree */ + + //ush bl_count[MAX_BITS+1]; + this.bl_count = new Uint16Array(MAX_BITS + 1); + /* number of codes at each bit length for an optimal tree */ + + //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ + zero(this.heap); + + this.heap_len = 0; /* number of elements in the heap */ + this.heap_max = 0; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; + zero(this.depth); + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + this.sym_buf = 0; /* buffer for distances and literals/lengths */ + + this.lit_bufsize = 0; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + this.sym_next = 0; /* running index in sym_buf */ + this.sym_end = 0; /* symbol table full when sym_next reaches this */ + + this.opt_len = 0; /* bit length of current block with optimal trees */ + this.static_len = 0; /* bit length of current block with static trees */ + this.matches = 0; /* number of string matches in current block */ + this.insert = 0; /* bytes at end of window left to insert */ + + + this.bi_buf = 0; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + this.bi_valid = 0; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + // Used for window memory init. We safely ignore it for JS. That makes + // sense only for pointers and memory check tools. + //this.high_water = 0; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ +} + + +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +const deflateStateCheck = (strm) => { + + if (!strm) { + return 1; + } + const s = strm.state; + if (!s || s.strm !== strm || (s.status !== INIT_STATE && +//#ifdef GZIP + s.status !== GZIP_STATE && +//#endif + s.status !== EXTRA_STATE && + s.status !== NAME_STATE && + s.status !== COMMENT_STATE && + s.status !== HCRC_STATE && + s.status !== BUSY_STATE && + s.status !== FINISH_STATE)) { + return 1; + } + return 0; +}; + + +const deflateResetKeep = (strm) => { + + if (deflateStateCheck(strm)) { + return err(strm, Z_STREAM_ERROR$2); + } + + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN; + + const s = strm.state; + s.pending = 0; + s.pending_out = 0; + + if (s.wrap < 0) { + s.wrap = -s.wrap; + /* was made negative by deflate(..., Z_FINISH); */ + } + s.status = +//#ifdef GZIP + s.wrap === 2 ? GZIP_STATE : +//#endif + s.wrap ? INIT_STATE : BUSY_STATE; + strm.adler = (s.wrap === 2) ? + 0 // crc32(0, Z_NULL, 0) + : + 1; // adler32(0, Z_NULL, 0) + s.last_flush = -2; + _tr_init(s); + return Z_OK$3; +}; + + +const deflateReset = (strm) => { + + const ret = deflateResetKeep(strm); + if (ret === Z_OK$3) { + lm_init(strm.state); + } + return ret; +}; + + +const deflateSetHeader = (strm, head) => { + + if (deflateStateCheck(strm) || strm.state.wrap !== 2) { + return Z_STREAM_ERROR$2; + } + strm.state.gzhead = head; + return Z_OK$3; +}; + + +const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => { + + if (!strm) { // === Z_NULL + return Z_STREAM_ERROR$2; + } + let wrap = 1; + + if (level === Z_DEFAULT_COMPRESSION$1) { + level = 6; + } + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } + + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } + + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) { + return err(strm, Z_STREAM_ERROR$2); + } + + + if (windowBits === 8) { + windowBits = 9; + } + /* until 256-byte window bug fixed */ + + const s = new DeflateState(); + + strm.state = s; + s.strm = strm; + s.status = INIT_STATE; /* to pass state test in deflateReset() */ + + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; + + s.hash_bits = memLevel + 7; + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); + + s.window = new Uint8Array(s.w_size * 2); + s.head = new Uint16Array(s.hash_size); + s.prev = new Uint16Array(s.w_size); + + // Don't need mem init magic for JS. + //s.high_water = 0; /* nothing written to s->window yet */ + + s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n-2) bits have been written, just + * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 + * symbols are written.) The closest the writing gets to what is unread is + * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + + s.pending_buf_size = s.lit_bufsize * 4; + s.pending_buf = new Uint8Array(s.pending_buf_size); + + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->sym_buf = s->pending_buf + s->lit_bufsize; + s.sym_buf = s.lit_bufsize; + + //s->sym_end = (s->lit_bufsize - 1) * 3; + s.sym_end = (s.lit_bufsize - 1) * 3; + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + + s.level = level; + s.strategy = strategy; + s.method = method; + + return deflateReset(strm); +}; + +const deflateInit = (strm, level) => { + + return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); +}; + + +/* ========================================================================= */ +const deflate$2 = (strm, flush) => { + + if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) { + return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2; + } + + const s = strm.state; + + if (!strm.output || + (strm.avail_in !== 0 && !strm.input) || + (s.status === FINISH_STATE && flush !== Z_FINISH$3)) { + return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2); + } + + const old_flush = s.last_flush; + s.last_flush = flush; + + /* Flush as much pending output as possible */ + if (s.pending !== 0) { + flush_pending(strm); + if (strm.avail_out === 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s.last_flush = -1; + return Z_OK$3; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && + flush !== Z_FINISH$3) { + return err(strm, Z_BUF_ERROR$1); + } + + /* User must not provide more input after the first FINISH: */ + if (s.status === FINISH_STATE && strm.avail_in !== 0) { + return err(strm, Z_BUF_ERROR$1); + } + + /* Write the header */ + if (s.status === INIT_STATE && s.wrap === 0) { + s.status = BUSY_STATE; + } + if (s.status === INIT_STATE) { + /* zlib header */ + let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8; + let level_flags = -1; + + if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= (level_flags << 6); + if (s.strstart !== 0) { header |= PRESET_DICT; } + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s.strstart !== 0) { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + strm.adler = 1; // adler32(0L, Z_NULL, 0); + s.status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } +//#ifdef GZIP + if (s.status === GZIP_STATE) { + /* gzip header */ + strm.adler = 0; //crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (!s.gzhead) { // s->gzhead == Z_NULL + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s.status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } + else { + put_byte(s, (s.gzhead.text ? 1 : 0) + + (s.gzhead.hcrc ? 2 : 0) + + (!s.gzhead.extra ? 0 : 4) + + (!s.gzhead.name ? 0 : 8) + + (!s.gzhead.comment ? 0 : 16) + ); + put_byte(s, s.gzhead.time & 0xff); + put_byte(s, (s.gzhead.time >> 8) & 0xff); + put_byte(s, (s.gzhead.time >> 16) & 0xff); + put_byte(s, (s.gzhead.time >> 24) & 0xff); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, s.gzhead.os & 0xff); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte(s, s.gzhead.extra.length & 0xff); + put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); + } + if (s.gzhead.hcrc) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE; + } + } + if (s.status === EXTRA_STATE) { + if (s.gzhead.extra/* != Z_NULL*/) { + let beg = s.pending; /* start of bytes to update crc */ + let left = (s.gzhead.extra.length & 0xffff) - s.gzindex; + while (s.pending + left > s.pending_buf_size) { + let copy = s.pending_buf_size - s.pending; + // zmemcpy(s.pending_buf + s.pending, + // s.gzhead.extra + s.gzindex, copy); + s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); + s.pending = s.pending_buf_size; + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + s.gzindex += copy; + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + beg = 0; + left -= copy; + } + // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility + // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 + let gzhead_extra = new Uint8Array(s.gzhead.extra); + // zmemcpy(s->pending_buf + s->pending, + // s->gzhead->extra + s->gzindex, left); + s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); + s.pending += left; + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + s.gzindex = 0; + } + s.status = NAME_STATE; + } + if (s.status === NAME_STATE) { + if (s.gzhead.name/* != Z_NULL*/) { + let beg = s.pending; /* start of bytes to update crc */ + let val; + do { + if (s.pending === s.pending_buf_size) { + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + beg = 0; + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + s.gzindex = 0; + } + s.status = COMMENT_STATE; + } + if (s.status === COMMENT_STATE) { + if (s.gzhead.comment/* != Z_NULL*/) { + let beg = s.pending; /* start of bytes to update crc */ + let val; + do { + if (s.pending === s.pending_buf_size) { + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + beg = 0; + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + } + s.status = HCRC_STATE; + } + if (s.status === HCRC_STATE) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + strm.adler = 0; //crc32(0L, Z_NULL, 0); + } + s.status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } +//#endif + + /* Start a new block or continue the current one. + */ + if (strm.avail_in !== 0 || s.lookahead !== 0 || + (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) { + let bstate = s.level === 0 ? deflate_stored(s, flush) : + s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s.strategy === Z_RLE ? deflate_rle(s, flush) : + configuration_table[s.level].func(s, flush); + + if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { + s.status = FINISH_STATE; + } + if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { + if (strm.avail_out === 0) { + s.last_flush = -1; + /* avoid BUF_ERROR next call, see above */ + } + return Z_OK$3; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate === BS_BLOCK_DONE) { + if (flush === Z_PARTIAL_FLUSH) { + _tr_align(s); + } + else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */ + + _tr_stored_block(s, 0, 0, false); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush === Z_FULL_FLUSH$1) { + /*** CLEAR_HASH(s); ***/ /* forget history */ + zero(s.head); // Fill with NIL (= 0); + + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK$3; + } + } + } + + if (flush !== Z_FINISH$3) { return Z_OK$3; } + if (s.wrap <= 0) { return Z_STREAM_END$3; } + + /* Write the trailer */ + if (s.wrap === 2) { + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + put_byte(s, (strm.adler >> 16) & 0xff); + put_byte(s, (strm.adler >> 24) & 0xff); + put_byte(s, strm.total_in & 0xff); + put_byte(s, (strm.total_in >> 8) & 0xff); + put_byte(s, (strm.total_in >> 16) & 0xff); + put_byte(s, (strm.total_in >> 24) & 0xff); + } + else + { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s.wrap > 0) { s.wrap = -s.wrap; } + /* write the trailer only once! */ + return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3; +}; + + +const deflateEnd = (strm) => { + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR$2; + } + + const status = strm.state.status; + + strm.state = null; + + return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3; +}; + + +/* ========================================================================= + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. + */ +const deflateSetDictionary = (strm, dictionary) => { + + let dictLength = dictionary.length; + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR$2; + } + + const s = strm.state; + const wrap = s.wrap; + + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { + return Z_STREAM_ERROR$2; + } + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); + } + + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + let tmpDict = new Uint8Array(s.w_size); + tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + const avail = strm.avail_in; + const next = strm.next_in; + const input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window(s); + while (s.lookahead >= MIN_MATCH) { + let str = s.strstart; + let n = s.lookahead - (MIN_MATCH - 1); + do { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH - 1; + fill_window(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK$3; +}; + + +var deflateInit_1 = deflateInit; +var deflateInit2_1 = deflateInit2; +var deflateReset_1 = deflateReset; +var deflateResetKeep_1 = deflateResetKeep; +var deflateSetHeader_1 = deflateSetHeader; +var deflate_2$1 = deflate$2; +var deflateEnd_1 = deflateEnd; +var deflateSetDictionary_1 = deflateSetDictionary; +var deflateInfo = 'pako deflate (from Nodeca project)'; + +/* Not implemented +module.exports.deflateBound = deflateBound; +module.exports.deflateCopy = deflateCopy; +module.exports.deflateGetDictionary = deflateGetDictionary; +module.exports.deflateParams = deflateParams; +module.exports.deflatePending = deflatePending; +module.exports.deflatePrime = deflatePrime; +module.exports.deflateTune = deflateTune; +*/ + +var deflate_1$2 = { + deflateInit: deflateInit_1, + deflateInit2: deflateInit2_1, + deflateReset: deflateReset_1, + deflateResetKeep: deflateResetKeep_1, + deflateSetHeader: deflateSetHeader_1, + deflate: deflate_2$1, + deflateEnd: deflateEnd_1, + deflateSetDictionary: deflateSetDictionary_1, + deflateInfo: deflateInfo +}; + +const _has = (obj, key) => { + return Object.prototype.hasOwnProperty.call(obj, key); +}; + +var assign = function (obj /*from1, from2, from3, ...*/) { + const sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + const source = sources.shift(); + if (!source) { continue; } + + if (typeof source !== 'object') { + throw new TypeError(source + 'must be non-object'); + } + + for (const p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + + return obj; +}; + + +// Join array of chunks to single array. +var flattenChunks = (chunks) => { + // calculate data length + let len = 0; + + for (let i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + + // join chunks + const result = new Uint8Array(len); + + for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { + let chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + + return result; +}; + +var common = { + assign: assign, + flattenChunks: flattenChunks +}; + +// String encode/decode helpers + + +// Quick check if we can use fast array to bin string conversion +// +// - apply(Array) can fail on Android 2.2 +// - apply(Uint8Array) can fail on iOS 5.1 Safari +// +let STR_APPLY_UIA_OK = true; + +try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } + + +// Table with utf8 lengths (calculated by first byte of sequence) +// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, +// because max possible codepoint is 0x10ffff +const _utf8len = new Uint8Array(256); +for (let q = 0; q < 256; q++) { + _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); +} +_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start + + +// convert string to array (typed, when possible) +var string2buf = (str) => { + if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { + return new TextEncoder().encode(str); + } + + let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + + // count binary size + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; + } + + // allocate buffer + buf = new Uint8Array(buf_len); + + // convert + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + if (c < 0x80) { + /* one byte */ + buf[i++] = c; + } else if (c < 0x800) { + /* two bytes */ + buf[i++] = 0xC0 | (c >>> 6); + buf[i++] = 0x80 | (c & 0x3f); + } else if (c < 0x10000) { + /* three bytes */ + buf[i++] = 0xE0 | (c >>> 12); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } else { + /* four bytes */ + buf[i++] = 0xf0 | (c >>> 18); + buf[i++] = 0x80 | (c >>> 12 & 0x3f); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } + } + + return buf; +}; + +// Helper +const buf2binstring = (buf, len) => { + // On Chrome, the arguments in a function call that are allowed is `65534`. + // If the length of the buffer is smaller than that, we can use this optimization, + // otherwise we will take a slower path. + if (len < 65534) { + if (buf.subarray && STR_APPLY_UIA_OK) { + return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); + } + } + + let result = ''; + for (let i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; +}; + + +// convert array to string +var buf2string = (buf, max) => { + const len = max || buf.length; + + if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { + return new TextDecoder().decode(buf.subarray(0, max)); + } + + let i, out; + + // Reserve max possible length (2 words per char) + // NB: by unknown reasons, Array is significantly faster for + // String.fromCharCode.apply than Uint16Array. + const utf16buf = new Array(len * 2); + + for (out = 0, i = 0; i < len;) { + let c = buf[i++]; + // quick process ascii + if (c < 0x80) { utf16buf[out++] = c; continue; } + + let c_len = _utf8len[c]; + // skip 5 & 6 byte codes + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + + // apply mask on first byte + c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; + // join the rest + while (c_len > 1 && i < len) { + c = (c << 6) | (buf[i++] & 0x3f); + c_len--; + } + + // terminated by end of string? + if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + + if (c < 0x10000) { + utf16buf[out++] = c; + } else { + c -= 0x10000; + utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); + utf16buf[out++] = 0xdc00 | (c & 0x3ff); + } + } + + return buf2binstring(utf16buf, out); +}; + + +// Calculate max possible position in utf8 buffer, +// that will not break sequence. If that's not possible +// - (very small limits) return max size as is. +// +// buf[] - utf8 bytes array +// max - length limit (mandatory); +var utf8border = (buf, max) => { + + max = max || buf.length; + if (max > buf.length) { max = buf.length; } + + // go back from last position, until start of sequence found + let pos = max - 1; + while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } + + // Very small and broken sequence, + // return max, because we should return something anyway. + if (pos < 0) { return max; } + + // If we came to start of buffer - that means buffer is too small, + // return max too. + if (pos === 0) { return max; } + + return (pos + _utf8len[buf[pos]] > max) ? pos : max; +}; + +var strings = { + string2buf: string2buf, + buf2string: buf2string, + utf8border: utf8border +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +function ZStream() { + /* next input byte */ + this.input = null; // JS specific, because we have no pointers + this.next_in = 0; + /* number of bytes available at input */ + this.avail_in = 0; + /* total number of input bytes read so far */ + this.total_in = 0; + /* next output byte should be put there */ + this.output = null; // JS specific, because we have no pointers + this.next_out = 0; + /* remaining free space at output */ + this.avail_out = 0; + /* total number of bytes output so far */ + this.total_out = 0; + /* last error message, NULL if no error */ + this.msg = ''/*Z_NULL*/; + /* not visible by applications */ + this.state = null; + /* best guess about the data type: binary or text */ + this.data_type = 2/*Z_UNKNOWN*/; + /* adler32 value of the uncompressed data */ + this.adler = 0; +} + +var zstream = ZStream; + +const toString$1 = Object.prototype.toString; + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + +const { + Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2, + Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, + Z_DEFAULT_COMPRESSION, + Z_DEFAULT_STRATEGY, + Z_DEFLATED: Z_DEFLATED$1 +} = constants$2; + +/* ===========================================================================*/ + + +/** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ + +/* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overridden. + **/ + +/** + * Deflate.result -> Uint8Array + * + * Compressed result, generated by default [[Deflate#onData]] + * and [[Deflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Deflate#push]] with `Z_FINISH` / `true` param). + **/ + +/** + * Deflate.err -> Number + * + * Error code after deflate finished. 0 (Z_OK) on success. + * You will not need it in real life, because deflate errors + * are possible only on wrong options or bad `onData` / `onEnd` + * custom handlers. + **/ + +/** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ + + +/** + * new Deflate(options) + * - options (Object): zlib deflate options. + * + * Creates new deflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `level` + * - `windowBits` + * - `memLevel` + * - `strategy` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw deflate + * - `gzip` (Boolean) - create gzip wrapper + * - `header` (Object) - custom header for gzip + * - `text` (Boolean) - true if compressed data believed to be text + * - `time` (Number) - modification time, unix timestamp + * - `os` (Number) - operation system code + * - `extra` (Array) - array of bytes with extra data (max 65536) + * - `name` (String) - file name (binary string) + * - `comment` (String) - comment (binary string) + * - `hcrc` (Boolean) - true if header crc should be added + * + * ##### Example: + * + * ```javascript + * const pako = require('pako') + * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * const deflate = new pako.Deflate({ level: 3}); + * + * deflate.push(chunk1, false); + * deflate.push(chunk2, true); // true -> last chunk + * + * if (deflate.err) { throw new Error(deflate.err); } + * + * console.log(deflate.result); + * ``` + **/ +function Deflate$1(options) { + this.options = common.assign({ + level: Z_DEFAULT_COMPRESSION, + method: Z_DEFLATED$1, + chunkSize: 16384, + windowBits: 15, + memLevel: 8, + strategy: Z_DEFAULT_STRATEGY + }, options || {}); + + let opt = this.options; + + if (opt.raw && (opt.windowBits > 0)) { + opt.windowBits = -opt.windowBits; + } + + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream(); + this.strm.avail_out = 0; + + let status = deflate_1$2.deflateInit2( + this.strm, + opt.level, + opt.method, + opt.windowBits, + opt.memLevel, + opt.strategy + ); + + if (status !== Z_OK$2) { + throw new Error(messages[status]); + } + + if (opt.header) { + deflate_1$2.deflateSetHeader(this.strm, opt.header); + } + + if (opt.dictionary) { + let dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings.string2buf(opt.dictionary); + } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + + status = deflate_1$2.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK$2) { + throw new Error(messages[status]); + } + + this._dict_set = true; + } +} + +/** + * Deflate#push(data[, flush_mode]) -> Boolean + * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. + * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with + * new compressed chunks. Returns `true` on success. The last data block must + * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending + * buffers and call [[Deflate#onEnd]]. + * + * On fail call [[Deflate#onEnd]] with error code and return false. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ +Deflate$1.prototype.push = function (data, flush_mode) { + const strm = this.strm; + const chunkSize = this.options.chunkSize; + let status, _flush_mode; + + if (this.ended) { return false; } + + if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; + else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1; + + // Convert data if needed + if (typeof data === 'string') { + // If we need to compress text, change encoding to utf8. + strm.input = strings.string2buf(data); + } else if (toString$1.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + for (;;) { + if (strm.avail_out === 0) { + strm.output = new Uint8Array(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + + // Make sure avail_out > 6 to avoid repeating markers + if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { + this.onData(strm.output.subarray(0, strm.next_out)); + strm.avail_out = 0; + continue; + } + + status = deflate_1$2.deflate(strm, _flush_mode); + + // Ended => flush and finish + if (status === Z_STREAM_END$2) { + if (strm.next_out > 0) { + this.onData(strm.output.subarray(0, strm.next_out)); + } + status = deflate_1$2.deflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === Z_OK$2; + } + + // Flush if out buffer full + if (strm.avail_out === 0) { + this.onData(strm.output); + continue; + } + + // Flush if requested and has data + if (_flush_mode > 0 && strm.next_out > 0) { + this.onData(strm.output.subarray(0, strm.next_out)); + strm.avail_out = 0; + continue; + } + + if (strm.avail_in === 0) break; + } + + return true; +}; + + +/** + * Deflate#onData(chunk) -> Void + * - chunk (Uint8Array): output data. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ +Deflate$1.prototype.onData = function (chunk) { + this.chunks.push(chunk); +}; + + +/** + * Deflate#onEnd(status) -> Void + * - status (Number): deflate status. 0 (Z_OK) on success, + * other if not. + * + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH). By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ +Deflate$1.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK$2) { + this.result = common.flattenChunks(this.chunks); + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; +}; + + +/** + * deflate(data[, options]) -> Uint8Array + * - data (Uint8Array|ArrayBuffer|String): input data to compress. + * - options (Object): zlib deflate options. + * + * Compress `data` with deflate algorithm and `options`. + * + * Supported options are: + * + * - level + * - windowBits + * - memLevel + * - strategy + * - dictionary + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * + * ##### Example: + * + * ```javascript + * const pako = require('pako') + * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); + * + * console.log(pako.deflate(data)); + * ``` + **/ +function deflate$1(input, options) { + const deflator = new Deflate$1(options); + + deflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg || messages[deflator.err]; } + + return deflator.result; +} + + +/** + * deflateRaw(data[, options]) -> Uint8Array + * - data (Uint8Array|ArrayBuffer|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ +function deflateRaw$1(input, options) { + options = options || {}; + options.raw = true; + return deflate$1(input, options); +} + + +/** + * gzip(data[, options]) -> Uint8Array + * - data (Uint8Array|ArrayBuffer|String): input data to compress. + * - options (Object): zlib deflate options. + * + * The same as [[deflate]], but create gzip wrapper instead of + * deflate one. + **/ +function gzip$1(input, options) { + options = options || {}; + options.gzip = true; + return deflate$1(input, options); +} + + +var Deflate_1$1 = Deflate$1; +var deflate_2 = deflate$1; +var deflateRaw_1$1 = deflateRaw$1; +var gzip_1$1 = gzip$1; + +var deflate_1$1 = { + Deflate: Deflate_1$1, + deflate: deflate_2, + deflateRaw: deflateRaw_1$1, + gzip: gzip_1$1}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +// See state defs from inflate.js +const BAD$1 = 16209; /* got a data error -- remain here until reset */ +const TYPE$1 = 16191; /* i: waiting for type bits, including last-flag bit */ + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state.mode === LEN + strm.avail_in >= 6 + strm.avail_out >= 258 + start >= strm.avail_out + state.bits < 8 + + On return, state.mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm.avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm.avail_out >= 258 for each loop to avoid checking for + output space. + */ +var inffast = function inflate_fast(strm, start) { + let _in; /* local strm.input */ + let last; /* have enough input while in < last */ + let _out; /* local strm.output */ + let beg; /* inflate()'s initial strm.output */ + let end; /* while out < end, enough space available */ +//#ifdef INFLATE_STRICT + let dmax; /* maximum distance from zlib header */ +//#endif + let wsize; /* window size or zero if not using window */ + let whave; /* valid bytes in the window */ + let wnext; /* window write index */ + // Use `s_window` instead `window`, avoid conflict with instrumentation tools + let s_window; /* allocated sliding window, if wsize != 0 */ + let hold; /* local strm.hold */ + let bits; /* local strm.bits */ + let lcode; /* local strm.lencode */ + let dcode; /* local strm.distcode */ + let lmask; /* mask for first level of length codes */ + let dmask; /* mask for first level of distance codes */ + let here; /* retrieved table entry */ + let op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + let len; /* match length, unused bytes */ + let dist; /* match distance */ + let from; /* where to copy match from */ + let from_source; + + + let input, output; // JS specific, because we have no pointers + + /* copy state to local variables */ + const state = strm.state; + //here = state.here; + _in = strm.next_in; + input = strm.input; + last = _in + (strm.avail_in - 5); + _out = strm.next_out; + output = strm.output; + beg = _out - (start - strm.avail_out); + end = _out + (strm.avail_out - 257); +//#ifdef INFLATE_STRICT + dmax = state.dmax; +//#endif + wsize = state.wsize; + whave = state.whave; + wnext = state.wnext; + s_window = state.window; + hold = state.hold; + bits = state.bits; + lcode = state.lencode; + dcode = state.distcode; + lmask = (1 << state.lenbits) - 1; + dmask = (1 << state.distbits) - 1; + + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + + top: + do { + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + + here = lcode[hold & lmask]; + + dolen: + for (;;) { // Goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + if (op === 0) { /* literal */ + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + output[_out++] = here & 0xffff/*here.val*/; + } + else if (op & 16) { /* length base */ + len = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + len += hold & ((1 << op) - 1); + hold >>>= op; + bits -= op; + } + //Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += input[_in++] << bits; + bits += 8; + hold += input[_in++] << bits; + bits += 8; + } + here = dcode[hold & dmask]; + + dodist: + for (;;) { // goto emulation + op = here >>> 24/*here.bits*/; + hold >>>= op; + bits -= op; + op = (here >>> 16) & 0xff/*here.op*/; + + if (op & 16) { /* distance base */ + dist = here & 0xffff/*here.val*/; + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + if (bits < op) { + hold += input[_in++] << bits; + bits += 8; + } + } + dist += hold & ((1 << op) - 1); +//#ifdef INFLATE_STRICT + if (dist > dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$1; + break top; + } +//#endif + hold >>>= op; + bits -= op; + //Tracevv((stderr, "inflate: distance %u\n", dist)); + op = _out - beg; /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD$1; + break top; + } + +// (!) This block is disabled in zlib defaults, +// don't enable it for binary compatibility +//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +// if (len <= op - whave) { +// do { +// output[_out++] = 0; +// } while (--len); +// continue top; +// } +// len -= op - whave; +// do { +// output[_out++] = 0; +// } while (--op > whave); +// if (op === 0) { +// from = _out - dist; +// do { +// output[_out++] = output[from++]; +// } while (--len); +// continue top; +// } +//#endif + } + from = 0; // window index + from_source = s_window; + if (wnext === 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; + if (op < len) { /* some from end of window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = 0; + if (wnext < len) { /* some from start of window */ + op = wnext; + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + } + else { /* contiguous in window */ + from += wnext - op; + if (op < len) { /* some from window */ + len -= op; + do { + output[_out++] = s_window[from++]; + } while (--op); + from = _out - dist; /* rest from output */ + from_source = output; + } + } + while (len > 2) { + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + output[_out++] = from_source[from++]; + len -= 3; + } + if (len) { + output[_out++] = from_source[from++]; + if (len > 1) { + output[_out++] = from_source[from++]; + } + } + } + else { + from = _out - dist; /* copy direct from output */ + do { /* minimum length is three */ + output[_out++] = output[from++]; + output[_out++] = output[from++]; + output[_out++] = output[from++]; + len -= 3; + } while (len > 2); + if (len) { + output[_out++] = output[from++]; + if (len > 1) { + output[_out++] = output[from++]; + } + } + } + } + else if ((op & 64) === 0) { /* 2nd level distance code */ + here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dodist; + } + else { + strm.msg = 'invalid distance code'; + state.mode = BAD$1; + break top; + } + + break; // need to emulate goto via "continue" + } + } + else if ((op & 64) === 0) { /* 2nd level length code */ + here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))]; + continue dolen; + } + else if (op & 32) { /* end-of-block */ + //Tracevv((stderr, "inflate: end of block\n")); + state.mode = TYPE$1; + break top; + } + else { + strm.msg = 'invalid literal/length code'; + state.mode = BAD$1; + break top; + } + + break; // need to emulate goto via "continue" + } + } while (_in < last && _out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + _in -= len; + bits -= len << 3; + hold &= (1 << bits) - 1; + + /* update state and return */ + strm.next_in = _in; + strm.next_out = _out; + strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last)); + strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end)); + state.hold = hold; + state.bits = bits; + return; +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +const MAXBITS = 15; +const ENOUGH_LENS$1 = 852; +const ENOUGH_DISTS$1 = 592; +//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + +const CODES$1 = 0; +const LENS$1 = 1; +const DISTS$1 = 2; + +const lbase = new Uint16Array([ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 +]); + +const lext = new Uint8Array([ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 +]); + +const dbase = new Uint16Array([ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 +]); + +const dext = new Uint8Array([ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 +]); + +const inflate_table = (type, lens, lens_index, codes, table, table_index, work, opts) => +{ + const bits = opts.bits; + //here = opts.here; /* table entry for duplication */ + + let len = 0; /* a code's length in bits */ + let sym = 0; /* index of code symbols */ + let min = 0, max = 0; /* minimum and maximum code lengths */ + let root = 0; /* number of index bits for root table */ + let curr = 0; /* number of index bits for current table */ + let drop = 0; /* code bits to drop for sub-table */ + let left = 0; /* number of prefix codes available */ + let used = 0; /* code entries in table used */ + let huff = 0; /* Huffman code */ + let incr; /* for incrementing code, index */ + let fill; /* index for replicating entries */ + let low; /* low bits for current root entry */ + let mask; /* mask for low root bits */ + let next; /* next available space in table */ + let base = null; /* base value table to use */ +// let shoextra; /* extra bits table to use */ + let match; /* use base and extra for symbol >= match */ + const count = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ + const offs = new Uint16Array(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ + let extra = null; + + let here_bits, here_op, here_val; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES$1 || max !== 1)) { + return -1; /* incomplete set */ + } + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES$1) { + base = extra = work; /* dummy value--not used */ + match = 20; + + } else if (type === LENS$1) { + base = lbase; + extra = lext; + match = 257; + + } else { /* DISTS */ + base = dbase; + extra = dext; + match = 0; + } + + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type === LENS$1 && used > ENOUGH_LENS$1) || + (type === DISTS$1 && used > ENOUGH_DISTS$1)) { + return 1; + } + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + here_bits = len - drop; + if (work[sym] + 1 < match) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] >= match) { + here_op = extra[work[sym] - match]; + here_val = base[work[sym] - match]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); + + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1 << curr; + if ((type === LENS$1 && used > ENOUGH_LENS$1) || + (type === DISTS$1 && used > ENOUGH_DISTS$1)) { + return 1; + } + + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } + + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; +}; + + +var inftrees = inflate_table; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + + + + + + +const CODES = 0; +const LENS = 1; +const DISTS = 2; + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + +const { + Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES, + Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR, + Z_DEFLATED +} = constants$2; + + +/* STATES ====================================================================*/ +/* ===========================================================================*/ + + +const HEAD = 16180; /* i: waiting for magic header */ +const FLAGS = 16181; /* i: waiting for method and flags (gzip) */ +const TIME = 16182; /* i: waiting for modification time (gzip) */ +const OS = 16183; /* i: waiting for extra flags and operating system (gzip) */ +const EXLEN = 16184; /* i: waiting for extra length (gzip) */ +const EXTRA = 16185; /* i: waiting for extra bytes (gzip) */ +const NAME = 16186; /* i: waiting for end of file name (gzip) */ +const COMMENT = 16187; /* i: waiting for end of comment (gzip) */ +const HCRC = 16188; /* i: waiting for header crc (gzip) */ +const DICTID = 16189; /* i: waiting for dictionary check value */ +const DICT = 16190; /* waiting for inflateSetDictionary() call */ +const TYPE = 16191; /* i: waiting for type bits, including last-flag bit */ +const TYPEDO = 16192; /* i: same, but skip check to exit inflate on new block */ +const STORED = 16193; /* i: waiting for stored size (length and complement) */ +const COPY_ = 16194; /* i/o: same as COPY below, but only first time in */ +const COPY = 16195; /* i/o: waiting for input or output to copy stored block */ +const TABLE = 16196; /* i: waiting for dynamic block table lengths */ +const LENLENS = 16197; /* i: waiting for code length code lengths */ +const CODELENS = 16198; /* i: waiting for length/lit and distance code lengths */ +const LEN_ = 16199; /* i: same as LEN below, but only first time in */ +const LEN = 16200; /* i: waiting for length/lit/eob code */ +const LENEXT = 16201; /* i: waiting for length extra bits */ +const DIST = 16202; /* i: waiting for distance code */ +const DISTEXT = 16203; /* i: waiting for distance extra bits */ +const MATCH = 16204; /* o: waiting for output space to copy string */ +const LIT = 16205; /* o: waiting for output space to write literal */ +const CHECK = 16206; /* i: waiting for 32-bit check value */ +const LENGTH = 16207; /* i: waiting for 32-bit length (gzip) */ +const DONE = 16208; /* finished check, done -- remain here until reset */ +const BAD = 16209; /* got a data error -- remain here until reset */ +const MEM = 16210; /* got an inflate() memory error -- remain here until reset */ +const SYNC = 16211; /* looking for synchronization bytes to restart inflate() */ + +/* ===========================================================================*/ + + + +const ENOUGH_LENS = 852; +const ENOUGH_DISTS = 592; +//const ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + +const MAX_WBITS = 15; +/* 32K LZ77 window */ +const DEF_WBITS = MAX_WBITS; + + +const zswap32 = (q) => { + + return (((q >>> 24) & 0xff) + + ((q >>> 8) & 0xff00) + + ((q & 0xff00) << 8) + + ((q & 0xff) << 24)); +}; + + +function InflateState() { + this.strm = null; /* pointer back to this zlib stream */ + this.mode = 0; /* current inflate mode */ + this.last = false; /* true if processing last block */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip, + bit 2 true to validate check value */ + this.havedict = false; /* true if dictionary provided */ + this.flags = 0; /* gzip header method and flags (0 if zlib), or + -1 if raw or no header yet */ + this.dmax = 0; /* zlib header max distance (INFLATE_STRICT) */ + this.check = 0; /* protected copy of check value */ + this.total = 0; /* protected copy of output count */ + // TODO: may be {} + this.head = null; /* where to save gzip header information */ + + /* sliding window */ + this.wbits = 0; /* log base 2 of requested window size */ + this.wsize = 0; /* window size or zero if not using window */ + this.whave = 0; /* valid bytes in the window */ + this.wnext = 0; /* window write index */ + this.window = null; /* allocated sliding window, if needed */ + + /* bit accumulator */ + this.hold = 0; /* input bit accumulator */ + this.bits = 0; /* number of bits in "in" */ + + /* for string and stored block copying */ + this.length = 0; /* literal or length of data to copy */ + this.offset = 0; /* distance back to copy string from */ + + /* for table and code decoding */ + this.extra = 0; /* extra bits needed */ + + /* fixed and dynamic code tables */ + this.lencode = null; /* starting table for length/literal codes */ + this.distcode = null; /* starting table for distance codes */ + this.lenbits = 0; /* index bits for lencode */ + this.distbits = 0; /* index bits for distcode */ + + /* dynamic table building */ + this.ncode = 0; /* number of code length code lengths */ + this.nlen = 0; /* number of length code lengths */ + this.ndist = 0; /* number of distance code lengths */ + this.have = 0; /* number of code lengths in lens[] */ + this.next = null; /* next available space in codes[] */ + + this.lens = new Uint16Array(320); /* temporary storage for code lengths */ + this.work = new Uint16Array(288); /* work area for code table building */ + + /* + because we don't have pointers in js, we use lencode and distcode directly + as buffers so we don't need codes + */ + //this.codes = new Int32Array(ENOUGH); /* space for code tables */ + this.lendyn = null; /* dynamic table for length/literal codes (JS specific) */ + this.distdyn = null; /* dynamic table for distance codes (JS specific) */ + this.sane = 0; /* if false, allow invalid distance too far */ + this.back = 0; /* bits back of last unprocessed length/lit */ + this.was = 0; /* initial length of match */ +} + + +const inflateStateCheck = (strm) => { + + if (!strm) { + return 1; + } + const state = strm.state; + if (!state || state.strm !== strm || + state.mode < HEAD || state.mode > SYNC) { + return 1; + } + return 0; +}; + + +const inflateResetKeep = (strm) => { + + if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } + const state = strm.state; + strm.total_in = strm.total_out = state.total = 0; + strm.msg = ''; /*Z_NULL*/ + if (state.wrap) { /* to support ill-conceived Java test suite */ + strm.adler = state.wrap & 1; + } + state.mode = HEAD; + state.last = 0; + state.havedict = 0; + state.flags = -1; + state.dmax = 32768; + state.head = null/*Z_NULL*/; + state.hold = 0; + state.bits = 0; + //state.lencode = state.distcode = state.next = state.codes; + state.lencode = state.lendyn = new Int32Array(ENOUGH_LENS); + state.distcode = state.distdyn = new Int32Array(ENOUGH_DISTS); + + state.sane = 1; + state.back = -1; + //Tracev((stderr, "inflate: reset\n")); + return Z_OK$1; +}; + + +const inflateReset = (strm) => { + + if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } + const state = strm.state; + state.wsize = 0; + state.whave = 0; + state.wnext = 0; + return inflateResetKeep(strm); + +}; + + +const inflateReset2 = (strm, windowBits) => { + let wrap; + + /* get the state */ + if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } + const state = strm.state; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 5; + if (windowBits < 48) { + windowBits &= 15; + } + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) { + return Z_STREAM_ERROR$1; + } + if (state.window !== null && state.wbits !== windowBits) { + state.window = null; + } + + /* update state and reset the rest of it */ + state.wrap = wrap; + state.wbits = windowBits; + return inflateReset(strm); +}; + + +const inflateInit2 = (strm, windowBits) => { + + if (!strm) { return Z_STREAM_ERROR$1; } + //strm.msg = Z_NULL; /* in case we return an error */ + + const state = new InflateState(); + + //if (state === Z_NULL) return Z_MEM_ERROR; + //Tracev((stderr, "inflate: allocated\n")); + strm.state = state; + state.strm = strm; + state.window = null/*Z_NULL*/; + state.mode = HEAD; /* to pass state test in inflateReset2() */ + const ret = inflateReset2(strm, windowBits); + if (ret !== Z_OK$1) { + strm.state = null/*Z_NULL*/; + } + return ret; +}; + + +const inflateInit = (strm) => { + + return inflateInit2(strm, DEF_WBITS); +}; + + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +let virgin = true; + +let lenfix, distfix; // We have no pointers in JS, so keep tables separate + + +const fixedtables = (state) => { + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + lenfix = new Int32Array(512); + distfix = new Int32Array(32); + + /* literal/length table */ + let sym = 0; + while (sym < 144) { state.lens[sym++] = 8; } + while (sym < 256) { state.lens[sym++] = 9; } + while (sym < 280) { state.lens[sym++] = 7; } + while (sym < 288) { state.lens[sym++] = 8; } + + inftrees(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); + + /* distance table */ + sym = 0; + while (sym < 32) { state.lens[sym++] = 5; } + + inftrees(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); + + /* do this just once */ + virgin = false; + } + + state.lencode = lenfix; + state.lenbits = 9; + state.distcode = distfix; + state.distbits = 5; +}; + + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +const updatewindow = (strm, src, end, copy) => { + + let dist; + const state = strm.state; + + /* if it hasn't been done already, allocate space for the window */ + if (state.window === null) { + state.wsize = 1 << state.wbits; + state.wnext = 0; + state.whave = 0; + + state.window = new Uint8Array(state.wsize); + } + + /* copy state->wsize or less output bytes into the circular window */ + if (copy >= state.wsize) { + state.window.set(src.subarray(end - state.wsize, end), 0); + state.wnext = 0; + state.whave = state.wsize; + } + else { + dist = state.wsize - state.wnext; + if (dist > copy) { + dist = copy; + } + //zmemcpy(state->window + state->wnext, end - copy, dist); + state.window.set(src.subarray(end - copy, end - copy + dist), state.wnext); + copy -= dist; + if (copy) { + //zmemcpy(state->window, end - copy, copy); + state.window.set(src.subarray(end - copy, end), 0); + state.wnext = copy; + state.whave = state.wsize; + } + else { + state.wnext += dist; + if (state.wnext === state.wsize) { state.wnext = 0; } + if (state.whave < state.wsize) { state.whave += dist; } + } + } + return 0; +}; + + +const inflate$2 = (strm, flush) => { + + let state; + let input, output; // input/output buffers + let next; /* next input INDEX */ + let put; /* next output INDEX */ + let have, left; /* available input and output */ + let hold; /* bit buffer */ + let bits; /* bits in bit buffer */ + let _in, _out; /* save starting available input and output */ + let copy; /* number of stored or match bytes to copy */ + let from; /* where to copy match bytes from */ + let from_source; + let here = 0; /* current decoding table entry */ + let here_bits, here_op, here_val; // paked "here" denormalized (JS specific) + //let last; /* parent table entry */ + let last_bits, last_op, last_val; // paked "last" denormalized (JS specific) + let len; /* length to copy for repeats, bits to drop */ + let ret; /* return code */ + const hbuf = new Uint8Array(4); /* buffer for gzip header crc calculation */ + let opts; + + let n; // temporary variable for NEED_BITS + + const order = /* permutation of code lengths */ + new Uint8Array([ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]); + + + if (inflateStateCheck(strm) || !strm.output || + (!strm.input && strm.avail_in !== 0)) { + return Z_STREAM_ERROR$1; + } + + state = strm.state; + if (state.mode === TYPE) { state.mode = TYPEDO; } /* skip check */ + + + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + _in = have; + _out = left; + ret = Z_OK$1; + + inf_leave: // goto emulation + for (;;) { + switch (state.mode) { + case HEAD: + if (state.wrap === 0) { + state.mode = TYPEDO; + break; + } + //=== NEEDBITS(16); + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 2) && hold === 0x8b1f) { /* gzip header */ + if (state.wbits === 0) { + state.wbits = 15; + } + state.check = 0/*crc32(0L, Z_NULL, 0)*/; + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = FLAGS; + break; + } + if (state.head) { + state.head.done = false; + } + if (!(state.wrap & 1) || /* check if zlib header allowed */ + (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) { + strm.msg = 'incorrect header check'; + state.mode = BAD; + break; + } + if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) { + strm.msg = 'unknown compression method'; + state.mode = BAD; + break; + } + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// + len = (hold & 0x0f)/*BITS(4)*/ + 8; + if (state.wbits === 0) { + state.wbits = len; + } + if (len > 15 || len > state.wbits) { + strm.msg = 'invalid window size'; + state.mode = BAD; + break; + } + + // !!! pako patch. Force use `options.windowBits` if passed. + // Required to always use max window size by default. + state.dmax = 1 << state.wbits; + //state.dmax = 1 << len; + + state.flags = 0; /* indicate zlib header */ + //Tracev((stderr, "inflate: zlib header ok\n")); + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = hold & 0x200 ? DICTID : TYPE; + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + break; + case FLAGS: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.flags = hold; + if ((state.flags & 0xff) !== Z_DEFLATED) { + strm.msg = 'unknown compression method'; + state.mode = BAD; + break; + } + if (state.flags & 0xe000) { + strm.msg = 'unknown header flags set'; + state.mode = BAD; + break; + } + if (state.head) { + state.head.text = ((hold >> 8) & 1); + } + if ((state.flags & 0x0200) && (state.wrap & 4)) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = TIME; + /* falls through */ + case TIME: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.time = hold; + } + if ((state.flags & 0x0200) && (state.wrap & 4)) { + //=== CRC4(state.check, hold) + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + hbuf[2] = (hold >>> 16) & 0xff; + hbuf[3] = (hold >>> 24) & 0xff; + state.check = crc32_1(state.check, hbuf, 4, 0); + //=== + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = OS; + /* falls through */ + case OS: + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if (state.head) { + state.head.xflags = (hold & 0xff); + state.head.os = (hold >> 8); + } + if ((state.flags & 0x0200) && (state.wrap & 4)) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = EXLEN; + /* falls through */ + case EXLEN: + if (state.flags & 0x0400) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length = hold; + if (state.head) { + state.head.extra_len = hold; + } + if ((state.flags & 0x0200) && (state.wrap & 4)) { + //=== CRC2(state.check, hold); + hbuf[0] = hold & 0xff; + hbuf[1] = (hold >>> 8) & 0xff; + state.check = crc32_1(state.check, hbuf, 2, 0); + //===// + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + else if (state.head) { + state.head.extra = null/*Z_NULL*/; + } + state.mode = EXTRA; + /* falls through */ + case EXTRA: + if (state.flags & 0x0400) { + copy = state.length; + if (copy > have) { copy = have; } + if (copy) { + if (state.head) { + len = state.head.extra_len - state.length; + if (!state.head.extra) { + // Use untyped array for more convenient processing later + state.head.extra = new Uint8Array(state.head.extra_len); + } + state.head.extra.set( + input.subarray( + next, + // extra field is limited to 65536 bytes + // - no need for additional size check + next + copy + ), + /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/ + len + ); + //zmemcpy(state.head.extra + len, next, + // len + copy > state.head.extra_max ? + // state.head.extra_max - len : copy); + } + if ((state.flags & 0x0200) && (state.wrap & 4)) { + state.check = crc32_1(state.check, input, copy, next); + } + have -= copy; + next += copy; + state.length -= copy; + } + if (state.length) { break inf_leave; } + } + state.length = 0; + state.mode = NAME; + /* falls through */ + case NAME: + if (state.flags & 0x0800) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + // TODO: 2 or 1 bytes? + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.name_max*/)) { + state.head.name += String.fromCharCode(len); + } + } while (len && copy < have); + + if ((state.flags & 0x0200) && (state.wrap & 4)) { + state.check = crc32_1(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.name = null; + } + state.length = 0; + state.mode = COMMENT; + /* falls through */ + case COMMENT: + if (state.flags & 0x1000) { + if (have === 0) { break inf_leave; } + copy = 0; + do { + len = input[next + copy++]; + /* use constant limit because in js we should not preallocate memory */ + if (state.head && len && + (state.length < 65536 /*state.head.comm_max*/)) { + state.head.comment += String.fromCharCode(len); + } + } while (len && copy < have); + if ((state.flags & 0x0200) && (state.wrap & 4)) { + state.check = crc32_1(state.check, input, copy, next); + } + have -= copy; + next += copy; + if (len) { break inf_leave; } + } + else if (state.head) { + state.head.comment = null; + } + state.mode = HCRC; + /* falls through */ + case HCRC: + if (state.flags & 0x0200) { + //=== NEEDBITS(16); */ + while (bits < 16) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 4) && hold !== (state.check & 0xffff)) { + strm.msg = 'header crc mismatch'; + state.mode = BAD; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + } + if (state.head) { + state.head.hcrc = ((state.flags >> 9) & 1); + state.head.done = true; + } + strm.adler = state.check = 0; + state.mode = TYPE; + break; + case DICTID: + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + strm.adler = state.check = zswap32(hold); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = DICT; + /* falls through */ + case DICT: + if (state.havedict === 0) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + return Z_NEED_DICT$1; + } + strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/; + state.mode = TYPE; + /* falls through */ + case TYPE: + if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; } + /* falls through */ + case TYPEDO: + if (state.last) { + //--- BYTEBITS() ---// + hold >>>= bits & 7; + bits -= bits & 7; + //---// + state.mode = CHECK; + break; + } + //=== NEEDBITS(3); */ + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.last = (hold & 0x01)/*BITS(1)*/; + //--- DROPBITS(1) ---// + hold >>>= 1; + bits -= 1; + //---// + + switch ((hold & 0x03)/*BITS(2)*/) { + case 0: /* stored block */ + //Tracev((stderr, "inflate: stored block%s\n", + // state.last ? " (last)" : "")); + state.mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + //Tracev((stderr, "inflate: fixed codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = LEN_; /* decode codes */ + if (flush === Z_TREES) { + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break inf_leave; + } + break; + case 2: /* dynamic block */ + //Tracev((stderr, "inflate: dynamic codes block%s\n", + // state.last ? " (last)" : "")); + state.mode = TABLE; + break; + case 3: + strm.msg = 'invalid block type'; + state.mode = BAD; + } + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + break; + case STORED: + //--- BYTEBITS() ---// /* go to byte boundary */ + hold >>>= bits & 7; + bits -= bits & 7; + //---// + //=== NEEDBITS(32); */ + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) { + strm.msg = 'invalid stored block lengths'; + state.mode = BAD; + break; + } + state.length = hold & 0xffff; + //Tracev((stderr, "inflate: stored length %u\n", + // state.length)); + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + state.mode = COPY_; + if (flush === Z_TREES) { break inf_leave; } + /* falls through */ + case COPY_: + state.mode = COPY; + /* falls through */ + case COPY: + copy = state.length; + if (copy) { + if (copy > have) { copy = have; } + if (copy > left) { copy = left; } + if (copy === 0) { break inf_leave; } + //--- zmemcpy(put, next, copy); --- + output.set(input.subarray(next, next + copy), put); + //---// + have -= copy; + next += copy; + left -= copy; + put += copy; + state.length -= copy; + break; + } + //Tracev((stderr, "inflate: stored end\n")); + state.mode = TYPE; + break; + case TABLE: + //=== NEEDBITS(14); */ + while (bits < 14) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1; + //--- DROPBITS(5) ---// + hold >>>= 5; + bits -= 5; + //---// + state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4; + //--- DROPBITS(4) ---// + hold >>>= 4; + bits -= 4; + //---// +//#ifndef PKZIP_BUG_WORKAROUND + if (state.nlen > 286 || state.ndist > 30) { + strm.msg = 'too many length or distance symbols'; + state.mode = BAD; + break; + } +//#endif + //Tracev((stderr, "inflate: table sizes ok\n")); + state.have = 0; + state.mode = LENLENS; + /* falls through */ + case LENLENS: + while (state.have < state.ncode) { + //=== NEEDBITS(3); + while (bits < 3) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.lens[order[state.have++]] = (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + while (state.have < 19) { + state.lens[order[state.have++]] = 0; + } + // We have separate tables & no pointers. 2 commented lines below not needed. + //state.next = state.codes; + //state.lencode = state.next; + // Switch to use dynamic table + state.lencode = state.lendyn; + state.lenbits = 7; + + opts = { bits: state.lenbits }; + ret = inftrees(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); + state.lenbits = opts.bits; + + if (ret) { + strm.msg = 'invalid code lengths set'; + state.mode = BAD; + break; + } + //Tracev((stderr, "inflate: code lengths ok\n")); + state.have = 0; + state.mode = CODELENS; + /* falls through */ + case CODELENS: + while (state.have < state.nlen + state.ndist) { + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_val < 16) { + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.lens[state.have++] = here_val; + } + else { + if (here_val === 16) { + //=== NEEDBITS(here.bits + 2); + n = here_bits + 2; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + if (state.have === 0) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD; + break; + } + len = state.lens[state.have - 1]; + copy = 3 + (hold & 0x03);//BITS(2); + //--- DROPBITS(2) ---// + hold >>>= 2; + bits -= 2; + //---// + } + else if (here_val === 17) { + //=== NEEDBITS(here.bits + 3); + n = here_bits + 3; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 3 + (hold & 0x07);//BITS(3); + //--- DROPBITS(3) ---// + hold >>>= 3; + bits -= 3; + //---// + } + else { + //=== NEEDBITS(here.bits + 7); + n = here_bits + 7; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + len = 0; + copy = 11 + (hold & 0x7f);//BITS(7); + //--- DROPBITS(7) ---// + hold >>>= 7; + bits -= 7; + //---// + } + if (state.have + copy > state.nlen + state.ndist) { + strm.msg = 'invalid bit length repeat'; + state.mode = BAD; + break; + } + while (copy--) { + state.lens[state.have++] = len; + } + } + } + + /* handle error breaks in while */ + if (state.mode === BAD) { break; } + + /* check for end-of-block code (better have one) */ + if (state.lens[256] === 0) { + strm.msg = 'invalid code -- missing end-of-block'; + state.mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ + state.lenbits = 9; + + opts = { bits: state.lenbits }; + ret = inftrees(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.lenbits = opts.bits; + // state.lencode = state.next; + + if (ret) { + strm.msg = 'invalid literal/lengths set'; + state.mode = BAD; + break; + } + + state.distbits = 6; + //state.distcode.copy(state.codes); + // Switch to use dynamic table + state.distcode = state.distdyn; + opts = { bits: state.distbits }; + ret = inftrees(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); + // We have separate tables & no pointers. 2 commented lines below not needed. + // state.next_index = opts.table_index; + state.distbits = opts.bits; + // state.distcode = state.next; + + if (ret) { + strm.msg = 'invalid distances set'; + state.mode = BAD; + break; + } + //Tracev((stderr, 'inflate: codes ok\n')); + state.mode = LEN_; + if (flush === Z_TREES) { break inf_leave; } + /* falls through */ + case LEN_: + state.mode = LEN; + /* falls through */ + case LEN: + if (have >= 6 && left >= 258) { + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + inffast(strm, _out); + //--- LOAD() --- + put = strm.next_out; + output = strm.output; + left = strm.avail_out; + next = strm.next_in; + input = strm.input; + have = strm.avail_in; + hold = state.hold; + bits = state.bits; + //--- + + if (state.mode === TYPE) { + state.back = -1; + } + break; + } + state.back = 0; + for (;;) { + here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if (here_bits <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if (here_op && (here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.lencode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + state.length = here_val; + if (here_op === 0) { + //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? + // "inflate: literal '%c'\n" : + // "inflate: literal 0x%02x\n", here.val)); + state.mode = LIT; + break; + } + if (here_op & 32) { + //Tracevv((stderr, "inflate: end of block\n")); + state.back = -1; + state.mode = TYPE; + break; + } + if (here_op & 64) { + strm.msg = 'invalid literal/length code'; + state.mode = BAD; + break; + } + state.extra = here_op & 15; + state.mode = LENEXT; + /* falls through */ + case LENEXT: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } + //Tracevv((stderr, "inflate: length %u\n", state.length)); + state.was = state.length; + state.mode = DIST; + /* falls through */ + case DIST: + for (;;) { + here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + if ((here_op & 0xf0) === 0) { + last_bits = here_bits; + last_op = here_op; + last_val = here_val; + for (;;) { + here = state.distcode[last_val + + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + here_bits = here >>> 24; + here_op = (here >>> 16) & 0xff; + here_val = here & 0xffff; + + if ((last_bits + here_bits) <= bits) { break; } + //--- PULLBYTE() ---// + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + //---// + } + //--- DROPBITS(last.bits) ---// + hold >>>= last_bits; + bits -= last_bits; + //---// + state.back += last_bits; + } + //--- DROPBITS(here.bits) ---// + hold >>>= here_bits; + bits -= here_bits; + //---// + state.back += here_bits; + if (here_op & 64) { + strm.msg = 'invalid distance code'; + state.mode = BAD; + break; + } + state.offset = here_val; + state.extra = (here_op) & 15; + state.mode = DISTEXT; + /* falls through */ + case DISTEXT: + if (state.extra) { + //=== NEEDBITS(state.extra); + n = state.extra; + while (bits < n) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; + //--- DROPBITS(state.extra) ---// + hold >>>= state.extra; + bits -= state.extra; + //---// + state.back += state.extra; + } +//#ifdef INFLATE_STRICT + if (state.offset > state.dmax) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break; + } +//#endif + //Tracevv((stderr, "inflate: distance %u\n", state.offset)); + state.mode = MATCH; + /* falls through */ + case MATCH: + if (left === 0) { break inf_leave; } + copy = _out - left; + if (state.offset > copy) { /* copy from window */ + copy = state.offset - copy; + if (copy > state.whave) { + if (state.sane) { + strm.msg = 'invalid distance too far back'; + state.mode = BAD; + break; + } +// (!) This block is disabled in zlib defaults, +// don't enable it for binary compatibility +//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR +// Trace((stderr, "inflate.c too far\n")); +// copy -= state.whave; +// if (copy > state.length) { copy = state.length; } +// if (copy > left) { copy = left; } +// left -= copy; +// state.length -= copy; +// do { +// output[put++] = 0; +// } while (--copy); +// if (state.length === 0) { state.mode = LEN; } +// break; +//#endif + } + if (copy > state.wnext) { + copy -= state.wnext; + from = state.wsize - copy; + } + else { + from = state.wnext - copy; + } + if (copy > state.length) { copy = state.length; } + from_source = state.window; + } + else { /* copy from output */ + from_source = output; + from = put - state.offset; + copy = state.length; + } + if (copy > left) { copy = left; } + left -= copy; + state.length -= copy; + do { + output[put++] = from_source[from++]; + } while (--copy); + if (state.length === 0) { state.mode = LEN; } + break; + case LIT: + if (left === 0) { break inf_leave; } + output[put++] = state.length; + left--; + state.mode = LEN; + break; + case CHECK: + if (state.wrap) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + // Use '|' instead of '+' to make sure that result is signed + hold |= input[next++] << bits; + bits += 8; + } + //===// + _out -= left; + strm.total_out += _out; + state.total += _out; + if ((state.wrap & 4) && _out) { + strm.adler = state.check = + /*UPDATE_CHECK(state.check, put - _out, _out);*/ + (state.flags ? crc32_1(state.check, output, _out, put - _out) : adler32_1(state.check, output, _out, put - _out)); + + } + _out = left; + // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too + if ((state.wrap & 4) && (state.flags ? hold : zswap32(hold)) !== state.check) { + strm.msg = 'incorrect data check'; + state.mode = BAD; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: check matches trailer\n")); + } + state.mode = LENGTH; + /* falls through */ + case LENGTH: + if (state.wrap && state.flags) { + //=== NEEDBITS(32); + while (bits < 32) { + if (have === 0) { break inf_leave; } + have--; + hold += input[next++] << bits; + bits += 8; + } + //===// + if ((state.wrap & 4) && hold !== (state.total & 0xffffffff)) { + strm.msg = 'incorrect length check'; + state.mode = BAD; + break; + } + //=== INITBITS(); + hold = 0; + bits = 0; + //===// + //Tracev((stderr, "inflate: length matches trailer\n")); + } + state.mode = DONE; + /* falls through */ + case DONE: + ret = Z_STREAM_END$1; + break inf_leave; + case BAD: + ret = Z_DATA_ERROR$1; + break inf_leave; + case MEM: + return Z_MEM_ERROR$1; + case SYNC: + /* falls through */ + default: + return Z_STREAM_ERROR$1; + } + } + + // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && + (state.mode < CHECK || flush !== Z_FINISH$1))) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) ; + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if ((state.wrap & 4) && _out) { + strm.adler = state.check = /*UPDATE_CHECK(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32_1(state.check, output, _out, strm.next_out - _out) : adler32_1(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE ? 128 : 0) + + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) { + ret = Z_BUF_ERROR; + } + return ret; +}; + + +const inflateEnd = (strm) => { + + if (inflateStateCheck(strm)) { + return Z_STREAM_ERROR$1; + } + + let state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK$1; +}; + + +const inflateGetHeader = (strm, head) => { + + /* check state */ + if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } + const state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR$1; } + + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK$1; +}; + + +const inflateSetDictionary = (strm, dictionary) => { + const dictLength = dictionary.length; + + let state; + let dictid; + let ret; + + /* check state */ + if (inflateStateCheck(strm)) { return Z_STREAM_ERROR$1; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR$1; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32_1(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR$1; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR$1; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK$1; +}; + + +var inflateReset_1 = inflateReset; +var inflateReset2_1 = inflateReset2; +var inflateResetKeep_1 = inflateResetKeep; +var inflateInit_1 = inflateInit; +var inflateInit2_1 = inflateInit2; +var inflate_2$1 = inflate$2; +var inflateEnd_1 = inflateEnd; +var inflateGetHeader_1 = inflateGetHeader; +var inflateSetDictionary_1 = inflateSetDictionary; +var inflateInfo = 'pako inflate (from Nodeca project)'; + +/* Not implemented +module.exports.inflateCodesUsed = inflateCodesUsed; +module.exports.inflateCopy = inflateCopy; +module.exports.inflateGetDictionary = inflateGetDictionary; +module.exports.inflateMark = inflateMark; +module.exports.inflatePrime = inflatePrime; +module.exports.inflateSync = inflateSync; +module.exports.inflateSyncPoint = inflateSyncPoint; +module.exports.inflateUndermine = inflateUndermine; +module.exports.inflateValidate = inflateValidate; +*/ + +var inflate_1$2 = { + inflateReset: inflateReset_1, + inflateReset2: inflateReset2_1, + inflateResetKeep: inflateResetKeep_1, + inflateInit: inflateInit_1, + inflateInit2: inflateInit2_1, + inflate: inflate_2$1, + inflateEnd: inflateEnd_1, + inflateGetHeader: inflateGetHeader_1, + inflateSetDictionary: inflateSetDictionary_1, + inflateInfo: inflateInfo +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +function GZheader() { + /* true if compressed data believed to be text */ + this.text = 0; + /* modification time */ + this.time = 0; + /* extra flags (not used when writing a gzip file) */ + this.xflags = 0; + /* operating system */ + this.os = 0; + /* pointer to extra field or Z_NULL if none */ + this.extra = null; + /* extra field length (valid if extra != Z_NULL) */ + this.extra_len = 0; // Actually, we don't need it in JS, + // but leave for few code modifications + + // + // Setup limits is not necessary because in js we should not preallocate memory + // for inflate use constant limit in 65536 bytes + // + + /* space at extra (only when reading header) */ + // this.extra_max = 0; + /* pointer to zero-terminated file name or Z_NULL */ + this.name = ''; + /* space at name (only when reading header) */ + // this.name_max = 0; + /* pointer to zero-terminated comment or Z_NULL */ + this.comment = ''; + /* space at comment (only when reading header) */ + // this.comm_max = 0; + /* true if there was or will be a header crc */ + this.hcrc = 0; + /* true when done reading gzip header (not used when writing a gzip file) */ + this.done = false; +} + +var gzheader = GZheader; + +const toString = Object.prototype.toString; + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + +const { + Z_NO_FLUSH, Z_FINISH, + Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR +} = constants$2; + +/* ===========================================================================*/ + + +/** + * class Inflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[inflate]] + * and [[inflateRaw]]. + **/ + +/* internal + * inflate.chunks -> Array + * + * Chunks of output data, if [[Inflate#onData]] not overridden. + **/ + +/** + * Inflate.result -> Uint8Array|String + * + * Uncompressed result, generated by default [[Inflate#onData]] + * and [[Inflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Inflate#push]] with `Z_FINISH` / `true` param). + **/ + +/** + * Inflate.err -> Number + * + * Error code after inflate finished. 0 (Z_OK) on success. + * Should be checked if broken data possible. + **/ + +/** + * Inflate.msg -> String + * + * Error message, if [[Inflate.err]] != 0 + **/ + + +/** + * new Inflate(options) + * - options (Object): zlib inflate options. + * + * Creates new inflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `windowBits` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw inflate + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * By default, when no options set, autodetect deflate/gzip data format via + * wrapper header. + * + * ##### Example: + * + * ```javascript + * const pako = require('pako') + * const chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) + * const chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * const inflate = new pako.Inflate({ level: 3}); + * + * inflate.push(chunk1, false); + * inflate.push(chunk2, true); // true -> last chunk + * + * if (inflate.err) { throw new Error(inflate.err); } + * + * console.log(inflate.result); + * ``` + **/ +function Inflate$1(options) { + this.options = common.assign({ + chunkSize: 1024 * 64, + windowBits: 15, + to: '' + }, options || {}); + + const opt = this.options; + + // Force window size for `raw` data, if not set directly, + // because we have no header for autodetect. + if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) { + opt.windowBits = -opt.windowBits; + if (opt.windowBits === 0) { opt.windowBits = -15; } + } + + // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate + if ((opt.windowBits >= 0) && (opt.windowBits < 16) && + !(options && options.windowBits)) { + opt.windowBits += 32; + } + + // Gzip header has no info about windows size, we can do autodetect only + // for deflate. So, if window size not set, force it to max when gzip possible + if ((opt.windowBits > 15) && (opt.windowBits < 48)) { + // bit 3 (16) -> gzipped data + // bit 4 (32) -> autodetect gzip/deflate + if ((opt.windowBits & 15) === 0) { + opt.windowBits |= 15; + } + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream(); + this.strm.avail_out = 0; + + let status = inflate_1$2.inflateInit2( + this.strm, + opt.windowBits + ); + + if (status !== Z_OK) { + throw new Error(messages[status]); + } + + this.header = new gzheader(); + + inflate_1$2.inflateGetHeader(this.strm, this.header); + + // Setup dictionary + if (opt.dictionary) { + // Convert data if needed + if (typeof opt.dictionary === 'string') { + opt.dictionary = strings.string2buf(opt.dictionary); + } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { + opt.dictionary = new Uint8Array(opt.dictionary); + } + if (opt.raw) { //In raw mode we need to set the dictionary early + status = inflate_1$2.inflateSetDictionary(this.strm, opt.dictionary); + if (status !== Z_OK) { + throw new Error(messages[status]); + } + } + } +} + +/** + * Inflate#push(data[, flush_mode]) -> Boolean + * - data (Uint8Array|ArrayBuffer): input data + * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE + * flush modes. See constants. Skipped or `false` means Z_NO_FLUSH, + * `true` means Z_FINISH. + * + * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with + * new output chunks. Returns `true` on success. If end of stream detected, + * [[Inflate#onEnd]] will be called. + * + * `flush_mode` is not needed for normal operation, because end of stream + * detected automatically. You may try to use it for advanced things, but + * this functionality was not tested. + * + * On fail call [[Inflate#onEnd]] with error code and return false. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ +Inflate$1.prototype.push = function (data, flush_mode) { + const strm = this.strm; + const chunkSize = this.options.chunkSize; + const dictionary = this.options.dictionary; + let status, _flush_mode, last_avail_out; + + if (this.ended) return false; + + if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; + else _flush_mode = flush_mode === true ? Z_FINISH : Z_NO_FLUSH; + + // Convert data if needed + if (toString.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + for (;;) { + if (strm.avail_out === 0) { + strm.output = new Uint8Array(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + + status = inflate_1$2.inflate(strm, _flush_mode); + + if (status === Z_NEED_DICT && dictionary) { + status = inflate_1$2.inflateSetDictionary(strm, dictionary); + + if (status === Z_OK) { + status = inflate_1$2.inflate(strm, _flush_mode); + } else if (status === Z_DATA_ERROR) { + // Replace code with more verbose + status = Z_NEED_DICT; + } + } + + // Skip snyc markers if more data follows and not raw mode + while (strm.avail_in > 0 && + status === Z_STREAM_END && + strm.state.wrap > 0 && + data[strm.next_in] !== 0) + { + inflate_1$2.inflateReset(strm); + status = inflate_1$2.inflate(strm, _flush_mode); + } + + switch (status) { + case Z_STREAM_ERROR: + case Z_DATA_ERROR: + case Z_NEED_DICT: + case Z_MEM_ERROR: + this.onEnd(status); + this.ended = true; + return false; + } + + // Remember real `avail_out` value, because we may patch out buffer content + // to align utf8 strings boundaries. + last_avail_out = strm.avail_out; + + if (strm.next_out) { + if (strm.avail_out === 0 || status === Z_STREAM_END) { + + if (this.options.to === 'string') { + + let next_out_utf8 = strings.utf8border(strm.output, strm.next_out); + + let tail = strm.next_out - next_out_utf8; + let utf8str = strings.buf2string(strm.output, next_out_utf8); + + // move tail & realign counters + strm.next_out = tail; + strm.avail_out = chunkSize - tail; + if (tail) strm.output.set(strm.output.subarray(next_out_utf8, next_out_utf8 + tail), 0); + + this.onData(utf8str); + + } else { + this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out)); + } + } + } + + // Must repeat iteration if out buffer is full + if (status === Z_OK && last_avail_out === 0) continue; + + // Finalize if end of stream reached. + if (status === Z_STREAM_END) { + status = inflate_1$2.inflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return true; + } + + if (strm.avail_in === 0) break; + } + + return true; +}; + + +/** + * Inflate#onData(chunk) -> Void + * - chunk (Uint8Array|String): output data. When string output requested, + * each chunk will be string. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ +Inflate$1.prototype.onData = function (chunk) { + this.chunks.push(chunk); +}; + + +/** + * Inflate#onEnd(status) -> Void + * - status (Number): inflate status. 0 (Z_OK) on success, + * other if not. + * + * Called either after you tell inflate that the input stream is + * complete (Z_FINISH). By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ +Inflate$1.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK) { + if (this.options.to === 'string') { + this.result = this.chunks.join(''); + } else { + this.result = common.flattenChunks(this.chunks); + } + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; +}; + + +/** + * inflate(data[, options]) -> Uint8Array|String + * - data (Uint8Array|ArrayBuffer): input data to decompress. + * - options (Object): zlib inflate options. + * + * Decompress `data` with inflate/ungzip and `options`. Autodetect + * format via wrapper header by default. That's why we don't provide + * separate `ungzip` method. + * + * Supported options are: + * + * - windowBits + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * - `to` (String) - if equal to 'string', then result will be converted + * from utf8 to utf16 (javascript) string. When string output requested, + * chunk length can differ from `chunkSize`, depending on content. + * + * + * ##### Example: + * + * ```javascript + * const pako = require('pako'); + * const input = pako.deflate(new Uint8Array([1,2,3,4,5,6,7,8,9])); + * let output; + * + * try { + * output = pako.inflate(input); + * } catch (err) { + * console.log(err); + * } + * ``` + **/ +function inflate$1(input, options) { + const inflator = new Inflate$1(options); + + inflator.push(input); + + // That will never happens, if you don't cheat with options :) + if (inflator.err) throw inflator.msg || messages[inflator.err]; + + return inflator.result; +} + + +/** + * inflateRaw(data[, options]) -> Uint8Array|String + * - data (Uint8Array|ArrayBuffer): input data to decompress. + * - options (Object): zlib inflate options. + * + * The same as [[inflate]], but creates raw data, without wrapper + * (header and adler32 crc). + **/ +function inflateRaw$1(input, options) { + options = options || {}; + options.raw = true; + return inflate$1(input, options); +} + + +/** + * ungzip(data[, options]) -> Uint8Array|String + * - data (Uint8Array|ArrayBuffer): input data to decompress. + * - options (Object): zlib inflate options. + * + * Just shortcut to [[inflate]], because it autodetects format + * by header.content. Done for convenience. + **/ + + +var Inflate_1$1 = Inflate$1; +var inflate_2 = inflate$1; +var inflateRaw_1$1 = inflateRaw$1; +var ungzip$1 = inflate$1; + +var inflate_1$1 = { + Inflate: Inflate_1$1, + inflate: inflate_2, + inflateRaw: inflateRaw_1$1, + ungzip: ungzip$1}; + +const { Deflate, deflate, deflateRaw, gzip } = deflate_1$1; + +const { Inflate, inflate, inflateRaw, ungzip } = inflate_1$1; + + + +var Deflate_1 = Deflate; +var deflate_1 = deflate; +var deflateRaw_1 = deflateRaw; +var gzip_1 = gzip; +var Inflate_1 = Inflate; +var inflate_1 = inflate; +var inflateRaw_1 = inflateRaw; +var ungzip_1 = ungzip; +var constants_1 = constants$2; + +var pako = { + Deflate: Deflate_1, + deflate: deflate_1, + deflateRaw: deflateRaw_1, + gzip: gzip_1, + Inflate: Inflate_1, + inflate: inflate_1, + inflateRaw: inflateRaw_1, + ungzip: ungzip_1, + constants: constants_1 +}; + +class Decoder { + buf; + view; + pos; + constructor(buf) { + this.buf = buf; + this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength); + this.pos = 0; + } + take(n) { + if (this.pos + n > this.buf.length) throw new Error("Decoder: unexpected end of input"); + const slice = this.buf.subarray(this.pos, this.pos + n); + this.pos += n; + return slice; + } + takeAll() { + const slice = this.buf.subarray(this.pos); + this.pos = this.buf.length; + return slice; + } + anyByte() { + if (this.pos >= this.buf.length) throw new Error("Decoder: unexpected end of input"); + return this.buf[this.pos++]; + } + remaining() { + return this.buf.length - this.pos; + } + offset() { + return this.pos; + } +} +function concatBytes$1(...arrays) { + let totalLen = 0; + for (const a of arrays) totalLen += a.length; + const result = new Uint8Array(totalLen); + let offset = 0; + for (const a of arrays) { + result.set(a, offset); + offset += a.length; + } + return result; +} +function encodeWord16(n) { + const buf = new Uint8Array(2); + const view = new DataView(buf.buffer); + view.setUint16(0, n, false); + return buf; +} +function decodeWord16(d) { + const bytes = d.take(2); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + return view.getUint16(0, false); +} +function encodeWord32(n) { + const buf = new Uint8Array(4); + const view = new DataView(buf.buffer); + view.setUint32(0, n, false); + return buf; +} +function decodeWord32(d) { + const bytes = d.take(4); + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + return view.getUint32(0, false); +} +function encodeInt64(n) { + const high = Number(n >> 32n & 0xFFFFFFFFn); + const low = Number(n & 0xFFFFFFFFn); + return concatBytes$1(encodeWord32(high), encodeWord32(low)); +} +function decodeInt64(d) { + const high = BigInt(decodeWord32(d)); + const low = BigInt(decodeWord32(d)); + const unsigned = high << 32n | low; + return unsigned >= 0x8000000000000000n ? unsigned - 0x10000000000000000n : unsigned; +} +function encodeBytes(bs) { + if (bs.length > 255) throw new Error("encodeBytes: length exceeds 255"); + const result = new Uint8Array(1 + bs.length); + result[0] = bs.length; + result.set(bs, 1); + return result; +} +function decodeBytes(d) { + const len = d.anyByte(); + return d.take(len); +} +function encodeLarge(bs) { + if (bs.length > 65535) throw new Error("encodeLarge: length exceeds 65535"); + return concatBytes$1(encodeWord16(bs.length), bs); +} +function decodeLarge(d) { + const len = decodeWord16(d); + return d.take(len); +} +const textEncoder = new TextEncoder(); +const textDecoder = new TextDecoder(); +function encodeString(s) { + return encodeBytes(textEncoder.encode(s)); +} +function decodeString(d) { + return textDecoder.decode(decodeBytes(d)); +} +const CHAR_0 = 48; +const CHAR_1 = 49; +function encodeMaybe(encode, v) { + if (v === null) return new Uint8Array([CHAR_0]); + return concatBytes$1(new Uint8Array([CHAR_1]), encode(v)); +} +function decodeMaybe(decode, d) { + const tag = d.anyByte(); + if (tag === CHAR_0) return null; + if (tag === CHAR_1) return decode(d); + throw new Error("decodeMaybe: invalid tag " + tag); +} +function encodeNonEmpty(encode, xs) { + if (xs.length === 0) throw new Error("encodeNonEmpty: empty list"); + if (xs.length > 255) throw new Error("encodeNonEmpty: length exceeds 255"); + const parts = [new Uint8Array([xs.length])]; + for (const x of xs) parts.push(encode(x)); + return concatBytes$1(...parts); +} +function decodeNonEmpty(decode, d) { + const len = d.anyByte(); + if (len === 0) throw new Error("decodeNonEmpty: empty list"); + const result = []; + for (let i = 0; i < len; i++) result.push(decode(d)); + return result; +} + +function unPadLazy(padded) { + return splitLen(padded).content; +} +function splitLen(data) { + if (data.length < 8) throw new Error("splitLen: input too short"); + const d = new Decoder(data); + const len = decodeInt64(d); + if (len < 0n) throw new Error("splitLen: negative length"); + const numLen = Number(len); + const available = data.length - 8; + const takeLen = Math.min(numLen, available); + return { len, content: data.subarray(8, 8 + takeLen) }; +} + +const _sodium = r; +function readU32LE(buf, off) { + return (buf[off] | buf[off + 1] << 8 | buf[off + 2] << 16 | buf[off + 3] << 24) >>> 0; +} +function writeU32LE(buf, off, val) { + buf[off] = val & 255; + buf[off + 1] = val >>> 8 & 255; + buf[off + 2] = val >>> 16 & 255; + buf[off + 3] = val >>> 24 & 255; +} +function rotl32(v, n) { + return (v << n | v >>> 32 - n) >>> 0; +} +const SIGMA_0 = 1634760805; +const SIGMA_1 = 857760878; +const SIGMA_2 = 2036477234; +const SIGMA_3 = 1797285236; +function salsa20Block(key, nonce8, counter) { + const k0 = readU32LE(key, 0), k1 = readU32LE(key, 4); + const k2 = readU32LE(key, 8), k3 = readU32LE(key, 12); + const k4 = readU32LE(key, 16), k5 = readU32LE(key, 20); + const k6 = readU32LE(key, 24), k7 = readU32LE(key, 28); + const n0 = readU32LE(nonce8, 0), n1 = readU32LE(nonce8, 4); + const s0 = SIGMA_0, s1 = k0, s2 = k1, s3 = k2; + const s4 = k3, s5 = SIGMA_1, s6 = n0, s7 = n1; + const s8 = counter >>> 0, s9 = 0, s10 = SIGMA_2, s11 = k4; + const s12 = k5, s13 = k6, s14 = k7, s15 = SIGMA_3; + let x0 = s0, x1 = s1, x2 = s2, x3 = s3; + let x4 = s4, x5 = s5, x6 = s6, x7 = s7; + let x8 = s8, x9 = s9, x10 = s10, x11 = s11; + let x12 = s12, x13 = s13, x14 = s14, x15 = s15; + for (let i = 0; i < 10; i++) { + x4 ^= rotl32(x0 + x12 >>> 0, 7); + x8 ^= rotl32(x4 + x0 >>> 0, 9); + x12 ^= rotl32(x8 + x4 >>> 0, 13); + x0 ^= rotl32(x12 + x8 >>> 0, 18); + x9 ^= rotl32(x5 + x1 >>> 0, 7); + x13 ^= rotl32(x9 + x5 >>> 0, 9); + x1 ^= rotl32(x13 + x9 >>> 0, 13); + x5 ^= rotl32(x1 + x13 >>> 0, 18); + x14 ^= rotl32(x10 + x6 >>> 0, 7); + x2 ^= rotl32(x14 + x10 >>> 0, 9); + x6 ^= rotl32(x2 + x14 >>> 0, 13); + x10 ^= rotl32(x6 + x2 >>> 0, 18); + x3 ^= rotl32(x15 + x11 >>> 0, 7); + x7 ^= rotl32(x3 + x15 >>> 0, 9); + x11 ^= rotl32(x7 + x3 >>> 0, 13); + x15 ^= rotl32(x11 + x7 >>> 0, 18); + x1 ^= rotl32(x0 + x3 >>> 0, 7); + x2 ^= rotl32(x1 + x0 >>> 0, 9); + x3 ^= rotl32(x2 + x1 >>> 0, 13); + x0 ^= rotl32(x3 + x2 >>> 0, 18); + x6 ^= rotl32(x5 + x4 >>> 0, 7); + x7 ^= rotl32(x6 + x5 >>> 0, 9); + x4 ^= rotl32(x7 + x6 >>> 0, 13); + x5 ^= rotl32(x4 + x7 >>> 0, 18); + x11 ^= rotl32(x10 + x9 >>> 0, 7); + x8 ^= rotl32(x11 + x10 >>> 0, 9); + x9 ^= rotl32(x8 + x11 >>> 0, 13); + x10 ^= rotl32(x9 + x8 >>> 0, 18); + x12 ^= rotl32(x15 + x14 >>> 0, 7); + x13 ^= rotl32(x12 + x15 >>> 0, 9); + x14 ^= rotl32(x13 + x12 >>> 0, 13); + x15 ^= rotl32(x14 + x13 >>> 0, 18); + } + const out = new Uint8Array(64); + writeU32LE(out, 0, x0 + s0 >>> 0); + writeU32LE(out, 4, x1 + s1 >>> 0); + writeU32LE(out, 8, x2 + s2 >>> 0); + writeU32LE(out, 12, x3 + s3 >>> 0); + writeU32LE(out, 16, x4 + s4 >>> 0); + writeU32LE(out, 20, x5 + s5 >>> 0); + writeU32LE(out, 24, x6 + s6 >>> 0); + writeU32LE(out, 28, x7 + s7 >>> 0); + writeU32LE(out, 32, x8 + s8 >>> 0); + writeU32LE(out, 36, x9 + s9 >>> 0); + writeU32LE(out, 40, x10 + s10 >>> 0); + writeU32LE(out, 44, x11 + s11 >>> 0); + writeU32LE(out, 48, x12 + s12 >>> 0); + writeU32LE(out, 52, x13 + s13 >>> 0); + writeU32LE(out, 56, x14 + s14 >>> 0); + writeU32LE(out, 60, x15 + s15 >>> 0); + return out; +} +function sbInit(key, nonce) { + const zeros16 = new Uint8Array(16); + const subkey1 = _sodium.crypto_core_hsalsa20(zeros16, key); + const subkey = _sodium.crypto_core_hsalsa20(nonce.subarray(0, 16), subkey1); + const nonce8 = new Uint8Array(nonce.subarray(16, 24)); + const block0 = salsa20Block(subkey, nonce8, 0); + const poly1305Key = block0.subarray(0, 32); + const ksBuf = new Uint8Array(block0.subarray(32)); + const authState = r.crypto_onetimeauth_init(poly1305Key); + return { _subkey: subkey, _nonce8: nonce8, _counter: 1, _ksBuf: ksBuf, _ksOff: 0, _authState: authState }; +} +function cbInit(dhSecret, nonce) { + return sbInit(dhSecret, nonce); +} +function sbEncryptChunk(state, chunk) { + const cipher = xorKeystream(state, chunk); + r.crypto_onetimeauth_update(state._authState, cipher); + return cipher; +} +function sbDecryptChunk(state, chunk) { + r.crypto_onetimeauth_update(state._authState, chunk); + return xorKeystream(state, chunk); +} +function sbAuth(state) { + return r.crypto_onetimeauth_final(state._authState); +} +function sbDecryptTailTag(key, nonce, paddedLen, data) { + const pLen = Number(paddedLen); + const cipher = data.subarray(0, pLen); + const providedTag = data.subarray(pLen); + const state = sbInit(key, nonce); + const plaintext = sbDecryptChunk(state, cipher); + const computedTag = sbAuth(state); + const valid = providedTag.length === 16 && constantTimeEqual$2(providedTag, computedTag); + const content = unPadLazy(plaintext); + return { valid, content }; +} +function xorKeystream(state, data) { + const result = new Uint8Array(data.length); + let off = 0; + while (off < data.length) { + if (state._ksOff >= state._ksBuf.length) { + state._ksBuf = salsa20Block(state._subkey, state._nonce8, state._counter++); + state._ksOff = 0; + } + const available = state._ksBuf.length - state._ksOff; + const needed = data.length - off; + const n = Math.min(available, needed); + for (let i = 0; i < n; i++) { + result[off + i] = data[off + i] ^ state._ksBuf[state._ksOff + i]; + } + state._ksOff += n; + off += n; + } + return result; +} +function constantTimeEqual$2(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +const AUTH_TAG_SIZE = 16n; +const PROGRESS_SEG = 256 * 1024; +function encodeFileHeader(hdr) { + return concatBytes$1( + encodeString(hdr.fileName), + encodeMaybe(encodeString, hdr.fileExtra) + ); +} +function parseFileHeader(data) { + const hdrLen = Math.min(1024, data.length); + const d = new Decoder(data.subarray(0, hdrLen)); + const fileName = decodeString(d); + const fileExtra = decodeMaybe(decodeString, d); + const consumed = d.offset(); + return { + header: { fileName, fileExtra }, + rest: data.subarray(consumed) + }; +} +function encryptFile(source, fileHdr, key, nonce, fileSize, encSize, onProgress) { + const state = sbInit(key, nonce); + const lenStr = encodeInt64(fileSize); + const padLen = Number(encSize - AUTH_TAG_SIZE - fileSize - 8n); + if (padLen < 0) throw new Error("encryptFile: encSize too small"); + const hdr = sbEncryptChunk(state, concatBytes$1(lenStr, fileHdr)); + const encSource = new Uint8Array(source.length); + for (let off = 0; off < source.length; off += PROGRESS_SEG) { + const end = Math.min(off + PROGRESS_SEG, source.length); + const seg = sbEncryptChunk(state, source.subarray(off, end)); + encSource.set(seg, off); + } + if (source.length === 0) ; + const padding = new Uint8Array(padLen); + padding.fill(35); + const encPad = sbEncryptChunk(state, padding); + const tag = sbAuth(state); + return concatBytes$1(hdr, encSource, encPad, tag); +} +function decryptChunks(encSize, chunks, key, nonce, onProgress) { + if (chunks.length === 0) throw new Error("decryptChunks: empty chunks"); + const paddedLen = encSize - AUTH_TAG_SIZE; + const data = chunks.length === 1 ? chunks[0] : concatBytes$1(...chunks); + { + const { valid, content: content2 } = sbDecryptTailTag(key, nonce, paddedLen, data); + if (!valid) throw new Error("decryptChunks: invalid auth tag"); + const { header: header2, rest: rest2 } = parseFileHeader(content2); + return { header: header2, content: rest2 }; + } +} + +/** + * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array. + * @todo re-check https://issues.chromium.org/issues/42212588 + * @module + */ +const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1); +const _32n = /* @__PURE__ */ BigInt(32); +function fromBig(n, le = false) { + if (le) + return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) }; + return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 }; +} +function split(lst, le = false) { + const len = lst.length; + let Ah = new Uint32Array(len); + let Al = new Uint32Array(len); + for (let i = 0; i < len; i++) { + const { h, l } = fromBig(lst[i], le); + [Ah[i], Al[i]] = [h, l]; + } + return [Ah, Al]; +} +// Left rotate for Shift in [1, 32) +const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s)); +const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s)); +// Left rotate for Shift in (32, 64), NOTE: 32 is special case. +const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s)); +const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s)); + +const crypto$1 = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined; + +/** + * Utilities for hex, bytes, CSPRNG. + * @module + */ +/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+. +// node.js versions earlier than v19 don't declare it in global scope. +// For node.js, package.json#exports field mapping rewrites import +// from `crypto` to `cryptoNode`, which imports native module. +// Makes the utils un-importable in browsers without a bundler. +// Once node.js 18 is deprecated (2025-04-30), we can just drop the import. +/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */ +function isBytes(a) { + return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array'); +} +/** Asserts something is positive integer. */ +function anumber(n) { + if (!Number.isSafeInteger(n) || n < 0) + throw new Error('positive integer expected, got ' + n); +} +/** Asserts something is Uint8Array. */ +function abytes(b, ...lengths) { + if (!isBytes(b)) + throw new Error('Uint8Array expected'); + if (lengths.length > 0 && !lengths.includes(b.length)) + throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length); +} +/** Asserts a hash instance has not been destroyed / finished */ +function aexists(instance, checkFinished = true) { + if (instance.destroyed) + throw new Error('Hash instance has been destroyed'); + if (checkFinished && instance.finished) + throw new Error('Hash#digest() has already been called'); +} +/** Asserts output is properly-sized byte array */ +function aoutput(out, instance) { + abytes(out); + const min = instance.outputLen; + if (out.length < min) { + throw new Error('digestInto() expects output buffer of length at least ' + min); + } +} +/** Cast u8 / u16 / u32 to u32. */ +function u32(arr) { + return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4)); +} +/** Zeroize a byte array. Warning: JS provides no guarantees. */ +function clean(...arrays) { + for (let i = 0; i < arrays.length; i++) { + arrays[i].fill(0); + } +} +/** Is current platform little-endian? Most are. Big-Endian platform: IBM */ +const isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)(); +/** The byte swap operation for uint32 */ +function byteSwap(word) { + return (((word << 24) & 0xff000000) | + ((word << 8) & 0xff0000) | + ((word >>> 8) & 0xff00) | + ((word >>> 24) & 0xff)); +} +/** In place byte swap for Uint32Array */ +function byteSwap32(arr) { + for (let i = 0; i < arr.length; i++) { + arr[i] = byteSwap(arr[i]); + } + return arr; +} +const swap32IfBE = isLE + ? (u) => u + : byteSwap32; +// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex +const hasHexBuiltin = /* @__PURE__ */ (() => +// @ts-ignore +typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')(); +// Array where index 0xf0 (240) is mapped to string 'f0' +const hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0')); +/** + * Convert byte array to hex string. Uses built-in function, when available. + * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123' + */ +function bytesToHex(bytes) { + abytes(bytes); + // @ts-ignore + if (hasHexBuiltin) + return bytes.toHex(); + // pre-caching improves the speed 6x + let hex = ''; + for (let i = 0; i < bytes.length; i++) { + hex += hexes[bytes[i]]; + } + return hex; +} +// We use optimized technique to convert hex string to byte array +const asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; +function asciiToBase16(ch) { + if (ch >= asciis._0 && ch <= asciis._9) + return ch - asciis._0; // '2' => 50-48 + if (ch >= asciis.A && ch <= asciis.F) + return ch - (asciis.A - 10); // 'B' => 66-(65-10) + if (ch >= asciis.a && ch <= asciis.f) + return ch - (asciis.a - 10); // 'b' => 98-(97-10) + return; +} +/** + * Convert hex string to byte array. Uses built-in function, when available. + * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23]) + */ +function hexToBytes(hex) { + if (typeof hex !== 'string') + throw new Error('hex string expected, got ' + typeof hex); + // @ts-ignore + if (hasHexBuiltin) + return Uint8Array.fromHex(hex); + const hl = hex.length; + const al = hl / 2; + if (hl % 2) + throw new Error('hex string expected, got unpadded hex of length ' + hl); + const array = new Uint8Array(al); + for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) { + const n1 = asciiToBase16(hex.charCodeAt(hi)); + const n2 = asciiToBase16(hex.charCodeAt(hi + 1)); + if (n1 === undefined || n2 === undefined) { + const char = hex[hi] + hex[hi + 1]; + throw new Error('hex string expected, got non-hex character "' + char + '" at index ' + hi); + } + array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163 + } + return array; +} +/** + * Converts string to bytes using UTF8 encoding. + * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99]) + */ +function utf8ToBytes(str) { + if (typeof str !== 'string') + throw new Error('string expected'); + return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809 +} +/** + * Normalizes (non-hex) string or Uint8Array to Uint8Array. + * Warning: when Uint8Array is passed, it would NOT get copied. + * Keep in mind for future mutable operations. + */ +function toBytes(data) { + if (typeof data === 'string') + data = utf8ToBytes(data); + abytes(data); + return data; +} +/** Copies several Uint8Arrays into one. */ +function concatBytes(...arrays) { + let sum = 0; + for (let i = 0; i < arrays.length; i++) { + const a = arrays[i]; + abytes(a); + sum += a.length; + } + const res = new Uint8Array(sum); + for (let i = 0, pad = 0; i < arrays.length; i++) { + const a = arrays[i]; + res.set(a, pad); + pad += a.length; + } + return res; +} +/** For runtime check if class implements interface */ +class Hash { +} +/** Wraps hash function, creating an interface on top of it */ +function createHasher(hashCons) { + const hashC = (msg) => hashCons().update(toBytes(msg)).digest(); + const tmp = hashCons(); + hashC.outputLen = tmp.outputLen; + hashC.blockLen = tmp.blockLen; + hashC.create = () => hashCons(); + return hashC; +} +function createXOFer(hashCons) { + const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest(); + const tmp = hashCons({}); + hashC.outputLen = tmp.outputLen; + hashC.blockLen = tmp.blockLen; + hashC.create = (opts) => hashCons(opts); + return hashC; +} +/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */ +function randomBytes(bytesLength = 32) { + if (crypto$1 && typeof crypto$1.getRandomValues === 'function') { + return crypto$1.getRandomValues(new Uint8Array(bytesLength)); + } + // Legacy Node.js compatibility + if (crypto$1 && typeof crypto$1.randomBytes === 'function') { + return Uint8Array.from(crypto$1.randomBytes(bytesLength)); + } + throw new Error('crypto.getRandomValues must be defined'); +} + +/** + * SHA3 (keccak) hash function, based on a new "Sponge function" design. + * Different from older hashes, the internal state is bigger than output size. + * + * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf), + * [Website](https://keccak.team/keccak.html), + * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub). + * + * Check out `sha3-addons` module for cSHAKE, k12, and others. + * @module + */ +// No __PURE__ annotations in sha3 header: +// EVERYTHING is in fact used on every export. +// Various per round constants calculations +const _0n$4 = BigInt(0); +const _1n$5 = BigInt(1); +const _2n$3 = BigInt(2); +const _7n$1 = BigInt(7); +const _256n = BigInt(256); +const _0x71n = BigInt(0x71); +const SHA3_PI = []; +const SHA3_ROTL = []; +const _SHA3_IOTA = []; +for (let round = 0, R = _1n$5, x = 1, y = 0; round < 24; round++) { + // Pi + [x, y] = [y, (2 * x + 3 * y) % 5]; + SHA3_PI.push(2 * (5 * y + x)); + // Rotational + SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64); + // Iota + let t = _0n$4; + for (let j = 0; j < 7; j++) { + R = ((R << _1n$5) ^ ((R >> _7n$1) * _0x71n)) % _256n; + if (R & _2n$3) + t ^= _1n$5 << ((_1n$5 << /* @__PURE__ */ BigInt(j)) - _1n$5); + } + _SHA3_IOTA.push(t); +} +const IOTAS = split(_SHA3_IOTA, true); +const SHA3_IOTA_H = IOTAS[0]; +const SHA3_IOTA_L = IOTAS[1]; +// Left rotation (without 0, 32, 64) +const rotlH = (h, l, s) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s)); +const rotlL = (h, l, s) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s)); +/** `keccakf1600` internal function, additionally allows to adjust round count. */ +function keccakP(s, rounds = 24) { + const B = new Uint32Array(5 * 2); + // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js) + for (let round = 24 - rounds; round < 24; round++) { + // Theta θ + for (let x = 0; x < 10; x++) + B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40]; + for (let x = 0; x < 10; x += 2) { + const idx1 = (x + 8) % 10; + const idx0 = (x + 2) % 10; + const B0 = B[idx0]; + const B1 = B[idx0 + 1]; + const Th = rotlH(B0, B1, 1) ^ B[idx1]; + const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1]; + for (let y = 0; y < 50; y += 10) { + s[x + y] ^= Th; + s[x + y + 1] ^= Tl; + } + } + // Rho (ρ) and Pi (π) + let curH = s[2]; + let curL = s[3]; + for (let t = 0; t < 24; t++) { + const shift = SHA3_ROTL[t]; + const Th = rotlH(curH, curL, shift); + const Tl = rotlL(curH, curL, shift); + const PI = SHA3_PI[t]; + curH = s[PI]; + curL = s[PI + 1]; + s[PI] = Th; + s[PI + 1] = Tl; + } + // Chi (χ) + for (let y = 0; y < 50; y += 10) { + for (let x = 0; x < 10; x++) + B[x] = s[y + x]; + for (let x = 0; x < 10; x++) + s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10]; + } + // Iota (ι) + s[0] ^= SHA3_IOTA_H[round]; + s[1] ^= SHA3_IOTA_L[round]; + } + clean(B); +} +/** Keccak sponge function. */ +class Keccak extends Hash { + // NOTE: we accept arguments in bytes instead of bits here. + constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) { + super(); + this.pos = 0; + this.posOut = 0; + this.finished = false; + this.destroyed = false; + this.enableXOF = false; + this.blockLen = blockLen; + this.suffix = suffix; + this.outputLen = outputLen; + this.enableXOF = enableXOF; + this.rounds = rounds; + // Can be passed from user as dkLen + anumber(outputLen); + // 1600 = 5x5 matrix of 64bit. 1600 bits === 200 bytes + // 0 < blockLen < 200 + if (!(0 < blockLen && blockLen < 200)) + throw new Error('only keccak-f1600 function is supported'); + this.state = new Uint8Array(200); + this.state32 = u32(this.state); + } + clone() { + return this._cloneInto(); + } + keccak() { + swap32IfBE(this.state32); + keccakP(this.state32, this.rounds); + swap32IfBE(this.state32); + this.posOut = 0; + this.pos = 0; + } + update(data) { + aexists(this); + data = toBytes(data); + abytes(data); + const { blockLen, state } = this; + const len = data.length; + for (let pos = 0; pos < len;) { + const take = Math.min(blockLen - this.pos, len - pos); + for (let i = 0; i < take; i++) + state[this.pos++] ^= data[pos++]; + if (this.pos === blockLen) + this.keccak(); + } + return this; + } + finish() { + if (this.finished) + return; + this.finished = true; + const { state, suffix, pos, blockLen } = this; + // Do the padding + state[pos] ^= suffix; + if ((suffix & 0x80) !== 0 && pos === blockLen - 1) + this.keccak(); + state[blockLen - 1] ^= 0x80; + this.keccak(); + } + writeInto(out) { + aexists(this, false); + abytes(out); + this.finish(); + const bufferOut = this.state; + const { blockLen } = this; + for (let pos = 0, len = out.length; pos < len;) { + if (this.posOut >= blockLen) + this.keccak(); + const take = Math.min(blockLen - this.posOut, len - pos); + out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos); + this.posOut += take; + pos += take; + } + return out; + } + xofInto(out) { + // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF + if (!this.enableXOF) + throw new Error('XOF is not possible for this instance'); + return this.writeInto(out); + } + xof(bytes) { + anumber(bytes); + return this.xofInto(new Uint8Array(bytes)); + } + digestInto(out) { + aoutput(out, this); + if (this.finished) + throw new Error('digest() was already called'); + this.writeInto(out); + this.destroy(); + return out; + } + digest() { + return this.digestInto(new Uint8Array(this.outputLen)); + } + destroy() { + this.destroyed = true; + clean(this.state); + } + _cloneInto(to) { + const { blockLen, suffix, outputLen, rounds, enableXOF } = this; + to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds)); + to.state32.set(this.state32); + to.pos = this.pos; + to.posOut = this.posOut; + to.finished = this.finished; + to.rounds = rounds; + // Suffix can change in cSHAKE + to.suffix = suffix; + to.outputLen = outputLen; + to.enableXOF = enableXOF; + to.destroyed = this.destroyed; + return to; + } +} +const genShake = (suffix, blockLen, outputLen) => createXOFer((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)); +/** SHAKE256 XOF with 256-bit security. */ +const shake256 = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))(); + +/** + * Hex, bytes and number utilities. + * @module + */ +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +const _0n$3 = /* @__PURE__ */ BigInt(0); +const _1n$4 = /* @__PURE__ */ BigInt(1); +// tmp name until v2 +function _abool2(value, title = '') { + if (typeof value !== 'boolean') { + const prefix = title && `"${title}"`; + throw new Error(prefix + 'expected boolean, got type=' + typeof value); + } + return value; +} +// tmp name until v2 +/** Asserts something is Uint8Array. */ +function _abytes2(value, length, title = '') { + const bytes = isBytes(value); + const len = value?.length; + const needsLen = length !== undefined; + if (!bytes || (needsLen && len !== length)) { + const prefix = title && `"${title}" `; + const ofLen = needsLen ? ` of length ${length}` : ''; + const got = bytes ? `length=${len}` : `type=${typeof value}`; + throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got); + } + return value; +} +function hexToNumber(hex) { + if (typeof hex !== 'string') + throw new Error('hex string expected, got ' + typeof hex); + return hex === '' ? _0n$3 : BigInt('0x' + hex); // Big Endian +} +// BE: Big Endian, LE: Little Endian +function bytesToNumberBE(bytes) { + return hexToNumber(bytesToHex(bytes)); +} +function bytesToNumberLE(bytes) { + abytes(bytes); + return hexToNumber(bytesToHex(Uint8Array.from(bytes).reverse())); +} +function numberToBytesBE(n, len) { + return hexToBytes(n.toString(16).padStart(len * 2, '0')); +} +function numberToBytesLE(n, len) { + return numberToBytesBE(n, len).reverse(); +} +/** + * Takes hex string or Uint8Array, converts to Uint8Array. + * Validates output length. + * Will throw error for other types. + * @param title descriptive title for an error e.g. 'secret key' + * @param hex hex string or Uint8Array + * @param expectedLength optional, will compare to result array's length + * @returns + */ +function ensureBytes(title, hex, expectedLength) { + let res; + if (typeof hex === 'string') { + try { + res = hexToBytes(hex); + } + catch (e) { + throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e); + } + } + else if (isBytes(hex)) { + // Uint8Array.from() instead of hash.slice() because node.js Buffer + // is instance of Uint8Array, and its slice() creates **mutable** copy + res = Uint8Array.from(hex); + } + else { + throw new Error(title + ' must be hex string or Uint8Array'); + } + const len = res.length; + if (typeof expectedLength === 'number' && len !== expectedLength) + throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len); + return res; +} +/** + * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer, + * and Buffer#slice creates mutable copy. Never use Buffers! + */ +function copyBytes(bytes) { + return Uint8Array.from(bytes); +} +/** + * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols + * Should be safe to use for things expected to be ASCII. + * Returns exact same result as utf8ToBytes for ASCII or throws. + */ +function asciiToBytes(ascii) { + return Uint8Array.from(ascii, (c, i) => { + const charCode = c.charCodeAt(0); + if (c.length !== 1 || charCode > 127) { + throw new Error(`string contains non-ASCII character "${ascii[i]}" with code ${charCode} at position ${i}`); + } + return charCode; + }); +} +/** + * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99]) + */ +// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_; +/** + * Converts bytes to string using UTF8 encoding. + * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc' + */ +// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_; +// Is positive bigint +const isPosBig = (n) => typeof n === 'bigint' && _0n$3 <= n; +function inRange(n, min, max) { + return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max; +} +/** + * Asserts min <= n < max. NOTE: It's < max and not <= max. + * @example + * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n) + */ +function aInRange(title, n, min, max) { + // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)? + // consider P=256n, min=0n, max=P + // - a for min=0 would require -1: `inRange('x', x, -1n, P)` + // - b would commonly require subtraction: `inRange('x', x, 0n, P - 1n)` + // - our way is the cleanest: `inRange('x', x, 0n, P) + if (!inRange(n, min, max)) + throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n); +} +// Bit operations +/** + * Calculates amount of bits in a bigint. + * Same as `n.toString(2).length` + * TODO: merge with nLength in modular + */ +function bitLen(n) { + let len; + for (len = 0; n > _0n$3; n >>= _1n$4, len += 1) + ; + return len; +} +/** + * Calculate mask for N bits. Not using ** operator with bigints because of old engines. + * Same as BigInt(`0b${Array(i).fill('1').join('')}`) + */ +const bitMask = (n) => (_1n$4 << BigInt(n)) - _1n$4; +function _validateObject(object, fields, optFields = {}) { + if (!object || typeof object !== 'object') + throw new Error('expected valid options object'); + function checkField(fieldName, expectedType, isOpt) { + const val = object[fieldName]; + if (isOpt && val === undefined) + return; + const current = typeof val; + if (current !== expectedType || val === null) + throw new Error(`param "${fieldName}" is invalid: expected ${expectedType}, got ${current}`); + } + Object.entries(fields).forEach(([k, v]) => checkField(k, v, false)); + Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true)); +} +/** + * Memoizes (caches) computation result. + * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed. + */ +function memoized(fn) { + const map = new WeakMap(); + return (arg, ...args) => { + const val = map.get(arg); + if (val !== undefined) + return val; + const computed = fn(arg, ...args); + map.set(arg, computed); + return computed; + }; +} + +/** + * Utils for modular division and fields. + * Field over 11 is a finite (Galois) field is integer number operations `mod 11`. + * There is no division: it is replaced by modular multiplicative inverse. + * @module + */ +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +// prettier-ignore +const _0n$2 = BigInt(0), _1n$3 = BigInt(1), _2n$2 = /* @__PURE__ */ BigInt(2), _3n$1 = /* @__PURE__ */ BigInt(3); +// prettier-ignore +const _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7); +// prettier-ignore +const _8n$1 = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16); +// Calculates a modulo b +function mod(a, b) { + const result = a % b; + return result >= _0n$2 ? result : b + result; +} +/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */ +function pow2(x, power, modulo) { + let res = x; + while (power-- > _0n$2) { + res *= res; + res %= modulo; + } + return res; +} +/** + * Inverses number over modulo. + * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/). + */ +function invert(number, modulo) { + if (number === _0n$2) + throw new Error('invert: expected non-zero number'); + if (modulo <= _0n$2) + throw new Error('invert: expected positive modulus, got ' + modulo); + // Fermat's little theorem "CT-like" version inv(n) = n^(m-2) mod m is 30x slower. + let a = mod(number, modulo); + let b = modulo; + // prettier-ignore + let x = _0n$2, u = _1n$3; + while (a !== _0n$2) { + // JIT applies optimization if those two lines follow each other + const q = b / a; + const r = b % a; + const m = x - u * q; + // prettier-ignore + b = a, a = r, x = u, u = m; + } + const gcd = b; + if (gcd !== _1n$3) + throw new Error('invert: does not exist'); + return mod(x, modulo); +} +function assertIsSquare(Fp, root, n) { + if (!Fp.eql(Fp.sqr(root), n)) + throw new Error('Cannot find square root'); +} +// Not all roots are possible! Example which will throw: +// const NUM = +// n = 72057594037927816n; +// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab')); +function sqrt3mod4(Fp, n) { + const p1div4 = (Fp.ORDER + _1n$3) / _4n; + const root = Fp.pow(n, p1div4); + assertIsSquare(Fp, root, n); + return root; +} +function sqrt5mod8(Fp, n) { + const p5div8 = (Fp.ORDER - _5n) / _8n$1; + const n2 = Fp.mul(n, _2n$2); + const v = Fp.pow(n2, p5div8); + const nv = Fp.mul(n, v); + const i = Fp.mul(Fp.mul(nv, _2n$2), v); + const root = Fp.mul(nv, Fp.sub(i, Fp.ONE)); + assertIsSquare(Fp, root, n); + return root; +} +// Based on RFC9380, Kong algorithm +// prettier-ignore +function sqrt9mod16(P) { + const Fp_ = Field(P); + const tn = tonelliShanks(P); + const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); // 1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F + const c2 = tn(Fp_, c1); // 2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F + const c3 = tn(Fp_, Fp_.neg(c1)); // 3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F + const c4 = (P + _7n) / _16n; // 4. c4 = (q + 7) / 16 # Integer arithmetic + return (Fp, n) => { + let tv1 = Fp.pow(n, c4); // 1. tv1 = x^c4 + let tv2 = Fp.mul(tv1, c1); // 2. tv2 = c1 * tv1 + const tv3 = Fp.mul(tv1, c2); // 3. tv3 = c2 * tv1 + const tv4 = Fp.mul(tv1, c3); // 4. tv4 = c3 * tv1 + const e1 = Fp.eql(Fp.sqr(tv2), n); // 5. e1 = (tv2^2) == x + const e2 = Fp.eql(Fp.sqr(tv3), n); // 6. e2 = (tv3^2) == x + tv1 = Fp.cmov(tv1, tv2, e1); // 7. tv1 = CMOV(tv1, tv2, e1) # Select tv2 if (tv2^2) == x + tv2 = Fp.cmov(tv4, tv3, e2); // 8. tv2 = CMOV(tv4, tv3, e2) # Select tv3 if (tv3^2) == x + const e3 = Fp.eql(Fp.sqr(tv2), n); // 9. e3 = (tv2^2) == x + const root = Fp.cmov(tv1, tv2, e3); // 10. z = CMOV(tv1, tv2, e3) # Select sqrt from tv1 & tv2 + assertIsSquare(Fp, root, n); + return root; + }; +} +/** + * Tonelli-Shanks square root search algorithm. + * 1. https://eprint.iacr.org/2012/685.pdf (page 12) + * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks + * @param P field order + * @returns function that takes field Fp (created from P) and number n + */ +function tonelliShanks(P) { + // Initialization (precomputation). + // Caching initialization could boost perf by 7%. + if (P < _3n$1) + throw new Error('sqrt is not defined for small field'); + // Factor P - 1 = Q * 2^S, where Q is odd + let Q = P - _1n$3; + let S = 0; + while (Q % _2n$2 === _0n$2) { + Q /= _2n$2; + S++; + } + // Find the first quadratic non-residue Z >= 2 + let Z = _2n$2; + const _Fp = Field(P); + while (FpLegendre(_Fp, Z) === 1) { + // Basic primality test for P. After x iterations, chance of + // not finding quadratic non-residue is 2^x, so 2^1000. + if (Z++ > 1000) + throw new Error('Cannot find square root: probably non-prime P'); + } + // Fast-path; usually done before Z, but we do "primality test". + if (S === 1) + return sqrt3mod4; + // Slow-path + // TODO: test on Fp2 and others + let cc = _Fp.pow(Z, Q); // c = z^Q + const Q1div2 = (Q + _1n$3) / _2n$2; + return function tonelliSlow(Fp, n) { + if (Fp.is0(n)) + return n; + // Check if n is a quadratic residue using Legendre symbol + if (FpLegendre(Fp, n) !== 1) + throw new Error('Cannot find square root'); + // Initialize variables for the main loop + let M = S; + let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp + let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor + let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root + // Main loop + // while t != 1 + while (!Fp.eql(t, Fp.ONE)) { + if (Fp.is0(t)) + return Fp.ZERO; // if t=0 return R=0 + let i = 1; + // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P) + let t_tmp = Fp.sqr(t); // t^(2^1) + while (!Fp.eql(t_tmp, Fp.ONE)) { + i++; + t_tmp = Fp.sqr(t_tmp); // t^(2^2)... + if (i === M) + throw new Error('Cannot find square root'); + } + // Calculate the exponent for b: 2^(M - i - 1) + const exponent = _1n$3 << BigInt(M - i - 1); // bigint is important + const b = Fp.pow(c, exponent); // b = 2^(M - i - 1) + // Update variables + M = i; + c = Fp.sqr(b); // c = b^2 + t = Fp.mul(t, c); // t = (t * b^2) + R = Fp.mul(R, b); // R = R*b + } + return R; + }; +} +/** + * Square root for a finite field. Will try optimized versions first: + * + * 1. P ≡ 3 (mod 4) + * 2. P ≡ 5 (mod 8) + * 3. P ≡ 9 (mod 16) + * 4. Tonelli-Shanks algorithm + * + * Different algorithms can give different roots, it is up to user to decide which one they want. + * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve). + */ +function FpSqrt(P) { + // P ≡ 3 (mod 4) => √n = n^((P+1)/4) + if (P % _4n === _3n$1) + return sqrt3mod4; + // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf + if (P % _8n$1 === _5n) + return sqrt5mod8; + // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4) + if (P % _16n === _9n) + return sqrt9mod16(P); + // Tonelli-Shanks algorithm + return tonelliShanks(P); +} +// prettier-ignore +const FIELD_FIELDS = [ + 'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr', + 'eql', 'add', 'sub', 'mul', 'pow', 'div', + 'addN', 'subN', 'mulN', 'sqrN' +]; +function validateField(field) { + const initial = { + ORDER: 'bigint', + MASK: 'bigint', + BYTES: 'number', + BITS: 'number', + }; + const opts = FIELD_FIELDS.reduce((map, val) => { + map[val] = 'function'; + return map; + }, initial); + _validateObject(field, opts); + // const max = 16384; + // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field'); + // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field'); + return field; +} +// Generic field functions +/** + * Same as `pow` but for Fp: non-constant-time. + * Unsafe in some contexts: uses ladder, so can expose bigint bits. + */ +function FpPow(Fp, num, power) { + if (power < _0n$2) + throw new Error('invalid exponent, negatives unsupported'); + if (power === _0n$2) + return Fp.ONE; + if (power === _1n$3) + return num; + let p = Fp.ONE; + let d = num; + while (power > _0n$2) { + if (power & _1n$3) + p = Fp.mul(p, d); + d = Fp.sqr(d); + power >>= _1n$3; + } + return p; +} +/** + * Efficiently invert an array of Field elements. + * Exception-free. Will return `undefined` for 0 elements. + * @param passZero map 0 to 0 (instead of undefined) + */ +function FpInvertBatch(Fp, nums, passZero = false) { + const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined); + // Walk from first to last, multiply them by each other MOD p + const multipliedAcc = nums.reduce((acc, num, i) => { + if (Fp.is0(num)) + return acc; + inverted[i] = acc; + return Fp.mul(acc, num); + }, Fp.ONE); + // Invert last element + const invertedAcc = Fp.inv(multipliedAcc); + // Walk from last to first, multiply them by inverted each other MOD p + nums.reduceRight((acc, num, i) => { + if (Fp.is0(num)) + return acc; + inverted[i] = Fp.mul(acc, inverted[i]); + return Fp.mul(acc, num); + }, invertedAcc); + return inverted; +} +/** + * Legendre symbol. + * Legendre constant is used to calculate Legendre symbol (a | p) + * which denotes the value of a^((p-1)/2) (mod p). + * + * * (a | p) ≡ 1 if a is a square (mod p), quadratic residue + * * (a | p) ≡ -1 if a is not a square (mod p), quadratic non residue + * * (a | p) ≡ 0 if a ≡ 0 (mod p) + */ +function FpLegendre(Fp, n) { + // We can use 3rd argument as optional cache of this value + // but seems unneeded for now. The operation is very fast. + const p1mod2 = (Fp.ORDER - _1n$3) / _2n$2; + const powered = Fp.pow(n, p1mod2); + const yes = Fp.eql(powered, Fp.ONE); + const zero = Fp.eql(powered, Fp.ZERO); + const no = Fp.eql(powered, Fp.neg(Fp.ONE)); + if (!yes && !zero && !no) + throw new Error('invalid Legendre symbol result'); + return yes ? 1 : zero ? 0 : -1; +} +// CURVE.n lengths +function nLength(n, nBitLength) { + // Bit size, byte size of CURVE.n + if (nBitLength !== undefined) + anumber(nBitLength); + const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length; + const nByteLength = Math.ceil(_nBitLength / 8); + return { nBitLength: _nBitLength, nByteLength }; +} +/** + * Creates a finite field. Major performance optimizations: + * * 1. Denormalized operations like mulN instead of mul. + * * 2. Identical object shape: never add or remove keys. + * * 3. `Object.freeze`. + * Fragile: always run a benchmark on a change. + * Security note: operations don't check 'isValid' for all elements for performance reasons, + * it is caller responsibility to check this. + * This is low-level code, please make sure you know what you're doing. + * + * Note about field properties: + * * CHARACTERISTIC p = prime number, number of elements in main subgroup. + * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`. + * + * @param ORDER field order, probably prime, or could be composite + * @param bitLen how many bits the field consumes + * @param isLE (default: false) if encoding / decoding should be in little-endian + * @param redef optional faster redefinitions of sqrt and other methods + */ +function Field(ORDER, bitLenOrOpts, // TODO: use opts only in v2? +isLE = false, opts = {}) { + if (ORDER <= _0n$2) + throw new Error('invalid field: expected ORDER > 0, got ' + ORDER); + let _nbitLength = undefined; + let _sqrt = undefined; + let modFromBytes = false; + let allowedLengths = undefined; + if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) { + if (opts.sqrt || isLE) + throw new Error('cannot specify opts in two arguments'); + const _opts = bitLenOrOpts; + if (_opts.BITS) + _nbitLength = _opts.BITS; + if (_opts.sqrt) + _sqrt = _opts.sqrt; + if (typeof _opts.isLE === 'boolean') + isLE = _opts.isLE; + if (typeof _opts.modFromBytes === 'boolean') + modFromBytes = _opts.modFromBytes; + allowedLengths = _opts.allowedLengths; + } + else { + if (typeof bitLenOrOpts === 'number') + _nbitLength = bitLenOrOpts; + if (opts.sqrt) + _sqrt = opts.sqrt; + } + const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength); + if (BYTES > 2048) + throw new Error('invalid field: expected ORDER of <= 2048 bytes'); + let sqrtP; // cached sqrtP + const f = Object.freeze({ + ORDER, + isLE, + BITS, + BYTES, + MASK: bitMask(BITS), + ZERO: _0n$2, + ONE: _1n$3, + allowedLengths: allowedLengths, + create: (num) => mod(num, ORDER), + isValid: (num) => { + if (typeof num !== 'bigint') + throw new Error('invalid field element: expected bigint, got ' + typeof num); + return _0n$2 <= num && num < ORDER; // 0 is valid element, but it's not invertible + }, + is0: (num) => num === _0n$2, + // is valid and invertible + isValidNot0: (num) => !f.is0(num) && f.isValid(num), + isOdd: (num) => (num & _1n$3) === _1n$3, + neg: (num) => mod(-num, ORDER), + eql: (lhs, rhs) => lhs === rhs, + sqr: (num) => mod(num * num, ORDER), + add: (lhs, rhs) => mod(lhs + rhs, ORDER), + sub: (lhs, rhs) => mod(lhs - rhs, ORDER), + mul: (lhs, rhs) => mod(lhs * rhs, ORDER), + pow: (num, power) => FpPow(f, num, power), + div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER), + // Same as above, but doesn't normalize + sqrN: (num) => num * num, + addN: (lhs, rhs) => lhs + rhs, + subN: (lhs, rhs) => lhs - rhs, + mulN: (lhs, rhs) => lhs * rhs, + inv: (num) => invert(num, ORDER), + sqrt: _sqrt || + ((n) => { + if (!sqrtP) + sqrtP = FpSqrt(ORDER); + return sqrtP(f, n); + }), + toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)), + fromBytes: (bytes, skipValidation = true) => { + if (allowedLengths) { + if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) { + throw new Error('Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length); + } + const padded = new Uint8Array(BYTES); + // isLE add 0 to right, !isLE to the left. + padded.set(bytes, isLE ? 0 : padded.length - bytes.length); + bytes = padded; + } + if (bytes.length !== BYTES) + throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length); + let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes); + if (modFromBytes) + scalar = mod(scalar, ORDER); + if (!skipValidation) + if (!f.isValid(scalar)) + throw new Error('invalid field element: outside of range 0..ORDER'); + // NOTE: we don't validate scalar here, please use isValid. This done such way because some + // protocol may allow non-reduced scalar that reduced later or changed some other way. + return scalar; + }, + // TODO: we don't need it here, move out to separate fn + invertBatch: (lst) => FpInvertBatch(f, lst), + // We can't move this out because Fp6, Fp12 implement it + // and it's unclear what to return in there. + cmov: (a, b, c) => (c ? b : a), + }); + return Object.freeze(f); +} + +/** + * Methods for elliptic curve multiplication by scalars. + * Contains wNAF, pippenger. + * @module + */ +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +const _0n$1 = BigInt(0); +const _1n$2 = BigInt(1); +function negateCt(condition, item) { + const neg = item.negate(); + return condition ? neg : item; +} +/** + * Takes a bunch of Projective Points but executes only one + * inversion on all of them. Inversion is very slow operation, + * so this improves performance massively. + * Optimization: converts a list of projective points to a list of identical points with Z=1. + */ +function normalizeZ(c, points) { + const invertedZs = FpInvertBatch(c.Fp, points.map((p) => p.Z)); + return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i]))); +} +function validateW(W, bits) { + if (!Number.isSafeInteger(W) || W <= 0 || W > bits) + throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W); +} +function calcWOpts(W, scalarBits) { + validateW(W, scalarBits); + const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero + const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero + const maxNumber = 2 ** W; // W=8 256 + const mask = bitMask(W); // W=8 255 == mask 0b11111111 + const shiftBy = BigInt(W); // W=8 8 + return { windows, windowSize, mask, maxNumber, shiftBy }; +} +function calcOffsets(n, window, wOpts) { + const { windowSize, mask, maxNumber, shiftBy } = wOpts; + let wbits = Number(n & mask); // extract W bits. + let nextN = n >> shiftBy; // shift number by W bits. + // What actually happens here: + // const highestBit = Number(mask ^ (mask >> 1n)); + // let wbits2 = wbits - 1; // skip zero + // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~); + // split if bits > max: +224 => 256-32 + if (wbits > windowSize) { + // we skip zero, which means instead of `>= size-1`, we do `> size` + wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here. + nextN += _1n$2; // +256 (carry) + } + const offsetStart = window * windowSize; + const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero + const isZero = wbits === 0; // is current window slice a 0? + const isNeg = wbits < 0; // is current window slice negative? + const isNegF = window % 2 !== 0; // fake random statement for noise + const offsetF = offsetStart; // fake offset for noise + return { nextN, offset, isZero, isNeg, isNegF, offsetF }; +} +function validateMSMPoints(points, c) { + if (!Array.isArray(points)) + throw new Error('array expected'); + points.forEach((p, i) => { + if (!(p instanceof c)) + throw new Error('invalid point at index ' + i); + }); +} +function validateMSMScalars(scalars, field) { + if (!Array.isArray(scalars)) + throw new Error('array of scalars expected'); + scalars.forEach((s, i) => { + if (!field.isValid(s)) + throw new Error('invalid scalar at index ' + i); + }); +} +// Since points in different groups cannot be equal (different object constructor), +// we can have single place to store precomputes. +// Allows to make points frozen / immutable. +const pointPrecomputes = new WeakMap(); +const pointWindowSizes = new WeakMap(); +function getW(P) { + // To disable precomputes: + // return 1; + return pointWindowSizes.get(P) || 1; +} +function assert0(n) { + if (n !== _0n$1) + throw new Error('invalid wNAF'); +} +/** + * Elliptic curve multiplication of Point by scalar. Fragile. + * Table generation takes **30MB of ram and 10ms on high-end CPU**, + * but may take much longer on slow devices. Actual generation will happen on + * first call of `multiply()`. By default, `BASE` point is precomputed. + * + * Scalars should always be less than curve order: this should be checked inside of a curve itself. + * Creates precomputation tables for fast multiplication: + * - private scalar is split by fixed size windows of W bits + * - every window point is collected from window's table & added to accumulator + * - since windows are different, same point inside tables won't be accessed more than once per calc + * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar) + * - +1 window is neccessary for wNAF + * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication + * + * @todo Research returning 2d JS array of windows, instead of a single window. + * This would allow windows to be in different memory locations + */ +class wNAF { + // Parametrized with a given Point class (not individual point) + constructor(Point, bits) { + this.BASE = Point.BASE; + this.ZERO = Point.ZERO; + this.Fn = Point.Fn; + this.bits = bits; + } + // non-const time multiplication ladder + _unsafeLadder(elm, n, p = this.ZERO) { + let d = elm; + while (n > _0n$1) { + if (n & _1n$2) + p = p.add(d); + d = d.double(); + n >>= _1n$2; + } + return p; + } + /** + * Creates a wNAF precomputation window. Used for caching. + * Default window size is set by `utils.precompute()` and is equal to 8. + * Number of precomputed points depends on the curve size: + * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where: + * - 𝑊 is the window size + * - 𝑛 is the bitlength of the curve order. + * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224. + * @param point Point instance + * @param W window size + * @returns precomputed point tables flattened to a single array + */ + precomputeWindow(point, W) { + const { windows, windowSize } = calcWOpts(W, this.bits); + const points = []; + let p = point; + let base = p; + for (let window = 0; window < windows; window++) { + base = p; + points.push(base); + // i=1, bc we skip 0 + for (let i = 1; i < windowSize; i++) { + base = base.add(p); + points.push(base); + } + p = base.double(); + } + return points; + } + /** + * Implements ec multiplication using precomputed tables and w-ary non-adjacent form. + * More compact implementation: + * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541 + * @returns real and fake (for const-time) points + */ + wNAF(W, precomputes, n) { + // Scalar should be smaller than field order + if (!this.Fn.isValid(n)) + throw new Error('invalid scalar'); + // Accumulators + let p = this.ZERO; + let f = this.BASE; + // This code was first written with assumption that 'f' and 'p' will never be infinity point: + // since each addition is multiplied by 2 ** W, it cannot cancel each other. However, + // there is negate now: it is possible that negated element from low value + // would be the same as high element, which will create carry into next window. + // It's not obvious how this can fail, but still worth investigating later. + const wo = calcWOpts(W, this.bits); + for (let window = 0; window < wo.windows; window++) { + // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise + const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo); + n = nextN; + if (isZero) { + // bits are 0: add garbage to fake point + // Important part for const-time getPublicKey: add random "noise" point to f. + f = f.add(negateCt(isNegF, precomputes[offsetF])); + } + else { + // bits are 1: add to result point + p = p.add(negateCt(isNeg, precomputes[offset])); + } + } + assert0(n); + // Return both real and fake points: JIT won't eliminate f. + // At this point there is a way to F be infinity-point even if p is not, + // which makes it less const-time: around 1 bigint multiply. + return { p, f }; + } + /** + * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form. + * @param acc accumulator point to add result of multiplication + * @returns point + */ + wNAFUnsafe(W, precomputes, n, acc = this.ZERO) { + const wo = calcWOpts(W, this.bits); + for (let window = 0; window < wo.windows; window++) { + if (n === _0n$1) + break; // Early-exit, skip 0 value + const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo); + n = nextN; + if (isZero) { + // Window bits are 0: skip processing. + // Move to next window. + continue; + } + else { + const item = precomputes[offset]; + acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM + } + } + assert0(n); + return acc; + } + getPrecomputes(W, point, transform) { + // Calculate precomputes on a first run, reuse them after + let comp = pointPrecomputes.get(point); + if (!comp) { + comp = this.precomputeWindow(point, W); + if (W !== 1) { + // Doing transform outside of if brings 15% perf hit + if (typeof transform === 'function') + comp = transform(comp); + pointPrecomputes.set(point, comp); + } + } + return comp; + } + cached(point, scalar, transform) { + const W = getW(point); + return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar); + } + unsafe(point, scalar, transform, prev) { + const W = getW(point); + if (W === 1) + return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster + return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev); + } + // We calculate precomputes for elliptic curve point multiplication + // using windowed method. This specifies window size and + // stores precomputed values. Usually only base point would be precomputed. + createCache(P, W) { + validateW(W, this.bits); + pointWindowSizes.set(P, W); + pointPrecomputes.delete(P); + } + hasCache(elm) { + return getW(elm) !== 1; + } +} +/** + * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...). + * 30x faster vs naive addition on L=4096, 10x faster than precomputes. + * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL. + * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0. + * @param c Curve Point constructor + * @param fieldN field over CURVE.N - important that it's not over CURVE.P + * @param points array of L curve points + * @param scalars array of L scalars (aka secret keys / bigints) + */ +function pippenger(c, fieldN, points, scalars) { + // If we split scalars by some window (let's say 8 bits), every chunk will only + // take 256 buckets even if there are 4096 scalars, also re-uses double. + // TODO: + // - https://eprint.iacr.org/2024/750.pdf + // - https://tches.iacr.org/index.php/TCHES/article/view/10287 + // 0 is accepted in scalars + validateMSMPoints(points, c); + validateMSMScalars(scalars, fieldN); + const plength = points.length; + const slength = scalars.length; + if (plength !== slength) + throw new Error('arrays of points and scalars must have equal length'); + // if (plength === 0) throw new Error('array must be of length >= 2'); + const zero = c.ZERO; + const wbits = bitLen(BigInt(plength)); + let windowSize = 1; // bits + if (wbits > 12) + windowSize = wbits - 3; + else if (wbits > 4) + windowSize = wbits - 2; + else if (wbits > 0) + windowSize = 2; + const MASK = bitMask(windowSize); + const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array + const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize; + let sum = zero; + for (let i = lastBits; i >= 0; i -= windowSize) { + buckets.fill(zero); + for (let j = 0; j < slength; j++) { + const scalar = scalars[j]; + const wbits = Number((scalar >> BigInt(i)) & MASK); + buckets[wbits] = buckets[wbits].add(points[j]); + } + let resI = zero; // not using this will do small speed-up, but will lose ct + // Skip first bucket, because it is zero + for (let j = buckets.length - 1, sumI = zero; j > 0; j--) { + sumI = sumI.add(buckets[j]); + resI = resI.add(sumI); + } + sum = sum.add(resI); + if (i !== 0) + for (let j = 0; j < windowSize; j++) + sum = sum.double(); + } + return sum; +} +function createField(order, field, isLE) { + if (field) { + if (field.ORDER !== order) + throw new Error('Field.ORDER must match order: Fp == p, Fn == n'); + validateField(field); + return field; + } + else { + return Field(order, { isLE }); + } +} +/** Validates CURVE opts and creates fields */ +function _createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) { + if (FpFnLE === undefined) + FpFnLE = type === 'edwards'; + if (!CURVE || typeof CURVE !== 'object') + throw new Error(`expected valid ${type} CURVE object`); + for (const p of ['p', 'n', 'h']) { + const val = CURVE[p]; + if (!(typeof val === 'bigint' && val > _0n$1)) + throw new Error(`CURVE.${p} must be positive bigint`); + } + const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE); + const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE); + const _b = 'd'; + const params = ['Gx', 'Gy', 'a', _b]; + for (const p of params) { + // @ts-ignore + if (!Fp.isValid(CURVE[p])) + throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`); + } + CURVE = Object.freeze(Object.assign({}, CURVE)); + return { CURVE, Fp, Fn }; +} + +/** + * Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y². + * For design rationale of types / exports, see weierstrass module documentation. + * Untwisted Edwards curves exist, but they aren't used in real-world protocols. + * @module + */ +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +// Be friendly to bad ECMAScript parsers by not using bigint literals +// prettier-ignore +const _0n = BigInt(0), _1n$1 = BigInt(1), _2n$1 = BigInt(2), _8n = BigInt(8); +function isEdValidXY(Fp, CURVE, x, y) { + const x2 = Fp.sqr(x); + const y2 = Fp.sqr(y); + const left = Fp.add(Fp.mul(CURVE.a, x2), y2); + const right = Fp.add(Fp.ONE, Fp.mul(CURVE.d, Fp.mul(x2, y2))); + return Fp.eql(left, right); +} +function edwards(params, extraOpts = {}) { + const validated = _createCurveFields('edwards', params, extraOpts, extraOpts.FpFnLE); + const { Fp, Fn } = validated; + let CURVE = validated.CURVE; + const { h: cofactor } = CURVE; + _validateObject(extraOpts, {}, { uvRatio: 'function' }); + // Important: + // There are some places where Fp.BYTES is used instead of nByteLength. + // So far, everything has been tested with curves of Fp.BYTES == nByteLength. + // TODO: test and find curves which behave otherwise. + const MASK = _2n$1 << (BigInt(Fn.BYTES * 8) - _1n$1); + const modP = (n) => Fp.create(n); // Function overrides + // sqrt(u/v) + const uvRatio = extraOpts.uvRatio || + ((u, v) => { + try { + return { isValid: true, value: Fp.sqrt(Fp.div(u, v)) }; + } + catch (e) { + return { isValid: false, value: _0n }; + } + }); + // Validate whether the passed curve params are valid. + // equation ax² + y² = 1 + dx²y² should work for generator point. + if (!isEdValidXY(Fp, CURVE, CURVE.Gx, CURVE.Gy)) + throw new Error('bad curve params: generator point'); + /** + * Asserts coordinate is valid: 0 <= n < MASK. + * Coordinates >= Fp.ORDER are allowed for zip215. + */ + function acoord(title, n, banZero = false) { + const min = banZero ? _1n$1 : _0n; + aInRange('coordinate ' + title, n, min, MASK); + return n; + } + function aextpoint(other) { + if (!(other instanceof Point)) + throw new Error('ExtendedPoint expected'); + } + // Converts Extended point to default (x, y) coordinates. + // Can accept precomputed Z^-1 - for example, from invertBatch. + const toAffineMemo = memoized((p, iz) => { + const { X, Y, Z } = p; + const is0 = p.is0(); + if (iz == null) + iz = is0 ? _8n : Fp.inv(Z); // 8 was chosen arbitrarily + const x = modP(X * iz); + const y = modP(Y * iz); + const zz = Fp.mul(Z, iz); + if (is0) + return { x: _0n, y: _1n$1 }; + if (zz !== _1n$1) + throw new Error('invZ was invalid'); + return { x, y }; + }); + const assertValidMemo = memoized((p) => { + const { a, d } = CURVE; + if (p.is0()) + throw new Error('bad point: ZERO'); // TODO: optimize, with vars below? + // Equation in affine coordinates: ax² + y² = 1 + dx²y² + // Equation in projective coordinates (X/Z, Y/Z, Z): (aX² + Y²)Z² = Z⁴ + dX²Y² + const { X, Y, Z, T } = p; + const X2 = modP(X * X); // X² + const Y2 = modP(Y * Y); // Y² + const Z2 = modP(Z * Z); // Z² + const Z4 = modP(Z2 * Z2); // Z⁴ + const aX2 = modP(X2 * a); // aX² + const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z² + const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y² + if (left !== right) + throw new Error('bad point: equation left != right (1)'); + // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T + const XY = modP(X * Y); + const ZT = modP(Z * T); + if (XY !== ZT) + throw new Error('bad point: equation left != right (2)'); + return true; + }); + // Extended Point works in extended coordinates: (X, Y, Z, T) ∋ (x=X/Z, y=Y/Z, T=xy). + // https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates + class Point { + constructor(X, Y, Z, T) { + this.X = acoord('x', X); + this.Y = acoord('y', Y); + this.Z = acoord('z', Z, true); + this.T = acoord('t', T); + Object.freeze(this); + } + static CURVE() { + return CURVE; + } + static fromAffine(p) { + if (p instanceof Point) + throw new Error('extended point not allowed'); + const { x, y } = p || {}; + acoord('x', x); + acoord('y', y); + return new Point(x, y, _1n$1, modP(x * y)); + } + // Uses algo from RFC8032 5.1.3. + static fromBytes(bytes, zip215 = false) { + const len = Fp.BYTES; + const { a, d } = CURVE; + bytes = copyBytes(_abytes2(bytes, len, 'point')); + _abool2(zip215, 'zip215'); + const normed = copyBytes(bytes); // copy again, we'll manipulate it + const lastByte = bytes[len - 1]; // select last byte + normed[len - 1] = lastByte & -129; // clear last bit + const y = bytesToNumberLE(normed); + // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5. + // RFC8032 prohibits >= p, but ZIP215 doesn't + // zip215=true: 0 <= y < MASK (2^256 for ed25519) + // zip215=false: 0 <= y < P (2^255-19 for ed25519) + const max = zip215 ? MASK : Fp.ORDER; + aInRange('point.y', y, _0n, max); + // Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case: + // ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a) + const y2 = modP(y * y); // denominator is always non-0 mod p. + const u = modP(y2 - _1n$1); // u = y² - 1 + const v = modP(d * y2 - a); // v = d y² + 1. + let { isValid, value: x } = uvRatio(u, v); // √(u/v) + if (!isValid) + throw new Error('bad point: invalid y coordinate'); + const isXOdd = (x & _1n$1) === _1n$1; // There are 2 square roots. Use x_0 bit to select proper + const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit + if (!zip215 && x === _0n && isLastByteOdd) + // if x=0 and x_0 = 1, fail + throw new Error('bad point: x=0 and x_0=1'); + if (isLastByteOdd !== isXOdd) + x = modP(-x); // if x_0 != x mod 2, set x = p-x + return Point.fromAffine({ x, y }); + } + static fromHex(bytes, zip215 = false) { + return Point.fromBytes(ensureBytes('point', bytes), zip215); + } + get x() { + return this.toAffine().x; + } + get y() { + return this.toAffine().y; + } + precompute(windowSize = 8, isLazy = true) { + wnaf.createCache(this, windowSize); + if (!isLazy) + this.multiply(_2n$1); // random number + return this; + } + // Useful in fromAffine() - not for fromBytes(), which always created valid points. + assertValidity() { + assertValidMemo(this); + } + // Compare one point to another. + equals(other) { + aextpoint(other); + const { X: X1, Y: Y1, Z: Z1 } = this; + const { X: X2, Y: Y2, Z: Z2 } = other; + const X1Z2 = modP(X1 * Z2); + const X2Z1 = modP(X2 * Z1); + const Y1Z2 = modP(Y1 * Z2); + const Y2Z1 = modP(Y2 * Z1); + return X1Z2 === X2Z1 && Y1Z2 === Y2Z1; + } + is0() { + return this.equals(Point.ZERO); + } + negate() { + // Flips point sign to a negative one (-x, y in affine coords) + return new Point(modP(-this.X), this.Y, this.Z, modP(-this.T)); + } + // Fast algo for doubling Extended Point. + // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd + // Cost: 4M + 4S + 1*a + 6add + 1*2. + double() { + const { a } = CURVE; + const { X: X1, Y: Y1, Z: Z1 } = this; + const A = modP(X1 * X1); // A = X12 + const B = modP(Y1 * Y1); // B = Y12 + const C = modP(_2n$1 * modP(Z1 * Z1)); // C = 2*Z12 + const D = modP(a * A); // D = a*A + const x1y1 = X1 + Y1; + const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B + const G = D + B; // G = D+B + const F = G - C; // F = G-C + const H = D - B; // H = D-B + const X3 = modP(E * F); // X3 = E*F + const Y3 = modP(G * H); // Y3 = G*H + const T3 = modP(E * H); // T3 = E*H + const Z3 = modP(F * G); // Z3 = F*G + return new Point(X3, Y3, Z3, T3); + } + // Fast algo for adding 2 Extended Points. + // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd + // Cost: 9M + 1*a + 1*d + 7add. + add(other) { + aextpoint(other); + const { a, d } = CURVE; + const { X: X1, Y: Y1, Z: Z1, T: T1 } = this; + const { X: X2, Y: Y2, Z: Z2, T: T2 } = other; + const A = modP(X1 * X2); // A = X1*X2 + const B = modP(Y1 * Y2); // B = Y1*Y2 + const C = modP(T1 * d * T2); // C = T1*d*T2 + const D = modP(Z1 * Z2); // D = Z1*Z2 + const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B + const F = D - C; // F = D-C + const G = D + C; // G = D+C + const H = modP(B - a * A); // H = B-a*A + const X3 = modP(E * F); // X3 = E*F + const Y3 = modP(G * H); // Y3 = G*H + const T3 = modP(E * H); // T3 = E*H + const Z3 = modP(F * G); // Z3 = F*G + return new Point(X3, Y3, Z3, T3); + } + subtract(other) { + return this.add(other.negate()); + } + // Constant-time multiplication. + multiply(scalar) { + // 1 <= scalar < L + if (!Fn.isValidNot0(scalar)) + throw new Error('invalid scalar: expected 1 <= sc < curve.n'); + const { p, f } = wnaf.cached(this, scalar, (p) => normalizeZ(Point, p)); + return normalizeZ(Point, [p, f])[0]; + } + // Non-constant-time multiplication. Uses double-and-add algorithm. + // It's faster, but should only be used when you don't care about + // an exposed private key e.g. sig verification. + // Does NOT allow scalars higher than CURVE.n. + // Accepts optional accumulator to merge with multiply (important for sparse scalars) + multiplyUnsafe(scalar, acc = Point.ZERO) { + // 0 <= scalar < L + if (!Fn.isValid(scalar)) + throw new Error('invalid scalar: expected 0 <= sc < curve.n'); + if (scalar === _0n) + return Point.ZERO; + if (this.is0() || scalar === _1n$1) + return this; + return wnaf.unsafe(this, scalar, (p) => normalizeZ(Point, p), acc); + } + // Checks if point is of small order. + // If you add something to small order point, you will have "dirty" + // point with torsion component. + // Multiplies point by cofactor and checks if the result is 0. + isSmallOrder() { + return this.multiplyUnsafe(cofactor).is0(); + } + // Multiplies point by curve order and checks if the result is 0. + // Returns `false` is the point is dirty. + isTorsionFree() { + return wnaf.unsafe(this, CURVE.n).is0(); + } + // Converts Extended point to default (x, y) coordinates. + // Can accept precomputed Z^-1 - for example, from invertBatch. + toAffine(invertedZ) { + return toAffineMemo(this, invertedZ); + } + clearCofactor() { + if (cofactor === _1n$1) + return this; + return this.multiplyUnsafe(cofactor); + } + toBytes() { + const { x, y } = this.toAffine(); + // Fp.toBytes() allows non-canonical encoding of y (>= p). + const bytes = Fp.toBytes(y); + // Each y has 2 valid points: (x, y), (x,-y). + // When compressing, it's enough to store y and use the last byte to encode sign of x + bytes[bytes.length - 1] |= x & _1n$1 ? 0x80 : 0; + return bytes; + } + toHex() { + return bytesToHex(this.toBytes()); + } + toString() { + return ``; + } + // TODO: remove + get ex() { + return this.X; + } + get ey() { + return this.Y; + } + get ez() { + return this.Z; + } + get et() { + return this.T; + } + static normalizeZ(points) { + return normalizeZ(Point, points); + } + static msm(points, scalars) { + return pippenger(Point, Fn, points, scalars); + } + _setWindowSize(windowSize) { + this.precompute(windowSize); + } + toRawBytes() { + return this.toBytes(); + } + } + // base / generator point + Point.BASE = new Point(CURVE.Gx, CURVE.Gy, _1n$1, modP(CURVE.Gx * CURVE.Gy)); + // zero / infinity / identity point + Point.ZERO = new Point(_0n, _1n$1, _1n$1, _0n); // 0, 1, 1, 0 + // math field + Point.Fp = Fp; + // scalar field + Point.Fn = Fn; + const wnaf = new wNAF(Point, Fn.BITS); + Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms. + return Point; +} +/** + * Initializes EdDSA signatures over given Edwards curve. + */ +function eddsa(Point, cHash, eddsaOpts = {}) { + if (typeof cHash !== 'function') + throw new Error('"hash" function param is required'); + _validateObject(eddsaOpts, {}, { + adjustScalarBytes: 'function', + randomBytes: 'function', + domain: 'function', + prehash: 'function', + mapToCurve: 'function', + }); + const { prehash } = eddsaOpts; + const { BASE, Fp, Fn } = Point; + const randomBytes$1 = eddsaOpts.randomBytes || randomBytes; + const adjustScalarBytes = eddsaOpts.adjustScalarBytes || ((bytes) => bytes); + const domain = eddsaOpts.domain || + ((data, ctx, phflag) => { + _abool2(phflag, 'phflag'); + if (ctx.length || phflag) + throw new Error('Contexts/pre-hash are not supported'); + return data; + }); // NOOP + // Little-endian SHA512 with modulo n + function modN_LE(hash) { + return Fn.create(bytesToNumberLE(hash)); // Not Fn.fromBytes: it has length limit + } + // Get the hashed private scalar per RFC8032 5.1.5 + function getPrivateScalar(key) { + const len = lengths.secretKey; + key = ensureBytes('private key', key, len); + // Hash private key with curve's hash function to produce uniformingly random input + // Check byte lengths: ensure(64, h(ensure(32, key))) + const hashed = ensureBytes('hashed private key', cHash(key), 2 * len); + const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE + const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6) + const scalar = modN_LE(head); // The actual private scalar + return { head, prefix, scalar }; + } + /** Convenience method that creates public key from scalar. RFC8032 5.1.5 */ + function getExtendedPublicKey(secretKey) { + const { head, prefix, scalar } = getPrivateScalar(secretKey); + const point = BASE.multiply(scalar); // Point on Edwards curve aka public key + const pointBytes = point.toBytes(); + return { head, prefix, scalar, point, pointBytes }; + } + /** Calculates EdDSA pub key. RFC8032 5.1.5. */ + function getPublicKey(secretKey) { + return getExtendedPublicKey(secretKey).pointBytes; + } + // int('LE', SHA512(dom2(F, C) || msgs)) mod N + function hashDomainToScalar(context = Uint8Array.of(), ...msgs) { + const msg = concatBytes(...msgs); + return modN_LE(cHash(domain(msg, ensureBytes('context', context), !!prehash))); + } + /** Signs message with privateKey. RFC8032 5.1.6 */ + function sign(msg, secretKey, options = {}) { + msg = ensureBytes('message', msg); + if (prehash) + msg = prehash(msg); // for ed25519ph etc. + const { prefix, scalar, pointBytes } = getExtendedPublicKey(secretKey); + const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M) + const R = BASE.multiply(r).toBytes(); // R = rG + const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M) + const s = Fn.create(r + k * scalar); // S = (r + k * s) mod L + if (!Fn.isValid(s)) + throw new Error('sign failed: invalid s'); // 0 <= s < L + const rs = concatBytes(R, Fn.toBytes(s)); + return _abytes2(rs, lengths.signature, 'result'); + } + // verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex: + const verifyOpts = { zip215: true }; + /** + * Verifies EdDSA signature against message and public key. RFC8032 5.1.7. + * An extended group equation is checked. + */ + function verify(sig, msg, publicKey, options = verifyOpts) { + const { context, zip215 } = options; + const len = lengths.signature; + sig = ensureBytes('signature', sig, len); + msg = ensureBytes('message', msg); + publicKey = ensureBytes('publicKey', publicKey, lengths.publicKey); + if (zip215 !== undefined) + _abool2(zip215, 'zip215'); + if (prehash) + msg = prehash(msg); // for ed25519ph, etc + const mid = len / 2; + const r = sig.subarray(0, mid); + const s = bytesToNumberLE(sig.subarray(mid, len)); + let A, R, SB; + try { + // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5. + // zip215=true: 0 <= y < MASK (2^256 for ed25519) + // zip215=false: 0 <= y < P (2^255-19 for ed25519) + A = Point.fromBytes(publicKey, zip215); + R = Point.fromBytes(r, zip215); + SB = BASE.multiplyUnsafe(s); // 0 <= s < l is done inside + } + catch (error) { + return false; + } + if (!zip215 && A.isSmallOrder()) + return false; // zip215 allows public keys of small order + const k = hashDomainToScalar(context, R.toBytes(), A.toBytes(), msg); + const RkA = R.add(A.multiplyUnsafe(k)); + // Extended group equation + // [8][S]B = [8]R + [8][k]A' + return RkA.subtract(SB).clearCofactor().is0(); + } + const _size = Fp.BYTES; // 32 for ed25519, 57 for ed448 + const lengths = { + secretKey: _size, + publicKey: _size, + signature: 2 * _size, + seed: _size, + }; + function randomSecretKey(seed = randomBytes$1(lengths.seed)) { + return _abytes2(seed, lengths.seed, 'seed'); + } + function keygen(seed) { + const secretKey = utils.randomSecretKey(seed); + return { secretKey, publicKey: getPublicKey(secretKey) }; + } + function isValidSecretKey(key) { + return isBytes(key) && key.length === Fn.BYTES; + } + function isValidPublicKey(key, zip215) { + try { + return !!Point.fromBytes(key, zip215); + } + catch (error) { + return false; + } + } + const utils = { + getExtendedPublicKey, + randomSecretKey, + isValidSecretKey, + isValidPublicKey, + /** + * Converts ed public key to x public key. Uses formula: + * - ed25519: + * - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)` + * - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))` + * - ed448: + * - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)` + * - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))` + */ + toMontgomery(publicKey) { + const { y } = Point.fromBytes(publicKey); + const size = lengths.publicKey; + const is25519 = size === 32; + if (!is25519 && size !== 57) + throw new Error('only defined for 25519 and 448'); + const u = is25519 ? Fp.div(_1n$1 + y, _1n$1 - y) : Fp.div(y - _1n$1, y + _1n$1); + return Fp.toBytes(u); + }, + toMontgomerySecret(secretKey) { + const size = lengths.secretKey; + _abytes2(secretKey, size); + const hashed = cHash(secretKey.subarray(0, size)); + return adjustScalarBytes(hashed).subarray(0, size); + }, + /** @deprecated */ + randomPrivateKey: randomSecretKey, + /** @deprecated */ + precompute(windowSize = 8, point = Point.BASE) { + return point.precompute(windowSize, false); + }, + }; + return Object.freeze({ + keygen, + getPublicKey, + sign, + verify, + utils, + Point, + lengths, + }); +} +function _eddsa_legacy_opts_to_new(c) { + const CURVE = { + a: c.a, + d: c.d, + p: c.Fp.ORDER, + n: c.n, + h: c.h, + Gx: c.Gx, + Gy: c.Gy, + }; + const Fp = c.Fp; + const Fn = Field(CURVE.n, c.nBitLength, true); + const curveOpts = { Fp, Fn, uvRatio: c.uvRatio }; + const eddsaOpts = { + randomBytes: c.randomBytes, + adjustScalarBytes: c.adjustScalarBytes, + domain: c.domain, + prehash: c.prehash, + mapToCurve: c.mapToCurve, + }; + return { CURVE, curveOpts, hash: c.hash, eddsaOpts }; +} +function _eddsa_new_output_to_legacy(c, eddsa) { + const Point = eddsa.Point; + const legacy = Object.assign({}, eddsa, { + ExtendedPoint: Point, + CURVE: c, + nBitLength: Point.Fn.BITS, + nByteLength: Point.Fn.BYTES, + }); + return legacy; +} +// TODO: remove. Use eddsa +function twistedEdwards(c) { + const { CURVE, curveOpts, hash, eddsaOpts } = _eddsa_legacy_opts_to_new(c); + const Point = edwards(CURVE, curveOpts); + const EDDSA = eddsa(Point, hash, eddsaOpts); + return _eddsa_new_output_to_legacy(c, EDDSA); +} + +/** + * Edwards448 (not Ed448-Goldilocks) curve with following addons: + * - X448 ECDH + * - Decaf cofactor elimination + * - Elligator hash-to-group / point indistinguishability + * Conforms to RFC 8032 https://www.rfc-editor.org/rfc/rfc8032.html#section-5.2 + * @module + */ +/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */ +// edwards448 curve +// a = 1n +// d = Fp.neg(39081n) +// Finite field 2n**448n - 2n**224n - 1n +// Subgroup order +// 2n**446n - 13818066809895115352007386748515426880336692474882178609894547503885n +const ed448_CURVE = { + p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffff'), + n: BigInt('0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff7cca23e9c44edb49aed63690216cc2728dc58f552378c292ab5844f3'), + h: BigInt(4), + a: BigInt(1), + d: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffffffffff6756'), + Gx: BigInt('0x4f1970c66bed0ded221d15a622bf36da9e146570470f1767ea6de324a3d3a46412ae1af72ab66511433b80e18b00938e2626a82bc70cc05e'), + Gy: BigInt('0x693f46716eb6bc248876203756c9c7624bea73736ca3984087789c1e05a0c2d73ad3ff1ce67c39c4fdbd132c4ed7c8ad9808795bf230fa14'), +}; +// E448 NIST curve is identical to edwards448, except for: +// d = 39082/39081 +// Gx = 3/2 +const E448_CURVE = Object.assign({}, ed448_CURVE, { + d: BigInt('0xd78b4bdc7f0daf19f24f38c29373a2ccad46157242a50f37809b1da3412a12e79ccc9c81264cfe9ad080997058fb61c4243cc32dbaa156b9'), + Gx: BigInt('0x79a70b2b70400553ae7c9df416c792c61128751ac92969240c25a07d728bdc93e21f7787ed6972249de732f38496cd11698713093e9c04fc'), + Gy: BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000001'), +}); +const shake256_114 = /* @__PURE__ */ createHasher(() => shake256.create({ dkLen: 114 })); +// prettier-ignore +const _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3); BigInt(4); const _11n = BigInt(11); +// prettier-ignore +const _22n = BigInt(22), _44n = BigInt(44), _88n = BigInt(88), _223n = BigInt(223); +// powPminus3div4 calculates z = x^k mod p, where k = (p-3)/4. +// Used for efficient square root calculation. +// ((P-3)/4).toString(2) would produce bits [223x 1, 0, 222x 1] +function ed448_pow_Pminus3div4(x) { + const P = ed448_CURVE.p; + const b2 = (x * x * x) % P; + const b3 = (b2 * b2 * x) % P; + const b6 = (pow2(b3, _3n, P) * b3) % P; + const b9 = (pow2(b6, _3n, P) * b3) % P; + const b11 = (pow2(b9, _2n, P) * b2) % P; + const b22 = (pow2(b11, _11n, P) * b11) % P; + const b44 = (pow2(b22, _22n, P) * b22) % P; + const b88 = (pow2(b44, _44n, P) * b44) % P; + const b176 = (pow2(b88, _88n, P) * b88) % P; + const b220 = (pow2(b176, _44n, P) * b44) % P; + const b222 = (pow2(b220, _2n, P) * b2) % P; + const b223 = (pow2(b222, _1n, P) * x) % P; + return (pow2(b223, _223n, P) * b222) % P; +} +function adjustScalarBytes(bytes) { + // Section 5: Likewise, for X448, set the two least significant bits of the first byte to 0, + bytes[0] &= 252; // 0b11111100 + // and the most significant bit of the last byte to 1. + bytes[55] |= 128; // 0b10000000 + // NOTE: is NOOP for 56 bytes scalars (X25519/X448) + bytes[56] = 0; // Byte outside of group (456 buts vs 448 bits) + return bytes; +} +// Constant-time ratio of u to v. Allows to combine inversion and square root u/√v. +// Uses algo from RFC8032 5.1.3. +function uvRatio(u, v) { + const P = ed448_CURVE.p; + // https://www.rfc-editor.org/rfc/rfc8032#section-5.2.3 + // To compute the square root of (u/v), the first step is to compute the + // candidate root x = (u/v)^((p+1)/4). This can be done using the + // following trick, to use a single modular powering for both the + // inversion of v and the square root: + // x = (u/v)^((p+1)/4) = u³v(u⁵v³)^((p-3)/4) (mod p) + const u2v = mod(u * u * v, P); // u²v + const u3v = mod(u2v * u, P); // u³v + const u5v3 = mod(u3v * u2v * v, P); // u⁵v³ + const root = ed448_pow_Pminus3div4(u5v3); + const x = mod(u3v * root, P); + // Verify that root is exists + const x2 = mod(x * x, P); // x² + // If vx² = u, the recovered x-coordinate is x. Otherwise, no + // square root exists, and the decoding fails. + return { isValid: mod(x2 * v, P) === u, value: x }; +} +// Finite field 2n**448n - 2n**224n - 1n +// The value fits in 448 bits, but we use 456-bit (57-byte) elements because of bitflags. +// - ed25519 fits in 255 bits, allowing using last 1 byte for specifying bit flag of point negation. +// - ed448 fits in 448 bits. We can't use last 1 byte: we can only use a bit 224 in the middle. +const Fp = /* @__PURE__ */ (() => Field(ed448_CURVE.p, { BITS: 456, isLE: true }))(); +const Fn = /* @__PURE__ */ (() => Field(ed448_CURVE.n, { BITS: 456, isLE: true }))(); +// SHAKE256(dom4(phflag,context)||x, 114) +function dom4(data, ctx, phflag) { + if (ctx.length > 255) + throw new Error('context must be smaller than 255, got: ' + ctx.length); + return concatBytes(asciiToBytes('SigEd448'), new Uint8Array([phflag ? 1 : 0, ctx.length]), ctx, data); +} +// const ed448_eddsa_opts = { adjustScalarBytes, domain: dom4 }; +// const ed448_Point = edwards(ed448_CURVE, { Fp, Fn, uvRatio }); +const ED448_DEF = /* @__PURE__ */ (() => ({ + ...ed448_CURVE, + Fp, + Fn, + nBitLength: Fn.BITS, + hash: shake256_114, + adjustScalarBytes, + domain: dom4, + uvRatio, +}))(); +/** + * ed448 EdDSA curve and methods. + * @example + * import { ed448 } from '@noble/curves/ed448'; + * const { secretKey, publicKey } = ed448.keygen(); + * const msg = new TextEncoder().encode('hello'); + * const sig = ed448.sign(msg, secretKey); + * const isValid = ed448.verify(sig, msg, publicKey); + */ +const ed448 = twistedEdwards(ED448_DEF); +/** + * E448 curve, defined by NIST. + * E448 != edwards448 used in ed448. + * E448 is birationally equivalent to edwards448. + */ +edwards(E448_CURVE); + +function sha256(data) { + return r.crypto_hash_sha256(data); +} +function sha512Streaming(chunks, onProgress, totalBytes) { + const SEG = 4 * 1024 * 1024; + const state = r.crypto_hash_sha512_init(); + for (const chunk of chunks) { + for (let off = 0; off < chunk.length; off += SEG) { + const end = Math.min(off + SEG, chunk.length); + r.crypto_hash_sha512_update(state, chunk.subarray(off, end)); + } + } + return r.crypto_hash_sha512_final(state); +} + +await r.ready; +function generateEd25519KeyPair() { + const kp = r.crypto_sign_keypair(); + return { publicKey: kp.publicKey, privateKey: kp.privateKey }; +} +function ed25519KeyPairFromSeed(seed) { + const kp = r.crypto_sign_seed_keypair(seed); + return { publicKey: kp.publicKey, privateKey: kp.privateKey }; +} +function generateX25519KeyPair() { + const kp = r.crypto_box_keypair(); + return { publicKey: kp.publicKey, privateKey: kp.privateKey }; +} +function sign(privateKey, msg) { + return r.crypto_sign_detached(msg, privateKey); +} +function verify(publicKey, sig, msg) { + try { + return r.crypto_sign_verify_detached(sig, msg, publicKey); + } catch { + return false; + } +} +function dh(publicKey, privateKey) { + return r.crypto_scalarmult(privateKey, publicKey); +} +const ED25519_PUBKEY_DER_PREFIX = new Uint8Array([ + 48, + 42, + 48, + 5, + 6, + 3, + 43, + 101, + 112, + 3, + 33, + 0 +]); +const X25519_PUBKEY_DER_PREFIX = new Uint8Array([ + 48, + 42, + 48, + 5, + 6, + 3, + 43, + 101, + 110, + 3, + 33, + 0 +]); +function encodePubKeyEd25519(rawPubKey) { + return concatBytes$1(ED25519_PUBKEY_DER_PREFIX, rawPubKey); +} +function decodePubKeyEd25519(der) { + if (der.length !== 44) throw new Error("decodePubKeyEd25519: invalid length"); + for (let i = 0; i < ED25519_PUBKEY_DER_PREFIX.length; i++) { + if (der[i] !== ED25519_PUBKEY_DER_PREFIX[i]) throw new Error("decodePubKeyEd25519: invalid DER prefix"); + } + return der.subarray(12); +} +function encodePubKeyX25519(rawPubKey) { + return concatBytes$1(X25519_PUBKEY_DER_PREFIX, rawPubKey); +} +function decodePubKeyX25519(der) { + if (der.length !== 44) throw new Error("decodePubKeyX25519: invalid length"); + for (let i = 0; i < X25519_PUBKEY_DER_PREFIX.length; i++) { + if (der[i] !== X25519_PUBKEY_DER_PREFIX[i]) throw new Error("decodePubKeyX25519: invalid DER prefix"); + } + return der.subarray(12); +} +const ED448_PUBKEY_DER_PREFIX = new Uint8Array([ + 48, + 67, + 48, + 5, + 6, + 3, + 43, + 101, + 113, + 3, + 58, + 0 +]); +function decodePubKeyEd448(der) { + if (der.length !== 69) throw new Error("decodePubKeyEd448: invalid length"); + for (let i = 0; i < ED448_PUBKEY_DER_PREFIX.length; i++) { + if (der[i] !== ED448_PUBKEY_DER_PREFIX[i]) throw new Error("decodePubKeyEd448: invalid DER prefix"); + } + return der.subarray(12); +} +function verifyEd448(publicKey, sig, msg) { + try { + return ed448.verify(sig, msg, publicKey); + } catch { + return false; + } +} +const ED25519_PRIVKEY_DER_PREFIX = new Uint8Array([ + 48, + 46, + 2, + 1, + 0, + 48, + 5, + 6, + 3, + 43, + 101, + 112, + 4, + 34, + 4, + 32 +]); +function encodePrivKeyEd25519(privateKey) { + const seed = privateKey.subarray(0, 32); + return concatBytes$1(ED25519_PRIVKEY_DER_PREFIX, seed); +} +function decodePrivKeyEd25519(der) { + if (der.length !== 48) throw new Error("decodePrivKeyEd25519: invalid length"); + for (let i = 0; i < ED25519_PRIVKEY_DER_PREFIX.length; i++) { + if (der[i] !== ED25519_PRIVKEY_DER_PREFIX[i]) throw new Error("decodePrivKeyEd25519: invalid DER prefix"); + } + return der.subarray(16); +} + +const chunkSize0 = kb(64); +const chunkSize1 = kb(256); +const chunkSize2 = mb(1); +const chunkSize3 = mb(4); +const fileSizeLen = 8; +const authTagSize = 16; +function size34(sz) { + return Math.floor(sz * 3 / 4); +} +function prepareChunkSizes(payloadSize) { + let smallSize, bigSize; + if (payloadSize > size34(chunkSize3)) { + smallSize = chunkSize2; + bigSize = chunkSize3; + } else if (payloadSize > size34(chunkSize2)) { + smallSize = chunkSize1; + bigSize = chunkSize2; + } else { + smallSize = chunkSize0; + bigSize = chunkSize1; + } + function prepareSizes(size) { + if (size === 0) return []; + if (size >= bigSize) { + const n1 = Math.floor(size / bigSize); + const remSz = size % bigSize; + return new Array(n1).fill(bigSize).concat(prepareSizes(remSz)); + } + if (size > size34(bigSize)) return [bigSize]; + const n2 = Math.floor(size / smallSize); + const remSz2 = size % smallSize; + return new Array(remSz2 === 0 ? n2 : n2 + 1).fill(smallSize); + } + return prepareSizes(payloadSize); +} +function prepareChunkSpecs(chunkSizes) { + const specs = []; + let offset = 0; + for (const size of chunkSizes) { + specs.push({ chunkOffset: offset, chunkSize: size }); + offset += size; + } + return specs; +} +function getChunkDigest(chunk) { + return sha256(chunk); +} + +const XFTP_BLOCK_SIZE = 16384; +const initialXFTPVersion = 1; +const currentXFTPVersion = 3; +function blockPad(msg, blockSize = XFTP_BLOCK_SIZE) { + const len = msg.length; + const padLen = blockSize - len - 2; + if (padLen < 0) throw new Error("blockPad: message too large for block"); + const result = new Uint8Array(blockSize); + result[0] = len >>> 8 & 255; + result[1] = len & 255; + result.set(msg, 2); + result.fill(35, 2 + len); + return result; +} +function blockUnpad(block) { + if (block.length < 2) throw new Error("blockUnpad: too short"); + const len = block[0] << 8 | block[1]; + if (2 + len > block.length) throw new Error("blockUnpad: invalid length"); + return block.subarray(2, 2 + len); +} +function encodeAuthTransmission(sessionId, corrId, entityId, cmdBytes, privateKey) { + const tInner = concatBytes$1(encodeBytes(corrId), encodeBytes(entityId), cmdBytes); + const tForAuth = concatBytes$1(encodeBytes(sessionId), tInner); + const signature = sign(privateKey, tForAuth); + const authenticator = encodeBytes(signature); + const encoded = concatBytes$1(authenticator, tForAuth); + const batch = concatBytes$1(new Uint8Array([1]), encodeLarge(encoded)); + return blockPad(batch); +} +function decodeTransmission(sessionId, block) { + const raw = blockUnpad(block); + const d = new Decoder(raw); + const count = d.anyByte(); + if (count !== 1) throw new Error("decodeTransmission: expected batch count 1, got " + count); + const transmission = decodeLarge(d); + const td = new Decoder(transmission); + decodeBytes(td); + const sessId = decodeBytes(td); + if (sessId.length !== sessionId.length || !sessId.every((b, i) => b === sessionId[i])) { + console.error("[XFTP] Session ID mismatch in server response"); + throw new Error("Session ID mismatch in server response"); + } + const corrId = decodeBytes(td); + const entityId = decodeBytes(td); + const command = td.takeAll(); + return { corrId, entityId, command }; +} + +function decodeVersionRange(d) { + const minVersion = decodeWord16(d); + const maxVersion = decodeWord16(d); + if (minVersion > maxVersion) throw new Error("invalid version range: min > max"); + return { minVersion, maxVersion }; +} +function compatibleVRange(a, b) { + const min = Math.max(a.minVersion, b.minVersion); + const max = Math.min(a.maxVersion, b.maxVersion); + if (min > max) return null; + return { minVersion: min, maxVersion: max }; +} +function encodeClientHello(hello) { + const body = encodeMaybe(encodeBytes, hello.webChallenge); + return hello.webChallenge ? blockPad(body, XFTP_BLOCK_SIZE) : body; +} +function encodeClientHandshake(ch) { + const body = concatBytes$1(encodeWord16(ch.xftpVersion), encodeBytes(ch.keyHash)); + return blockPad(body, XFTP_BLOCK_SIZE); +} +function decodeServerHandshake(block) { + const raw = blockUnpad(block); + if (raw.length < 20) { + const text = String.fromCharCode(...raw); + if (/^[A-Z_]+$/.test(text)) { + console.error("[XFTP] Server handshake error: %s", text); + throw new Error("Server handshake error: " + text); + } + } + const d = new Decoder(raw); + const xftpVersionRange = decodeVersionRange(d); + const sessionId = decodeBytes(d); + const certChainDer = decodeNonEmpty(decodeLarge, d); + const signedKeyDer = decodeLarge(d); + let webIdentityProof = null; + if (d.remaining() > 0) { + const sigBytes = decodeBytes(d); + webIdentityProof = sigBytes.length === 0 ? null : sigBytes; + } + return { xftpVersionRange, sessionId, certChainDer, signedKeyDer, webIdentityProof }; +} +function chainIdCaCerts(certChainDer) { + switch (certChainDer.length) { + case 0: + return { type: "empty" }; + case 1: + return { type: "self", cert: certChainDer[0] }; + case 2: + return { type: "valid", leafCert: certChainDer[0], idCert: certChainDer[1], caCert: certChainDer[1] }; + case 3: + return { type: "valid", leafCert: certChainDer[0], idCert: certChainDer[1], caCert: certChainDer[2] }; + case 4: + return { type: "valid", leafCert: certChainDer[0], idCert: certChainDer[1], caCert: certChainDer[3] }; + default: + return { type: "long" }; + } +} +function derLength(d) { + const first = d.anyByte(); + if (first < 128) return first; + const numBytes = first & 127; + if (numBytes === 0 || numBytes > 4) throw new Error("DER: unsupported length encoding"); + let len = 0; + for (let i = 0; i < numBytes; i++) { + len = len << 8 | d.anyByte(); + } + return len; +} +function derElement(d) { + const start = d.offset(); + d.anyByte(); + const len = derLength(d); + d.take(len); + return d.buf.subarray(start, d.offset()); +} +function extractSignedKey(signedDer) { + const outer = new Decoder(signedDer); + const outerTag = outer.anyByte(); + if (outerTag !== 48) throw new Error("SignedExact: expected SEQUENCE tag 0x30, got 0x" + outerTag.toString(16)); + derLength(outer); + const objectDer = derElement(outer); + const algorithm = derElement(outer); + const sigTag = outer.anyByte(); + if (sigTag !== 3) throw new Error("SignedExact: expected BIT STRING tag 0x03, got 0x" + sigTag.toString(16)); + const sigLen = derLength(outer); + const unusedBits = outer.anyByte(); + if (unusedBits !== 0) throw new Error("SignedExact: expected 0 unused bits in signature"); + const signature = outer.take(sigLen - 1); + const dhKey = decodeX25519Key(objectDer); + return { objectDer, dhKey, algorithm, signature }; +} +function decodeX25519Key(der) { + if (der.length === 44) return decodePubKeyX25519(der); + if (der[0] !== 48) throw new Error("decodeX25519Key: expected SEQUENCE"); + const d = new Decoder(der); + d.anyByte(); + derLength(d); + const inner = derElement(d); + return decodePubKeyX25519(inner); +} + +function derLen(d) { + const first = d.anyByte(); + if (first < 128) return first; + const n = first & 127; + if (n === 0 || n > 4) throw new Error("DER: unsupported length encoding"); + let len = 0; + for (let i = 0; i < n; i++) len = len << 8 | d.anyByte(); + return len; +} +function derSkip(d) { + d.anyByte(); + d.take(derLen(d)); +} +function derReadElement(d) { + const start = d.offset(); + d.anyByte(); + d.take(derLen(d)); + return d.buf.subarray(start, d.offset()); +} +function extractCertPublicKeyInfo(certDer) { + const d = new Decoder(certDer); + if (d.anyByte() !== 48) throw new Error("X.509: expected Certificate SEQUENCE"); + derLen(d); + if (d.anyByte() !== 48) throw new Error("X.509: expected TBSCertificate SEQUENCE"); + derLen(d); + if (d.buf[d.offset()] === 160) derSkip(d); + derSkip(d); + derSkip(d); + derSkip(d); + derSkip(d); + derSkip(d); + return derReadElement(d); +} +function detectKeyAlgorithm(spki) { + if (spki.length === 44 && spki[8] === 112) return "ed25519"; + if (spki.length === 69 && spki[8] === 113) return "ed448"; + throw new Error("unsupported certificate key algorithm"); +} +function extractCertRawKey(spki) { + const alg = detectKeyAlgorithm(spki); + const key = alg === "ed25519" ? decodePubKeyEd25519(spki) : decodePubKeyEd448(spki); + return { key, alg }; +} +function verifySig(alg, key, sig, msg) { + return alg === "ed25519" ? verify(key, sig, msg) : verifyEd448(key, sig, msg); +} +function verifyIdentityProof(v) { + const cc = chainIdCaCerts(v.certChainDer); + if (cc.type !== "valid") return false; + const fp = sha256(cc.idCert); + if (!constantTimeEqual$1(fp, v.keyHash)) return false; + const spki = extractCertPublicKeyInfo(cc.leafCert); + const { key, alg } = extractCertRawKey(spki); + if (!verifySig(alg, key, v.sigBytes, concatBytes$1(v.challenge, v.sessionId))) return false; + const sk = extractSignedKey(v.signedKeyDer); + return verifySig(alg, key, sk.signature, sk.objectDer); +} +function constantTimeEqual$1(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +function encodeFileInfo(fi) { + return concatBytes$1(encodeBytes(fi.sndKey), encodeWord32(fi.size), encodeBytes(fi.digest)); +} +const SPACE = new Uint8Array([32]); +function ascii(s) { + const buf = new Uint8Array(s.length); + for (let i = 0; i < s.length; i++) buf[i] = s.charCodeAt(i); + return buf; +} +function encodeFNEW(file, rcvKeys, auth) { + return concatBytes$1( + ascii("FNEW"), + SPACE, + encodeFileInfo(file), + encodeNonEmpty(encodeBytes, rcvKeys), + encodeMaybe(encodeBytes, auth) + ); +} +function encodeFPUT() { + return ascii("FPUT"); +} +function encodeFGET(rcvDhKey) { + return concatBytes$1(ascii("FGET"), SPACE, encodeBytes(rcvDhKey)); +} +function readTag(d) { + const start = d.offset(); + while (d.remaining() > 0) { + if (d.buf[d.offset()] === 32 || d.buf[d.offset()] === 10) break; + d.anyByte(); + } + let s = ""; + for (let i = start; i < d.offset(); i++) s += String.fromCharCode(d.buf[i]); + return s; +} +function readSpace(d) { + if (d.anyByte() !== 32) throw new Error("expected space"); +} +function decodeCommandError(s) { + if (s === "UNKNOWN" || s === "SYNTAX" || s === "PROHIBITED" || s === "NO_AUTH" || s === "HAS_AUTH" || s === "NO_ENTITY") return s; + if (s === "NO_QUEUE") return "NO_ENTITY"; + throw new Error("bad CommandError: " + s); +} +function decodeXFTPError(d) { + const s = readTag(d); + switch (s) { + case "BLOCK": + return { type: "BLOCK" }; + case "SESSION": + return { type: "SESSION" }; + case "HANDSHAKE": + return { type: "HANDSHAKE" }; + case "CMD": { + readSpace(d); + return { type: "CMD", cmdErr: decodeCommandError(readTag(d)) }; + } + case "AUTH": + return { type: "AUTH" }; + case "BLOCKED": { + readSpace(d); + const rest = d.takeAll(); + let info = ""; + for (let i = 0; i < rest.length; i++) info += String.fromCharCode(rest[i]); + return { type: "BLOCKED", blockInfo: info }; + } + case "SIZE": + return { type: "SIZE" }; + case "QUOTA": + return { type: "QUOTA" }; + case "DIGEST": + return { type: "DIGEST" }; + case "CRYPTO": + return { type: "CRYPTO" }; + case "NO_FILE": + return { type: "NO_FILE" }; + case "HAS_FILE": + return { type: "HAS_FILE" }; + case "FILE_IO": + return { type: "FILE_IO" }; + case "TIMEOUT": + return { type: "TIMEOUT" }; + case "INTERNAL": + return { type: "INTERNAL" }; + default: + throw new Error("bad XFTPErrorType: " + s); + } +} +function decodeResponse(data) { + const d = new Decoder(data); + const tagStr = readTag(d); + switch (tagStr) { + case "SIDS": { + readSpace(d); + const senderId = decodeBytes(d); + return { type: "FRSndIds", senderId, recipientIds: decodeNonEmpty(decodeBytes, d) }; + } + case "RIDS": { + readSpace(d); + return { type: "FRRcvIds", recipientIds: decodeNonEmpty(decodeBytes, d) }; + } + case "FILE": { + readSpace(d); + const rcvDhKey = decodePubKeyX25519(decodeBytes(d)); + const nonce = d.take(24); + return { type: "FRFile", rcvDhKey, nonce }; + } + case "OK": + return { type: "FROk" }; + case "ERR": { + readSpace(d); + return { type: "FRErr", err: decodeXFTPError(d) }; + } + case "PONG": + return { type: "FRPong" }; + default: + throw new Error("unknown response: " + tagStr); + } +} + +function decryptTransportChunk(dhSecret, cbNonce, encData) { + if (encData.length < 16) return { valid: false, content: new Uint8Array(0), computedTag: new Uint8Array(0) }; + const cipher = encData.subarray(0, encData.length - 16); + const providedTag = encData.subarray(encData.length - 16); + const state = cbInit(dhSecret, cbNonce); + const plaintext = sbDecryptChunk(state, cipher); + const computedTag = sbAuth(state); + const valid = constantTimeEqual(providedTag, computedTag); + return { valid, content: plaintext, computedTag }; +} +function constantTimeEqual(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +function decryptReceivedChunk(dhSecret, cbNonce, encData, expectedDigest) { + encData.slice(encData.length - 16); + const { valid, content } = decryptTransportChunk(dhSecret, cbNonce, encData); + if (!valid) throw new Error("transport auth tag verification failed"); + if (expectedDigest !== null) { + const actual = sha256(content); + if (!digestEqual$1(actual, expectedDigest)) { + throw new Error("chunk digest mismatch"); + } + } + return content; +} +function processDownloadedFile(fd, plaintextChunks) { + return decryptChunks(BigInt(fd.size), plaintextChunks, fd.key, fd.nonce); +} +function digestEqual$1(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +class XFTPRetriableError extends Error { + constructor(errorType) { + super(humanReadableMessage(errorType)); + this.errorType = errorType; + this.name = "XFTPRetriableError"; + } +} +class XFTPPermanentError extends Error { + constructor(errorType, message) { + super(message); + this.errorType = errorType; + this.name = "XFTPPermanentError"; + } +} +function isRetriable(e) { + if (e instanceof XFTPRetriableError) return true; + if (e instanceof XFTPPermanentError) return false; + if (e instanceof TypeError) return true; + if (e instanceof Error && e.name === "AbortError") return true; + return false; +} +function categorizeError(e) { + if (e instanceof XFTPRetriableError || e instanceof XFTPPermanentError) return e; + if (e instanceof TypeError) return new XFTPRetriableError("NETWORK"); + if (e instanceof Error && e.name === "AbortError") return new XFTPRetriableError("TIMEOUT"); + return e instanceof Error ? e : new Error(String(e)); +} +function humanReadableMessage(errorType) { + const t = typeof errorType === "string" ? errorType : errorType.type; + switch (t) { + case "SESSION": + return "Session expired, reconnecting..."; + case "HANDSHAKE": + return "Connection interrupted, reconnecting..."; + case "NETWORK": + return "Network error, retrying..."; + case "TIMEOUT": + return "Server timeout, retrying..."; + case "AUTH": + return "File is invalid, expired, or has been removed"; + case "NO_FILE": + return "File not found — it may have expired"; + case "SIZE": + return "File size exceeds server limit"; + case "QUOTA": + return "Server storage quota exceeded"; + case "BLOCKED": + return "File has been blocked by server"; + case "DIGEST": + return "File integrity check failed"; + case "INTERNAL": + return "Server internal error"; + case "CMD": + return "Protocol error"; + default: + return "Server error: " + t; + } +} +const DEFAULT_TRANSPORT_CONFIG = { timeoutMs: 3e4 }; +const isNode = typeof globalThis.process !== "undefined" && globalThis.process.versions?.node; +async function createTransport(baseUrl, config) { + if (isNode) { + return createNodeTransport(baseUrl, config); + } else { + return createBrowserTransport(baseUrl, config); + } +} +async function createNodeTransport(baseUrl, config) { + const http2 = await __vitePreload(() => import('node:http2'),true ?[]:void 0,import.meta.url); + const session = http2.connect(baseUrl, { rejectUnauthorized: false }); + return { + async post(body, headers) { + return new Promise((resolve, reject) => { + const req = session.request({ ":method": "POST", ":path": "/", ...headers }); + req.setTimeout(config.timeoutMs, () => { + req.close(); + reject(Object.assign(new Error("Request timeout"), { name: "AbortError" })); + }); + const chunks = []; + req.on("data", (chunk) => chunks.push(chunk)); + req.on("end", () => { + const B = globalThis.Buffer; + resolve(new Uint8Array(B.concat(chunks))); + }); + req.on("error", reject); + req.end(body); + }); + }, + close() { + session.close(); + } + }; +} +function createBrowserTransport(baseUrl, config) { + const effectiveUrl = baseUrl; + return { + async post(body, headers) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), config.timeoutMs); + try { + const resp = await fetch(effectiveUrl, { + method: "POST", + headers, + body, + signal: controller.signal + }); + if (!resp.ok) { + console.error("[XFTP] fetch %s failed: %d %s", effectiveUrl, resp.status, resp.statusText); + throw new Error(`Server request failed: ${resp.status} ${resp.statusText}`); + } + return new Uint8Array(await resp.arrayBuffer()); + } finally { + clearTimeout(timer); + } + }, + close() { + } + }; +} +function newXFTPAgent() { + return { connections: /* @__PURE__ */ new Map(), _connectFn: connectXFTP }; +} +function getXFTPServerClient(agent, server) { + const key = formatXFTPServer(server); + let conn = agent.connections.get(key); + if (!conn) { + const p = agent._connectFn(server); + conn = { client: p, queue: Promise.resolve() }; + agent.connections.set(key, conn); + p.catch(() => { + const cur = agent.connections.get(key); + if (cur && cur.client === p) agent.connections.delete(key); + }); + } + return conn.client; +} +function reconnectClient(agent, server) { + const key = formatXFTPServer(server); + const old = agent.connections.get(key); + old?.client.then((c) => c.transport.close(), () => { + }); + const p = agent._connectFn(server); + const conn = { client: p, queue: old?.queue ?? Promise.resolve() }; + agent.connections.set(key, conn); + p.catch(() => { + const cur = agent.connections.get(key); + if (cur && cur.client === p) agent.connections.delete(key); + }); + return p; +} +function removeStaleConnection(agent, server, failedP) { + const key = formatXFTPServer(server); + const conn = agent.connections.get(key); + if (conn && conn.client === failedP) { + agent.connections.delete(key); + failedP.then((c) => c.transport.close(), () => { + }); + } +} +function closeXFTPAgent(agent) { + for (const conn of agent.connections.values()) { + conn.client.then((c) => c.transport.close(), () => { + }); + } + agent.connections.clear(); +} +async function connectXFTP(server, config) { + const cfg = { ...DEFAULT_TRANSPORT_CONFIG, ...config }; + const baseUrl = "https://" + server.host + ":" + server.port; + const transport = await createTransport(baseUrl, cfg); + try { + const challenge = new Uint8Array(32); + crypto.getRandomValues(challenge); + const clientHelloBytes = encodeClientHello({ webChallenge: challenge }); + const shsBody = await transport.post(clientHelloBytes, { "xftp-web-hello": "1" }); + const hs = decodeServerHandshake(shsBody); + if (!hs.webIdentityProof) { + console.error("[XFTP] Server did not provide web identity proof"); + throw new Error("Server did not provide web identity proof"); + } + const idOk = verifyIdentityProof({ + certChainDer: hs.certChainDer, + signedKeyDer: hs.signedKeyDer, + sigBytes: hs.webIdentityProof, + challenge, + sessionId: hs.sessionId, + keyHash: server.keyHash + }); + if (!idOk) { + console.error("[XFTP] Server identity verification failed"); + throw new Error("Server identity verification failed"); + } + const vr = compatibleVRange(hs.xftpVersionRange, { minVersion: initialXFTPVersion, maxVersion: currentXFTPVersion }); + if (!vr) { + console.error("[XFTP] Incompatible server version: %o", hs.xftpVersionRange); + throw new Error("Incompatible server version"); + } + const xftpVersion = vr.maxVersion; + const ack = await transport.post(encodeClientHandshake({ xftpVersion, keyHash: server.keyHash }), { "xftp-handshake": "1" }); + if (ack.length !== 0) { + console.error("[XFTP] Non-empty handshake ack (%d bytes)", ack.length); + throw new Error("Server handshake failed"); + } + return { baseUrl, sessionId: hs.sessionId, xftpVersion, transport }; + } catch (e) { + console.error("[XFTP] Connection to %s failed:", baseUrl, e); + transport.close(); + throw e; + } +} +async function sendXFTPCommandOnce(client, privateKey, entityId, cmdBytes, chunkData) { + const corrId = new Uint8Array(0); + const block = encodeAuthTransmission(client.sessionId, corrId, entityId, cmdBytes, privateKey); + const reqBody = chunkData ? concatBytes$1(block, chunkData) : block; + const fullResp = await client.transport.post(reqBody); + console.log(`[XFTP-DBG] sendOnce: fullResp.length=${fullResp.length} entityId=${_hex(entityId)} cmdTag=${cmdBytes[0]}`); + if (fullResp.length < XFTP_BLOCK_SIZE) { + console.error("[XFTP] Response too short: %d bytes (expected >= %d)", fullResp.length, XFTP_BLOCK_SIZE); + throw new Error("Server response too short"); + } + const respBlock = fullResp.subarray(0, XFTP_BLOCK_SIZE); + const body = fullResp.subarray(XFTP_BLOCK_SIZE); + console.log(`[XFTP-DBG] sendOnce: body.length=${body.length} body.byteOffset=${body.byteOffset} body.buffer.byteLength=${body.buffer.byteLength}`); + const raw = blockUnpad(respBlock); + if (raw.length < 20) { + const text = new TextDecoder().decode(raw); + if (/^[A-Z_]+$/.test(text)) { + throw new XFTPRetriableError(text); + } + } + const { command } = decodeTransmission(client.sessionId, respBlock); + const response = decodeResponse(command); + if (response.type === "FRErr") { + const err = response.err; + if (err.type === "SESSION" || err.type === "HANDSHAKE") { + throw new XFTPRetriableError(err.type); + } + throw new XFTPPermanentError(err.type, humanReadableMessage(err)); + } + return { response, body }; +} +function _hex(b, n = 8) { + return Array.from(b.slice(0, n)).map((x) => x.toString(16).padStart(2, "0")).join(""); +} +async function sendXFTPCommand(agent, server, privateKey, entityId, cmdBytes, chunkData, maxRetries = 3) { + let clientP = getXFTPServerClient(agent, server); + let client = await clientP; + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + if (attempt > 1) console.log(`[XFTP-DBG] sendCmd: retry attempt=${attempt}/${maxRetries}`); + return await sendXFTPCommandOnce(client, privateKey, entityId, cmdBytes, chunkData); + } catch (e) { + console.log(`[XFTP-DBG] sendCmd: attempt=${attempt} failed: ${e instanceof Error ? e.message : String(e)} retriable=${isRetriable(e)}`); + if (!isRetriable(e)) { + throw categorizeError(e); + } + if (attempt === maxRetries) { + removeStaleConnection(agent, server, clientP); + throw categorizeError(e); + } + clientP = reconnectClient(agent, server); + client = await clientP; + } + } + throw new Error("unreachable"); +} +async function createXFTPChunk(agent, server, spKey, file, rcvKeys, auth = null) { + const { response } = await sendXFTPCommand(agent, server, spKey, new Uint8Array(0), encodeFNEW(file, rcvKeys, auth)); + if (response.type !== "FRSndIds") throw new Error("unexpected response: " + response.type); + return { senderId: response.senderId, recipientIds: response.recipientIds }; +} +async function uploadXFTPChunk(agent, server, spKey, fId, chunkData) { + const { response } = await sendXFTPCommand(agent, server, spKey, fId, encodeFPUT(), chunkData); + if (response.type !== "FROk") throw new Error("unexpected response: " + response.type); +} +async function downloadXFTPChunkRaw(agent, server, rpKey, fId) { + const { publicKey, privateKey } = generateX25519KeyPair(); + const cmd = encodeFGET(encodePubKeyX25519(publicKey)); + const { response, body } = await sendXFTPCommand(agent, server, rpKey, fId, cmd); + if (response.type !== "FRFile") throw new Error("unexpected response: " + response.type); + const dhSecret = dh(response.rcvDhKey, privateKey); + console.log(`[XFTP-DBG] dlChunkRaw: body.length=${body.length} nonce=${_hex(response.nonce, 24)} dhSecret=${_hex(dhSecret)} body[0..8]=${_hex(body)} body[-8..]=${_hex(body.slice(-8))}`); + return { dhSecret, nonce: response.nonce, body }; +} +async function downloadXFTPChunk(agent, server, rpKey, fId, digest) { + const { dhSecret, nonce, body } = await downloadXFTPChunkRaw(agent, server, rpKey, fId); + return decryptReceivedChunk(dhSecret, nonce, body, digest ?? null); +} + +function encodeDescriptionURI(fd) { + const yaml = encodeFileDescription(fd); + const compressed = pako.deflateRaw(new TextEncoder().encode(yaml)); + return base64urlEncode(compressed); +} +function decodeDescriptionURI(fragment) { + const compressed = base64urlDecode$1(fragment); + const yaml = new TextDecoder().decode(pako.inflateRaw(compressed)); + const fd = decodeFileDescription(yaml); + const err = validateFileDescription(fd); + if (err) throw new Error("decodeDescriptionURI: " + err); + return fd; +} +function encryptFileForUpload(source, fileName) { + const key = new Uint8Array(32); + const nonce = new Uint8Array(24); + crypto.getRandomValues(key); + crypto.getRandomValues(nonce); + const fileHdr = encodeFileHeader({ fileName, fileExtra: null }); + const fileSize = BigInt(fileHdr.length + source.length); + const payloadSize = Number(fileSize) + fileSizeLen + authTagSize; + const chunkSizes = prepareChunkSizes(payloadSize); + const encSize = BigInt(chunkSizes.reduce((a, b) => a + b, 0)); + const encData = encryptFile(source, fileHdr, key, nonce, fileSize, encSize); + const digest = sha512Streaming([encData]); + console.log(`[AGENT-DBG] encrypt: encData.len=${encData.length} digest=${_dbgHex(digest, 64)} chunkSizes=[${chunkSizes.join(",")}]`); + return { encData, digest, key, nonce, chunkSizes }; +} +const DEFAULT_REDIRECT_THRESHOLD = 400; +async function uploadFile(agent, servers, encrypted, options) { + if (servers.length === 0) throw new Error("uploadFile: servers list is empty"); + const { onProgress, redirectThreshold, readChunk: readChunkOpt } = options ?? {}; + const readChunk = readChunkOpt ? readChunkOpt : "encData" in encrypted ? (off, sz) => Promise.resolve(encrypted.encData.subarray(off, off + sz)) : () => { + throw new Error("uploadFile: readChunk required when encData is absent"); + }; + const total = encrypted.chunkSizes.reduce((a, b) => a + b, 0); + const specs = prepareChunkSpecs(encrypted.chunkSizes); + const chunkJobs = specs.map((spec, i) => ({ + index: i, + spec, + server: servers[Math.floor(Math.random() * servers.length)] + })); + const byServer = /* @__PURE__ */ new Map(); + for (const job of chunkJobs) { + const key = formatXFTPServer(job.server); + if (!byServer.has(key)) byServer.set(key, []); + byServer.get(key).push(job); + } + const sentChunks = new Array(specs.length); + let uploaded = 0; + await Promise.all([...byServer.values()].map(async (jobs) => { + for (const { index, spec, server } of jobs) { + const chunkNo = index + 1; + const sndKp = generateEd25519KeyPair(); + const rcvKp = generateEd25519KeyPair(); + const chunkData = await readChunk(spec.chunkOffset, spec.chunkSize); + const chunkDigest = getChunkDigest(chunkData); + const fileInfo = { + sndKey: encodePubKeyEd25519(sndKp.publicKey), + size: spec.chunkSize, + digest: chunkDigest + }; + const rcvKeysForChunk = [encodePubKeyEd25519(rcvKp.publicKey)]; + const { senderId, recipientIds } = await createXFTPChunk( + agent, + server, + sndKp.privateKey, + fileInfo, + rcvKeysForChunk + ); + await uploadXFTPChunk(agent, server, sndKp.privateKey, senderId, chunkData); + sentChunks[index] = { + chunkNo, + senderId, + senderKey: sndKp.privateKey, + recipientId: recipientIds[0], + recipientKey: rcvKp.privateKey, + chunkSize: spec.chunkSize, + digest: chunkDigest, + server + }; + uploaded += spec.chunkSize; + onProgress?.(uploaded, total); + } + })); + const rcvDescription = buildDescription("recipient", encrypted, sentChunks); + const sndDescription = buildDescription("sender", encrypted, sentChunks); + let uri = encodeDescriptionURI(rcvDescription); + let finalRcvDescription = rcvDescription; + const threshold = redirectThreshold ?? DEFAULT_REDIRECT_THRESHOLD; + if (uri.length > threshold && sentChunks.length > 1) { + finalRcvDescription = await uploadRedirectDescription(agent, servers, rcvDescription); + uri = encodeDescriptionURI(finalRcvDescription); + } + return { rcvDescription: finalRcvDescription, sndDescription, uri }; +} +function buildDescription(party, enc, chunks) { + const defChunkSize = enc.chunkSizes[0]; + return { + party, + size: enc.chunkSizes.reduce((a, b) => a + b, 0), + digest: enc.digest, + key: enc.key, + nonce: enc.nonce, + chunkSize: defChunkSize, + chunks: chunks.map((c) => ({ + chunkNo: c.chunkNo, + chunkSize: c.chunkSize, + digest: c.digest, + replicas: [{ + server: formatXFTPServer(c.server), + replicaId: party === "recipient" ? c.recipientId : c.senderId, + replicaKey: encodePrivKeyEd25519(party === "recipient" ? c.recipientKey : c.senderKey) + }] + })), + redirect: null + }; +} +async function uploadRedirectDescription(agent, servers, innerFd) { + const yaml = encodeFileDescription(innerFd); + const yamlBytes = new TextEncoder().encode(yaml); + const enc = encryptFileForUpload(yamlBytes, ""); + const specs = prepareChunkSpecs(enc.chunkSizes); + const sentChunks = []; + for (let i = 0; i < specs.length; i++) { + const spec = specs[i]; + const chunkNo = i + 1; + const server = servers[Math.floor(Math.random() * servers.length)]; + const sndKp = generateEd25519KeyPair(); + const rcvKp = generateEd25519KeyPair(); + const chunkData = enc.encData.subarray(spec.chunkOffset, spec.chunkOffset + spec.chunkSize); + const chunkDigest = getChunkDigest(chunkData); + const fileInfo = { + sndKey: encodePubKeyEd25519(sndKp.publicKey), + size: spec.chunkSize, + digest: chunkDigest + }; + const rcvKeysForChunk = [encodePubKeyEd25519(rcvKp.publicKey)]; + const { senderId, recipientIds } = await createXFTPChunk( + agent, + server, + sndKp.privateKey, + fileInfo, + rcvKeysForChunk + ); + await uploadXFTPChunk(agent, server, sndKp.privateKey, senderId, chunkData); + sentChunks.push({ + chunkNo, + senderId, + senderKey: sndKp.privateKey, + recipientId: recipientIds[0], + recipientKey: rcvKp.privateKey, + chunkSize: spec.chunkSize, + digest: chunkDigest, + server + }); + } + return { + party: "recipient", + size: enc.chunkSizes.reduce((a, b) => a + b, 0), + digest: enc.digest, + key: enc.key, + nonce: enc.nonce, + chunkSize: enc.chunkSizes[0], + chunks: sentChunks.map((c) => ({ + chunkNo: c.chunkNo, + chunkSize: c.chunkSize, + digest: c.digest, + replicas: [{ + server: formatXFTPServer(c.server), + replicaId: c.recipientId, + replicaKey: encodePrivKeyEd25519(c.recipientKey) + }] + })), + redirect: { size: innerFd.size, digest: innerFd.digest } + }; +} +async function downloadFileRaw(agent, fd, onRawChunk, options) { + const err = validateFileDescription(fd); + if (err) throw new Error("downloadFileRaw: " + err); + const { onProgress} = options ?? {}; + if (fd.redirect !== null) { + console.log(`[AGENT-DBG] resolving redirect: outer size=${fd.size} chunks=${fd.chunks.length}`); + fd = await resolveRedirect(agent, fd); + console.log(`[AGENT-DBG] resolved: size=${fd.size} chunks=${fd.chunks.length} digest=${Array.from(fd.digest.slice(0, 16)).map((x) => x.toString(16).padStart(2, "0")).join("")}…`); + } + const resolvedFd = fd; + let downloaded = 0; + const byServer = /* @__PURE__ */ new Map(); + for (const chunk of resolvedFd.chunks) { + const srv = chunk.replicas[0]?.server ?? ""; + if (!byServer.has(srv)) byServer.set(srv, []); + byServer.get(srv).push(chunk); + } + await Promise.all([...byServer.entries()].map(async ([srv, chunks]) => { + const server = parseXFTPServer(srv); + for (const chunk of chunks) { + const replica = chunk.replicas[0]; + if (!replica) throw new Error("downloadFileRaw: chunk has no replicas"); + const seed = decodePrivKeyEd25519(replica.replicaKey); + const kp = ed25519KeyPairFromSeed(seed); + const raw = await downloadXFTPChunkRaw(agent, server, kp.privateKey, replica.replicaId); + console.log(`[AGENT-DBG] chunk=${chunk.chunkNo} body.len=${raw.body.length} expectedChunkSize=${chunk.chunkSize} digest=${_dbgHex(chunk.digest, 32)} body.byteOffset=${raw.body.byteOffset} body.buffer.byteLength=${raw.body.buffer.byteLength}`); + await onRawChunk({ + chunkNo: chunk.chunkNo, + dhSecret: raw.dhSecret, + nonce: raw.nonce, + body: raw.body, + digest: chunk.digest + }); + downloaded += chunk.chunkSize; + onProgress?.(downloaded, resolvedFd.size); + } + })); + return resolvedFd; +} +async function resolveRedirect(agent, fd) { + const plaintextChunks = new Array(fd.chunks.length); + for (const chunk of fd.chunks) { + const replica = chunk.replicas[0]; + if (!replica) throw new Error("resolveRedirect: chunk has no replicas"); + const server = parseXFTPServer(replica.server); + const seed = decodePrivKeyEd25519(replica.replicaKey); + const kp = ed25519KeyPairFromSeed(seed); + const data = await downloadXFTPChunk(agent, server, kp.privateKey, replica.replicaId, chunk.digest); + plaintextChunks[chunk.chunkNo - 1] = data; + } + const totalSize = plaintextChunks.reduce((s, c) => s + c.length, 0); + if (totalSize !== fd.size) throw new Error("resolveRedirect: redirect file size mismatch"); + const digest = sha512Streaming(plaintextChunks); + if (!digestEqual(digest, fd.digest)) throw new Error("resolveRedirect: redirect file digest mismatch"); + const { content: yamlBytes } = processDownloadedFile(fd, plaintextChunks); + const yamlStr = new TextDecoder().decode(yamlBytes); + const innerFd = decodeFileDescription(yamlStr); + const innerErr = validateFileDescription(innerFd); + if (innerErr) throw new Error("resolveRedirect: inner description invalid: " + innerErr); + if (innerFd.size !== fd.redirect.size) throw new Error("resolveRedirect: redirect size mismatch"); + if (!digestEqual(innerFd.digest, fd.redirect.digest)) throw new Error("resolveRedirect: redirect digest mismatch"); + return innerFd; +} +function _dbgHex(b, n = 8) { + return Array.from(b.slice(0, n)).map((x) => x.toString(16).padStart(2, "0")).join(""); +} +function digestEqual(a, b) { + if (a.length !== b.length) return false; + let diff = 0; + for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i]; + return diff === 0; +} + +const MAX_SIZE = 100 * 1024 * 1024; +const ENCRYPT_WEIGHT = 0.15; +const ENCRYPT_MIN_FILE_SIZE = 100 * 1024; +const ENCRYPT_MIN_DISPLAY_MS = 1e3; +function initUpload(app) { + app.innerHTML = ` +

`; + const dropZone = document.getElementById("drop-zone"); + const fileInput = document.getElementById("file-input"); + const progressStage = document.getElementById("upload-progress"); + const completeStage = document.getElementById("upload-complete"); + const errorStage = document.getElementById("upload-error"); + const progressContainer = document.getElementById("progress-container"); + const statusText = document.getElementById("upload-status"); + const cancelBtn = document.getElementById("cancel-btn"); + const shareLink = document.getElementById("share-link"); + const copyBtn = document.getElementById("copy-btn"); + const errorMsg = document.getElementById("error-msg"); + const retryBtn = document.getElementById("retry-btn"); + const shareBtn = typeof navigator.share === "function" ? (() => { + const btn = document.createElement("button"); + btn.className = "btn btn-secondary"; + btn.textContent = t("share", "Share"); + shareLink.parentElement.appendChild(btn); + return btn; + })() : null; + let aborted = false; + dropZone.addEventListener("dragover", (e) => { + e.preventDefault(); + dropZone.classList.add("drag-over"); + }); + dropZone.addEventListener("dragleave", () => dropZone.classList.remove("drag-over")); + dropZone.addEventListener("drop", (e) => { + e.preventDefault(); + dropZone.classList.remove("drag-over"); + const f = e.dataTransfer?.files[0]; + if (f) startUpload(f); + }); + fileInput.addEventListener("change", () => { + if (fileInput.files?.[0]) startUpload(fileInput.files[0]); + }); + retryBtn.addEventListener("click", () => { + fileInput.value = ""; + showStage(dropZone); + }); + function showStage(stage) { + for (const s of [dropZone, progressStage, completeStage, errorStage]) s.hidden = true; + stage.hidden = false; + } + function showError(msg) { + errorMsg.innerHTML = msg; + showStage(errorStage); + } + async function startUpload(file) { + aborted = false; + if (file.size > MAX_SIZE) { + showError(t("fileTooLarge", "File too large (%size%). Maximum is 100 MB. The SimpleX app supports files up to 1 GB.").replace("%size%", formatSize$1(file.size))); + return; + } + if (file.size === 0) { + showError(t("fileEmpty", "File is empty.")); + return; + } + showStage(progressStage); + const ring = createProgressRing(); + progressContainer.innerHTML = ""; + progressContainer.appendChild(ring.canvas); + const showEncrypt = file.size >= ENCRYPT_MIN_FILE_SIZE; + const encryptWeight = showEncrypt ? ENCRYPT_WEIGHT : 0; + statusText.textContent = showEncrypt ? t("encrypting", "Encrypting…") : t("uploading", "Uploading…"); + const backend = createCryptoBackend(); + const agent = newXFTPAgent(); + cancelBtn.onclick = () => { + aborted = true; + ring.destroy(); + backend.cleanup().catch(() => { + }); + closeXFTPAgent(agent); + showStage(dropZone); + }; + try { + const encryptStart = performance.now(); + const fileData = new Uint8Array(await file.arrayBuffer()); + if (aborted) return; + const encrypted = await backend.encrypt(fileData, file.name, (done, total) => { + ring.update(done / total * encryptWeight); + }); + if (aborted) return; + if (showEncrypt) { + const elapsed = performance.now() - encryptStart; + if (elapsed < ENCRYPT_MIN_DISPLAY_MS) { + await ring.fillTo(encryptWeight, ENCRYPT_MIN_DISPLAY_MS - elapsed); + if (aborted) return; + } + statusText.textContent = t("uploading", "Uploading…"); + } + const metadata = { + digest: encrypted.digest, + key: encrypted.key, + nonce: encrypted.nonce, + chunkSizes: encrypted.chunkSizes + }; + const servers = getServers(); + const result = await uploadFile(agent, servers, metadata, { + readChunk: (off, sz) => backend.readChunk(off, sz), + onProgress: (uploaded, total) => { + ring.update(encryptWeight + uploaded / total * (1 - encryptWeight)); + } + }); + if (aborted) return; + const descServers = getDescriptionServers(result.rcvDescription); + const origin = descServers.length > 0 ? serverOrigin(descServers[0]) : window.location.origin; + const url = origin + window.location.pathname + "#" + result.uri; + shareLink.value = url; + showStage(completeStage); + app.dispatchEvent(new CustomEvent("xftp:upload-complete", { detail: { url }, bubbles: true })); + copyBtn.onclick = () => { + navigator.clipboard.writeText(url).then(() => { + copyBtn.textContent = t("copied", "Copied!"); + setTimeout(() => { + copyBtn.textContent = t("copy", "Copy"); + }, 2e3); + }); + }; + if (shareBtn) { + shareBtn.onclick = () => navigator.share({ url }).catch(() => { + }); + } + } catch (err) { + if (!aborted) { + const msg = err?.message ?? String(err); + showError(msg); + if (err instanceof XFTPPermanentError) retryBtn.hidden = true; + else retryBtn.hidden = false; + } + } finally { + ring.destroy(); + await backend.cleanup().catch(() => { + }); + closeXFTPAgent(agent); + } + } +} +function formatSize$1(bytes) { + if (bytes < 1024) return bytes + " B"; + if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB"; + return (bytes / (1024 * 1024)).toFixed(1) + " MB"; +} + +const DECRYPT_WEIGHT = 0.15; +const DECRYPT_MIN_FILE_SIZE = 100 * 1024; +const DECRYPT_MIN_DISPLAY_MS = 1e3; +function initDownload(app, hash) { + let fd; + try { + fd = decodeDescriptionURI(hash); + } catch (err) { + app.innerHTML = `

${t("invalidLink", "Invalid or corrupted link.")}

`; + return; + } + const wrongServer = !getDescriptionServers(fd).map((s) => s.host).includes(window.location.hostname); + const size = fd.redirect ? fd.redirect.size : fd.size; + app.innerHTML = ` +
+

${t("title", "SimpleX File Transfer")}

+
+

${t("fileAvailable", "File available (~%size%)").replace("%size%", formatSize(size))}

+ +
+

${t("dlSecurityNote1", "This file is encrypted — the server never sees file contents.")}

+

${t("dlSecurityNote2", "The decryption key is in the link’s hash fragment, which your browser never sends to any server.")}

+

${t("dlSecurityNote3", 'For maximum security, use the SimpleX app.')}

+
+
+ + +
`; + const readyStage = document.getElementById("dl-ready"); + const progressStage = document.getElementById("dl-progress"); + const errorStage = document.getElementById("dl-error"); + const progressContainer = document.getElementById("dl-progress-container"); + const statusText = document.getElementById("dl-status"); + const dlBtn = document.getElementById("dl-btn"); + const errorMsg = document.getElementById("dl-error-msg"); + const retryBtn = document.getElementById("dl-retry-btn"); + const uploadLink = document.getElementById("dl-upload-link"); + function showStage(stage) { + for (const s of [readyStage, progressStage, errorStage]) s.hidden = true; + stage.hidden = false; + } + function showError(msg) { + errorMsg.innerHTML = msg; + showStage(errorStage); + } + if (wrongServer) { + readyStage.innerHTML = `

${t("wrongServer", "This file is not hosted on this server.")}

`; + return; + } + dlBtn.addEventListener("click", startDownload); + retryBtn.addEventListener("click", () => showStage(readyStage)); + uploadLink.addEventListener("click", (e) => { + e.preventDefault(); + history.replaceState(null, "", window.location.pathname); + initUpload(app); + }); + async function startDownload() { + showStage(progressStage); + const ring = createProgressRing(); + progressContainer.innerHTML = ""; + progressContainer.appendChild(ring.canvas); + const showDecrypt = size >= DECRYPT_MIN_FILE_SIZE; + const decryptWeight = showDecrypt ? DECRYPT_WEIGHT : 0; + statusText.textContent = t("downloading", "Downloading…"); + const backend = createCryptoBackend(); + const agent = newXFTPAgent(); + try { + const resolvedFd = await downloadFileRaw(agent, fd, async (raw) => { + await backend.decryptAndStoreChunk( + raw.dhSecret, + raw.nonce, + raw.body, + raw.digest, + raw.chunkNo + ); + }, { + onProgress: (downloaded, total) => { + ring.update(downloaded / total * (1 - decryptWeight)); + } + }); + if (showDecrypt) { + statusText.textContent = t("decrypting", "Decrypting…"); + } + const decryptStart = performance.now(); + const { header, content } = await backend.verifyAndDecrypt({ + size: resolvedFd.size, + digest: resolvedFd.digest, + key: resolvedFd.key, + nonce: resolvedFd.nonce + }, (done, total) => { + ring.update(Math.min(0.99, 1 - decryptWeight + done / total * decryptWeight)); + }); + if (showDecrypt) { + const elapsed = performance.now() - decryptStart; + if (elapsed < DECRYPT_MIN_DISPLAY_MS) { + await ring.fillTo(0.99, DECRYPT_MIN_DISPLAY_MS - elapsed); + } + } + const fileName = sanitizeFileName(header.fileName); + const blob = new Blob([content.buffer]); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = encodeURIComponent(fileName); + a.style.display = "none"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + setTimeout(() => URL.revokeObjectURL(url), 1e3); + ring.update(1); + statusText.textContent = t("downloadComplete", "Download complete"); + uploadLink.hidden = false; + app.dispatchEvent(new CustomEvent("xftp:download-complete", { detail: { fileName }, bubbles: true })); + } catch (err) { + const msg = err?.message ?? String(err); + showError(msg); + if (err instanceof XFTPPermanentError) retryBtn.hidden = true; + else retryBtn.hidden = false; + } finally { + ring.destroy(); + await backend.cleanup().catch(() => { + }); + closeXFTPAgent(agent); + } + } +} +function sanitizeFileName(name) { + let s = name; + s = s.replace(/[/\\]/g, ""); + s = s.replace(/[\x00-\x1f\x7f]/g, "_"); + s = s.replace(/[\u202a-\u202e\u2066-\u2069]/g, ""); + if (s.length > 255) s = s.slice(0, 255); + return s || "download"; +} +function formatSize(bytes) { + if (bytes < 1024) return bytes + " B"; + if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB"; + return (bytes / (1024 * 1024)).toFixed(1) + " MB"; +} + +function getAppElement() { + return document.querySelector("[data-xftp-app]") ?? document.getElementById("app"); +} +const wasmReady = r.ready; +async function main() { + const app = getAppElement(); + if (!app?.hasAttribute("data-defer-init")) { + initApp(); + } + if (!app?.hasAttribute("data-no-hashchange")) { + window.addEventListener("hashchange", () => { + const hash = window.location.hash.slice(1); + if (!hash || looksLikeXFTPHash(hash)) initApp(); + }); + } + await wasmReady; + app?.dispatchEvent(new CustomEvent("xftp:ready", { bubbles: true })); +} +function looksLikeXFTPHash(hash) { + return hash.length > 50 && /^[A-Za-z0-9_=-]+$/.test(hash); +} +function initApp() { + const app = getAppElement(); + const hash = window.location.hash.slice(1); + if (hash && looksLikeXFTPHash(hash)) { + initDownload(app, hash); + } else { + initUpload(app); + } +} +window.__xftp_initApp = async () => { + await wasmReady; + initApp(); +}; +main().catch((err) => { + const app = getAppElement(); + if (app) { + app.innerHTML = `

${t("initError", "Failed to initialize: %error%").replace("%error%", err.message)}

`; + } + console.error(err); +}); diff --git a/plans/2026-03-25-xftp-postgres-backend-design.md b/plans/2026-03-25-xftp-postgres-backend-design.md new file mode 100644 index 000000000..78a32a507 --- /dev/null +++ b/plans/2026-03-25-xftp-postgres-backend-design.md @@ -0,0 +1,472 @@ +# XFTP Server PostgreSQL Backend + +## Overview + +Add PostgreSQL backend support to xftp-server, following the SMP server pattern. Supports bidirectional migration between STM (in-memory with StoreLog) and PostgreSQL backends. + +## Goals + +- PostgreSQL-backed file metadata storage as an alternative to STM + StoreLog +- Polymorphic server code via `FileStoreClass` typeclass with IO-based methods (following `QueueStoreClass` pattern) +- Bidirectional migration: StoreLog <-> PostgreSQL via CLI commands +- Shared `server_postgres` cabal flag (same flag enables both SMP and XFTP Postgres support) +- INI-based backend selection at runtime + +## Architecture + +### FileStoreClass Typeclass + +IO-based typeclass following the `QueueStoreClass` pattern — each method is a self-contained IO action, with the implementation responsible for its own atomicity (STM backend wraps in `atomically`, Postgres backend uses database transactions): + +```haskell +class FileStoreClass s where + type FileStoreConfig s + + -- Lifecycle + newFileStore :: FileStoreConfig s -> IO s + closeFileStore :: s -> IO () + + -- File operations + addFile :: s -> SenderId -> FileInfo -> RoundedFileTime -> ServerEntityStatus -> IO (Either XFTPErrorType ()) + setFilePath :: s -> SenderId -> FilePath -> IO (Either XFTPErrorType ()) + addRecipient :: s -> SenderId -> FileRecipient -> IO (Either XFTPErrorType ()) + getFile :: s -> SFileParty p -> XFTPFileId -> IO (Either XFTPErrorType (FileRec, C.APublicAuthKey)) + deleteFile :: s -> SenderId -> IO (Either XFTPErrorType ()) + blockFile :: s -> SenderId -> BlockingInfo -> Bool -> IO (Either XFTPErrorType ()) + deleteRecipient :: s -> RecipientId -> FileRec -> IO () + ackFile :: s -> RecipientId -> IO (Either XFTPErrorType ()) + + -- Expiration (with LIMIT for Postgres; called in a loop until empty) + expiredFiles :: s -> Int64 -> Int -> IO [(SenderId, Maybe FilePath, Word32)] + + -- Storage and stats (for init-time computation) + getUsedStorage :: s -> IO Int64 + getFileCount :: s -> IO Int +``` + +- STM backend: each method wraps its STM transaction in `atomically` internally. +- Postgres backend: each method runs its query via `withDB` / database connection internally. + +No polymorphic monad or `runStore` dispatcher needed — unlike `MsgStoreClass`, XFTP file operations are individually atomic and don't require grouping multiple operations into backend-dependent transactions. + +### PostgresFileStore Data Type + +```haskell +data PostgresFileStore = PostgresFileStore + { dbStore :: DBStore, + dbStoreLog :: Maybe (StoreLog 'WriteMode) + } +``` + +- `dbStore` — connection pool created via `createDBStore`, runs schema migrations on init. +- `dbStoreLog` — optional parallel log file (enabled by `db_store_log` INI setting). When present, every mutation (`addFile`, `setFilePath`, `deleteFile`, `blockFile`, `addRecipient`, `ackFile`) also writes to this log via a `withLog` wrapper. `withLog` is called AFTER the DB operation succeeds (so the log reflects committed state only). Log write failures are non-fatal (logged as warnings, do not fail the DB operation). This provides an audit trail and enables recovery via export. + +`closeFileStore` for Postgres calls `closeDBStore` (closes connection pool) then `mapM_ closeStoreLog dbStoreLog` (flushes and closes the parallel log). For STM, it closes the storeLog. Called from a `finally` block during server shutdown, matching SMP's `stopServer` → `closeMsgStore` → `closeQueueStore` pattern. + +### STMFileStore Type + +After extracting from current `Store.hs`, `STMFileStore` retains the file and recipient maps but no longer owns `usedStorage` (moved to `XFTPEnv`): + +```haskell +data STMFileStore = STMFileStore + { files :: TMap SenderId FileRec, + recipients :: TMap RecipientId (SenderId, RcvPublicAuthKey) + } +``` + +`closeFileStore` for STM is a no-op (TMaps are garbage-collected; the env-level `storeLog` is closed separately by the server). + +### Error Handling + +Postgres operations follow SMP's `withDB` / `handleDuplicate` pattern: + +```haskell +withDB :: Text -> PostgresFileStore -> (DB.Connection -> IO (Either XFTPErrorType a)) -> ExceptT XFTPErrorType IO a +withDB op st action = + ExceptT $ E.try (withTransaction (dbStore st) action) >>= either logErr pure + where + logErr :: E.SomeException -> IO (Either XFTPErrorType a) + logErr e = logError ("STORE: " <> err) $> Left INTERNAL + where + err = op <> ", withDB, " <> tshow e + +handleDuplicate :: SqlError -> IO (Either XFTPErrorType a) +handleDuplicate e = case constraintViolation e of + Just (UniqueViolation _) -> pure $ Left DUPLICATE_ + _ -> E.throwIO e +``` + +- All DB operations wrapped in `withDB` — catches exceptions, logs, returns `INTERNAL`. +- Unique constraint violations caught by `handleDuplicate` and mapped to `DUPLICATE_`. +- UPDATE operations verified with `assertUpdated` — returns `AUTH` if 0 rows affected (matching SMP pattern, prevents silent failures when WHERE clause doesn't match). +- Critical sections (DB write + TVar update) wrapped in `uninterruptibleMask_` to prevent async exceptions from leaving inconsistent state between DB and TVars. + +### FileRec and TVar Fields + +`FileRec` retains its `TVar` fields (matching SMP's `PostgresQueue` pattern): + +```haskell +data FileRec = FileRec + { senderId :: SenderId, + fileInfo :: FileInfo, + filePath :: TVar (Maybe FilePath), + recipientIds :: TVar (Set RecipientId), + createdAt :: RoundedFileTime, + fileStatus :: TVar ServerEntityStatus + } +``` + +- **STM backend**: TVars are the source of truth, as currently. +- **Postgres backend**: `getFile` reads from DB and creates a `FileRec` with fresh TVars populated from the DB row (matching SMP's `mkQ` pattern — `newTVarIO` per load). Mutation methods (`setFilePath`, `blockFile`, etc.) update both the DB (persistence) and the TVars (in-session consistency). The `recipientIds` TVar is initialized to `S.empty` — no subquery needed because no server code reads `recipientIds` directly; all recipient operations go through the typeclass methods (`addRecipient`, `deleteRecipient`, `ackFile`), which query the `recipients` table for Postgres. + +### usedStorage Ownership + +`usedStorage :: TVar Int64` moves from the store to `XFTPEnv`. The store typeclass does **not** manage `usedStorage` — it only provides `getUsedStorage` for init-time computation. + +- **STM init**: StoreLog replay calls `setFilePath` (which only sets the filePath TVar — the STM `setFilePath` implementation is changed to **not** update `usedStorage`). Similarly, STM `deleteFile` (Store.hs line 117) and `blockFile` (line 125) are changed to **not** update `usedStorage` — the server handles all `usedStorage` adjustments externally. After replay, `getUsedStorage` computes the sum over all file sizes (matching current `countUsedStorage` behavior). +- **Postgres init**: `getUsedStorage` executes `SELECT COALESCE(SUM(file_size), 0) FROM files`. +- **Runtime**: Server manages `usedStorage` TVar directly for reserve/commit/rollback during uploads, and adjusts after `deleteFile`/`blockFile` calls. + +**Note on `getUsedStorage` semantics**: The current STM `countUsedStorage` sums all file sizes unconditionally (including files without `filePath` set, i.e., created but not yet uploaded). The Postgres `getUsedStorage` matches this: `SELECT SUM(file_size) FROM files` (no `WHERE file_path IS NOT NULL`). In practice, orphaned files (created but never uploaded) are rare and short-lived (expired within 48h), so the difference is negligible. A future improvement could filter by `file_path IS NOT NULL` in both backends to reflect actual disk usage more accurately. + +### Server.hs Refactoring + +`Server.hs` becomes polymorphic over `FileStoreClass s`. Since all typeclass methods are IO, call sites replace `atomically` with direct IO calls to the store. + +**Call sites requiring changes** (exhaustive list): + +1. **`receiveServerFile`** (line 563): `atomically $ writeTVar filePath (Just fPath)` → `setFilePath store senderId fPath`. The `reserve` logic (line 551-555) stays as direct TVar manipulation on `usedStorage` from `XFTPEnv`. + +2. **`verifyXFTPTransmission`** (line 453): `atomically $ verify =<< getFile st party fId` — the `getFile` call and subsequent `readTVar fileStatus` are in a single `atomically` block. Refactored to: `getFile st party fId` (IO), then `readTVarIO (fileStatus fr)` from the returned `FileRec` (safe for both backends — STM TVar is the source of truth, Postgres TVar is a fresh snapshot from DB). + +3. **`retryAdd`** (line 516): Signature `XFTPFileId -> STM (Either XFTPErrorType a)` → `XFTPFileId -> IO (Either XFTPErrorType a)`. The `atomically` call (line 520) replaced with `liftIO`. + +4. **`deleteOrBlockServerFile_`** (line 620): Parameter `FileStore -> STM (Either XFTPErrorType ())` → `FileStoreClass s => s -> IO (Either XFTPErrorType ())`. The `atomically` call (line 626) removed — the store method is already IO. After the store action, server adjusts `usedStorage` TVar in `XFTPEnv` based on `fileInfo.size`. + +5. **`ackFileReception`** (line 605): `atomically $ deleteRecipient st rId fr` → `deleteRecipient st rId fr`. + +6. **Control port `CPDelete`/`CPBlock`** (lines 371, 377): `atomically $ getFile fs SFRecipient fileId` → `getFile fs SFRecipient fileId`. + +7. **`expireServerFiles`** (line 636): Replace per-file `expiredFilePath` iteration with batched `expiredFiles st old batchSize`, which returns `[(SenderId, Maybe FilePath, Word32)]` — the `Word32` file size is needed so the server can adjust the `usedStorage` TVar after each deletion. Called in a loop until the returned list is empty. The `itemDelay` between files applies to the deletion loop over each batch, not the query itself. STM backend ignores the batch size limit (returns all expired files from TMap scan); Postgres uses `LIMIT`. + +8. **`restoreServerStats`** (line 694): `FileStore {files, usedStorage} <- asks store` accesses store fields directly. Refactored to: `usedStorage` from `XFTPEnv` via `asks usedStorage`, file count via `getFileCount store`. STM: `M.size <$> readTVarIO files`. Postgres: `SELECT COUNT(*) FROM files`. + +### Store Config Selection + +GADT in `Env.hs`: + +```haskell +data XFTPStoreConfig s where + XSCMemory :: Maybe FilePath -> XFTPStoreConfig STMFileStore +#if defined(dbServerPostgres) + XSCDatabase :: PostgresFileStoreCfg -> XFTPStoreConfig PostgresFileStore +#endif +``` + +`XFTPEnv` becomes polymorphic: + +```haskell +data XFTPEnv s = XFTPEnv + { config :: XFTPServerConfig, + store :: s, + usedStorage :: TVar Int64, + storeLog :: Maybe (StoreLog 'WriteMode), + ... + } +``` + +The `M` monad (`ReaderT (XFTPEnv s) IO`) and all functions in `Server.hs` gain `FileStoreClass s =>` constraints. + +**StoreLog lifecycle per backend:** + +- **STM mode**: `storeLog = Just sl` (current behavior — append-only log for persistence and recovery). +- **Postgres mode**: `storeLog = Nothing` (main storeLog disabled — Postgres is the source of truth). The optional parallel `dbStoreLog` inside `PostgresFileStore` provides audit/recovery if enabled via `db_store_log` INI setting. + +The existing `withFileLog` pattern in Server.hs continues to work unchanged — it maps over `Maybe (StoreLog 'WriteMode)`, which is `Nothing` in Postgres mode so the calls become no-ops. + +### Main.hs Store Type Dispatch + +The `Start` CLI command gains a `--confirm-migrations` flag (default `MCConsole` — manual prompt, matching SMP's `StartOptions`). For automated deployments, `--confirm-migrations up` auto-applies forward migrations. The import command uses `MCYesUp` (always auto-apply). + +Following SMP's existential dispatch pattern (`AStoreType` + `run`), `Main.hs` selects the store type from INI config and dispatches to the polymorphic server: + +```haskell +runServer ini = do + let storeType = fromRight "memory" $ lookupValue "STORE_LOG" "store_files" ini + case storeType of + "memory" -> run $ XSCMemory (enableStoreLog $> storeLogFilePath) + "database" -> +#if defined(dbServerPostgres) + run $ XSCDatabase PostgresFileStoreCfg {..} +#else + exitError "server not compiled with Postgres support" +#endif + _ -> exitError $ "Invalid store_files value: " <> storeType + where + run :: FileStoreClass s => XFTPStoreConfig s -> IO () + run storeCfg = do + env <- newXFTPServerEnv storeCfg config + runReaderT (xftpServer config) env +``` + +**`newXFTPServerEnv` refactored signature:** + +```haskell +newXFTPServerEnv :: FileStoreClass s => XFTPStoreConfig s -> XFTPServerConfig -> IO (XFTPEnv s) +newXFTPServerEnv storeCfg config = do + (store, storeLog) <- case storeCfg of + XSCMemory storeLogPath -> do + st <- newFileStore () + sl <- mapM (`readWriteFileStore` st) storeLogPath + pure (st, sl) + XSCDatabase dbCfg -> do + st <- newFileStore dbCfg + pure (st, Nothing) -- main storeLog disabled for Postgres + usedStorage <- newTVarIO =<< getUsedStorage store + ... + pure XFTPEnv {config, store, usedStorage, storeLog, ...} +``` + +### Startup Config Validation + +Following SMP's `checkMsgStoreMode` pattern, `Main.hs` validates config before starting: + +- **`store_files=database` + StoreLog file exists** (without `db_store_log=on`): Error — "StoreLog file present but store_files is `database`. Use `xftp-server database import` to migrate, or set `db_store_log: on`." +- **`store_files=database` + schema doesn't exist**: Error — "Create schema in PostgreSQL or use `xftp-server database import`." +- **`store_files=memory` + Postgres schema exists**: Warning — "Postgres schema exists but store_files is `memory`. Data in Postgres will not be used." +- **Binary compiled without `server_postgres` + `store_files=database`**: Error — "Server not compiled with Postgres support." + +## Module Structure + +``` +src/Simplex/FileTransfer/Server/ + Store.hs -- FileStoreClass typeclass + shared types (FileRec, FileRecipient, etc.) + Store/ + STM.hs -- STMFileStore (extracted from current Store.hs) + Postgres.hs -- PostgresFileStore [CPP-guarded] + Postgres/ + Migrations.hs -- Schema migrations [CPP-guarded] + Config.hs -- PostgresFileStoreCfg [CPP-guarded] + StoreLog.hs -- Unchanged (interchange format for both backends + migration) + Env.hs -- XFTPStoreConfig GADT, polymorphic XFTPEnv + Main.hs -- Store selection, migration CLI commands + Server.hs -- Polymorphic over FileStoreClass +``` + +## PostgreSQL Schema + +Initial migration (`20260325_initial`): + +```sql +CREATE TABLE files ( + sender_id BYTEA NOT NULL PRIMARY KEY, + file_size INT4 NOT NULL, + file_digest BYTEA NOT NULL, + sender_key BYTEA NOT NULL, + file_path TEXT, + created_at INT8 NOT NULL, + status TEXT NOT NULL DEFAULT 'active' +); + +CREATE TABLE recipients ( + recipient_id BYTEA NOT NULL PRIMARY KEY, + sender_id BYTEA NOT NULL REFERENCES files ON DELETE CASCADE, + recipient_key BYTEA NOT NULL +); + +CREATE INDEX idx_recipients_sender_id ON recipients (sender_id); +CREATE INDEX idx_files_created_at ON files (created_at); +``` + +- `file_size` is `INT4` matching `Word32` in `FileInfo.size` +- `sender_key` and `recipient_key` stored as `BYTEA` using binary encoding via `C.encodePubKey` / `C.decodePubKey` (matching SMP's `ToField`/`FromField` instances for `APublicAuthKey` — includes algorithm type tag in the binary format) +- `file_path` nullable (set after upload completes via `setFilePath`) +- `ON DELETE CASCADE` for recipients when file is hard-deleted +- `created_at` stores rounded epoch seconds (1-hour precision, `RoundedFileTime`) +- `status` as TEXT via `StrEncoding` (`ServerEntityStatus`: `EntityActive`, `EntityBlocked info`, `EntityOff`) +- Hard deletes (no `deleted_at` column) +- No PL/pgSQL functions needed; `setFilePath` uses `WHERE file_path IS NULL` to prevent duplicate uploads (the `UPDATE` itself acquires a row-level lock) +- `used_storage` computed on startup: `SELECT COALESCE(SUM(file_size), 0) FROM files` (matches STM `countUsedStorage` — all files, see usedStorage Ownership section) + +### Migrations Module + +Following SMP's `QueueStore/Postgres/Migrations.hs` pattern: + +```haskell +module Simplex.FileTransfer.Server.Store.Postgres.Migrations + ( xftpServerMigrations, + ) +where + +import Data.List (sortOn) +import Data.Text (Text) +import Simplex.Messaging.Agent.Store.Shared +import Text.RawString.QQ (r) + +xftpSchemaMigrations :: [(String, Text, Maybe Text)] +xftpSchemaMigrations = + [ ("20260325_initial", m20260325_initial, Nothing) + ] + +xftpServerMigrations :: [Migration] +xftpServerMigrations = sortOn name $ map migration xftpSchemaMigrations + where + migration (name, up, down) = Migration {name, up, down = down} + +m20260325_initial :: Text +m20260325_initial = + [r| +CREATE TABLE files ( + sender_id BYTEA NOT NULL PRIMARY KEY, + ... +); + |] +``` + +The `Migration` type (from `Simplex.Messaging.Agent.Store.Shared`) has fields `{name :: String, up :: Text, down :: Maybe Text}`. Initial migration has `Nothing` for `down`. Future migrations should include `Just down_migration` for rollback support. Called via `createDBStore dbOpts xftpServerMigrations (MigrationConfig confirmMigrations Nothing)`. + +### Postgres Operations + +Key query patterns: + +- **`addFile`**: `INSERT INTO files (...) VALUES (...)`, return `DUPLICATE_` on unique violation. +- **`setFilePath`**: `UPDATE files SET file_path = ? WHERE sender_id = ? AND file_path IS NULL`, verified with `assertUpdated` (returns `AUTH` if 0 rows affected — file not found or already uploaded). The `WHERE file_path IS NULL` prevents duplicate uploads; the `UPDATE` acquires a row lock implicitly. Only persists the path; `usedStorage` managed by server. +- **`addRecipient`**: `INSERT INTO recipients (...)`, plus check for duplicates. No need for `recipientIds` TVar update — Postgres derives it from the table. +- **`getFile`** (sender): `SELECT ... FROM files WHERE sender_id = ?`, returns auth key from `sender_key` column. +- **`getFile`** (recipient): `SELECT f.*, r.recipient_key FROM recipients r JOIN files f ON ... WHERE r.recipient_id = ?`. +- **`deleteFile`**: `DELETE FROM files WHERE sender_id = ?` (recipients cascade). +- **`blockFile`**: `UPDATE files SET status = ? WHERE sender_id = ?`. When `deleted = True`, the server adjusts `usedStorage` externally (matching current STM behavior where `blockFile` only updates status and storage, not `filePath`). +- **`expiredFiles`**: `SELECT sender_id, file_path, file_size FROM files WHERE created_at + ? < ? LIMIT ?` — batched query replaces per-file iteration, includes `file_size` for `usedStorage` adjustment. Called in a loop until no rows returned. + +## INI Configuration + +New keys in `[STORE_LOG]` section: + +```ini +[STORE_LOG] +enable: on +store_files: memory # memory | database +db_connection: postgresql://xftp@/xftp_server_store +db_schema: xftp_server +db_pool_size: 10 +db_store_log: off +expire_files_hours: 48 +``` + +`store_files` selects the backend (`store_files` rather than `store_queues` because XFTP stores files, not queues): +- `memory` -> `XSCMemory` (current behavior) +- `database` -> `XSCDatabase` (requires `server_postgres` build flag) + +### INI Template Generation (`xftp-server init`) + +The `iniFileContent` function in `Main.hs` must be updated to generate the new keys in the `[STORE_LOG]` section. Following SMP's `iniDbOpts` pattern with `optDisabled'` (prefixes `"# "` when value equals default), Postgres keys are generated commented out by default: + +```ini +[STORE_LOG] +enable: on + +# File storage mode: `memory` or `database` (PostgreSQL). +store_files: memory + +# Database connection settings for PostgreSQL database (`store_files: database`). +# db_connection: postgresql://xftp@/xftp_server_store +# db_schema: xftp_server +# db_pool_size: 10 + +# Write database changes to store log file +# db_store_log: off + +expire_files_hours: 48 +``` + +Reuses `iniDBOptions` from `Simplex.Messaging.Server.CLI` for runtime parsing (falls back to defaults when keys are commented out or missing). `enableDbStoreLog'` pattern (`settingIsOn "STORE_LOG" "db_store_log"`) controls `dbStoreLogPath`. + +### PostgresFileStoreCfg + +```haskell +data PostgresFileStoreCfg = PostgresFileStoreCfg + { dbOpts :: DBOpts, + dbStoreLogPath :: Maybe FilePath, + confirmMigrations :: MigrationConfirmation + } +``` + +No `deletedTTL` (hard deletes). + +### Default DB Options + +```haskell +defaultXFTPDBOpts :: DBOpts +defaultXFTPDBOpts = + DBOpts + { connstr = "postgresql://xftp@/xftp_server_store", + schema = "xftp_server", + poolSize = 10, + createSchema = False + } +``` + +## Migration CLI + +Bidirectional migration via StoreLog as interchange format: + +``` +xftp-server database import [--database DB_CONN] [--schema DB_SCHEMA] [--pool-size N] +xftp-server database export [--database DB_CONN] [--schema DB_SCHEMA] [--pool-size N] +``` + +No `--table` flag needed (unlike SMP which has queues/messages/all) — XFTP has a single entity type (files + recipients, always migrated together). + +CLI options reuse `dbOptsP` parser from `Simplex.Messaging.Server.CLI`. + +### Import (StoreLog -> PostgreSQL) + +1. Confirm: prompt user with database connection details and StoreLog path +2. Read and replay StoreLog into temporary `STMFileStore` +3. Connect to PostgreSQL, run schema migrations (`createSchema = True`, `confirmMigrations = MCYesUp`) +4. Batch-insert file records into `files` table using PostgreSQL COPY protocol (matching SMP's `batchInsertQueues` pattern for performance). Progress reported every 10k files. +5. Batch-insert recipient records into `recipients` table using COPY protocol +6. Verify counts: `SELECT COUNT(*) FROM files` / `recipients` — warn if mismatch +7. Rename StoreLog to `.bak` (prevents accidental re-import, preserves original for rollback) +8. Report counts + +### Export (PostgreSQL -> StoreLog) + +1. Confirm: prompt user with database connection details and output path. Fail if output file already exists. +2. Connect to PostgreSQL +3. Open new StoreLog file for writing +4. Fold over all file records, writing per file (in this order, matching existing `writeFileStore`): `AddFile` (with `ServerEntityStatus` — this preserves `EntityBlocked` state), `AddRecipients`, then `PutFile` (if `file_path` is set) +5. Report counts + +Note: `AddFile` carries `ServerEntityStatus` which includes `EntityBlocked info`, so blocking state is preserved through export/import without needing separate `BlockFile` log entries. + +File data on disk is untouched by migration — only metadata moves between backends. + +## Cabal Integration + +Shared `server_postgres` flag. New Postgres modules added to existing conditional block: + +```cabal +if flag(server_postgres) + cpp-options: -DdbServerPostgres + exposed-modules: + ...existing SMP modules... + Simplex.FileTransfer.Server.Store.Postgres + Simplex.FileTransfer.Server.Store.Postgres.Migrations + Simplex.FileTransfer.Server.Store.Postgres.Config +``` + +CPP guards (`#if defined(dbServerPostgres)`) in: +- `Store.hs` — Postgres `FromField`/`ToField` instances for XFTP-specific types if needed +- `Env.hs` — `XSCDatabase` constructor +- `Main.hs` — database CLI commands, store selection for `database` mode, Postgres imports +- `Server.hs` — Postgres-specific imports if needed + +## Testing + +- **Parameterized server tests**: Existing `xftpServerTests` refactored to accept a store type parameter (following SMP's `SpecWith (ASrvTransport, AStoreType)` pattern). The same server tests run against both STM and Postgres backends — STM tests run unconditionally, Postgres tests added under `#if defined(dbServerPostgres)` with `postgressBracket` for database lifecycle (drop → create → test → drop). +- **Unit tests**: `PostgresFileStore` operations — add/get/delete/block/expire, duplicate detection, auth errors +- **Migration round-trip**: STM store → export to StoreLog → import to Postgres → export back → verify StoreLog equality (including blocked file status) +- **Tests location**: in `tests/` alongside existing XFTP tests, guarded by `server_postgres` CPP flag +- **Test database**: PostgreSQL on `localhost:5432`, using a dedicated `xftp_server_test` schema (dropped and recreated per test run via `postgressBracket`, following SMP's test database lifecycle pattern) +- **Test fixtures**: `testXFTPStoreDBOpts :: DBOpts` with `createSchema = True`, `confirmMigrations = MCYesUp`, in `tests/XFTPClient.hs` diff --git a/plans/2026-03-25-xftp-postgres-implementation-plan.md b/plans/2026-03-25-xftp-postgres-implementation-plan.md new file mode 100644 index 000000000..2ae334670 --- /dev/null +++ b/plans/2026-03-25-xftp-postgres-implementation-plan.md @@ -0,0 +1,648 @@ +# XFTP PostgreSQL Backend — Implementation Plan + +> **For agentic workers:** REQUIRED: Use superpowers-extended-cc:subagent-driven-development (if subagents available) or superpowers-extended-cc:executing-plans to implement this plan. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Add PostgreSQL backend support to xftp-server as an alternative to STM + StoreLog, with bidirectional migration. + +**Architecture:** Introduce `FileStoreClass` typeclass (IO-based, following `QueueStoreClass` pattern). Extract current STM store into `Store/STM.hs`, make `Server.hs` polymorphic, then add `Store/Postgres.hs` behind `server_postgres` CPP flag. `usedStorage` moves from store to `XFTPEnv` so the server manages quota tracking externally. + +**Tech Stack:** Haskell, postgresql-simple, STM, fourmolu, cabal with CPP flags + +**Design spec:** `plans/2026-03-25-xftp-postgres-backend-design.md` + +--- + +## File Structure + +**Existing files modified:** +- `src/Simplex/FileTransfer/Server/Store.hs` — rewritten: becomes typeclass + shared types +- `src/Simplex/FileTransfer/Server/Env.hs` — polymorphic `XFTPEnv s`, `XFTPStoreConfig` GADT +- `src/Simplex/FileTransfer/Server.hs` — polymorphic over `FileStoreClass s` +- `src/Simplex/FileTransfer/Server/StoreLog.hs` — update for IO store functions +- `src/Simplex/FileTransfer/Server/Main.hs` — INI config, dispatch, CLI commands +- `simplexmq.cabal` — new modules +- `tests/XFTPClient.hs` — Postgres test fixtures +- `tests/Test.hs` — Postgres test group + +**New files created:** +- `src/Simplex/FileTransfer/Server/Store/STM.hs` — `STMFileStore` (extracted from current `Store.hs`) +- `src/Simplex/FileTransfer/Server/Store/Postgres.hs` — `PostgresFileStore` [CPP-guarded] +- `src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs` — `PostgresFileStoreCfg` [CPP-guarded] +- `src/Simplex/FileTransfer/Server/Store/Postgres/Migrations.hs` — schema SQL [CPP-guarded] +- `tests/CoreTests/XFTPStoreTests.hs` — Postgres store unit tests [CPP-guarded] + +--- + +## Task 1: Move `usedStorage` from `FileStore` to `XFTPEnv` + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Store.hs` +- Modify: `src/Simplex/FileTransfer/Server/Env.hs` +- Modify: `src/Simplex/FileTransfer/Server.hs` + +- [ ] **Step 1: Remove `usedStorage` from `FileStore` in `Store.hs`** + + 1. Remove `usedStorage :: TVar Int64` field from `FileStore` record (line 47). + 2. Remove `usedStorage <- newTVarIO 0` from `newFileStore` (line 75) and drop the field from the record construction (line 76). + 3. In `setFilePath` (line 92-97): remove `modifyTVar' (usedStorage st) (+ fromIntegral (size fileInfo))` — keep only `writeTVar filePath (Just fPath)`. Change pattern from `\FileRec {fileInfo, filePath}` to `\FileRec {filePath}` (fileInfo is now unused — `-Wunused-matches` error). + 4. In `deleteFile` (line 112-119): remove `modifyTVar' usedStorage $ subtract (fromIntegral $ size fileInfo)`. Change outer pattern match from `FileStore {files, recipients, usedStorage}` to `FileStore {files, recipients}`. Change inner pattern from `Just FileRec {fileInfo, recipientIds}` to `Just FileRec {recipientIds}` (`fileInfo` is now unused — `-Wunused-matches` error). + 5. In `blockFile` (line 122-127): remove `when deleted $ modifyTVar' usedStorage $ subtract (fromIntegral $ size fileInfo)`. Change pattern match from `st@FileStore {usedStorage}` to `st`. The `deleted` parameter and `fileInfo` in the inner pattern become unused — prefix with `_` or remove from pattern to avoid `-Wunused-matches`. + +- [ ] **Step 2: Add `usedStorage` to `XFTPEnv` in `Env.hs`** + + 1. Add `usedStorage :: TVar Int64` field to `XFTPEnv` record (between `store` and `storeLog`, line 93). + 2. In `newXFTPServerEnv` (line 112-126): replace lines 117-118: + ``` + used <- countUsedStorage <$> readTVarIO (files store) + atomically $ writeTVar (usedStorage store) used + ``` + with: + ``` + usedStorage <- newTVarIO =<< countUsedStorage <$> readTVarIO (files store) + ``` + 3. Add `usedStorage` to the `pure XFTPEnv {..}` construction. + +- [ ] **Step 3: Update all `usedStorage` access sites in `Server.hs`** + + 1. Line 552: `us <- asks $ usedStorage . store` → `us <- asks usedStorage`. + 2. Line 569: `us <- asks $ usedStorage . store` → `us <- asks usedStorage`. + 3. Line 639: `usedStart <- readTVarIO $ usedStorage st` → `usedStart <- readTVarIO =<< asks usedStorage`. + 4. Line 647: `usedEnd <- readTVarIO $ usedStorage st` → `usedEnd <- readTVarIO =<< asks usedStorage`. + 5. Line 694: `FileStore {files, usedStorage} <- asks store` → split into `FileStore {files} <- asks store` and `usedStorage <- asks usedStorage`. + 6. In `deleteOrBlockServerFile_` (line 620): after `void $ atomically $ storeAction st`, add usedStorage adjustment — `us <- asks usedStorage` then `atomically $ modifyTVar' us $ subtract (fromIntegral $ size fileInfo)` when file had a path (check `path` from `readTVarIO filePath` earlier in the function). + +- [ ] **Step 4: Build and verify** + + Run: `cabal build` + +- [ ] **Step 5: Run existing tests** + + Run: `cabal test --test-show-details=streaming --test-option=--match="/XFTP/"` + +- [ ] **Step 6: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs + git add src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs + git commit -m "refactor(xftp): move usedStorage from FileStore to XFTPEnv" + ``` + +--- + +## Task 2: Add `getUsedStorage`, `getFileCount`, `expiredFiles` functions + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Store.hs` +- Modify: `src/Simplex/FileTransfer/Server/Env.hs` +- Modify: `src/Simplex/FileTransfer/Server.hs` + +- [ ] **Step 1: Add three new functions to `Store.hs`** + + 1. Add to exports: `getUsedStorage`, `getFileCount`, `expiredFiles`. + 2. Remove `expiredFilePath` from exports AND delete the function definition (dead code → `-Wunused-binds` error). Also remove `($>>=)` from import `Simplex.Messaging.Util (ifM, ($>>=))` → `Simplex.Messaging.Util (ifM)` — `$>>=` was only used by `expiredFilePath`. + 3. Add import: `qualified Data.Map.Strict as M` (needed for `M.foldl'` in `getUsedStorage` and `M.toList` in `expiredFiles`). + 4. Implement: + ```haskell + getUsedStorage :: FileStore -> IO Int64 + getUsedStorage FileStore {files} = + M.foldl' (\acc FileRec {fileInfo = FileInfo {size}} -> acc + fromIntegral size) 0 <$> readTVarIO files + + getFileCount :: FileStore -> IO Int + getFileCount FileStore {files} = M.size <$> readTVarIO files + + expiredFiles :: FileStore -> Int64 -> Int -> IO [(SenderId, Maybe FilePath, Word32)] + expiredFiles FileStore {files} old _limit = do + fs <- readTVarIO files + fmap catMaybes . forM (M.toList fs) $ \(sId, FileRec {fileInfo = FileInfo {size}, filePath, createdAt = RoundedSystemTime createdAt}) -> + if createdAt + fileTimePrecision < old + then do + path <- readTVarIO filePath + pure $ Just (sId, path, size) + else pure Nothing + ``` + 5. Add imports: `Data.Maybe (catMaybes)`, `Data.Word (Word32)` (note: `qualified Data.Map.Strict as M` already added in item 3). + +- [ ] **Step 2: Replace `countUsedStorage` in `Env.hs`** + + 1. Replace `countUsedStorage <$> readTVarIO (files store)` with `getUsedStorage store` in `newXFTPServerEnv`. + 2. Remove `countUsedStorage` function definition and its export. + 3. Remove `qualified Data.Map.Strict as M` import if no longer used. + +- [ ] **Step 3: Update `restoreServerStats` in `Server.hs` to use `getFileCount`** + + In `restoreServerStats` (line 694-696): replace `FileStore {files} <- asks store` and `_filesCount <- M.size <$> readTVarIO files` with `st <- asks store` and `_filesCount <- liftIO $ getFileCount st` (eliminates the `FileStore` pattern match — `files` binding no longer needed). + +- [ ] **Step 4: Replace `expireServerFiles` iteration in `Server.hs`** + + 1. Replace the body of `expireServerFiles` (lines 636-660). Remove `files' <- readTVarIO (files st)` and the `forM_ (M.keys files')` loop. + 2. New body: call `expiredFiles st old 10000` in a loop. For each `(sId, filePath_, fileSize)` in returned list: apply `itemDelay`, remove disk file if present, call `atomically $ deleteFile st sId`, adjust `usedStorage` TVar by `fileSize`, increment `filesExpired` stat. Loop until `expiredFiles` returns `[]`. + 3. Remove `Data.Map.Strict` import from Server.hs if no longer needed (was used for `M.size` and `M.keys` — now replaced by `getFileCount` and `expiredFiles`). + +- [ ] **Step 5: Build and verify** + + Run: `cabal build` + +- [ ] **Step 6: Run existing tests** + + Run: `cabal test --test-show-details=streaming --test-option=--match="/XFTP/"` + +- [ ] **Step 7: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs + git add src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs + git commit -m "refactor(xftp): add getUsedStorage, getFileCount, expiredFiles store functions" + ``` + +--- + +## Task 3: Change `Store.hs` functions from STM to IO + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Store.hs` +- Modify: `src/Simplex/FileTransfer/Server.hs` +- Modify: `src/Simplex/FileTransfer/Server/StoreLog.hs` + +- [ ] **Step 1: Change all Store.hs function signatures from STM to IO** + + For each of: `addFile`, `setFilePath`, `addRecipient`, `getFile`, `deleteFile`, `blockFile`, `deleteRecipient`, `ackFile`: + 1. Change return type from `STM (Either XFTPErrorType ...)` to `IO (Either XFTPErrorType ...)` (or `STM ()` to `IO ()` for `deleteRecipient`). + 2. Wrap the function body in `atomically $ do ...`. + 3. Keep `withFile` and `newFileRec` as internal STM helpers (called inside the `atomically` blocks). + +- [ ] **Step 2: Update Server.hs call sites — remove `atomically` wrappers** + + 1. Line 563 (`receiveServerFile`): change `atomically $ writeTVar filePath (Just fPath)` → add `st <- asks store` then `void $ liftIO $ setFilePath st senderId fPath` (design call site #1 — `store` is not in scope in `receiveServerFile`'s `receive` helper, so bind via `asks`; `void` avoids `-Wunused-do-bind` warning on the `Either` result). + 2. Line 453 (`verifyXFTPTransmission`): split `atomically $ verify =<< getFile st party fId` into: `liftIO (getFile st party fId)` (IO→M lift), then pattern match on result, use `readTVarIO (fileStatus fr)` instead of `readTVar`. + 3. Lines 371, 377 (control port `CPDelete`/`CPBlock`): change `ExceptT $ atomically $ getFile fs SFRecipient fileId` → `ExceptT $ liftIO $ getFile fs SFRecipient fileId` (inside `unliftIO u $ do` block which runs in M monad — `liftIO` required to lift IO into M). + 4. Line 508 (`addFile` in `createFile`): the `ExceptT $ addFile st sId file ts EntityActive` — `addFile` is now IO, `ExceptT` wraps IO directly. Remove any `atomically`. + 5. Line 514 (`addRecipient`): same — `ExceptT . addRecipient st sId` works directly in IO. + 6. Line 516 (`retryAdd`): change parameter type from `(XFTPFileId -> STM (Either XFTPErrorType a))` to `(XFTPFileId -> IO (Either XFTPErrorType a))`. Line 520: change `atomically (add fId)` to `liftIO (add fId)`. + 7. Line 605 (`ackFileReception`): change `atomically $ deleteRecipient st rId fr` to `liftIO $ deleteRecipient st rId fr`. + 8. Line 620 (`deleteOrBlockServerFile_`): change third parameter type from `(FileStore -> STM (Either XFTPErrorType ()))` to `(FileStore -> IO (Either XFTPErrorType ()))`. Line 626: change `void $ atomically $ storeAction st` to `void $ liftIO $ storeAction st`. + 9. `expireServerFiles` `delete` helper: change `atomically $ deleteFile st sId` to `liftIO $ deleteFile st sId` (deleteFile is now IO; `liftIO` required because the helper runs in M monad, not IO). + +- [ ] **Step 3: Update `StoreLog.hs` — remove `atomically` from replay** + + In `readFileStore` (line 93), function `addToStore`: + 1. Change `atomically (addToStore lr)` to `addToStore lr` — store functions are now IO. + 2. The `addToStore` body calls `addFile`, `setFilePath`, `deleteFile`, `blockFile`, `ackFile` — all IO now, no `atomically` needed. + 3. For `AddRecipients`: `runExceptT $ mapM_ (ExceptT . addRecipient st sId) rcps` — `addRecipient` returns `IO (Either ...)`, so `ExceptT . addRecipient st sId` works directly. + +- [ ] **Step 4: Build and verify** + + Run: `cabal build` + +- [ ] **Step 5: Run existing tests** + + Run: `cabal test --test-show-details=streaming --test-option=--match="/XFTP/"` + +- [ ] **Step 6: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server.hs src/Simplex/FileTransfer/Server/StoreLog.hs + git add src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server.hs src/Simplex/FileTransfer/Server/StoreLog.hs + git commit -m "refactor(xftp): change file store operations from STM to IO" + ``` + +--- + +## Task 4: Extract `FileStoreClass` typeclass, move STM impl to `Store/STM.hs` + +**Files:** +- Rewrite: `src/Simplex/FileTransfer/Server/Store.hs` +- Create: `src/Simplex/FileTransfer/Server/Store/STM.hs` +- Modify: `src/Simplex/FileTransfer/Server/StoreLog.hs` +- Modify: `src/Simplex/FileTransfer/Server/Env.hs` +- Modify: `src/Simplex/FileTransfer/Server.hs` +- Modify: `simplexmq.cabal` + +- [ ] **Step 1: Create `Store/STM.hs` — move all implementation code** + + 1. Create directory `src/Simplex/FileTransfer/Server/Store/`. + 2. Create `src/Simplex/FileTransfer/Server/Store/STM.hs`. + 3. Move from `Store.hs`: `FileStore` data type (rename to `STMFileStore`), all function implementations, internal helpers (`withFile`, `newFileRec`), all STM-specific imports. + 4. Rename all `FileStore` references to `STMFileStore` in the new file. + 5. Module declaration: `module Simplex.FileTransfer.Server.Store.STM` exporting only `STMFileStore (..)` — do NOT export standalone functions (`addFile`, `setFilePath`, etc.) to avoid name collisions with the typeclass methods from `Store.hs`. + +- [ ] **Step 2: Rewrite `Store.hs` as the typeclass module** + + 1. Add `{-# LANGUAGE TypeFamilies #-}` pragma to `Store.hs` (required for `type FileStoreConfig s` associated type). + 2. Keep in `Store.hs`: `FileRec (..)`, `FileRecipient (..)`, `RoundedFileTime`, `fileTimePrecision` definitions and their `StrEncoding` instance. + 3. Add `FileStoreClass` typeclass: + ```haskell + class FileStoreClass s where + type FileStoreConfig s + + -- Lifecycle + newFileStore :: FileStoreConfig s -> IO s + closeFileStore :: s -> IO () + + -- File operations + addFile :: s -> SenderId -> FileInfo -> RoundedFileTime -> ServerEntityStatus -> IO (Either XFTPErrorType ()) + setFilePath :: s -> SenderId -> FilePath -> IO (Either XFTPErrorType ()) + addRecipient :: s -> SenderId -> FileRecipient -> IO (Either XFTPErrorType ()) + getFile :: s -> SFileParty p -> XFTPFileId -> IO (Either XFTPErrorType (FileRec, C.APublicAuthKey)) + deleteFile :: s -> SenderId -> IO (Either XFTPErrorType ()) + blockFile :: s -> SenderId -> BlockingInfo -> Bool -> IO (Either XFTPErrorType ()) + deleteRecipient :: s -> RecipientId -> FileRec -> IO () + ackFile :: s -> RecipientId -> IO (Either XFTPErrorType ()) + + -- Expiration + expiredFiles :: s -> Int64 -> Int -> IO [(SenderId, Maybe FilePath, Word32)] + + -- Stats + getUsedStorage :: s -> IO Int64 + getFileCount :: s -> IO Int + ``` + 4. Do NOT re-export from `Store/STM.hs` — this would create a circular module dependency (Store.hs imports Store/STM.hs, Store/STM.hs imports Store.hs). Consumers must import `Store.STM` directly where they need `STMFileStore`. + 5. Remove all STM-specific imports that are no longer needed. + +- [ ] **Step 3: Add `FileStoreClass` instance in `Store/STM.hs`** + + 1. Import `FileStoreClass` from `Simplex.FileTransfer.Server.Store`. + 2. Inline all implementations directly in the instance body (do NOT delegate to standalone functions — the standalone names collide with typeclass method names, causing ambiguous occurrences for importers): + ```haskell + instance FileStoreClass STMFileStore where + type FileStoreConfig STMFileStore = () + newFileStore () = do + files <- TM.emptyIO + recipients <- TM.emptyIO + pure STMFileStore {files, recipients} + closeFileStore _ = pure () + addFile st sId fileInfo createdAt status = atomically $ ... + setFilePath st sId fPath = atomically $ ... + -- ... (each method's body is the existing function body, inlined) + ``` + 3. Remove the standalone top-level function definitions — they are now instance methods. Keep only `withFile` and `newFileRec` as internal helpers used by the instance methods. + +- [ ] **Step 4: Update importers** + + 1. `Env.hs`: add `import Simplex.FileTransfer.Server.Store.STM (STMFileStore (..))`. Change `FileStore` → `STMFileStore` in `XFTPEnv` type and `newXFTPServerEnv`. Change `store <- newFileStore` to `store <- newFileStore ()` (typeclass method now takes `FileStoreConfig STMFileStore` which is `()`). Keep `import Simplex.FileTransfer.Server.Store` for `FileRec`, `FileRecipient`, `FileStoreClass`, etc. + 2. `Server.hs`: add `import Simplex.FileTransfer.Server.Store.STM`. Change `FileStore` → `STMFileStore` in any explicit type annotations. Import `FileStoreClass` from `Simplex.FileTransfer.Server.Store`. + 3. `StoreLog.hs`: add `import Simplex.FileTransfer.Server.Store.STM` to access concrete `STMFileStore` type and store functions used during log replay. Change `FileStore` → `STMFileStore` in `readWriteFileStore` and `writeFileStore` parameter types. + +- [ ] **Step 5: Update cabal file** + + Add `Simplex.FileTransfer.Server.Store.STM` to `exposed-modules` in the `!flag(client_library)` section, alongside existing XFTP server modules. + +- [ ] **Step 6: Build and verify** + + Run: `cabal build` + +- [ ] **Step 7: Run existing tests** + + Run: `cabal test --test-show-details=streaming --test-option=--match="/XFTP/"` + +- [ ] **Step 8: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server/Store/STM.hs src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs src/Simplex/FileTransfer/Server/StoreLog.hs + git add src/Simplex/FileTransfer/Server/Store.hs src/Simplex/FileTransfer/Server/Store/STM.hs src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs src/Simplex/FileTransfer/Server/StoreLog.hs simplexmq.cabal + git commit -m "refactor(xftp): extract FileStoreClass typeclass, move STM impl to Store.STM" + ``` + +--- + +## Task 5: Make `XFTPEnv` and `Server.hs` polymorphic over `FileStoreClass` + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Env.hs` +- Modify: `src/Simplex/FileTransfer/Server.hs` +- Modify: `src/Simplex/FileTransfer/Server/Main.hs` +- Modify: `tests/XFTPClient.hs` (if it calls `runXFTPServerBlocking` directly) + +- [ ] **Step 1: Make `XFTPEnv` polymorphic in `Env.hs`** + + 1. Add `XFTPStoreConfig` GADT: `data XFTPStoreConfig s where XSCMemory :: Maybe FilePath -> XFTPStoreConfig STMFileStore`. + 2. Change `data XFTPEnv` to `data XFTPEnv s` — field `store :: FileStore` becomes `store :: s`. + 3. Change `newXFTPServerEnv :: XFTPServerConfig -> IO XFTPEnv` to `newXFTPServerEnv :: FileStoreClass s => XFTPStoreConfig s -> XFTPServerConfig -> IO (XFTPEnv s)`. + 4. Pattern match on `XSCMemory storeLogPath` in `newXFTPServerEnv` body. Create store via `newFileStore ()`, storeLog via `mapM (`readWriteFileStore` st) storeLogPath`. + +- [ ] **Step 2: Make `Server.hs` polymorphic** + + 1. Change `type M a = ReaderT XFTPEnv IO a` to `type M s a = ReaderT (XFTPEnv s) IO a`. + 2. Add `FileStoreClass s =>` constraint to all functions using `M s a`. Use `forall s.` in signatures of functions that have `where`-block bindings with `M s` type annotations — `ScopedTypeVariables` requires explicit `forall` to bring `s` into scope for inner type signatures (matching SMP's `smpServer :: forall s. MsgStoreClass s => ...` pattern). Full list: `xftpServer`, `processRequest`, `verifyXFTPTransmission`, `processXFTPRequest` and all its `where`-bound functions (`createFile`, `addRecipients`, `receiveServerFile`, `sendServerFile`, `deleteServerFile`, `ackFileReception`, `retryAdd`, `addFileRetry`, `addRecipientRetry`), `deleteServerFile_`, `blockServerFile`, `deleteOrBlockServerFile_`, `expireServerFiles`, `randomId`, `getFileId`, `withFileLog`, `incFileStat`, `saveServerStats`, `restoreServerStats`, `randomDelay` (inside `#ifdef slow_servers` CPP block). Also update `encodeXftp` (line 236) and `runCPClient` (line 339) which use explicit `ReaderT XFTPEnv IO` instead of the `M` alias — change to `ReaderT (XFTPEnv s) IO`. + 3. Change `runXFTPServerBlocking` and `runXFTPServer` to take `XFTPStoreConfig s` parameter. + 4. Add `closeFileStore store` call to the server shutdown path (in the `finally` block or `stopServer` equivalent — after saving stats, before logging "Server stopped"). This ensures Postgres connection pool and `dbStoreLog` are properly closed. For STM this is a no-op. + +- [ ] **Step 3: Update `Main.hs` dispatch** + + 1. In `runServer`: construct `XSCMemory (enableStoreLog $> storeLogFilePath)`. + 2. Add dispatch function that calls the updated `runXFTPServer` (which creates `started` internally): + ```haskell + run :: FileStoreClass s => XFTPStoreConfig s -> IO () + run storeCfg = runXFTPServer storeCfg serverConfig + ``` + 3. Call `run` with the `XSCMemory` config. + +- [ ] **Step 4: Update test helper if needed** + + If `tests/XFTPClient.hs` calls `runXFTPServerBlocking` directly, update the call to pass an `XSCMemory` config. Check the `withXFTPServer` / `serverBracket` helper. + +- [ ] **Step 5: Build and verify** + + Run: `cabal build && cabal build test:simplexmq-test` + +- [ ] **Step 6: Run existing tests** + + Run: `cabal test --test-show-details=streaming --test-option=--match="/XFTP/"` + +- [ ] **Step 7: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs src/Simplex/FileTransfer/Server/Main.hs + git add src/Simplex/FileTransfer/Server/Env.hs src/Simplex/FileTransfer/Server.hs src/Simplex/FileTransfer/Server/Main.hs tests/XFTPClient.hs simplexmq.cabal + git commit -m "refactor(xftp): make XFTPEnv and server polymorphic over FileStoreClass" + ``` + +--- + +## Task 6: Add Postgres config, migrations, and store skeleton + +**Files:** +- Create: `src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs` +- Create: `src/Simplex/FileTransfer/Server/Store/Postgres/Migrations.hs` +- Create: `src/Simplex/FileTransfer/Server/Store/Postgres.hs` +- Modify: `src/Simplex/FileTransfer/Server/Env.hs` +- Modify: `simplexmq.cabal` + +- [ ] **Step 1: Create `Store/Postgres/Config.hs`** + + ```haskell + module Simplex.FileTransfer.Server.Store.Postgres.Config + ( PostgresFileStoreCfg (..), + defaultXFTPDBOpts, + ) + where + + import Simplex.Messaging.Agent.Store.Postgres.Options (DBOpts (..)) + import Simplex.Messaging.Agent.Store.Shared (MigrationConfirmation) + + data PostgresFileStoreCfg = PostgresFileStoreCfg + { dbOpts :: DBOpts, + dbStoreLogPath :: Maybe FilePath, + confirmMigrations :: MigrationConfirmation + } + + defaultXFTPDBOpts :: DBOpts + defaultXFTPDBOpts = + DBOpts + { connstr = "postgresql://xftp@/xftp_server_store", + schema = "xftp_server", + poolSize = 10, + createSchema = False + } + ``` + +- [ ] **Step 2: Create `Store/Postgres/Migrations.hs`** + + Full migration module with `xftpServerMigrations :: [Migration]` and `m20260325_initial` containing CREATE TABLE SQL for `files` and `recipients` tables plus indexes. Follow SMP's `QueueStore/Postgres/Migrations.hs` pattern exactly: tuple list → `sortOn name . map migration`. + +- [ ] **Step 3: Create `Store/Postgres.hs` with stub instance** + + 1. Define `PostgresFileStore` with `dbStore :: DBStore` and `dbStoreLog :: Maybe (StoreLog 'WriteMode)`. + 2. `instance FileStoreClass PostgresFileStore` with `error "not implemented"` for all methods except `newFileStore` (calls `createDBStore` + opens `dbStoreLog`) and `closeFileStore` (closes both). `type FileStoreConfig PostgresFileStore = PostgresFileStoreCfg`. + 3. Add `withDB`, `handleDuplicate`, `assertUpdated`, `withLog` helpers. + +- [ ] **Step 4: Add `XSCDatabase` GADT constructor in `Env.hs` (CPP-guarded)** + + ```haskell + #if defined(dbServerPostgres) + import Simplex.FileTransfer.Server.Store.Postgres (PostgresFileStore) + import Simplex.FileTransfer.Server.Store.Postgres.Config (PostgresFileStoreCfg) + #endif + + data XFTPStoreConfig s where + XSCMemory :: Maybe FilePath -> XFTPStoreConfig STMFileStore + #if defined(dbServerPostgres) + XSCDatabase :: PostgresFileStoreCfg -> XFTPStoreConfig PostgresFileStore + #endif + ``` + +- [ ] **Step 5: Update cabal** + + Add to existing `if flag(server_postgres)` block: + ``` + Simplex.FileTransfer.Server.Store.Postgres + Simplex.FileTransfer.Server.Store.Postgres.Config + Simplex.FileTransfer.Server.Store.Postgres.Migrations + ``` + +- [ ] **Step 6: Build both ways** + + Run: `cabal build && cabal build -fserver_postgres` + +- [ ] **Step 7: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Store/Postgres.hs src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs src/Simplex/FileTransfer/Server/Env.hs + git add src/Simplex/FileTransfer/Server/Store/Postgres.hs src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs src/Simplex/FileTransfer/Server/Store/Postgres/Migrations.hs src/Simplex/FileTransfer/Server/Env.hs simplexmq.cabal + git commit -m "feat(xftp): add PostgreSQL store skeleton with schema migration" + ``` + +--- + +## Task 7: Implement `PostgresFileStore` operations + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Store/Postgres.hs` + +- [ ] **Step 1: Implement `addFile`** + + `INSERT INTO files (sender_id, file_size, file_digest, sender_key, file_path, created_at, status) VALUES (?,?,?,?,NULL,?,?)`. Catch unique violation with `handleDuplicate` → `DUPLICATE_`. Call `withLog "addFile"` after. + +- [ ] **Step 2: Implement `getFile`** + + For `SFSender`: `SELECT ... FROM files WHERE sender_id = ?`. Construct `FileRec` with `newTVarIO` per TVar field. `recipientIds = S.empty`. + For `SFRecipient`: `SELECT f.*, r.recipient_key FROM recipients r JOIN files f ON r.sender_id = f.sender_id WHERE r.recipient_id = ?`. + +- [ ] **Step 3: Implement `setFilePath`** + + `UPDATE files SET file_path = ? WHERE sender_id = ? AND file_path IS NULL`. Use `assertUpdated`. Call `withLog "setFilePath"`. + +- [ ] **Step 4: Implement `addRecipient`** + + `INSERT INTO recipients (recipient_id, sender_id, recipient_key) VALUES (?,?,?)`. `handleDuplicate` → `DUPLICATE_`. Call `withLog "addRecipient"`. + +- [ ] **Step 5: Implement `deleteFile`, `blockFile`** + + `deleteFile`: `DELETE FROM files WHERE sender_id = ?` (CASCADE). `withLog "deleteFile"`. + `blockFile`: `UPDATE files SET status = ? WHERE sender_id = ?`. `assertUpdated`. `withLog "blockFile"`. + +- [ ] **Step 6: Implement `deleteRecipient`, `ackFile`** + + `deleteRecipient`: `DELETE FROM recipients WHERE recipient_id = ?`. `withLog "deleteRecipient"`. + `ackFile`: same + return `Left AUTH` if 0 rows. + +- [ ] **Step 7: Implement `expiredFiles`, `getUsedStorage`, `getFileCount`** + + `expiredFiles`: `SELECT sender_id, file_path, file_size FROM files WHERE created_at + ? < ? LIMIT ?`. + `getUsedStorage`: `SELECT COALESCE(SUM(file_size), 0) FROM files`. + `getFileCount`: `SELECT COUNT(*) FROM files`. + +- [ ] **Step 8: Add `ToField`/`FromField` instances** + + For `RoundedFileTime` (Int64 wrapper), `ServerEntityStatus` (Text via StrEncoding), `C.APublicAuthKey` (Binary via `encodePubKey`/`decodePubKey`). Check SMP's `QueueStore/Postgres.hs` for existing instances to import. + +- [ ] **Step 9: Wrap mutation operations in `uninterruptibleMask_`** + + Operations that combine a DB write with a TVar update (e.g., `getFile` constructs `FileRec` with `newTVarIO`) must be wrapped in `E.uninterruptibleMask_` to prevent async exceptions from leaving inconsistent state. Follow SMP's `addQueue_`, `deleteStoreQueue` pattern. + +- [ ] **Step 10: Build** + + Run: `cabal build -fserver_postgres` + +- [ ] **Step 11: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Store/Postgres.hs + git add src/Simplex/FileTransfer/Server/Store/Postgres.hs + git commit -m "feat(xftp): implement PostgresFileStore operations" + ``` + +--- + +## Task 8: Add INI config, Main.hs dispatch, startup validation + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Main.hs` +- Modify: `src/Simplex/FileTransfer/Server/Env.hs` + +- [ ] **Step 1: Update `iniFileContent` in `Main.hs`** + + Add to `[STORE_LOG]` section: `store_files: memory`, commented-out `db_connection`, `db_schema`, `db_pool_size`, `db_store_log` keys. Follow SMP's `optDisabled'` pattern for commented defaults. + +- [ ] **Step 2: Add `StartOptions` and `--confirm-migrations` flag** + + ```haskell + data StartOptions = StartOptions + { confirmMigrations :: MigrationConfirmation + } + ``` + Add to `Start` command parser with default `MCConsole`. Thread through to `runServer`. + +- [ ] **Step 3: Add store_files INI parsing and CPP-guarded Postgres dispatch** + + In `runServer`: read `store_files` from INI (`fromRight "memory" $ lookupValue "STORE_LOG" "store_files" ini`). Add `"database"` branch (CPP-guarded) that constructs `PostgresFileStoreCfg` using `iniDBOptions ini defaultXFTPDBOpts` and `enableDbStoreLog'` pattern. Non-postgres build: `exitError`. + +- [ ] **Step 4: Add `XSCDatabase` branch in `newXFTPServerEnv` (`Env.hs`)** + + CPP-guarded pattern match on `XSCDatabase dbCfg`: `newFileStore dbCfg`, `storeLog = Nothing`. + +- [ ] **Step 5: Add startup config validation** + + Add `checkFileStoreMode` (CPP-guarded) before `run`: validate conflicting storeLog file + database mode, missing schema, etc. per design doc. + +- [ ] **Step 6: Build both ways** + + Run: `cabal build && cabal build -fserver_postgres` + +- [ ] **Step 7: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Main.hs src/Simplex/FileTransfer/Server/Env.hs + git add src/Simplex/FileTransfer/Server/Main.hs src/Simplex/FileTransfer/Server/Env.hs + git commit -m "feat(xftp): add PostgreSQL INI config, store dispatch, startup validation" + ``` + +--- + +## Task 9: Add database import/export CLI commands + +**Files:** +- Modify: `src/Simplex/FileTransfer/Server/Main.hs` + +- [ ] **Step 1: Add `Database` CLI command (CPP-guarded)** + + Add `Database StoreCmd DBOpts` constructor to `CliCommand`. Add `database` subcommand parser with `import`/`export` subcommands + `dbOptsP defaultXFTPDBOpts`. + +- [ ] **Step 2: Implement `importFileStoreToDatabase`** + + 1. `confirmOrExit` with database details. + 2. Create temporary `STMFileStore`, replay StoreLog via `readWriteFileStore`. + 3. Create `PostgresFileStore` with `createSchema = True`, `confirmMigrations = MCYesUp`. + 4. Batch-insert files using PostgreSQL COPY protocol. Progress every 10k. + 5. Batch-insert recipients using COPY protocol. + 6. Verify counts: `SELECT COUNT(*)` — warn on mismatch. + 7. Rename StoreLog to `.bak`. + 8. Report counts. + +- [ ] **Step 3: Implement `exportDatabaseToStoreLog`** + + 1. `confirmOrExit`. Fail if output file exists. + 2. Create `PostgresFileStore` from config. + 3. Open StoreLog for writing. + 4. Fold over file records: write `AddFile` (with status), `AddRecipients`, `PutFile` per file. + 5. Close StoreLog, report counts. + +- [ ] **Step 4: Build** + + Run: `cabal build -fserver_postgres` + +- [ ] **Step 5: Format and commit** + + ```bash + fourmolu -i src/Simplex/FileTransfer/Server/Main.hs + git add src/Simplex/FileTransfer/Server/Main.hs + git commit -m "feat(xftp): add database import/export CLI commands" + ``` + +--- + +## Task 10: Add Postgres tests + +**Files:** +- Modify: `tests/XFTPClient.hs` +- Modify: `tests/Test.hs` +- Create: `tests/CoreTests/XFTPStoreTests.hs` + +- [ ] **Step 1: Add test fixtures in `tests/XFTPClient.hs`** + + ```haskell + testXFTPStoreDBOpts :: DBOpts + testXFTPStoreDBOpts = + DBOpts + { connstr = "postgresql://test_xftp_server_user@/test_xftp_server_db", + schema = "xftp_server_test", + poolSize = 10, + createSchema = True + } + ``` + Add `testXFTPDBConnectInfo :: ConnectInfo` matching the connection string. + +- [ ] **Step 2: Add Postgres server test group in `tests/Test.hs`** + + CPP-guarded block that runs existing `xftpServerTests` with Postgres store config, wrapped in `postgressBracket testXFTPDBConnectInfo`. Parameterize `withXFTPServer` to accept store config if needed. + +- [ ] **Step 3: Create `tests/CoreTests/XFTPStoreTests.hs` — unit tests** + + Test `PostgresFileStore` operations directly: + - `addFile` + `getFile SFSender` round-trip. + - `addFile` duplicate → `DUPLICATE_`. + - `getFile` nonexistent → `AUTH`. + - `setFilePath` + verify `WHERE file_path IS NULL` guard. + - `addRecipient` + `getFile SFRecipient` round-trip. + - `deleteFile` cascades recipients. + - `blockFile` + verify status. + - `expiredFiles` batch semantics. + - `getUsedStorage`, `getFileCount` correctness. + +- [ ] **Step 4: Add migration round-trip test** + + Create `STMFileStore` with test data (files + recipients + blocked status) → export to StoreLog → import to Postgres → export back → compare StoreLog files byte-for-byte. + +- [ ] **Step 5: Build and run tests** + + ```bash + cabal build -fserver_postgres test:simplexmq-test + cabal test --test-show-details=streaming --test-option=--match="/XFTP/" -fserver_postgres + ``` + +- [ ] **Step 6: Format and commit** + + ```bash + fourmolu -i tests/CoreTests/XFTPStoreTests.hs tests/XFTPClient.hs + git add tests/CoreTests/XFTPStoreTests.hs tests/XFTPClient.hs tests/Test.hs + git commit -m "test(xftp): add PostgreSQL backend tests" + ``` diff --git a/plans/20260328_01_server_batched_sub_processing.md b/plans/20260328_01_server_batched_sub_processing.md new file mode 100644 index 000000000..411968de4 --- /dev/null +++ b/plans/20260328_01_server_batched_sub_processing.md @@ -0,0 +1,152 @@ +# Server: batched SUB command processing + +Implementation plan for Part 1 of [RFC 2026-03-28-subscription-performance](../rfcs/2026-03-28-subscription-performance.md). + +## Current state + +When a batch of ~135 SUB commands arrives, the server already batches: +- Queue record lookups (`getQueueRecs` in `receive`, Server.hs:1151) +- Command verification (`verifyLoadedQueue`, Server.hs:1152) + +But command processing is per-command (`foldrM process` in `client`, Server.hs:1372-1375). Each SUB calls `subscribeQueueAndDeliver` which calls `tryPeekMsg` - one DB query per queue. For Postgres, that's ~135 individual `SELECT ... FROM messages WHERE recipient_id = ? ORDER BY message_id ASC LIMIT 1` queries per batch. + +## Goal + +Replace ~135 individual message peek queries with 1 batched query per batch. No protocol changes. + +## Implementation + +### Step 1: Add `tryPeekMsgs` to MsgStoreClass + +File: `src/Simplex/Messaging/Server/MsgStore/Types.hs` + +Add to `MsgStoreClass`: + +```haskell +tryPeekMsgs :: s -> [StoreQueue s] -> ExceptT ErrorType IO (Map RecipientId Message) +``` + +Returns a map from recipient ID to earliest pending message for each queue that has one. Queues with no messages are absent from the map. + +### Step 2: Parameterize `deliver` to accept pre-fetched message + +File: `src/Simplex/Messaging/Server.hs` + +Currently `deliver` (inside `subscribeQueueAndDeliver`, line 1641) calls `tryPeekMsg ms q`. Add a parameter for an optional pre-fetched message: + +```haskell +deliver :: Maybe Message -> (Bool, Maybe Sub) -> M s ResponseAndMessage +deliver prefetchedMsg (hasSub, sub_) = do + stats <- asks serverStats + fmap (either ((,Nothing) . err) id) $ liftIO $ runExceptT $ do + msg_ <- maybe (tryPeekMsg ms q) (pure . Just) prefetchedMsg + ... +``` + +When `Nothing` is passed, falls back to individual `tryPeekMsg` (existing behavior). When `Just msg` is passed, uses it directly (batched path). + +### Step 3: Pre-fetch messages before the processing loop + +File: `src/Simplex/Messaging/Server.hs` + +Currently (lines 1372-1375): + +```haskell +forever $ + atomically (readTBQueue rcvQ) + >>= foldrM process ([], []) + >>= \(rs_, msgs) -> ... +``` + +Add a pre-fetch step before the existing loop: + +```haskell +forever $ do + batch <- atomically (readTBQueue rcvQ) + msgMap <- prefetchMsgs batch + foldrM (process msgMap) ([], []) batch + >>= \(rs_, msgs) -> ... +``` + +`prefetchMsgs` scans the batch, collects queues from SUB commands that have a verified queue (`q_ = Just (q, _)`), calls `tryPeekMsgs` once, returns the map. For batches with no SUBs it returns an empty map (no DB call). + +`process` passes the looked-up message (or Nothing) through to `processCommand` and down to `deliver`. + +The `foldrM process` loop, `processCommand`, `subscribeQueueAndDeliver`, and all other command handlers stay structurally the same. Only `deliver` gains one parameter, and the `client` loop gains one pre-fetch call. + +### Step 4: Review + +Review the typeclass signature and server usage. Confirm the interface has the right shape before implementing store backends. + +### Step 5: Implement for each store backend + +#### Postgres + +File: `src/Simplex/Messaging/Server/MsgStore/Postgres.hs` + +Single query using `DISTINCT ON`: + +```sql +SELECT DISTINCT ON (recipient_id) + recipient_id, msg_id, msg_ts, msg_quota, msg_ntf_flag, msg_body +FROM messages +WHERE recipient_id IN ? +ORDER BY recipient_id, message_id ASC +``` + +Build `Map RecipientId Message` from results. + +#### STM + +File: `src/Simplex/Messaging/Server/MsgStore/STM.hs` + +Loop over queues, call `tryPeekMsg` for each, collect into map. + +#### Journal + +File: `src/Simplex/Messaging/Server/MsgStore/Journal.hs` + +Loop over queues, call `tryPeekMsg` for each, collect into map. + +### Step 6: Handle edge cases + +1. **Mixed batches**: `prefetchMsgs` collects only SUB queues. Non-SUB commands get Nothing for the pre-fetched message and process unchanged. + +2. **Already-subscribed queues**: Include in pre-fetch - `deliver` is called for re-SUBs too (delivers pending message). + +3. **Service subscriptions**: The pre-fetch doesn't care about service state. `sharedSubscribeQueue` handles service association in STM; message peek is the same. + +4. **Error queues**: Verification errors from `receive` are Left values in the batch. `prefetchMsgs` only looks at Right values with SUB commands. + +5. **Empty pre-fetch**: If batch has no SUBs (e.g., all ACKs), `prefetchMsgs` returns empty map, no DB call made. + +### Step 7: Batch other commands (future, not in scope) + +The same pattern (pre-fetch before loop, parameterize handler) can extend to: +- `ACK` with `tryDelPeekMsg` - batch delete+peek +- `GET` with `tryPeekMsg` - same map lookup + +Lower priority since these don't have the N-at-once pattern of subscriptions. + +## File changes summary + +| File | Change | +|---|---| +| `src/Simplex/Messaging/Server/MsgStore/Types.hs` | Add `tryPeekMsgs` to typeclass | +| `src/Simplex/Messaging/Server/MsgStore/Postgres.hs` | Implement `tryPeekMsgs` with batch SQL | +| `src/Simplex/Messaging/Server/MsgStore/STM.hs` | Implement `tryPeekMsgs` as loop | +| `src/Simplex/Messaging/Server/MsgStore/Journal.hs` | Implement `tryPeekMsgs` as loop | +| `src/Simplex/Messaging/Server.hs` | Add `prefetchMsgs`, parameterize `deliver` | + +## Testing + +1. Existing server tests must pass unchanged (correctness preserved). +2. Add a test that subscribes a batch of queues (some with pending messages, some without) and verifies all get correct SOK + MSG responses. +3. Prometheus metrics: existing `qSub` stat should still increment correctly. + +## Performance expectation + +For 300K queues across ~2200 batches: +- Before: ~300K individual DB queries +- After: ~2200 batched DB queries (one per batch of ~135) +- ~136x reduction in DB round-trips diff --git a/plans/20260401_01_batch_queue_associations.md b/plans/20260401_01_batch_queue_associations.md new file mode 100644 index 000000000..07f794df2 --- /dev/null +++ b/plans/20260401_01_batch_queue_associations.md @@ -0,0 +1,126 @@ +# Server: batch queue service associations + +When a batch of SUB or NSUB commands arrives from a service client, each command that needs a new or removed service association calls `setQueueService` individually - one DB write per command. For 135 commands per batch, that's 135 individual `UPDATE msg_queues` queries. + +## Goal + +Reduce to at most 2 DB queries per batch (one for rcv associations, one for ntf associations), using `UPDATE ... RETURNING recipient_id` to identify which queues were actually updated. + +Also fuse message pre-fetch and association batching into a single batch preparation step with a clean contract. + +## Contract + +```haskell +prepareBatch :: Maybe ServiceId -> NonEmpty (VerifiedTransmission s) -> M s (Either ErrorType (Map RecipientId (Maybe Message, Maybe (Either ErrorType ())))) +``` + +`Left e` = batch-level failure (message pre-fetch or association query failed entirely). All SUBs/NSUBs in the batch get this error. + +`Right map` = per-queue results as a tuple: +- `Maybe Message` - pre-fetched message for SUB queues, `Nothing` for NSUB or no message +- `Maybe (Either ErrorType ())` - association result. `Nothing` = no update needed. `Just (Right ())` = update succeeded. `Just (Left e)` = update failed for this queue. + +One map, one lookup per queue. `processCommand` passes both values to `subscribeQueueAndDeliver` / `subscribeNotifications` -> `sharedSubscribeQueue`. + +Queues not in the map (non-SUB/NSUB commands, failed verification) are not affected. + +## prepareBatch implementation + +One accumulating fold over the batch, collecting three lists: +- `subMsgQs :: [StoreQueue s]` - SUB queues for message pre-fetch +- `rcvAssocQs :: [StoreQueue s]` - SUB queues needing `rcv_service_id` update (`clntServiceId /= rcvServiceId qr`) +- `ntfAssocQs :: [StoreQueue s]` - NSUB queues needing `ntf_service_id` update (`clntServiceId /= ntfServiceId` from `NtfCreds`) + +Classification reads from the already-loaded `QueueRec` in `VerifiedTransmission` - no extra DB query. + +Then three store calls (each skipped if its list is empty): +1. `tryPeekMsgs ms subMsgQs` -> `Map RecipientId Message` +2. `setRcvQueueServices (queueStore ms) clntServiceId rcvAssocQs` -> `Set RecipientId` +3. `setNtfQueueServices (queueStore ms) clntServiceId ntfAssocQs` -> `Set RecipientId` + +Then one pass to merge results into `Map RecipientId (Maybe Message, Maybe (Either ErrorType ()))`: +- For each SUB queue: `(M.lookup rId msgMap, assocResult rId rcvUpdated rcvAssocQs)` +- For each NSUB queue: `(Nothing, assocResult rId ntfUpdated ntfAssocQs)` + +Where `assocResult rId updated assocQs` = if the queue was in `assocQs` (needed update), then `Just (Right ())` if `rId` is in `updated`, else `Just (Left AUTH)`. If not in `assocQs` (no update needed), `Nothing`. + +If any of the three calls fails entirely, return `Left e`. + +## Store interface + +Replace the polymorphic `setQueueServices` with two plain functions in `QueueStoreClass`: + +```haskell +setRcvQueueServices :: s -> Maybe ServiceId -> [q] -> IO (Set RecipientId) +setNtfQueueServices :: s -> Maybe ServiceId -> [q] -> IO (Set RecipientId) +``` + +No `SParty p` polymorphism. Each function knows its column. + +### Postgres implementation + +`setRcvQueueServices`: +```sql +UPDATE msg_queues SET rcv_service_id = ? +WHERE recipient_id IN ? AND deleted_at IS NULL +RETURNING recipient_id +``` + +`setNtfQueueServices`: +```sql +UPDATE msg_queues SET ntf_service_id = ? +WHERE recipient_id IN ? AND notifier_id IS NOT NULL AND deleted_at IS NULL +RETURNING recipient_id +``` + +After each batch query, for each queue in the returned set: +1. Read QueueRec TVar, update with new serviceId +2. Write store log entry + +### STM implementation + +Loop over queues, call existing per-item logic, collect succeeded `RecipientId`s into a Set. + +## Downstream changes in Server.hs + +### processCommand + +Gains one parameter: `Map RecipientId (Maybe Message, Maybe (Either ErrorType ()))`. + +SUB case: `M.lookup entId prepared` gives `Just (msg_, assocResult)` or `Nothing`. Pass both to `subscribeQueueAndDeliver`. + +NSUB case: `M.lookup entId prepared` gives `Just (Nothing, assocResult)` or `Nothing`. Pass `assocResult` to `subscribeNotifications`. + +Forwarded commands: pass `M.empty`. + +### subscribeQueueAndDeliver + +Takes `Maybe Message` and `Maybe (Either ErrorType ())` as before. No change in how it uses them. + +### sharedSubscribeQueue + +Takes `Maybe (Either ErrorType ())`. On paths needing association update: +- `Just (Left e)` -> return error +- `Just (Right ())` -> skip `setQueueService`, proceed with STM work +- `Nothing` -> no update needed, proceed with existing logic + +## Implementation order (top-down) + +1. Define the `prepareBatch` contract and thread one map through `processCommand` -> `subscribeQueueAndDeliver` / `subscribeNotifications` -> `sharedSubscribeQueue` (Server.hs) +2. Implement `prepareBatch` with the fold, three calls, and merge (Server.hs) +3. Add `setRcvQueueServices` and `setNtfQueueServices` to `QueueStoreClass` (Types.hs) +4. Implement for Postgres with batch `UPDATE ... RETURNING` (Postgres.hs) +5. Implement for STM as loop (STM.hs) +6. Implement for Journal as delegation (Journal.hs) + +At step 2, store functions can initially be stubs returning empty sets. Steps 3-6 fill in the real implementations. + +## Files changed + +| File | Change | +|---|---| +| `src/Simplex/Messaging/Server.hs` | `prepareBatch` with fold + merge; one map parameter through `processCommand` -> `subscribeQueueAndDeliver` / `subscribeNotifications` -> `sharedSubscribeQueue` | +| `src/Simplex/Messaging/Server/QueueStore/Types.hs` | Add `setRcvQueueServices`, `setNtfQueueServices` to `QueueStoreClass` | +| `src/Simplex/Messaging/Server/QueueStore/Postgres.hs` | Implement with batch `UPDATE ... RETURNING` + per-item TVar/log updates | +| `src/Simplex/Messaging/Server/QueueStore/STM.hs` | Implement as loop | +| `src/Simplex/Messaging/Server/MsgStore/Journal.hs` | Delegate to underlying store | diff --git a/protocol/overview-tjr.md b/protocol/overview-tjr.md index 2fa8f717e..f3198e254 100644 --- a/protocol/overview-tjr.md +++ b/protocol/overview-tjr.md @@ -225,13 +225,13 @@ For encryption primitives, threat model, and detailed security analysis, see [Se SimpleX provides these security properties: -- **End-to-end encryption** with forward secrecy via double ratchet protocol, with optional post-quantum protection. +- **End-to-end encryption** using Double Ratchet algorithm with forward secrecy and post-quantum cryptography. - **No shared identifiers** across connections — contacts cannot prove they communicate with the same user. - **Sender deniability** — neither routers nor recipients can cryptographically prove message origin. -- **Transport metadata protection** — fixed-size blocks, 2-hop onion routing, and connection isolation frustrate traffic correlation. +- **Transport metadata protection** — fixed-size blocks, 2-hop onion routing, and optional connection isolation frustrate traffic correlation. - **Out-of-band key exchange** — connection requests passed outside the network protect against MITM attacks. diff --git a/rfcs/2026-03-28-subscription-performance.md b/rfcs/2026-03-28-subscription-performance.md new file mode 100644 index 000000000..e0af42bf8 --- /dev/null +++ b/rfcs/2026-03-28-subscription-performance.md @@ -0,0 +1,90 @@ +# Subscription performance + +No protocol changes. This is an implementation RFC addressing subscription performance bottlenecks in both the SMP router and the agent. + +## Problem + +Subscribing large numbers of queues is slow. A messaging client with ~300K queues per router across 3 routers takes over 1 hour to subscribe. For comparison, the NTF server with ~1M queues per router across 12 routers took 20-30 minutes (prior to NTF client services, now in master). + +Even on fast networks (cloud VMs), a client with 1.1M active subscriptions needed ~1.5M attempts (commands sent) to fully subscribe - ~36% retry rate caused by the timeout cascade described below. + +### Root causes + +#### 1. Router: per-command processing in batches + +Batch verification and queue lookups are already done efficiently for the whole batch in `Server.hs`. But `processCommand` is called per-command in a loop - each SUB does its own individual DB query for message peek/delivery. With ~135 SUBs per batch (current SMP version), that's 135 individual DB queries per batch instead of 1 batched query. + +For 300K queues, that's ~2200 batches x 135 queries = ~300K individual DB queries on the router, which is the dominant bottleneck when using PostgreSQL storage. + +NSUB is cheaper because it just registers for notifications without message delivery - no per-queue DB query. + +#### 2. Agent: all queues read and sent at once + +`getUserServerRcvQueueSubs` reads all queues for a `(userId, server)` pair in one query with no LIMIT. For 300K queues, the entire result set is loaded into memory, then all ~2200 batches are queued to send without waiting for responses. + +The NTF server agent uses cursor-style reading with configurable batch sizes (900 subs per chunk, 90K per DB fetch) and waits for each chunk to be processed before fetching the next. + +#### 3. No backpressure on sends + +`nonBlockingWriteTBQueue` bypasses the `sndQ` bound by forking a thread when the queue is full. All batches are queued immediately, and all their response timers start simultaneously. A 30-second per-response timeout means later batches time out not because the router is slow to respond to them specifically, but because they're waiting in the router's receive queue behind thousands of earlier commands. + +This causes cascading timeouts: timed-out responses trigger `resubscribeSMPSession`, which retries all pending subs. Three consecutive timeouts can trigger connection drop via the monitor thread, causing a full reconnection and retry of everything. + +## Solution + +### Part 1: Router - batched command processing + +Move the per-command processing loop inside command handlers so that commands of the same type within a batch can be processed together. + +Current flow: +``` +receive batch -> verify all -> lookup queues all -> for each command: processCommand (individual DB query) +``` + +Proposed flow: +``` +receive batch -> verify all -> lookup queues all -> group by command type -> process group: + SUB group: one batched message peek query for all queues + NSUB group: batch registration (already cheap, but can batch DB writes) + other commands: process individually as before +``` + +For SUB, the batched processing would: +1. Collect all queue IDs from the SUB group +2. Perform a single DB query to peek messages for all queues +3. Distribute results back to individual responses + +This reduces ~135 DB queries per batch to 1, cutting router-side DB load by ~100x for subscriptions. + +Commands where batching doesn't matter (SEND, ACK, KEY, etc.) continue to be processed individually. + +### Part 2: Agent - cursor-based subscription with backpressure + +Replace the all-at-once fetch-and-send pattern with cursor-style batching, similar to what the NTF server agent does. + +Changes to `subscribeUserServer`: +1. Fetch queues in fixed-size batches (e.g., configurable, default ~1000) using LIMIT/OFFSET or cursor-based pagination. +2. Send each batch and wait for responses before sending the next. +3. Remove the use of `nonBlockingWriteTBQueue` for subscription batches - use blocking writes or structured backpressure so response timers don't start until the batch is actually sent. + +This ensures: +- Memory usage is bounded (not 300K queue records in memory at once) +- Response timeouts are meaningful (timer starts when the router receives the batch, not when it's queued locally) +- Retries are scoped to the failed batch, not all pending subs +- Works on slow/lossy networks by naturally pacing sends + +### Part 3: Response timeout for batches + +The current per-response 30-second timeout doesn't account for batch processing time. Options: + +1. **Stagger deadlines**: later responses in a batch get proportionally more time. The `rcvConcurrency` field was designed for this but is never used. +2. **Per-batch timeout**: instead of timing individual responses, timeout the entire batch with a budget proportional to batch size. +3. **No timeout for subscription responses**: since subscriptions are sent as batches with backpressure (Part 2), and the connection is monitored by pings, individual response timeouts may not be needed. A subscription that doesn't get a response will be retried on reconnect. + +## Priority and ordering + +Part 1 (router batching) gives the biggest improvement and is independent of Parts 2/3. + +Part 2 (agent cursor + backpressure) eliminates the retry cascade and is critical for slow networks. + +Part 3 (timeout handling) is a refinement that can be addressed after Parts 1 and 2. diff --git a/scripts/docker/entrypoint-smp-server b/scripts/docker/entrypoint-smp-server index eeea3582d..7b1aaac2d 100755 --- a/scripts/docker/entrypoint-smp-server +++ b/scripts/docker/entrypoint-smp-server @@ -67,14 +67,14 @@ if [ ! -f "${confd}/smp-server.ini" ]; then # Fix path to certificates if [ -n "${WEB_MANUAL}" ]; then - sed -i -e 's|^[^#]*https: |#&|' \ - -e 's|^[^#]*cert: |#&|' \ - -e 's|^[^#]*key: |#&|' \ - -e 's|^port:.*|port: 5223|' \ + sed -i -e 's|^[^#]*https = |#&|' \ + -e 's|^[^#]*cert = |#&|' \ + -e 's|^[^#]*key = |#&|' \ + -e 's|^port = .*|port = 5223|' \ "${confd}/smp-server.ini" else - sed -i -e "s|cert: /etc/opt/simplex/web.crt|cert: $cert_path/$ADDR.crt|" \ - -e "s|key: /etc/opt/simplex/web.key|key: $cert_path/$ADDR.key|" \ + sed -i -e "s|cert = /etc/opt/simplex/web.crt|cert = $cert_path/$ADDR.crt|" \ + -e "s|key = /etc/opt/simplex/web.key|key = $cert_path/$ADDR.key|" \ "${confd}/smp-server.ini" fi fi diff --git a/scripts/docker/entrypoint-xftp-server b/scripts/docker/entrypoint-xftp-server index 31d75362e..f79945b02 100755 --- a/scripts/docker/entrypoint-xftp-server +++ b/scripts/docker/entrypoint-xftp-server @@ -76,7 +76,7 @@ if [ ! -f "${confd}/file-server.ini" ]; then # Optionally, set password if [ -n "${PASS}" ]; then - sed -i -e "/^# create_password:/a create_password: $PASS" \ + sed -i -e "/^# create_password =/a create_password = $PASS" \ "${confd}/file-server.ini" fi fi diff --git a/simplexmq.cabal b/simplexmq.cabal index d1c1e03bc..aff40d472 100644 --- a/simplexmq.cabal +++ b/simplexmq.cabal @@ -1,7 +1,7 @@ cabal-version: 1.12 name: simplexmq -version: 6.5.0.10 +version: 6.5.1.0 synopsis: SimpleXMQ message broker description: This package includes <./docs/Simplex-Messaging-Server.html server>, <./docs/Simplex-Messaging-Client.html client> and @@ -51,6 +51,11 @@ extra-source-files: apps/common/Web/static/media/swiper-bundle.min.js apps/common/Web/static/media/tailwind.css apps/common/Web/static/media/testflight.png + apps/xftp-server/static/media/xftp-protocol.svg + apps/xftp-server/static/media/xftp-protocol-dark.svg + apps/xftp-server/static/xftp-web-bundle/crypto.worker.js + apps/xftp-server/static/xftp-web-bundle/index.css + apps/xftp-server/static/xftp-web-bundle/index.js flag swift description: Enable swift JSON format @@ -168,7 +173,8 @@ library Simplex.Messaging.Agent.Store.Postgres.Migrations.M20251009_queue_to_subscribe Simplex.Messaging.Agent.Store.Postgres.Migrations.M20251010_client_notices Simplex.Messaging.Agent.Store.Postgres.Migrations.M20251230_strict_tables - Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260115_service_certs + Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260410_receive_attempts + Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260411_service_certs else exposed-modules: Simplex.Messaging.Agent.Store.SQLite @@ -219,7 +225,8 @@ library Simplex.Messaging.Agent.Store.SQLite.Migrations.M20251009_queue_to_subscribe Simplex.Messaging.Agent.Store.SQLite.Migrations.M20251010_client_notices Simplex.Messaging.Agent.Store.SQLite.Migrations.M20251230_strict_tables - Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260115_service_certs + Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260410_receive_attempts + Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260411_service_certs Simplex.Messaging.Agent.Store.SQLite.Util if flag(client_postgres) || flag(server_postgres) exposed-modules: @@ -278,6 +285,9 @@ library Simplex.Messaging.Notifications.Server.Store.Migrations Simplex.Messaging.Notifications.Server.Store.Postgres Simplex.Messaging.Notifications.Server.Store.Types + Simplex.FileTransfer.Server.Store.Postgres + Simplex.FileTransfer.Server.Store.Postgres.Config + Simplex.FileTransfer.Server.Store.Postgres.Migrations Simplex.Messaging.Server.MsgStore.Postgres Simplex.Messaging.Server.QueueStore.Postgres Simplex.Messaging.Server.QueueStore.Postgres.Migrations @@ -460,7 +470,9 @@ executable xftp-server build-depends: base , bytestring + , directory , file-embed >=0.0.10 && <0.1 + , filepath , simple-logger , simplexmq default-language: Haskell2010 @@ -518,6 +530,7 @@ test-suite simplexmq-test if flag(server_postgres) other-modules: AgentTests.NotificationTests + CoreTests.XFTPStoreTests NtfClient NtfServerTests if flag(client_postgres) || flag(server_postgres) diff --git a/src/Simplex/FileTransfer/Server.hs b/src/Simplex/FileTransfer/Server.hs index 6e0a9735a..3cd19e7c1 100644 --- a/src/Simplex/FileTransfer/Server.hs +++ b/src/Simplex/FileTransfer/Server.hs @@ -31,7 +31,6 @@ import qualified Data.ByteString.Char8 as B import Data.Int (Int64) import Data.List.NonEmpty (NonEmpty) import qualified Data.List.NonEmpty as L -import qualified Data.Map.Strict as M import Data.Maybe (fromMaybe, isJust) import qualified Data.Text as T import qualified Data.Text.IO as T @@ -88,7 +87,7 @@ import UnliftIO.Concurrent (threadDelay) import UnliftIO.Directory (canonicalizePath, doesFileExist, removeFile, renameFile) import qualified UnliftIO.Exception as E -type M a = ReaderT XFTPEnv IO a +type M s a = ReaderT (XFTPEnv s) IO a data XFTPTransportRequest = XFTPTransportRequest { thParams :: THandleParamsXFTP 'TServer, @@ -112,19 +111,19 @@ corsPreflightHeaders = ("Access-Control-Max-Age", "86400") ] -runXFTPServer :: XFTPServerConfig -> IO () +runXFTPServer :: FileStoreClass s => XFTPServerConfig s -> IO () runXFTPServer cfg = do started <- newEmptyTMVarIO runXFTPServerBlocking started cfg -runXFTPServerBlocking :: TMVar Bool -> XFTPServerConfig -> IO () +runXFTPServerBlocking :: FileStoreClass s => TMVar Bool -> XFTPServerConfig s -> IO () runXFTPServerBlocking started cfg = newXFTPServerEnv cfg >>= runReaderT (xftpServer cfg started) data Handshake = HandshakeSent C.PrivateKeyX25519 | HandshakeAccepted (THandleParams XFTPVersion 'TServer) -xftpServer :: XFTPServerConfig -> TMVar Bool -> M () +xftpServer :: forall s. FileStoreClass s => XFTPServerConfig s -> TMVar Bool -> M s () xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpiration, fileExpiration, xftpServerVRange} started = do mapM_ (expireServerFiles Nothing) fileExpiration restoreServerStats @@ -137,7 +136,7 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira ) `finally` stopServer where - runServer :: M () + runServer :: M s () runServer = do srvCreds@(chain, pk) <- asks tlsServerCreds httpCreds_ <- asks httpServerCreds @@ -168,7 +167,7 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira Nothing -> pure () Just thParams -> processRequest req0 {thParams} | otherwise -> liftIO . sendResponse $ H.responseNoBody N.ok200 (corsHeaders addCORS') - xftpServerHandshakeV1 :: X.CertificateChain -> C.APrivateSignKey -> TMap SessionId Handshake -> XFTPTransportRequest -> M (Maybe (THandleParams XFTPVersion 'TServer)) + xftpServerHandshakeV1 :: X.CertificateChain -> C.APrivateSignKey -> TMap SessionId Handshake -> XFTPTransportRequest -> M s (Maybe (THandleParams XFTPVersion 'TServer)) xftpServerHandshakeV1 chain serverSignKey sessions XFTPTransportRequest {thParams = thParams0@THandleParams {sessionId}, request, reqBody = HTTP2Body {bodyHead}, sendResponse, sniUsed, addCORS} = do s <- atomically $ TM.lookup sessionId sessions r <- runExceptT $ case s of @@ -227,39 +226,40 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira liftIO . sendResponse $ H.responseNoBody N.ok200 (corsHeaders addCORS) pure Nothing Nothing -> throwE HANDSHAKE - sendError :: XFTPErrorType -> M (Maybe (THandleParams XFTPVersion 'TServer)) + sendError :: XFTPErrorType -> M s (Maybe (THandleParams XFTPVersion 'TServer)) sendError err = do runExceptT (encodeXftp err) >>= \case Right bs -> liftIO . sendResponse $ H.responseBuilder N.ok200 (corsHeaders addCORS) bs Left _ -> logError $ "Error encoding handshake error: " <> tshow err pure Nothing - encodeXftp :: Encoding a => a -> ExceptT XFTPErrorType (ReaderT XFTPEnv IO) Builder + encodeXftp :: Encoding a => a -> ExceptT XFTPErrorType (ReaderT (XFTPEnv s) IO) Builder encodeXftp a = byteString <$> liftHS (C.pad (smpEncode a) xftpBlockSize) liftHS = liftEitherWith (const HANDSHAKE) - stopServer :: M () + stopServer :: M s () stopServer = do - withFileLog closeStoreLog + st <- asks fileStore + liftIO $ closeFileStore st saveServerStats logNote "Server stopped" - expireFilesThread_ :: XFTPServerConfig -> [M ()] + expireFilesThread_ :: XFTPServerConfig s -> [M s ()] expireFilesThread_ XFTPServerConfig {fileExpiration = Just fileExp} = [expireFiles fileExp] expireFilesThread_ _ = [] - expireFiles :: ExpirationConfig -> M () + expireFiles :: ExpirationConfig -> M s () expireFiles expCfg = do let interval = checkInterval expCfg * 1000000 forever $ do liftIO $ threadDelay' interval expireServerFiles (Just 100000) expCfg - serverStatsThread_ :: XFTPServerConfig -> [M ()] + serverStatsThread_ :: XFTPServerConfig s -> [M s ()] serverStatsThread_ XFTPServerConfig {logStatsInterval = Just interval, logStatsStartTime, serverStatsLogFile} = [logServerStats logStatsStartTime interval serverStatsLogFile] serverStatsThread_ _ = [] - logServerStats :: Int64 -> Int64 -> FilePath -> M () + logServerStats :: Int64 -> Int64 -> FilePath -> M s () logServerStats startAt logInterval statsFilePath = do initialDelay <- (startAt -) . fromIntegral . (`div` 1000000_000000) . diffTimeToPicoseconds . utctDayTime <$> liftIO getCurrentTime liftIO $ putStrLn $ "server stats log enabled: " <> statsFilePath @@ -300,12 +300,12 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira ] liftIO $ threadDelay' interval - prometheusMetricsThread_ :: XFTPServerConfig -> [M ()] + prometheusMetricsThread_ :: XFTPServerConfig s -> [M s ()] prometheusMetricsThread_ XFTPServerConfig {prometheusInterval = Just interval, prometheusMetricsFile} = [savePrometheusMetrics interval prometheusMetricsFile] prometheusMetricsThread_ _ = [] - savePrometheusMetrics :: Int -> FilePath -> M () + savePrometheusMetrics :: Int -> FilePath -> M s () savePrometheusMetrics saveInterval metricsFile = do labelMyThread "savePrometheusMetrics" liftIO $ putStrLn $ "Prometheus metrics saved every " <> show saveInterval <> " seconds to " <> metricsFile @@ -324,11 +324,11 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira let fd = periodStatDataCounts $ _filesDownloaded d pure FileServerMetrics {statsData = d, filesDownloadedPeriods = fd, rtsOptions} - controlPortThread_ :: XFTPServerConfig -> [M ()] + controlPortThread_ :: XFTPServerConfig s -> [M s ()] controlPortThread_ XFTPServerConfig {controlPort = Just port} = [runCPServer port] controlPortThread_ _ = [] - runCPServer :: ServiceName -> M () + runCPServer :: ServiceName -> M s () runCPServer port = do cpStarted <- newEmptyTMVarIO u <- askUnliftIO @@ -336,7 +336,7 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira labelMyThread "control port server" runLocalTCPServer cpStarted port $ runCPClient u where - runCPClient :: UnliftIO (ReaderT XFTPEnv IO) -> Socket -> IO () + runCPClient :: UnliftIO (ReaderT (XFTPEnv s) IO) -> Socket -> IO () runCPClient u sock = do labelMyThread "control port client" h <- socketToHandle sock ReadWriteMode @@ -366,15 +366,15 @@ xftpServer cfg@XFTPServerConfig {xftpPort, transportConfig, inactiveClientExpira XFTPServerConfig {controlPortUserAuth = user, controlPortAdminAuth = admin} = cfg CPStatsRTS -> E.tryAny getRTSStats >>= either (hPrint h) (hPrint h) CPDelete fileId -> withUserRole $ unliftIO u $ do - fs <- asks store + fs <- asks fileStore r <- runExceptT $ do - (fr, _) <- ExceptT $ atomically $ getFile fs SFRecipient fileId + (fr, _) <- ExceptT $ liftIO $ getFile fs SFRecipient fileId ExceptT $ deleteServerFile_ fr liftIO . hPutStrLn h $ either (\e -> "error: " <> show e) (\() -> "ok") r CPBlock fileId info -> withUserRole $ unliftIO u $ do - fs <- asks store + fs <- asks fileStore r <- runExceptT $ do - (fr, _) <- ExceptT $ atomically $ getFile fs SFRecipient fileId + (fr, _) <- ExceptT $ liftIO $ getFile fs SFRecipient fileId ExceptT $ blockServerFile fr info liftIO . hPutStrLn h $ either (\e -> "error: " <> show e) (\() -> "ok") r CPHelp -> hPutStrLn h "commands: stats-rts, delete, help, quit" @@ -395,7 +395,7 @@ data ServerFile = ServerFile sbState :: LC.SbState } -processRequest :: XFTPTransportRequest -> M () +processRequest :: FileStoreClass s => XFTPTransportRequest -> M s () processRequest XFTPTransportRequest {thParams, reqBody = body@HTTP2Body {bodyHead}, sendResponse, addCORS} | B.length bodyHead /= xftpBlockSize = sendXFTPResponse ("", NoEntity, FRErr BLOCK) Nothing | otherwise = @@ -430,7 +430,7 @@ processRequest XFTPTransportRequest {thParams, reqBody = body@HTTP2Body {bodyHea done #ifdef slow_servers -randomDelay :: M () +randomDelay :: M s () randomDelay = do d <- asks $ responseDelay . config when (d > 0) $ do @@ -440,20 +440,20 @@ randomDelay = do data VerificationResult = VRVerified XFTPRequest | VRFailed XFTPErrorType -verifyXFTPTransmission :: Maybe (THandleAuth 'TServer) -> SignedTransmission FileCmd -> M VerificationResult +verifyXFTPTransmission :: forall s. FileStoreClass s => Maybe (THandleAuth 'TServer) -> SignedTransmission FileCmd -> M s VerificationResult verifyXFTPTransmission thAuth (tAuth, authorized, (corrId, fId, cmd)) = case cmd of FileCmd SFSender (FNEW file rcps auth') -> pure $ XFTPReqNew file rcps auth' `verifyWith` sndKey file FileCmd SFRecipient PING -> pure $ VRVerified XFTPReqPing FileCmd party _ -> verifyCmd party where - verifyCmd :: SFileParty p -> M VerificationResult + verifyCmd :: SFileParty p -> M s VerificationResult verifyCmd party = do - st <- asks store - atomically $ verify =<< getFile st party fId + st <- asks fileStore + liftIO $ verify =<< getFile st party fId where verify = \case - Right (fr, k) -> result <$> readTVar (fileStatus fr) + Right (fr, k) -> result <$> readTVarIO (fileStatus fr) where result = \case EntityActive -> XFTPReqCmd fId fr cmd `verifyWith` k @@ -464,7 +464,7 @@ verifyXFTPTransmission thAuth (tAuth, authorized, (corrId, fId, cmd)) = -- TODO verify with DH authorization req `verifyWith` k = if verifyCmdAuthorization thAuth tAuth authorized corrId k then VRVerified req else VRFailed AUTH -processXFTPRequest :: HTTP2Body -> XFTPRequest -> M (FileResponse, Maybe ServerFile) +processXFTPRequest :: forall s. FileStoreClass s => HTTP2Body -> XFTPRequest -> M s (FileResponse, Maybe ServerFile) processXFTPRequest HTTP2Body {bodyPart} = \case XFTPReqNew file rks auth -> noFile =<< ifM allowNew (createFile file rks) (pure $ FRErr AUTH) where @@ -483,9 +483,9 @@ processXFTPRequest HTTP2Body {bodyPart} = \case XFTPReqPing -> noFile FRPong where noFile resp = pure (resp, Nothing) - createFile :: FileInfo -> NonEmpty RcvPublicAuthKey -> M FileResponse + createFile :: FileInfo -> NonEmpty RcvPublicAuthKey -> M s FileResponse createFile file rks = do - st <- asks store + st <- asks fileStore r <- runExceptT $ do sizes <- asks $ allowedChunkSizes . config unless (size file `elem` sizes) $ throwE SIZE @@ -502,27 +502,27 @@ processXFTPRequest HTTP2Body {bodyPart} = \case let rIds = L.map (\(FileRecipient rId _) -> rId) rcps pure $ FRSndIds sId rIds pure $ either FRErr id r - addFileRetry :: FileStore -> FileInfo -> Int -> RoundedFileTime -> M (Either XFTPErrorType XFTPFileId) + addFileRetry :: s -> FileInfo -> Int -> RoundedFileTime -> M s (Either XFTPErrorType XFTPFileId) addFileRetry st file n ts = retryAdd n $ \sId -> runExceptT $ do ExceptT $ addFile st sId file ts EntityActive pure sId - addRecipientRetry :: FileStore -> Int -> XFTPFileId -> RcvPublicAuthKey -> M (Either XFTPErrorType FileRecipient) + addRecipientRetry :: s -> Int -> XFTPFileId -> RcvPublicAuthKey -> M s (Either XFTPErrorType FileRecipient) addRecipientRetry st n sId rpk = retryAdd n $ \rId -> runExceptT $ do let rcp = FileRecipient rId rpk ExceptT $ addRecipient st sId rcp pure rcp - retryAdd :: Int -> (XFTPFileId -> STM (Either XFTPErrorType a)) -> M (Either XFTPErrorType a) + retryAdd :: Int -> (XFTPFileId -> IO (Either XFTPErrorType a)) -> M s (Either XFTPErrorType a) retryAdd 0 _ = pure $ Left INTERNAL retryAdd n add = do fId <- getFileId - atomically (add fId) >>= \case + liftIO (add fId) >>= \case Left DUPLICATE_ -> retryAdd (n - 1) add r -> pure r - addRecipients :: XFTPFileId -> NonEmpty RcvPublicAuthKey -> M FileResponse + addRecipients :: XFTPFileId -> NonEmpty RcvPublicAuthKey -> M s FileResponse addRecipients sId rks = do - st <- asks store + st <- asks fileStore r <- runExceptT $ do rcps <- mapM (ExceptT . addRecipientRetry st 3 sId) rks lift $ withFileLog $ \sl -> logAddRecipients sl sId rcps @@ -531,7 +531,7 @@ processXFTPRequest HTTP2Body {bodyPart} = \case let rIds = L.map (\(FileRecipient rId _) -> rId) rcps pure $ FRRcvIds rIds pure $ either FRErr id r - receiveServerFile :: FileRec -> M FileResponse + receiveServerFile :: FileRec -> M s FileResponse receiveServerFile FileRec {senderId, fileInfo = FileInfo {size, digest}, filePath} = case bodyPart of Nothing -> pure $ FRErr SIZE -- TODO validate body size from request before downloading, once it's populated @@ -549,7 +549,7 @@ processXFTPRequest HTTP2Body {bodyPart} = \case | bs == 0 || bs > s -> pure $ FRErr SIZE | otherwise -> drain (s - bs) reserve = do - us <- asks $ usedStorage . store + us <- asks usedStorage quota <- asks $ fromMaybe maxBound . fileSizeQuota . config atomically . stateTVar us $ \used -> let used' = used + fromIntegral size in if used' <= quota then (True, used') else (False, used) @@ -559,21 +559,28 @@ processXFTPRequest HTTP2Body {bodyPart} = \case receiveChunk (XFTPRcvChunkSpec fPath size digest) >>= \case Right () -> do stats <- asks serverStats - withFileLog $ \sl -> logPutFile sl senderId fPath - atomically $ writeTVar filePath (Just fPath) - incFileStat filesUploaded - incFileStat filesCount - liftIO $ atomicModifyIORef'_ (filesSize stats) (+ fromIntegral size) - pure FROk + st <- asks fileStore + liftIO (setFilePath st senderId fPath) >>= \case + Right () -> do + withFileLog $ \sl -> logPutFile sl senderId fPath + incFileStat filesUploaded + incFileStat filesCount + liftIO $ atomicModifyIORef'_ (filesSize stats) (+ fromIntegral size) + pure FROk + Left _e -> do + us <- asks usedStorage + atomically $ modifyTVar' us $ subtract (fromIntegral size) + liftIO $ whenM (doesFileExist fPath) (removeFile fPath) `catch` logFileError + pure $ FRErr AUTH Left e -> do - us <- asks $ usedStorage . store + us <- asks usedStorage atomically $ modifyTVar' us $ subtract (fromIntegral size) liftIO $ whenM (doesFileExist fPath) (removeFile fPath) `catch` logFileError pure $ FRErr e receiveChunk spec = do t <- asks $ fileTimeout . config liftIO $ fromMaybe (Left TIMEOUT) <$> timeout t (runExceptT $ receiveFile getBody spec) - sendServerFile :: FileRec -> RcvPublicDhKey -> M (FileResponse, Maybe ServerFile) + sendServerFile :: FileRec -> RcvPublicDhKey -> M s (FileResponse, Maybe ServerFile) sendServerFile FileRec {senderId, filePath, fileInfo = FileInfo {size}} rDhKey = do readTVarIO filePath >>= \case Just path -> ifM (doesFileExist path) sendFile (pure (FRErr AUTH, Nothing)) @@ -592,38 +599,41 @@ processXFTPRequest HTTP2Body {bodyPart} = \case _ -> pure (FRErr INTERNAL, Nothing) _ -> pure (FRErr NO_FILE, Nothing) - deleteServerFile :: FileRec -> M FileResponse + deleteServerFile :: FileRec -> M s FileResponse deleteServerFile fr = either FRErr (\() -> FROk) <$> deleteServerFile_ fr logFileError :: SomeException -> IO () logFileError e = logError $ "Error deleting file: " <> tshow e - ackFileReception :: RecipientId -> FileRec -> M FileResponse + ackFileReception :: RecipientId -> FileRec -> M s FileResponse ackFileReception rId fr = do withFileLog (`logAckFile` rId) - st <- asks store - atomically $ deleteRecipient st rId fr + st <- asks fileStore + liftIO $ deleteRecipient st rId fr incFileStat fileDownloadAcks pure FROk -deleteServerFile_ :: FileRec -> M (Either XFTPErrorType ()) +deleteServerFile_ :: FileStoreClass s => FileRec -> M s (Either XFTPErrorType ()) deleteServerFile_ fr@FileRec {senderId} = do withFileLog (`logDeleteFile` senderId) deleteOrBlockServerFile_ fr filesDeleted (`deleteFile` senderId) -- this also deletes the file from storage, but doesn't include it in delete statistics -blockServerFile :: FileRec -> BlockingInfo -> M (Either XFTPErrorType ()) +blockServerFile :: FileStoreClass s => FileRec -> BlockingInfo -> M s (Either XFTPErrorType ()) blockServerFile fr@FileRec {senderId} info = do withFileLog $ \sl -> logBlockFile sl senderId info deleteOrBlockServerFile_ fr filesBlocked $ \st -> blockFile st senderId info True -deleteOrBlockServerFile_ :: FileRec -> (FileServerStats -> IORef Int) -> (FileStore -> STM (Either XFTPErrorType ())) -> M (Either XFTPErrorType ()) +deleteOrBlockServerFile_ :: FileStoreClass s => FileRec -> (FileServerStats -> IORef Int) -> (s -> IO (Either XFTPErrorType ())) -> M s (Either XFTPErrorType ()) deleteOrBlockServerFile_ FileRec {filePath, fileInfo} stat storeAction = runExceptT $ do path <- readTVarIO filePath stats <- asks serverStats ExceptT $ first (\(_ :: SomeException) -> FILE_IO) <$> try (forM_ path $ \p -> whenM (doesFileExist p) (removeFile p >> deletedStats stats)) - st <- asks store - void $ atomically $ storeAction st + st <- asks fileStore + ExceptT $ liftIO $ storeAction st + forM_ path $ \_ -> do + us <- asks usedStorage + atomically $ modifyTVar' us $ subtract (fromIntegral $ size fileInfo) lift $ incFileStat stat where deletedStats stats = do @@ -633,47 +643,50 @@ deleteOrBlockServerFile_ FileRec {filePath, fileInfo} stat storeAction = runExce getFileTime :: IO RoundedFileTime getFileTime = getRoundedSystemTime -expireServerFiles :: Maybe Int -> ExpirationConfig -> M () +expireServerFiles :: FileStoreClass s => Maybe Int -> ExpirationConfig -> M s () expireServerFiles itemDelay expCfg = do - st <- asks store - usedStart <- readTVarIO $ usedStorage st + st <- asks fileStore + us <- asks usedStorage + usedStart <- readTVarIO us old <- liftIO $ expireBeforeEpoch expCfg - files' <- readTVarIO (files st) - logNote $ "Expiration check: " <> tshow (M.size files') <> " files" - forM_ (M.keys files') $ \sId -> do - mapM_ threadDelay itemDelay - atomically (expiredFilePath st sId old) - >>= mapM_ (maybeRemove $ delete st sId) - usedEnd <- readTVarIO $ usedStorage st + filesCount <- liftIO $ getFileCount st + logNote $ "Expiration check: " <> tshow filesCount <> " files" + expireLoop st us old + usedEnd <- readTVarIO us logNote $ "Used " <> mbs usedStart <> " -> " <> mbs usedEnd <> ", " <> mbs (usedStart - usedEnd) <> " reclaimed." where mbs bs = tshow (bs `div` 1048576) <> "mb" - maybeRemove del = maybe del (remove del) - remove del filePath = - ifM - (doesFileExist filePath) - ((removeFile filePath >> del) `catch` \(e :: SomeException) -> logError $ "failed to remove expired file " <> tshow filePath <> ": " <> tshow e) - del - delete st sId = do - withFileLog (`logDeleteFile` sId) - void . atomically $ deleteFile st sId -- will not update usedStorage if sId isn't in store - incFileStat filesExpired + expireLoop st us old = do + expired <- liftIO $ expiredFiles st old 10000 + forM_ expired $ \(sId, filePath_, fileSize) -> do + mapM_ threadDelay itemDelay + forM_ filePath_ $ \fp -> + whenM (doesFileExist fp) $ + removeFile fp `catch` \(e :: SomeException) -> logError $ "failed to remove expired file " <> tshow fp <> ": " <> tshow e + forM_ filePath_ $ \_ -> + atomically $ modifyTVar' us $ subtract (fromIntegral fileSize) + incFileStat filesExpired + let sIds = map (\(sId, _, _) -> sId) expired + unless (null sIds) $ do + withFileLog $ \sl -> mapM_ (logDeleteFile sl) sIds + liftIO $ deleteFiles st sIds + expireLoop st us old -randomId :: Int -> M ByteString +randomId :: Int -> M s ByteString randomId n = atomically . C.randomBytes n =<< asks random -getFileId :: M XFTPFileId +getFileId :: M s XFTPFileId getFileId = fmap EntityId . randomId =<< asks (fileIdSize . config) -withFileLog :: (StoreLog 'WriteMode -> IO a) -> M () +withFileLog :: (StoreLog 'WriteMode -> IO a) -> M s () withFileLog action = liftIO . mapM_ action =<< asks storeLog -incFileStat :: (FileServerStats -> IORef Int) -> M () +incFileStat :: (FileServerStats -> IORef Int) -> M s () incFileStat statSel = do stats <- asks serverStats liftIO $ atomicModifyIORef'_ (statSel stats) (+ 1) -saveServerStats :: M () +saveServerStats :: M s () saveServerStats = asks (serverStatsBackupFile . config) >>= mapM_ (\f -> asks serverStats >>= liftIO . getFileServerStatsData >>= liftIO . saveStats f) @@ -683,7 +696,7 @@ saveServerStats = B.writeFile f $ strEncode stats logNote "server stats saved" -restoreServerStats :: M () +restoreServerStats :: FileStoreClass s => M s () restoreServerStats = asks (serverStatsBackupFile . config) >>= mapM_ restoreStats where restoreStats f = whenM (doesFileExist f) $ do @@ -691,9 +704,9 @@ restoreServerStats = asks (serverStatsBackupFile . config) >>= mapM_ restoreStat liftIO (strDecode <$> B.readFile f) >>= \case Right d@FileServerStatsData {_filesCount = statsFilesCount, _filesSize = statsFilesSize} -> do s <- asks serverStats - FileStore {files, usedStorage} <- asks store - _filesCount <- M.size <$> readTVarIO files - _filesSize <- readTVarIO usedStorage + st <- asks fileStore + _filesCount <- liftIO $ getFileCount st + _filesSize <- readTVarIO =<< asks usedStorage liftIO $ setFileServerStats s d {_filesCount, _filesSize} renameFile f $ f <> ".bak" logNote "server stats restored" diff --git a/src/Simplex/FileTransfer/Server/Env.hs b/src/Simplex/FileTransfer/Server/Env.hs index d4c58df66..b816eb36b 100644 --- a/src/Simplex/FileTransfer/Server/Env.hs +++ b/src/Simplex/FileTransfer/Server/Env.hs @@ -1,21 +1,35 @@ +{-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DuplicateRecordFields #-} +{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE KindSignatures #-} +{-# LANGUAGE RankNTypes #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE StrictData #-} +{-# LANGUAGE TypeFamilies #-} module Simplex.FileTransfer.Server.Env ( XFTPServerConfig (..), + XFTPStoreConfig (..), XFTPEnv (..), XFTPRequest (..), + XFTPStoreType, + FileStore (..), + AFStoreType (..), + fileStore, + fromFileStore, defaultInactiveClientExpiration, defFileExpirationHours, defaultFileExpiration, newXFTPServerEnv, - countUsedStorage, + readFileStoreType, + runWithStoreConfig, + checkFileStoreMode, + importToDatabase, + exportFromDatabase, ) where import Control.Logger.Simple @@ -23,7 +37,6 @@ import Control.Monad import Crypto.Random import Data.Int (Int64) import Data.List.NonEmpty (NonEmpty) -import qualified Data.Map.Strict as M import Data.Time.Clock (getCurrentTime) import Data.Word (Word32) import Data.X509.Validation (Fingerprint (..)) @@ -31,7 +44,21 @@ import Network.Socket import qualified Network.TLS as T import Simplex.FileTransfer.Protocol (FileCmd, FileInfo (..), XFTPFileId) import Simplex.FileTransfer.Server.Stats +import Data.Either (fromRight) +import Data.Ini (Ini, lookupValue) +import qualified Data.Text as T import Simplex.FileTransfer.Server.Store +import Simplex.Messaging.Agent.Store.Shared (MigrationConfirmation) +import Data.Functor (($>)) +import Simplex.Messaging.Server.CLI (settingIsOn) +import System.Exit (exitFailure) +#if defined(dbServerPostgres) +import Data.Maybe (isNothing) +import Simplex.FileTransfer.Server.Store.Postgres (PostgresFileStore, importFileStore, exportFileStore) +import Simplex.FileTransfer.Server.Store.Postgres.Config (PostgresFileStoreCfg (..), defaultXFTPDBOpts) +import Simplex.Messaging.Server.CLI (iniDBOptions) +import System.Directory (doesFileExist) +#endif import Simplex.FileTransfer.Server.StoreLog import Simplex.FileTransfer.Transport (VersionRangeXFTP) import qualified Simplex.Messaging.Crypto as C @@ -42,10 +69,11 @@ import Simplex.Messaging.Util (tshow) import System.IO (IOMode (..)) import UnliftIO.STM -data XFTPServerConfig = XFTPServerConfig +data XFTPServerConfig s = XFTPServerConfig { xftpPort :: ServiceName, controlPort :: Maybe ServiceName, fileIdSize :: Int, + serverStoreCfg :: XFTPStoreConfig s, storeLogFile :: Maybe FilePath, filesPath :: FilePath, -- | server storage quota @@ -88,9 +116,10 @@ defaultInactiveClientExpiration = checkInterval = 3600 -- seconds, 1 hours } -data XFTPEnv = XFTPEnv - { config :: XFTPServerConfig, - store :: FileStore, +data XFTPEnv s = XFTPEnv + { config :: XFTPServerConfig s, + store :: FileStore s, + usedStorage :: TVar Int64, storeLog :: Maybe (StoreLog 'WriteMode), random :: TVar ChaChaDRG, serverIdentity :: C.KeyHash, @@ -99,6 +128,38 @@ data XFTPEnv = XFTPEnv serverStats :: FileServerStats } +fileStore :: XFTPEnv s -> s +fileStore = fromFileStore . store +{-# INLINE fileStore #-} + +data XFTPStoreConfig s where + XSCMemory :: Maybe FilePath -> XFTPStoreConfig STMFileStore +#if defined(dbServerPostgres) + XSCDatabase :: PostgresFileStoreCfg -> XFTPStoreConfig PostgresFileStore +#endif + +type family XFTPStoreType (fs :: FSType) where + XFTPStoreType 'FSMemory = STMFileStore +#if defined(dbServerPostgres) + XFTPStoreType 'FSPostgres = PostgresFileStore +#endif + +data FileStore s where + StoreMemory :: STMFileStore -> FileStore STMFileStore +#if defined(dbServerPostgres) + StoreDatabase :: PostgresFileStore -> FileStore PostgresFileStore +#endif + +data AFStoreType = forall fs. AFSType (SFSType fs) + +fromFileStore :: FileStore s -> s +fromFileStore = \case + StoreMemory s -> s +#if defined(dbServerPostgres) + StoreDatabase s -> s +#endif +{-# INLINE fromFileStore #-} + defFileExpirationHours :: Int64 defFileExpirationHours = 48 @@ -109,13 +170,22 @@ defaultFileExpiration = checkInterval = 2 * 3600 -- seconds, 2 hours } -newXFTPServerEnv :: XFTPServerConfig -> IO XFTPEnv -newXFTPServerEnv config@XFTPServerConfig {storeLogFile, fileSizeQuota, xftpCredentials, httpCredentials} = do +newXFTPServerEnv :: FileStoreClass s => XFTPServerConfig s -> IO (XFTPEnv s) +newXFTPServerEnv config@XFTPServerConfig {serverStoreCfg, fileSizeQuota, xftpCredentials, httpCredentials} = do random <- C.newRandom - store <- newFileStore - storeLog <- mapM (`readWriteFileStore` store) storeLogFile - used <- countUsedStorage <$> readTVarIO (files store) - atomically $ writeTVar (usedStorage store) used + (store, storeLog) <- case serverStoreCfg of + XSCMemory storeLogPath -> do + st <- newFileStore () + sl <- mapM (`readWriteFileStore` st) storeLogPath + atomically $ writeTVar (stmStoreLog st) sl + pure (StoreMemory st, sl) +#if defined(dbServerPostgres) + XSCDatabase dbCfg -> do + st <- newFileStore dbCfg + pure (StoreDatabase st, Nothing) +#endif + used <- getUsedStorage (fromFileStore store) + usedStorage <- newTVarIO used forM_ fileSizeQuota $ \quota -> do logNote $ "Total / available storage: " <> tshow quota <> " / " <> tshow (quota - used) when (quota < used) $ logWarn "WARNING: storage quota is less than used storage, no files can be uploaded!" @@ -123,12 +193,76 @@ newXFTPServerEnv config@XFTPServerConfig {storeLogFile, fileSizeQuota, xftpCrede httpServerCreds <- mapM loadServerCredential httpCredentials Fingerprint fp <- loadFingerprint xftpCredentials serverStats <- newFileServerStats =<< getCurrentTime - pure XFTPEnv {config, store, storeLog, random, tlsServerCreds, httpServerCreds, serverIdentity = C.KeyHash fp, serverStats} - -countUsedStorage :: M.Map k FileRec -> Int64 -countUsedStorage = M.foldl' (\acc FileRec {fileInfo = FileInfo {size}} -> acc + fromIntegral size) 0 + pure XFTPEnv {config, store, usedStorage, storeLog, random, tlsServerCreds, httpServerCreds, serverIdentity = C.KeyHash fp, serverStats} data XFTPRequest = XFTPReqNew FileInfo (NonEmpty RcvPublicAuthKey) (Maybe BasicAuth) | XFTPReqCmd XFTPFileId FileRec FileCmd | XFTPReqPing + +readFileStoreType :: Ini -> Either String AFStoreType +readFileStoreType ini = case fromRight "memory" $ T.unpack <$> lookupValue "STORE_LOG" "store_files" ini of + "memory" -> Right $ AFSType SFSMemory + "database" -> Right $ AFSType SFSPostgres + other -> Left $ "Invalid store_files value: " <> other + +-- | Dispatch store config from AFStoreType singleton and run the callback. +-- CPP guards for Postgres are handled here so Main.hs stays CPP-free. +runWithStoreConfig :: + AFStoreType -> + Ini -> + FilePath -> + MigrationConfirmation -> + (forall s. FileStoreClass s => XFTPStoreConfig s -> IO ()) -> + IO () +runWithStoreConfig (AFSType SFSMemory) ini storeLogFilePath _confirmMigrations run = + run $ XSCMemory (enableStoreLog' $> storeLogFilePath) + where + enableStoreLog' = settingIsOn "STORE_LOG" "enable" ini +runWithStoreConfig (AFSType SFSPostgres) ini storeLogFilePath confirmMigrations run = +#if defined(dbServerPostgres) + run $ XSCDatabase dbCfg + where + enableDbStoreLog' = settingIsOn "STORE_LOG" "db_store_log" ini + dbStoreLogPath = enableDbStoreLog' $> storeLogFilePath + dbCfg = PostgresFileStoreCfg {dbOpts = iniDBOptions ini defaultXFTPDBOpts, dbStoreLogPath, confirmMigrations} +#else + error "server binary is compiled without support for PostgreSQL database" +#endif + +-- | Validate startup config when store_files=database. +checkFileStoreMode :: Ini -> AFStoreType -> FilePath -> IO () +checkFileStoreMode ini (AFSType SFSPostgres) storeLogFilePath = do +#if defined(dbServerPostgres) + storeLogExists <- doesFileExist storeLogFilePath + let dbStoreLogOn = settingIsOn "STORE_LOG" "db_store_log" ini + when (storeLogExists && isNothing dbStoreLogOn) $ do + putStrLn $ "Error: store log file " <> storeLogFilePath <> " exists but store_files is `database`." + putStrLn "Use `file-server database import` to migrate, or set `db_store_log: on`." + exitFailure +#else + putStrLn "Error: server binary is compiled without support for PostgreSQL database." + putStrLn "Please re-compile with `cabal build -fserver_postgres`." + exitFailure +#endif +checkFileStoreMode _ (AFSType SFSMemory) _ = pure () + +-- | Import StoreLog to PostgreSQL database. +importToDatabase :: FilePath -> Ini -> MigrationConfirmation -> IO () +#if defined(dbServerPostgres) +importToDatabase storeLogFilePath ini _confirmMigrations = do + let dbCfg = PostgresFileStoreCfg {dbOpts = iniDBOptions ini defaultXFTPDBOpts, dbStoreLogPath = Nothing, confirmMigrations = _confirmMigrations} + importFileStore storeLogFilePath dbCfg +#else +importToDatabase _ _ _ = error "Error: server binary is compiled without support for PostgreSQL database.\nPlease re-compile with `cabal build -fserver_postgres`." +#endif + +-- | Export PostgreSQL database to StoreLog. +exportFromDatabase :: FilePath -> Ini -> MigrationConfirmation -> IO () +#if defined(dbServerPostgres) +exportFromDatabase storeLogFilePath ini _confirmMigrations = do + let dbCfg = PostgresFileStoreCfg {dbOpts = iniDBOptions ini defaultXFTPDBOpts, dbStoreLogPath = Nothing, confirmMigrations = _confirmMigrations} + exportFileStore storeLogFilePath dbCfg +#else +exportFromDatabase _ _ _ = error "Error: server binary is compiled without support for PostgreSQL database.\nPlease re-compile with `cabal build -fserver_postgres`." +#endif diff --git a/src/Simplex/FileTransfer/Server/Main.hs b/src/Simplex/FileTransfer/Server/Main.hs index 101fe945b..070dc546f 100644 --- a/src/Simplex/FileTransfer/Server/Main.hs +++ b/src/Simplex/FileTransfer/Server/Main.hs @@ -5,6 +5,7 @@ {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeApplications #-} module Simplex.FileTransfer.Server.Main @@ -12,7 +13,7 @@ module Simplex.FileTransfer.Server.Main xftpServerCLI_, ) where -import Control.Monad (when) +import Control.Monad (unless, when) import Data.Either (fromRight) import Data.Functor (($>)) import Data.Ini (lookupValue, readIniFile) @@ -28,11 +29,12 @@ import Options.Applicative import Simplex.FileTransfer.Chunks import Simplex.FileTransfer.Description (FileSize (..)) import Simplex.FileTransfer.Server (runXFTPServer) -import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..), defFileExpirationHours, defaultFileExpiration, defaultInactiveClientExpiration) +import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..), XFTPStoreConfig, AFStoreType (..), defFileExpirationHours, defaultFileExpiration, defaultInactiveClientExpiration, readFileStoreType, runWithStoreConfig, checkFileStoreMode, importToDatabase, exportFromDatabase) import Simplex.FileTransfer.Transport (alpnSupportedXFTPhandshakes, supportedFileServerVRange) import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Encoding.String import Simplex.Messaging.Protocol (ProtoServerWithAuth (..), pattern XFTPServer) +import Simplex.Messaging.Agent.Store.Shared (MigrationConfirmation (..)) import Simplex.Messaging.Server.CLI import Simplex.Messaging.Server.Expiration import Simplex.Messaging.Server.Information (ServerPublicInfo (..)) @@ -51,7 +53,7 @@ xftpServerCLI :: FilePath -> FilePath -> IO () xftpServerCLI = xftpServerCLI_ (\_ _ _ _ -> pure ()) (\_ -> pure ()) xftpServerCLI_ :: - (XFTPServerConfig -> Maybe ServerPublicInfo -> Maybe TransportHost -> FilePath -> IO ()) -> + (forall s. XFTPServerConfig s -> Maybe ServerPublicInfo -> Maybe TransportHost -> FilePath -> IO ()) -> (EmbeddedWebParams -> IO ()) -> FilePath -> FilePath -> @@ -66,9 +68,13 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do doesFileExist iniFile >>= \case True -> genOnline cfgPath certOpts _ -> exitError $ "Error: server is not initialized (" <> iniFile <> " does not exist).\nRun `" <> executableName <> " init`." - Start -> + Start opts -> doesFileExist iniFile >>= \case - True -> readIniFile iniFile >>= either exitError runServer + True -> readIniFile iniFile >>= either exitError (runServer opts) + _ -> exitError $ "Error: server is not initialized (" <> iniFile <> " does not exist).\nRun `" <> executableName <> " init`." + Database cmd -> + doesFileExist iniFile >>= \case + True -> readIniFile iniFile >>= either exitError (runDatabaseCmd cmd) _ -> exitError $ "Error: server is not initialized (" <> iniFile <> " does not exist).\nRun `" <> executableName <> " init`." Delete -> do confirmOrExit @@ -84,6 +90,21 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do executableName = "file-server" storeLogFilePath = combine logPath "file-server-store.log" defaultStaticPath = combine logPath "www" + runDatabaseCmd cmd ini = case cmd of + SCImport -> do + storeLogExists <- doesFileExist storeLogFilePath + unless storeLogExists $ exitError $ "Error: store log file " <> storeLogFilePath <> " does not exist." + confirmOrExit + ("Import store log " <> storeLogFilePath <> " to PostgreSQL database?") + "Import cancelled." + importToDatabase storeLogFilePath ini MCYesUp + SCExport -> do + storeLogExists <- doesFileExist storeLogFilePath + when storeLogExists $ exitError $ "Error: store log file " <> storeLogFilePath <> " already exists." + confirmOrExit + ("Export PostgreSQL database to store log " <> storeLogFilePath <> "?") + "Export cancelled." + exportFromDatabase storeLogFilePath ini MCConsole initializeServer InitOptions {enableStoreLog, signAlgorithm, ip, fqdn, filesPath, fileSizeQuota, webStaticPath = webStaticPath_} = do clearDirIfExists cfgPath clearDirIfExists logPath @@ -104,20 +125,20 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do \# available to the end users of the server.\n\ \# LICENSE: https://github.com/simplex-chat/simplexmq/blob/stable/LICENSE\n\ \# Include correct source code URI in case the server source code is modified in any way.\n\ - \# source_code: https://github.com/simplex-chat/simplexmq\n\ + \# source_code = https://github.com/simplex-chat/simplexmq\n\ \\n\ \# Declaring all below information is optional, any of these fields can be omitted.\n\ - \# server_country: ISO-3166 2-letter code\n\ - \# operator: entity (organization or person name)\n\ - \# operator_country: ISO-3166 2-letter code\n\ - \# website:\n\ - \# admin_simplex: SimpleX address\n\ - \# admin_email:\n\ - \# complaints_simplex: SimpleX address\n\ - \# complaints_email:\n\ - \# hosting: entity (organization or person name)\n\ - \# hosting_country: ISO-3166 2-letter code\n\ - \# hosting_type: virtual\n\ + \# server_country = ISO-3166 2-letter code\n\ + \# operator = entity (organization or person name)\n\ + \# operator_country = ISO-3166 2-letter code\n\ + \# website =\n\ + \# admin_simplex = SimpleX address\n\ + \# admin_email =\n\ + \# complaints_simplex = SimpleX address\n\ + \# complaints_email =\n\ + \# hosting = entity (organization or person name)\n\ + \# hosting_country = ISO-3166 2-letter code\n\ + \# hosting_type = virtual\n\ \\n\ \[STORE_LOG]\n\ \# The server uses STM memory for persistence,\n\ @@ -125,55 +146,63 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do \# This option enables saving memory to append only log,\n\ \# and restoring it when the server is started.\n\ \# Log is compacted on start (deleted objects are removed).\n" - <> ("enable: " <> onOff enableStoreLog <> "\n\n") + <> ("enable = " <> onOff enableStoreLog <> "\n\n") + <> "# File storage mode: `memory` or `database` (PostgreSQL).\n\ + \store_files = memory\n\n\ + \# Database connection settings for PostgreSQL database (`store_files = database`).\n\ + \# db_connection = postgresql://xftp@/xftp_server_store\n\ + \# db_schema = xftp_server\n\ + \# db_pool_size = 10\n\n\ + \# Write database changes to store log file\n\ + \# db_store_log = off\n\n" <> "# Expire files after the specified number of hours.\n" - <> ("expire_files_hours: " <> tshow defFileExpirationHours <> "\n\n") - <> "log_stats: off\n\ + <> ("expire_files_hours = " <> tshow defFileExpirationHours <> "\n\n") + <> "log_stats = off\n\ \\n\ \# Log interval for real-time Prometheus metrics\n\ - \# prometheus_interval: 60\n\ + \# prometheus_interval = 60\n\ \\n\ \[AUTH]\n\ \# Set new_files option to off to completely prohibit uploading new files.\n\ \# This can be useful when you want to decommission the server, but still allow downloading the existing files.\n\ - \new_files: on\n\ + \new_files = on\n\ \\n\ \# Use create_password option to enable basic auth to upload new files.\n\ \# The password should be used as part of server address in client configuration:\n\ \# xftp://fingerprint:password@host1,host2\n\ \# The password will not be shared with file recipients, you must share it only\n\ \# with the users who you want to allow uploading files to your server.\n\ - \# create_password: password to upload files (any printable ASCII characters without whitespace, '@', ':' and '/')\n\ + \# create_password = password to upload files (any printable ASCII characters without whitespace, '@', ':' and '/')\n\ \\n\ - \# control_port_admin_password:\n\ - \# control_port_user_password:\n\ + \# control_port_admin_password =\n\ + \# control_port_user_password =\n\ \\n\ \[TRANSPORT]\n\ \# host is only used to print server address on start\n" - <> ("host: " <> T.pack host <> "\n") - <> ("port: " <> T.pack defaultServerPort <> "\n") - <> "log_tls_errors: off\n\ - \# control_port: 5226\n\ + <> ("host = " <> T.pack host <> "\n") + <> ("port = " <> T.pack defaultServerPort <> "\n") + <> "log_tls_errors = off\n\ + \# control_port = 5226\n\ \\n\ \[FILES]\n" - <> ("path: " <> T.pack filesPath <> "\n") - <> ("storage_quota: " <> safeDecodeUtf8 (strEncode fileSizeQuota) <> "\n") + <> ("path = " <> T.pack filesPath <> "\n") + <> ("storage_quota = " <> safeDecodeUtf8 (strEncode fileSizeQuota) <> "\n") <> "\n\ \[INACTIVE_CLIENTS]\n\ \# TTL and interval to check inactive clients\n\ - \disconnect: off\n" - <> ("# ttl: " <> tshow (ttl defaultInactiveClientExpiration) <> "\n") - <> ("# check_interval: " <> tshow (checkInterval defaultInactiveClientExpiration) <> "\n") + \disconnect = off\n" + <> ("# ttl = " <> tshow (ttl defaultInactiveClientExpiration) <> "\n") + <> ("# check_interval = " <> tshow (checkInterval defaultInactiveClientExpiration) <> "\n") <> "\n\ \[WEB]\n\ \# Set path to generate static mini-site for server information\n" - <> ("static_path: " <> T.pack (fromMaybe defaultStaticPath webStaticPath_) <> "\n\n") + <> ("static_path = " <> T.pack (fromMaybe defaultStaticPath webStaticPath_) <> "\n\n") <> "# Run an embedded HTTP server on this port.\n\ - \# http: 8000\n\n\ + \# http = 8000\n\n\ \# TLS credentials for HTTPS web server on the same port as XFTP.\n\ - \# cert: " <> T.pack (cfgPath `combine` "web.crt") <> "\n\ - \# key: " <> T.pack (cfgPath `combine` "web.key") <> "\n" - runServer ini = do + \# cert = " <> T.pack (cfgPath `combine` "web.crt") <> "\n\ + \# key = " <> T.pack (cfgPath `combine` "web.key") <> "\n" + runServer StartOptions {confirmMigrations} ini = do hSetBuffering stdout LineBuffering hSetBuffering stderr LineBuffering fp <- checkSavedFingerprint cfgPath defaultX509Config @@ -183,18 +212,24 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do printServiceInfo serverVersion srv let information = serverPublicInfo ini printSourceCode (sourceCode <$> information) - printXFTPConfig serverConfig - case webStaticPath' of - Just path -> do - let onionHost = - either (const Nothing) (find isOnion) $ - strDecode @(L.NonEmpty TransportHost) . encodeUtf8 =<< lookupValue "TRANSPORT" "host" ini - webHttpPort = eitherToMaybe (lookupValue "WEB" "http" ini) >>= readMaybe . T.unpack - generateSite serverConfig information onionHost path - when (isJust webHttpPort || isJust webHttpsParams') $ - serveStaticFiles EmbeddedWebParams {webStaticPath = path, webHttpPort, webHttpsParams = webHttpsParams'} - Nothing -> pure () - runXFTPServer serverConfig + case readFileStoreType ini of + Left err -> error err + Right fsType -> do + checkFileStoreMode ini fsType storeLogFilePath + runWithStoreConfig fsType ini storeLogFilePath confirmMigrations $ \storeCfg -> do + let cfg = serverConfig storeCfg + printXFTPConfig cfg + case webStaticPath' of + Just path -> do + let onionHost = + either (const Nothing) (find isOnion) $ + strDecode @(L.NonEmpty TransportHost) . encodeUtf8 =<< lookupValue "TRANSPORT" "host" ini + webHttpPort = eitherToMaybe (lookupValue "WEB" "http" ini) >>= readMaybe . T.unpack + generateSite cfg information onionHost path + when (isJust webHttpPort || isJust webHttpsParams') $ + serveStaticFiles EmbeddedWebParams {webStaticPath = path, webHttpPort, webHttpsParams = webHttpsParams'} + Nothing -> pure () + runXFTPServer cfg where isOnion = \case THOnionHost _ -> True; _ -> False enableStoreLog = settingIsOn "STORE_LOG" "enable" ini @@ -236,11 +271,13 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do webStaticPath' = eitherToMaybe $ T.unpack <$> lookupValue "WEB" "static_path" ini - serverConfig = + serverConfig :: XFTPStoreConfig s -> XFTPServerConfig s + serverConfig serverStoreCfg = XFTPServerConfig { xftpPort = T.unpack $ strictIni "TRANSPORT" "port" ini, controlPort = either (const Nothing) (Just . T.unpack) $ lookupValue "TRANSPORT" "control_port" ini, fileIdSize = 16, + serverStoreCfg, storeLogFile = enableStoreLog $> storeLogFilePath, filesPath = T.unpack $ strictIni "FILES" "path" ini, fileSizeQuota = either error unFileSize <$> strDecodeIni "FILES" "storage_quota" ini, @@ -289,9 +326,16 @@ xftpServerCLI_ generateSite serveStaticFiles cfgPath logPath = do data CliCommand = Init InitOptions | OnlineCert CertOptions - | Start + | Start StartOptions + | Database StoreCmd | Delete +data StoreCmd = SCImport | SCExport + +newtype StartOptions = StartOptions + { confirmMigrations :: MigrationConfirmation + } + data InitOptions = InitOptions { enableStoreLog :: Bool, signAlgorithm :: SignAlgorithm, @@ -308,7 +352,8 @@ cliCommandP cfgPath logPath iniFile = hsubparser ( command "init" (info (Init <$> initP) (progDesc $ "Initialize server - creates " <> cfgPath <> " and " <> logPath <> " directories and configuration files")) <> command "cert" (info (OnlineCert <$> certOptionsP) (progDesc $ "Generate new online TLS server credentials (configuration: " <> iniFile <> ")")) - <> command "start" (info (pure Start) (progDesc $ "Start server (configuration: " <> iniFile <> ")")) + <> command "start" (info (Start <$> startOptsP) (progDesc $ "Start server (configuration: " <> iniFile <> ")")) + <> command "database" (info (Database <$> storeCmdP) (progDesc "Import/export file store to/from PostgreSQL database")) <> command "delete" (info (pure Delete) (progDesc "Delete configuration and log files")) ) where @@ -375,3 +420,20 @@ cliCommandP cfgPath logPath iniFile = <> metavar "PATH" ) pure InitOptions {enableStoreLog, signAlgorithm, ip, fqdn, filesPath, fileSizeQuota, webStaticPath} + startOptsP :: Parser StartOptions + startOptsP = do + confirmMigrations <- + option + parseConfirmMigrations + ( long "confirm-migrations" + <> metavar "CONFIRM_MIGRATIONS" + <> help "Confirm PostgreSQL database migration: up, down (default is manual confirmation)" + <> value MCConsole + ) + pure StartOptions {confirmMigrations} + storeCmdP :: Parser StoreCmd + storeCmdP = + hsubparser + ( command "import" (info (pure SCImport) (progDesc "Import store log file into PostgreSQL database")) + <> command "export" (info (pure SCExport) (progDesc "Export PostgreSQL database to store log file")) + ) diff --git a/src/Simplex/FileTransfer/Server/Store.hs b/src/Simplex/FileTransfer/Server/Store.hs index eec481a21..8ed418f1a 100644 --- a/src/Simplex/FileTransfer/Server/Store.hs +++ b/src/Simplex/FileTransfer/Server/Store.hs @@ -1,51 +1,53 @@ {-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TupleSections #-} +{-# LANGUAGE TypeFamilies #-} module Simplex.FileTransfer.Server.Store - ( FileStore (..), + ( FSType (..), + SFSType (..), + FileStoreClass (..), FileRec (..), FileRecipient (..), + STMFileStore (..), RoundedFileTime, - newFileStore, - addFile, - setFilePath, - addRecipient, - deleteFile, - blockFile, - deleteRecipient, - expiredFilePath, - getFile, - ackFile, fileTimePrecision, ) where +import Data.Kind (Type) + import Control.Concurrent.STM -import Control.Monad +import Control.Monad (forM, void) import qualified Data.Attoparsec.ByteString.Char8 as A import Data.Int (Int64) +import qualified Data.Map.Strict as M +import Data.Maybe (catMaybes) import Data.Set (Set) import qualified Data.Set as S +import Data.Word (Word32) import Simplex.FileTransfer.Protocol (FileInfo (..), SFileParty (..), XFTPFileId) import Simplex.FileTransfer.Transport (XFTPErrorType (..)) import qualified Simplex.Messaging.Crypto as C import Simplex.Messaging.Encoding.String import Simplex.Messaging.Protocol (BlockingInfo, RcvPublicAuthKey, RecipientId, SenderId) import Simplex.Messaging.Server.QueueStore (ServerEntityStatus (..)) +import Simplex.Messaging.Server.StoreLog (StoreLog, closeStoreLog) +import System.IO (IOMode (..)) import Simplex.Messaging.SystemTime import Simplex.Messaging.TMap (TMap) import qualified Simplex.Messaging.TMap as TM -import Simplex.Messaging.Util (ifM, ($>>=)) +import Simplex.Messaging.Util (ifM) -data FileStore = FileStore - { files :: TMap SenderId FileRec, - recipients :: TMap RecipientId (SenderId, RcvPublicAuthKey), - usedStorage :: TVar Int64 - } +data FSType = FSMemory | FSPostgres + +data SFSType :: FSType -> Type where + SFSMemory :: SFSType 'FSMemory + SFSPostgres :: SFSType 'FSPostgres data FileRec = FileRec { senderId :: SenderId, @@ -59,28 +61,126 @@ data FileRec = FileRec type RoundedFileTime = RoundedSystemTime 3600 fileTimePrecision :: Int64 -fileTimePrecision = 3600 -- truncate creation time to 1 hour +fileTimePrecision = 3600 -data FileRecipient = FileRecipient RecipientId RcvPublicAuthKey +data FileRecipient = FileRecipient RecipientId C.APublicAuthKey deriving (Show) instance StrEncoding FileRecipient where strEncode (FileRecipient rId rKey) = strEncode rId <> ":" <> strEncode rKey strP = FileRecipient <$> strP <* A.char ':' <*> strP -newFileStore :: IO FileStore -newFileStore = do - files <- TM.emptyIO - recipients <- TM.emptyIO - usedStorage <- newTVarIO 0 - pure FileStore {files, recipients, usedStorage} +class FileStoreClass s where + type FileStoreConfig s + newFileStore :: FileStoreConfig s -> IO s + closeFileStore :: s -> IO () + addFile :: s -> SenderId -> FileInfo -> RoundedFileTime -> ServerEntityStatus -> IO (Either XFTPErrorType ()) + setFilePath :: s -> SenderId -> FilePath -> IO (Either XFTPErrorType ()) + addRecipient :: s -> SenderId -> FileRecipient -> IO (Either XFTPErrorType ()) + deleteFile :: s -> SenderId -> IO (Either XFTPErrorType ()) + deleteFiles :: s -> [SenderId] -> IO () + deleteFiles s = mapM_ (void . deleteFile s) + blockFile :: s -> SenderId -> BlockingInfo -> Bool -> IO (Either XFTPErrorType ()) + deleteRecipient :: s -> RecipientId -> FileRec -> IO () + getFile :: s -> SFileParty p -> XFTPFileId -> IO (Either XFTPErrorType (FileRec, C.APublicAuthKey)) + ackFile :: s -> RecipientId -> IO (Either XFTPErrorType ()) + expiredFiles :: s -> Int64 -> Int -> IO [(SenderId, Maybe FilePath, Word32)] + getUsedStorage :: s -> IO Int64 + getFileCount :: s -> IO Int -addFile :: FileStore -> SenderId -> FileInfo -> RoundedFileTime -> ServerEntityStatus -> STM (Either XFTPErrorType ()) -addFile FileStore {files} sId fileInfo createdAt status = - ifM (TM.member sId files) (pure $ Left DUPLICATE_) $ do - f <- newFileRec sId fileInfo createdAt status - TM.insert sId f files - pure $ Right () +-- STM in-memory store + +data STMFileStore = STMFileStore + { files :: TMap SenderId FileRec, + recipients :: TMap RecipientId (SenderId, RcvPublicAuthKey), + stmStoreLog :: TVar (Maybe (StoreLog 'WriteMode)) + } + +instance FileStoreClass STMFileStore where + type FileStoreConfig STMFileStore = () + + newFileStore () = do + files <- TM.emptyIO + recipients <- TM.emptyIO + stmStoreLog <- newTVarIO Nothing + pure STMFileStore {files, recipients, stmStoreLog} + + closeFileStore STMFileStore {stmStoreLog} = readTVarIO stmStoreLog >>= mapM_ closeStoreLog + + addFile STMFileStore {files} sId fileInfo createdAt status = atomically $ + ifM (TM.member sId files) (pure $ Left DUPLICATE_) $ do + f <- newFileRec sId fileInfo createdAt status + TM.insert sId f files + pure $ Right () + + setFilePath st sId fPath = atomically $ + withFile st sId $ \FileRec {filePath, fileStatus} -> do + readTVar filePath >>= \case + Just _ -> pure $ Left AUTH + Nothing -> + readTVar fileStatus >>= \case + EntityActive -> do + writeTVar filePath (Just fPath) + pure $ Right () + _ -> pure $ Left AUTH + + addRecipient st@STMFileStore {recipients} senderId (FileRecipient rId rKey) = atomically $ + withFile st senderId $ \FileRec {recipientIds} -> do + rIds <- readTVar recipientIds + mem <- TM.member rId recipients + if rId `S.member` rIds || mem + then pure $ Left DUPLICATE_ + else do + writeTVar recipientIds $! S.insert rId rIds + TM.insert rId (senderId, rKey) recipients + pure $ Right () + + deleteFile STMFileStore {files, recipients} senderId = atomically $ do + TM.lookupDelete senderId files >>= \case + Just FileRec {recipientIds} -> do + readTVar recipientIds >>= mapM_ (`TM.delete` recipients) + pure $ Right () + _ -> pure $ Left AUTH + + blockFile st senderId info _deleted = atomically $ + withFile st senderId $ \FileRec {fileStatus} -> do + writeTVar fileStatus $! EntityBlocked info + pure $ Right () + + deleteRecipient STMFileStore {recipients} rId FileRec {recipientIds} = atomically $ do + TM.delete rId recipients + modifyTVar' recipientIds $ S.delete rId + + getFile st party fId = atomically $ case party of + SFSender -> withFile st fId $ pure . Right . (\f -> (f, sndKey $ fileInfo f)) + SFRecipient -> + TM.lookup fId (recipients st) >>= \case + Just (sId, rKey) -> withFile st sId $ pure . Right . (,rKey) + _ -> pure $ Left AUTH + + ackFile st@STMFileStore {recipients} recipientId = atomically $ do + TM.lookupDelete recipientId recipients >>= \case + Just (sId, _) -> + withFile st sId $ \FileRec {recipientIds} -> do + modifyTVar' recipientIds $ S.delete recipientId + pure $ Right () + _ -> pure $ Left AUTH + + expiredFiles STMFileStore {files} old _limit = do + fs <- readTVarIO files + fmap catMaybes . forM (M.toList fs) $ \(sId, FileRec {fileInfo = FileInfo {size}, filePath, createdAt = RoundedSystemTime createdAt}) -> + if createdAt + fileTimePrecision < old + then do + path <- readTVarIO filePath + pure $ Just (sId, path, size) + else pure Nothing + + getUsedStorage STMFileStore {files} = + M.foldl' (\acc FileRec {fileInfo = FileInfo {size}} -> acc + fromIntegral size) 0 <$> readTVarIO files + + getFileCount STMFileStore {files} = M.size <$> readTVarIO files + +-- Internal STM helpers newFileRec :: SenderId -> FileInfo -> RoundedFileTime -> ServerEntityStatus -> STM FileRec newFileRec senderId fileInfo createdAt status = do @@ -89,75 +189,8 @@ newFileRec senderId fileInfo createdAt status = do fileStatus <- newTVar status pure FileRec {senderId, fileInfo, filePath, recipientIds, createdAt, fileStatus} -setFilePath :: FileStore -> SenderId -> FilePath -> STM (Either XFTPErrorType ()) -setFilePath st sId fPath = - withFile st sId $ \FileRec {fileInfo, filePath} -> do - writeTVar filePath (Just fPath) - modifyTVar' (usedStorage st) (+ fromIntegral (size fileInfo)) - pure $ Right () - -addRecipient :: FileStore -> SenderId -> FileRecipient -> STM (Either XFTPErrorType ()) -addRecipient st@FileStore {recipients} senderId (FileRecipient rId rKey) = - withFile st senderId $ \FileRec {recipientIds} -> do - rIds <- readTVar recipientIds - mem <- TM.member rId recipients - if rId `S.member` rIds || mem - then pure $ Left DUPLICATE_ - else do - writeTVar recipientIds $! S.insert rId rIds - TM.insert rId (senderId, rKey) recipients - pure $ Right () - --- this function must be called after the file is deleted from the file system -deleteFile :: FileStore -> SenderId -> STM (Either XFTPErrorType ()) -deleteFile FileStore {files, recipients, usedStorage} senderId = do - TM.lookupDelete senderId files >>= \case - Just FileRec {fileInfo, recipientIds} -> do - readTVar recipientIds >>= mapM_ (`TM.delete` recipients) - modifyTVar' usedStorage $ subtract (fromIntegral $ size fileInfo) - pure $ Right () - _ -> pure $ Left AUTH - --- this function must be called after the file is deleted from the file system -blockFile :: FileStore -> SenderId -> BlockingInfo -> Bool -> STM (Either XFTPErrorType ()) -blockFile st@FileStore {usedStorage} senderId info deleted = - withFile st senderId $ \FileRec {fileInfo, fileStatus} -> do - when deleted $ modifyTVar' usedStorage $ subtract (fromIntegral $ size fileInfo) - writeTVar fileStatus $! EntityBlocked info - pure $ Right () - -deleteRecipient :: FileStore -> RecipientId -> FileRec -> STM () -deleteRecipient FileStore {recipients} rId FileRec {recipientIds} = do - TM.delete rId recipients - modifyTVar' recipientIds $ S.delete rId - -getFile :: FileStore -> SFileParty p -> XFTPFileId -> STM (Either XFTPErrorType (FileRec, C.APublicAuthKey)) -getFile st party fId = case party of - SFSender -> withFile st fId $ pure . Right . (\f -> (f, sndKey $ fileInfo f)) - SFRecipient -> - TM.lookup fId (recipients st) >>= \case - Just (sId, rKey) -> withFile st sId $ pure . Right . (,rKey) - _ -> pure $ Left AUTH - -expiredFilePath :: FileStore -> XFTPFileId -> Int64 -> STM (Maybe (Maybe FilePath)) -expiredFilePath FileStore {files} sId old = - TM.lookup sId files - $>>= \FileRec {filePath, createdAt = RoundedSystemTime createdAt} -> - if createdAt + fileTimePrecision < old - then Just <$> readTVar filePath - else pure Nothing - -ackFile :: FileStore -> RecipientId -> STM (Either XFTPErrorType ()) -ackFile st@FileStore {recipients} recipientId = do - TM.lookupDelete recipientId recipients >>= \case - Just (sId, _) -> - withFile st sId $ \FileRec {recipientIds} -> do - modifyTVar' recipientIds $ S.delete recipientId - pure $ Right () - _ -> pure $ Left AUTH - -withFile :: FileStore -> SenderId -> (FileRec -> STM (Either XFTPErrorType a)) -> STM (Either XFTPErrorType a) -withFile FileStore {files} sId a = +withFile :: STMFileStore -> SenderId -> (FileRec -> STM (Either XFTPErrorType a)) -> STM (Either XFTPErrorType a) +withFile STMFileStore {files} sId a = TM.lookup sId files >>= \case Just f -> a f _ -> pure $ Left AUTH diff --git a/src/Simplex/FileTransfer/Server/Store/Postgres.hs b/src/Simplex/FileTransfer/Server/Store/Postgres.hs new file mode 100644 index 000000000..7d3ad7e63 --- /dev/null +++ b/src/Simplex/FileTransfer/Server/Store/Postgres.hs @@ -0,0 +1,370 @@ +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeFamilies #-} + +module Simplex.FileTransfer.Server.Store.Postgres + ( PostgresFileStore (..), + importFileStore, + exportFileStore, + ) +where + +import qualified Control.Exception as E +import Control.Logger.Simple +import Control.Monad +import Control.Monad.Except +import Control.Monad.IO.Class +import Control.Monad.Trans.Except (throwE) +import Data.ByteString (ByteString) +import qualified Data.ByteString.Char8 as B +import Data.ByteString.Builder (Builder) +import qualified Data.ByteString.Builder as BB +import qualified Data.ByteString.Lazy as LB +import Data.Functor (($>)) +import Data.Int (Int32, Int64) +import Data.List (intersperse) +import qualified Data.List.NonEmpty as L +import qualified Data.Map.Strict as M +import qualified Data.Set as S +import Data.Text (Text) +import Data.Word (Word32) +import Database.PostgreSQL.Simple (Binary (..), In (..), Only (..), SqlError, (:.) (..)) +import qualified Database.PostgreSQL.Simple as DB +import qualified Database.PostgreSQL.Simple.Copy as DB +import Database.PostgreSQL.Simple.Errors (ConstraintViolation (..), constraintViolation) +import Database.PostgreSQL.Simple.ToField (Action (..), ToField (..)) +import GHC.IO (catchAny) +import Simplex.FileTransfer.Protocol (FileInfo (..), SFileParty (..)) +import Simplex.FileTransfer.Server.Store +import Simplex.FileTransfer.Server.Store.Postgres.Config +import Simplex.FileTransfer.Server.Store.Postgres.Migrations (xftpServerMigrations) +import Simplex.FileTransfer.Server.StoreLog +import Simplex.FileTransfer.Transport (XFTPErrorType (..)) +import Simplex.Messaging.Agent.Store.Postgres (closeDBStore, createDBStore) +import Simplex.Messaging.Agent.Store.Postgres.Common (DBStore, withTransaction) +import Simplex.Messaging.Agent.Store.Postgres.Options (DBOpts (..)) +import Simplex.Messaging.Agent.Store.Shared (MigrationConfig (..), MigrationConfirmation (..)) +import qualified Simplex.Messaging.Crypto as C +import Simplex.Messaging.Protocol (RcvPublicAuthKey, RecipientId, SenderId) +import Simplex.Messaging.Transport (EntityId (..)) +import Simplex.Messaging.Server.QueueStore (ServerEntityStatus (..)) +import Simplex.Messaging.Server.QueueStore.Postgres () +import Simplex.Messaging.Server.StoreLog (openWriteStoreLog) +import Simplex.Messaging.Util (firstRow, tshow) +import System.Directory (renameFile) +import System.Exit (exitFailure) +import System.IO (IOMode (..), hFlush, stdout) +import UnliftIO.STM + +data PostgresFileStore = PostgresFileStore + { dbStore :: DBStore, + dbStoreLog :: Maybe (StoreLog 'WriteMode) + } + +instance FileStoreClass PostgresFileStore where + type FileStoreConfig PostgresFileStore = PostgresFileStoreCfg + + newFileStore PostgresFileStoreCfg {dbOpts, dbStoreLogPath, confirmMigrations} = do + dbStore <- either err pure =<< createDBStore dbOpts xftpServerMigrations (MigrationConfig confirmMigrations Nothing) + dbStoreLog <- mapM (openWriteStoreLog True) dbStoreLogPath + pure PostgresFileStore {dbStore, dbStoreLog} + where + err e = do + logError $ "STORE: newFileStore, error opening PostgreSQL database, " <> tshow e + exitFailure + + closeFileStore PostgresFileStore {dbStore, dbStoreLog} = do + closeDBStore dbStore + mapM_ closeStoreLog dbStoreLog + + addFile st sId fileInfo@FileInfo {sndKey, size, digest} createdAt status = + E.uninterruptibleMask_ $ runExceptT $ do + void $ withDB "addFile" st $ \db -> + E.try + ( DB.execute + db + "INSERT INTO files (sender_id, file_size, file_digest, sender_key, created_at, status) VALUES (?,?,?,?,?,?)" + (sId, (fromIntegral size :: Int32), Binary digest, Binary (C.encodePubKey sndKey), createdAt, status) + ) + >>= either handleDuplicate (pure . Right) + withLog "addFile" st $ \s -> logAddFile s sId fileInfo createdAt status + + setFilePath st sId fPath = E.uninterruptibleMask_ $ runExceptT $ do + assertUpdated $ withDB' "setFilePath" st $ \db -> + DB.execute db "UPDATE files SET file_path = ? WHERE sender_id = ? AND file_path IS NULL AND status = 'active'" (fPath, sId) + withLog "setFilePath" st $ \s -> logPutFile s sId fPath + + addRecipient st senderId (FileRecipient rId rKey) = E.uninterruptibleMask_ $ runExceptT $ do + void $ withDB "addRecipient" st $ \db -> + E.try + ( DB.execute + db + "INSERT INTO recipients (recipient_id, sender_id, recipient_key) VALUES (?,?,?)" + (rId, senderId, Binary (C.encodePubKey rKey)) + ) + >>= either handleDuplicate (pure . Right) + withLog "addRecipient" st $ \s -> logAddRecipients s senderId (pure $ FileRecipient rId rKey) + + deleteFile st sId = E.uninterruptibleMask_ $ runExceptT $ do + assertUpdated $ withDB' "deleteFile" st $ \db -> + DB.execute db "DELETE FROM files WHERE sender_id = ?" (Only sId) + withLog "deleteFile" st $ \s -> logDeleteFile s sId + + deleteFiles st sIds = E.uninterruptibleMask_ $ do + withTransaction (dbStore st) $ \db -> + DB.execute db "DELETE FROM files WHERE sender_id IN ?" (Only (In sIds)) + withLog "deleteFiles" st $ \s -> mapM_ (logDeleteFile s) sIds + + blockFile st sId info _deleted = E.uninterruptibleMask_ $ runExceptT $ do + assertUpdated $ withDB' "blockFile" st $ \db -> + DB.execute db "UPDATE files SET status = ? WHERE sender_id = ?" (EntityBlocked info, sId) + withLog "blockFile" st $ \s -> logBlockFile s sId info + + deleteRecipient st rId _fr = + void $ runExceptT $ withDB' "deleteRecipient" st $ \db -> + DB.execute db "DELETE FROM recipients WHERE recipient_id = ?" (Only rId) + + getFile st party fId = runExceptT $ case party of + SFSender -> do + row <- loadFileRow "SELECT sender_id, file_size, file_digest, sender_key, file_path, created_at, status FROM files WHERE sender_id = ?" + fr <- ExceptT $ rowToFileRec row + pure (fr, sndKey (fileInfo fr)) + SFRecipient -> do + row :. Only rcpKeyBs <- + loadFileRow + "SELECT f.sender_id, f.file_size, f.file_digest, f.sender_key, f.file_path, f.created_at, f.status, r.recipient_key FROM files f JOIN recipients r ON r.sender_id = f.sender_id WHERE r.recipient_id = ?" + fr <- ExceptT $ rowToFileRec row + rcpKey <- either (const $ throwE INTERNAL) pure $ C.decodePubKey rcpKeyBs + pure (fr, rcpKey) + where + loadFileRow :: DB.FromRow r => DB.Query -> ExceptT XFTPErrorType IO r + loadFileRow q = + withDB "getFile" st $ \db -> + firstRow id AUTH $ DB.query db q (Only fId) + + ackFile st rId = E.uninterruptibleMask_ $ runExceptT $ do + assertUpdated $ withDB' "ackFile" st $ \db -> + DB.execute db "DELETE FROM recipients WHERE recipient_id = ?" (Only rId) + withLog "ackFile" st $ \s -> logAckFile s rId + + expiredFiles st old limit = + fmap toResult $ withTransaction (dbStore st) $ \db -> + DB.query + db + "SELECT sender_id, file_path, file_size FROM files WHERE created_at + ? < ? ORDER BY created_at LIMIT ?" + (fileTimePrecision, old, limit) + where + toResult :: [(SenderId, Maybe FilePath, Int32)] -> [(SenderId, Maybe FilePath, Word32)] + toResult = map (\(sId, path, size) -> (sId, path, fromIntegral size)) + + getUsedStorage st = + withTransaction (dbStore st) $ \db -> do + [Only total] <- DB.query_ db "SELECT COALESCE(SUM(file_size::BIGINT), 0)::BIGINT FROM files" + pure total + + getFileCount st = + withTransaction (dbStore st) $ \db -> do + [Only count] <- DB.query_ db "SELECT COUNT(*) FROM files" + pure (fromIntegral (count :: Int64)) + +-- Internal helpers + +mkFileRec :: SenderId -> FileInfo -> Maybe FilePath -> RoundedFileTime -> ServerEntityStatus -> IO FileRec +mkFileRec senderId fileInfo path createdAt status = do + filePath <- newTVarIO path + recipientIds <- newTVarIO S.empty + fileStatus <- newTVarIO status + pure FileRec {senderId, fileInfo, filePath, recipientIds, createdAt, fileStatus} + +type FileRecRow = (SenderId, Int32, ByteString, ByteString, Maybe FilePath, RoundedFileTime, ServerEntityStatus) + +rowToFileRec :: FileRecRow -> IO (Either XFTPErrorType FileRec) +rowToFileRec (sId, size, digest, sndKeyBs, path, createdAt, status) = + case C.decodePubKey sndKeyBs of + Right sndKey -> do + let fileInfo = FileInfo {sndKey, size = fromIntegral size, digest} + Right <$> mkFileRec sId fileInfo path createdAt status + Left _ -> pure $ Left INTERNAL + +-- DB helpers + +withDB :: forall a. Text -> PostgresFileStore -> (DB.Connection -> IO (Either XFTPErrorType a)) -> ExceptT XFTPErrorType IO a +withDB op st action = + ExceptT $ E.try (withTransaction (dbStore st) action) >>= either logErr pure + where + logErr :: E.SomeException -> IO (Either XFTPErrorType a) + logErr e = logError ("STORE: " <> err) $> Left INTERNAL + where + err = op <> ", withDB, " <> tshow e + +withDB' :: Text -> PostgresFileStore -> (DB.Connection -> IO a) -> ExceptT XFTPErrorType IO a +withDB' op st action = withDB op st $ fmap Right . action + +assertUpdated :: ExceptT XFTPErrorType IO Int64 -> ExceptT XFTPErrorType IO () +assertUpdated = (>>= \n -> when (n == 0) (throwE AUTH)) + +handleDuplicate :: SqlError -> IO (Either XFTPErrorType a) +handleDuplicate e = case constraintViolation e of + Just (UniqueViolation _) -> pure $ Left DUPLICATE_ + Just (ForeignKeyViolation _ _) -> pure $ Left AUTH + _ -> E.throwIO e + +withLog :: MonadIO m => Text -> PostgresFileStore -> (StoreLog 'WriteMode -> IO ()) -> m () +withLog op PostgresFileStore {dbStoreLog} action = + forM_ dbStoreLog $ \sl -> liftIO $ action sl `catchAny` \e -> + logWarn $ "STORE: " <> op <> ", withLog, " <> tshow e + +-- Import: StoreLog -> PostgreSQL + +importFileStore :: FilePath -> PostgresFileStoreCfg -> IO () +importFileStore storeLogFilePath dbCfg = do + putStrLn $ "Reading store log: " <> storeLogFilePath + stmStore <- newFileStore () :: IO STMFileStore + sl <- readWriteFileStore storeLogFilePath stmStore + closeStoreLog sl + allFiles <- readTVarIO (files stmStore) + allRcps <- readTVarIO (recipients stmStore) + let fileCount = M.size allFiles + rcpCount = M.size allRcps + putStrLn $ "Loaded " <> show fileCount <> " files, " <> show rcpCount <> " recipients." + let dbCfg' = dbCfg {dbOpts = (dbOpts dbCfg) {createSchema = True}, confirmMigrations = MCYesUp} + pgStore <- newFileStore dbCfg' :: IO PostgresFileStore + existingCount <- getFileCount pgStore + when (existingCount > 0) $ do + putStrLn $ "WARNING: database already contains " <> show existingCount <> " files. Import will fail on duplicate keys." + putStrLn "Drop the existing schema first or use a fresh database." + exitFailure + putStrLn "Importing files..." + fCnt <- withTransaction (dbStore pgStore) $ \db -> do + DB.copy_ + db + "COPY files (sender_id, file_size, file_digest, sender_key, file_path, created_at, status) FROM STDIN WITH (FORMAT csv)" + iforM_ (M.toList allFiles) $ \i (sId, fr) -> do + DB.putCopyData db =<< fileRecToCSV sId fr + when (i > 0 && i `mod` 10000 == 0) $ putStr (" " <> show i <> " files\r") >> hFlush stdout + DB.putCopyEnd db + [Only cnt] <- DB.query_ db "SELECT COUNT(*) FROM files" + pure (cnt :: Int64) + putStrLn $ "Imported " <> show fCnt <> " files." + putStrLn "Importing recipients..." + rCnt <- withTransaction (dbStore pgStore) $ \db -> do + DB.copy_ + db + "COPY recipients (recipient_id, sender_id, recipient_key) FROM STDIN WITH (FORMAT csv)" + iforM_ (M.toList allRcps) $ \i (rId, (sId, rKey)) -> do + DB.putCopyData db $ recipientToCSV rId sId rKey + when (i > 0 && i `mod` 10000 == 0) $ putStr (" " <> show i <> " recipients\r") >> hFlush stdout + DB.putCopyEnd db + [Only cnt] <- DB.query_ db "SELECT COUNT(*) FROM recipients" + pure (cnt :: Int64) + putStrLn $ "Imported " <> show rCnt <> " recipients." + when (fromIntegral fileCount /= fCnt) $ + putStrLn $ "WARNING: expected " <> show fileCount <> " files, got " <> show fCnt + when (fromIntegral rcpCount /= rCnt) $ + putStrLn $ "WARNING: expected " <> show rcpCount <> " recipients, got " <> show rCnt + closeFileStore pgStore + renameFile storeLogFilePath (storeLogFilePath <> ".bak") + putStrLn $ "Store log renamed to " <> storeLogFilePath <> ".bak" + +-- Export: PostgreSQL -> StoreLog + +exportFileStore :: FilePath -> PostgresFileStoreCfg -> IO () +exportFileStore storeLogFilePath dbCfg = do + pgStore <- newFileStore dbCfg :: IO PostgresFileStore + sl <- openWriteStoreLog False storeLogFilePath + -- Fold 1: stream files, write FNEW + FPUT per file + putStrLn "Exporting files..." + !fCnt <- withTransaction (dbStore pgStore) $ \db -> + DB.fold_ + db + "SELECT sender_id, file_size, file_digest, sender_key, file_path, created_at, status FROM files ORDER BY created_at" + (0 :: Int) + ( \(!fc) (sId, size :: Int32, digest :: ByteString, sndKeyBs :: ByteString, path :: Maybe String, createdAt, status) -> + case C.decodePubKey sndKeyBs of + Right sndKey -> do + let fileInfo = FileInfo {sndKey, size = fromIntegral size, digest} + logAddFile sl sId fileInfo createdAt status + forM_ path $ logPutFile sl sId + pure (fc + 1) + Left _ -> do + putStrLn $ "WARNING: invalid sender key for " <> show sId + pure fc + ) + -- Fold 2: stream recipients ordered by sender_id, flush FADD on sender change + putStrLn "Exporting recipients..." + !rCnt <- withTransaction (dbStore pgStore) $ \db -> + DB.fold_ + db + "SELECT sender_id, recipient_id, recipient_key FROM recipients ORDER BY sender_id" + (Nothing :: Maybe SenderId, [] :: [FileRecipient], 0 :: Int) + ( \(!prevSId, !buf, !rc) (sId, rId, rKeyBs :: ByteString) -> + case C.decodePubKey rKeyBs of + Right rKey -> do + let rcp = FileRecipient rId rKey + case prevSId of + Just prev | prev /= sId -> do + forM_ (L.nonEmpty buf) $ logAddRecipients sl prev + pure (Just sId, [rcp], rc + length buf) + _ -> pure (Just sId, rcp : buf, rc) + Left _ -> putStrLn ("WARNING: invalid recipient key for " <> show rId) $> (prevSId, buf, rc) + ) + >>= \(lastSId, buf, rc) -> do + forM_ lastSId $ \sId -> forM_ (L.nonEmpty buf) $ logAddRecipients sl sId + pure (rc + length buf) + closeStoreLog sl + closeFileStore pgStore + putStrLn $ "Exported " <> show fCnt <> " files, " <> show rCnt <> " recipients to " <> storeLogFilePath + +-- CSV helpers for COPY protocol + +iforM_ :: Monad m => [a] -> (Int -> a -> m ()) -> m () +iforM_ xs f = zipWithM_ f [0 ..] xs + +fileRecToCSV :: SenderId -> FileRec -> IO ByteString +fileRecToCSV sId FileRec {fileInfo = FileInfo {sndKey, size, digest}, filePath, createdAt, fileStatus} = do + path <- readTVarIO filePath + status <- readTVarIO fileStatus + pure $ LB.toStrict $ BB.toLazyByteString $ mconcat (BB.char7 ',' `intersperse` fields path status) <> BB.char7 '\n' + where + fields path status = + [ renderField (toField (Binary (unEntityId sId))), + renderField (toField (fromIntegral size :: Int32)), + renderField (toField (Binary digest)), + renderField (toField (Binary (C.encodePubKey sndKey))), + nullable (toField <$> path), + renderField (toField createdAt), + quotedField (toField status) + ] + +recipientToCSV :: RecipientId -> SenderId -> RcvPublicAuthKey -> ByteString +recipientToCSV rId sId rKey = + LB.toStrict $ BB.toLazyByteString $ mconcat (BB.char7 ',' `intersperse` fields) <> BB.char7 '\n' + where + fields = + [ renderField (toField (Binary (unEntityId rId))), + renderField (toField (Binary (unEntityId sId))), + renderField (toField (Binary (C.encodePubKey rKey))) + ] + +renderField :: Action -> Builder +renderField = \case + Plain bld -> bld + Escape s -> BB.byteString s + EscapeByteA s -> BB.string7 "\\x" <> BB.byteStringHex s + EscapeIdentifier s -> BB.byteString s + Many as -> mconcat (map renderField as) + +nullable :: Maybe Action -> Builder +nullable = maybe mempty renderField + +quotedField :: Action -> Builder +quotedField a = BB.char7 '"' <> escapeQuotes (renderField a) <> BB.char7 '"' + where + escapeQuotes bld = + let bs = LB.toStrict $ BB.toLazyByteString bld + in BB.byteString $ B.concatMap (\c -> if c == '"' then "\"\"" else B.singleton c) bs diff --git a/src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs b/src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs new file mode 100644 index 000000000..a0dd5d7ba --- /dev/null +++ b/src/Simplex/FileTransfer/Server/Store/Postgres/Config.hs @@ -0,0 +1,25 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Simplex.FileTransfer.Server.Store.Postgres.Config + ( PostgresFileStoreCfg (..), + defaultXFTPDBOpts, + ) +where + +import Simplex.Messaging.Agent.Store.Postgres.Options (DBOpts (..)) +import Simplex.Messaging.Agent.Store.Shared (MigrationConfirmation) + +data PostgresFileStoreCfg = PostgresFileStoreCfg + { dbOpts :: DBOpts, + dbStoreLogPath :: Maybe FilePath, + confirmMigrations :: MigrationConfirmation + } + +defaultXFTPDBOpts :: DBOpts +defaultXFTPDBOpts = + DBOpts + { connstr = "postgresql://xftp@/xftp_server_store", + schema = "xftp_server", + poolSize = 10, + createSchema = False + } diff --git a/src/Simplex/FileTransfer/Server/Store/Postgres/Migrations.hs b/src/Simplex/FileTransfer/Server/Store/Postgres/Migrations.hs new file mode 100644 index 000000000..5e84f97e7 --- /dev/null +++ b/src/Simplex/FileTransfer/Server/Store/Postgres/Migrations.hs @@ -0,0 +1,47 @@ +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.FileTransfer.Server.Store.Postgres.Migrations + ( xftpServerMigrations, + ) +where + +import Data.List (sortOn) +import Data.Text (Text) +import Simplex.Messaging.Agent.Store.Shared +import Text.RawString.QQ (r) + +xftpSchemaMigrations :: [(String, Text, Maybe Text)] +xftpSchemaMigrations = + [ ("20260325_initial", m20260325_initial, Nothing) + ] + +-- | The list of migrations in ascending order by date +xftpServerMigrations :: [Migration] +xftpServerMigrations = sortOn name $ map migration xftpSchemaMigrations + where + migration (name, up, down) = Migration {name, up, down = down} + +m20260325_initial :: Text +m20260325_initial = + [r| +CREATE TABLE files ( + sender_id BYTEA NOT NULL PRIMARY KEY, + file_size INTEGER NOT NULL, + file_digest BYTEA NOT NULL, + sender_key BYTEA NOT NULL, + file_path TEXT, + created_at BIGINT NOT NULL, + status TEXT NOT NULL DEFAULT 'active' +); + +CREATE TABLE recipients ( + recipient_id BYTEA NOT NULL PRIMARY KEY, + sender_id BYTEA NOT NULL REFERENCES files ON DELETE CASCADE, + recipient_key BYTEA NOT NULL +); + +CREATE INDEX idx_recipients_sender_id ON recipients (sender_id); +CREATE INDEX idx_files_created_at ON files (created_at); +|] diff --git a/src/Simplex/FileTransfer/Server/StoreLog.hs b/src/Simplex/FileTransfer/Server/StoreLog.hs index c82beda29..48ebb175e 100644 --- a/src/Simplex/FileTransfer/Server/StoreLog.hs +++ b/src/Simplex/FileTransfer/Server/StoreLog.hs @@ -10,6 +10,7 @@ module Simplex.FileTransfer.Server.StoreLog FileStoreLogRecord (..), closeStoreLog, readWriteFileStore, + writeFileStore, logAddFile, logPutFile, logAddRecipients, @@ -32,6 +33,7 @@ import Data.Map.Strict (Map) import qualified Data.Map.Strict as M import Simplex.FileTransfer.Protocol (FileInfo (..)) import Simplex.FileTransfer.Server.Store +import Simplex.FileTransfer.Transport (XFTPErrorType (..)) import Simplex.Messaging.Encoding.String import Simplex.Messaging.Protocol (BlockingInfo, RcvPublicAuthKey, RecipientId, SenderId) import Simplex.Messaging.Server.QueueStore (ServerEntityStatus (..)) @@ -87,20 +89,22 @@ logBlockFile s fId = logFileStoreRecord s . BlockFile fId logAckFile :: StoreLog 'WriteMode -> RecipientId -> IO () logAckFile s = logFileStoreRecord s . AckFile -readWriteFileStore :: FilePath -> FileStore -> IO (StoreLog 'WriteMode) +readWriteFileStore :: FilePath -> STMFileStore -> IO (StoreLog 'WriteMode) readWriteFileStore = readWriteStoreLog readFileStore writeFileStore -readFileStore :: FilePath -> FileStore -> IO () +readFileStore :: FilePath -> STMFileStore -> IO () readFileStore f st = mapM_ (addFileLogRecord . LB.toStrict) . LB.lines =<< LB.readFile f where addFileLogRecord s = case strDecode s of Left e -> B.putStrLn $ "Log parsing error (" <> B.pack e <> "): " <> B.take 100 s Right lr -> - atomically (addToStore lr) >>= \case + addToStore lr >>= \case Left e -> B.putStrLn $ "Log processing error (" <> bshow e <> "): " <> B.take 100 s _ -> pure () addToStore = \case - AddFile sId file createdAt status -> addFile st sId file createdAt status + AddFile sId file createdAt status + | size file > 0 -> addFile st sId file createdAt status + | otherwise -> pure $ Left SIZE PutFile qId path -> setFilePath st qId path AddRecipients sId rcps -> runExceptT $ addRecipients sId rcps DeleteFile sId -> deleteFile st sId @@ -108,8 +112,8 @@ readFileStore f st = mapM_ (addFileLogRecord . LB.toStrict) . LB.lines =<< LB.re AckFile rId -> ackFile st rId addRecipients sId rcps = mapM_ (ExceptT . addRecipient st sId) rcps -writeFileStore :: StoreLog 'WriteMode -> FileStore -> IO () -writeFileStore s FileStore {files, recipients} = do +writeFileStore :: StoreLog 'WriteMode -> STMFileStore -> IO () +writeFileStore s STMFileStore {files, recipients} = do allRcps <- readTVarIO recipients readTVarIO files >>= mapM_ (logFile allRcps) where diff --git a/src/Simplex/FileTransfer/Types.hs b/src/Simplex/FileTransfer/Types.hs index 86ecdc5d5..ff70b8f13 100644 --- a/src/Simplex/FileTransfer/Types.hs +++ b/src/Simplex/FileTransfer/Types.hs @@ -46,6 +46,7 @@ import Simplex.Messaging.Encoding import Simplex.Messaging.Encoding.String import Simplex.Messaging.Parsers import Simplex.Messaging.Protocol (XFTPServer) +import Simplex.Messaging.Util (safeDecodeUtf8, (<$$>)) import System.FilePath (()) type RcvFileId = ByteString -- Agent entity ID @@ -65,7 +66,8 @@ data FileHeader = FileHeader instance Encoding FileHeader where smpEncode FileHeader {fileName, fileExtra} = smpEncode (fileName, fileExtra) smpP = do - (fileName, fileExtra) <- smpP + fileName <- safeDecodeUtf8 <$> smpP + fileExtra <- safeDecodeUtf8 <$$> smpP pure FileHeader {fileName, fileExtra} type DBRcvFileId = Int64 diff --git a/src/Simplex/Messaging/Agent.hs b/src/Simplex/Messaging/Agent.hs index 25ad87b21..05e931496 100644 --- a/src/Simplex/Messaging/Agent.hs +++ b/src/Simplex/Messaging/Agent.hs @@ -65,6 +65,7 @@ module Simplex.Messaging.Agent setConnShortLink, deleteConnShortLink, getConnShortLink, + getConnLinkPrivKey, deleteLocalInvShortLink, changeConnectionUser, prepareConnectionToJoin, @@ -365,9 +366,9 @@ setConnShortLinkAsync :: AgentClient -> ACorrId -> ConnId -> UserConnLinkData 'C setConnShortLinkAsync c = withAgentEnv c .:: setConnShortLinkAsync' c {-# INLINE setConnShortLinkAsync #-} --- | Get and verify data from short link (LGET/LKEY command) asynchronously, synchronous response is new connection id -getConnShortLinkAsync :: AgentClient -> UserId -> ACorrId -> ConnShortLink 'CMContact -> AE ConnId -getConnShortLinkAsync c = withAgentEnv c .:. getConnShortLinkAsync' c +-- | Get and verify data from short link (LGET/LKEY command) asynchronously, synchronous response is new/passed connection id +getConnShortLinkAsync :: AgentClient -> UserId -> ACorrId -> Maybe ConnId -> ConnShortLink 'CMContact -> AE ConnId +getConnShortLinkAsync c = withAgentEnv c .:: getConnShortLinkAsync' c {-# INLINE getConnShortLinkAsync #-} -- | Join SMP agent connection (JOIN command) asynchronously, synchronous response is new connection id. @@ -412,10 +413,11 @@ createConnection c nm userId enableNtfs checkNotices = withAgentEnv c .::. newCo {-# INLINE createConnection #-} -- | Prepare connection link for contact mode (no network call). --- Returns root key pair (for signing OwnerAuth), the created link, and internal params. +-- Caller provides root signing key pair and link entity ID. +-- Returns the created link and internal params. -- The link address is fully determined at this point. -prepareConnectionLink :: AgentClient -> UserId -> Maybe ByteString -> Bool -> Maybe CRClientData -> AE (C.KeyPairEd25519, CreatedConnLink 'CMContact, PreparedLinkParams) -prepareConnectionLink c userId linkEntityId checkNotices = withAgentEnv c . prepareConnectionLink' c userId linkEntityId checkNotices +prepareConnectionLink :: AgentClient -> UserId -> C.KeyPairEd25519 -> ByteString -> Bool -> Maybe CRClientData -> AE (CreatedConnLink 'CMContact, PreparedLinkParams) +prepareConnectionLink c userId rootKey linkEntityId checkNotices = withAgentEnv c . prepareConnectionLink' c userId rootKey linkEntityId checkNotices {-# INLINE prepareConnectionLink #-} -- | Create connection for prepared link (single network call). @@ -438,6 +440,10 @@ getConnShortLink :: AgentClient -> NetworkRequestMode -> UserId -> ConnShortLink getConnShortLink c = withAgentEnv c .:. getConnShortLink' c {-# INLINE getConnShortLink #-} +getConnLinkPrivKey :: AgentClient -> ConnId -> AE (Maybe C.PrivateKeyEd25519) +getConnLinkPrivKey c = withAgentEnv c . getConnLinkPrivKey' c +{-# INLINE getConnLinkPrivKey #-} + -- | This irreversibly deletes short link data, and it won't be retrievable again deleteLocalInvShortLink :: AgentClient -> ConnShortLink 'CMInvitation -> AE () deleteLocalInvShortLink c = withAgentEnv c . deleteLocalInvShortLink' c @@ -828,7 +834,7 @@ setUserService' c userId enable = do let changed = enable /= wasEnabled when changed $ TM.insert userId enable $ useClientServices c pure (True, changed) - unless ok $ throwE $ CMD PROHIBITED "setNetworkConfig" + unless ok $ throwE $ CMD PROHIBITED "setUserService" when (changed && not enable) $ withStore' c (`deleteClientServices` userId) newConnAsync :: ConnectionModeI c => AgentClient -> UserId -> ACorrId -> Bool -> SConnectionMode c -> CR.InitialKeys -> SubscriptionMode -> AM ConnId @@ -958,23 +964,22 @@ newConn c nm userId enableNtfs checkNotices cMode linkData_ clientData pqInitKey `catchE` \e -> withStore' c (`deleteConnRecord` connId) >> throwE e -- | Prepare connection link for contact mode (no network, no database). --- Generates all cryptographic material and returns the link that will be created. -prepareConnectionLink' :: AgentClient -> UserId -> Maybe ByteString -> Bool -> Maybe CRClientData -> AM (C.KeyPairEd25519, CreatedConnLink 'CMContact, PreparedLinkParams) -prepareConnectionLink' c userId linkEntityId checkNotices clientData = do +-- Caller provides root signing key pair and link entity ID. +prepareConnectionLink' :: AgentClient -> UserId -> C.KeyPairEd25519 -> ByteString -> Bool -> Maybe CRClientData -> AM (CreatedConnLink 'CMContact, PreparedLinkParams) +prepareConnectionLink' c userId rootKey@(_, plpRootPrivKey) linkEntityId checkNotices clientData = do g <- asks random plpSrvWithAuth@(ProtoServerWithAuth srv _) <- getSMPServer c userId when checkNotices $ checkClientNotices c plpSrvWithAuth AgentConfig {smpClientVRange, smpAgentVRange} <- asks config plpNonce@(C.CbNonce corrId) <- atomically $ C.randomCbNonce g - sigKeys@(_, plpRootPrivKey) <- atomically $ C.generateKeyPair g plpQueueE2EKeys@(e2ePubKey, _) <- atomically $ C.generateKeyPair g let sndId = SMP.EntityId $ B.take 24 $ C.sha3_384 corrId qUri = SMPQueueUri smpClientVRange $ SMPQueueAddress srv sndId e2ePubKey (Just QMContact) connReq = CRContactUri $ ConnReqUriData SSSimplex smpAgentVRange [qUri] clientData - (plpLinkKey, plpSignedFixedData) = SL.encodeSignFixedData sigKeys smpAgentVRange connReq linkEntityId + (plpLinkKey, plpSignedFixedData) = SL.encodeSignFixedData rootKey smpAgentVRange connReq (Just linkEntityId) ccLink = CCLink connReq $ Just $ CSLContact SLSServer CCTContact srv plpLinkKey params = PreparedLinkParams {plpNonce, plpQueueE2EKeys, plpLinkKey, plpRootPrivKey, plpSignedFixedData, plpSrvWithAuth} - pure (sigKeys, ccLink, params) + pure (ccLink, params) -- | Create connection for prepared link (single network call). createConnectionForLink' :: AgentClient -> NetworkRequestMode -> UserId -> Bool -> CreatedConnLink 'CMContact -> PreparedLinkParams -> UserConnLinkData 'CMContact -> CR.InitialKeys -> SubscriptionMode -> AM ConnId @@ -1041,14 +1046,22 @@ setConnShortLinkAsync' c corrId connId userLinkData clientData = _ -> throwE $ CMD PROHIBITED "setConnShortLinkAsync: invalid connection or mode" enqueueCommand c corrId connId (Just srv) $ AClientCommand $ LSET userLinkData clientData -getConnShortLinkAsync' :: AgentClient -> UserId -> ACorrId -> ConnShortLink 'CMContact -> AM ConnId -getConnShortLinkAsync' c userId corrId shortLink@(CSLContact _ _ srv _) = do - g <- asks random - connId <- withStore c $ \db -> do - -- server is created so the command is processed in server queue, - -- not blocking other "no server" commands - void $ createServer db srv - prepareNewConn db g +getConnShortLinkAsync' :: AgentClient -> UserId -> ACorrId -> Maybe ConnId -> ConnShortLink 'CMContact -> AM ConnId +getConnShortLinkAsync' c userId corrId connId_ shortLink@(CSLContact _ _ srv _) = do + connId <- case connId_ of + Just existingConnId -> do + -- connId and srv can be unrelated: connId is used as "mailbox" for LDATA delivery, + -- while srv is the short link's server for the LGET request. + -- E.g., owner's relay connection (connId, on server A) fetches relay's group link data (srv = server B). + -- This works because enqueueCommand stores (connId, srv) independently in the commands table, + -- the network request targets srv, and event delivery uses connId via corrId correlation. + withStore' c $ \db -> void $ createServer db srv + pure existingConnId + Nothing -> do + g <- asks random + withStore c $ \db -> do + void $ createServer db srv + prepareNewConn db g enqueueCommand c corrId connId (Just srv) $ AClientCommand $ LGET shortLink pure connId where @@ -1119,6 +1132,14 @@ deleteConnShortLink' c nm connId cMode = (RcvConnection _ rq, SCMInvitation) -> deleteQueueLink c nm rq _ -> throwE $ CMD PROHIBITED "deleteConnShortLink: not contact address" +getConnLinkPrivKey' :: AgentClient -> ConnId -> AM (Maybe C.PrivateKeyEd25519) +getConnLinkPrivKey' c connId = do + SomeConn _ conn <- withStore c (`getConn` connId) + pure $ case conn of + ContactConnection _ rq -> linkPrivSigKey <$> shortLink rq + RcvConnection _ rq -> linkPrivSigKey <$> shortLink rq + _ -> Nothing + -- TODO [short links] remove 1-time invitation data and link ID from the server after the message is sent. getConnShortLink' :: forall c. AgentClient -> NetworkRequestMode -> UserId -> ConnShortLink c -> AM (FixedLinkData c, ConnLinkData c) getConnShortLink' c nm userId = \case @@ -1589,8 +1610,7 @@ subscribeAllConnections' :: AgentClient -> Bool -> Maybe UserId -> AM () subscribeAllConnections' c onlyNeeded activeUserId_ = handleErr $ do userSrvs <- withStore' c (`getSubscriptionServers` onlyNeeded) unless (null userSrvs) $ do - maxPending <- asks $ maxPendingSubscriptions . config - currPending <- newTVarIO 0 + batchSize <- asks $ subsBatchSize . config let userSrvs' = case activeUserId_ of Just activeUserId -> sortOn (\(uId, _) -> if uId == activeUserId then 0 else 1 :: Int) userSrvs Nothing -> userSrvs @@ -1602,7 +1622,7 @@ subscribeAllConnections' c onlyNeeded activeUserId_ = handleErr $ do -- On successful service subscription, only unassociated queues will be subscribed. userSrvs2 <- withStore' c $ \db -> mapM (getService db useServices) userSrvs' userSrvs3 <- lift $ mapConcurrently subscribeService userSrvs2 - rs <- lift $ mapConcurrently (subscribeUserServer maxPending currPending) userSrvs3 + rs <- lift $ mapConcurrently (subscribeUserServer batchSize) userSrvs3 let (errs, oks) = partitionEithers rs logInfo $ "subscribed " <> tshow (sum oks) <> " queues" forM_ (L.nonEmpty errs) $ notifySub c . ERRS . L.map ("",) @@ -1633,24 +1653,22 @@ subscribeAllConnections' c onlyNeeded activeUserId_ = handleErr $ do Left e -> do atomically $ writeTBQueue (subQ c) ("", "", AEvt SAEConn $ ERR e) if clientServiceError e - then unassocQueues + then False <$ withStore' c (\db -> unassocUserServerRcvQueueSubs' db userId srv) else pure True where unassocQueues :: AM Bool - unassocQueues = False <$ withStore' c (\db -> unassocUserServerRcvQueueSubs' db userId srv) + unassocQueues = False <$ withStore' c (\db -> removeRcvServiceAssocs db userId srv) _ -> pure False - subscribeUserServer :: Int -> TVar Int -> ((UserId, SMPServer), ServiceAssoc) -> AM' (Either AgentErrorType Int) - subscribeUserServer maxPending currPending ((userId, srv), hasService) = do - atomically $ whenM ((maxPending <=) <$> readTVar currPending) retry - tryAllErrors' $ do - qs <- withStore' c $ \db -> do - qs <- getUserServerRcvQueueSubs db userId srv onlyNeeded hasService - unless (null qs) $ atomically $ modifyTVar' currPending (+ length qs) -- update before leaving transaction - pure qs - let n = length qs - unless (null qs) $ lift $ subscribe qs `E.finally` atomically (modifyTVar' currPending $ subtract n) - pure n + subscribeUserServer :: Int -> ((UserId, SMPServer), ServiceAssoc) -> AM' (Either AgentErrorType Int) + subscribeUserServer batchSize ((userId, srv), hasService) = tryAllErrors' $ loop 0 Nothing where + loop !n cursor_ = do + qs <- withStore' c $ \db -> getUserServerRcvQueueSubs db userId srv onlyNeeded hasService batchSize cursor_ + if null qs then pure n else do + lift $ subscribe qs + let n' = n + length qs + lastRcvId = Just $ queueId $ last qs + if length qs < batchSize then pure n' else loop n' lastRcvId subscribe qs = do rs <- subscribeUserServerQueues c userId srv qs ns <- asks ntfSupervisor @@ -3222,18 +3240,28 @@ processSMPTransmissions c@AgentClient {subQ} (tSess@(userId, srv, _), THandlePar pure conn'' | otherwise = pure conn' Right Nothing -> prohibited "msg: bad agent msg" >> ack - Left e@(AGENT A_DUPLICATE) -> do + Left e@(AGENT A_DUPLICATE {}) -> do atomically $ incSMPServerStat c userId srv recvDuplicates withStore' c (\db -> getLastMsg db connId srvMsgId) >>= \case Just RcvMsg {internalId, msgMeta, msgBody = agentMsgBody, userAck} | userAck -> ackDel internalId - | otherwise -> - liftEither (parse smpP (AGENT A_MESSAGE) agentMsgBody) >>= \case - AgentMessage _ (A_MSG body) -> do - logServer "<--" c srv rId $ "MSG :" <> logSecret' srvMsgId - notify $ MSG msgMeta msgFlags body - pure ACKPending - _ -> ack + | otherwise -> do + attempts <- withStore' c $ \db -> incMsgRcvAttempts db connId internalId + AgentConfig {rcvExpireCount, rcvExpireInterval} <- asks config + let firstTs = snd $ recipient msgMeta + brokerTs = snd $ broker msgMeta + now <- liftIO getCurrentTime + if attempts >= rcvExpireCount && diffUTCTime now firstTs >= rcvExpireInterval + then do + notify $ ERR (AGENT $ A_DUPLICATE $ Just DroppedMsg {brokerTs, attempts}) + ackDel internalId + else + liftEither (parse smpP (AGENT A_MESSAGE) agentMsgBody) >>= \case + AgentMessage _ (A_MSG body) -> do + logServer "<--" c srv rId $ "MSG :" <> logSecret' srvMsgId + notify $ MSG msgMeta msgFlags body + pure ACKPending + _ -> ack _ -> checkDuplicateHash e encryptedMsgHash >> ack Left (AGENT (A_CRYPTO e)) -> do atomically $ incSMPServerStat c userId srv recvCryptoErrs diff --git a/src/Simplex/Messaging/Agent/Client.hs b/src/Simplex/Messaging/Agent/Client.hs index 46a441aaf..1039c5d75 100644 --- a/src/Simplex/Messaging/Agent/Client.hs +++ b/src/Simplex/Messaging/Agent/Client.hs @@ -625,9 +625,7 @@ getServiceCredentials c userId srv = Just service -> pure service Nothing -> do cred <- genCredentials g Nothing (25, 24 * 999999) "simplex" - let tlsCreds = tlsCredentials [cred] - createClientService db userId srv tlsCreds - pure (tlsCreds, Nothing) + createClientService db userId srv $ tlsCredentials [cred] serviceSignKey <- liftEitherWith INTERNAL $ C.x509ToPrivate' $ snd serviceCreds let creds = ServiceCredentials {serviceRole = SRMessaging, serviceCreds, serviceCertHash = XV.Fingerprint kh, serviceSignKey} pure (creds, serviceId_) @@ -810,13 +808,17 @@ resubscribeSMPSession c@AgentClient {smpSubWorkers, workerSeq} tSess = do (pure Nothing) -- prevent race with cleanup and adding pending queues in another call (Just <$> getSessVar workerSeq tSess smpSubWorkers ts) newSubWorker v = do - a <- async $ void (E.tryAny runSubWorker) >> atomically (cleanup v) + a <- async $ void $ E.tryAny $ runSubWorker v atomically $ putTMVar (sessionVar v) a - runSubWorker = do + runSubWorker v = do ri <- asks $ reconnectInterval . config withRetryForeground ri isForeground (isNetworkOnline c) $ \_ loop -> do - (pendingSubs, pendingSS) <- atomically $ SS.getPendingSubs tSess $ currentSubs c - unless (M.null pendingSubs && isNothing pendingSS) $ do + pending_ <- atomically $ do + pending@(pendingSubs, pendingSS) <- SS.getPendingSubs tSess $ currentSubs c + if M.null pendingSubs && isNothing pendingSS + then cleanup v $> Nothing + else pure $ Just pending + forM_ pending_ $ \(pendingSubs, pendingSS) -> do liftIO $ waitUntilForeground c liftIO $ waitForUserNetwork c mapM_ (handleNotify . void . runExceptT . resubscribeClientService c tSess) pendingSS @@ -1659,9 +1661,15 @@ checkQueues c = fmap partitionEithers . mapM checkQueue resubscribeSessQueues :: AgentClient -> SMPTransportSession -> [RcvQueueSub] -> AM' () resubscribeSessQueues _ _ [] = pure () resubscribeSessQueues c tSess qs = do + batchSize <- asks $ subsBatchSize . config (errs, qs_) <- checkQueues c qs - forM_ (L.nonEmpty qs_) $ \qs' -> void $ subscribeSessQueues_ c True (tSess, qs') + subscribeChunks $ toChunks batchSize qs_ forM_ (L.nonEmpty errs) $ notifySub c . ERRS . L.map (first qConnId) + where + subscribeChunks [] = pure () + subscribeChunks (qs' : rest) = do + (_, active) <- subscribeSessQueues_ c True (tSess, qs') + when active $ subscribeChunks rest subscribeSessQueues_ :: AgentClient -> Bool -> (SMPTransportSession, NonEmpty RcvQueueSub) -> AM' (BatchResponses RcvQueueSub AgentErrorType (Maybe ServiceId), Bool) subscribeSessQueues_ c withEvents qs = sendClientBatch_ "SUB" False subscribe_ c NRMBackground qs @@ -1710,7 +1718,7 @@ processRcvServiceAssocs :: SMPQueue q => AgentClient -> [q] -> AM' () processRcvServiceAssocs _ [] = pure () processRcvServiceAssocs c serviceQs = withStore' c (`setRcvServiceAssocs` serviceQs) `catchAllErrors'` \e -> do - logError $ "processClientNotices error: " <> tshow e + logError $ "processRcvServiceAssocs error: " <> tshow e notifySub' c "" $ ERR e processClientNotices :: AgentClient -> SMPTransportSession -> [(RcvQueueSub, Maybe ClientNotice)] -> AM' () @@ -1726,20 +1734,33 @@ processClientNotices c@AgentClient {presetServers} tSess notices = do resubscribeClientService :: AgentClient -> SMPTransportSession -> ServiceSub -> AM ServiceSubResult resubscribeClientService c tSess@(userId, srv, _) serviceSub = - tryAllErrors (withServiceClient c tSess $ \smp _ -> subscribeClientService_ c True tSess smp serviceSub) >>= \case + tryAllErrors (withServiceClient c tSess subscribeOrUpdate) >>= \case Right r@(ServiceSubResult e _) -> case e of - Just SSErrorServiceId {} -> unassocSubscribeQueues $> r + Just SSErrorServiceId {} -> + r <$ withStore' c (\db -> removeRcvServiceAssocs db userId srv) _ -> pure r Left e -> do - when (clientServiceError e) $ unassocSubscribeQueues atomically $ writeTBQueue (subQ c) ("", "", AEvt SAEConn $ ERR e) + when (clientServiceError e) $ do + atomically $ SS.deleteServiceSub tSess $ currentSubs c + unassocSubscribeQueues throwE e where + subscribeOrUpdate smp connServiceId + | connServiceId == SMP.smpServiceId serviceSub = + subscribeClientService_ c True tSess smp serviceSub + | otherwise = do + let newServiceSub = SMP.ServiceSub connServiceId 0 mempty + sessId = sessionId $ thParams smp + r = serviceSubResult serviceSub newServiceSub + atomically $ whenM (activeClientSession c tSess sessId) $ + SS.setActiveServiceSub tSess sessId newServiceSub $ currentSubs c + notifySub c $ SERVICE_UP srv r + pure r unassocSubscribeQueues = do qs <- withStore' c $ \db -> unassocUserServerRcvQueueSubs db userId srv void $ lift $ subscribeUserServerQueues c userId srv qs --- TODO [certs rcv] update service in the database if it has different ID and re-associate queues, and send event subscribeClientService :: AgentClient -> Bool -> UserId -> SMPServer -> ServiceSub -> AM ServiceSubResult subscribeClientService c withEvent userId srv (ServiceSub _ n idsHash) = withServiceClient c tSess $ \smp smpServiceId -> do @@ -2213,7 +2234,7 @@ cryptoError :: C.CryptoError -> AgentErrorType cryptoError = \case C.CryptoLargeMsgError -> CMD LARGE "CryptoLargeMsgError" C.CryptoHeaderError _ -> AGENT A_MESSAGE -- parsing error - C.CERatchetDuplicateMessage -> AGENT A_DUPLICATE + C.CERatchetDuplicateMessage -> AGENT $ A_DUPLICATE Nothing C.AESDecryptError -> c DECRYPT_AES C.CBDecryptError -> c DECRYPT_CB C.CERatchetHeader -> c RATCHET_HEADER diff --git a/src/Simplex/Messaging/Agent/Env/SQLite.hs b/src/Simplex/Messaging/Agent/Env/SQLite.hs index 900323ede..8e5bf0880 100644 --- a/src/Simplex/Messaging/Agent/Env/SQLite.hs +++ b/src/Simplex/Messaging/Agent/Env/SQLite.hs @@ -169,10 +169,12 @@ data AgentConfig = AgentConfig ntfBatchSize :: Int, ntfSubFirstCheckInterval :: NominalDiffTime, ntfSubCheckInterval :: NominalDiffTime, - maxPendingSubscriptions :: Int, + subsBatchSize :: Int, caCertificateFile :: FilePath, privateKeyFile :: FilePath, certificateFile :: FilePath, + rcvExpireCount :: Int, + rcvExpireInterval :: NominalDiffTime, e2eEncryptVRange :: VersionRangeE2E, smpAgentVRange :: VersionRangeSMPA, smpClientVRange :: VersionRangeSMPC @@ -242,12 +244,14 @@ defaultAgentConfig = ntfBatchSize = 150, ntfSubFirstCheckInterval = nominalDay, ntfSubCheckInterval = 3 * nominalDay, - maxPendingSubscriptions = 35000, + subsBatchSize = 1350, -- CA certificate private key is not needed for initialization -- ! we do not generate these caCertificateFile = "/etc/opt/simplex-agent/ca.crt", privateKeyFile = "/etc/opt/simplex-agent/agent.key", certificateFile = "/etc/opt/simplex-agent/agent.crt", + rcvExpireCount = 8, + rcvExpireInterval = nominalDay, e2eEncryptVRange = supportedE2EEncryptVRange, smpAgentVRange = supportedSMPAgentVRange, smpClientVRange = supportedSMPClientVRange diff --git a/src/Simplex/Messaging/Agent/Protocol.hs b/src/Simplex/Messaging/Agent/Protocol.hs index 6c5833e66..688381eeb 100644 --- a/src/Simplex/Messaging/Agent/Protocol.hs +++ b/src/Simplex/Messaging/Agent/Protocol.hs @@ -143,6 +143,7 @@ module Simplex.Messaging.Agent.Protocol ConnectionErrorType (..), BrokerErrorType (..), SMPAgentError (..), + DroppedMsg (..), AgentCryptoError (..), cryptoErrToSyncState, ATransmission, @@ -798,6 +799,12 @@ data MsgMeta = MsgMeta } deriving (Eq, Show) +data DroppedMsg = DroppedMsg + { brokerTs :: UTCTime, + attempts :: Int + } + deriving (Eq, Show) + data SMPConfirmation = SMPConfirmation { -- | sender's public key to use for authentication of sender's commands at the recepient's server senderKey :: Maybe SndPublicAuthKey, @@ -2051,12 +2058,13 @@ data SMPAgentError A_LINK {linkErr :: String} | -- | cannot decrypt message A_CRYPTO {cryptoErr :: AgentCryptoError} - | -- | duplicate message - this error is detected by ratchet decryption - this message will be ignored and not shown - -- it may also indicate a loss of ratchet synchronization (when only one message is sent via copied ratchet) - A_DUPLICATE + | -- | duplicate message - this error is detected by ratchet decryption - this message will be ignored and not shown. + -- it may also indicate a loss of ratchet synchronization (when only one message is sent via copied ratchet). + -- when message is dropped after too many reception attempts, DroppedMsg is included. + A_DUPLICATE {droppedMsg_ :: Maybe DroppedMsg} | -- | error in the message to add/delete/etc queue in connection A_QUEUE {queueErr :: String} - deriving (Eq, Read, Show, Exception) + deriving (Eq, Show, Exception) data AgentCryptoError = -- | AES decryption error @@ -2166,6 +2174,8 @@ $(J.deriveJSON (sumTypeJSON id) ''ConnectionErrorType) $(J.deriveJSON (sumTypeJSON id) ''AgentCryptoError) +$(J.deriveJSON defaultJSON ''DroppedMsg) + $(J.deriveJSON (sumTypeJSON id) ''SMPAgentError) $(J.deriveJSON (sumTypeJSON id) ''AgentErrorType) diff --git a/src/Simplex/Messaging/Agent/Store/AgentStore.hs b/src/Simplex/Messaging/Agent/Store/AgentStore.hs index 32720dd85..6a369ee2c 100644 --- a/src/Simplex/Messaging/Agent/Store/AgentStore.hs +++ b/src/Simplex/Messaging/Agent/Store/AgentStore.hs @@ -140,6 +140,7 @@ module Simplex.Messaging.Agent.Store.AgentStore setMsgUserAck, getRcvMsg, getLastMsg, + incMsgRcvAttempts, checkRcvMsgHashExists, getRcvMsgBrokerTs, deleteMsg, @@ -410,23 +411,23 @@ deleteUsersWithoutConns db = do forM_ userIds $ DB.execute db "DELETE FROM users WHERE user_id = ?" . Only pure userIds -createClientService :: DB.Connection -> UserId -> SMPServer -> (C.KeyHash, TLS.Credential) -> IO () -createClientService db userId srv (kh, (cert, pk)) = do +createClientService :: DB.Connection -> UserId -> SMPServer -> (C.KeyHash, TLS.Credential) -> IO ((C.KeyHash, TLS.Credential), Maybe ServiceId) +createClientService db userId srv tlsCreds@(kh, (cert, pk)) = do serverKeyHash_ <- createServer db srv - DB.execute - db - [sql| - INSERT INTO client_services - (user_id, host, port, server_key_hash, service_cert_hash, service_cert, service_priv_key) - VALUES (?,?,?,?,?,?,?) - ON CONFLICT (user_id, host, port, server_key_hash) - DO UPDATE SET - service_cert_hash = EXCLUDED.service_cert_hash, - service_cert = EXCLUDED.service_cert, - service_priv_key = EXCLUDED.service_priv_key, - service_id = NULL - |] - (userId, host srv, port srv, serverKeyHash_, kh, cert, pk) + (rs :: [Only Int]) <- + DB.query + db + [sql| + INSERT INTO client_services + (user_id, host, port, server_key_hash, service_cert_hash, service_cert, service_priv_key) + VALUES (?,?,?,?,?,?,?) + ON CONFLICT (user_id, host, port, server_key_hash) DO NOTHING + RETURNING 1 + |] + (userId, host srv, port srv, serverKeyHash_, kh, cert, pk) + if null rs + then fromMaybe (tlsCreds, Nothing) <$> getClientServiceCredentials db userId srv + else pure (tlsCreds, Nothing) getClientServiceCredentials :: DB.Connection -> UserId -> SMPServer -> IO (Maybe ((C.KeyHash, TLS.Credential), Maybe ServiceId)) getClientServiceCredentials db userId srv = @@ -575,7 +576,7 @@ checkConfirmedSndQueueExists_ db SndQueue {server, sndId} = DB.query db ( "SELECT 1 FROM snd_queues WHERE host = ? AND port = ? AND snd_id = ? AND status != ? LIMIT 1" -#if defined(dpPostgres) +#if defined(dbPostgres) <> " FOR UPDATE" #endif ) @@ -1226,6 +1227,19 @@ toRcvMsg ((agentMsgId, internalTs, brokerId, brokerTs) :. (sndMsgId, integrity, msgReceipt = MsgReceipt <$> rcptInternalId_ <*> rcptStatus_ in RcvMsg {internalId = InternalId agentMsgId, msgMeta, msgType, msgBody, internalHash, msgReceipt, userAck} +incMsgRcvAttempts :: DB.Connection -> ConnId -> InternalId -> IO Int +incMsgRcvAttempts db connId (InternalId msgId) = + fromOnly . head + <$> DB.query + db + [sql| + UPDATE rcv_messages + SET receive_attempts = receive_attempts + 1 + WHERE conn_id = ? AND internal_id = ? + RETURNING receive_attempts + |] + (connId, msgId) + checkRcvMsgHashExists :: DB.Connection -> ConnId -> ByteString -> IO Bool checkRcvMsgHashExists db connId hash = maybeFirstRow' False fromOnlyBI $ @@ -2336,14 +2350,14 @@ getSubscriptionServers db onlyNeeded = toUserServer (userId, host, port, keyHash) = (userId, SMPServer host port keyHash) -- TODO [certs rcv] check index for getting queues with service present -getUserServerRcvQueueSubs :: DB.Connection -> UserId -> SMPServer -> Bool -> ServiceAssoc -> IO [RcvQueueSub] -getUserServerRcvQueueSubs db userId (SMPServer h p kh) onlyNeeded hasService = - map toRcvQueueSub - <$> DB.query - db - (rcvQueueSubQuery <> toSubscribe <> " c.deleted = 0 AND q.deleted = 0 AND c.user_id = ? AND q.host = ? AND q.port = ? AND COALESCE(q.server_key_hash, s.key_hash) = ?" <> serviceCond) - (userId, h, p, kh) +getUserServerRcvQueueSubs :: DB.Connection -> UserId -> SMPServer -> Bool -> ServiceAssoc -> Int -> Maybe SMP.RecipientId -> IO [RcvQueueSub] +getUserServerRcvQueueSubs db userId (SMPServer h p kh) onlyNeeded hasService limit cursor_ = + map toRcvQueueSub <$> case cursor_ of + Nothing -> DB.query db (q <> orderLimit) (userId, h, p, kh, limit) + Just cursor -> DB.query db (q <> " AND q.rcv_id > ? " <> orderLimit) (userId, h, p, kh, cursor, limit) where + q = rcvQueueSubQuery <> toSubscribe <> " c.deleted = 0 AND q.deleted = 0 AND c.user_id = ? AND q.host = ? AND q.port = ? AND COALESCE(q.server_key_hash, s.key_hash) = ?" <> serviceCond + orderLimit = " ORDER BY q.rcv_id LIMIT ?" toSubscribe | onlyNeeded = " WHERE q.to_subscribe = 1 AND " | otherwise = " WHERE " @@ -2354,18 +2368,28 @@ getUserServerRcvQueueSubs db userId (SMPServer h p kh) onlyNeeded hasService = unassocUserServerRcvQueueSubs :: DB.Connection -> UserId -> SMPServer -> IO [RcvQueueSub] unassocUserServerRcvQueueSubs db userId srv@(SMPServer h p kh) = do deleteClientService db userId srv +#if defined(dbPostgres) map toRcvQueueSub <$> DB.query db - (removeRcvAssocsQuery <> " " <> returningColums) + (removeRcvAssocsQuery <> " " <> returningColumns) (h, p, userId, kh) where - returningColums = + returningColumns = [sql| RETURNING c.user_id, rcv_queues.conn_id, rcv_queues.host, rcv_queues.port, COALESCE(rcv_queues.server_key_hash, s.key_hash), rcv_queues.rcv_id, rcv_queues.rcv_private_key, rcv_queues.status, c.enable_ntfs, rcv_queues.client_notice_id, rcv_queues.rcv_queue_id, rcv_queues.rcv_primary, rcv_queues.replace_rcv_queue_id |] +#else + qs <- map toRcvQueueSub + <$> DB.query + db + (rcvQueueSubQuery <> " WHERE c.user_id = ? AND q.host = ? AND q.port = ? AND COALESCE(q.server_key_hash, s.key_hash) = ? AND q.rcv_service_assoc = 1") + (userId, h, p, kh) + DB.execute db removeRcvAssocsQuery (h, p, userId, kh) + pure qs +#endif unassocUserServerRcvQueueSubs' :: DB.Connection -> UserId -> SMPServer -> IO () unassocUserServerRcvQueueSubs' db userId srv@(SMPServer h p kh) = do @@ -2376,7 +2400,7 @@ unsetQueuesToSubscribe :: DB.Connection -> IO () unsetQueuesToSubscribe db = DB.execute_ db "UPDATE rcv_queues SET to_subscribe = 0 WHERE to_subscribe = 1" setRcvServiceAssocs :: SMPQueue q => DB.Connection -> [q] -> IO () -setRcvServiceAssocs db rqs = +setRcvServiceAssocs db rqs = do #if defined(dbPostgres) DB.execute db "UPDATE rcv_queues SET rcv_service_assoc = 1 WHERE rcv_id IN ?" $ Only $ In (map queueId rqs) #else diff --git a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/App.hs b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/App.hs index 862ce7a1c..b2ac33a68 100644 --- a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/App.hs +++ b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/App.hs @@ -11,7 +11,8 @@ import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20250702_conn_invitati import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20251009_queue_to_subscribe import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20251010_client_notices import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20251230_strict_tables -import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260115_service_certs +import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260410_receive_attempts +import Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260411_service_certs import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Text, Maybe Text)] @@ -23,7 +24,8 @@ schemaMigrations = ("20251009_queue_to_subscribe", m20251009_queue_to_subscribe, Just down_m20251009_queue_to_subscribe), ("20251010_client_notices", m20251010_client_notices, Just down_m20251010_client_notices), ("20251230_strict_tables", m20251230_strict_tables, Just down_m20251230_strict_tables), - ("20260115_service_certs", m20260115_service_certs, Just down_m20260115_service_certs) + ("20260410_receive_attempts", m20260410_receive_attempts, Just down_m20260410_receive_attempts), + ("20260411_service_certs", m20260411_service_certs, Just down_m20260411_service_certs) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260410_receive_attempts.hs b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260410_receive_attempts.hs new file mode 100644 index 000000000..15fb91aca --- /dev/null +++ b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260410_receive_attempts.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260410_receive_attempts where + +import Data.Text (Text) +import Text.RawString.QQ (r) + +m20260410_receive_attempts :: Text +m20260410_receive_attempts = + [r| +ALTER TABLE rcv_messages ADD COLUMN receive_attempts SMALLINT NOT NULL DEFAULT 0; +|] + +down_m20260410_receive_attempts :: Text +down_m20260410_receive_attempts = + [r| +ALTER TABLE rcv_messages DROP COLUMN receive_attempts; +|] diff --git a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260115_service_certs.hs b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260411_service_certs.hs similarity index 93% rename from src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260115_service_certs.hs rename to src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260411_service_certs.hs index a4e774d3e..bb2d9f3d9 100644 --- a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260115_service_certs.hs +++ b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/M20260411_service_certs.hs @@ -1,14 +1,14 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} -module Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260115_service_certs where +module Simplex.Messaging.Agent.Store.Postgres.Migrations.M20260411_service_certs where import Data.Text (Text) import Simplex.Messaging.Agent.Store.Postgres.Migrations.Util import Text.RawString.QQ (r) -m20260115_service_certs :: Text -m20260115_service_certs = +m20260411_service_certs :: Text +m20260411_service_certs = createXorHashFuncs <> [r| CREATE TABLE client_services( user_id BIGINT NOT NULL REFERENCES users ON UPDATE RESTRICT ON DELETE CASCADE, @@ -92,8 +92,8 @@ AFTER UPDATE ON rcv_queues FOR EACH ROW EXECUTE PROCEDURE on_rcv_queue_update(); |] -down_m20260115_service_certs :: Text -down_m20260115_service_certs = +down_m20260411_service_certs :: Text +down_m20260411_service_certs = [r| DROP TRIGGER tr_rcv_queue_insert ON rcv_queues; DROP TRIGGER tr_rcv_queue_delete ON rcv_queues; diff --git a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/agent_postgres_schema.sql b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/agent_postgres_schema.sql index e6c695808..731a021ee 100644 --- a/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/agent_postgres_schema.sql +++ b/src/Simplex/Messaging/Agent/Store/Postgres/Migrations/agent_postgres_schema.sql @@ -527,7 +527,8 @@ CREATE TABLE smp_agent_test_protocol_schema.rcv_messages ( external_prev_snd_hash bytea NOT NULL, integrity bytea NOT NULL, user_ack smallint DEFAULT 0, - rcv_queue_id bigint NOT NULL + rcv_queue_id bigint NOT NULL, + receive_attempts smallint DEFAULT 0 NOT NULL ); diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/App.hs b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/App.hs index b2738269c..bfdab2729 100644 --- a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/App.hs +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/App.hs @@ -47,7 +47,8 @@ import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20250702_conn_invitation import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20251009_queue_to_subscribe import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20251010_client_notices import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20251230_strict_tables -import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260115_service_certs +import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260410_receive_attempts +import Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260411_service_certs import Simplex.Messaging.Agent.Store.Shared (Migration (..)) schemaMigrations :: [(String, Query, Maybe Query)] @@ -95,7 +96,8 @@ schemaMigrations = ("m20251009_queue_to_subscribe", m20251009_queue_to_subscribe, Just down_m20251009_queue_to_subscribe), ("m20251010_client_notices", m20251010_client_notices, Just down_m20251010_client_notices), ("m20251230_strict_tables", m20251230_strict_tables, Just down_m20251230_strict_tables), - ("m20260115_service_certs", m20260115_service_certs, Just down_m20260115_service_certs) + ("m20260410_receive_attempts", m20260410_receive_attempts, Just down_m20260410_receive_attempts), + ("m20260411_service_certs", m20260411_service_certs, Just down_m20260411_service_certs) ] -- | The list of migrations in ascending order by date diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260410_receive_attempts.hs b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260410_receive_attempts.hs new file mode 100644 index 000000000..72e20dcc6 --- /dev/null +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260410_receive_attempts.hs @@ -0,0 +1,18 @@ +{-# LANGUAGE QuasiQuotes #-} + +module Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260410_receive_attempts where + +import Database.SQLite.Simple (Query) +import Database.SQLite.Simple.QQ (sql) + +m20260410_receive_attempts :: Query +m20260410_receive_attempts = + [sql| +ALTER TABLE rcv_messages ADD COLUMN receive_attempts INTEGER NOT NULL DEFAULT 0; +|] + +down_m20260410_receive_attempts :: Query +down_m20260410_receive_attempts = + [sql| +ALTER TABLE rcv_messages DROP COLUMN receive_attempts; +|] diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260115_service_certs.hs b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260411_service_certs.hs similarity index 94% rename from src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260115_service_certs.hs rename to src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260411_service_certs.hs index 4572ba73a..9088d6315 100644 --- a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260115_service_certs.hs +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/M20260411_service_certs.hs @@ -1,12 +1,12 @@ {-# LANGUAGE QuasiQuotes #-} -module Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260115_service_certs where +module Simplex.Messaging.Agent.Store.SQLite.Migrations.M20260411_service_certs where import Database.SQLite.Simple (Query) import Database.SQLite.Simple.QQ (sql) -m20260115_service_certs :: Query -m20260115_service_certs = +m20260411_service_certs :: Query +m20260411_service_certs = [sql| CREATE TABLE client_services( user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE, @@ -76,8 +76,8 @@ BEGIN END; |] -down_m20260115_service_certs :: Query -down_m20260115_service_certs = +down_m20260411_service_certs :: Query +down_m20260411_service_certs = [sql| DROP TRIGGER tr_rcv_queue_insert; DROP TRIGGER tr_rcv_queue_delete; diff --git a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql index 2a6136d6b..e77582b92 100644 --- a/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql +++ b/src/Simplex/Messaging/Agent/Store/SQLite/Migrations/agent_schema.sql @@ -120,6 +120,7 @@ CREATE TABLE rcv_messages( integrity BLOB NOT NULL, user_ack INTEGER NULL DEFAULT 0, rcv_queue_id INTEGER CHECK(rcv_queue_id NOT NULL), + receive_attempts INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(conn_id, internal_rcv_id), FOREIGN KEY(conn_id, internal_id) REFERENCES messages ON DELETE CASCADE diff --git a/src/Simplex/Messaging/Client/Agent.hs b/src/Simplex/Messaging/Client/Agent.hs index 8dfd0e563..f9e956d0b 100644 --- a/src/Simplex/Messaging/Client/Agent.hs +++ b/src/Simplex/Messaging/Client/Agent.hs @@ -47,6 +47,7 @@ import Crypto.Random (ChaChaDRG) import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as B import Data.Constraint (Dict (..)) +import Data.Functor (($>)) import Data.List.NonEmpty (NonEmpty) import qualified Data.List.NonEmpty as L import Data.Map.Strict (Map) @@ -325,12 +326,16 @@ reconnectClient ca@SMPClientAgent {active, agentCfg, smpSubWorkers, workerSeq} s (Just <$> getSessVar workerSeq srv smpSubWorkers ts) newSubWorker :: SessionVar (Async ()) -> IO () newSubWorker v = do - a <- async $ void (E.try @E.SomeException runSubWorker) >> atomically (cleanup v) + a <- async $ void $ E.try @E.SomeException $ runSubWorker v atomically $ putTMVar (sessionVar v) a - runSubWorker = + runSubWorker v = withRetryInterval (reconnectInterval agentCfg) $ \_ loop -> do - subs <- getPending TM.lookupIO readTVarIO - unless (noPending subs) $ whenM (readTVarIO active) $ do + subs_ <- atomically $ do + s <- getPending TM.lookup readTVar + if noPending s + then cleanup v $> Nothing + else pure $ Just s + forM_ subs_ $ \subs -> whenM (readTVarIO active) $ do void $ netTimeoutInt tcpConnectTimeout NRMBackground `timeout` runExceptT (reconnectSMPClient ca srv subs) loop ProtocolClientConfig {networkConfig = NetworkConfig {tcpConnectTimeout}} = smpCfg agentCfg diff --git a/src/Simplex/Messaging/Compression.hs b/src/Simplex/Messaging/Compression.hs index 32430bc88..51f80af9e 100644 --- a/src/Simplex/Messaging/Compression.hs +++ b/src/Simplex/Messaging/Compression.hs @@ -8,6 +8,8 @@ module Simplex.Messaging.Compression compressionLevel, compress1, decompress1, + limitDecompress1, + decompressedSize, ) where import qualified Codec.Compression.Zstd as Z1 @@ -43,14 +45,27 @@ compress1 bs | B.length bs <= maxLengthPassthrough = Passthrough bs | otherwise = Compressed . Large $ Z1.compress compressionLevel bs +decompressedSize :: Compressed -> Maybe Int +decompressedSize = \case + Passthrough bs -> Just $ B.length bs + Compressed (Large bs) -> Z1.decompressedSize bs + -- spec: spec/modules/Simplex/Messaging/Compression.md#decompress1 -- Decompression bomb protection: refuses data without declared size or exceeding limit -decompress1 :: Int -> Compressed -> Either String ByteString -decompress1 limit = \case +decompress1 :: Compressed -> Either String ByteString +decompress1 = \case + Passthrough bs -> Right bs + Compressed (Large bs) -> decompress_ bs + +limitDecompress1 :: Int -> Compressed -> Either String ByteString +limitDecompress1 limit = \case Passthrough bs -> Right bs Compressed (Large bs) -> case Z1.decompressedSize bs of - Just sz | sz <= limit -> case Z1.decompress bs of - Z1.Error e -> Left e - Z1.Skip -> Right mempty - Z1.Decompress bs' -> Right bs' + Just sz | sz <= limit -> decompress_ bs _ -> Left $ "compressed size not specified or exceeds " <> show limit + +decompress_ :: ByteString -> Either String ByteString +decompress_ bs = case Z1.decompress bs of + Z1.Error e -> Left e + Z1.Skip -> Right mempty + Z1.Decompress bs' -> Right bs' diff --git a/src/Simplex/Messaging/Crypto.hs b/src/Simplex/Messaging/Crypto.hs index 79a9b593c..52937af14 100644 --- a/src/Simplex/Messaging/Crypto.hs +++ b/src/Simplex/Messaging/Crypto.hs @@ -234,7 +234,7 @@ import qualified Data.Attoparsec.ByteString.Char8 as A import Data.Bifunctor (bimap, first) import Data.ByteArray (ByteArrayAccess) import qualified Data.ByteArray as BA -import Data.ByteString.Base64 (decode, encode) +import Data.ByteString.Base64 (decode) import qualified Data.ByteString.Base64.URL as U import Data.ByteString.Char8 (ByteString) import qualified Data.ByteString.Char8 as B @@ -811,17 +811,22 @@ data ASignature deriving instance Show ASignature class CryptoSignature s where - serializeSignature :: s -> ByteString - serializeSignature = encode . signatureBytes signatureBytes :: s -> ByteString decodeSignature :: ByteString -> Either String s instance CryptoSignature (Signature s) => StrEncoding (Signature s) where - strEncode = serializeSignature + strEncode = strEncode . signatureBytes {-# INLINE strEncode #-} strDecode = decodeSignature {-# INLINE strDecode #-} +instance CryptoSignature (Signature s) => ToJSON (Signature s) where + toJSON = strToJSON + toEncoding = strToJEncoding + +instance CryptoSignature (Signature s) => FromJSON (Signature s) where + parseJSON = strParseJSON "Signature" + instance CryptoSignature (Signature s) => Encoding (Signature s) where smpEncode = smpEncode . signatureBytes {-# INLINE smpEncode #-} diff --git a/src/Simplex/Messaging/Notifications/Server/Main.hs b/src/Simplex/Messaging/Notifications/Server/Main.hs index 047f897fd..cba3bddd9 100644 --- a/src/Simplex/Messaging/Notifications/Server/Main.hs +++ b/src/Simplex/Messaging/Notifications/Server/Main.hs @@ -97,50 +97,50 @@ ntfServerCLI cfgPath logPath = \# This option enables saving memory to append only log,\n\ \# and restoring it when the server is started.\n\ \# Log is compacted on start (deleted objects are removed).\n" - <> ("enable: " <> onOff enableStoreLog <> "\n\n") + <> ("enable = " <> onOff enableStoreLog <> "\n\n") <> "# Database connection settings for PostgreSQL database.\n" <> iniDbOpts dbOptions defaultNtfDBOpts - <> "Time to retain deleted entities in the database, days.\n" - <> ("# db_deleted_ttl: " <> tshow defaultDeletedTTL <> "\n\n") - <> "log_stats: off\n\n\ + <> "# Time to retain deleted entities in the database, days.\n" + <> ("# db_deleted_ttl = " <> tshow defaultDeletedTTL <> "\n\n") + <> "log_stats = off\n\n\ \# Log interval for real-time Prometheus metrics\n\ - \# prometheus_interval: 60\n\ + \# prometheus_interval = 60\n\ \\n\ \[AUTH]\n\ - \# control_port_admin_password:\n\ - \# control_port_user_password:\n\ + \# control_port_admin_password =\n\ + \# control_port_user_password =\n\ \\n\ \[TRANSPORT]\n\ \# Host is only used to print server address on start.\n\ \# You can specify multiple server ports.\n" - <> ("host: " <> T.pack host <> "\n") - <> ("port: " <> T.pack defaultServerPort <> "\n") - <> "log_tls_errors: off\n\n\ - \# Use `websockets: 443` to run websockets server in addition to plain TLS.\n\ - \websockets: off\n\n\ - \# control_port: 5227\n\ + <> ("host = " <> T.pack host <> "\n") + <> ("port = " <> T.pack defaultServerPort <> "\n") + <> "log_tls_errors = off\n\n\ + \# Use `websockets = 443` to run websockets server in addition to plain TLS.\n\ + \websockets = off\n\n\ + \# control_port = 5227\n\ \\n\ \[SUBSCRIBER]\n\ \# Network configuration for notification server client.\n\ \# `host_mode` can be 'public' (default) or 'onion'.\n\ \# It defines prefferred hostname for destination servers with multiple hostnames.\n\ - \# host_mode: public\n\ - \# required_host_mode: off\n\n\ + \# host_mode = public\n\ + \# required_host_mode = off\n\n\ \# SOCKS proxy port for subscribing to SMP servers.\n\ \# You may need a separate instance of SOCKS proxy for incoming single-hop requests.\n\ - \# socks_proxy: localhost:9050\n\n\ + \# socks_proxy = localhost:9050\n\n\ \# `socks_mode` can be 'onion' for SOCKS proxy to be used for .onion destination hosts only (default)\n\ \# or 'always' to be used for all destination hosts (can be used if it is an .onion server).\n\ - \# socks_mode: onion\n\n\ + \# socks_mode = onion\n\n\ \# The domain suffixes of the relays you operate (space-separated) to count as separate proxy statistics.\n\ - \# own_server_domains: \n\n\ + \# own_server_domains = \n\n\ \# User service subscriptions with server certificate\n\n\ - \# use_service_credentials: off\n\n\ + \# use_service_credentials = off\n\n\ \[INACTIVE_CLIENTS]\n\ \# TTL and interval to check inactive clients\n\ - \disconnect: off\n" - <> ("# ttl: " <> tshow (ttl defaultInactiveClientExpiration) <> "\n") - <> ("# check_interval: " <> tshow (checkInterval defaultInactiveClientExpiration) <> "\n") + \disconnect = off\n" + <> ("# ttl = " <> tshow (ttl defaultInactiveClientExpiration) <> "\n") + <> ("# check_interval = " <> tshow (checkInterval defaultInactiveClientExpiration) <> "\n") enableStoreLog' = settingIsOn "STORE_LOG" "enable" runServer startOptions ini = do setLogLevel $ logLevel startOptions diff --git a/src/Simplex/Messaging/Notifications/Server/Store.hs b/src/Simplex/Messaging/Notifications/Server/Store.hs index 0486978ec..294fe0498 100644 --- a/src/Simplex/Messaging/Notifications/Server/Store.hs +++ b/src/Simplex/Messaging/Notifications/Server/Store.hs @@ -26,7 +26,6 @@ module Simplex.Messaging.Notifications.Server.Store stmAddNtfSubscription, stmDeleteNtfSubscription, stmStoreTokenLastNtf, - stmSetNtfService, ) where @@ -205,9 +204,6 @@ stmStoreTokenLastNtf (NtfSTMStore {tokens, tokenLastNtfs}) tknId ntf = do whenM (TM.member tknId tokens) $ TM.insertM tknId (newTVar [ntf]) tokenLastNtfs -stmSetNtfService :: NtfSTMStore -> SMPServer -> Maybe ServiceId -> STM () -stmSetNtfService (NtfSTMStore {ntfServices}) srv serviceId = - maybe (TM.delete srv) (TM.insert srv) serviceId ntfServices data TokenNtfMessageRecord = TNMRv1 NtfTokenId PNMessageData diff --git a/src/Simplex/Messaging/Notifications/Server/Store/Postgres.hs b/src/Simplex/Messaging/Notifications/Server/Store/Postgres.hs index aca573d21..7cf5a438b 100644 --- a/src/Simplex/Messaging/Notifications/Server/Store/Postgres.hs +++ b/src/Simplex/Messaging/Notifications/Server/Store/Postgres.hs @@ -270,7 +270,7 @@ getUsedSMPServers st = smp_host, smp_port, smp_keyhash, smp_server_id, ntf_service_id, smp_notifier_count, smp_notifier_ids_hash FROM smp_servers - WHERE EXISTS (SELECT 1 FROM subscriptions WHERE status IN ?) + WHERE EXISTS (SELECT 1 FROM subscriptions WHERE smp_server_id = smp_servers.smp_server_id AND status IN ?) |] (Only (In subscribeNtfStatuses)) where diff --git a/src/Simplex/Messaging/Server.hs b/src/Simplex/Messaging/Server.hs index bce73d338..4c43f8764 100644 --- a/src/Simplex/Messaging/Server.hs +++ b/src/Simplex/Messaging/Server.hs @@ -293,7 +293,7 @@ smpServer started cfg@ServerConfig {transports, transportConfig = tCfg, startOpt pure $ as ++ as' CSService serviceId changedSubs -> do modifyTVar' subClients $ IS.insert clntId -- add ID to server's subscribed cients - modifyTVar' totalServiceSubs $ subtractServiceSubs changedSubs -- server count and IDs hash for all services + modifyTVar' totalServiceSubs $ addServiceSubs changedSubs -- server count and IDs hash for all services cancelServiceSubs serviceId =<< upsertSubscribedClient serviceId c serviceSubscribers updateSubDisconnected = case clntSub of -- do not insert client if it is already disconnected, but send END/DELD to any other client subscribed to this queue or service @@ -702,12 +702,13 @@ smpServer started cfg@ServerConfig {transports, transportConfig = tCfg, startOpt loadedCounts <- loadedQueueCounts $ fromMsgStore ms pure RealTimeMetrics {socketStats, threadsCount, clientsCount, deliveredSubs, deliveredTimes, smpSubs, ntfSubs, loadedCounts} where - getSubscribersMetrics ServerSubscribers {queueSubscribers, serviceSubscribers, subClients} = do + getSubscribersMetrics ServerSubscribers {queueSubscribers, serviceSubscribers, totalServiceSubs, subClients} = do subsCount <- M.size <$> getSubscribedClients queueSubscribers subClientsCount <- IS.size <$> readTVarIO subClients subServicesCount <- M.size <$> getSubscribedClients serviceSubscribers - pure RTSubscriberMetrics {subsCount, subClientsCount, subServicesCount} - getDeliveredMetrics ts' = foldM countClnt (RTSubscriberMetrics 0 0 0, emptyTimeBuckets) =<< getServerClients srv + subServiceSubsCount <- fst <$> readTVarIO totalServiceSubs + pure RTSubscriberMetrics {subsCount, subClientsCount, subServicesCount, subServiceSubsCount} + getDeliveredMetrics ts' = foldM countClnt (RTSubscriberMetrics 0 0 0 0, emptyTimeBuckets) =<< getServerClients srv where countClnt acc@(metrics, times) Client {subscriptions} = do (cnt, times') <- foldM countSubs (0, times) =<< readTVarIO subscriptions @@ -1367,14 +1368,38 @@ client labelMyThread . B.unpack $ "client $" <> encode sessionId <> " commands" let THandleParams {thVersion} = thParams' clntServiceId = (\THClientService {serviceId} -> serviceId) <$> (peerClientService =<< thAuth thParams') - process t acc@(rs, msgs) = + process batchSubs t acc@(rs, msgs) = (maybe acc (\(!r, !msg_) -> (r : rs, maybe msgs (: msgs) msg_))) - <$> processCommand clntServiceId thVersion t - forever $ - atomically (readTBQueue rcvQ) - >>= foldrM process ([], []) + <$> processCommand clntServiceId thVersion batchSubs t + forever $ do + batch <- atomically (readTBQueue rcvQ) + batchSubs <- prepareBatchSubs clntServiceId batch + foldrM (process batchSubs) ([], []) batch >>= \(rs_, msgs) -> mapM_ (atomically . writeTBQueue sndQ . (,msgs)) (L.nonEmpty rs_) where + prepareBatchSubs :: + Maybe ServiceId -> + NonEmpty (VerifiedTransmission s) -> + M s (Either ErrorType (Map RecipientId Message, Map RecipientId (Either ErrorType ()), Map RecipientId (Either ErrorType ()))) + prepareBatchSubs clntServiceId_ batch = do + let (subMsgQs, rcvAssocQs, ntfAssocQs) = foldr partitionSubs ([], [], []) batch + partitionSubs t (msgQs, rcvQs, ntfQs) = case t of + (Just (q, qr), (_, _, Cmd SRecipient SUB)) + | clntServiceId_ /= rcvServiceId qr -> (q : msgQs, q : rcvQs, ntfQs) + | otherwise -> (q : msgQs, rcvQs, ntfQs) + (Just (q, qr), (_, _, Cmd SNotifier NSUB)) + | clntServiceId_ /= (notifier qr >>= ntfServiceId) -> (msgQs, rcvQs, q : ntfQs) + _ -> (msgQs, rcvQs, ntfQs) + liftIO $ runExceptT $ do + rcvAssocs <- ifNotNull rcvAssocQs $ setService SRecipientService clntServiceId_ + ntfAssocs <- ifNotNull ntfAssocQs $ setService SNotifierService clntServiceId_ + msgs <- ifNotNull subMsgQs $ tryPeekMsgs ms + pure (msgs, rcvAssocs, ntfAssocs) + where + ifNotNull qs f = if null qs then pure M.empty else f qs + setService :: (PartyI p, ServiceParty p) => SParty p -> Maybe ServiceId -> [StoreQueue s] -> ExceptT ErrorType IO (Map RecipientId (Either ErrorType ())) + setService party sId = ExceptT . setQueueServices (queueStore ms) party sId + processProxiedCmd :: Transmission (Command 'ProxiedClient) -> M s (Maybe ResponseAndMessage) processProxiedCmd (corrId, EntityId sessId, command) = (\t -> ((corrId, EntityId sessId, t), Nothing)) <$$> case command of PRXY srv auth -> ifM allowProxy getRelay (pure $ Just $ ERR $ PROXY BASIC_AUTH) @@ -1455,8 +1480,8 @@ client mkIncProxyStats ps psOwn own sel = do incStat $ sel ps when own $ incStat $ sel psOwn - processCommand :: Maybe ServiceId -> VersionSMP -> VerifiedTransmission s -> M s (Maybe ResponseAndMessage) - processCommand clntServiceId clntVersion (q_, (corrId, entId, cmd)) = case cmd of + processCommand :: Maybe ServiceId -> VersionSMP -> Either ErrorType (Map RecipientId Message, Map RecipientId (Either ErrorType ()), Map RecipientId (Either ErrorType ())) -> VerifiedTransmission s -> M s (Maybe ResponseAndMessage) + processCommand clntServiceId clntVersion batchSubs (q_, (corrId, entId, cmd)) = case cmd of Cmd SProxiedClient command -> processProxiedCmd (corrId, entId, command) Cmd SSender command -> case command of SKEY k -> withQueue $ \q qr -> checkMode QMMessaging qr $ secureQueue_ q k @@ -1467,7 +1492,9 @@ client LKEY k -> withQueue $ \q qr -> checkMode QMMessaging qr $ secureQueue_ q k $>> getQueueLink_ q qr LGET -> withQueue $ \q qr -> checkContact qr $ getQueueLink_ q qr Cmd SNotifier NSUB -> response . (corrId,entId,) <$> case q_ of - Just (q, QueueRec {notifier = Just ntfCreds}) -> subscribeNotifications q ntfCreds + Just (q, QueueRec {notifier = Just ntfCreds}) -> + either (pure . ERR) (\_ -> subscribeNotifications q ntfCreds) + $ batchSubs >>= \(_, _, ntfAssocs) -> sequence (M.lookup (recipientId q) ntfAssocs) _ -> pure $ ERR INTERNAL Cmd SNotifierService (NSUBS n idsHash) -> response . (corrId,entId,) <$> case clntServiceId of Just serviceId -> subscribeServiceNotifications serviceId (n, idsHash) @@ -1480,7 +1507,9 @@ client pure $ allowNewQueues && maybe True ((== auth_) . Just) newQueueBasicAuth Cmd SRecipient command -> case command of - SUB -> withQueue' subscribeQueueAndDeliver + SUB -> case batchSubs >>= \(msgs, rcvAssocs, _) -> sequence (M.lookup entId rcvAssocs) $> msgs of + Left e -> pure $ Just (err e, Nothing) + Right msgs -> withQueue' $ subscribeQueueAndDeliver $ M.lookup entId msgs GET -> withQueue getMessage ACK msgId -> withQueue $ acknowledgeMsg msgId KEY sKey -> withQueue $ \q _ -> either err (corrId,entId,) <$> secureQueue_ q sKey @@ -1621,13 +1650,11 @@ client suspendQueue_ :: (StoreQueue s, QueueRec) -> M s (Transmission BrokerMsg) suspendQueue_ (q, _) = liftIO $ either err (const ok) <$> suspendQueue (queueStore ms) q - subscribeQueueAndDeliver :: StoreQueue s -> QueueRec -> M s ResponseAndMessage - subscribeQueueAndDeliver q qr@QueueRec {rcvServiceId} = + subscribeQueueAndDeliver :: Maybe Message -> StoreQueue s -> QueueRec -> M s ResponseAndMessage + subscribeQueueAndDeliver msg_ q qr@QueueRec {rcvServiceId} = liftIO (TM.lookupIO entId $ subscriptions clnt) >>= \case Nothing -> - sharedSubscribeQueue q SRecipientService rcvServiceId subscribers subscriptions serviceSubsCount (newSubscription NoSub) rcvServices >>= \case - Left e -> pure (err e, Nothing) - Right s -> deliver s + deliver =<< sharedSubscribeQueue q rcvServiceId subscribers subscriptions serviceSubsCount (newSubscription NoSub) rcvServices Just s@Sub {subThread} -> do stats <- asks serverStats case subThread of @@ -1643,7 +1670,6 @@ client deliver (hasSub, sub_) = do stats <- asks serverStats fmap (either ((,Nothing) . err) id) $ liftIO $ runExceptT $ do - msg_ <- tryPeekMsg ms q msg' <- forM msg_ $ \msg -> liftIO $ do ts <- getSystemSeconds sub <- maybe (atomically getSub) pure sub_ @@ -1729,26 +1755,22 @@ client else liftIO (updateQueueTime (queueStore ms) q t) >>= either (pure . err') (action q) subscribeNotifications :: StoreQueue s -> NtfCreds -> M s BrokerMsg - subscribeNotifications q NtfCreds {ntfServiceId} = - sharedSubscribeQueue q SNotifierService ntfServiceId ntfSubscribers ntfSubscriptions ntfServiceSubsCount (pure ()) ntfServices >>= \case - Left e -> pure $ ERR e - Right (hasSub, _) -> do - when (isNothing clntServiceId) $ - asks serverStats >>= incStat . (if hasSub then ntfSubDuplicate else ntfSub) - pure $ SOK clntServiceId + subscribeNotifications q NtfCreds {ntfServiceId} = do + (hasSub, _) <- sharedSubscribeQueue q ntfServiceId ntfSubscribers ntfSubscriptions ntfServiceSubsCount (pure ()) ntfServices + when (isNothing clntServiceId) $ + asks serverStats >>= incStat . (if hasSub then ntfSubDuplicate else ntfSub) + pure $ SOK clntServiceId sharedSubscribeQueue :: - (PartyI p, ServiceParty p) => StoreQueue s -> - SParty p -> Maybe ServiceId -> ServerSubscribers s -> (Client s -> TMap QueueId sub) -> (Client s -> TVar (Int64, IdsHash)) -> STM sub -> (ServerStats -> ServiceStats) -> - M s (Either ErrorType (Bool, Maybe sub)) - sharedSubscribeQueue q party queueServiceId srvSubscribers clientSubs clientServiceSubs mkSub servicesSel = do + M s (Bool, Maybe sub) + sharedSubscribeQueue q queueServiceId srvSubscribers clientSubs clientServiceSubs mkSub servicesSel = do stats <- asks serverStats let incSrvStat sel = incStat $ sel $ servicesSel stats writeSub = writeTQueue (subQ srvSubscribers) (CSClient entId queueServiceId clntServiceId, clientId) @@ -1762,25 +1784,23 @@ client incSrvStat srvSubCount incSrvStat srvSubQueues incSrvStat srvAssocDuplicate - pure $ Right (hasSub, Nothing) - | otherwise -> runExceptT $ do - -- new or updated queue-service association - ExceptT $ setQueueService (queueStore ms) q party (Just serviceId) + pure (hasSub, Nothing) + | otherwise -> do + -- association already done in prepareBatchSubs hasSub <- atomically $ (<$ incServiceQueueSubs) =<< hasServiceSub atomically writeSub - liftIO $ do - unless hasSub $ incSrvStat srvSubCount - incSrvStat srvSubQueues - incSrvStat $ maybe srvAssocNew (const srvAssocUpdated) queueServiceId + unless hasSub $ incSrvStat srvSubCount + incSrvStat srvSubQueues + incSrvStat $ maybe srvAssocNew (const srvAssocUpdated) queueServiceId pure (hasSub, Nothing) where hasServiceSub = ((0 /=) . fst) <$> readTVar (clientServiceSubs clnt) -- This function is used when queue association with the service is created. - incServiceQueueSubs = modifyTVar' (clientServiceSubs clnt) $ addServiceSubs (1, queueIdHash (recipientId q)) -- service count and IDs hash + incServiceQueueSubs = modifyTVar' (clientServiceSubs clnt) $ addServiceSubs (1, queueIdHash (recipientId q)) -- service count and IDS hash Nothing -> case queueServiceId of - Just _ -> runExceptT $ do - ExceptT $ setQueueService (queueStore ms) q party Nothing - liftIO $ incSrvStat srvAssocRemoved + Just _ -> do + -- unassociation already done in prepareBatchSubs + incSrvStat srvAssocRemoved -- getSubscription may be Just for receiving service, where clientSubs also hold active deliveries for service subscriptions. -- For notification service it can only be Just if storage and session states diverge. r <- atomically $ getSubscription >>= newSub @@ -1789,7 +1809,7 @@ client Nothing -> do r@(hasSub, _) <- atomically $ getSubscription >>= newSub unless hasSub $ atomically writeSub - pure $ Right r + pure r where getSubscription = TM.lookup entId $ clientSubs clnt newSub = \case @@ -1865,7 +1885,7 @@ client let incSrvStat sel n = liftIO $ atomicModifyIORef'_ (sel $ servicesSel stats) (+ n) diff = fromIntegral $ count' - count if -- `count == -1` only for subscriptions by old NTF servers - | count == -1 && (diff == 0 && idsHash == idsHash') -> incSrvStat srvSubOk 1 + | count == -1 || (diff == 0 && idsHash == idsHash') -> incSrvStat srvSubOk 1 | diff > 0 -> incSrvStat srvSubMore 1 >> incSrvStat srvSubMoreTotal diff | diff < 0 -> incSrvStat srvSubFewer 1 >> incSrvStat srvSubFewerTotal (- diff) | otherwise -> incSrvStat srvSubDiff 1 @@ -2040,7 +2060,7 @@ client labelMyThread $ B.unpack ("client $" <> encode sessionId) <> " deliver/SEND" -- lookup can be outside of STM transaction, -- as long as the check that it is the same client is inside. - getSubscribedClient rId (queueSubscribers subscribers) >>= mapM_ deliverIfSame + getSubscribed >>= mapM_ deliverIfSame deliverIfSame rcv = do ts <- getSystemSeconds atomically $ whenM (sameClient rc rcv) $ @@ -2090,7 +2110,7 @@ client -- rejectOrVerify filters allowed commands, no need to repeat it here. -- INTERNAL is used because processCommand never returns Nothing for sender commands (could be extracted for better types). -- `fst` removes empty message that is only returned for `SUB` command - Right t''@(_, (corrId', entId', _)) -> maybe (corrId', entId', ERR INTERNAL) fst <$> lift (processCommand Nothing fwdVersion t'') + Right t''@(_, (corrId', entId', _)) -> maybe (corrId', entId', ERR INTERNAL) fst <$> lift (processCommand Nothing fwdVersion (Right (M.empty, M.empty, M.empty)) t'') -- encode response r' <- case batchTransmissions clntTHParams [Right (Nothing, encodeTransmission clntTHParams r)] of [] -> throwE INTERNAL -- at least 1 item is guaranteed from NonEmpty/Right diff --git a/src/Simplex/Messaging/Server/CLI.hs b/src/Simplex/Messaging/Server/CLI.hs index 16738faca..720e57dda 100644 --- a/src/Simplex/Messaging/Server/CLI.hs +++ b/src/Simplex/Messaging/Server/CLI.hs @@ -27,6 +27,7 @@ module Simplex.Messaging.Server.CLI certOptionsP, dbOptsP, startOptionsP, + parseConfirmMigrations, parseLogLevel, genOnline, warnCAPrivateKeyFile, @@ -288,12 +289,12 @@ startOptionsP = do <> value MCConsole ) pure StartOptions {maintenance, compactLog, logLevel, skipWarnings, confirmMigrations} - where - parseConfirmMigrations :: ReadM MigrationConfirmation - parseConfirmMigrations = eitherReader $ \case - "up" -> Right MCYesUp - "down" -> Right MCYesUpDown - _ -> Left "invalid migration confirmation, pass 'up' or 'down'" + +parseConfirmMigrations :: ReadM MigrationConfirmation +parseConfirmMigrations = eitherReader $ \case + "up" -> Right MCYesUp + "down" -> Right MCYesUpDown + _ -> Left "invalid migration confirmation, pass 'up' or 'down'" parseLogLevel :: ReadM LogLevel parseLogLevel = eitherReader $ \case diff --git a/src/Simplex/Messaging/Server/Main/Init.hs b/src/Simplex/Messaging/Server/Main/Init.hs index 728beac13..0e3ceb81b 100644 --- a/src/Simplex/Messaging/Server/Main/Init.hs +++ b/src/Simplex/Messaging/Server/Main/Init.hs @@ -78,101 +78,101 @@ iniFileContent cfgPath logPath opts host basicAuth controlPortPwds = informationIniContent opts <> "[STORE_LOG]\n\ \# The server uses memory or PostgreSQL database for persisting queue records.\n\ - \# Use `enable: on` to use append-only log to preserve and restore queue records on restart.\n\ + \# Use `enable = on` to use append-only log to preserve and restore queue records on restart.\n\ \# Log is compacted on start (deleted objects are removed).\n" - <> ("enable: " <> onOff enableStoreLog <> "\n\n") + <> ("enable = " <> onOff enableStoreLog <> "\n\n") <> "# Queue storage mode: `memory` or `database` (to store queue records in PostgreSQL database).\n\ - \# `memory` - in-memory persistence, with optional append-only log (`enable: on`).\n\ - \# `database`- PostgreSQL databass (requires `store_messages: journal`).\n\ - \store_queues: memory\n\n\ - \# Database connection settings for PostgreSQL database (`store_queues: database`).\n" + \# `memory` - in-memory persistence, with optional append-only log (`enable = on`).\n\ + \# `database`- PostgreSQL databass (requires `store_messages = journal`).\n\ + \store_queues = memory\n\n\ + \# Database connection settings for PostgreSQL database (`store_queues = database`).\n" <> iniDbOpts dbOptions defaultDBOpts <> "# Write database changes to store log file\n\ - \# db_store_log: off\n\n\ + \# db_store_log = off\n\n\ \# Time to retain deleted queues in the database, days.\n" - <> ("# db_deleted_ttl: " <> tshow defaultDeletedTTL <> "\n\n") + <> ("# db_deleted_ttl = " <> tshow defaultDeletedTTL <> "\n\n") <> "# Message storage mode: `memory` or `journal`.\n\ - \store_messages: memory\n\n\ + \store_messages = memory\n\n\ \# When store_messages is `memory`, undelivered messages are optionally saved and restored\n\ \# when the server restarts, they are preserved in the .bak file until the next restart.\n" - <> ("restore_messages: " <> onOff enableStoreLog <> "\n\n") + <> ("restore_messages = " <> onOff enableStoreLog <> "\n\n") <> "# Messages and notifications expiration periods.\n" - <> ("expire_messages_days: " <> tshow defMsgExpirationDays <> "\n") - <> "expire_messages_on_start: on\n\ - \expire_messages_on_send: off\n" - <> ("expire_ntfs_hours: " <> tshow defNtfExpirationHours <> "\n\n") + <> ("expire_messages_days = " <> tshow defMsgExpirationDays <> "\n") + <> "expire_messages_on_start = on\n\ + \expire_messages_on_send = off\n" + <> ("expire_ntfs_hours = " <> tshow defNtfExpirationHours <> "\n\n") <> "# Log daily server statistics to CSV file\n" - <> ("log_stats: " <> onOff logStats <> "\n\n") + <> ("log_stats = " <> onOff logStats <> "\n\n") <> "# Log interval for real-time Prometheus metrics\n\ - \# prometheus_interval: 60\n\n\ + \# prometheus_interval = 60\n\n\ \[AUTH]\n\ \# Set new_queues option to off to completely prohibit creating new messaging queues.\n\ \# This can be useful when you want to decommission the server, but not all connections are switched yet.\n\ - \new_queues: on\n\n\ + \new_queues = on\n\n\ \# Use create_password option to enable basic auth to create new messaging queues.\n\ \# The password should be used as part of server address in client configuration:\n\ \# smp://fingerprint:password@host1,host2\n\ \# The password will not be shared with the connecting contacts, you must share it only\n\ \# with the users who you want to allow creating messaging queues on your server.\n" <> ( let noPassword = "password to create new queues and forward messages (any printable ASCII characters without whitespace, '@', ':' and '/')" - in optDisabled basicAuth <> "create_password: " <> maybe noPassword (safeDecodeUtf8 . strEncode) basicAuth + in optDisabled basicAuth <> "create_password = " <> maybe noPassword (safeDecodeUtf8 . strEncode) basicAuth ) <> "\n\n" - <> (optDisabled controlPortPwds <> "control_port_admin_password: " <> maybe "" fst controlPortPwds <> "\n") - <> (optDisabled controlPortPwds <> "control_port_user_password: " <> maybe "" snd controlPortPwds <> "\n\n") + <> (optDisabled controlPortPwds <> "control_port_admin_password = " <> maybe "" fst controlPortPwds <> "\n") + <> (optDisabled controlPortPwds <> "control_port_user_password = " <> maybe "" snd controlPortPwds <> "\n\n") <> "# The limit for queues that can be blocked via control port per day, resets at 0:00 UTC.\n\ \# Set to 0 to disable limit, to -1 to prohibit blocking. Default is 20.\n\ - \# daily_block_queue_quota: 20\n\ + \# daily_block_queue_quota = 20\n\ \\n\ \[TRANSPORT]\n\ \# Host is only used to print server address on start.\n\ \# You can specify multiple server ports.\n" - <> ("host: " <> T.pack host <> "\n") - <> ("port: " <> defaultServerPorts <> "\n") - <> "log_tls_errors: off\n\n\ - \# Use `websockets: 443` to run websockets server in addition to plain TLS.\n\ + <> ("host = " <> T.pack host <> "\n") + <> ("port = " <> defaultServerPorts <> "\n") + <> "log_tls_errors = off\n\n\ + \# Use `websockets = 443` to run websockets server in addition to plain TLS.\n\ \# This option is deprecated and should be used for testing only.\n\ \# , port 443 should be specified in port above\n\ - \websockets: off\n" - <> (optDisabled controlPort <> "control_port: " <> tshow (fromMaybe defaultControlPort controlPort)) + \websockets = off\n" + <> (optDisabled controlPort <> "control_port = " <> tshow (fromMaybe defaultControlPort controlPort)) <> "\n\n\ \[PROXY]\n\ \# Network configuration for SMP proxy client.\n\ \# `host_mode` can be 'public' (default) or 'onion'.\n\ \# It defines prefferred hostname for destination servers with multiple hostnames.\n\ - \# host_mode: public\n\ - \# required_host_mode: off\n\n\ + \# host_mode = public\n\ + \# required_host_mode = off\n\n\ \# The domain suffixes of the relays you operate (space-separated) to count as separate proxy statistics.\n" - <> (optDisabled ownDomains <> "own_server_domains: " <> maybe "" (safeDecodeUtf8 . strEncode) ownDomains) + <> (optDisabled ownDomains <> "own_server_domains = " <> maybe "" (safeDecodeUtf8 . strEncode) ownDomains) <> "\n\n\ \# SOCKS proxy port for forwarding messages to destination servers.\n\ \# You may need a separate instance of SOCKS proxy for incoming single-hop requests.\n" - <> (optDisabled socksProxy <> "socks_proxy: " <> maybe "localhost:9050" (safeDecodeUtf8 . strEncode) socksProxy) + <> (optDisabled socksProxy <> "socks_proxy = " <> maybe "localhost:9050" (safeDecodeUtf8 . strEncode) socksProxy) <> "\n\n\ \# `socks_mode` can be 'onion' for SOCKS proxy to be used for .onion destination hosts only (default)\n\ \# or 'always' to be used for all destination hosts (can be used if it is an .onion server).\n\ - \# socks_mode: onion\n\n\ + \# socks_mode = onion\n\n\ \# Limit number of threads a client can spawn to process proxy commands in parrallel.\n" - <> ("# client_concurrency: " <> tshow defaultProxyClientConcurrency) + <> ("# client_concurrency = " <> tshow defaultProxyClientConcurrency) <> "\n\n\ \[INACTIVE_CLIENTS]\n\ \# TTL and interval to check inactive clients\n\ - \disconnect: on\n" - <> ("ttl: " <> tshow (ttl defaultInactiveClientExpiration) <> "\n") - <> ("check_interval: " <> tshow (checkInterval defaultInactiveClientExpiration)) + \disconnect = on\n" + <> ("ttl = " <> tshow (ttl defaultInactiveClientExpiration) <> "\n") + <> ("check_interval = " <> tshow (checkInterval defaultInactiveClientExpiration)) <> "\n\n\ \[WEB]\n\ \# Set path to generate static mini-site for server information and qr codes/links\n" - <> ("static_path: " <> T.pack (fromMaybe defaultStaticPath webStaticPath) <> "\n\n") + <> ("static_path = " <> T.pack (fromMaybe defaultStaticPath webStaticPath) <> "\n\n") <> "# Run an embedded server on this port\n\ \# Onion sites can use any port and register it in the hidden service config.\n\ \# Running on a port 80 may require setting process capabilities.\n\ - \# http: 8000\n\n\ + \# http = 8000\n\n\ \# You can run an embedded TLS web server too if you provide port and cert and key files.\n\ \# Not required for running relay on onion address.\n" - <> (webDisabled <> "https: 443\n") - <> (webDisabled <> "cert: " <> T.pack httpsCertFile <> "\n") - <> (webDisabled <> "key: " <> T.pack httpsKeyFile <> "\n") + <> (webDisabled <> "https = 443\n") + <> (webDisabled <> "cert = " <> T.pack httpsCertFile <> "\n") + <> (webDisabled <> "key = " <> T.pack httpsKeyFile <> "\n") where InitOptions {enableStoreLog, dbOptions, socksProxy, ownDomains, controlPort, webStaticPath, disableWeb, logStats} = opts defaultServerPorts = "5223,443" @@ -189,53 +189,53 @@ informationIniContent InitOptions {sourceCode, serverInfo} = \# LICENSE: https://github.com/simplex-chat/simplexmq/blob/stable/LICENSE\n\ \# Include correct source code URI in case the server source code is modified in any way.\n\ \# If any other information fields are present, source code property also MUST be present.\n\n" - <> (optDisabled sourceCode <> "source_code: " <> fromMaybe "URI" sourceCode) + <> (optDisabled sourceCode <> "source_code = " <> fromMaybe "URI" sourceCode) <> "\n\n\ \# Declaring all below information is optional, any of these fields can be omitted.\n\ \\n\ \# Server usage conditions and amendments.\n\ \# It is recommended to use standard conditions with any amendments in a separate document.\n\ - \# usage_conditions: https://github.com/simplex-chat/simplex-chat/blob/stable/PRIVACY.md\n\ - \# condition_amendments: link\n\ + \# usage_conditions = https://github.com/simplex-chat/simplex-chat/blob/stable/PRIVACY.md\n\ + \# condition_amendments = link\n\ \\n\ \# Server location and operator.\n" <> countryStr "server" serverCountry <> enitiyStrs "operator" operator - <> (optDisabled website <> "website: " <> fromMaybe "" website) + <> (optDisabled website <> "website = " <> fromMaybe "" website) <> "\n\n\ \# Administrative contacts.\n\ - \# admin_simplex: SimpleX address\n\ - \# admin_email:\n\ - \# admin_pgp:\n\ - \# admin_pgp_fingerprint:\n\ + \# admin_simplex = SimpleX address\n\ + \# admin_email =\n\ + \# admin_pgp =\n\ + \# admin_pgp_fingerprint =\n\ \\n\ \# Contacts for complaints and feedback.\n\ - \# complaints_simplex: SimpleX address\n\ - \# complaints_email:\n\ - \# complaints_pgp:\n\ - \# complaints_pgp_fingerprint:\n\ + \# complaints_simplex = SimpleX address\n\ + \# complaints_email =\n\ + \# complaints_pgp =\n\ + \# complaints_pgp_fingerprint =\n\ \\n\ \# Hosting provider.\n" <> enitiyStrs "hosting" hosting <> "\n\ \# Hosting type can be `virtual`, `dedicated`, `colocation`, `owned`\n" - <> ("hosting_type: " <> maybe "virtual" (decodeLatin1 . strEncode) hostingType <> "\n\n") + <> ("hosting_type = " <> maybe "virtual" (decodeLatin1 . strEncode) hostingType <> "\n\n") where ServerPublicInfo {operator, website, hosting, hostingType, serverCountry} = serverInfo - countryStr optName country = optDisabled country <> optName <> "_country: " <> fromMaybe "ISO-3166 2-letter code" country <> "\n" + countryStr optName country = optDisabled country <> optName <> "_country = " <> fromMaybe "ISO-3166 2-letter code" country <> "\n" enitiyStrs optName entity = optDisabled entity <> optName - <> ": " + <> " = " <> maybe "entity (organization or person name)" name entity <> "\n" <> countryStr optName (country =<< entity) iniDbOpts :: DBOpts -> DBOpts -> Text iniDbOpts DBOpts {connstr, schema, poolSize} DBOpts {connstr = defConnstr, schema = defSchema, poolSize = defPoolSize} = - (optDisabled' (connstr == defConnstr) <> "db_connection: " <> safeDecodeUtf8 connstr <> "\n") - <> (optDisabled' (schema == defSchema) <> "db_schema: " <> safeDecodeUtf8 schema <> "\n") - <> (optDisabled' (poolSize == defPoolSize) <> "db_pool_size: " <> tshow poolSize <> "\n\n") + (optDisabled' (connstr == defConnstr) <> "db_connection = " <> safeDecodeUtf8 connstr <> "\n") + <> (optDisabled' (schema == defSchema) <> "db_schema = " <> safeDecodeUtf8 schema <> "\n") + <> (optDisabled' (poolSize == defPoolSize) <> "db_pool_size = " <> tshow poolSize <> "\n\n") optDisabled :: Maybe a -> Text optDisabled = optDisabled' . isNothing diff --git a/src/Simplex/Messaging/Server/MsgStore/Journal.hs b/src/Simplex/Messaging/Server/MsgStore/Journal.hs index c65660c93..185c113b7 100644 --- a/src/Simplex/Messaging/Server/MsgStore/Journal.hs +++ b/src/Simplex/Messaging/Server/MsgStore/Journal.hs @@ -353,6 +353,8 @@ instance QueueStoreClass (JournalQueue s) (QStore s) where {-# INLINE getCreateService #-} setQueueService = withQS setQueueService {-# INLINE setQueueService #-} + setQueueServices = withQS setQueueServices + {-# INLINE setQueueServices #-} getQueueNtfServices = withQS (getQueueNtfServices @(JournalQueue s)) {-# INLINE getQueueNtfServices #-} getServiceQueueCountHash = withQS (getServiceQueueCountHash @(JournalQueue s)) diff --git a/src/Simplex/Messaging/Server/MsgStore/Postgres.hs b/src/Simplex/Messaging/Server/MsgStore/Postgres.hs index 1617c1c91..d75042649 100644 --- a/src/Simplex/Messaging/Server/MsgStore/Postgres.hs +++ b/src/Simplex/Messaging/Server/MsgStore/Postgres.hs @@ -41,7 +41,7 @@ import Data.List (intersperse) import qualified Data.Map.Strict as M import Data.Text (Text) import Data.Time.Clock.System (SystemTime (..)) -import Database.PostgreSQL.Simple (Binary (..), Only (..), (:.) (..)) +import Database.PostgreSQL.Simple (Binary (..), In (..), Only (..), (:.) (..)) import qualified Database.PostgreSQL.Simple as DB import qualified Database.PostgreSQL.Simple.Copy as DB import Database.PostgreSQL.Simple.SqlQQ (sql) @@ -132,11 +132,13 @@ instance MsgStoreClass PostgresMsgStore where q.status, q.updated_at, q.link_id, q.rcv_service_id, m.msg_id, m.msg_ts, m.msg_quota, m.msg_ntf_flag, m.msg_body FROM msg_queues q - LEFT JOIN ( - SELECT recipient_id, msg_id, msg_ts, msg_quota, msg_ntf_flag, msg_body, - ROW_NUMBER() OVER (PARTITION BY recipient_id ORDER BY message_id ASC) AS row_num + LEFT JOIN LATERAL ( + SELECT msg_id, msg_ts, msg_quota, msg_ntf_flag, msg_body FROM messages - ) m ON q.recipient_id = m.recipient_id AND m.row_num = 1 + WHERE recipient_id = q.recipient_id + ORDER BY message_id ASC + LIMIT 1 + ) m ON true WHERE q.rcv_service_id = ? AND q.deleted_at IS NULL; |] (Only serviceId) @@ -245,6 +247,25 @@ instance MsgStoreClass PostgresMsgStore where tryPeekMsg ms q = isolateQueue ms q "tryPeekMsg" $ tryPeekMsg_ q () {-# INLINE tryPeekMsg #-} + tryPeekMsgs :: PostgresMsgStore -> [PostgresQueue] -> ExceptT ErrorType IO (M.Map RecipientId Message) + tryPeekMsgs _ms [] = pure M.empty + tryPeekMsgs ms qs = + uninterruptibleMask_ $ + withDB' "tryPeekMsgs" (queueStore_ ms) $ \db -> + M.fromList . map toRcvMsg <$> + DB.query + db + [sql| + SELECT DISTINCT ON (recipient_id) + recipient_id, msg_id, msg_ts, msg_quota, msg_ntf_flag, msg_body + FROM messages + WHERE recipient_id IN ? + ORDER BY recipient_id, message_id ASC + |] + (Only (In (map recipientId' qs))) + where + toRcvMsg (Only rId :. msg) = (rId, toMessage msg) + tryDelMsg :: PostgresMsgStore -> PostgresQueue -> MsgId -> ExceptT ErrorType IO (Maybe Message) tryDelMsg ms q msgId = uninterruptibleMask_ $ diff --git a/src/Simplex/Messaging/Server/MsgStore/Types.hs b/src/Simplex/Messaging/Server/MsgStore/Types.hs index 12566ec2f..0372880e0 100644 --- a/src/Simplex/Messaging/Server/MsgStore/Types.hs +++ b/src/Simplex/Messaging/Server/MsgStore/Types.hs @@ -41,7 +41,9 @@ import Control.Monad.Trans.Except import Data.Functor (($>)) import Data.Int (Int64) import Data.Kind -import Data.Maybe (fromMaybe) +import Data.Map.Strict (Map) +import qualified Data.Map.Strict as M +import Data.Maybe (catMaybes, fromMaybe) import Data.Text (Text) import Data.Time.Clock.System (SystemTime (systemSeconds)) import Simplex.Messaging.Protocol @@ -92,6 +94,9 @@ class (Monad (StoreMonad s), QueueStoreClass (StoreQueue s) (QueueStore s)) => M tryPeekMsg :: s -> StoreQueue s -> ExceptT ErrorType IO (Maybe Message) tryPeekMsg st q = snd <$$> withPeekMsgQueue st q "tryPeekMsg" pure {-# INLINE tryPeekMsg #-} + + tryPeekMsgs :: s -> [StoreQueue s] -> ExceptT ErrorType IO (Map RecipientId Message) + tryPeekMsgs st qs = M.fromList . catMaybes <$> mapM (\q -> (recipientId q,) <$$> tryPeekMsg st q) qs tryDelMsg :: s -> StoreQueue s -> MsgId -> ExceptT ErrorType IO (Maybe Message) tryDelMsg st q msgId' = diff --git a/src/Simplex/Messaging/Server/Prometheus.hs b/src/Simplex/Messaging/Server/Prometheus.hs index 33ccbd0be..32e8bd9a1 100644 --- a/src/Simplex/Messaging/Server/Prometheus.hs +++ b/src/Simplex/Messaging/Server/Prometheus.hs @@ -52,7 +52,8 @@ data RealTimeMetrics = RealTimeMetrics data RTSubscriberMetrics = RTSubscriberMetrics { subsCount :: Int, subClientsCount :: Int, - subServicesCount :: Int + subServicesCount :: Int, + subServiceSubsCount :: Int64 } {-# FOURMOLU_DISABLE\n#-} @@ -391,13 +392,13 @@ prometheusMetrics sm rtm ts = \# TYPE simplex_smp_ntf_services_queues_count gauge\n\ \simplex_smp_ntf_services_queues_count " <> mshow (ntfServiceQueuesCount entityCounts) <> "\n# ntfServiceQueuesCount\n\ \\n\ - \# HELP simplex_smp_rcv_services_sub_msg The count of subscribed service queues with messages.\n\ - \# TYPE simplex_smp_rcv_services_sub_msg counter\n\ - \simplex_smp_rcv_services_sub_msg " <> mshow _rcvServicesSubMsg <> "\n# rcvServicesSubMsg\n\ + \# HELP simplex_smp_rcv_services_sub_msg_count The count of subscribed service queues with messages.\n\ + \# TYPE simplex_smp_rcv_services_sub_msg_count counter\n\ + \simplex_smp_rcv_services_sub_msg_count " <> mshow _rcvServicesSubMsg <> "\n# rcvServicesSubMsg\n\ \\n\ - \# HELP simplex_smp_rcv_services_sub_duplicate The count of duplicate subscribed service queues.\n\ - \# TYPE simplex_smp_rcv_services_sub_duplicate counter\n\ - \simplex_smp_rcv_services_sub_duplicate " <> mshow _rcvServicesSubDuplicate <> "\n# rcvServicesSubDuplicate\n\ + \# HELP simplex_smp_rcv_services_sub_duplicate_count The count of duplicate subscribed service queues.\n\ + \# TYPE simplex_smp_rcv_services_sub_duplicate_count counter\n\ + \simplex_smp_rcv_services_sub_duplicate_count " <> mshow _rcvServicesSubDuplicate <> "\n# rcvServicesSubDuplicate\n\ \\n" <> showServices _rcvServices "rcv" "receiving" <> showServices _ntfServices "ntf" "notification" @@ -517,6 +518,10 @@ prometheusMetrics sm rtm ts = \# TYPE simplex_smp_subscribtion_services_total gauge\n\ \simplex_smp_subscribtion_services_total " <> mshow (subServicesCount smpSubs) <> "\n# smp.subServicesCount\n\ \\n\ + \# HELP simplex_smp_subscribtion_service_subs_total Total queues subscribed via services\n\ + \# TYPE simplex_smp_subscribtion_service_subs_total gauge\n\ + \simplex_smp_subscribtion_service_subs_total " <> mshow (subServiceSubsCount smpSubs) <> "\n# smp.subServiceSubsCount\n\ + \\n\ \# HELP simplex_smp_subscription_ntf_total Total notification subscripbtions (from ntf server)\n\ \# TYPE simplex_smp_subscription_ntf_total gauge\n\ \simplex_smp_subscription_ntf_total " <> mshow (subsCount ntfSubs) <> "\n# ntf.subsCount\n\ @@ -529,6 +534,10 @@ prometheusMetrics sm rtm ts = \# TYPE simplex_smp_subscribtion_nts_services_total gauge\n\ \simplex_smp_subscribtion_nts_services_total " <> mshow (subServicesCount ntfSubs) <> "\n# ntf.subServicesCount\n\ \\n\ + \# HELP simplex_smp_subscription_ntf_service_subs_total Total queues subscribed via NTF services\n\ + \# TYPE simplex_smp_subscription_ntf_service_subs_total gauge\n\ + \simplex_smp_subscription_ntf_service_subs_total " <> mshow (subServiceSubsCount ntfSubs) <> "\n# ntf.subServiceSubsCount\n\ + \\n\ \# HELP simplex_smp_loaded_queues_queue_count Total loaded queues count (all queues for memory/journal storage)\n\ \# TYPE simplex_smp_loaded_queues_queue_count gauge\n\ \simplex_smp_loaded_queues_queue_count " <> mshow (loadedQueueCount loadedCounts) <> "\n# loadedCounts.loadedQueueCount\n\ diff --git a/src/Simplex/Messaging/Server/QueueStore/Postgres.hs b/src/Simplex/Messaging/Server/QueueStore/Postgres.hs index bba58e35b..dceecbf4f 100644 --- a/src/Simplex/Messaging/Server/QueueStore/Postgres.hs +++ b/src/Simplex/Messaging/Server/QueueStore/Postgres.hs @@ -91,7 +91,7 @@ import Simplex.Messaging.SystemTime import Simplex.Messaging.TMap (TMap) import qualified Simplex.Messaging.TMap as TM import Simplex.Messaging.Transport (SMPServiceRole (..)) -import Simplex.Messaging.Util (eitherToMaybe, firstRow, ifM, maybeFirstRow, maybeFirstRow', tshow, (<$$>)) +import Simplex.Messaging.Util (eitherToMaybe, firstRow, ifM, maybeFirstRow, maybeFirstRow', tshow, (<$$>), ($>>=)) import System.Exit (exitFailure) import System.IO (IOMode (..), hFlush, stdout) import UnliftIO.STM @@ -505,6 +505,32 @@ instance StoreQueueClass q => QueueStoreClass q (PostgresQueueStore q) where atomically $ writeTVar (queueRec sq) $ Just q' withLog "setQueueService" st $ \sl -> logQueueService sl rId party serviceId + setQueueServices :: (PartyI p, ServiceParty p) => PostgresQueueStore q -> SParty p -> Maybe ServiceId -> [q] -> IO (Either ErrorType (M.Map RecipientId (Either ErrorType ()))) + setQueueServices _ _ _ [] = pure $ Right M.empty + setQueueServices st party serviceId qs = E.uninterruptibleMask_ $ runExceptT $ do + updated <- S.fromList <$> withDB' "setQueueServices" st (\db -> + map fromOnly <$> DB.query db updateQuery (serviceId, In (map recipientId qs))) + results <- liftIO $ forM qs $ \sq -> do + let rId = recipientId sq + (rId,) <$> if S.member rId updated + then readQueueRecIO (queueRec sq) $>>= \q -> do + atomically $ writeTVar (queueRec sq) $ Just $ updateRec q + withLog "setQueueServices" st $ \sl -> logQueueService sl rId party serviceId + pure $ Right () + else pure $ Left AUTH + pure $ M.fromList results + where + updateQuery = case party of + SRecipientService -> + "UPDATE msg_queues SET rcv_service_id = ? WHERE recipient_id IN ? AND deleted_at IS NULL RETURNING recipient_id" + SNotifierService -> + "UPDATE msg_queues SET ntf_service_id = ? WHERE recipient_id IN ? AND notifier_id IS NOT NULL AND deleted_at IS NULL RETURNING recipient_id" + updateRec q = case party of + SRecipientService -> q {rcvServiceId = serviceId} + SNotifierService -> case notifier q of + Just nc -> q {notifier = Just nc {ntfServiceId = serviceId}} + Nothing -> q + getQueueNtfServices :: PostgresQueueStore q -> [(NotifierId, a)] -> IO (Either ErrorType ([(Maybe ServiceId, [(NotifierId, a)])], [(NotifierId, a)])) getQueueNtfServices st ntfs = E.uninterruptibleMask_ $ runExceptT $ do snIds <- diff --git a/src/Simplex/Messaging/Server/QueueStore/STM.hs b/src/Simplex/Messaging/Server/QueueStore/STM.hs index 110a9cd33..1978e4c7c 100644 --- a/src/Simplex/Messaging/Server/QueueStore/STM.hs +++ b/src/Simplex/Messaging/Server/QueueStore/STM.hs @@ -338,6 +338,10 @@ instance StoreQueueClass q => QueueStoreClass q (STMQueueStore q) where mapM_ (removeServiceQueue st serviceSel qId) prevSrvId mapM_ (addServiceQueue st serviceSel qId) serviceId + setQueueServices st party serviceId qs = Right . M.fromList <$> mapM setQueue qs + where + setQueue sq = (recipientId sq,) <$> setQueueService st sq party serviceId + getQueueNtfServices :: STMQueueStore q -> [(NotifierId, a)] -> IO (Either ErrorType ([(Maybe ServiceId, [(NotifierId, a)])], [(NotifierId, a)])) getQueueNtfServices st ntfs = do ss <- readTVarIO (services st) diff --git a/src/Simplex/Messaging/Server/QueueStore/Types.hs b/src/Simplex/Messaging/Server/QueueStore/Types.hs index 7d1d439bd..415a5f33c 100644 --- a/src/Simplex/Messaging/Server/QueueStore/Types.hs +++ b/src/Simplex/Messaging/Server/QueueStore/Types.hs @@ -16,6 +16,7 @@ import Control.Concurrent.STM import Control.Monad import Data.Int (Int64) import Data.List.NonEmpty (NonEmpty) +import Data.Map.Strict (Map) import Data.Text (Text) import Simplex.Messaging.Protocol import Simplex.Messaging.Server.QueueStore @@ -51,6 +52,7 @@ class StoreQueueClass q => QueueStoreClass q s where deleteStoreQueue :: s -> q -> IO (Either ErrorType QueueRec) getCreateService :: s -> ServiceRec -> IO (Either ErrorType ServiceId) setQueueService :: (PartyI p, ServiceParty p) => s -> q -> SParty p -> Maybe ServiceId -> IO (Either ErrorType ()) + setQueueServices :: (PartyI p, ServiceParty p) => s -> SParty p -> Maybe ServiceId -> [q] -> IO (Either ErrorType (Map RecipientId (Either ErrorType ()))) getQueueNtfServices :: s -> [(NotifierId, a)] -> IO (Either ErrorType ([(Maybe ServiceId, [(NotifierId, a)])], [(NotifierId, a)])) getServiceQueueCountHash :: (PartyI p, ServiceParty p) => s -> SParty p -> ServiceId -> IO (Either ErrorType (Int64, IdsHash)) diff --git a/src/Simplex/Messaging/Server/Web.hs b/src/Simplex/Messaging/Server/Web.hs index 1f4430af7..7044a7e39 100644 --- a/src/Simplex/Messaging/Server/Web.hs +++ b/src/Simplex/Messaging/Server/Web.hs @@ -18,21 +18,24 @@ module Simplex.Messaging.Server.Web timedTTLText, ) where +import qualified Codec.Compression.GZip as GZip import Control.Logger.Simple import Control.Monad import Data.ByteString (ByteString) -import Data.ByteString.Builder (byteString) +import Data.ByteString.Builder (byteString, lazyByteString) import qualified Data.ByteString.Char8 as B +import qualified Data.ByteString.Lazy as LB import Data.Char (toUpper) import Data.IORef (readIORef) import Data.List (isPrefixOf, isSuffixOf) import Data.Maybe (fromMaybe) import qualified Data.Text as T import Data.Text.Encoding (encodeUtf8) +import Network.HPACK.Token (tokenKey) import qualified Network.HTTP.Types as N import qualified Network.HTTP2.Server as H import Network.Socket (getPeerName) -import Network.Wai (Application, Request (..)) +import Network.Wai (Application, Request (..), responseLBS) import Network.Wai.Application.Static (StaticSettings (..)) import qualified Network.Wai.Application.Static as S import qualified Network.Wai.Handler.Warp as W @@ -43,7 +46,7 @@ import Simplex.Messaging.Server (AttachHTTP) import Simplex.Messaging.Server.CLI (simplexmqCommit) import Simplex.Messaging.Server.Information import Simplex.Messaging.Transport (simplexMQVersion) -import Simplex.Messaging.Util (ifM, tshow) +import Simplex.Messaging.Util (tshow) import System.Directory (canonicalizePath, createDirectoryIfMissing, doesFileExist) import System.FilePath import UnliftIO.Concurrent (forkFinally) @@ -71,6 +74,7 @@ data EmbeddedContent = EmbeddedContent serveStaticFiles :: EmbeddedWebParams -> IO () serveStaticFiles EmbeddedWebParams {webStaticPath, webHttpPort, webHttpsParams} = do + app <- staticFiles webStaticPath forM_ webHttpPort $ \port -> flip forkFinally (\e -> logError $ "HTTP server crashed: " <> tshow e) $ do logInfo $ "Serving static site on port " <> tshow port W.runSettings (mkSettings port) app @@ -78,12 +82,12 @@ serveStaticFiles EmbeddedWebParams {webStaticPath, webHttpPort, webHttpsParams} logInfo $ "Serving static site on port " <> tshow port <> " (TLS)" WT.runTLS (WT.tlsSettings cert key) (mkSettings port) app where - app = staticFiles webStaticPath mkSettings port = W.setPort port warpSettings -- | Prepare context and prepare HTTP handler for TLS connections that already passed TLS.handshake and ALPN check. attachStaticFiles :: FilePath -> (AttachHTTP -> IO ()) -> IO () -attachStaticFiles path action = +attachStaticFiles path action = do + app <- staticFiles path -- Initialize global internal state for http server. WI.withII warpSettings $ \ii -> do action $ \socket cxt -> do @@ -94,7 +98,6 @@ attachStaticFiles path action = -- Run Warp connection handler to process HTTP requests for static files. WI.serveConnection conn ii th addr transport warpSettings app where - app = staticFiles path -- from warp-tls withConnection socket cxt = bracket (WT.attachConn socket cxt) (terminate . fst) -- from warp @@ -108,8 +111,10 @@ attachStaticFiles path action = warpSettings :: W.Settings warpSettings = W.setGracefulShutdownTimeout (Just 1) W.defaultSettings -staticFiles :: FilePath -> Application -staticFiles root = S.staticApp settings . changeWellKnownPath +staticFiles :: FilePath -> IO Application +staticFiles root = do + canonRoot <- canonicalizePath root + pure $ withGzipFiles canonRoot (S.staticApp settings) . changeWellKnownPath where settings = defSettings {ssListing = Nothing, ssGetMimeType = getMimeType} defSettings = S.defaultFileServerSettings root @@ -120,10 +125,21 @@ staticFiles root = S.staticApp settings . changeWellKnownPath ".well-known" : rest -> req { pathInfo = "well-known" : rest, - rawPathInfo = "/well-known/" <> B.drop pfxLen (rawPathInfo req) + rawPathInfo = rewriteWellKnown (rawPathInfo req) } _ -> req - pfxLen = B.length "/.well-known/" + +-- | WAI middleware that gzip-compresses static files on the fly when client accepts gzip. +-- Falls through to the wrapped app for non-compressible files or when gzip is not accepted. +withGzipFiles :: FilePath -> Application -> Application +withGzipFiles canonRoot app req respond + | acceptsGzipWAI req = + resolveStaticFile canonRoot (rawPathInfo req) >>= \case + Just (file, mime) | isCompressible file -> do + content <- B.readFile file + respond $ responseLBS N.ok200 (staticResponseHeaders mime True) (GZip.compress $ LB.fromStrict content) + _ -> app req respond + | otherwise = app req respond generateSite :: EmbeddedContent -> ByteString -> [String] -> FilePath -> IO () generateSite embedded indexContent linkPages sitePath = do @@ -147,43 +163,77 @@ generateSite embedded indexContent linkPages sitePath = do -- Path traversal protection: resolved path must stay under canonicalRoot. -- canonicalRoot must be pre-computed via 'canonicalizePath'. serveStaticPageH2 :: FilePath -> H.Request -> (H.Response -> IO ()) -> IO Bool -serveStaticPageH2 canonicalRoot req sendResponse = do - let rawPath = fromMaybe "/" $ H.requestPath req - path = rewriteWellKnownH2 rawPath - relPath = B.unpack $ B.dropWhile (== '/') path +serveStaticPageH2 canonRoot req sendResponse = do + let rawPath = rewriteWellKnown $ fromMaybe "/" $ H.requestPath req + resolveStaticFile canonRoot rawPath >>= \case + Just (file, mime) -> do + content <- B.readFile file + let gz = acceptsGzipH2 req && isCompressible file + body + | gz = lazyByteString $ GZip.compress $ LB.fromStrict content + | otherwise = byteString content + sendResponse $ H.responseBuilder N.ok200 (staticResponseHeaders mime gz) body + pure True + Nothing -> pure False + +-- | Resolve a static file request to a file path. +-- Handles index.html fallback and path traversal protection. +-- canonRoot must be pre-computed via 'canonicalizePath'. +resolveStaticFile :: FilePath -> ByteString -> IO (Maybe (FilePath, ByteString)) +resolveStaticFile canonRoot path = do + let relPath = B.unpack $ B.dropWhile (== '/') path requestedPath - | null relPath || relPath == "/" = canonicalRoot "index.html" - | otherwise = canonicalRoot relPath - indexPath = requestedPath "index.html" - ifM - (doesFileExist requestedPath) - (serveSafe requestedPath) - (ifM (doesFileExist indexPath) (serveSafe indexPath) (pure False)) + | null relPath = canonRoot "index.html" + | otherwise = canonRoot relPath + tryResolve requestedPath + >>= maybe (tryResolve (requestedPath "index.html")) (pure . Just) where - serveSafe filePath = do - canonicalFile <- canonicalizePath filePath - if (canonicalRoot <> "/") `isPrefixOf` canonicalFile || canonicalRoot == canonicalFile + tryResolve filePath = do + exists <- doesFileExist filePath + if exists then do - content <- B.readFile canonicalFile - sendResponse $ H.responseBuilder N.ok200 [("Content-Type", staticMimeType canonicalFile)] (byteString content) - pure True - else pure False -- path traversal attempt - rewriteWellKnownH2 p - | "/.well-known/" `B.isPrefixOf` p = "/well-known/" <> B.drop (B.length "/.well-known/") p - | otherwise = p - staticMimeType fp - | ".html" `isSuffixOf` fp = "text/html" - | ".css" `isSuffixOf` fp = "text/css" - | ".js" `isSuffixOf` fp = "application/javascript" - | ".svg" `isSuffixOf` fp = "image/svg+xml" - | ".png" `isSuffixOf` fp = "image/png" - | ".ico" `isSuffixOf` fp = "image/x-icon" - | ".json" `isSuffixOf` fp = "application/json" - | "apple-app-site-association" `isSuffixOf` fp = "application/json" - | ".woff" `isSuffixOf` fp = "font/woff" - | ".woff2" `isSuffixOf` fp = "font/woff2" - | ".ttf" `isSuffixOf` fp = "font/ttf" - | otherwise = "application/octet-stream" + canonFile <- canonicalizePath filePath + if (canonRoot <> "/") `isPrefixOf` canonFile || canonRoot == canonFile + then pure $ Just (canonFile, staticMimeType canonFile) + else pure Nothing -- path traversal attempt + else pure Nothing + +rewriteWellKnown :: ByteString -> ByteString +rewriteWellKnown p + | "/.well-known/" `B.isPrefixOf` p = "/well-known/" <> B.drop (B.length "/.well-known/") p + | p == "/.well-known" = "/well-known" + | otherwise = p + +acceptsGzipH2 :: H.Request -> Bool +acceptsGzipH2 req = any (\(t, v) -> tokenKey t == "accept-encoding" && "gzip" `B.isInfixOf` v) (fst $ H.requestHeaders req) + +acceptsGzipWAI :: Request -> Bool +acceptsGzipWAI req = maybe False ("gzip" `B.isInfixOf`) $ lookup "Accept-Encoding" (requestHeaders req) + +isCompressible :: FilePath -> Bool +isCompressible fp = + any (`isSuffixOf` fp) [".html", ".css", ".js", ".svg", ".json"] + || "apple-app-site-association" `isSuffixOf` fp + +staticResponseHeaders :: ByteString -> Bool -> [N.Header] +staticResponseHeaders mime gz + | gz = [("Content-Type", mime), ("Content-Encoding", "gzip"), ("Vary", "Accept-Encoding")] + | otherwise = [("Content-Type", mime)] + +staticMimeType :: FilePath -> ByteString +staticMimeType fp + | ".html" `isSuffixOf` fp = "text/html" + | ".css" `isSuffixOf` fp = "text/css" + | ".js" `isSuffixOf` fp = "application/javascript" + | ".svg" `isSuffixOf` fp = "image/svg+xml" + | ".png" `isSuffixOf` fp = "image/png" + | ".ico" `isSuffixOf` fp = "image/x-icon" + | ".json" `isSuffixOf` fp = "application/json" + | "apple-app-site-association" `isSuffixOf` fp = "application/json" + | ".woff" `isSuffixOf` fp = "font/woff" + | ".woff2" `isSuffixOf` fp = "font/woff2" + | ".ttf" `isSuffixOf` fp = "font/ttf" + | otherwise = "application/octet-stream" -- | Substitutions for server information fields shared between SMP and XFTP pages. serverInfoSubsts :: String -> Maybe ServerPublicInfo -> [(ByteString, Maybe ByteString)] @@ -291,7 +341,7 @@ section_ label content' src = let next = B.drop (B.length endMarker) next' in case content' of Just content -> before <> item_ label content inside <> section_ label content' next - Nothing -> before <> next -- collapse section + Nothing -> before <> section_ label Nothing next -- collapse section where startMarker = " label <> ">" endMarker = " label <> ">" diff --git a/src/Simplex/Messaging/Util.hs b/src/Simplex/Messaging/Util.hs index abbf5a3b3..f8cef6b69 100644 --- a/src/Simplex/Messaging/Util.hs +++ b/src/Simplex/Messaging/Util.hs @@ -381,6 +381,7 @@ groupAllOn f = groupOn f . sortOn f -- n must be > 0 toChunks :: Int -> [a] -> [NonEmpty a] toChunks _ [] = [] +toChunks 0 (x : xs) = [x :| xs] toChunks n xs = let (ys, xs') = splitAt n xs in maybe id (:) (L.nonEmpty ys) (toChunks n xs') diff --git a/src/Simplex/RemoteControl/Invitation.hs b/src/Simplex/RemoteControl/Invitation.hs index d606c4ff0..90be1d5fb 100644 --- a/src/Simplex/RemoteControl/Invitation.hs +++ b/src/Simplex/RemoteControl/Invitation.hs @@ -108,9 +108,9 @@ instance StrEncoding RCSignedInvitation where mconcat [ strEncode invitation, "&ssig=", - strEncode $ C.signatureBytes ssig, + strEncode ssig, "&idsig=", - strEncode $ C.signatureBytes idsig + strEncode idsig ] strP = do diff --git a/src/Simplex/RemoteControl/Types.hs b/src/Simplex/RemoteControl/Types.hs index dfeeb9477..48c623e7c 100644 --- a/src/Simplex/RemoteControl/Types.hs +++ b/src/Simplex/RemoteControl/Types.hs @@ -13,7 +13,6 @@ module Simplex.RemoteControl.Types RCPVersion, VersionRCP, VersionRangeRCP, - IpProbe (..), RCHostHello (..), RCCtrlHello (..), RCHostPairing (..), @@ -141,16 +140,6 @@ currentRCPVersion = VersionRCP 1 supportedRCPVRange :: VersionRangeRCP supportedRCPVRange = mkVersionRange (VersionRCP 1) currentRCPVersion -data IpProbe = IpProbe - { versionRange :: VersionRangeRCP, - randomNonce :: ByteString - } - deriving (Show) - -instance Encoding IpProbe where - smpEncode IpProbe {versionRange, randomNonce} = smpEncode (versionRange, 'I', randomNonce) - smpP = IpProbe <$> (smpP <* "I") *> smpP - -- * Session data RCHostHello = RCHostHello diff --git a/tests/AgentTests/FunctionalAPITests.hs b/tests/AgentTests/FunctionalAPITests.hs index b824b61c3..fba0eac4a 100644 --- a/tests/AgentTests/FunctionalAPITests.hs +++ b/tests/AgentTests/FunctionalAPITests.hs @@ -110,6 +110,7 @@ import Simplex.Messaging.Server.MsgStore.Types (SMSType (..), SQSType (..)) import Simplex.Messaging.Server.QueueStore.QueueInfo import Simplex.Messaging.Server.StoreLog (StoreLogRecord (..)) import Simplex.Messaging.Transport (ASrvTransport, SMPVersion, VersionSMP, authCmdsSMPVersion, currentServerSMPRelayVersion, minClientSMPRelayVersion, minServerSMPRelayVersion, sendingProxySMPVersion, sndAuthKeySMPVersion, alpnSupportedSMPHandshakes, supportedServerSMPRelayVRange) +import Simplex.Messaging.Transport.Server (TransportServerConfig (..)) import Simplex.Messaging.Util (bshow, diffToMicroseconds) import Simplex.Messaging.Version (VersionRange (..)) import qualified Simplex.Messaging.Version as V @@ -405,6 +406,7 @@ functionalAPITests ps = do it "should expire multiple messages" $ testExpireManyMessages ps it "should expire one message if quota is exceeded" $ testExpireMessageQuota ps it "should expire multiple messages if quota is exceeded" $ testExpireManyMessagesQuota ps + it "should drop message after too many receive attempts" $ testDropMsgAfterRcvAttempts ps #if !defined(dbPostgres) -- TODO [postgres] restore from outdated db backup (we use copyFile/renameFile for sqlite) describe "Ratchet synchronization" $ do @@ -491,6 +493,9 @@ functionalAPITests ps = do describe "Client service certificates" $ do it "should connect, subscribe and reconnect as a service" $ testClientServiceConnection ps it "should re-subscribe when service ID changed" $ testClientServiceIDChange ps + it "should clear pending service sub when service unavailable" $ testServiceUnavailableClearsPending ps + it "should recover when service ID changes on reconnect" $ testServiceIdChangeOnReconnect ps + it "should handle service unavailable on startup" $ testServiceUnavailableOnStartup ps it "migrate connections to and from service" $ testMigrateConnectionsToService ps describe "Connection switch" $ do describe "should switch delivery to the new queue" $ @@ -1653,10 +1658,11 @@ testPrepareCreateConnectionLink ps = withSmpServer ps $ withAgentClients2 $ \a b userCtData = UserContactData {direct = True, owners = [], relays = [], userData} userLinkData = UserContactLinkData userCtData g <- C.newRandom + rootKey <- atomically $ C.generateKeyPair g linkEntId <- atomically $ C.randomBytes 32 g runRight $ do - ((_rootPubKey, _rootPrivKey), ccLink@(CCLink connReq (Just shortLink)), preparedParams) <- - A.prepareConnectionLink a 1 (Just linkEntId) True Nothing + (ccLink@(CCLink connReq (Just shortLink)), preparedParams) <- + A.prepareConnectionLink a 1 rootKey linkEntId True Nothing liftIO $ strDecode (strEncode shortLink) `shouldBe` Right shortLink _ <- A.createConnectionForLink a NRMInteractive 1 True ccLink preparedParams userLinkData CR.IKPQOn SMSubscribe (FixedLinkData {linkConnReq = connReq', linkEntityId}, ContactLinkData _ userCtData') <- getConnShortLink b 1 shortLink @@ -2100,6 +2106,38 @@ testExpireManyMessagesQuota (t, msType) = withSmpServerConfigOn t cfg' testPort where cfg' = updateCfg (cfgMS msType) $ \cfg_ -> cfg_ {msgQueueQuota = 1, maxJournalMsgCount = 2} +testDropMsgAfterRcvAttempts :: HasCallStack => (ASrvTransport, AStoreType) -> IO () +testDropMsgAfterRcvAttempts ps = + withSmpServerStoreLogOn ps testPort $ \_ -> do + let rcvCfg = agentCfg {rcvExpireCount = 2, rcvExpireInterval = 1} + alice <- getSMPAgentClient' 1 agentCfg initAgentServers testDB + bob <- getSMPAgentClient' 2 rcvCfg initAgentServers testDB2 + (aliceId, bobId) <- runRight $ makeConnection alice bob + -- alice sends, bob receives but does NOT ack + runRight_ $ do + 2 <- sendMessage alice bobId SMP.noMsgFlags "hello" + get alice ##> ("", bobId, SENT 2) + get bob =##> \case ("", c, Msg "hello") -> c == aliceId; _ -> False + -- bob disconnects without acking + disposeAgentClient bob + threadDelay 500000 + -- bob reconnects, agent sees duplicate, counter=1 + bob2 <- getSMPAgentClient' 3 rcvCfg initAgentServers testDB2 + runRight_ $ do + subscribeConnection bob2 aliceId + get bob2 =##> \case ("", c, Msg "hello") -> c == aliceId; _ -> False + -- bob disconnects again without acking + disposeAgentClient bob2 + -- wait for rcvExpireInterval (1 second) + threadDelay 500000 + -- bob reconnects, agent sees duplicate, counter=2, interval exceeded -> drops + bob3 <- getSMPAgentClient' 4 rcvCfg initAgentServers testDB2 + runRight_ $ do + subscribeConnection bob3 aliceId + get bob3 =##> \case ("", c, ERR (AGENT (A_DUPLICATE (Just DroppedMsg {})))) -> c == aliceId; _ -> False + disposeAgentClient bob3 + disposeAgentClient alice + testRatchetSync :: HasCallStack => (ASrvTransport, AStoreType) -> IO () testRatchetSync ps = withAgentClients2 $ \alice bob -> withSmpServerStoreMsgLogOn ps testPort $ \_ -> do @@ -2735,7 +2773,7 @@ testGetConnShortLinkAsync ps = withAgentClients2 $ \alice bob -> newLinkData = UserContactLinkData userCtData (_, CCLink qInfo (Just shortLink)) <- A.createConnection alice NRMInteractive 1 True True SCMContact (Just newLinkData) Nothing IKPQOn SMSubscribe -- get link data async - creates new connection for bob - newId <- getConnShortLinkAsync bob 1 "1" shortLink + newId <- getConnShortLinkAsync bob 1 "1" Nothing shortLink ("1", newId', LDATA FixedLinkData {linkConnReq = qInfo'} (ContactLinkData _ userCtData')) <- get bob liftIO $ newId' `shouldBe` newId liftIO $ qInfo' `shouldBe` qInfo @@ -3223,7 +3261,7 @@ phase c connId d p statsExpectation = d `shouldBe` d' p `shouldBe` p' statsExpectation stats - ERR (AGENT A_DUPLICATE) -> phase c connId d p statsExpectation + ERR (AGENT A_DUPLICATE {}) -> phase c connId d p statsExpectation r -> do liftIO . putStrLn $ "expected: " <> show p <> ", received: " <> show r SWITCH {} <- pure r @@ -3905,6 +3943,131 @@ testClientServiceIDChange ps@(_, ASType qs _) = do ("", "", UP _ [_]) <- nGet user exchangeGreetingsMsgId 6 notService uId user sId +-- | Test that service subscription is correctly cleared and re-established +-- when server temporarily stops supporting services (askClientCert = False). +testServiceUnavailableClearsPending :: HasCallStack => (ASrvTransport, AStoreType) -> IO () +testServiceUnavailableClearsPending (t, msType) = do + -- Same agent across all phases to test pendingServiceSub persistence + withAgentClientsServers2 (agentCfg, initAgentServersClientService) (agentCfg, initAgentServers) $ \service user -> do + -- Phase 1: Establish connection with active service subscription on normal server + (_sId, _uId) <- withSmpServerStoreLogOn (t, msType) testPort $ \_ -> runRight $ do + conns@(sId, uId) <- makeConnection service user + exchangeGreetings service uId user sId + pure conns + ("", "", SERVICE_DOWN _ _) <- nGet service + ("", "", DOWN _ [_]) <- nGet user + -- Phase 2: Server without service support: agent gets NO_SERVICE, queue resubscribed without service + let cfgNoService = updateCfg (cfgMS msType) $ \(cfg' :: ServerConfig s) -> + let ServerConfig {transportConfig} = cfg' + in cfg' {transportConfig = transportConfig {askClientCert = False}} :: ServerConfig s + withSmpServerConfigOn t cfgNoService testPort $ \_ -> do + ("", "", ERR (BROKER _ NO_SERVICE)) <- get service + ("", "", UP _ [_]) <- nGet service + ("", "", UP _ [_]) <- nGet user + pure () + ("", "", DOWN _ [_]) <- nGet service + ("", "", DOWN _ [_]) <- nGet user + -- Phase 3: Server with service support restored: only queue subscription, no service subscription + withSmpServerStoreLogOn (t, msType) testPort $ \_ -> do + e1 <- nGet service + case e1 of + ("", "", UP _ [_]) -> pure () -- Fixed: only queue subscription, no service subscription + ("", "", SERVICE_UP _ _) -> + expectationFailure "pendingServiceSub not cleared, service subscription attempted again" + ("", "", SERVICE_ALL _) -> + expectationFailure "pendingServiceSub not cleared, service subscription attempted again" + other -> expectationFailure $ "Unexpected first event: " <> show other + ("", "", UP _ [_]) <- nGet user + pure () + -- Phase 4: After another reconnect cycle, service subscription is re-established + ("", "", SERVICE_DOWN _ _) <- nGet service + ("", "", DOWN _ [_]) <- nGet user + withSmpServerStoreLogOn (t, msType) testPort $ \_ -> do + liftIO $ getInAnyOrder service + [ \case ("", "", AEvt SAENone (SERVICE_UP _ _)) -> True; _ -> False, + \case ("", "", AEvt SAENone (SERVICE_ALL _)) -> True; _ -> False + ] + ("", "", UP _ [_]) <- nGet user + pure () + +-- | Test that service subscription recovers when service ID changes on reconnect. +-- Server restart with deleted service causes new service ID, triggering SSErrorServiceId. +-- Queues should be unassociated, resubscribed, and re-associated with new service. +testServiceIdChangeOnReconnect :: HasCallStack => (ASrvTransport, AStoreType) -> IO () +testServiceIdChangeOnReconnect ps@(_, ASType qs _) = do + withAgentClientsServers2 (agentCfg, initAgentServersClientService) (agentCfg, initAgentServers) $ \service user -> do + -- Phase 1: Establish connection with active service subscription + (_sId, _uId) <- withSmpServerStoreLogOn ps testPort $ \_ -> runRight $ do + conns@(sId, uId) <- makeConnection service user + exchangeGreetings service uId user sId + pure conns + ("", "", SERVICE_DOWN _ _) <- nGet service + ("", "", DOWN _ [_]) <- nGet user + -- Delete service from server storage, keeping queues + _ :: () <- case qs of + SQSPostgres -> do +#if defined(dbServerPostgres) + st <- either (error . show) pure =<< Postgres.createDBStore testStoreDBOpts serverMigrations (MigrationConfig MCError Nothing) + void $ Postgres.withTransaction st (`PSQL.execute_` "DELETE FROM services") +#else + pure () +#endif + SQSMemory -> do + s <- readFile testStoreLogFile + removeFile testStoreLogFile + writeFile testStoreLogFile $ unlines $ filter (not . ("NEW_SERVICE" `isPrefixOf`)) $ lines s + -- Phase 2: Server restart with deleted service - new service ID, SSErrorServiceId + withSmpServerStoreLogOn ps testPort $ \_ -> do + ("", "", SERVICE_UP _ _) <- nGet service + ("", "", UP _ [_]) <- nGet user + pure () + -- Phase 3: Normal reconnect - service should subscribe normally + ("", "", SERVICE_DOWN _ _) <- nGet service + ("", "", DOWN _ [_]) <- nGet user + withSmpServerStoreLogOn ps testPort $ \_ -> do + liftIO $ getInAnyOrder service + [ \case ("", "", AEvt SAENone (SERVICE_UP _ _)) -> True; _ -> False, + \case ("", "", AEvt SAENone (SERVICE_ALL _)) -> True; _ -> False + ] + ("", "", UP _ [_]) <- nGet user + pure () + +-- | Test that subscribeAllConnections handles service unavailable on startup. +-- Agent has service credentials but server doesn't support services (askClientCert = False). +testServiceUnavailableOnStartup :: HasCallStack => (ASrvTransport, AStoreType) -> IO () +testServiceUnavailableOnStartup (t, msType) = do + let srv = initAgentServersClientService + noSrv = initAgentServers + -- Phase 1: Establish connection with service + (sId, uId) <- withAgentClientsServers2 (agentCfg, srv) (agentCfg, noSrv) $ \service user -> + withSmpServerStoreLogOn (t, msType) testPort $ \_ -> runRight $ do + conns@(sId, uId) <- makeConnection service user + exchangeGreetings service uId user sId + pure conns + -- Phase 2: Server without service support, new service agent + let cfgNoService = updateCfg (cfgMS msType) $ \(cfg' :: ServerConfig s) -> + let ServerConfig {transportConfig} = cfg' + in cfg' {transportConfig = transportConfig {askClientCert = False}} :: ServerConfig s + -- Phase 2: Server without service support, service agent gets NO_SERVICE + withAgentClientsServers2 (agentCfg, srv) (agentCfg, noSrv) $ \service user -> + withSmpServerConfigOn t cfgNoService testPort $ \_ -> runRight $ do + subscribeAllConnections service False Nothing + ("", "", ERR (BROKER _ NO_SERVICE)) <- get service + ("", "", UP _ [_]) <- nGet service + subscribeAllConnections user False Nothing + ("", "", UP _ [_]) <- nGet user + exchangeGreetingsMsgId 4 service uId user sId + -- Phase 3: Normal server - cert was deleted, new cert generated, + -- no service sub in DB yet, queues subscribed individually + withAgentClientsServers2 (agentCfg, srv) (agentCfg, noSrv) $ \service user -> + withSmpServerStoreLogOn (t, msType) testPort $ \_ -> runRight $ do + liftIO $ threadDelay 250000 + subscribeAllConnections service False Nothing + ("", "", UP _ [_]) <- nGet service + subscribeAllConnections user False Nothing + ("", "", UP _ [_]) <- nGet user + exchangeGreetingsMsgId 6 service uId user sId + testMigrateConnectionsToService :: HasCallStack => (ASrvTransport, AStoreType) -> IO () testMigrateConnectionsToService ps = do (((sId1, uId1), (uId2, sId2)), ((sId3, uId3), (uId4, sId4)), ((sId5, uId5), (uId6, sId6))) <- diff --git a/tests/CoreTests/XFTPStoreTests.hs b/tests/CoreTests/XFTPStoreTests.hs new file mode 100644 index 000000000..85e951ed6 --- /dev/null +++ b/tests/CoreTests/XFTPStoreTests.hs @@ -0,0 +1,274 @@ +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} + +module CoreTests.XFTPStoreTests (xftpStoreTests, xftpMigrationTests) where + +import Control.Monad +import Data.Word (Word32) +import Simplex.FileTransfer.Protocol (FileInfo (..), SFileParty (..)) +import Simplex.FileTransfer.Server.Store +import Simplex.FileTransfer.Server.Store.Postgres (PostgresFileStore, importFileStore, exportFileStore) +import Simplex.FileTransfer.Server.StoreLog (closeStoreLog, readWriteFileStore, writeFileStore) +import Simplex.FileTransfer.Transport (XFTPErrorType (..)) +import qualified Simplex.Messaging.Crypto as C +import Simplex.Messaging.Protocol (BlockingInfo (..), BlockingReason (..), EntityId (..)) +import Simplex.Messaging.Server.QueueStore (ServerEntityStatus (..)) +import Simplex.Messaging.Server.StoreLog (openWriteStoreLog) +import Simplex.Messaging.SystemTime (RoundedSystemTime (..)) +import System.Directory (doesFileExist, removeFile) +import Test.Hspec hiding (fit, it) +import UnliftIO.STM +import Util +import XFTPClient (testXFTPPostgresCfg) + +xftpStoreTests :: Spec +xftpStoreTests = describe "PostgresFileStore operations" $ do + it "should add and get file by sender" testAddGetFileSender + it "should add and get file by recipient" testAddGetFileRecipient + it "should reject duplicate file" testDuplicateFile + it "should return AUTH for nonexistent file" testGetNonexistent + it "should set file path with IS NULL guard" testSetFilePath + it "should reject duplicate recipient" testDuplicateRecipient + it "should delete file and cascade recipients" testDeleteFileCascade + it "should block file and update status" testBlockFile + it "should ack file reception" testAckFile + it "should return expired files with limit" testExpiredFiles + it "should compute used storage and file count" testStorageAndCount + +xftpMigrationTests :: Spec +xftpMigrationTests = describe "XFTP migration round-trip" $ do + it "should export to StoreLog and import back to Postgres preserving data" testMigrationRoundTrip + +-- Test helpers + +withPgStore :: (PostgresFileStore -> IO ()) -> IO () +withPgStore test = do + st <- newFileStore testXFTPPostgresCfg :: IO PostgresFileStore + test st + closeFileStore st + +testSenderId :: EntityId +testSenderId = EntityId "sender001_______" + +testRecipientId :: EntityId +testRecipientId = EntityId "recipient001____" + +testFileInfo :: C.APublicAuthKey -> FileInfo +testFileInfo sndKey = + FileInfo + { sndKey, + size = 128000 :: Word32, + digest = "test_digest_bytes_here___" + } + +testCreatedAt :: RoundedFileTime +testCreatedAt = RoundedSystemTime 1000000 + +-- Tests + +testAddGetFileSender :: Expectation +testAddGetFileSender = withPgStore $ \st -> do + g <- C.newRandom + (sk, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sk + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + result <- getFile st SFSender testSenderId + case result of + Right (FileRec {senderId, fileInfo = fi, createdAt}, key) -> do + senderId `shouldBe` testSenderId + sndKey fi `shouldBe` sk + size fi `shouldBe` 128000 + createdAt `shouldBe` testCreatedAt + key `shouldBe` sk + Left e -> expectationFailure $ "getFile failed: " <> show e + +testAddGetFileRecipient :: Expectation +testAddGetFileRecipient = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (rcpKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + addRecipient st testSenderId (FileRecipient testRecipientId rcpKey) `shouldReturn` Right () + result <- getFile st SFRecipient testRecipientId + case result of + Right (FileRec {senderId}, key) -> do + senderId `shouldBe` testSenderId + key `shouldBe` rcpKey + Left e -> expectationFailure $ "getFile failed: " <> show e + +testDuplicateFile :: Expectation +testDuplicateFile = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Left DUPLICATE_ + +testGetNonexistent :: Expectation +testGetNonexistent = withPgStore $ \st -> do + getFile st SFSender testSenderId >>= (`shouldBe` Left AUTH) . fmap (const ()) + getFile st SFRecipient testRecipientId >>= (`shouldBe` Left AUTH) . fmap (const ()) + +testSetFilePath :: Expectation +testSetFilePath = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + setFilePath st testSenderId "/tmp/test_file" `shouldReturn` Right () + -- Second setFilePath should fail (file_path IS NULL guard) + setFilePath st testSenderId "/tmp/other_file" `shouldReturn` Left AUTH + -- Verify path was set + result <- getFile st SFSender testSenderId + case result of + Right (FileRec {filePath}, _) -> readTVarIO filePath `shouldReturn` Just "/tmp/test_file" + Left e -> expectationFailure $ "getFile failed: " <> show e + +testDuplicateRecipient :: Expectation +testDuplicateRecipient = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (rcpKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + addRecipient st testSenderId (FileRecipient testRecipientId rcpKey) `shouldReturn` Right () + addRecipient st testSenderId (FileRecipient testRecipientId rcpKey) `shouldReturn` Left DUPLICATE_ + +testDeleteFileCascade :: Expectation +testDeleteFileCascade = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (rcpKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + addRecipient st testSenderId (FileRecipient testRecipientId rcpKey) `shouldReturn` Right () + deleteFile st testSenderId `shouldReturn` Right () + -- File and recipient should both be gone + getFile st SFSender testSenderId >>= (`shouldBe` Left AUTH) . fmap (const ()) + getFile st SFRecipient testRecipientId >>= (`shouldBe` Left AUTH) . fmap (const ()) + +testBlockFile :: Expectation +testBlockFile = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + let blockInfo = BlockingInfo {reason = BRContent, notice = Nothing} + blockFile st testSenderId blockInfo False `shouldReturn` Right () + result <- getFile st SFSender testSenderId + case result of + Right (FileRec {fileStatus}, _) -> readTVarIO fileStatus `shouldReturn` EntityBlocked blockInfo + Left e -> expectationFailure $ "getFile failed: " <> show e + +testAckFile :: Expectation +testAckFile = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (rcpKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + addFile st testSenderId fileInfo testCreatedAt EntityActive `shouldReturn` Right () + addRecipient st testSenderId (FileRecipient testRecipientId rcpKey) `shouldReturn` Right () + ackFile st testRecipientId `shouldReturn` Right () + -- Recipient gone, but file still exists + getFile st SFRecipient testRecipientId >>= (`shouldBe` Left AUTH) . fmap (const ()) + result <- getFile st SFSender testSenderId + case result of + Right _ -> pure () + Left e -> expectationFailure $ "getFile failed: " <> show e + +testExpiredFiles :: Expectation +testExpiredFiles = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo = testFileInfo sndKey + oldTime = RoundedSystemTime 100000 + newTime = RoundedSystemTime 999999999 + -- Add old and new files + addFile st (EntityId "old_file________") fileInfo oldTime EntityActive `shouldReturn` Right () + void $ setFilePath st (EntityId "old_file________") "/tmp/old" + addFile st (EntityId "new_file________") fileInfo newTime EntityActive `shouldReturn` Right () + -- Query expired with cutoff that only catches old file + expired <- expiredFiles st 500000 100 + length expired `shouldBe` 1 + case expired of + [(sId, path, sz)] -> do + sId `shouldBe` EntityId "old_file________" + path `shouldBe` Just "/tmp/old" + sz `shouldBe` 128000 + _ -> expectationFailure "expected 1 expired file" + +testStorageAndCount :: Expectation +testStorageAndCount = withPgStore $ \st -> do + g <- C.newRandom + (sndKey, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + getUsedStorage st `shouldReturn` 0 + getFileCount st `shouldReturn` 0 + let fileInfo = testFileInfo sndKey + addFile st (EntityId "file_a__________") fileInfo testCreatedAt EntityActive `shouldReturn` Right () + addFile st (EntityId "file_b__________") fileInfo testCreatedAt EntityActive `shouldReturn` Right () + getFileCount st `shouldReturn` 2 + used <- getUsedStorage st + used `shouldBe` 256000 -- 128000 * 2 + +-- Migration round-trip test + +testMigrationRoundTrip :: Expectation +testMigrationRoundTrip = do + let storeLogPath = "tests/tmp/xftp-migration-test.log" + storeLogPath2 = "tests/tmp/xftp-migration-test2.log" + -- 1. Create STM store with test data + stmStore <- newFileStore () :: IO STMFileStore + g <- C.newRandom + (sndKey1, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (rcpKey1, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (sndKey2, _) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + let fileInfo1 = testFileInfo sndKey1 + fileInfo2 = FileInfo {sndKey = sndKey2, size = 64000, digest = "other_digest____________"} + sId1 = EntityId "migration_file_1" + sId2 = EntityId "migration_file_2" + rId1 = EntityId "migration_rcp_1_" + addFile stmStore sId1 fileInfo1 testCreatedAt EntityActive `shouldReturn` Right () + void $ setFilePath stmStore sId1 "/tmp/file1" + addRecipient stmStore sId1 (FileRecipient rId1 rcpKey1) `shouldReturn` Right () + let testBlockInfo = BlockingInfo {reason = BRSpam, notice = Nothing} + addFile stmStore sId2 fileInfo2 testCreatedAt (EntityBlocked testBlockInfo) `shouldReturn` Right () + -- 2. Write to StoreLog + sl <- openWriteStoreLog False storeLogPath + writeFileStore sl stmStore + closeStoreLog sl + -- 3. Import StoreLog to Postgres + importFileStore storeLogPath testXFTPPostgresCfg + -- StoreLog should be renamed to .bak + doesFileExist storeLogPath `shouldReturn` False + doesFileExist (storeLogPath <> ".bak") `shouldReturn` True + -- 4. Export from Postgres back to StoreLog + exportFileStore storeLogPath2 testXFTPPostgresCfg + -- 5. Read exported StoreLog into a new STM store and verify + stmStore2 <- newFileStore () :: IO STMFileStore + sl2 <- readWriteFileStore storeLogPath2 stmStore2 + closeStoreLog sl2 + -- Verify file 1 + result1 <- getFile stmStore2 SFSender sId1 + case result1 of + Right (FileRec {fileInfo = fi, filePath, fileStatus}, _) -> do + size fi `shouldBe` 128000 + readTVarIO filePath `shouldReturn` Just "/tmp/file1" + readTVarIO fileStatus `shouldReturn` EntityActive + Left e -> expectationFailure $ "getFile sId1 failed: " <> show e + -- Verify recipient + result1r <- getFile stmStore2 SFRecipient rId1 + case result1r of + Right (_, key) -> key `shouldBe` rcpKey1 + Left e -> expectationFailure $ "getFile rId1 failed: " <> show e + -- Verify file 2 (blocked) + result2 <- getFile stmStore2 SFSender sId2 + case result2 of + Right (FileRec {fileInfo = fi, fileStatus}, _) -> do + size fi `shouldBe` 64000 + readTVarIO fileStatus `shouldReturn` EntityBlocked (BlockingInfo {reason = BRSpam, notice = Nothing}) + Left e -> expectationFailure $ "getFile sId2 failed: " <> show e + -- Cleanup + removeFile (storeLogPath <> ".bak") + removeFile storeLogPath2 diff --git a/tests/ServerTests.hs b/tests/ServerTests.hs index 27a72d2ac..7f342f6ae 100644 --- a/tests/ServerTests.hs +++ b/tests/ServerTests.hs @@ -33,8 +33,10 @@ import Data.Foldable (foldrM) import Data.Hashable (hash) import qualified Data.IntSet as IS import Data.List.NonEmpty (NonEmpty) +import Data.List (isPrefixOf) import Data.Maybe (catMaybes) import Data.String (IsString (..)) +import Text.Read (readMaybe) import Data.Type.Equality import qualified Data.X509.Validation as XV import GHC.Stack (withFrozenCallStack) @@ -90,6 +92,7 @@ serverTests = do describe "Service message subscriptions" $ do testServiceDeliverSubscribe testServiceUpgradeAndDowngrade + testServiceSubsTotalCount describe "Store log" testWithStoreLog describe "Restore messages" testRestoreMessages describe "Restore messages (old / v2)" testRestoreExpireMessages @@ -717,7 +720,7 @@ testServiceDeliverSubscribe = signSend_ sh aServicePK Nothing ("11", serviceId, SUBS 1 idsHash) [mId3] <- fmap catMaybes $ - receiveInAnyOrder -- race between SOKS and MSG, clients can handle it + receiveInAnyOrder -- race between SOKS, MSG and ALLS (sndQ and msgQ are separate threads) sh [ \case Resp "11" serviceId' (SOKS n idsHash') -> do @@ -731,9 +734,11 @@ testServiceDeliverSubscribe = rId'' `shouldBe` rId dec mId3 msg3 `shouldBe` Right "hello 3" pure $ Just $ Just mId3 + _ -> pure Nothing, + \case + Resp "" NoEntity ALLS -> pure $ Just Nothing _ -> pure Nothing ] - Resp "" NoEntity ALLS <- tGet1 sh Resp "12" _ OK <- signSendRecv sh rKey ("12", rId, ACK mId3) Resp "14" _ OK <- signSendRecv h sKey ("14", sId, _SEND "hello 4") Resp "" _ (Msg mId4 msg4) <- tGet1 sh @@ -811,7 +816,7 @@ testServiceUpgradeAndDowngrade = signSend_ sh aServicePK Nothing ("14", serviceId, SUBS 3 idsHash) [(rKey3_1, rId3_1, mId3_1), (rKey3_2, rId3_2, mId3_2)] <- fmap catMaybes $ - receiveInAnyOrder -- race between SOKS and MSG, clients can handle it + receiveInAnyOrder -- race between SOKS, MSG and ALLS (sndQ and msgQ are separate threads) sh [ \case Resp "14" serviceId' (SOKS n idsHash') -> do @@ -829,9 +834,11 @@ testServiceUpgradeAndDowngrade = Resp "" rId'' (Msg mId3 msg3) | rId'' == rId2 -> do dec2 mId3 msg3 `shouldBe` Right "hello 3.2" pure $ Just $ Just (rKey2, rId2, mId3) + _ -> pure Nothing, + \case + Resp "" NoEntity ALLS -> pure $ Just Nothing _ -> pure Nothing ] - Resp "" NoEntity ALLS <- tGet1 sh Resp "15" _ OK <- signSendRecv sh rKey3_1 ("15", rId3_1, ACK mId3_1) Resp "16" _ OK <- signSendRecv sh rKey3_2 ("16", rId3_2, ACK mId3_2) pure () @@ -858,6 +865,86 @@ testServiceUpgradeAndDowngrade = Resp "25" _ OK <- signSendRecv sh rKey ("25", rId, ACK mId6) pure () +testServiceSubsTotalCount :: SpecWith (ASrvTransport, AStoreType) +testServiceSubsTotalCount = + it "should track totalServiceSubs correctly via SUBS and SUB" $ \(at@(ATransport t), msType) -> do + g <- C.newRandom + creds <- genCredentials g Nothing (0, 2400) "localhost" + let (_fp, tlsCred) = tlsCredentials [creds] + serviceKeys@(_, servicePK) <- atomically $ C.generateKeyPair g + let aServicePK = C.APrivateAuthKey C.SEd25519 servicePK + cfg' = updateCfg (cfgMS msType) $ \cfg_ -> cfg_ {prometheusInterval = Just 1} + withSmpServerConfigOn at cfg' testPort $ \_ -> runSMPClient t $ \h -> do + -- Phase 1: create 2 queues as service, reconnect with SUBS, check metric = 2 + (rPub1, rKey1) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (dhPub1, _ :: C.PrivateKeyX25519) <- atomically $ C.generateKeyPair g + (rPub2, rKey2) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (dhPub2, _ :: C.PrivateKeyX25519) <- atomically $ C.generateKeyPair g + + (rId1, rId2, serviceId) <- runSMPServiceClient t (tlsCred, serviceKeys) $ \sh -> do + Resp "1" NoEntity (Ids_ rId1 _sId1 _srvDh1 serviceId) <- serviceSignSendRecv sh rKey1 servicePK ("1", NoEntity, New rPub1 dhPub1) + Resp "2" NoEntity (Ids_ rId2 _sId2 _srvDh2 serviceId') <- serviceSignSendRecv sh rKey2 servicePK ("2", NoEntity, New rPub2 dhPub2) + serviceId' `shouldBe` serviceId + pure (rId1, rId2, serviceId) + + runSMPServiceClient t (tlsCred, serviceKeys) $ \sh -> do + let idsHash = queueIdsHash [rId1, rId2] + signSend_ sh aServicePK Nothing ("3", serviceId, SUBS 2 idsHash) + void $ + receiveInAnyOrder sh + [ \case + Resp "3" serviceId' (SOKS n idsHash') -> do + n `shouldBe` 2 + idsHash' `shouldBe` idsHash + serviceId' `shouldBe` serviceId + pure $ Just () + _ -> pure Nothing, + \case + Resp "" NoEntity ALLS -> pure $ Just () + _ -> pure Nothing + ] + threadDelay 1500000 + readFile testPrometheusMetricsFile >>= \m -> readServiceSubsMetric m `shouldBe` Just 2 + + -- Phase 2: associate 1 more queue via SUB, reconnect with SUBS 3, check metric = 3 + (rPub3, rKey3) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + (dhPub3, _ :: C.PrivateKeyX25519) <- atomically $ C.generateKeyPair g + (sPub3, sKey3) <- atomically $ C.generateAuthKeyPair C.SEd25519 g + Resp "4" NoEntity (Ids rId3 sId3 _) <- signSendRecv h rKey3 ("4", NoEntity, New rPub3 dhPub3) + Resp "5" _ OK <- signSendRecv h sKey3 ("5", sId3, SKEY sPub3) + + runSMPServiceClient t (tlsCred, serviceKeys) $ \sh -> do + Resp "6" _ (SOK (Just serviceId')) <- serviceSignSendRecv sh rKey3 servicePK ("6", rId3, SUB) + serviceId' `shouldBe` serviceId + + runSMPServiceClient t (tlsCred, serviceKeys) $ \sh -> do + let idsHash = queueIdsHash [rId1, rId2, rId3] + signSend_ sh aServicePK Nothing ("7", serviceId, SUBS 3 idsHash) + void $ + receiveInAnyOrder sh + [ \case + Resp "7" serviceId' (SOKS n idsHash') -> do + n `shouldBe` 3 + idsHash' `shouldBe` idsHash + serviceId' `shouldBe` serviceId + pure $ Just () + _ -> pure Nothing, + \case + Resp "" NoEntity ALLS -> pure $ Just () + _ -> pure Nothing + ] + threadDelay 1500000 + readFile testPrometheusMetricsFile >>= \m -> readServiceSubsMetric m `shouldBe` Just 3 + +readServiceSubsMetric :: String -> Maybe Int +readServiceSubsMetric content = + case filter ("simplex_smp_subscribtion_service_subs_total " `isPrefixOf`) (lines content) of + (line : _) -> case words line of + [_, val, _] -> readMaybe val + [_, val] -> readMaybe val + _ -> Nothing + [] -> Nothing + receiveInAnyOrder :: (HasCallStack, Transport c) => THandleSMP c 'TClient -> [(CorrId, EntityId, Either ErrorType BrokerMsg) -> IO (Maybe b)] -> IO [b] receiveInAnyOrder h = fmap reverse . go [] where diff --git a/tests/Test.hs b/tests/Test.hs index d397c57db..ae6df6e78 100644 --- a/tests/Test.hs +++ b/tests/Test.hs @@ -33,7 +33,9 @@ import System.Environment (setEnv) import Test.Hspec hiding (fit, it) import Util import XFTPAgent -import XFTPCLI +import XFTPCLI (xftpCLIFileTests) +import Simplex.FileTransfer.Server.Env (AFStoreType (..)) +import Simplex.FileTransfer.Server.Store (SFSType (..)) import XFTPServerTests (xftpServerTests) import WebTests (webTests) import XFTPWebTests (xftpWebTests) @@ -42,16 +44,19 @@ import XFTPWebTests (xftpWebTests) import Fixtures import SMPAgentClient (testDB) import Simplex.Messaging.Agent.Store.Postgres.Migrations.App +import Simplex.Messaging.Agent.Store.Postgres.Util (dropAllSchemasExceptSystem) #else import AgentTests.SchemaDump (schemaDumpTest) #endif #if defined(dbServerPostgres) +import CoreTests.XFTPStoreTests (xftpStoreTests, xftpMigrationTests) import NtfServerTests (ntfServerTests) import NtfClient (ntfTestServerDBConnectInfo, ntfTestStoreDBOpts) import SMPClient (testServerDBConnectInfo, testStoreDBOpts) import Simplex.Messaging.Notifications.Server.Store.Migrations (ntfServerMigrations) import Simplex.Messaging.Server.QueueStore.Postgres.Migrations (serverMigrations) +import XFTPClient (testXFTPDBConnectInfo) #endif #if defined(dbPostgres) || defined(dbServerPostgres) @@ -145,11 +150,29 @@ main = do describe "SMP proxy, jornal message store" $ before (pure $ ASType SQSMemory SMSJournal) smpProxyTests describe "XFTP" $ do - describe "XFTP server" xftpServerTests + describe "XFTP server" $ + before (pure $ AFSType SFSMemory) xftpServerTests describe "XFTP file description" fileDescriptionTests - describe "XFTP CLI" xftpCLITests - describe "XFTP agent" xftpAgentTests - describe "XFTP Web Client" xftpWebTests + describe "XFTP CLI (memory)" $ + before (pure $ AFSType SFSMemory) xftpCLIFileTests + describe "XFTP agent" $ + before (pure $ AFSType SFSMemory) xftpAgentTests +#if defined(dbServerPostgres) + around_ (postgressBracket testXFTPDBConnectInfo) $ do + describe "XFTP Postgres store operations" xftpStoreTests + describe "XFTP migration round-trip" xftpMigrationTests + describe "XFTP server (PostgreSQL)" $ + before (pure $ AFSType SFSPostgres) xftpServerTests + describe "XFTP agent (PostgreSQL)" $ + before (pure $ AFSType SFSPostgres) xftpAgentTests + describe "XFTP CLI (PostgreSQL)" $ + before (pure $ AFSType SFSPostgres) xftpCLIFileTests +#endif +#if defined(dbPostgres) + describe "XFTP Web Client" $ xftpWebTests (dropAllSchemasExceptSystem testDBConnectInfo) +#else + describe "XFTP Web Client" $ xftpWebTests (pure ()) +#endif describe "XRCP" remoteControlTests describe "Web" webTests describe "Server CLIs" cliTests diff --git a/tests/WebTests.hs b/tests/WebTests.hs index 9eb123d34..0a08b523c 100644 --- a/tests/WebTests.hs +++ b/tests/WebTests.hs @@ -35,6 +35,9 @@ webTests = describe "Web module" $ do section_ "s" (Just "Y") "aaa${s}bbb" `shouldBe` "aaaYbbb" it "removes Nothing section preserving surroundings" $ section_ "s" Nothing "aaagonebbb" `shouldBe` "aaabbb" + it "removes multiple Nothing sections" $ + section_ "s" Nothing "firstmidsecondend" + `shouldBe` "midend" describe "render" $ do it "applies multiple substitutions" $ diff --git a/tests/XFTPAgent.hs b/tests/XFTPAgent.hs index a83ec08a6..af1d2f5c2 100644 --- a/tests/XFTPAgent.hs +++ b/tests/XFTPAgent.hs @@ -26,7 +26,8 @@ import SMPClient (xit'') import Simplex.FileTransfer.Client (XFTPClientConfig (..)) import Simplex.FileTransfer.Description (FileChunk (..), FileDescription (..), FileDescriptionURI (..), ValidFileDescription, fileDescriptionURI, kb, mb, qrSizeLimit, pattern ValidFileDescription) import Simplex.FileTransfer.Protocol (FileParty (..)) -import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..)) +import Simplex.FileTransfer.Server.Env (AFStoreType, XFTPServerConfig (..)) +import Simplex.FileTransfer.Server.Store (STMFileStore) import Simplex.FileTransfer.Transport (XFTPErrorType (AUTH)) import Simplex.FileTransfer.Types (RcvFileId, SndFileId) import Simplex.Messaging.Agent (AgentClient, testProtocolServer, xftpDeleteRcvFile, xftpDeleteSndFileInternal, xftpDeleteSndFileRemote, xftpReceiveFile, xftpSendDescription, xftpSendFile, xftpStartWorkers) @@ -54,7 +55,7 @@ import Fixtures import Simplex.Messaging.Agent.Store.Postgres.Util (dropAllSchemasExceptSystem) #endif -xftpAgentTests :: Spec +xftpAgentTests :: SpecWith AFStoreType xftpAgentTests = around_ testBracket #if defined(dbPostgres) @@ -63,35 +64,42 @@ xftpAgentTests = . describe "agent XFTP API" $ do it "should send and receive file" $ withXFTPServer testXFTPAgentSendReceive -- uncomment CPP option slow_servers and run hpack to run this test - xit "should send and receive file with slow server responses" $ + xit "should send and receive file with slow server responses" $ \_ -> withXFTPServerCfg testXFTPServerConfig {responseDelay = 500000} $ \_ -> testXFTPAgentSendReceive it "should send and receive with encrypted local files" testXFTPAgentSendReceiveEncrypted it "should send and receive large file with a redirect" testXFTPAgentSendReceiveRedirect it "should send and receive small file without a redirect" testXFTPAgentSendReceiveNoRedirect - describe "sending and receiving with version negotiation" testXFTPAgentSendReceiveMatrix - it "should resume receiving file after restart" testXFTPAgentReceiveRestore - it "should cleanup rcv tmp path after permanent error" testXFTPAgentReceiveCleanup - it "should resume sending file after restart" testXFTPAgentSendRestore - xit'' "should cleanup snd prefix path after permanent error" testXFTPAgentSendCleanup + describe "sending and receiving with version negotiation" $ beforeWith (const (pure ())) testXFTPAgentSendReceiveMatrix + it "should resume receiving file after restart" $ \_ -> testXFTPAgentReceiveRestore + it "should cleanup rcv tmp path after permanent error" $ \_ -> testXFTPAgentReceiveCleanup + it "should resume sending file after restart" $ \_ -> testXFTPAgentSendRestore + xit'' "should cleanup snd prefix path after permanent error" $ \_ -> testXFTPAgentSendCleanup it "should delete sent file on server" testXFTPAgentDelete - it "should resume deleting file after restart" testXFTPAgentDeleteRestore + it "should resume deleting file after restart" $ \_ -> testXFTPAgentDeleteRestore -- TODO when server is fixed to correctly send AUTH error, this test has to be modified to expect AUTH error it "if file is deleted on server, should limit retries and continue receiving next file" testXFTPAgentDeleteOnServer it "if file is expired on server, should report error and continue receiving next file" testXFTPAgentExpiredOnServer it "should request additional recipient IDs when number of recipients exceeds maximum per request" testXFTPAgentRequestAdditionalRecipientIDs describe "XFTP server test via agent API" $ do - it "should pass without basic auth" $ testXFTPServerTest Nothing (noAuthSrv testXFTPServer2) `shouldReturn` Nothing + it "should pass without basic auth" $ \_ -> testXFTPServerTest Nothing (noAuthSrv testXFTPServer2) `shouldReturn` Nothing let srv1 = testXFTPServer2 {keyHash = "1234"} - it "should fail with incorrect fingerprint" $ do + it "should fail with incorrect fingerprint" $ \_ -> do testXFTPServerTest Nothing (noAuthSrv srv1) `shouldReturn` Just (ProtocolTestFailure TSConnect $ BROKER (B.unpack $ strEncode srv1) $ NETWORK NEUnknownCAError) describe "server with password" $ do let auth = Just "abcd" srv = ProtoServerWithAuth testXFTPServer2 authErr = Just (ProtocolTestFailure TSCreateFile $ XFTP (B.unpack $ strEncode testXFTPServer2) AUTH) - it "should pass with correct password" $ testXFTPServerTest auth (srv auth) `shouldReturn` Nothing - it "should fail without password" $ testXFTPServerTest auth (srv Nothing) `shouldReturn` authErr - it "should fail with incorrect password" $ testXFTPServerTest auth (srv $ Just "wrong") `shouldReturn` authErr + it "should pass with correct password" $ \_ -> testXFTPServerTest auth (srv auth) `shouldReturn` Nothing + it "should fail without password" $ \_ -> testXFTPServerTest auth (srv Nothing) `shouldReturn` authErr + it "should fail with incorrect password" $ \_ -> testXFTPServerTest auth (srv $ Just "wrong") `shouldReturn` authErr + +testXFTPServerTest :: HasCallStack => Maybe BasicAuth -> XFTPServerWithAuth -> IO (Maybe ProtocolTestFailure) +testXFTPServerTest newFileBasicAuth srv = + withXFTPServerCfg testXFTPServerConfig {newFileBasicAuth, xftpPort = xftpTestPort2} $ \_ -> + -- initially passed server is not running + withAgent 1 agentCfg initAgentServers testDB $ \a -> + testProtocolServer a NRMInteractive 1 srv rfProgress :: forall m. (HasCallStack, MonadIO m, MonadFail m) => AgentClient -> Int64 -> m () rfProgress c expected = loop 0 @@ -135,7 +143,7 @@ testXFTPAgentSendReceive = do rfId <- runRight $ testReceive rcp rfd originalFilePath xftpDeleteRcvFile rcp rfId -testXFTPAgentSendReceiveEncrypted :: HasCallStack => IO () +testXFTPAgentSendReceiveEncrypted :: HasCallStack => AFStoreType -> IO () testXFTPAgentSendReceiveEncrypted = withXFTPServer $ do g <- C.newRandom filePath <- createRandomFile @@ -156,7 +164,7 @@ testXFTPAgentSendReceiveEncrypted = withXFTPServer $ do rfId <- runRight $ testReceiveCF rcp rfd cfArgs originalFilePath xftpDeleteRcvFile rcp rfId -testXFTPAgentSendReceiveRedirect :: HasCallStack => IO () +testXFTPAgentSendReceiveRedirect :: HasCallStack => AFStoreType -> IO () testXFTPAgentSendReceiveRedirect = withXFTPServer $ do --- sender filePathIn <- createRandomFile @@ -214,7 +222,7 @@ testXFTPAgentSendReceiveRedirect = withXFTPServer $ do inBytes <- B.readFile filePathIn B.readFile out `shouldReturn` inBytes -testXFTPAgentSendReceiveNoRedirect :: HasCallStack => IO () +testXFTPAgentSendReceiveNoRedirect :: HasCallStack => AFStoreType -> IO () testXFTPAgentSendReceiveNoRedirect = withXFTPServer $ do --- sender let fileSize = mb 5 @@ -272,7 +280,7 @@ testXFTPAgentSendReceiveMatrix = do newClient = agentCfg oldServer = withXFTPServerCfgNoALPN newServer = withXFTPServerCfg - run :: HasCallStack => (HasCallStack => XFTPServerConfig -> (ThreadId -> IO ()) -> IO ()) -> AgentConfig -> AgentConfig -> IO () + run :: HasCallStack => (HasCallStack => XFTPServerConfig STMFileStore -> (ThreadId -> IO ()) -> IO ()) -> AgentConfig -> AgentConfig -> IO () run withServer sender receiver = withServer testXFTPServerConfig $ \_t -> do filePath <- createRandomFile_ (kb 319 :: Integer) "testfile" @@ -498,37 +506,38 @@ testXFTPAgentSendCleanup = withGlobalLogging logCfgNoLogs $ do doesDirectoryExist prefixPath `shouldReturn` False doesFileExist encPath `shouldReturn` False -testXFTPAgentDelete :: HasCallStack => IO () -testXFTPAgentDelete = withGlobalLogging logCfgNoLogs $ - withXFTPServer $ do - filePath <- createRandomFile +testXFTPAgentDelete :: HasCallStack => AFStoreType -> IO () +testXFTPAgentDelete = withGlobalLogging logCfgNoLogs . withXFTPServer test + where + test = do + filePath <- createRandomFile - -- send file - withAgent 1 agentCfg initAgentServers testDB $ \sndr -> do - (sfId, sndDescr, rfd1, rfd2) <- runRight $ testSend sndr filePath + -- send file + withAgent 1 agentCfg initAgentServers testDB $ \sndr -> do + (sfId, sndDescr, rfd1, rfd2) <- runRight $ testSend sndr filePath - -- receive file - withAgent 2 agentCfg initAgentServers testDB2 $ \rcp1 -> do - runRight_ . void $ testReceive rcp1 rfd1 filePath + -- receive file + withAgent 2 agentCfg initAgentServers testDB2 $ \rcp1 -> do + runRight_ . void $ testReceive rcp1 rfd1 filePath - length <$> listDirectory xftpServerFiles `shouldReturn` 6 + length <$> listDirectory xftpServerFiles `shouldReturn` 6 - -- delete file - runRight_ $ xftpStartWorkers sndr (Just senderFiles) - xftpDeleteSndFileRemote sndr 1 sfId sndDescr - Nothing <- 100000 `timeout` sfGet sndr - pure () + -- delete file + runRight_ $ xftpStartWorkers sndr (Just senderFiles) + xftpDeleteSndFileRemote sndr 1 sfId sndDescr + Nothing <- 100000 `timeout` sfGet sndr + pure () - threadDelay 1000000 - length <$> listDirectory xftpServerFiles `shouldReturn` 0 + threadDelay 1000000 + length <$> listDirectory xftpServerFiles `shouldReturn` 0 - -- receive file - should fail with AUTH error - withAgent 3 agentCfg initAgentServers testDB2 $ \rcp2 -> runRight $ do - xftpStartWorkers rcp2 (Just recipientFiles) - rfId <- xftpReceiveFile rcp2 1 rfd2 Nothing True - ("", rfId', RFERR (XFTP "xftp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:8000" AUTH)) <- - rfGet rcp2 - liftIO $ rfId' `shouldBe` rfId + -- receive file - should fail with AUTH error + withAgent 3 agentCfg initAgentServers testDB2 $ \rcp2 -> runRight $ do + xftpStartWorkers rcp2 (Just recipientFiles) + rfId <- xftpReceiveFile rcp2 1 rfd2 Nothing True + ("", rfId', RFERR (XFTP "xftp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:8000" AUTH)) <- + rfGet rcp2 + liftIO $ rfId' `shouldBe` rfId testXFTPAgentDeleteRestore :: HasCallStack => IO () testXFTPAgentDeleteRestore = withGlobalLogging logCfgNoLogs $ do @@ -568,48 +577,48 @@ testXFTPAgentDeleteRestore = withGlobalLogging logCfgNoLogs $ do rfGet rcp2 liftIO $ rfId' `shouldBe` rfId -testXFTPAgentDeleteOnServer :: HasCallStack => IO () -testXFTPAgentDeleteOnServer = withGlobalLogging logCfgNoLogs $ - withXFTPServer $ do - filePath1 <- createRandomFile' "testfile1" +testXFTPAgentDeleteOnServer :: HasCallStack => AFStoreType -> IO () +testXFTPAgentDeleteOnServer = withGlobalLogging logCfgNoLogs . withXFTPServer test + where + test = do + filePath1 <- createRandomFile' "testfile1" - -- send file 1 - withAgent 1 agentCfg initAgentServers testDB $ \sndr -> do - (_, _, rfd1_1, rfd1_2) <- runRight $ testSend sndr filePath1 + -- send file 1 + withAgent 1 agentCfg initAgentServers testDB $ \sndr -> do + (_, _, rfd1_1, rfd1_2) <- runRight $ testSend sndr filePath1 - -- receive file 1 successfully - withAgent 2 agentCfg initAgentServers testDB2 $ \rcp -> do - runRight_ . void $ testReceive rcp rfd1_1 filePath1 + -- receive file 1 successfully + withAgent 2 agentCfg initAgentServers testDB2 $ \rcp -> do + runRight_ . void $ testReceive rcp rfd1_1 filePath1 - serverFiles <- listDirectory xftpServerFiles - length serverFiles `shouldBe` 6 + serverFiles <- listDirectory xftpServerFiles + length serverFiles `shouldBe` 6 - -- delete file 1 on server from file system - forM_ serverFiles (\file -> removeFile (xftpServerFiles file)) + -- delete file 1 on server from file system + forM_ serverFiles (\file -> removeFile (xftpServerFiles file)) - threadDelay 1000000 - length <$> listDirectory xftpServerFiles `shouldReturn` 0 + threadDelay 1000000 + length <$> listDirectory xftpServerFiles `shouldReturn` 0 - -- create and send file 2 - filePath2 <- createRandomFile' "testfile2" - (_, _, rfd2, _) <- runRight $ testSend sndr filePath2 + -- create and send file 2 + filePath2 <- createRandomFile' "testfile2" + (_, _, rfd2, _) <- runRight $ testSend sndr filePath2 - length <$> listDirectory xftpServerFiles `shouldReturn` 6 + length <$> listDirectory xftpServerFiles `shouldReturn` 6 - runRight_ . void $ do - -- receive file 1 again - rfId1 <- xftpReceiveFile rcp 1 rfd1_2 Nothing True - ("", rfId1', RFERR (XFTP "xftp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:8000" AUTH)) <- - rfGet rcp - liftIO $ rfId1 `shouldBe` rfId1' + runRight_ . void $ do + -- receive file 1 again + rfId1 <- xftpReceiveFile rcp 1 rfd1_2 Nothing True + ("", rfId1', RFERR (XFTP "xftp://LcJUMfVhwD8yxjAiSaDzzGF3-kLG4Uh0Fl_ZIjrRwjI=@localhost:8000" AUTH)) <- + rfGet rcp + liftIO $ rfId1 `shouldBe` rfId1' - -- receive file 2 - testReceive' rcp rfd2 filePath2 + -- receive file 2 + testReceive' rcp rfd2 filePath2 -testXFTPAgentExpiredOnServer :: HasCallStack => IO () -testXFTPAgentExpiredOnServer = withGlobalLogging logCfgNoLogs $ do - let fastExpiration = ExpirationConfig {ttl = 2, checkInterval = 1} - withXFTPServerCfg testXFTPServerConfig {fileExpiration = Just fastExpiration} . const $ do +testXFTPAgentExpiredOnServer :: HasCallStack => AFStoreType -> IO () +testXFTPAgentExpiredOnServer fsType = withGlobalLogging logCfgNoLogs $ + withXFTPServerConfigOn (updateXFTPCfg (cfgFS fsType) $ \c -> c {fileExpiration = Just fastExpiration}) . const $ do filePath1 <- createRandomFile' "testfile1" -- send file 1 @@ -644,8 +653,10 @@ testXFTPAgentExpiredOnServer = withGlobalLogging logCfgNoLogs $ do -- receive file 2 successfully runRight_ . void $ testReceive' rcp rfd2 filePath2 + where + fastExpiration = ExpirationConfig {ttl = 2, checkInterval = 1} -testXFTPAgentRequestAdditionalRecipientIDs :: HasCallStack => IO () +testXFTPAgentRequestAdditionalRecipientIDs :: HasCallStack => AFStoreType -> IO () testXFTPAgentRequestAdditionalRecipientIDs = withXFTPServer $ do filePath <- createRandomFile @@ -670,9 +681,8 @@ testXFTPAgentRequestAdditionalRecipientIDs = withXFTPServer $ do void $ testReceive rcp (rfds !! 299) filePath void $ testReceive rcp (rfds !! 499) filePath -testXFTPServerTest :: HasCallStack => Maybe BasicAuth -> XFTPServerWithAuth -> IO (Maybe ProtocolTestFailure) -testXFTPServerTest newFileBasicAuth srv = - withXFTPServerCfg testXFTPServerConfig {newFileBasicAuth, xftpPort = xftpTestPort2} $ \_ -> - -- initially passed server is not running - withAgent 1 agentCfg initAgentServers testDB $ \a -> - testProtocolServer a NRMInteractive 1 srv +testXFTPServerTest_ :: HasCallStack => XFTPServerWithAuth -> IO (Maybe ProtocolTestFailure) +testXFTPServerTest_ srv = + -- initially passed server is not running + withAgent 1 agentCfg initAgentServers testDB $ \a -> + testProtocolServer a NRMInteractive 1 srv diff --git a/tests/XFTPCLI.hs b/tests/XFTPCLI.hs index d6c97d73c..7dbf9902e 100644 --- a/tests/XFTPCLI.hs +++ b/tests/XFTPCLI.hs @@ -1,4 +1,4 @@ -module XFTPCLI where +module XFTPCLI (xftpCLIFileTests, xftpCLI, senderFiles, recipientFiles, testBracket) where import Control.Exception (bracket_) import qualified Data.ByteString as LB @@ -11,14 +11,17 @@ import System.FilePath (()) import System.IO.Silently (capture_) import Test.Hspec hiding (fit, it) import Util -import XFTPClient (testXFTPServerStr, testXFTPServerStr2, withXFTPServer, withXFTPServer2, xftpServerFiles, xftpServerFiles2) +import Simplex.FileTransfer.Server.Env (AFStoreType) +import XFTPClient (cfgFS, cfgFS2, withXFTPServer, withXFTPServerConfigOn, testXFTPServerStr, testXFTPServerStr2, xftpServerFiles, xftpServerFiles2) -xftpCLITests :: Spec -xftpCLITests = around_ testBracket . describe "XFTP CLI" $ do - it "should send and receive file" testXFTPCLISendReceive - it "should send and receive file with 2 servers" testXFTPCLISendReceive2servers - it "should delete file from 2 servers" testXFTPCLIDelete - it "prepareChunkSizes should use 2 chunk sizes" testPrepareChunkSizes +xftpCLIFileTests :: SpecWith AFStoreType +xftpCLIFileTests = around_ testBracket $ do + it "should send and receive file" $ withXFTPServer testXFTPCLISendReceive_ + it "should send and receive file with 2 servers" $ \fsType -> + withXFTPServerConfigOn (cfgFS fsType) $ \_ -> withXFTPServerConfigOn (cfgFS2 fsType) $ \_ -> testXFTPCLISendReceive2servers_ + it "should delete file from 2 servers" $ \fsType -> + withXFTPServerConfigOn (cfgFS fsType) $ \_ -> withXFTPServerConfigOn (cfgFS2 fsType) $ \_ -> testXFTPCLIDelete_ + it "prepareChunkSizes should use 2 chunk sizes" $ \_ -> testPrepareChunkSizes testBracket :: IO () -> IO () testBracket = @@ -37,8 +40,8 @@ recipientFiles = "tests/tmp/xftp-recipient-files" xftpCLI :: [String] -> IO [String] xftpCLI params = lines <$> capture_ (withArgs params xftpClientCLI) -testXFTPCLISendReceive :: IO () -testXFTPCLISendReceive = withXFTPServer $ do +testXFTPCLISendReceive_ :: IO () +testXFTPCLISendReceive_ = do let filePath = senderFiles "testfile" xftpCLI ["rand", filePath, "17mb"] `shouldReturn` ["File created: " <> filePath] file <- LB.readFile filePath @@ -73,8 +76,8 @@ testXFTPCLISendReceive = withXFTPServer $ do recvResult `shouldBe` ["File description " <> fd <> " is deleted."] LB.readFile (recipientFiles fileName) `shouldReturn` file -testXFTPCLISendReceive2servers :: IO () -testXFTPCLISendReceive2servers = withXFTPServer . withXFTPServer2 $ do +testXFTPCLISendReceive2servers_ :: IO () +testXFTPCLISendReceive2servers_ = do let filePath = senderFiles "testfile" xftpCLI ["rand", filePath, "17mb"] `shouldReturn` ["File created: " <> filePath] file <- LB.readFile filePath @@ -111,8 +114,8 @@ testXFTPCLISendReceive2servers = withXFTPServer . withXFTPServer2 $ do recvResult `shouldBe` ["File description " <> fd <> " is deleted."] LB.readFile (recipientFiles fileName) `shouldReturn` file -testXFTPCLIDelete :: IO () -testXFTPCLIDelete = withXFTPServer . withXFTPServer2 $ do +testXFTPCLIDelete_ :: IO () +testXFTPCLIDelete_ = do let filePath = senderFiles "testfile" xftpCLI ["rand", filePath, "17mb"] `shouldReturn` ["File created: " <> filePath] file <- LB.readFile filePath diff --git a/tests/XFTPClient.hs b/tests/XFTPClient.hs index 85a1d21b8..276171e21 100644 --- a/tests/XFTPClient.hs +++ b/tests/XFTPClient.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE GADTs #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} @@ -7,6 +9,7 @@ module XFTPClient where import Control.Concurrent (ThreadId, threadDelay) +import Control.Monad (void) import Data.String (fromString) import Data.Time.Clock (getCurrentTime) import Network.Socket (ServiceName) @@ -14,48 +17,106 @@ import SMPClient (serverBracket) import Simplex.FileTransfer.Client import Simplex.FileTransfer.Description import Simplex.FileTransfer.Server (runXFTPServerBlocking) -import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..), defaultFileExpiration, defaultInactiveClientExpiration) +import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..), XFTPStoreConfig (..), AFStoreType (..), defaultFileExpiration, defaultInactiveClientExpiration) +import Simplex.FileTransfer.Server.Store (FileStoreClass, SFSType (..), STMFileStore) import Simplex.FileTransfer.Transport (alpnSupportedXFTPhandshakes, supportedFileServerVRange) import Simplex.Messaging.Protocol (XFTPServer) import Simplex.Messaging.Transport.HTTP2 (httpALPN) import Simplex.Messaging.Transport.Server import Test.Hspec hiding (fit, it) +#if defined(dbServerPostgres) +import qualified Database.PostgreSQL.Simple as PSQL +import Database.PostgreSQL.Simple (ConnectInfo (..), defaultConnectInfo) +import Simplex.FileTransfer.Server.Store.Postgres.Config (PostgresFileStoreCfg (..), defaultXFTPDBOpts) +import Simplex.Messaging.Agent.Store.Postgres.Options (DBOpts (..)) +import Simplex.Messaging.Agent.Store.Shared (MigrationConfirmation (..)) +#endif -xftpTest :: HasCallStack => (HasCallStack => XFTPClient -> IO ()) -> Expectation -xftpTest test = runXFTPTest test `shouldReturn` () +data AXFTPServerConfig = forall s. FileStoreClass s => AXFTPSrvCfg (XFTPServerConfig s) -xftpTestN :: HasCallStack => Int -> (HasCallStack => [XFTPClient] -> IO ()) -> Expectation -xftpTestN n test = runXFTPTestN n test `shouldReturn` () +updateXFTPCfg :: AXFTPServerConfig -> (forall s. XFTPServerConfig s -> XFTPServerConfig s) -> AXFTPServerConfig +updateXFTPCfg (AXFTPSrvCfg cfg) f = AXFTPSrvCfg (f cfg) -xftpTest2 :: HasCallStack => (HasCallStack => XFTPClient -> XFTPClient -> IO ()) -> Expectation +cfgFS :: AFStoreType -> AXFTPServerConfig +cfgFS (AFSType fs) = case fs of + SFSMemory -> AXFTPSrvCfg testXFTPServerConfig +#if defined(dbServerPostgres) + SFSPostgres -> AXFTPSrvCfg testXFTPServerConfig {serverStoreCfg = XSCDatabase testXFTPPostgresCfg} +#else + SFSPostgres -> error "no postgres support" +#endif + +cfgFS2 :: AFStoreType -> AXFTPServerConfig +cfgFS2 (AFSType fs) = case fs of + SFSMemory -> AXFTPSrvCfg testXFTPServerConfig2 +#if defined(dbServerPostgres) + SFSPostgres -> AXFTPSrvCfg testXFTPServerConfig2 {serverStoreCfg = XSCDatabase testXFTPPostgresCfg} +#else + SFSPostgres -> error "no postgres support" +#endif + +withXFTPServerConfigOn :: HasCallStack => AXFTPServerConfig -> (HasCallStack => ThreadId -> IO a) -> IO a +withXFTPServerConfigOn (AXFTPSrvCfg cfg) = withXFTPServerCfg cfg + +#if defined(dbServerPostgres) +testXFTPDBConnectInfo :: ConnectInfo +testXFTPDBConnectInfo = + defaultConnectInfo + { connectUser = "test_xftp_server_user", + connectDatabase = "test_xftp_server_db" + } + +testXFTPPostgresCfg :: PostgresFileStoreCfg +testXFTPPostgresCfg = + PostgresFileStoreCfg + { dbOpts = defaultXFTPDBOpts + { connstr = "postgresql://test_xftp_server_user@/test_xftp_server_db", + schema = "xftp_server_test", + poolSize = 10, + createSchema = True + }, + dbStoreLogPath = Nothing, + confirmMigrations = MCYesUp + } + +clearXFTPPostgresStore :: IO () +clearXFTPPostgresStore = do + let DBOpts {connstr} = dbOpts testXFTPPostgresCfg + conn <- PSQL.connectPostgreSQL connstr + void $ PSQL.execute_ conn "SET search_path TO xftp_server_test,public" + void $ PSQL.execute_ conn "DELETE FROM files" + PSQL.close conn +#endif + +xftpTest :: HasCallStack => (HasCallStack => XFTPClient -> IO ()) -> AFStoreType -> Expectation +xftpTest test fsType = withXFTPServerConfigOn (cfgFS fsType) (\_ -> testXFTPClient test) `shouldReturn` () + +xftpTestN :: HasCallStack => Int -> (HasCallStack => [XFTPClient] -> IO ()) -> AFStoreType -> Expectation +xftpTestN nClients test fsType = withXFTPServerConfigOn (cfgFS fsType) (\_ -> run nClients []) `shouldReturn` () + where + run :: Int -> [XFTPClient] -> IO () + run 0 hs = test hs + run n hs = testXFTPClient $ \h -> run (n - 1) (h : hs) + +xftpTest2 :: HasCallStack => (HasCallStack => XFTPClient -> XFTPClient -> IO ()) -> AFStoreType -> Expectation xftpTest2 test = xftpTestN 2 _test where _test [h1, h2] = test h1 h2 _test _ = error "expected 2 handles" -xftpTest4 :: HasCallStack => (HasCallStack => XFTPClient -> XFTPClient -> XFTPClient -> XFTPClient -> IO ()) -> Expectation +xftpTest4 :: HasCallStack => (HasCallStack => XFTPClient -> XFTPClient -> XFTPClient -> XFTPClient -> IO ()) -> AFStoreType -> Expectation xftpTest4 test = xftpTestN 4 _test where _test [h1, h2, h3, h4] = test h1 h2 h3 h4 _test _ = error "expected 4 handles" -runXFTPTest :: HasCallStack => (HasCallStack => XFTPClient -> IO a) -> IO a -runXFTPTest test = withXFTPServer $ testXFTPClient test - -runXFTPTestN :: forall a. HasCallStack => Int -> (HasCallStack => [XFTPClient] -> IO a) -> IO a -runXFTPTestN nClients test = withXFTPServer $ run nClients [] - where - run :: Int -> [XFTPClient] -> IO a - run 0 hs = test hs - run n hs = testXFTPClient $ \h -> run (n - 1) (h : hs) - withXFTPServerStoreLogOn :: HasCallStack => (HasCallStack => ThreadId -> IO a) -> IO a -withXFTPServerStoreLogOn = withXFTPServerCfg testXFTPServerConfig {storeLogFile = Just testXFTPLogFile, serverStatsBackupFile = Just testXFTPStatsBackupFile} +withXFTPServerStoreLogOn = withXFTPServerCfg testXFTPServerConfig {serverStoreCfg = XSCMemory (Just testXFTPLogFile), storeLogFile = Just testXFTPLogFile, serverStatsBackupFile = Just testXFTPStatsBackupFile} -withXFTPServerCfgNoALPN :: HasCallStack => XFTPServerConfig -> (HasCallStack => ThreadId -> IO a) -> IO a +withXFTPServerCfgNoALPN :: (HasCallStack, FileStoreClass s) => XFTPServerConfig s -> (HasCallStack => ThreadId -> IO a) -> IO a withXFTPServerCfgNoALPN cfg = withXFTPServerCfg cfg {transportConfig = (transportConfig cfg) {serverALPN = Nothing}} -withXFTPServerCfg :: HasCallStack => XFTPServerConfig -> (HasCallStack => ThreadId -> IO a) -> IO a +withXFTPServerCfg :: (HasCallStack, FileStoreClass s) => XFTPServerConfig s -> (HasCallStack => ThreadId -> IO a) -> IO a withXFTPServerCfg cfg = serverBracket (\started -> runXFTPServerBlocking started cfg) @@ -64,11 +125,13 @@ withXFTPServerCfg cfg = withXFTPServerThreadOn :: HasCallStack => (HasCallStack => ThreadId -> IO a) -> IO a withXFTPServerThreadOn = withXFTPServerCfg testXFTPServerConfig -withXFTPServer :: HasCallStack => IO a -> IO a -withXFTPServer = withXFTPServerCfg testXFTPServerConfig . const +withXFTPServer :: HasCallStack => IO a -> AFStoreType -> IO a +withXFTPServer test fsType = withXFTPServerConfigOn (cfgFS fsType) $ const test -withXFTPServer2 :: HasCallStack => IO a -> IO a -withXFTPServer2 = withXFTPServerCfg testXFTPServerConfig {xftpPort = xftpTestPort2, filesPath = xftpServerFiles2} . const +withXFTPServer2 :: HasCallStack => IO a -> AFStoreType -> IO a +withXFTPServer2 test fsType = withXFTPServerConfigOn (cfgFS2 fsType) $ const test + +-- Constants xftpTestPort :: ServiceName xftpTestPort = "8000" @@ -103,12 +166,13 @@ testXFTPStatsBackupFile = "tests/tmp/xftp-server-stats.log" xftpTestPrometheusMetricsFile :: FilePath xftpTestPrometheusMetricsFile = "tests/tmp/xftp-server-metrics.txt" -testXFTPServerConfig :: XFTPServerConfig +testXFTPServerConfig :: XFTPServerConfig STMFileStore testXFTPServerConfig = XFTPServerConfig { xftpPort = xftpTestPort, controlPort = Nothing, fileIdSize = 16, + serverStoreCfg = XSCMemory Nothing, storeLogFile = Nothing, filesPath = xftpServerFiles, fileSizeQuota = Nothing, @@ -139,6 +203,9 @@ testXFTPServerConfig = webStaticPath = Nothing } +testXFTPServerConfig2 :: XFTPServerConfig STMFileStore +testXFTPServerConfig2 = testXFTPServerConfig {xftpPort = xftpTestPort2, filesPath = xftpServerFiles2} + testXFTPClientConfig :: XFTPClientConfig testXFTPClientConfig = defaultXFTPClientConfig @@ -152,7 +219,7 @@ testXFTPClientWith cfg client = do Right c -> client c Left e -> error $ show e -testXFTPServerConfigSNI :: XFTPServerConfig +testXFTPServerConfigSNI :: XFTPServerConfig STMFileStore testXFTPServerConfigSNI = testXFTPServerConfig { httpCredentials = @@ -171,7 +238,7 @@ testXFTPServerConfigSNI = withXFTPServerSNI :: HasCallStack => (HasCallStack => ThreadId -> IO a) -> IO a withXFTPServerSNI = withXFTPServerCfg testXFTPServerConfigSNI -testXFTPServerConfigEd25519SNI :: XFTPServerConfig +testXFTPServerConfigEd25519SNI :: XFTPServerConfig STMFileStore testXFTPServerConfigEd25519SNI = testXFTPServerConfig { xftpCredentials = diff --git a/tests/XFTPServerTests.hs b/tests/XFTPServerTests.hs index 0af3d7eca..d3d53e6b8 100644 --- a/tests/XFTPServerTests.hs +++ b/tests/XFTPServerTests.hs @@ -6,7 +6,7 @@ {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} -module XFTPServerTests where +module XFTPServerTests (xftpServerTests) where import AgentTests.FunctionalAPITests (runRight_) import Control.Concurrent (threadDelay) @@ -31,7 +31,7 @@ import ServerTests (logSize) import Simplex.FileTransfer.Client import Simplex.FileTransfer.Description (kb) import Simplex.FileTransfer.Protocol (FileInfo (..), XFTPFileId, xftpBlockSize) -import Simplex.FileTransfer.Server.Env (XFTPServerConfig (..)) +import Simplex.FileTransfer.Server.Env (AFStoreType, XFTPServerConfig (..)) import Simplex.FileTransfer.Transport (XFTPClientHandshake (..), XFTPClientHello (..), XFTPErrorType (..), XFTPRcvChunkSpec (..), XFTPServerHandshake (..), pattern VersionXFTP) import Simplex.Messaging.Client (ProtocolClientError (..)) import qualified Simplex.Messaging.Crypto as C @@ -52,7 +52,7 @@ import UnliftIO.STM import Util import XFTPClient -xftpServerTests :: Spec +xftpServerTests :: SpecWith AFStoreType xftpServerTests = before_ (createDirectoryIfMissing False xftpServerFiles) . after_ (removeDirectoryRecursive xftpServerFiles) $ do describe "XFTP file chunk delivery" $ do @@ -76,7 +76,7 @@ xftpServerTests = it "allowed with correct basic auth" $ testFileBasicAuth True (Just "pwd") (Just "pwd") True it "allowed with auth on server without auth" $ testFileBasicAuth True Nothing (Just "any") True it "should not change content for uploaded and committed files" testFileSkipCommitted - describe "XFTP SNI and CORS" $ do + describe "XFTP SNI and CORS" $ beforeWith (const (pure ())) $ do it "should select web certificate when SNI is used" testSNICertSelection it "should select XFTP certificate when SNI is not used" testNoSNICertSelection it "should add CORS headers when SNI is used" testCORSHeaders @@ -103,10 +103,10 @@ createTestChunk fp = do readChunk :: XFTPFileId -> IO ByteString readChunk sId = B.readFile (xftpServerFiles B.unpack (B64.encode $ unEntityId sId)) -testFileChunkDelivery :: Expectation +testFileChunkDelivery :: AFStoreType -> Expectation testFileChunkDelivery = xftpTest $ \c -> runRight_ $ runTestFileChunkDelivery c c -testFileChunkDelivery2 :: Expectation +testFileChunkDelivery2 :: AFStoreType -> Expectation testFileChunkDelivery2 = xftpTest2 $ \s r -> runRight_ $ runTestFileChunkDelivery s r runTestFileChunkDelivery :: XFTPClient -> XFTPClient -> ExceptT XFTPClientError IO () @@ -129,7 +129,7 @@ runTestFileChunkDelivery s r = do downloadXFTPChunk g r rpKey rId $ XFTPRcvChunkSpec "tests/tmp/received_chunk1" chSize digest liftIO $ B.readFile "tests/tmp/received_chunk1" `shouldReturn` bytes -testFileChunkDeliveryAddRecipients :: Expectation +testFileChunkDeliveryAddRecipients :: AFStoreType -> Expectation testFileChunkDeliveryAddRecipients = xftpTest4 $ \s r1 r2 r3 -> runRight_ $ do g <- liftIO C.newRandom (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -150,10 +150,10 @@ testFileChunkDeliveryAddRecipients = xftpTest4 $ \s r1 r2 r3 -> runRight_ $ do testReceiveChunk r2 rpKey2 rId2 "tests/tmp/received_chunk2" testReceiveChunk r3 rpKey3 rId3 "tests/tmp/received_chunk3" -testFileChunkDelete :: Expectation +testFileChunkDelete :: AFStoreType -> Expectation testFileChunkDelete = xftpTest $ \c -> runRight_ $ runTestFileChunkDelete c c -testFileChunkDelete2 :: Expectation +testFileChunkDelete2 :: AFStoreType -> Expectation testFileChunkDelete2 = xftpTest2 $ \s r -> runRight_ $ runTestFileChunkDelete s r runTestFileChunkDelete :: XFTPClient -> XFTPClient -> ExceptT XFTPClientError IO () @@ -179,10 +179,10 @@ runTestFileChunkDelete s r = do deleteXFTPChunk s spKey sId `catchError` (liftIO . (`shouldBe` PCEProtocolError AUTH)) -testFileChunkAck :: Expectation +testFileChunkAck :: AFStoreType -> Expectation testFileChunkAck = xftpTest $ \c -> runRight_ $ runTestFileChunkAck c c -testFileChunkAck2 :: Expectation +testFileChunkAck2 :: AFStoreType -> Expectation testFileChunkAck2 = xftpTest2 $ \s r -> runRight_ $ runTestFileChunkAck s r runTestFileChunkAck :: XFTPClient -> XFTPClient -> ExceptT XFTPClientError IO () @@ -206,7 +206,7 @@ runTestFileChunkAck s r = do ackXFTPChunk r rpKey rId `catchError` (liftIO . (`shouldBe` PCEProtocolError AUTH)) -testWrongChunkSize :: Expectation +testWrongChunkSize :: AFStoreType -> Expectation testWrongChunkSize = xftpTest $ \c -> do g <- C.newRandom (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -218,8 +218,8 @@ testWrongChunkSize = xftpTest $ \c -> do void (createXFTPChunk c spKey file [rcvKey] Nothing) `catchError` (liftIO . (`shouldBe` PCEProtocolError SIZE)) -testFileChunkExpiration :: Expectation -testFileChunkExpiration = withXFTPServerCfg testXFTPServerConfig {fileExpiration} $ +testFileChunkExpiration :: AFStoreType -> Expectation +testFileChunkExpiration fsType = withXFTPServerConfigOn (updateXFTPCfg (cfgFS fsType) $ \c -> c {fileExpiration}) $ \_ -> testXFTPClient $ \c -> runRight_ $ do g <- liftIO C.newRandom (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -242,8 +242,8 @@ testFileChunkExpiration = withXFTPServerCfg testXFTPServerConfig {fileExpiration where fileExpiration = Just ExpirationConfig {ttl = 1, checkInterval = 1} -testInactiveClientExpiration :: Expectation -testInactiveClientExpiration = withXFTPServerCfg testXFTPServerConfig {inactiveClientExpiration} $ \_ -> runRight_ $ do +testInactiveClientExpiration :: AFStoreType -> Expectation +testInactiveClientExpiration fsType = withXFTPServerConfigOn (updateXFTPCfg (cfgFS fsType) $ \c -> c {inactiveClientExpiration}) $ \_ -> runRight_ $ do disconnected <- newEmptyTMVarIO ts <- liftIO getCurrentTime c <- ExceptT $ getXFTPClient (1, testXFTPServer, Nothing) testXFTPClientConfig [] ts (\_ -> atomically $ putTMVar disconnected ()) @@ -258,8 +258,8 @@ testInactiveClientExpiration = withXFTPServerCfg testXFTPServerConfig {inactiveC where inactiveClientExpiration = Just ExpirationConfig {ttl = 1, checkInterval = 1} -testFileStorageQuota :: Expectation -testFileStorageQuota = withXFTPServerCfg testXFTPServerConfig {fileSizeQuota = Just $ chSize * 2} $ +testFileStorageQuota :: AFStoreType -> Expectation +testFileStorageQuota fsType = withXFTPServerConfigOn (updateXFTPCfg (cfgFS fsType) $ \c -> c {fileSizeQuota = Just $ chSize * 2}) $ \_ -> testXFTPClient $ \c -> runRight_ $ do g <- liftIO C.newRandom (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -286,8 +286,8 @@ testFileStorageQuota = withXFTPServerCfg testXFTPServerConfig {fileSizeQuota = J uploadXFTPChunk c spKey sId3 chunkSpec download rId3 -testFileLog :: Expectation -testFileLog = do +testFileLog :: AFStoreType -> Expectation +testFileLog _ = do g <- C.newRandom bytes <- liftIO $ createTestChunk testChunkPath (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -378,9 +378,9 @@ testFileLog = do downloadXFTPChunk g c rpKey rId $ XFTPRcvChunkSpec "tests/tmp/received_chunk1" chSize digest liftIO $ B.readFile "tests/tmp/received_chunk1" `shouldReturn` bytes -testFileBasicAuth :: Bool -> Maybe BasicAuth -> Maybe BasicAuth -> Bool -> IO () -testFileBasicAuth allowNewFiles newFileBasicAuth clntAuth success = - withXFTPServerCfg testXFTPServerConfig {allowNewFiles, newFileBasicAuth} $ +testFileBasicAuth :: Bool -> Maybe BasicAuth -> Maybe BasicAuth -> Bool -> AFStoreType -> IO () +testFileBasicAuth allowNewFiles newFileBasicAuth clntAuth success fsType = + withXFTPServerConfigOn (updateXFTPCfg (cfgFS fsType) $ \c -> c {allowNewFiles, newFileBasicAuth}) $ \_ -> testXFTPClient $ \c -> do g <- C.newRandom (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -400,9 +400,9 @@ testFileBasicAuth allowNewFiles newFileBasicAuth clntAuth success = void (createXFTPChunk c spKey file [rcvKey] clntAuth) `catchError` (liftIO . (`shouldBe` PCEProtocolError AUTH)) -testFileSkipCommitted :: IO () -testFileSkipCommitted = - withXFTPServerCfg testXFTPServerConfig $ +testFileSkipCommitted :: AFStoreType -> IO () +testFileSkipCommitted fsType = + withXFTPServerConfigOn (cfgFS fsType) $ \_ -> testXFTPClient $ \c -> do g <- C.newRandom (sndKey, spKey) <- atomically $ C.generateAuthKeyPair C.SEd25519 g @@ -598,3 +598,4 @@ testStaleWebSession = decoded <- either (error . show) pure $ C.unPad respBody decoded `shouldBe` smpEncode SESSION + diff --git a/tests/XFTPWebTests.hs b/tests/XFTPWebTests.hs index fa402ad6f..c9a98eef1 100644 --- a/tests/XFTPWebTests.hs +++ b/tests/XFTPWebTests.hs @@ -45,12 +45,13 @@ import System.Process (CreateProcess (..), StdStream (..), createProcess, proc, import Test.Hspec hiding (fit, it) import Util import Simplex.FileTransfer.Server.Env (XFTPServerConfig) +import Simplex.FileTransfer.Server.Store (STMFileStore) import XFTPClient (testXFTPServerConfigEd25519SNI, testXFTPServerConfigSNI, withXFTPServerCfg, xftpTestPort) import AgentTests.FunctionalAPITests (rfGet, runRight, runRight_, sfGet, withAgent) import Simplex.Messaging.Agent (AgentClient, xftpReceiveFile, xftpSendFile, xftpStartWorkers) import Simplex.Messaging.Agent.Protocol (AEvent (..)) import SMPAgentClient (agentCfg, initAgentServers, testDB) -import XFTPCLI (recipientFiles, senderFiles) +import XFTPCLI (recipientFiles, senderFiles, testBracket) import qualified Simplex.Messaging.Crypto.File as CF xftpWebDir :: FilePath @@ -167,8 +168,8 @@ impAddr = "import * as Addr from './dist/protocol/address.js';" jsOut :: String -> String jsOut expr = "process.stdout.write(Buffer.from(" <> expr <> "));" -xftpWebTests :: Spec -xftpWebTests = do +xftpWebTests :: IO () -> Spec +xftpWebTests dbCleanup = do distExists <- runIO $ doesDirectoryExist (xftpWebDir <> "/dist") if distExists then do @@ -187,7 +188,7 @@ xftpWebTests = do tsClientTests tsDownloadTests tsAddressTests - tsIntegrationTests + tsIntegrationTests dbCleanup else it "skipped (run 'cd xftp-web && npm install && npm run build' first)" $ pendingWith "TS project not compiled" @@ -2829,8 +2830,9 @@ tsAddressTests = describe "protocol/address" $ do -- ── integration ─────────────────────────────────────────────────── -tsIntegrationTests :: Spec -tsIntegrationTests = describe "integration" $ do +tsIntegrationTests :: IO () -> Spec +tsIntegrationTests dbCleanup = describe "integration" $ + around_ testBracket . after_ dbCleanup $ do it "web handshake with Ed25519 identity verification" $ webHandshakeTest testXFTPServerConfigEd25519SNI "tests/fixtures/ed25519/ca.crt" it "web handshake with Ed448 identity verification" $ @@ -2853,7 +2855,7 @@ tsIntegrationTests = describe "integration" $ do it "cross-language: Haskell upload, TS download" $ haskellUploadTsDownloadTest testXFTPServerConfigSNI -webHandshakeTest :: XFTPServerConfig -> FilePath -> Expectation +webHandshakeTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation webHandshakeTest cfg caFile = do withXFTPServerCfg cfg $ \_ -> do Fingerprint fp <- loadFileFingerprint caFile @@ -2894,7 +2896,7 @@ webHandshakeTest cfg caFile = do <> jsOut "new Uint8Array([idOk ? 1 : 0, ack.length === 0 ? 1 : 0])" result `shouldBe` B.pack [1, 1] -pingTest :: XFTPServerConfig -> FilePath -> Expectation +pingTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation pingTest cfg caFile = do withXFTPServerCfg cfg $ \_ -> do Fingerprint fp <- loadFileFingerprint caFile @@ -2916,7 +2918,7 @@ pingTest cfg caFile = do <> jsOut "new Uint8Array([1])" result `shouldBe` B.pack [1] -fullRoundTripTest :: XFTPServerConfig -> FilePath -> Expectation +fullRoundTripTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation fullRoundTripTest cfg caFile = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" withXFTPServerCfg cfg $ \_ -> do @@ -2997,7 +2999,7 @@ agentURIRoundTripTest = do <> jsOut "new Uint8Array([match])" result `shouldBe` B.pack [1] -agentUploadDownloadTest :: XFTPServerConfig -> FilePath -> Expectation +agentUploadDownloadTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation agentUploadDownloadTest cfg caFile = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" withXFTPServerCfg cfg $ \_ -> do @@ -3030,7 +3032,7 @@ agentUploadDownloadTest cfg caFile = do <> jsOut "new Uint8Array([nameMatch, sizeMatch, dataMatch])" result `shouldBe` B.pack [1, 1, 1] -agentDeleteTest :: XFTPServerConfig -> FilePath -> Expectation +agentDeleteTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation agentDeleteTest cfg caFile = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" withXFTPServerCfg cfg $ \_ -> do @@ -3062,7 +3064,7 @@ agentDeleteTest cfg caFile = do <> jsOut "new Uint8Array([deleted])" result `shouldBe` B.pack [1] -agentRedirectTest :: XFTPServerConfig -> FilePath -> Expectation +agentRedirectTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation agentRedirectTest cfg caFile = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" withXFTPServerCfg cfg $ \_ -> do @@ -3096,7 +3098,7 @@ agentRedirectTest cfg caFile = do <> jsOut "new Uint8Array([hasRedirect, nameMatch, sizeMatch, dataMatch])" result `shouldBe` B.pack [1, 1, 1, 1] -tsUploadHaskellDownloadTest :: XFTPServerConfig -> FilePath -> Expectation +tsUploadHaskellDownloadTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation tsUploadHaskellDownloadTest cfg caFile = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" createDirectoryIfMissing False recipientFiles @@ -3131,7 +3133,7 @@ tsUploadHaskellDownloadTest cfg caFile = do downloadedData <- B.readFile outPath downloadedData `shouldBe` originalData -tsUploadRedirectHaskellDownloadTest :: XFTPServerConfig -> FilePath -> Expectation +tsUploadRedirectHaskellDownloadTest :: XFTPServerConfig STMFileStore -> FilePath -> Expectation tsUploadRedirectHaskellDownloadTest cfg caFile = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" createDirectoryIfMissing False recipientFiles @@ -3166,7 +3168,7 @@ tsUploadRedirectHaskellDownloadTest cfg caFile = do downloadedData <- B.readFile outPath downloadedData `shouldBe` originalData -haskellUploadTsDownloadTest :: XFTPServerConfig -> Expectation +haskellUploadTsDownloadTest :: XFTPServerConfig STMFileStore -> Expectation haskellUploadTsDownloadTest cfg = do createDirectoryIfMissing False "tests/tmp/xftp-server-files" createDirectoryIfMissing False senderFiles diff --git a/tests/manual/README.md b/tests/manual/README.md new file mode 100644 index 000000000..74ccc4d51 --- /dev/null +++ b/tests/manual/README.md @@ -0,0 +1,170 @@ +# XFTP Server Manual Test Suite + +Automated integration tests for the XFTP server covering memory and PostgreSQL backends, migration, persistence, blocking, and edge cases. + +- `xftp-test.py` — automated test script (143 checks) +- `xftp-server-testing.md` — manual step-by-step guide covering the same scenarios + +## Prerequisites + +- Linux (tested) +- Python 3 +- Haskell toolchain (`cabal`, `ghc`) +- PostgreSQL 16+ (`postgresql-16` package or equivalent) + +## Setup + +### 1. Build the XFTP binaries + +```bash +cabal build -fserver_postgres exe:xftp-server exe:xftp +``` + +### 2. Set up a local PostgreSQL instance + +The test script connects to PostgreSQL via `PGHOST` (Unix socket path). Set up a local instance that you own (no root required): + +```bash +# Pick a data directory and socket directory +export PGDATA=/tmp/pgdata +export PGHOST=/tmp/pgsocket + +# Clean up any previous instance +rm -rf $PGDATA $PGHOST +mkdir -p $PGDATA $PGHOST + +# Initialize the cluster +/usr/lib/postgresql/16/bin/initdb -D $PGDATA --auth=trust --no-locale --encoding=UTF8 + +# Configure to listen on our socket directory and localhost TCP +echo "unix_socket_directories = '$PGHOST'" >> $PGDATA/postgresql.conf +echo "listen_addresses = '127.0.0.1'" >> $PGDATA/postgresql.conf + +# Start the server +/usr/lib/postgresql/16/bin/pg_ctl -D $PGDATA -l /tmp/pg.log start + +# Verify it's running +pg_isready -h $PGHOST +# Expected: /tmp/pgsocket:5432 - accepting connections +``` + +### 3. Create the required PostgreSQL roles + +The test script expects three roles to exist: + +- `postgres` — admin role used by the test bracket to create/drop databases +- `xftp` — test user for the XFTP server database + +```bash +# Create the postgres admin role (if initdb created the cluster as your user) +psql -h $PGHOST -d postgres -c "CREATE USER postgres WITH SUPERUSER;" + +# Create the xftp test user +psql -h $PGHOST -U postgres -d postgres -c "CREATE USER xftp WITH SUPERUSER;" +``` + +Verify both roles exist: + +```bash +psql -h $PGHOST -U postgres -d postgres -c "\du" +``` + +## Run the test suite + +```bash +PGHOST=/tmp/pgsocket python3 tests/manual/xftp-test.py +``` + +Expected output (abbreviated): + +``` +XFTP server: /project/git/simplexmq-4/dist-newstyle/.../xftp-server +XFTP client: /project/git/simplexmq-4/dist-newstyle/.../xftp +Test dir: /project/git/simplexmq-4/xftp-test +PGHOST: /tmp/pgsocket + +=== 1. Basic send/receive (memory) === + [PASS] 1.1 rcv1.xftp created + ... +=== 12. Recipient cascade and storage accounting === + ... + [PASS] 12.2e DB files after delete (0) + +========================================== +Results: 143 passed, 0 failed +========================================== +``` + +Total runtime: ~3 minutes. Exit code 0 on success, 1 on any failure. + +## What the suite tests + +| # | Section | Checks | Scope | +|---|---------|--------|-------| +| 1 | Basic memory | 9 | Send/recv/delete on STM backend | +| 2 | Basic PostgreSQL | 7 | Send/recv/delete on PG backend, DB row verification | +| 3 | Migration memory → PG | 12 | Send on memory, partial recv, import, recv remaining | +| 4 | Migration PG → memory | 5 | Export, switch to memory, delete exported files | +| 4b | Send PG, recv memory | 7 | Reverse direction — send on PG, export, recv on memory | +| 5 | Restart persistence | 6 | memory+log / memory no log / PostgreSQL | +| 6 | Config edge cases | 15 | store log conflicts, missing schema, dual-write, import/export guards | +| 7 | File blocking | 13 | Control port block, block state survives migration both directions | +| 8 | Migration edge cases | 23 | Acked recipients preserved, deleted files absent, 20MB multi-chunk, double round-trip | +| 9 | Auth & access control | 9 | allowNewFiles, basic auth (none/wrong/correct/server-no-auth), quota | +| 10 | Control port ops | 8 | No auth, wrong auth, stats, delete, invalid block | +| 11 | Blocked sender delete | 3 | Sender can't delete blocked file | +| 12 | Cascade & storage | 8 | Recipient cascade, disk/DB accounting | + +## Troubleshooting + +### Server binary not found + +``` +Binary not found: .../xftp-server +Run: cabal build -fserver_postgres exe:xftp-server +``` + +Run the cabal build command from step 1. + +### Cannot connect to PostgreSQL + +``` +Cannot connect to PostgreSQL as postgres. Is it running? +``` + +Check: +1. `pg_isready -h $PGHOST` returns "accepting connections" +2. `PGHOST` environment variable is exported in the shell running the test +3. The `postgres` role exists: `psql -h $PGHOST -U postgres -d postgres -c "SELECT 1;"` + +### PostgreSQL user 'xftp' does not exist + +``` +PostgreSQL user 'xftp' does not exist. +Run: psql -U postgres -c "CREATE USER xftp WITH SUPERUSER;" +``` + +Run the create-user command from step 3. + +### Port 7921 or 15230 already in use + +The test uses port 7921 for XFTP and 15230 for the control port. If these are occupied, stop whatever is using them or edit `PORT` / `CONTROL_PORT` constants at the top of `xftp-test.py`. + +### Server fails to start mid-test + +Check `xftp-test/server.log` in the project directory for the server's stdout/stderr. The test framework prints the last 5 lines of the log on startup failure. + +## Stopping the test PostgreSQL instance + +```bash +/usr/lib/postgresql/16/bin/pg_ctl -D /tmp/pgdata stop +``` + +## Cleanup + +The test script cleans up its own test directory (`./xftp-test/`) and drops the test database (`xftp_server_store`) on completion. To also remove the PostgreSQL instance: + +```bash +/usr/lib/postgresql/16/bin/pg_ctl -D /tmp/pgdata stop +rm -rf /tmp/pgdata /tmp/pgsocket /tmp/pg.log +``` diff --git a/tests/manual/xftp-server-testing.md b/tests/manual/xftp-server-testing.md new file mode 100644 index 000000000..ac9698b48 --- /dev/null +++ b/tests/manual/xftp-server-testing.md @@ -0,0 +1,1437 @@ +# XFTP Server Manual Testing Guide + +Manual testing of the XFTP server with memory (STM) and PostgreSQL backends, including migration between them, blocking, auth, quota, control port, and edge cases. + +All paths are self-contained under `./xftp-test/`. The automated version of this guide is `xftp-test.py` (143 checks). This guide mirrors the script 1:1. + +## Prerequisites + +See `tests/manual/README.md` for PostgreSQL setup. After setup, in the shell running this guide: + +```bash +cabal build -fserver_postgres exe:xftp-server exe:xftp + +export XFTP_SERVER=$(cabal list-bin exe:xftp-server) +export XFTP=$(cabal list-bin exe:xftp) +export TEST_DIR=$(pwd)/xftp-test +export XFTP_SERVER_CFG_PATH=$TEST_DIR/etc +export XFTP_SERVER_LOG_PATH=$TEST_DIR/var +export PGHOST=/tmp/pgsocket +``` + +PostgreSQL roles `postgres` and `xftp` (both SUPERUSER) must exist — see the README. + +Helper functions for editing the INI config: + +```bash +ini_set() { sed -i "s|^${1}:.*|${1}: ${2}|" $XFTP_SERVER_CFG_PATH/file-server.ini; } +ini_uncomment() { sed -i "s|^# ${1} =|${1} =|" $XFTP_SERVER_CFG_PATH/file-server.ini; } +ini_comment() { sed -i "s|^${1} =|# ${1} =|" $XFTP_SERVER_CFG_PATH/file-server.ini; } + +enable_control_port() { + sed -i 's/^# control_port = 5226/control_port = 15230/' $XFTP_SERVER_CFG_PATH/file-server.ini + sed -i 's/^# control_port_admin_password =.*/control_port_admin_password = testadmin/' $XFTP_SERVER_CFG_PATH/file-server.ini +} + +# Extract recipient IDs from a file description (chunk format: "- N:rcvId:privKey:digest") +get_recipient_ids() { + grep '^ *- [0-9]' "$1" | cut -d: -f2 +} + +# Send a command to the control port as admin and print the response +control_cmd() { + python3 -c " +import socket, time +s = socket.create_connection(('127.0.0.1', 15230), timeout=5) +s.settimeout(2) +# Drain welcome +time.sleep(0.3) +s.recv(4096) +s.sendall(b'auth testadmin\n') +time.sleep(0.3); s.recv(4096) +s.sendall(b'$1\n') +time.sleep(0.3) +print(s.recv(4096).decode().strip()) +s.sendall(b'quit\n'); s.close() +" +} +``` + +## Important notes + +- **`-y` on `recv`** auto-confirms, ACKs chunks on the server, and deletes the descriptor file. +- **`-y` on `del`** auto-confirms and deletes the sender descriptor. +- **`database import` and `database export`** prompt for confirmation. Answer uppercase **`Y`**. +- Server defaults to port 443 (requires root). All tests use port 7921. +- **`init` does not create the store log file.** It is created on first `server start` with `enable: on`. +- **`--confirm-migrations up`** auto-confirms PG schema migrations. +- With `store_files: database`, the PG schema must already exist — create manually or use `database import` which creates it automatically. + +## 1. Basic send/receive (memory backend) + +### 1.1 Initialize and start server + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 + +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$! +sleep 2 +``` + +### 1.2 Send a file with 2 recipients + +```bash +dd if=/dev/urandom of=$TEST_DIR/testfile.bin bs=1M count=5 2>/dev/null + +$XFTP send $TEST_DIR/testfile.bin $TEST_DIR/descriptions -s "$SRV" -n 2 -v + +ls $TEST_DIR/descriptions/testfile.bin.xftp/ +# Expected: rcv1.xftp rcv2.xftp snd.xftp.private +``` + +### 1.3 Receive the file (recipient 1) + +```bash +$XFTP recv $TEST_DIR/descriptions/testfile.bin.xftp/rcv1.xftp $TEST_DIR/received -y -v +diff $TEST_DIR/testfile.bin $TEST_DIR/received/testfile.bin +# Expected: no output + +ls $TEST_DIR/descriptions/testfile.bin.xftp/rcv1.xftp 2>&1 +# Expected: No such file or directory (deleted by -y) +``` + +### 1.4 Receive the file (recipient 2) + +```bash +rm -f $TEST_DIR/received/testfile.bin + +$XFTP recv $TEST_DIR/descriptions/testfile.bin.xftp/rcv2.xftp $TEST_DIR/received -y -v +diff $TEST_DIR/testfile.bin $TEST_DIR/received/testfile.bin +``` + +### 1.5 Delete the file from server + +```bash +$XFTP del $TEST_DIR/descriptions/testfile.bin.xftp/snd.xftp.private -y -v + +ls $TEST_DIR/descriptions/testfile.bin.xftp/snd.xftp.private 2>&1 +# Expected: No such file or directory + +ls $TEST_DIR/files/ | wc -l +# Expected: 0 +``` + +### 1.6 Stop server + +```bash +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 2. Basic send/receive (PostgreSQL backend) + +### 2.1 Initialize fresh server for PostgreSQL + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size + +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +``` + +### 2.2 Start server with PostgreSQL + +```bash +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$! +sleep 2 +``` + +### 2.3 Send, receive, verify + +```bash +dd if=/dev/urandom of=$TEST_DIR/testfile.bin bs=1M count=5 2>/dev/null + +$XFTP send $TEST_DIR/testfile.bin $TEST_DIR/descriptions -s "$SRV" -n 2 -v +$XFTP recv $TEST_DIR/descriptions/testfile.bin.xftp/rcv1.xftp $TEST_DIR/received -y -v +diff $TEST_DIR/testfile.bin $TEST_DIR/received/testfile.bin +``` + +### 2.4 Verify data is in PostgreSQL + +```bash +psql -U xftp -d xftp_server_store \ + -c "SET search_path TO xftp_server; SELECT count(*) AS files FROM files;" +# Expected: > 0 + +psql -U xftp -d xftp_server_store \ + -c "SET search_path TO xftp_server; SELECT count(*) AS recipients FROM recipients;" +# Expected: > 0 +``` + +### 2.5 Delete and verify all cleaned up + +```bash +$XFTP del $TEST_DIR/descriptions/testfile.bin.xftp/snd.xftp.private -y -v + +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM files;" +# Expected: 0 +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM recipients;" +# Expected: 0 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 3. Migration: memory to PostgreSQL + +### 3.1 Start with memory backend, send files + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/fileA.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/fileA.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +dd if=/dev/urandom of=$TEST_DIR/fileB.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/fileB.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +# Partially receive fileB (only rcv1) +$XFTP recv $TEST_DIR/descriptions/fileB.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/fileB.bin $TEST_DIR/received/fileB.bin +``` + +### 3.2 Stop server and migrate to PostgreSQL + +```bash +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size + +echo Y | $XFTP_SERVER database import +# Expected: "Loaded N files, M recipients" / "Imported N files" / "Imported M recipients" +# "Store log renamed to ...file-server-store.log.bak" + +ls $XFTP_SERVER_LOG_PATH/file-server-store.log.bak # should exist +ls $XFTP_SERVER_LOG_PATH/file-server-store.log 2>&1 # should NOT exist + +psql -U xftp -d xftp_server_store <<'SQL' +SET search_path TO xftp_server; +SELECT count(*) AS file_count FROM files; +SELECT count(*) AS recipient_count FROM recipients; +SQL +``` + +### 3.3 Start server with PostgreSQL and receive remaining files + +```bash +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/fileA.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/fileA.bin $TEST_DIR/received/fileA.bin + +$XFTP recv $TEST_DIR/descriptions/fileA.bin.xftp/rcv2.xftp $TEST_DIR/received -y + +rm -f $TEST_DIR/received/fileB.bin +$XFTP recv $TEST_DIR/descriptions/fileB.bin.xftp/rcv2.xftp $TEST_DIR/received -y +diff $TEST_DIR/fileB.bin $TEST_DIR/received/fileB.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 4. Migration: PostgreSQL back to memory + +Continues from section 3 state. + +### 4.1 Export from PostgreSQL + +```bash +echo Y | $XFTP_SERVER database export +ls $XFTP_SERVER_LOG_PATH/file-server-store.log # should exist +head -5 $XFTP_SERVER_LOG_PATH/file-server-store.log +# Should contain FNEW, FADD, FPUT entries +``` + +### 4.2 Switch back to memory and start + +```bash +ini_set store_files memory +ini_comment db_connection +ini_comment db_schema +ini_comment db_pool_size + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 +``` + +### 4.3 Verify deletes work on round-trip data + +```bash +$XFTP del $TEST_DIR/descriptions/fileA.bin.xftp/snd.xftp.private -y +$XFTP del $TEST_DIR/descriptions/fileB.bin.xftp/snd.xftp.private -y + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 4b. Send on PostgreSQL, export, receive on memory + +### 4b.1 Start PG server and send a file + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/pgfileA.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/pgfileA.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +# Receive rcv1 on PG +$XFTP recv $TEST_DIR/descriptions/pgfileA.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/pgfileA.bin $TEST_DIR/received/pgfileA.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 +``` + +### 4b.2 Export and switch to memory + +```bash +echo Y | $XFTP_SERVER database export + +ini_set store_files memory +ini_comment db_connection +ini_comment db_schema +ini_comment db_pool_size + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 +``` + +### 4b.3 Receive remaining file on memory backend + +```bash +rm -f $TEST_DIR/received/pgfileA.bin +$XFTP recv $TEST_DIR/descriptions/pgfileA.bin.xftp/rcv2.xftp $TEST_DIR/received -y +diff $TEST_DIR/pgfileA.bin $TEST_DIR/received/pgfileA.bin + +$XFTP del $TEST_DIR/descriptions/pgfileA.bin.xftp/snd.xftp.private -y + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 5. Server restart persistence + +### 5.1 Memory backend with store log + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/persist.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/persist.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/persist.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/persist.bin $TEST_DIR/received/persist.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 5.2 Memory backend WITHOUT store log + +```bash +rm -rf $TEST_DIR/descriptions/* $TEST_DIR/received/* +ini_set enable off + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/persist2.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/persist2.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/persist2.bin.xftp/rcv1.xftp $TEST_DIR/received -y 2>&1 +# Expected: CLIError "PCEProtocolError AUTH" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 5.3 PostgreSQL backend + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/persist.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/persist.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/persist.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/persist.bin $TEST_DIR/received/persist.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 6. Edge cases + +### 6.1 Receive after server-side delete + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/deltest.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/deltest.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +$XFTP del $TEST_DIR/descriptions/deltest.bin.xftp/snd.xftp.private -y + +$XFTP recv $TEST_DIR/descriptions/deltest.bin.xftp/rcv2.xftp $TEST_DIR/received -y 2>&1 +# Expected: AUTH error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 6.2 Multiple recipients and partial acknowledgment + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/multi.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/multi.bin $TEST_DIR/descriptions -s "$SRV" -n 3 + +$XFTP recv $TEST_DIR/descriptions/multi.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/multi.bin $TEST_DIR/received/multi.bin + +rm -f $TEST_DIR/received/multi.bin +$XFTP recv $TEST_DIR/descriptions/multi.bin.xftp/rcv2.xftp $TEST_DIR/received -y +diff $TEST_DIR/multi.bin $TEST_DIR/received/multi.bin + +rm -f $TEST_DIR/received/multi.bin +$XFTP recv $TEST_DIR/descriptions/multi.bin.xftp/rcv3.xftp $TEST_DIR/received -y +diff $TEST_DIR/multi.bin $TEST_DIR/received/multi.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 6.3 Switching to database mode with existing store log (should fail) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +# Run memory mode to create a store log +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 +dd if=/dev/urandom of=$TEST_DIR/dummy.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/dummy.bin $TEST_DIR/descriptions -s "$SRV" -n 1 +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +ls $XFTP_SERVER_LOG_PATH/file-server-store.log # should exist + +# Switch to DB mode without importing +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" + +$XFTP_SERVER start --confirm-migrations up 2>&1 +# Expected error: +# Error: store log file .../file-server-store.log exists but store_files is `database`. +# Use `file-server database import` to migrate, or set `db_store_log: on`. +``` + +### 6.4 Database mode without schema (should fail) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size + +# Do NOT create the schema +$XFTP_SERVER start --confirm-migrations up 2>&1 +# Expected error: +# connectPostgresStore, schema xftp_server does not exist, exiting. +``` + +### 6.5 Dual-write mode: database + db_store_log: on + +Verifies that writes in dual-write mode land in BOTH the DB and the store log. + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +ini_uncomment db_store_log +ini_set db_store_log on +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +# Send a new file in dual-write mode +dd if=/dev/urandom of=$TEST_DIR/dual.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/dual.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +# Both the store log AND the DB must have entries +ls -la $XFTP_SERVER_LOG_PATH/file-server-store.log # size > 0 +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM files;" +# Expected: > 0 + +# Now switch to memory-only and verify the file is accessible (proves store log has valid data) +ini_set store_files memory +ini_comment db_connection +ini_comment db_schema +ini_comment db_pool_size +ini_comment db_store_log + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/dual.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/dual.bin $TEST_DIR/received/dual.bin +echo "Dual-write mode verified: same file accessible from DB and from store log" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 6.6 Import to non-empty database (should fail) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/dummy.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/dummy.bin $TEST_DIR/descriptions -s "$SRV" -n 1 +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null + +# Export produces a real valid store log, then re-import into non-empty DB +echo Y | $XFTP_SERVER database export +echo Y | $XFTP_SERVER database import 2>&1 +# Expected: import fails because DB is not empty +``` + +### 6.7 Import without store log file (should fail) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size + +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +echo Y | $XFTP_SERVER database import 2>&1 +# Expected: Error: store log file ... does not exist. +``` + +### 6.8 Export when store log already exists (should fail) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/exp.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/exp.bin $TEST_DIR/descriptions -s "$SRV" -n 1 +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null + +echo "existing" > $XFTP_SERVER_LOG_PATH/file-server-store.log +echo Y | $XFTP_SERVER database export 2>&1 +# Expected: Error: store log file ... already exists. +``` + +## 7. File blocking via control port + +### 7.1 Block a file, verify receive fails + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +enable_control_port +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/blockme.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/blockme.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +# Extract the first recipient ID from the descriptor +RCV_ID=$(get_recipient_ids $TEST_DIR/descriptions/blockme.bin.xftp/rcv1.xftp | head -1) +echo "Blocking recipient ID: $RCV_ID" + +control_cmd "block $RCV_ID reason=spam" +# Expected: ok + +$XFTP recv $TEST_DIR/descriptions/blockme.bin.xftp/rcv1.xftp $TEST_DIR/received -y 2>&1 +# Expected: CLIError "PCEProtocolError (BLOCKED {blockInfo = BlockingInfo {reason = BRSpam, ...}})" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 7.2 Blocked file survives memory -> PG migration + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +enable_control_port +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/blockmigrate.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/blockmigrate.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +RCV_ID=$(get_recipient_ids $TEST_DIR/descriptions/blockmigrate.bin.xftp/rcv1.xftp | head -1) +control_cmd "block $RCV_ID reason=content" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +# Migrate to PG +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +echo Y | $XFTP_SERVER database import + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/blockmigrate.bin.xftp/rcv1.xftp $TEST_DIR/received -y 2>&1 +# Expected: BLOCKED error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 7.3 Blocked file survives PG -> memory export + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +enable_control_port +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/blockpg.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/blockpg.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +RCV_ID=$(get_recipient_ids $TEST_DIR/descriptions/blockpg.bin.xftp/rcv1.xftp | head -1) +control_cmd "block $RCV_ID reason=spam" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +echo Y | $XFTP_SERVER database export +ini_set store_files memory +ini_comment db_connection +ini_comment db_schema +ini_comment db_pool_size + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/blockpg.bin.xftp/rcv1.xftp $TEST_DIR/received -y 2>&1 +# Expected: BLOCKED error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 8. Migration edge cases + +### 8.1 Acked recipient preserved after memory -> PG migration + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/acktest.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/acktest.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +# BACKUP rcv1 descriptor before recv (recv -y deletes it) +cp $TEST_DIR/descriptions/acktest.bin.xftp/rcv1.xftp $TEST_DIR/rcv1_backup.xftp + +# Recv rcv1 (acks it server-side, deletes descriptor) +$XFTP recv $TEST_DIR/descriptions/acktest.bin.xftp/rcv1.xftp $TEST_DIR/received -y + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +# Migrate to PG +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +echo Y | $XFTP_SERVER database import + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +# Acked rcv1 MUST fail (recipient removed by ack, preserved through migration) +$XFTP recv $TEST_DIR/rcv1_backup.xftp $TEST_DIR/received -y 2>&1 +# Expected: AUTH error + +# Unacked rcv2 MUST work +rm -f $TEST_DIR/received/acktest.bin +$XFTP recv $TEST_DIR/descriptions/acktest.bin.xftp/rcv2.xftp $TEST_DIR/received -y +diff $TEST_DIR/acktest.bin $TEST_DIR/received/acktest.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 8.2 Acked recipient preserved after PG -> memory export + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/ackpg.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/ackpg.bin $TEST_DIR/descriptions -s "$SRV" -n 2 + +cp $TEST_DIR/descriptions/ackpg.bin.xftp/rcv1.xftp $TEST_DIR/rcv1_backup.xftp +$XFTP recv $TEST_DIR/descriptions/ackpg.bin.xftp/rcv1.xftp $TEST_DIR/received -y + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +echo Y | $XFTP_SERVER database export + +ini_set store_files memory +ini_comment db_connection +ini_comment db_schema +ini_comment db_pool_size + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/rcv1_backup.xftp $TEST_DIR/received -y 2>&1 +# Expected: AUTH error + +rm -f $TEST_DIR/received/ackpg.bin +$XFTP recv $TEST_DIR/descriptions/ackpg.bin.xftp/rcv2.xftp $TEST_DIR/received -y +diff $TEST_DIR/ackpg.bin $TEST_DIR/received/ackpg.bin + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 8.3 Deleted file absent after migration (positive + negative control) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +# File to be deleted (use n=2, backup rcv2 before delete) +dd if=/dev/urandom of=$TEST_DIR/delmigrate.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/delmigrate.bin $TEST_DIR/descriptions -s "$SRV" -n 2 +cp $TEST_DIR/descriptions/delmigrate.bin.xftp/rcv2.xftp $TEST_DIR/rcv2_del_backup.xftp + +$XFTP recv $TEST_DIR/descriptions/delmigrate.bin.xftp/rcv1.xftp $TEST_DIR/received -y +$XFTP del $TEST_DIR/descriptions/delmigrate.bin.xftp/snd.xftp.private -y + +# Positive control: a file that is NOT deleted +dd if=/dev/urandom of=$TEST_DIR/keepmigrate.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/keepmigrate.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +echo Y | $XFTP_SERVER database import + +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM files;" +# Expected: > 0 (kept file imported) + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +# Positive: kept file MUST be receivable +$XFTP recv $TEST_DIR/descriptions/keepmigrate.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/keepmigrate.bin $TEST_DIR/received/keepmigrate.bin + +# Negative: deleted file's rcv2 MUST return AUTH +$XFTP recv $TEST_DIR/rcv2_del_backup.xftp $TEST_DIR/received -y 2>&1 +# Expected: AUTH error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 8.4 Large multi-chunk file integrity after migration + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/largefile.bin bs=1M count=20 2>/dev/null +$XFTP send $TEST_DIR/largefile.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +echo Y | $XFTP_SERVER database import + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/largefile.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/largefile.bin $TEST_DIR/received/largefile.bin +echo "20MB multi-chunk integrity preserved" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 8.5 Double round-trip: memory -> PG -> memory -> PG + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 +dd if=/dev/urandom of=$TEST_DIR/roundtrip.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/roundtrip.bin $TEST_DIR/descriptions -s "$SRV" -n 1 +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +# Round 1: memory -> PG +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +echo Y | $XFTP_SERVER database import +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +# Round 1: PG -> memory +echo Y | $XFTP_SERVER database export +ini_set store_files memory +ini_comment db_connection +ini_comment db_schema +ini_comment db_pool_size +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null; sleep 1 + +# Round 2: memory -> PG +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +echo Y | $XFTP_SERVER database import + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +$XFTP recv $TEST_DIR/descriptions/roundtrip.bin.xftp/rcv1.xftp $TEST_DIR/received -y +diff $TEST_DIR/roundtrip.bin $TEST_DIR/received/roundtrip.bin +echo "File intact after memory->PG->memory->PG double round-trip" + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 9. Auth and access control + +### 9.1 allowNewFiles=false rejects upload + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set new_files off +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/reject.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/reject.bin $TEST_DIR/descriptions -s "$SRV" -n 1 2>&1 +# Expected: upload fails + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 9.2 Basic auth: no password → fails with AUTH + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +sed -i 's/^# create_password:.*$/create_password: secret123/' $XFTP_SERVER_CFG_PATH/file-server.ini +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/authtest.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/authtest.bin $TEST_DIR/descriptions -s "$SRV" -n 1 2>&1 +# Expected: AUTH error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 9.3 Basic auth: wrong password → PCEProtocolError AUTH + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +sed -i 's/^# create_password:.*$/create_password: secret123/' $XFTP_SERVER_CFG_PATH/file-server.ini +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +WRONG_SRV="xftp://$FP:wrongpass@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/authtest.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/authtest.bin $TEST_DIR/descriptions -s "$WRONG_SRV" -n 1 2>&1 +# Expected: "PCEProtocolError AUTH" in output +ls $TEST_DIR/descriptions/authtest.bin.xftp/rcv1.xftp 2>&1 +# Expected: No such file or directory (no descriptor created) + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 9.4 Basic auth: correct password → succeeds + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +sed -i 's/^# create_password:.*$/create_password: secret123/' $XFTP_SERVER_CFG_PATH/file-server.ini +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +CORRECT_SRV="xftp://$FP:secret123@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/authok.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/authok.bin $TEST_DIR/descriptions -s "$CORRECT_SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 9.5 Server without auth, client sends auth → succeeds + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +AUTH_SRV="xftp://$FP:anypass@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/noauth.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/noauth.bin $TEST_DIR/descriptions -s "$AUTH_SRV" -n 1 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 9.6 Storage quota boundary + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 3mb --ip 127.0.0.1 +ini_set port 7921 +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/quota1.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/quota1.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +dd if=/dev/urandom of=$TEST_DIR/quota2.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/quota2.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +dd if=/dev/urandom of=$TEST_DIR/quota3.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/quota3.bin $TEST_DIR/descriptions -s "$SRV" -n 1 2>&1 +# Expected: QUOTA error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +### 9.7 File expiration + +File expiration is not testable in a fast manual test because `createdAt` uses hour-level precision (`fileTimePrecision = 3600s`) and the check interval is hardcoded at 2 hours. It is tested in the Haskell test suite (`testFileChunkExpiration` with a 1-second TTL). + +## 10. Control port operations + +### 10.1 Command without auth → AUTH + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +enable_control_port +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/ctrldel.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/ctrldel.bin $TEST_DIR/descriptions -s "$SRV" -n 1 +RCV_ID=$(get_recipient_ids $TEST_DIR/descriptions/ctrldel.bin.xftp/rcv1.xftp | head -1) + +# No auth +python3 -c " +import socket, time +s = socket.create_connection(('127.0.0.1', 15230), timeout=5) +s.settimeout(2) +time.sleep(0.3); s.recv(4096) +s.sendall(b'delete $RCV_ID\n') +time.sleep(0.3) +print(s.recv(4096).decode().strip()) +s.sendall(b'quit\n'); s.close() +" +# Expected: AUTH +``` + +### 10.2 Wrong password → CPRNone, commands return AUTH + +```bash +python3 -c " +import socket, time +s = socket.create_connection(('127.0.0.1', 15230), timeout=5) +s.settimeout(2) +time.sleep(0.3); s.recv(4096) +s.sendall(b'auth wrongpassword\n') +time.sleep(0.3) +print('auth:', s.recv(4096).decode().strip()) +# Expected: Current role is CPRNone +s.sendall(b'delete $RCV_ID\n') +time.sleep(0.3) +print('delete:', s.recv(4096).decode().strip()) +# Expected: AUTH +s.sendall(b'quit\n'); s.close() +" +``` + +### 10.3 stats-rts responds + +```bash +control_cmd "stats-rts" +# Expected: either GHC RTS stats or "unsupported operation (GHC.Stats.getRTSStats: ...)" +``` + +### 10.4 Delete command removes file + +```bash +control_cmd "delete $RCV_ID" +# Expected: ok + +$XFTP recv $TEST_DIR/descriptions/ctrldel.bin.xftp/rcv1.xftp $TEST_DIR/received -y 2>&1 +# Expected: AUTH error +``` + +### 10.5 Invalid block reason → error: + +```bash +dd if=/dev/urandom of=$TEST_DIR/badblock.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/badblock.bin $TEST_DIR/descriptions -s "$SRV" -n 1 +RCV_ID2=$(get_recipient_ids $TEST_DIR/descriptions/badblock.bin.xftp/rcv1.xftp | head -1) + +control_cmd "block $RCV_ID2 reason=invalid_reason" +# Expected: error:... + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 11. Blocked file: sender cannot delete + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +enable_control_port +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +$XFTP_SERVER start & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/blockdel.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/blockdel.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +RCV_ID=$(get_recipient_ids $TEST_DIR/descriptions/blockdel.bin.xftp/rcv1.xftp | head -1) +control_cmd "block $RCV_ID reason=spam" + +# Sender delete should fail with BLOCKED +$XFTP del $TEST_DIR/descriptions/blockdel.bin.xftp/snd.xftp.private -y 2>&1 +# Expected: BLOCKED error + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## 12. Recipient cascade and storage accounting + +### 12.1 Recipient cascade delete (PG) + +```bash +rm -rf $TEST_DIR +mkdir -p $TEST_DIR/{files,descriptions,received} +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +psql -U postgres -c "CREATE DATABASE xftp_server_store OWNER xftp;" + +$XFTP_SERVER init -p $TEST_DIR/files -q 10gb --ip 127.0.0.1 +ini_set port 7921 +ini_set store_files database +ini_uncomment db_connection +ini_uncomment db_schema +ini_uncomment db_pool_size +FP=$(cat $XFTP_SERVER_CFG_PATH/fingerprint) +SRV="xftp://$FP@127.0.0.1:7921" + +psql -U xftp -d xftp_server_store -c "CREATE SCHEMA IF NOT EXISTS xftp_server;" +rm -f $XFTP_SERVER_LOG_PATH/file-server-store.log + +$XFTP_SERVER start --confirm-migrations up & +SERVER_PID=$!; sleep 2 + +dd if=/dev/urandom of=$TEST_DIR/cascade.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/cascade.bin $TEST_DIR/descriptions -s "$SRV" -n 3 + +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM files;" +# Expected: > 0 +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM recipients;" +# Expected: > 0 + +$XFTP del $TEST_DIR/descriptions/cascade.bin.xftp/snd.xftp.private -y + +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM files;" +# Expected: 0 +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM recipients;" +# Expected: 0 (cascade delete) +``` + +### 12.2 Storage accounting + +```bash +dd if=/dev/urandom of=$TEST_DIR/stor1.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/stor1.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +dd if=/dev/urandom of=$TEST_DIR/stor2.bin bs=1M count=1 2>/dev/null +$XFTP send $TEST_DIR/stor2.bin $TEST_DIR/descriptions -s "$SRV" -n 1 + +ls $TEST_DIR/files/ | wc -l +# Expected: > 0 + +$XFTP del $TEST_DIR/descriptions/stor1.bin.xftp/snd.xftp.private -y +$XFTP del $TEST_DIR/descriptions/stor2.bin.xftp/snd.xftp.private -y + +ls $TEST_DIR/files/ | wc -l +# Expected: 0 + +psql -U xftp -d xftp_server_store -c "SET search_path TO xftp_server; SELECT count(*) FROM files;" +# Expected: 0 + +kill $SERVER_PID; wait $SERVER_PID 2>/dev/null +``` + +## Cleanup + +```bash +kill $SERVER_PID 2>/dev/null; wait $SERVER_PID 2>/dev/null +rm -rf $TEST_DIR +psql -U postgres -c "DROP DATABASE IF EXISTS xftp_server_store;" +``` + +## Summary of expected results + +| # | Scenario | Expected | +|---|----------|----------| +| 1 | Send/receive on memory | OK | +| 2 | Send/receive on PostgreSQL | OK (DB rows match) | +| 3 | Memory → PG, receive remaining | OK | +| 4 | PG → memory, delete round-trip | OK | +| 4b | Send PG, export, receive on memory | OK | +| 5.1 | Restart persistence (memory + log) | OK | +| 5.2 | Restart persistence (memory, no log) | AUTH error | +| 5.3 | Restart persistence (PostgreSQL) | OK | +| 6.1 | Receive after server delete | AUTH error | +| 6.2 | Multiple recipients (n=3) | All work | +| 6.3 | DB mode + existing store log | Server refuses | +| 6.4 | DB mode + no schema | Server fails | +| 6.5 | Dual-write (db_store_log: on) | Both DB and log have data | +| 6.6 | Import to non-empty DB | Error | +| 6.7 | Import without store log | Error | +| 6.8 | Export when store log exists | Error | +| 7.1 | Block file, receive fails | BLOCKED (not AUTH) | +| 7.2 | Block survives memory → PG | BLOCKED | +| 7.3 | Block survives PG → memory | BLOCKED | +| 8.1 | Acked rcv1 fails, rcv2 works (memory → PG) | AUTH + OK | +| 8.2 | Acked rcv1 fails, rcv2 works (PG → memory) | AUTH + OK | +| 8.3 | Deleted file absent, kept file present | rcv2_del=AUTH, kept=OK | +| 8.4 | Large 20MB multi-chunk migration | Integrity preserved | +| 8.5 | Double round-trip memory↔PG | Intact | +| 9.1 | new_files=off | Upload rejected | +| 9.2 | Basic auth, no password | AUTH | +| 9.3 | Basic auth, wrong password | PCEProtocolError AUTH | +| 9.4 | Basic auth, correct password | OK | +| 9.5 | No server auth, client sends auth | OK | +| 9.6 | Quota boundary | 3rd file QUOTA error | +| 10.1 | Control port, no auth | AUTH | +| 10.2 | Control port, wrong password | CPRNone → AUTH | +| 10.3 | stats-rts | Responds | +| 10.4 | Control port delete | ok → recv AUTH | +| 10.5 | Invalid block reason | error: | +| 11 | Blocked file, sender delete | BLOCKED | +| 12.1 | Recipient cascade delete (PG) | files=0, recipients=0 | +| 12.2 | Storage accounting | disk=0, DB=0 | diff --git a/tests/manual/xftp-test.py b/tests/manual/xftp-test.py new file mode 100644 index 000000000..b20b4f3b2 --- /dev/null +++ b/tests/manual/xftp-test.py @@ -0,0 +1,1443 @@ +#!/usr/bin/env python3 +""" +Automated XFTP server test suite. +Tests memory and PostgreSQL backends, migration, persistence, and edge cases. + +Prerequisites: + cabal build -fserver_postgres exe:xftp-server exe:xftp + PostgreSQL running (set PGHOST if non-default socket) + User 'xftp' with SUPERUSER must exist: + psql -U postgres -c "CREATE USER xftp WITH SUPERUSER;" + +Usage: + python3 tests/manual/xftp-test.py + PGHOST=/tmp/pgsocket python3 tests/manual/xftp-test.py +""" + +import os +import re +import shutil +import signal +import socket +import subprocess +import sys +import time +import traceback +from pathlib import Path + + +# --- Configuration --- + +PORT = "7921" +DB_NAME = "xftp_server_store" +DB_USER = "xftp" +DB_SCHEMA = "xftp_server" +PG_ADMIN_USER = "postgres" + + +# --- State --- + +PASS = 0 +FAIL = 0 +server_proc = None + + +# --- Helpers --- + +def run(cmd, *, check=True, input=None, timeout=30): + """Run a command, return CompletedProcess.""" + r = subprocess.run( + cmd, shell=isinstance(cmd, str), + capture_output=True, text=True, + input=input, timeout=timeout, + ) + if check and r.returncode != 0: + raise subprocess.CalledProcessError(r.returncode, cmd, r.stdout, r.stderr) + return r + + +def cabal_bin(name): + r = run(f"cabal list-bin exe:{name}") + p = r.stdout.strip() + if not os.path.isfile(p): + sys.exit(f"Binary not found: {p}\nRun: cabal build -fserver_postgres exe:{name}") + return p + + +def psql(sql, *, user=PG_ADMIN_USER, db="postgres", check=True): + return run(["psql", "-U", user, "-d", db, "-t", "-A", "-c", sql], check=check) + + +def db_count(table): + r = psql(f"SET search_path TO {DB_SCHEMA}; SELECT count(*) FROM {table};", + user=DB_USER, db=DB_NAME, check=False) + if r.returncode != 0: + return -1 + # psql -t -A output includes "SET" line from SET search_path, take the last line + lines = [l.strip() for l in r.stdout.strip().split("\n") if l.strip() and l.strip() != "SET"] + return int(lines[-1]) if lines else -1 + + +def pass_(desc): + global PASS + PASS += 1 + print(f" [PASS] {desc}") + + +def fail_(desc): + global FAIL + FAIL += 1 + print(f" [FAIL] {desc}") + + +def check(desc, condition): + if condition: + pass_(desc) + else: + fail_(desc) + + + +# --- INI helpers --- + +def ini_set(key, value): + ini = ini_path() + txt = ini.read_text() + new_txt, n = re.subn(rf"^{re.escape(key)}:.*$", f"{key}: {value}", txt, flags=re.MULTILINE) + assert n > 0, f"ini_set: key '{key}' not found in {ini}" + ini.write_text(new_txt) + + +def ini_uncomment(key): + ini = ini_path() + txt = ini.read_text() + new_txt, n = re.subn(rf"^# {re.escape(key)}:", f"{key}:", txt, flags=re.MULTILINE) + assert n > 0, f"ini_uncomment: commented key '# {key}' not found in {ini}" + ini.write_text(new_txt) + + +def ini_comment(key): + ini = ini_path() + txt = ini.read_text() + new_txt, n = re.subn(rf"^{re.escape(key)}:", f"# {key}:", txt, flags=re.MULTILINE) + assert n > 0, f"ini_comment: key '{key}' not found in {ini}" + ini.write_text(new_txt) + + +def ini_path(): + return Path(os.environ["XFTP_SERVER_CFG_PATH"]) / "file-server.ini" + + +# --- Server management --- + +def init_server(quota="10gb"): + run([XFTP_SERVER, "init", "-p", str(test_dir / "files"), "-q", quota, "--ip", "127.0.0.1"]) + ini_set("port", PORT) + fp = (Path(os.environ["XFTP_SERVER_CFG_PATH"]) / "fingerprint").read_text().strip() + return f"xftp://{fp}@127.0.0.1:{PORT}" + + +_server_log_fh = None + +def start_server(*extra_args): + global server_proc, _server_log_fh + stop_server() + log_path = test_dir / "server.log" + _server_log_fh = open(log_path, "w") + server_proc = subprocess.Popen( + [XFTP_SERVER, "start"] + list(extra_args), + stdout=_server_log_fh, + stderr=subprocess.STDOUT, + ) + time.sleep(2) + if server_proc.poll() is not None: + _server_log_fh.close() + _server_log_fh = None + log = log_path.read_text() + print(f" [ERROR] Server exited with code {server_proc.returncode}") + for line in log.strip().split("\n")[-5:]: + print(f" {line}") + return False + return True + + +def stop_server(): + global server_proc, _server_log_fh + if server_proc and server_proc.poll() is None: + server_proc.send_signal(signal.SIGTERM) + try: + server_proc.wait(timeout=5) + except subprocess.TimeoutExpired: + server_proc.kill() + server_proc.wait() + server_proc = None + if _server_log_fh: + _server_log_fh.close() + _server_log_fh = None + time.sleep(0.5) + + +def clean_test_dir(): + stop_server() + if test_dir.exists(): + shutil.rmtree(test_dir) + (test_dir / "files").mkdir(parents=True) + (test_dir / "descriptions").mkdir() + (test_dir / "received").mkdir() + + +def clean_db(): + psql(f"DROP DATABASE IF EXISTS {DB_NAME};") + psql(f"CREATE DATABASE {DB_NAME} OWNER {DB_USER};") + + +def enable_db_mode(): + ini_set("store_files", "database") + ini_uncomment("db_connection") + ini_uncomment("db_schema") + ini_uncomment("db_pool_size") + + +def disable_db_mode(): + ini_set("store_files", "memory") + ini_comment("db_connection") + ini_comment("db_schema") + ini_comment("db_pool_size") + + +# --- File operations --- + +def make_file(name, size_mb=1): + path = test_dir / name + with open(path, "wb") as f: + f.write(os.urandom(size_mb * 1024 * 1024)) + return path + + +def desc_dir(name): + return test_dir / "descriptions" / f"{name}.xftp" + + +def send_file(src, n=1): + return run([XFTP, "send", str(src), str(test_dir / "descriptions"), + "-s", srv, "-n", str(n)], check=False, timeout=60) + + +def recv_file(desc_path): + return run([XFTP, "recv", str(desc_path), str(test_dir / "received"), "-y"], + check=False, timeout=60) + + +def del_file(desc_path): + return run([XFTP, "del", str(desc_path), "-y"], check=False, timeout=30) + + +def files_match(a, b): + """Compare two files byte-for-byte. Both must exist.""" + a, b = Path(a), Path(b) + if not a.exists() or not b.exists(): + return False + return a.read_bytes() == b.read_bytes() + + +def db_import(): + return run([XFTP_SERVER, "database", "import"], input="Y\n", check=False, timeout=30) + + +def db_export(): + return run([XFTP_SERVER, "database", "export"], input="Y\n", check=False, timeout=30) + + +def create_schema(): + """Create the xftp_server schema so the server can start on a fresh DB.""" + psql(f"CREATE SCHEMA IF NOT EXISTS {DB_SCHEMA};", user=DB_USER, db=DB_NAME) + + +CONTROL_PORT = "15230" +CONTROL_PASSWORD = "testadmin" + + +def enable_control_port(): + ini = ini_path() + txt = ini.read_text() + txt, n1 = re.subn(r"^# control_port:.*$", f"control_port: {CONTROL_PORT}", txt, flags=re.MULTILINE) + txt, n2 = re.subn(r"^# control_port_admin_password:.*$", + f"control_port_admin_password: {CONTROL_PASSWORD}", txt, flags=re.MULTILINE) + assert n1 > 0, "enable_control_port: '# control_port' not found in INI" + assert n2 > 0, "enable_control_port: '# control_port_admin_password' not found in INI" + ini.write_text(txt) + + +def control_recv(s): + """Receive all available data from control port (drains buffer).""" + time.sleep(0.3) + chunks = [] + s.settimeout(0.5) + while True: + try: + data = s.recv(4096) + if not data: + break + chunks.append(data) + except socket.timeout: + break + return b"".join(chunks).decode().strip() + + +def control_send_recv(s, cmd): + """Send a command and receive the response line.""" + s.sendall(f"{cmd}\n".encode()) + return control_recv(s) + + +def control_connect(): + """Connect to control port, drain welcome banner, return socket.""" + s = socket.create_connection(("127.0.0.1", int(CONTROL_PORT)), timeout=5) + try: + control_recv(s) # drain welcome banner (2 lines) + except Exception: + s.close() + raise + return s + + +def control_cmd(cmd, *, auth=True): + """Send a command to the server control port, return the response. + If auth=True, authenticates as admin first and verifies the role.""" + s = control_connect() + try: + if auth: + auth_resp = control_send_recv(s, f"auth {CONTROL_PASSWORD}") + assert auth_resp == "Current role is CPRAdmin", \ + f"control_cmd: auth failed, got: {auth_resp!r}" + return control_send_recv(s, cmd) + finally: + try: + s.sendall(b"quit\n") + except OSError: + pass + s.close() + + +def get_recipient_ids(desc_path): + """Extract recipient IDs from a file description (.xftp file).""" + text = Path(desc_path).read_text() + ids = [] + for line in text.split("\n"): + line = line.strip() + if line.startswith("- ") and ":" in line: + # Format: - N:recipientId:privateKey:digest[:size] + parts = line[2:].split(":") + if len(parts) >= 3: + ids.append(parts[1]) + return ids + + + +# =================================================================== +# Tests +# =================================================================== + +def test_1_basic_memory(): + global srv + print("\n=== 1. Basic send/receive (memory) ===") + clean_test_dir() + srv = init_server() + assert start_server() + + src = make_file("testfile.bin", 5) + send_file(src, n=2) + + dd = desc_dir("testfile.bin") + check("1.1 rcv1.xftp created", (dd / "rcv1.xftp").exists()) + check("1.2 rcv2.xftp created", (dd / "rcv2.xftp").exists()) + check("1.3 snd.xftp.private created", (dd / "snd.xftp.private").exists()) + + recv_file(dd / "rcv1.xftp") + check("1.4 rcv1 file matches", files_match(src, test_dir / "received/testfile.bin")) + check("1.5 rcv1.xftp deleted by -y", not (dd / "rcv1.xftp").exists()) + + (test_dir / "received/testfile.bin").unlink(missing_ok=True) + recv_file(dd / "rcv2.xftp") + check("1.6 rcv2 file matches", files_match(src, test_dir / "received/testfile.bin")) + check("1.7 rcv2.xftp deleted by -y", not (dd / "rcv2.xftp").exists()) + + del_file(dd / "snd.xftp.private") + check("1.8 snd.xftp.private deleted by -y", not (dd / "snd.xftp.private").exists()) + fc = len(list((test_dir / "files").iterdir())) + check(f"1.9 server files cleaned ({fc})", fc == 0) + + stop_server() + + +def test_2_basic_postgres(): + global srv + print("\n=== 2. Basic send/receive (PostgreSQL) ===") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + # Remove store log so database mode starts cleanly + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + # Create schema so server can connect + create_schema() + ok = start_server("--confirm-migrations", "up") + check("2.1 server started", ok) + if not ok: + return + + src = make_file("testfile.bin", 5) + send_file(src, n=2) + dd = desc_dir("testfile.bin") + check("2.2 send succeeded", (dd / "rcv1.xftp").exists()) + + recv_file(dd / "rcv1.xftp") + check("2.3 recv matches", files_match(src, test_dir / "received/testfile.bin")) + + fc = db_count("files") + rc = db_count("recipients") + check(f"2.4 files in database ({fc})", fc > 0 and fc != -1) + check(f"2.5 recipients in database ({rc})", rc > 0 and rc != -1) + + del_file(dd / "snd.xftp.private") + fc_after = db_count("files") + rc_after = db_count("recipients") + check(f"2.6 all files deleted ({fc_after})", fc_after == 0) + check(f"2.7 all recipients deleted ({rc_after})", rc_after == 0) + + stop_server() + + +def test_3_migration_memory_to_pg(): + global srv + print("\n=== 3. Migration: memory -> PostgreSQL ===") + clean_test_dir() + clean_db() + srv = init_server() + assert start_server() + + srcA = make_file("fileA.bin") + send_file(srcA, n=2) + check("3.1 fileA sent", (desc_dir("fileA.bin") / "rcv1.xftp").exists()) + + srcB = make_file("fileB.bin") + send_file(srcB, n=2) + check("3.2 fileB sent", (desc_dir("fileB.bin") / "rcv1.xftp").exists()) + + # Partially receive fileB + recv_file(desc_dir("fileB.bin") / "rcv1.xftp") + check("3.3 fileB rcv1 received", files_match(srcB, test_dir / "received/fileB.bin")) + + stop_server() + + # Switch to database and import + enable_db_mode() + r = db_import() + check("3.4 import succeeded", r.returncode == 0) + + log_bak = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log.bak" + log_file = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + check("3.5 store log renamed to .bak", log_bak.exists()) + check("3.6 store log removed", not log_file.exists()) + + fc = db_count("files") + rc = db_count("recipients") + check(f"3.7 files imported ({fc})", fc > 0 and fc != -1) + check(f"3.8 recipients imported ({rc})", rc > 0 and rc != -1) + + # Start PG server, receive remaining + ok = start_server("--confirm-migrations", "up") + check("3.9 PG server started", ok) + if not ok: + return + + recv_file(desc_dir("fileA.bin") / "rcv1.xftp") + check("3.10 fileA rcv1 after migration", files_match(srcA, test_dir / "received/fileA.bin")) + + recv_file(desc_dir("fileA.bin") / "rcv2.xftp") + # rcv2 downloads to fileA_1.bin (fileA.bin already exists from rcv1) + rcv2_path = test_dir / "received" + rcv2_files = [f for f in rcv2_path.iterdir() if f.name.startswith("fileA") and f.name != "fileA.bin"] + check("3.11 fileA rcv2 after migration", len(rcv2_files) == 1 and files_match(srcA, rcv2_files[0])) + + (test_dir / "received/fileB.bin").unlink(missing_ok=True) + recv_file(desc_dir("fileB.bin") / "rcv2.xftp") + check("3.12 fileB rcv2 after migration", files_match(srcB, test_dir / "received/fileB.bin")) + + stop_server() + + +def test_4_migration_pg_to_memory(): + global srv + print("\n=== 4. Migration: PostgreSQL -> memory ===") + + r = db_export() + check("4.1 export succeeded", r.returncode == 0) + + log_file = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + check("4.2 store log created", log_file.exists()) + + disable_db_mode() + ok = start_server() + check("4.3 memory server started", ok) + if not ok: + return + + r = del_file(desc_dir("fileA.bin") / "snd.xftp.private") + check("4.4 fileA delete on memory round-trip", r.returncode == 0) + + r = del_file(desc_dir("fileB.bin") / "snd.xftp.private") + check("4.5 fileB delete on memory round-trip", r.returncode == 0) + + stop_server() + + +def test_4b_send_pg_receive_memory(): + """Send on PostgreSQL, export, receive on memory.""" + global srv + print("\n=== 4b. Send on PG, export, receive on memory ===") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + create_schema() + ok = start_server("--confirm-migrations", "up") + check("4b.1 PG server started", ok) + if not ok: + return + + srcA = make_file("pgfileA.bin") + send_file(srcA, n=2) + check("4b.2 pgfileA sent", (desc_dir("pgfileA.bin") / "rcv1.xftp").exists()) + + # Partially receive rcv1 on PG + recv_file(desc_dir("pgfileA.bin") / "rcv1.xftp") + check("4b.3 pgfileA rcv1 on PG", files_match(srcA, test_dir / "received/pgfileA.bin")) + + stop_server() + + # Export to store log + r = db_export() + check("4b.4 export succeeded", r.returncode == 0) + + # Switch to memory + disable_db_mode() + ok = start_server() + check("4b.5 memory server started", ok) + if not ok: + return + + # rcv2 should work on memory backend + (test_dir / "received/pgfileA.bin").unlink(missing_ok=True) + recv_file(desc_dir("pgfileA.bin") / "rcv2.xftp") + check("4b.6 pgfileA rcv2 on memory after export", files_match(srcA, test_dir / "received/pgfileA.bin")) + + del_file(desc_dir("pgfileA.bin") / "snd.xftp.private") + check("4b.7 delete on memory", not (desc_dir("pgfileA.bin") / "snd.xftp.private").exists()) + + stop_server() + + +def test_5_restart_persistence(): + global srv + print("\n=== 5. Restart persistence ===") + + # 5.1 Memory with store log + print(" --- 5.1 memory + store log ---") + clean_test_dir() + srv = init_server() + assert start_server() + + src = make_file("persist.bin") + send_file(src) + stop_server() + assert start_server() + + recv_file(desc_dir("persist.bin") / "rcv1.xftp") + check("5.1 recv after restart (memory+log)", files_match(src, test_dir / "received/persist.bin")) + stop_server() + + # 5.2 Memory without store log + print(" --- 5.2 memory, no log ---") + for f in (test_dir / "descriptions").iterdir(): + shutil.rmtree(f) if f.is_dir() else f.unlink() + for f in (test_dir / "received").iterdir(): + f.unlink() + ini_set("enable", "off") + assert start_server() + + src2 = make_file("persist2.bin") + send_file(src2) + stop_server() + assert start_server() + + r = recv_file(desc_dir("persist2.bin") / "rcv1.xftp") + check("5.2a recv after restart (no log) fails", r.returncode != 0) + check("5.2b error is AUTH", "AUTH" in (r.stdout + r.stderr)) + stop_server() + + # 5.3 PostgreSQL + print(" --- 5.3 PostgreSQL ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + create_schema() + ok = start_server("--confirm-migrations", "up") + check("5.3a PG server started", ok) + if not ok: + return + + src = make_file("persist.bin") + send_file(src) + stop_server() + ok = start_server("--confirm-migrations", "up") + check("5.3b PG server restarted", ok) + if not ok: + return + + recv_file(desc_dir("persist.bin") / "rcv1.xftp") + check("5.3 recv after restart (PostgreSQL)", files_match(src, test_dir / "received/persist.bin")) + stop_server() + + +def test_6_edge_cases(): + global srv + print("\n=== 6. Edge cases ===") + + # 6.1 Receive after server-side delete + print(" --- 6.1 receive after delete ---") + clean_test_dir() + srv = init_server() + assert start_server() + + src = make_file("deltest.bin") + send_file(src, n=2) + del_file(desc_dir("deltest.bin") / "snd.xftp.private") + r = recv_file(desc_dir("deltest.bin") / "rcv2.xftp") + check("6.1a recv after server delete fails", r.returncode != 0) + check("6.1b error is AUTH", "AUTH" in (r.stdout + r.stderr)) + stop_server() + + # 6.2 Multiple recipients, partial ack + print(" --- 6.2 multiple recipients ---") + clean_test_dir() + srv = init_server() + assert start_server() + + src = make_file("multi.bin") + send_file(src, n=3) + + recv_file(desc_dir("multi.bin") / "rcv1.xftp") + check("6.2a rcv1 received", files_match(src, test_dir / "received/multi.bin")) + + (test_dir / "received/multi.bin").unlink(missing_ok=True) + recv_file(desc_dir("multi.bin") / "rcv2.xftp") + check("6.2b rcv2 still works", files_match(src, test_dir / "received/multi.bin")) + + (test_dir / "received/multi.bin").unlink(missing_ok=True) + recv_file(desc_dir("multi.bin") / "rcv3.xftp") + check("6.2c rcv3 still works", files_match(src, test_dir / "received/multi.bin")) + stop_server() + + # 6.3 Database mode with existing store log should fail + # Simulates: ran server in memory mode (creating store log), then switched to database + print(" --- 6.3 database mode + existing store log ---") + clean_test_dir() + clean_db() + srv = init_server() + # Start in memory mode to create the store log file + assert start_server() + make_file("dummy63.bin") + send_file(test_dir / "dummy63.bin") + stop_server() + # Verify store log was created + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + assert store_log.exists(), "store log should exist after memory-mode run" + # Switch to database mode without importing + enable_db_mode() + create_schema() + log_file = test_dir / "server-63.log" + with open(log_file, "w") as fh: + p = subprocess.Popen( + [XFTP_SERVER, "start", "--confirm-migrations", "up"], + stdout=fh, stderr=subprocess.STDOUT, + ) + time.sleep(5) + exited = p.poll() is not None + if not exited: + p.kill() + p.wait() + log_text = log_file.read_text() + check("6.3a server exited", exited) + check("6.3b error message correct", + "store log file" in log_text and "exists but store_files is" in log_text) + + # 6.4 Database mode, no store log, schema doesn't exist (should fail) + print(" --- 6.4 database mode + no schema ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + # No schema, no store log — server should fail with "schema does not exist" + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + ok = start_server("--confirm-migrations", "up") + check("6.4a start fails without schema", not ok) + log_text = (test_dir / "server.log").read_text() if (test_dir / "server.log").exists() else "" + check("6.4b error mentions schema", "schema" in log_text and "does not exist" in log_text) + stop_server() + + # 6.5 Dual-write mode: database + db_store_log: on + # Verifies that new writes in dual-write mode land in BOTH the DB and the store log, + # so switching to memory-only (using the store log) preserves files sent in dual-write. + print(" --- 6.5 database + store log + db_store_log: on ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + ini_uncomment("db_store_log") + ini_set("db_store_log", "on") + create_schema() + # Remove store log so import isn't needed for initial start + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + ok = start_server("--confirm-migrations", "up") + check("6.5a start in dual-write mode", ok) + if not ok: + stop_server() + else: + # Send a NEW file in dual-write mode + src = make_file("dual.bin") + send_file(src, n=1) + dd = desc_dir("dual.bin") + check("6.5b send in dual-write mode", (dd / "rcv1.xftp").exists()) + + stop_server() + + # Verify store log was written (dual-write) + check("6.5c store log has entries", + store_log.exists() and store_log.stat().st_size > 0) + + # Verify DB has the file too + fc = db_count("files") + check(f"6.5d file in DB ({fc})", fc > 0 and fc != -1) + + # Now switch to memory-only using the store log — proves the log has valid data + disable_db_mode() + ini_comment("db_store_log") + ok = start_server() + check("6.5e memory server from dual-write log", ok) + if ok: + recv_file(dd / "rcv1.xftp") + check("6.5f recv on memory from dual-write log", + files_match(src, test_dir / "received/dual.bin")) + stop_server() + + # 6.6 Import to non-empty database should fail + # Use db_export to produce a real store log, then try to re-import without clearing DB. + print(" --- 6.6 import to non-empty DB ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + create_schema() + ok = start_server("--confirm-migrations", "up") + if ok: + make_file("dummy.bin") + send_file(test_dir / "dummy.bin") + stop_server() + # Export produces a real, valid store log + r = db_export() + check("6.6a export for re-import test", r.returncode == 0) + # Now try to import the valid log back into the non-empty DB + r = db_import() + check("6.6b import to non-empty DB fails", r.returncode != 0) + else: + fail_("6.6 could not start server for setup") + + # 6.7 Import with no store log file (should fail) + print(" --- 6.7 import without store log ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + r = db_import() + check("6.7 import without store log fails", r.returncode != 0) + + # 6.8 Export when store log already exists (should fail) + print(" --- 6.8 export with existing store log ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + create_schema() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + ok = start_server("--confirm-migrations", "up") + if ok: + make_file("exp.bin") + send_file(test_dir / "exp.bin") + stop_server() + # Create a log file to block export + store_log.write_text("existing\n") + r = db_export() + check("6.8 export with existing store log fails", r.returncode != 0) + else: + fail_("6.8 could not start server for setup") + + +def test_7_blocking(): + """Block files via control port, verify blocked state survives migration.""" + global srv + print("\n=== 7. File blocking via control port ===") + + # 7.1 Block a file and verify receive fails with BLOCKED + print(" --- 7.1 block file, receive fails ---") + clean_test_dir() + srv = init_server() + enable_control_port() + assert start_server() + + src = make_file("blockme.bin") + send_file(src, n=2) + dd = desc_dir("blockme.bin") + + # Get recipient IDs from the file description + rcv_ids = get_recipient_ids(dd / "rcv1.xftp") + check("7.1a got recipient IDs", len(rcv_ids) > 0) + + # Block using the first chunk's recipient ID + resp = control_cmd(f"block {rcv_ids[0]} reason=spam") + check("7.1b block command OK", resp == "ok") + + # Receive should fail with BLOCKED + r = recv_file(dd / "rcv1.xftp") + output = r.stdout + r.stderr + check("7.1c receive blocked file fails", r.returncode != 0) + check("7.1d error is BLOCKED (not AUTH)", "BLOCKED" in output and "AUTH" not in output) + + stop_server() + + # 7.2 Blocked file survives migration memory -> PG + print(" --- 7.2 blocked file survives memory->PG migration ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_control_port() + assert start_server() + + src = make_file("blockmigrate.bin") + send_file(src, n=2) + dd = desc_dir("blockmigrate.bin") + + rcv_ids = get_recipient_ids(dd / "rcv1.xftp") + resp = control_cmd(f"block {rcv_ids[0]} reason=content") + check("7.2a block before migration", resp == "ok") + + stop_server() + + # Import to PG + enable_db_mode() + r = db_import() + check("7.2b import succeeded", r.returncode == 0) + + ok = start_server("--confirm-migrations", "up") + check("7.2c PG server started", ok) + if ok: + r = recv_file(dd / "rcv1.xftp") + check("7.2d recv fails after migration", r.returncode != 0) + check("7.2e error is BLOCKED", "BLOCKED" in (r.stdout + r.stderr)) + stop_server() + + # 7.3 Blocked file survives migration PG -> memory + print(" --- 7.3 blocked file survives PG->memory export ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_control_port() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + create_schema() + ok = start_server("--confirm-migrations", "up") + check("7.3a PG server started", ok) + if not ok: + return + + src = make_file("blockpg.bin") + send_file(src, n=2) + dd = desc_dir("blockpg.bin") + + rcv_ids = get_recipient_ids(dd / "rcv1.xftp") + resp = control_cmd(f"block {rcv_ids[0]} reason=spam") + check("7.3b block on PG", resp == "ok") + + stop_server() + + # Export to memory + r = db_export() + check("7.3c export succeeded", r.returncode == 0) + + disable_db_mode() + ok = start_server() + check("7.3d memory server started", ok) + if ok: + r = recv_file(dd / "rcv1.xftp") + check("7.3e recv fails after PG->memory", r.returncode != 0) + check("7.3f error is BLOCKED", "BLOCKED" in (r.stdout + r.stderr)) + stop_server() + + +def test_8_migration_edge_cases(): + """Edge cases in migration: acked recipients, deleted files, large files, double round-trip.""" + global srv + print("\n=== 8. Migration edge cases ===") + + # 8.1 Acked recipient fails after memory->PG migration + print(" --- 8.1 acked recipient fails after memory->PG ---") + clean_test_dir() + clean_db() + srv = init_server() + assert start_server() + + src = make_file("acktest.bin") + send_file(src, n=2) + dd = desc_dir("acktest.bin") + + # Copy rcv1 descriptor before recv (recv -y deletes it) + rcv1_backup = test_dir / "rcv1_acktest.xftp" + shutil.copy2(dd / "rcv1.xftp", rcv1_backup) + + # Receive rcv1 (acknowledges it on server, deletes descriptor) + recv_file(dd / "rcv1.xftp") + check("8.1a rcv1 received", files_match(src, test_dir / "received/acktest.bin")) + + stop_server() + + # Migrate to PG + enable_db_mode() + r = db_import() + check("8.1b import succeeded", r.returncode == 0) + + ok = start_server("--confirm-migrations", "up") + check("8.1c PG server started", ok) + if ok: + # Acked rcv1 should fail — recipient was removed by ack before migration + r = recv_file(rcv1_backup) + check("8.1d acked rcv1 fails after migration", r.returncode != 0) + check("8.1e error is AUTH", "AUTH" in (r.stdout + r.stderr)) + + # Unacked rcv2 should still work + (test_dir / "received/acktest.bin").unlink(missing_ok=True) + recv_file(dd / "rcv2.xftp") + check("8.1f rcv2 works after migration", files_match(src, test_dir / "received/acktest.bin")) + stop_server() + + # 8.2 Acked recipient fails after PG->memory export + print(" --- 8.2 acked recipient fails after PG->memory ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + create_schema() + ok = start_server("--confirm-migrations", "up") + check("8.2a PG server started", ok) + if not ok: + return + + src = make_file("ackpg.bin") + send_file(src, n=2) + dd = desc_dir("ackpg.bin") + + # Copy rcv1 descriptor before recv + rcv1_backup = test_dir / "rcv1_ackpg.xftp" + shutil.copy2(dd / "rcv1.xftp", rcv1_backup) + + recv_file(dd / "rcv1.xftp") + check("8.2b rcv1 received on PG", files_match(src, test_dir / "received/ackpg.bin")) + + stop_server() + + r = db_export() + check("8.2c export succeeded", r.returncode == 0) + + disable_db_mode() + ok = start_server() + check("8.2d memory server started", ok) + if ok: + # Acked rcv1 should fail + r = recv_file(rcv1_backup) + check("8.2e acked rcv1 fails after export", r.returncode != 0) + check("8.2f error is AUTH", "AUTH" in (r.stdout + r.stderr)) + + # Unacked rcv2 should work + (test_dir / "received/ackpg.bin").unlink(missing_ok=True) + recv_file(dd / "rcv2.xftp") + check("8.2g rcv2 works on memory after export", files_match(src, test_dir / "received/ackpg.bin")) + stop_server() + + # 8.3 Deleted file absent after migration + print(" --- 8.3 deleted file absent after migration ---") + clean_test_dir() + clean_db() + srv = init_server() + assert start_server() + + # Send a file that will be deleted before migration. + # Use n=2 so we have a rcv descriptor to test post-migration (rcv1 will be + # acked by the recv below; backup rcv2 before delete so we can try to recv + # it after migration — should return AUTH because the file was deleted). + srcDel = make_file("delmigrate.bin") + send_file(srcDel, n=2) + ddDel = desc_dir("delmigrate.bin") + # Backup rcv2 descriptor BEFORE delete (del doesn't touch rcv descriptors) + rcv2_del_backup = test_dir / "rcv2_delmigrate.xftp" + shutil.copy2(ddDel / "rcv2.xftp", rcv2_del_backup) + recv_file(ddDel / "rcv1.xftp") + del_file(ddDel / "snd.xftp.private") + + # Send a positive control file that will NOT be deleted + srcKeep = make_file("keepmigrate.bin") + send_file(srcKeep, n=1) + check("8.3a keep file sent", (desc_dir("keepmigrate.bin") / "rcv1.xftp").exists()) + + stop_server() + + enable_db_mode() + r = db_import() + check("8.3b import succeeded", r.returncode == 0) + + # The kept file must be imported — proves import actually ran. + fc = db_count("files") + check(f"8.3c files imported ({fc})", fc > 0 and fc != -1) + + ok = start_server("--confirm-migrations", "up") + check("8.3d PG server started", ok) + if ok: + # Positive control: kept file is receivable after migration + recv_file(desc_dir("keepmigrate.bin") / "rcv1.xftp") + check("8.3e kept file receivable after migration", + files_match(srcKeep, test_dir / "received/keepmigrate.bin")) + + # Negative control: deleted file's rcv2 must return AUTH after migration + r = recv_file(rcv2_del_backup) + check("8.3f deleted file rcv2 fails after migration", r.returncode != 0) + check("8.3g error is AUTH (deleted file absent)", + "AUTH" in (r.stdout + r.stderr)) + stop_server() + + # 8.4 Large multi-chunk file integrity after migration + print(" --- 8.4 large file (multi-chunk) migration ---") + clean_test_dir() + clean_db() + srv = init_server() + assert start_server() + + src = make_file("largefile.bin", size_mb=20) + send_file(src, n=1) + dd = desc_dir("largefile.bin") + check("8.4a large file sent", (dd / "rcv1.xftp").exists()) + + stop_server() + + enable_db_mode() + r = db_import() + check("8.4b import succeeded", r.returncode == 0) + + ok = start_server("--confirm-migrations", "up") + check("8.4c PG server started", ok) + if ok: + recv_file(dd / "rcv1.xftp") + check("8.4d large file integrity after migration", + files_match(src, test_dir / "received/largefile.bin")) + stop_server() + + # 8.5 Double round-trip: memory -> PG -> memory, then receive + print(" --- 8.5 double round-trip migration ---") + clean_test_dir() + clean_db() + srv = init_server() + assert start_server() + + src = make_file("roundtrip.bin") + send_file(src, n=1) + dd = desc_dir("roundtrip.bin") + + stop_server() + + # memory -> PG + enable_db_mode() + r = db_import() + check("8.5a first import (memory->PG)", r.returncode == 0) + + ok = start_server("--confirm-migrations", "up") + check("8.5b PG server started", ok) + stop_server() + + # PG -> memory + r = db_export() + check("8.5c first export (PG->memory)", r.returncode == 0) + + disable_db_mode() + ok = start_server() + check("8.5d memory server started (round 1)", ok) + stop_server() + + # memory -> PG again + clean_db() + enable_db_mode() + r = db_import() + check("8.5e second import (memory->PG)", r.returncode == 0) + + ok = start_server("--confirm-migrations", "up") + check("8.5f PG server started (round 2)", ok) + if ok: + recv_file(dd / "rcv1.xftp") + check("8.5g file intact after double round-trip", + files_match(src, test_dir / "received/roundtrip.bin")) + stop_server() + + +def test_9_auth_and_access_control(): + """Basic auth, allowNewFiles, storage quota, file expiration.""" + global srv + print("\n=== 9. Auth and access control ===") + + # 9.1 AllowNewFiles=false rejects upload + print(" --- 9.1 allowNewFiles=false ---") + clean_test_dir() + srv = init_server() + ini_set("new_files", "off") + assert start_server() + + src = make_file("reject.bin") + r = send_file(src) + check("9.1 upload rejected when new_files=off", r.returncode != 0) + stop_server() + + # 9.2 Basic auth: no password → fails + print(" --- 9.2 basic auth: no password ---") + clean_test_dir() + srv = init_server() + ini_set("new_files", "on") + # Uncomment and set create_password + ini = ini_path() + txt = ini.read_text() + txt, n = re.subn(r"^# create_password:.*$", "create_password: secret123", txt, flags=re.MULTILINE) + assert n > 0, "create_password commented line not found in INI" + ini.write_text(txt) + assert start_server() + + src = make_file("authtest.bin") + r = send_file(src) + check("9.2a upload without password fails", r.returncode != 0) + check("9.2b error is AUTH", "AUTH" in (r.stdout + r.stderr)) + stop_server() + + # 9.3 Basic auth: wrong password → fails + print(" --- 9.3 basic auth: wrong password ---") + # Reinit with password in server address + clean_test_dir() + srv = init_server() + ini_set("new_files", "on") + ini = ini_path() + txt = ini.read_text() + txt, n = re.subn(r"^# create_password:.*$", "create_password: secret123", txt, flags=re.MULTILINE) + assert n > 0, "create_password commented line not found in INI" + ini.write_text(txt) + fp = (Path(os.environ["XFTP_SERVER_CFG_PATH"]) / "fingerprint").read_text().strip() + wrong_srv = f"xftp://{fp}:wrongpass@127.0.0.1:{PORT}" + assert start_server() + + src = make_file("authtest.bin") + r = run([XFTP, "send", str(src), str(test_dir / "descriptions"), + "-s", wrong_srv, "-n", "1"], check=False, timeout=30) + output = r.stdout + r.stderr + check("9.3a wrong password prints AUTH error", "PCEProtocolError AUTH" in output) + check("9.3b no descriptor created", not (desc_dir("authtest.bin") / "rcv1.xftp").exists()) + stop_server() + + # 9.4 Basic auth: correct password → succeeds + print(" --- 9.4 basic auth: correct password ---") + clean_test_dir() + srv = init_server() + ini_set("new_files", "on") + ini = ini_path() + txt = ini.read_text() + txt, n = re.subn(r"^# create_password:.*$", "create_password: secret123", txt, flags=re.MULTILINE) + assert n > 0, "create_password commented line not found in INI" + ini.write_text(txt) + fp = (Path(os.environ["XFTP_SERVER_CFG_PATH"]) / "fingerprint").read_text().strip() + correct_srv = f"xftp://{fp}:secret123@127.0.0.1:{PORT}" + assert start_server() + + src = make_file("authok.bin") + r = run([XFTP, "send", str(src), str(test_dir / "descriptions"), + "-s", correct_srv, "-n", "1"], check=False, timeout=60) + check("9.4 upload with correct password succeeds", r.returncode == 0) + stop_server() + + # 9.5 Server no auth, client sends auth → succeeds + print(" --- 9.5 no server auth, client sends auth ---") + clean_test_dir() + srv = init_server() + fp = (Path(os.environ["XFTP_SERVER_CFG_PATH"]) / "fingerprint").read_text().strip() + auth_srv = f"xftp://{fp}:anypass@127.0.0.1:{PORT}" + assert start_server() + + src = make_file("noauth.bin") + r = run([XFTP, "send", str(src), str(test_dir / "descriptions"), + "-s", auth_srv, "-n", "1"], check=False, timeout=60) + check("9.5 upload with auth to no-auth server succeeds", r.returncode == 0) + stop_server() + + # 9.6 Storage quota: exact boundary + print(" --- 9.6 storage quota boundary ---") + clean_test_dir() + # Chunk size is 128KB, so 1MB file = ~8 chunks but stored as one padded chunk per server file + # Use small quota: allow exactly 2 files of 1MB + srv = init_server(quota="3mb") + assert start_server() + + src1 = make_file("quota1.bin") + r1 = send_file(src1) + check("9.6a first file within quota", r1.returncode == 0) + + src2 = make_file("quota2.bin") + r2 = send_file(src2) + check("9.6b second file within quota", r2.returncode == 0) + + src3 = make_file("quota3.bin") + r3 = send_file(src3) + check("9.6c third file rejected", r3.returncode != 0) + check("9.6d error is QUOTA", "QUOTA" in (r3.stdout + r3.stderr)) + stop_server() + + # 9.7 File expiration + # Note: createdAt uses hour-level precision (fileTimePrecision = 3600s). + # With expire_files_hours=0, TTL=0, and the check is createdAt + TTL < now. + # Files created in the current hour have createdAt = now (rounded), so + # createdAt + 0 is NOT < now — they won't expire until the next hour. + # The check interval is hardcoded at 2 hours and not configurable via INI. + # This makes expiration untestable in a fast automated test. + # File expiration IS tested in the Haskell test suite (testFileChunkExpiration) + # with a 1-second TTL and 1-second check interval configured programmatically. + print(" --- 9.7 file expiration (skipped: requires hour boundary, tested in Haskell suite) ---") + + +def test_10_control_port_operations(): + """Control port: delete, auth failure, invalid commands, stats.""" + global srv + print("\n=== 10. Control port operations ===") + + clean_test_dir() + srv = init_server() + enable_control_port() + assert start_server() + + # 10.1 Control port: command without authentication + # Server should respond with "AUTH" when no auth has been provided + print(" --- 10.1 no auth ---") + src = make_file("ctrldel.bin") + send_file(src, n=1) + dd = desc_dir("ctrldel.bin") + rcv_ids = get_recipient_ids(dd / "rcv1.xftp") + resp = control_cmd(f"delete {rcv_ids[0]}", auth=False) + check("10.1 command without auth returns AUTH", resp == "AUTH") + + # 10.2 Control port: wrong password assigns CPRNone, commands return AUTH + print(" --- 10.2 wrong password ---") + s = control_connect() + auth_resp = control_send_recv(s, "auth wrongpassword") + check("10.2a wrong password gives CPRNone", auth_resp == "Current role is CPRNone") + cmd_resp = control_send_recv(s, f"delete {rcv_ids[0]}") + check("10.2b CPRNone command returns AUTH", cmd_resp == "AUTH") + s.sendall(b"quit\n") + s.close() + + # 10.3 Control port: stats-rts + # Without +RTS -T, returns "unsupported operation (GHC.Stats.getRTSStats: ...)" + # With +RTS -T, returns actual GHC runtime stats with "gcs" field etc. + # Either is a valid non-error response. + print(" --- 10.3 stats-rts ---") + resp = control_cmd("stats-rts") + check("10.3 stats-rts responds", + "getRTSStats" in resp or "gcs" in resp or "allocated_bytes" in resp) + + # 10.4 Control port: delete command removes file + print(" --- 10.4 control port delete ---") + resp = control_cmd(f"delete {rcv_ids[0]}") + check("10.4a delete command returns ok", resp == "ok") + + r = recv_file(dd / "rcv1.xftp") + check("10.4b recv after control port delete fails", r.returncode != 0) + check("10.4c error is AUTH", "AUTH" in (r.stdout + r.stderr)) + + # 10.5 Control port: invalid block reason + print(" --- 10.5 invalid block reason ---") + src2 = make_file("badblock.bin") + send_file(src2, n=1) + dd2 = desc_dir("badblock.bin") + rcv_ids2 = get_recipient_ids(dd2 / "rcv1.xftp") + + resp = control_cmd(f"block {rcv_ids2[0]} reason=invalid_reason") + check("10.5 invalid block reason returns error", resp.startswith("error:")) + + stop_server() + + +def test_11_blocked_file_sender_delete(): + """Blocked file: sender cannot delete it.""" + global srv + print("\n=== 11. Blocked file: sender delete attempt ===") + + clean_test_dir() + srv = init_server() + enable_control_port() + assert start_server() + + src = make_file("blockdel.bin") + send_file(src, n=1) + dd = desc_dir("blockdel.bin") + + rcv_ids = get_recipient_ids(dd / "rcv1.xftp") + resp = control_cmd(f"block {rcv_ids[0]} reason=spam") + check("11.1 block succeeded", resp == "ok") + + # Sender tries to delete — should fail with BLOCKED + r = del_file(dd / "snd.xftp.private") + check("11.2 sender delete of blocked file fails", r.returncode != 0) + check("11.3 error mentions BLOCKED", + "BLOCKED" in (r.stdout + r.stderr)) + + stop_server() + + +def test_12_recipient_cascade_and_storage(): + """Recipient cascade delete and storage accounting.""" + global srv + print("\n=== 12. Recipient cascade and storage accounting ===") + + # 12.1 Recipient cascade: delete file, all recipients gone + print(" --- 12.1 recipient cascade delete (PG) ---") + clean_test_dir() + clean_db() + srv = init_server() + enable_db_mode() + store_log = Path(os.environ["XFTP_SERVER_LOG_PATH"]) / "file-server-store.log" + store_log.unlink(missing_ok=True) + create_schema() + ok = start_server("--confirm-migrations", "up") + check("12.1a PG server started", ok) + if not ok: + return + + src = make_file("cascade.bin") + send_file(src, n=3) + + fc_before = db_count("files") + rc_before = db_count("recipients") + check(f"12.1b files before delete ({fc_before})", fc_before > 0) + check(f"12.1c recipients before delete ({rc_before})", rc_before > 0) + + del_file(desc_dir("cascade.bin") / "snd.xftp.private") + + fc_after = db_count("files") + rc_after = db_count("recipients") + check(f"12.1d files after delete ({fc_after})", fc_after == 0) + check(f"12.1e recipients cascade deleted ({rc_after})", rc_after == 0) + + # 12.2 Storage accounting: upload, delete, verify disk + print(" --- 12.2 storage accounting ---") + src1 = make_file("stor1.bin") + r1 = send_file(src1) + check("12.2a stor1 upload succeeded", r1.returncode == 0) + src2 = make_file("stor2.bin") + r2 = send_file(src2) + check("12.2b stor2 upload succeeded", r2.returncode == 0) + + files_on_disk = len(list((test_dir / "files").iterdir())) + check(f"12.2c files on disk after upload ({files_on_disk})", files_on_disk > 0) + + del_file(desc_dir("stor1.bin") / "snd.xftp.private") + del_file(desc_dir("stor2.bin") / "snd.xftp.private") + + files_on_disk = len(list((test_dir / "files").iterdir())) + check(f"12.2d files on disk after delete ({files_on_disk})", files_on_disk == 0) + + fc = db_count("files") + check(f"12.2e DB files after delete ({fc})", fc == 0) + + stop_server() + + +# =================================================================== +# Main +# =================================================================== + +if __name__ == "__main__": + XFTP_SERVER = cabal_bin("xftp-server") + XFTP = cabal_bin("xftp") + test_dir = Path.cwd() / "xftp-test" + + os.environ["XFTP_SERVER_CFG_PATH"] = str(test_dir / "etc") + os.environ["XFTP_SERVER_LOG_PATH"] = str(test_dir / "var") + + srv = "" + + print(f"XFTP server: {XFTP_SERVER}") + print(f"XFTP client: {XFTP}") + print(f"Test dir: {test_dir}") + print(f"PGHOST: {os.environ.get('PGHOST', '(default)')}") + + # Verify prerequisites + r = psql("SELECT 1;", check=False) + if r.returncode != 0: + sys.exit(f"Cannot connect to PostgreSQL as {PG_ADMIN_USER}. Is it running?") + r = psql("SELECT 1;", user=DB_USER, db="postgres", check=False) + if r.returncode != 0: + sys.exit(f"PostgreSQL user '{DB_USER}' does not exist.\n" + f"Run: psql -U {PG_ADMIN_USER} -c \"CREATE USER {DB_USER} WITH SUPERUSER;\"") + + try: + test_1_basic_memory() + test_2_basic_postgres() + test_3_migration_memory_to_pg() + test_4_migration_pg_to_memory() # continues from test_3 state + test_4b_send_pg_receive_memory() + test_5_restart_persistence() + test_6_edge_cases() + test_7_blocking() + test_8_migration_edge_cases() + test_9_auth_and_access_control() + test_10_control_port_operations() + test_11_blocked_file_sender_delete() + test_12_recipient_cascade_and_storage() + except Exception: + stop_server() + print("\n [ERROR] Unexpected exception:") + traceback.print_exc() + FAIL += 1 + finally: + stop_server() + # Cleanup + if test_dir.exists(): + shutil.rmtree(test_dir) + psql(f"DROP DATABASE IF EXISTS {DB_NAME};", check=False) + + print(f"\n{'=' * 42}") + print(f"Results: {PASS} passed, {FAIL} failed") + print(f"{'=' * 42}") + sys.exit(1 if FAIL > 0 else 0) diff --git a/xftp-web/package.json b/xftp-web/package.json index f294c9079..e4828090c 100644 --- a/xftp-web/package.json +++ b/xftp-web/package.json @@ -1,6 +1,6 @@ { "name": "@simplex-chat/xftp-web", - "version": "0.2.0", + "version": "0.3.0", "description": "XFTP file transfer protocol client for web/browser environments", "license": "AGPL-3.0-only", "repository": { diff --git a/xftp-web/web/download.ts b/xftp-web/web/download.ts index 35e09d701..da7d8a38f 100644 --- a/xftp-web/web/download.ts +++ b/xftp-web/web/download.ts @@ -1,5 +1,6 @@ import {createCryptoBackend} from './crypto-backend.js' import {createProgressRing} from './progress.js' +import {initUpload} from './upload.js' import {t} from './i18n.js' import { newXFTPAgent, closeXFTPAgent, @@ -39,6 +40,7 @@ export function initDownload(app: HTMLElement, hash: string) {