From 3edc41e86cff323b415e8a4963eb796e269e0f6e Mon Sep 17 00:00:00 2001 From: Isaac Paul Date: Mon, 11 May 2026 22:01:23 -0400 Subject: [PATCH] feat: add initial browser voice input prototype --- AGENTS.md | 33 + bun.lock | 169 + package-lock.json | 1129 +++- package.json | 1 + plan.md | 281 + tsconfig.json | 2 +- update.sh | 17 +- webterm/static/js/moonshine-js.d.ts | 35 + webterm/static/js/terminal.js | 8691 ++++++++++++++++++++++++++- webterm/static/js/terminal.ts | 317 + 10 files changed, 10660 insertions(+), 15 deletions(-) create mode 100644 AGENTS.md create mode 100644 plan.md create mode 100644 webterm/static/js/moonshine-js.d.ts diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..007148e --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,33 @@ +# Repository Guidelines + +## Project Structure & Module Organization + +`cmd/webterm/` contains the CLI entrypoint. Core server, session, Docker, replay, screenshot, and static-serving code lives in `webterm/`. Shared internal helpers live in `internal/`. Frontend terminal code is in `webterm/static/js/terminal.ts`, with the bundled output committed as `webterm/static/js/terminal.js`. Static assets such as fonts, icons, and WASM files live under `webterm/static/`. Documentation and reference media live in `docs/`. + +## Build, Test, and Development Commands + +- `make install-dev`: install Go and frontend dependencies. +- `make build`: typecheck and bundle frontend assets. +- `make build-fast`: rebuild frontend without TypeScript checking. +- `make build-go`: compile `bin/webterm`. +- `go run ./cmd/webterm`: start the server locally on `http://localhost:8080`. +- `make test`: run all Go tests. +- `make race`: run Go tests with the race detector. +- `make check`: run lint, tests, and coverage. +- `./update.sh`: rebuild, install, and restart the user service. + +## Coding Style & Naming Conventions + +Use `gofmt` for Go formatting; run `make format` before submitting Go-heavy changes. Follow existing Go naming: exported identifiers use `CamelCase`, internal helpers use `camelCase`, and tests live beside source files. TypeScript in `webterm/static/js/` uses strict mode, 2-space indentation, and direct DOM-oriented code rather than framework abstractions. Keep generated bundles in sync with source changes. + +## Testing Guidelines + +Go tests use the standard `testing` package. Name tests `TestXxx` and fuzz tests `FuzzXxx`; keep them next to the code they validate. Prefer focused unit tests for `webterm/` and `internal/` changes. Run `make test` for normal work and `make check` before opening a PR. Frontend changes should at minimum pass `bun run typecheck` via `make build`. + +## Commit & Pull Request Guidelines + +Recent history uses short imperative subjects, sometimes with prefixes such as `feat:`, `fix:`, and `deps:`. Keep commits focused, e.g. `fix: restore websocket reconnect on hidden-tab resume`. PRs should explain user-visible behavior, note test coverage, and include screenshots or recordings for terminal/UI changes. Link related issues when applicable. + +## Security & Configuration Tips + +By default, the service binds to port `8080`; review `~/.config/systemd/user/webterm.service` before exposing it remotely. Use HTTPS for browser microphone features. Static assets are embedded by default, but `WEBTERM_STATIC_PATH` can override them in development. diff --git a/bun.lock b/bun.lock index cb528b7..563b1aa 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "webterm-frontend", "dependencies": { + "@moonshine-ai/moonshine-js": "^0.1.29", "ghostty-web": "github:rcarmo/ghostty-web#fcc47d423a7fce1c02c702b6464d0b1ab89175f1", }, "devDependencies": { @@ -13,8 +14,176 @@ }, }, "packages": { + "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + + "@huggingface/jinja": ["@huggingface/jinja@0.5.9", "", {}, "sha512-uWTG+l3VJRsl7EXxYizuL3P+cCPoc3cRqbWWRcQN0FhejRfbdq0RNhCmbY/YDtnTcz9icdLYuLDjsnz4d8JMuw=="], + + "@huggingface/transformers": ["@huggingface/transformers@3.8.1", "", { "dependencies": { "@huggingface/jinja": "^0.5.3", "onnxruntime-node": "1.21.0", "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", "sharp": "^0.34.1" } }, "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA=="], + + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@moonshine-ai/moonshine-js": ["@moonshine-ai/moonshine-js@0.1.29", "", { "dependencies": { "@huggingface/transformers": "^3.3.3", "@ricky0123/vad-web": "file:../vad-moonshine/packages/web", "llama-tokenizer-js": "^1.2.2", "onnxruntime-web": "^1.22.0" } }, "sha512-Gx1B3mJcbM68ihSy/LyJEuEkGq7sYMqTb04zNdcIeidU0URVlSmXP0GyiQOTTAqDZQXlIC7k+bky+FdXk0UPlg=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.1", "", {}, "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@types/node": ["@types/node@25.7.0", "", { "dependencies": { "undici-types": "~7.21.0" } }, "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg=="], + + "boolean": ["boolean@3.2.0", "", {}, "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node": ["detect-node@2.1.0", "", {}, "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "flatbuffers": ["flatbuffers@25.9.23", "", {}, "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ=="], + "ghostty-web": ["ghostty-web@github:rcarmo/ghostty-web#fcc47d4", {}, "rcarmo-ghostty-web-fcc47d4", "sha512-tq0cFciI32VTyOXDoLHQQDndeA6jhFuZ/3TWYx3VlYDzRhYkWAtTBi6t29isYPzdiKNIWggjkn3Ve/+Qub/wBg=="], + "global-agent": ["global-agent@3.0.0", "", { "dependencies": { "boolean": "^3.0.1", "es6-error": "^4.1.1", "matcher": "^3.0.0", "roarr": "^2.15.3", "semver": "^7.3.2", "serialize-error": "^7.0.1" } }, "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "guid-typescript": ["guid-typescript@1.0.9", "", {}, "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "llama-tokenizer-js": ["llama-tokenizer-js@1.2.2", "", {}, "sha512-Wmth393dc3odWU3IzARJ3r2oIfWgw9GdJ5Gm+hGhfECNO18UHLRqEFSf511jn4E9KcQGzuuKw4Wl08pHAemLAw=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "matcher": ["matcher@3.0.0", "", { "dependencies": { "escape-string-regexp": "^4.0.0" } }, "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "onnxruntime-common": ["onnxruntime-common@1.26.0", "", {}, "sha512-qVyMR4lcWgbkc4getFV+GQijsTnbg/siteoqcDwa3sI/LxbrMSNw4ePyvCq/ymdQaRomCA7YuWmhzsswxvymdw=="], + + "onnxruntime-node": ["onnxruntime-node@1.21.0", "", { "dependencies": { "global-agent": "^3.0.0", "onnxruntime-common": "1.21.0", "tar": "^7.0.1" }, "os": [ "linux", "win32", "darwin", ] }, "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw=="], + + "onnxruntime-web": ["onnxruntime-web@1.26.0", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.26.0", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-LbRr/8zZt2xilI2smrVQGGKINo0U46i8qJp+UXyMBGfqN7KjnH1BiwCwLwyNIVV4i9CKFv7Sf4PwLKWnT8/bEA=="], + + "platform": ["platform@1.3.6", "", {}, "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="], + + "protobufjs": ["protobufjs@7.5.7", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-NGnrxS/nLKUo5nkbVQxlC71sB4hdfImdYIbFeSCidxtwATx0AHRPcANSLd0q5Bb2BkoSWo2iisQhGg5/r+ihbA=="], + + "roarr": ["roarr@2.15.4", "", { "dependencies": { "boolean": "^3.0.1", "detect-node": "^2.0.4", "globalthis": "^1.0.1", "json-stringify-safe": "^5.0.1", "semver-compare": "^1.0.0", "sprintf-js": "^1.1.2" } }, "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="], + + "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="], + + "semver-compare": ["semver-compare@1.0.0", "", {}, "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="], + + "serialize-error": ["serialize-error@7.0.1", "", { "dependencies": { "type-fest": "^0.13.1" } }, "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="], + + "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + + "sprintf-js": ["sprintf-js@1.1.3", "", {}, "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="], + + "tar": ["tar@7.5.15", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-fest": ["type-fest@0.13.1", "", {}, "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "undici-types": ["undici-types@7.21.0", "", {}, "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "@huggingface/transformers/onnxruntime-web": ["onnxruntime-web@1.22.0-dev.20250409-89f8206ba4", "", { "dependencies": { "flatbuffers": "^25.1.24", "guid-typescript": "^1.0.9", "long": "^5.2.3", "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", "platform": "^1.3.6", "protobufjs": "^7.2.4" } }, "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ=="], + + "@moonshine-ai/moonshine-js/@ricky0123/vad-web": ["@ricky0123/vad-web@file:../vad-moonshine/packages/web", {}], + + "onnxruntime-node/onnxruntime-common": ["onnxruntime-common@1.21.0", "", {}, "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ=="], + + "@huggingface/transformers/onnxruntime-web/onnxruntime-common": ["onnxruntime-common@1.22.0-dev.20250409-89f8206ba4", "", {}, "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ=="], } } diff --git a/package-lock.json b/package-lock.json index 2e6025d..179f619 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,17 +6,1123 @@ "": { "name": "webterm-frontend", "dependencies": { - "ghostty-web": "github:rcarmo/ghostty-web#1fb87bdbdaa0c1d6cf700c45f5ebe44cd606453d" + "@moonshine-ai/moonshine-js": "^0.1.29", + "ghostty-web": "github:rcarmo/ghostty-web#fcc47d423a7fce1c02c702b6464d0b1ab89175f1" }, "devDependencies": { "typescript": "^5.7.0" } }, - "node_modules/ghostty-web": { - "version": "0.4.2", - "resolved": "git+ssh://git@github.com/rcarmo/ghostty-web.git#1fb87bdbdaa0c1d6cf700c45f5ebe44cd606453d", + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@huggingface/jinja": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.9.tgz", + "integrity": "sha512-uWTG+l3VJRsl7EXxYizuL3P+cCPoc3cRqbWWRcQN0FhejRfbdq0RNhCmbY/YDtnTcz9icdLYuLDjsnz4d8JMuw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/transformers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz", + "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.5.3", + "onnxruntime-node": "1.21.0", + "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", + "sharp": "^0.34.1" + } + }, + "node_modules/@huggingface/transformers/node_modules/onnxruntime-common": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", "license": "MIT" }, + "node_modules/@huggingface/transformers/node_modules/onnxruntime-web": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@moonshine-ai/moonshine-js": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/@moonshine-ai/moonshine-js/-/moonshine-js-0.1.29.tgz", + "integrity": "sha512-Gx1B3mJcbM68ihSy/LyJEuEkGq7sYMqTb04zNdcIeidU0URVlSmXP0GyiQOTTAqDZQXlIC7k+bky+FdXk0UPlg==", + "license": "MIT", + "dependencies": { + "@huggingface/transformers": "^3.3.3", + "@ricky0123/vad-web": "file:../vad-moonshine/packages/web", + "llama-tokenizer-js": "^1.2.2", + "onnxruntime-web": "^1.22.0" + } + }, + "node_modules/@moonshine-ai/vad-moonshine/packages/web": {}, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz", + "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "license": "BSD-3-Clause" + }, + "node_modules/@ricky0123/vad-web": { + "resolved": "node_modules/@moonshine-ai/vad-moonshine/packages/web", + "link": true + }, + "node_modules/@types/node": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.7.0.tgz", + "integrity": "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.21.0" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, + "node_modules/ghostty-web": { + "version": "0.4.5", + "resolved": "git+ssh://git@github.com/rcarmo/ghostty-web.git#fcc47d423a7fce1c02c702b6464d0b1ab89175f1", + "integrity": "sha512-IuVTVvxXgpG1pmj3EDbTwxJsklZ7jnanGzv10yjg2GfcHoCx/4B37WCL6oYlb0LoM96D8t7D3VMtns2HZ5Kt5Q==", + "license": "MIT" + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/llama-tokenizer-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/llama-tokenizer-js/-/llama-tokenizer-js-1.2.2.tgz", + "integrity": "sha512-Wmth393dc3odWU3IzARJ3r2oIfWgw9GdJ5Gm+hGhfECNO18UHLRqEFSf511jn4E9KcQGzuuKw4Wl08pHAemLAw==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/onnxruntime-common": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", + "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", + "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "global-agent": "^3.0.0", + "onnxruntime-common": "1.21.0", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.26.0.tgz", + "integrity": "sha512-LbRr/8zZt2xilI2smrVQGGKINo0U46i8qJp+UXyMBGfqN7KjnH1BiwCwLwyNIVV4i9CKFv7Sf4PwLKWnT8/bEA==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.26.0", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.26.0.tgz", + "integrity": "sha512-qVyMR4lcWgbkc4getFV+GQijsTnbg/siteoqcDwa3sI/LxbrMSNw4ePyvCq/ymdQaRomCA7YuWmhzsswxvymdw==", + "license": "MIT" + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.7.tgz", + "integrity": "sha512-NGnrxS/nLKUo5nkbVQxlC71sB4hdfImdYIbFeSCidxtwATx0AHRPcANSLd0q5Bb2BkoSWo2iisQhGg5/r+ihbA==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.5", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.1", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/typescript": { "version": "5.9.3", "dev": true, @@ -28,6 +1134,21 @@ "engines": { "node": ">=14.17" } + }, + "node_modules/undici-types": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.21.0.tgz", + "integrity": "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ==", + "license": "MIT" + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } } } } diff --git a/package.json b/package.json index 570d339..d2680a7 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ }, "type": "module", "dependencies": { + "@moonshine-ai/moonshine-js": "^0.1.29", "ghostty-web": "github:rcarmo/ghostty-web#fcc47d423a7fce1c02c702b6464d0b1ab89175f1" } } diff --git a/plan.md b/plan.md new file mode 100644 index 0000000..b547c34 --- /dev/null +++ b/plan.md @@ -0,0 +1,281 @@ +# sherpa-onnx Moonshine v2 Migration Plan + +## Goal + +Replace the current `@moonshine-ai/moonshine-js` browser integration with a `sherpa-onnx` WebAssembly integration that can run Moonshine v2 locally in the browser and feed recognized text into the existing terminal stdin path. + +The target behavior is: + +- user clicks a voice button in the terminal UI +- browser captures microphone audio +- VAD segments speech locally +- Moonshine v2 recognition runs locally in WASM +- committed transcript is sent into the existing terminal input path + +## Why We Are Changing Direction + +The current MoonshineJS integration is the wrong runtime for the `medium-streaming-en` bundle we want to use. + +Current blockers: + +- `moonshine-js` expects old-style ONNX assets such as: + - `quantized/encoder_model.onnx` + - `quantized/decoder_model_merged.onnx` +- the downloaded `medium-streaming-en.zip` contains a newer Moonshine v2 layout: + - `frontend.ort` + - `encoder.ort` + - `decoder_kv.ort` + - `adapter.ort` + - `cross_kv.ort` + - `tokenizer.bin` + - `streaming_config.json` +- self-hosting those files alone does not make the existing `moonshine-js` loader compatible + +## Constraints + +- keep transcription fully local in the browser +- keep the current terminal WebSocket/stdin path unchanged if possible +- preserve the small voice button UX already added to `webterm/static/js/terminal.ts` +- prefer self-hosted assets served by `webterm/static/` +- do not depend on third-party model/CDN availability at runtime + +## Repo Touchpoints + +Expected files/modules to change: + +- `webterm/static/js/terminal.ts` +- `webterm/static/js/terminal.js` +- `package.json` +- `bun.lock` +- `package-lock.json` +- `webterm/assets_embed.go` +- `webterm/static/...` for new WASM/model assets +- `README.md` + +Possible new files: + +- `webterm/static/js/sherpa-voice.ts` or similar +- `webterm/static/js/sherpa-onnx.d.ts` +- `webterm/static/models/moonshine-v2-medium/...` +- `scripts/install-sherpa-model.sh` or similar helper + +## Proposed Architecture + +### 1. Frontend runtime + +Use `sherpa-onnx` JavaScript/WebAssembly in the browser instead of `moonshine-js`. + +Primary responsibilities: + +- initialize sherpa WASM runtime +- load self-hosted Moonshine v2 model files +- initialize VAD + ASR pipeline +- expose simple start/stop API to terminal UI +- emit committed transcript strings + +### 2. Audio flow + +Use the VAD + offline ASR flow described by sherpa-onnx: + +- microphone input +- VAD detects speech boundaries +- finalized speech segment is sent to recognizer +- recognizer returns transcript +- transcript is injected into terminal stdin + +### 3. Terminal integration + +Keep the existing terminal send path: + +- reuse `sendStdin(...)` in `WebTerminal` +- keep current voice button/status UI shell +- replace only the recognition backend + +## Implementation Phases + +### Phase 1. Remove the current MoonshineJS dependency path + +- remove `@moonshine-ai/moonshine-js` import and startup logic +- remove `moonshine-js.d.ts` +- remove MoonshineJS-specific error capture code +- keep the voice UI container, button, and status area + +Deliverable: + +- terminal still builds +- voice button exists but uses a new backend abstraction + +### Phase 2. Stage sherpa-onnx assets locally + +- choose exact sherpa-onnx JS/WASM package/version +- download/copy the required runtime assets into `webterm/static/` +- unpack `~/medium-streaming-en.zip` into repo-managed static model directory +- verify final model path layout expected by sherpa-onnx +- ensure static assets are available both in dev mode and embedded mode + +Deliverable: + +- all WASM/model files are served locally from `/static/...` + +### Phase 3. Build a thin browser voice adapter + +- create a dedicated module that wraps sherpa-onnx initialization +- define a minimal interface: + - `start()` + - `stop()` + - `isActive()` + - callbacks for: + - status updates + - final transcript + - detailed errors +- keep terminal code from depending directly on low-level sherpa objects + +Deliverable: + +- one self-contained browser voice adapter module + +### Phase 4. Wire VAD + recognition into the terminal UI + +- connect voice button click to adapter start/stop +- show clear states: + - ready + - loading runtime + - loading model + - listening + - processing speech + - final transcript sent + - detailed error +- push final transcript into `sendStdin(...)` +- decide whether to append newline automatically + +Open question: + +- should transcript be inserted as raw text only, or raw text plus `\r`? + +Deliverable: + +- end-to-end browser speech to terminal input using sherpa-onnx + +### Phase 5. Performance and caching + +- confirm browser HTTP caching behavior for WASM and model files +- add long-lived cache headers if needed for self-hosted static assets +- optionally add a service worker pre-cache later +- measure first-load vs repeat-load experience + +Deliverable: + +- repeat visits avoid re-downloading large model assets where possible + +### Phase 6. Documentation and deploy + +- document required model files and where they live +- document browser requirements +- document secure-origin requirement for microphone access +- document how to update the model bundle in future + +Deliverable: + +- README instructions for install, deploy, and troubleshooting + +## Technical Questions To Resolve Early + +1. Which sherpa-onnx JS/WASM distribution should we use? + +- npm package +- vendored release bundle +- custom copied example assets + +2. Which exact browser API shape should we target? + +- direct sherpa recognizer API +- sherpa VAD + non-streaming ASR helper +- example-derived wrapper from sherpa demos + +3. What is the expected asset layout for the Moonshine v2 medium zip? + +- whether files can be served exactly as unzipped +- whether any extra config or renamed paths are required + +4. What transcript commit behavior do we want? + +- send text only +- send text plus Enter +- configurable mode + +## Risks + +### Runtime/API mismatch + +Risk: + +- sherpa-onnx JS APIs may differ from the examples we choose + +Mitigation: + +- lock to one verified release +- copy a known working browser example shape before adapting + +### Large asset size + +Risk: + +- medium model load time may be high on first use + +Mitigation: + +- self-host locally +- keep caching aggressive +- consider fallback option for smaller model later + +### Mobile/browser compatibility + +Risk: + +- WASM + large model + microphone flow may be poor on weaker browsers + +Mitigation: + +- treat desktop Chromium/Firefox as first target +- gate unsupported browsers with explicit errors + +### Current worktree noise + +Risk: + +- repo already has ongoing voice-related frontend edits + +Mitigation: + +- isolate the new adapter into its own file/module +- keep migration incremental + +## Validation Checklist + +- `bun run typecheck` passes +- frontend bundle builds +- `./update.sh` deploys successfully +- remote HTTPS origin still permits microphone access +- first transcription works end-to-end +- repeated transcriptions do not leak memory or duplicate recognizers +- page reload reuses cached assets when possible +- detailed runtime errors are visible in UI and console + +## Recommended Execution Order + +1. Pick and verify one sherpa-onnx browser example for Moonshine v2 +2. Vendor the required WASM/runtime assets +3. Unpack and serve the local model bundle +4. Build a dedicated browser adapter module +5. Rewire the existing voice UI to that adapter +6. Validate microphone -> transcript -> terminal stdin flow +7. Improve caching and docs + +## Definition of Done + +- no `moonshine-js` dependency remains in the browser path +- voice input uses sherpa-onnx + locally hosted Moonshine v2 assets +- transcripts reach terminal stdin reliably +- remote HTTPS access works +- runtime/model errors are understandable +- setup is documented and reproducible diff --git a/tsconfig.json b/tsconfig.json index b71dcd9..18e728c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,6 @@ "isolatedModules": true, "lib": ["ES2022", "DOM", "DOM.Iterable"] }, - "include": ["webterm/static/js/**/*.ts"], + "include": ["webterm/static/js/**/*"], "exclude": ["node_modules"] } diff --git a/update.sh b/update.sh index 6da12fc..178ccfa 100755 --- a/update.sh +++ b/update.sh @@ -10,10 +10,25 @@ echo "Building Go binary..." make build-go echo "Installing binary..." -cp bin/webterm ~/go/bin/webterm +mkdir -p ~/go/bin +tmp_target=~/go/bin/webterm.new +cp bin/webterm "$tmp_target" +chmod +x "$tmp_target" +mv "$tmp_target" ~/go/bin/webterm echo "Restarting service..." systemctl --user restart webterm.service echo "Done. Status:" systemctl --user status webterm.service --no-pager + +echo +echo "Listening sockets:" +ss -ltnp | grep ':8080' || true + +echo +echo "Reachable URLs:" +echo " Local: http://127.0.0.1:8080/" +hostname -I 2>/dev/null | tr ' ' '\n' | sed '/^$/d' | while read -r ip; do + echo " LAN: http://$ip:8080/" +done diff --git a/webterm/static/js/moonshine-js.d.ts b/webterm/static/js/moonshine-js.d.ts new file mode 100644 index 0000000..b3ce9aa --- /dev/null +++ b/webterm/static/js/moonshine-js.d.ts @@ -0,0 +1,35 @@ +declare module "@moonshine-ai/moonshine-js" { + export interface TranscriberCallbacks { + onPermissionsRequested: () => unknown; + onError: (error: unknown) => unknown; + onModelLoadStarted: () => unknown; + onModelLoaded: () => unknown; + onTranscribeStarted: () => unknown; + onTranscribeStopped: () => unknown; + onTranscriptionUpdated: (text: string) => unknown; + onTranscriptionCommitted: (text: string, buffer?: AudioBuffer) => unknown; + onFrame: (probs: unknown, frame: unknown, ema: unknown) => unknown; + onSpeechStart: () => unknown; + onSpeechEnd: () => unknown; + } + + export class MicrophoneTranscriber { + constructor( + modelURL: string, + callbacks?: Partial, + useVAD?: boolean, + precision?: string + ); + isActive: boolean; + start(): Promise; + stop(): void; + } + + export const Settings: { + BASE_ASSET_PATH: { + MOONSHINE: string; + ONNX_RUNTIME: string; + SILERO_VAD: string; + }; + }; +} diff --git a/webterm/static/js/terminal.js b/webterm/static/js/terminal.js index 8aaa92a..df30a73 100644 --- a/webterm/static/js/terminal.js +++ b/webterm/static/js/terminal.js @@ -1,7 +1,7 @@ -var H0=Object.defineProperty;var L0=(j)=>j;function U0(j,$){this[j]=L0.bind(null,$)}var Y0=(j,$)=>{for(var V in $)H0(j,V,{get:$[V],enumerable:!0,configurable:!0,set:U0.bind($,V)})};var P0=(j,$)=>()=>(j&&($=j(j=0)),$);var B={};Y0(B,{default:()=>N0});var N0;var t=P0(()=>{N0={}});var r=((j)=>(j[j.CURSOR_KEY_APPLICATION=0]="CURSOR_KEY_APPLICATION",j[j.KEYPAD_KEY_APPLICATION=1]="KEYPAD_KEY_APPLICATION",j[j.IGNORE_KEYPAD_WITH_NUMLOCK=2]="IGNORE_KEYPAD_WITH_NUMLOCK",j[j.ALT_ESC_PREFIX=3]="ALT_ESC_PREFIX",j[j.MODIFY_OTHER_KEYS_STATE_2=4]="MODIFY_OTHER_KEYS_STATE_2",j[j.KITTY_KEYBOARD_FLAGS=5]="KITTY_KEYBOARD_FLAGS",j))(r||{}),g=((j)=>(j[j.RELEASE=0]="RELEASE",j[j.PRESS=1]="PRESS",j[j.REPEAT=2]="REPEAT",j))(g||{}),G=((j)=>(j[j.UNIDENTIFIED=0]="UNIDENTIFIED",j[j.GRAVE=1]="GRAVE",j[j.BACKSLASH=2]="BACKSLASH",j[j.BRACKET_LEFT=3]="BRACKET_LEFT",j[j.BRACKET_RIGHT=4]="BRACKET_RIGHT",j[j.COMMA=5]="COMMA",j[j.ZERO=6]="ZERO",j[j.ONE=7]="ONE",j[j.TWO=8]="TWO",j[j.THREE=9]="THREE",j[j.FOUR=10]="FOUR",j[j.FIVE=11]="FIVE",j[j.SIX=12]="SIX",j[j.SEVEN=13]="SEVEN",j[j.EIGHT=14]="EIGHT",j[j.NINE=15]="NINE",j[j.EQUAL=16]="EQUAL",j[j.INTL_BACKSLASH=17]="INTL_BACKSLASH",j[j.INTL_RO=18]="INTL_RO",j[j.INTL_YEN=19]="INTL_YEN",j[j.A=20]="A",j[j.B=21]="B",j[j.C=22]="C",j[j.D=23]="D",j[j.E=24]="E",j[j.F=25]="F",j[j.G=26]="G",j[j.H=27]="H",j[j.I=28]="I",j[j.J=29]="J",j[j.K=30]="K",j[j.L=31]="L",j[j.M=32]="M",j[j.N=33]="N",j[j.O=34]="O",j[j.P=35]="P",j[j.Q=36]="Q",j[j.R=37]="R",j[j.S=38]="S",j[j.T=39]="T",j[j.U=40]="U",j[j.V=41]="V",j[j.W=42]="W",j[j.X=43]="X",j[j.Y=44]="Y",j[j.Z=45]="Z",j[j.MINUS=46]="MINUS",j[j.PERIOD=47]="PERIOD",j[j.QUOTE=48]="QUOTE",j[j.SEMICOLON=49]="SEMICOLON",j[j.SLASH=50]="SLASH",j[j.ALT_LEFT=51]="ALT_LEFT",j[j.ALT_RIGHT=52]="ALT_RIGHT",j[j.BACKSPACE=53]="BACKSPACE",j[j.CAPS_LOCK=54]="CAPS_LOCK",j[j.CONTEXT_MENU=55]="CONTEXT_MENU",j[j.CONTROL_LEFT=56]="CONTROL_LEFT",j[j.CONTROL_RIGHT=57]="CONTROL_RIGHT",j[j.ENTER=58]="ENTER",j[j.META_LEFT=59]="META_LEFT",j[j.META_RIGHT=60]="META_RIGHT",j[j.SHIFT_LEFT=61]="SHIFT_LEFT",j[j.SHIFT_RIGHT=62]="SHIFT_RIGHT",j[j.SPACE=63]="SPACE",j[j.TAB=64]="TAB",j[j.CONVERT=65]="CONVERT",j[j.KANA_MODE=66]="KANA_MODE",j[j.NON_CONVERT=67]="NON_CONVERT",j[j.DELETE=68]="DELETE",j[j.END=69]="END",j[j.HELP=70]="HELP",j[j.HOME=71]="HOME",j[j.INSERT=72]="INSERT",j[j.PAGE_DOWN=73]="PAGE_DOWN",j[j.PAGE_UP=74]="PAGE_UP",j[j.DOWN=75]="DOWN",j[j.LEFT=76]="LEFT",j[j.RIGHT=77]="RIGHT",j[j.UP=78]="UP",j[j.NUM_LOCK=79]="NUM_LOCK",j[j.KP_0=80]="KP_0",j[j.KP_1=81]="KP_1",j[j.KP_2=82]="KP_2",j[j.KP_3=83]="KP_3",j[j.KP_4=84]="KP_4",j[j.KP_5=85]="KP_5",j[j.KP_6=86]="KP_6",j[j.KP_7=87]="KP_7",j[j.KP_8=88]="KP_8",j[j.KP_9=89]="KP_9",j[j.KP_PLUS=90]="KP_PLUS",j[j.KP_BACKSPACE=91]="KP_BACKSPACE",j[j.KP_CLEAR=92]="KP_CLEAR",j[j.KP_CLEAR_ENTRY=93]="KP_CLEAR_ENTRY",j[j.KP_COMMA=94]="KP_COMMA",j[j.KP_PERIOD=95]="KP_PERIOD",j[j.KP_DIVIDE=96]="KP_DIVIDE",j[j.KP_ENTER=97]="KP_ENTER",j[j.KP_EQUAL=98]="KP_EQUAL",j[j.KP_MEMORY_ADD=99]="KP_MEMORY_ADD",j[j.KP_MEMORY_CLEAR=100]="KP_MEMORY_CLEAR",j[j.KP_MEMORY_RECALL=101]="KP_MEMORY_RECALL",j[j.KP_MEMORY_STORE=102]="KP_MEMORY_STORE",j[j.KP_MEMORY_SUBTRACT=103]="KP_MEMORY_SUBTRACT",j[j.KP_MULTIPLY=104]="KP_MULTIPLY",j[j.KP_PAREN_LEFT=105]="KP_PAREN_LEFT",j[j.KP_PAREN_RIGHT=106]="KP_PAREN_RIGHT",j[j.KP_MINUS=107]="KP_MINUS",j[j.KP_SEPARATOR=108]="KP_SEPARATOR",j[j.NUMPAD_UP=109]="NUMPAD_UP",j[j.NUMPAD_DOWN=110]="NUMPAD_DOWN",j[j.NUMPAD_RIGHT=111]="NUMPAD_RIGHT",j[j.NUMPAD_LEFT=112]="NUMPAD_LEFT",j[j.NUMPAD_BEGIN=113]="NUMPAD_BEGIN",j[j.NUMPAD_HOME=114]="NUMPAD_HOME",j[j.NUMPAD_END=115]="NUMPAD_END",j[j.NUMPAD_INSERT=116]="NUMPAD_INSERT",j[j.NUMPAD_DELETE=117]="NUMPAD_DELETE",j[j.NUMPAD_PAGE_UP=118]="NUMPAD_PAGE_UP",j[j.NUMPAD_PAGE_DOWN=119]="NUMPAD_PAGE_DOWN",j[j.ESCAPE=120]="ESCAPE",j[j.F1=121]="F1",j[j.F2=122]="F2",j[j.F3=123]="F3",j[j.F4=124]="F4",j[j.F5=125]="F5",j[j.F6=126]="F6",j[j.F7=127]="F7",j[j.F8=128]="F8",j[j.F9=129]="F9",j[j.F10=130]="F10",j[j.F11=131]="F11",j[j.F12=132]="F12",j[j.F13=133]="F13",j[j.F14=134]="F14",j[j.F15=135]="F15",j[j.F16=136]="F16",j[j.F17=137]="F17",j[j.F18=138]="F18",j[j.F19=139]="F19",j[j.F20=140]="F20",j[j.F21=141]="F21",j[j.F22=142]="F22",j[j.F23=143]="F23",j[j.F24=144]="F24",j[j.F25=145]="F25",j[j.FN_LOCK=146]="FN_LOCK",j[j.PRINT_SCREEN=147]="PRINT_SCREEN",j[j.SCROLL_LOCK=148]="SCROLL_LOCK",j[j.PAUSE=149]="PAUSE",j[j.BROWSER_BACK=150]="BROWSER_BACK",j[j.BROWSER_FAVORITES=151]="BROWSER_FAVORITES",j[j.BROWSER_FORWARD=152]="BROWSER_FORWARD",j[j.BROWSER_HOME=153]="BROWSER_HOME",j[j.BROWSER_REFRESH=154]="BROWSER_REFRESH",j[j.BROWSER_SEARCH=155]="BROWSER_SEARCH",j[j.BROWSER_STOP=156]="BROWSER_STOP",j[j.EJECT=157]="EJECT",j[j.LAUNCH_APP_1=158]="LAUNCH_APP_1",j[j.LAUNCH_APP_2=159]="LAUNCH_APP_2",j[j.LAUNCH_MAIL=160]="LAUNCH_MAIL",j[j.MEDIA_PLAY_PAUSE=161]="MEDIA_PLAY_PAUSE",j[j.MEDIA_SELECT=162]="MEDIA_SELECT",j[j.MEDIA_STOP=163]="MEDIA_STOP",j[j.MEDIA_TRACK_NEXT=164]="MEDIA_TRACK_NEXT",j[j.MEDIA_TRACK_PREVIOUS=165]="MEDIA_TRACK_PREVIOUS",j[j.POWER=166]="POWER",j[j.SLEEP=167]="SLEEP",j[j.AUDIO_VOLUME_DOWN=168]="AUDIO_VOLUME_DOWN",j[j.AUDIO_VOLUME_MUTE=169]="AUDIO_VOLUME_MUTE",j[j.AUDIO_VOLUME_UP=170]="AUDIO_VOLUME_UP",j[j.WAKE_UP=171]="WAKE_UP",j[j.COPY=172]="COPY",j[j.CUT=173]="CUT",j[j.PASTE=174]="PASTE",j))(G||{}),S=((j)=>(j[j.NONE=0]="NONE",j[j.SHIFT=1]="SHIFT",j[j.CTRL=2]="CTRL",j[j.ALT=4]="ALT",j[j.SUPER=8]="SUPER",j[j.CAPSLOCK=16]="CAPSLOCK",j[j.NUMLOCK=32]="NUMLOCK",j))(S||{}),h=((j)=>(j[j.NONE=0]="NONE",j[j.PARTIAL=1]="PARTIAL",j[j.FULL=2]="FULL",j))(h||{}),Q=80,b=((j)=>(j[j.BOLD=1]="BOLD",j[j.ITALIC=2]="ITALIC",j[j.UNDERLINE=4]="UNDERLINE",j[j.STRIKETHROUGH=8]="STRIKETHROUGH",j[j.INVERSE=16]="INVERSE",j[j.INVISIBLE=32]="INVISIBLE",j[j.BLINK=64]="BLINK",j[j.FAINT=128]="FAINT",j))(b||{});class M{constructor(j){this.exports=j.exports,this.memory=this.exports.memory}createKeyEncoder(){return new A(this.exports)}createTerminal(j=80,$=24,V){return new T0(this.exports,this.memory,j,$,V)}static async load(j){if(j)return M.loadFromPath(j);let $=new URL("data:application/wasm;base64,AGFzbQEAAAABdRJgBH9/f38Bf2AFf39/f38AYAZ/f39/f38Bf2ACf38AYAJ/fwF/YAF/AGABfwF/YAN/f38AYAV/f39/fwF/YAN/f38Bf2AEf39/fwBgBn9/f39/fwBgAX8BfmAAAGAAAX9gAn9/AX5gA39+fgBgBX9+fn5+AAILAQNlbnYDbG9nAAMDyQTHBAQFAwYDBgMGAwYDBgcEAwYEBQcICQkEBwMJAwkECQkJBAMFBQMDBAcFAwYGBQQHBQAEBwUJBwYGBgYGBgYGBgUHAwMEBAQGCgUFBgkEAQoEBQUABwQEAwYFBAQGBgQJAAcBBwMDAwMHAwMHAQcDAwMDAwMHCgcDAwcFBQkGAwsLCwYDBwUDAwcDAwUHBQMDAwMGBwQKCgQKCgQEBAMDBQIHCgMHBwMHCgkHBwEKCwEDAwQKAwcEAwMHDAcJCQoECgoKAwgJAQcHCgAJCgoDBwMABwgEBQQEAwAHAwUGBwcFBQYHAwMKAQEDAwMDBAQGBgMEAwYGBQMFBQMDAwAJBAUDAwUFBAQJBwUEBgUHBAkEBAUDBAMFBgYJAAYECQcDBgUNBgcHBAQDAwQFAwcLBQUFAwQFAwMHAwcEBQYEBQQEBAQEBAQEBAQEBAQEBAQEBAQEBwUEBgQGCQQFBAQEBQUFBAQEBAQFBQQEBAQEBAQEBQUEBAQFBAUEBAQEBAQEBQUEBQQEBAUEBAQEBAUEBAkEBQQEBAQEBAQEBAMFBAQEBAQFBQQFBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBwYEBwYGBgYGBgYEAwUJCggGBgkGAAgECAYJDgUGAwYDDgUOBQEGCQkICgQBBgkGBAcGCQUHBAAECQcDBwMHCgoBBwoPBAQEBgcHAwMDBgMMBgMAEAMDAwwDBwQACQICAQwHAQAMBQcEBAQJBAkJCQQECQkJAwgACQkJAQYCAgACAgEBCgkFDhEEBQFwARYWBQMBABMGCQF/AUGAgMAACwesEk4GbWVtb3J5AgAVZ2hvc3R0eV9rZXlfZXZlbnRfbmV3AAEWZ2hvc3R0eV9rZXlfZXZlbnRfZnJlZQACHGdob3N0dHlfa2V5X2V2ZW50X3NldF9hY3Rpb24AAxxnaG9zdHR5X2tleV9ldmVudF9nZXRfYWN0aW9uAAQZZ2hvc3R0eV9rZXlfZXZlbnRfc2V0X2tleQAFGWdob3N0dHlfa2V5X2V2ZW50X2dldF9rZXkABhpnaG9zdHR5X2tleV9ldmVudF9zZXRfbW9kcwAHGmdob3N0dHlfa2V5X2V2ZW50X2dldF9tb2RzAAgjZ2hvc3R0eV9rZXlfZXZlbnRfc2V0X2NvbnN1bWVkX21vZHMACSNnaG9zdHR5X2tleV9ldmVudF9nZXRfY29uc3VtZWRfbW9kcwAKH2dob3N0dHlfa2V5X2V2ZW50X3NldF9jb21wb3NpbmcACx9naG9zdHR5X2tleV9ldmVudF9nZXRfY29tcG9zaW5nAAwaZ2hvc3R0eV9rZXlfZXZlbnRfc2V0X3V0ZjgADRpnaG9zdHR5X2tleV9ldmVudF9nZXRfdXRmOAAOKWdob3N0dHlfa2V5X2V2ZW50X3NldF91bnNoaWZ0ZWRfY29kZXBvaW50AA8pZ2hvc3R0eV9rZXlfZXZlbnRfZ2V0X3Vuc2hpZnRlZF9jb2RlcG9pbnQAEBdnaG9zdHR5X2tleV9lbmNvZGVyX25ldwARGGdob3N0dHlfa2V5X2VuY29kZXJfZnJlZQASGmdob3N0dHlfa2V5X2VuY29kZXJfc2V0b3B0ABMaZ2hvc3R0eV9rZXlfZW5jb2Rlcl9lbmNvZGUAFA9naG9zdHR5X29zY19uZXcAIRBnaG9zdHR5X29zY19mcmVlACMQZ2hvc3R0eV9vc2NfbmV4dAAlEWdob3N0dHlfb3NjX3Jlc2V0AEAPZ2hvc3R0eV9vc2NfZW5kAEQYZ2hvc3R0eV9vc2NfY29tbWFuZF90eXBlAEsYZ2hvc3R0eV9vc2NfY29tbWFuZF9kYXRhAEwVZ2hvc3R0eV9wYXN0ZV9pc19zYWZlAE0VZ2hvc3R0eV9jb2xvcl9yZ2JfZ2V0AE8PZ2hvc3R0eV9zZ3JfbmV3AFAQZ2hvc3R0eV9zZ3JfZnJlZQBREWdob3N0dHlfc2dyX3Jlc2V0AFIWZ2hvc3R0eV9zZ3Jfc2V0X3BhcmFtcwBTEGdob3N0dHlfc2dyX25leHQAVhhnaG9zdHR5X3Nncl91bmtub3duX2Z1bGwAWhtnaG9zdHR5X3Nncl91bmtub3duX3BhcnRpYWwAWxlnaG9zdHR5X3Nncl9hdHRyaWJ1dGVfdGFnAFwbZ2hvc3R0eV9zZ3JfYXR0cmlidXRlX3ZhbHVlAF0UZ2hvc3R0eV90ZXJtaW5hbF9uZXcAXiBnaG9zdHR5X3Rlcm1pbmFsX25ld193aXRoX2NvbmZpZwBfFWdob3N0dHlfdGVybWluYWxfZnJlZQCNARdnaG9zdHR5X3Rlcm1pbmFsX3Jlc2l6ZQDaARZnaG9zdHR5X3Rlcm1pbmFsX3dyaXRlAL8DG2dob3N0dHlfcmVuZGVyX3N0YXRlX3VwZGF0ZQDAAx1naG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfY29scwDDAx1naG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfcm93cwDEAyFnaG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfY3Vyc29yX3gAxQMhZ2hvc3R0eV9yZW5kZXJfc3RhdGVfZ2V0X2N1cnNvcl95AMYDJ2dob3N0dHlfcmVuZGVyX3N0YXRlX2dldF9jdXJzb3JfdmlzaWJsZQDHAyFnaG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfYmdfY29sb3IAyAMhZ2hvc3R0eV9yZW5kZXJfc3RhdGVfZ2V0X2ZnX2NvbG9yAMkDIWdob3N0dHlfcmVuZGVyX3N0YXRlX2lzX3Jvd19kaXJ0eQDKAx9naG9zdHR5X3JlbmRlcl9zdGF0ZV9tYXJrX2NsZWFuAMwDIWdob3N0dHlfcmVuZGVyX3N0YXRlX2dldF92aWV3cG9ydADNAyFnaG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfZ3JhcGhlbWUAzwMkZ2hvc3R0eV90ZXJtaW5hbF9pc19hbHRlcm5hdGVfc2NyZWVuANADI2dob3N0dHlfdGVybWluYWxfaGFzX21vdXNlX3RyYWNraW5nANEDGWdob3N0dHlfdGVybWluYWxfZ2V0X21vZGUA0gMmZ2hvc3R0eV90ZXJtaW5hbF9nZXRfc2Nyb2xsYmFja19sZW5ndGgA0wMkZ2hvc3R0eV90ZXJtaW5hbF9nZXRfc2Nyb2xsYmFja19saW5lANQDKGdob3N0dHlfdGVybWluYWxfZ2V0X3Njcm9sbGJhY2tfZ3JhcGhlbWUA1QMfZ2hvc3R0eV90ZXJtaW5hbF9pc19yb3dfd3JhcHBlZADWAyJnaG9zdHR5X3Rlcm1pbmFsX2dldF9oeXBlcmxpbmtfdXJpANcDHWdob3N0dHlfdGVybWluYWxfaGFz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rciAACECDBILQQApA5CtyIAAIQIMEQtBACkDmK3IgAAhAgwQC0EAKQPAqsiAACECDA8LQQApA8iqyIAAIQIMDgtBACkD0KrIgAAhAgwNC0EAKQPYqsiAACECDAwLQQApA+CqyIAAIQIMCwtBACkD6KrIgAAhAgwKC0EAKQPwqsiAACECDAkLQQApA/iqyIAAIQIMCAtBACkDgKvIgAAhAgwHC0EAKQOIq8iAACECDAYLQQApA6CtyIAAIQIMBQtBACkD8KzIgAAhAgwEC0EAKQOIrciAACECDAMLQQApA5CryIAAIQIMAgtBACkDqK3IgAAhAgwBC0EAKQPorMiAACECCyAAIAI3AgALGAAgACACQf///wBxQQpBACABEOiDgIAAC0MBAX8CQCAAQdyUyYAAQQEQmoCAgAAiAkH//wNxDQAgAEGctcqAACABLwEAIAFBAmotAABBEHRyEJyAgIAAIQILIAILFgAgACACQf8DcUEKQQAgARDog4CAAAsVACAAIAJBA3FBCkEAIAEQ6IOAgAALPAEBfyOAgICAAEEQayIDJICAgIAAIAMgAjoADyAAIANBD2pBASABEKOEgIAAIQIgA0EQaiSAgICAACACC8kBAgF/AX4jgICAgABB8BBrIgIkgICAgAACQAJAIAANAEGw6cmAACEADAELIAJByNTHgAA2AuwQIAIgADYC6BAgAkHoEGohAAsCQAJAIAApAgAiA6dB0BBBAkEAIANCIIinKAIAEYCAgIAAgICAgAAiAA0AQX8hAAwBCyACQQE6ABAgAiADNwMIIAJBGGogAkEIahCigICAAAJAQdAQRQ0AIAAgAkEYakHQEPwKAAALIAEgADYCAEEAIQALIAJB8BBqJICAgIAAIAALmQEBAX8jgICAgABBwABrIgIkgICAgAAgAkEIakEIaiABQQhqKAIANgIAIAJBADoABCACIAEpAgA3AwgCQEEsRQ0AIAJBFGpBAEEs/AsACyACQQA6AAMCQEE4RQ0AIAAgAkEIakE4/AoAAAsgAEEANgJAIABCADcCOCAAIAItAAQ6AEwgACACLQADOgDNECACQcAAaiSAgICAAAs9AQJ/AkAgAEUNACAAKAIAIQEgACgCBCECIAAQpICAgAAgASAAQdAQQQJBACACKAIMEYGAgIAAgICAgAALC+IBAQR/I4CAgIAAQRBrIgEkgICAgAACQCAALQBMQT9xRQ0AAkACQAJAIAAoAgxBdmoOAgEAAgsgASAAKQIANwMIIAFBCGogACgCECAAKAIYEMGAgIAADAELIABBEGogABDCgICAAAsgAEEAOgDNECAAQQA6AEwCQEE0RQ0AIABBDGpBAEE0/AsACyAAKAJAIgJFDQAgASAAKQIANwMAIAAoAgAhAyAAKAIEIQQgAiABEMOAgIAAIAMgAkEMQQJBACAEKAIMEYGAgIAAgICAgAAgAEEANgJACyABQRBqJICAgIAACwwAIAAgARCmgICAAAuvTAIFfwF+I4CAgIAAQeAQayICJICAgIAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAI8IgNB/w9JDQAgAC0ATEE/cSIDQQFHDQEMogELIAAgA0EBaiIENgI8IABBzQBqIgUgA2oiBiABOgAAIAAtAExBP3EOOQIBogEbAwQsLS4FMzQ1Njc4OQY9QUIIRglMTU5VD29wcXIQR0iiAQoLogFTVBF2B0AMXRFeXw1gDmdoaQILIAIgAzoACiACQoAQNwLAECACQcC/x4AANgK4ECACIAJBIGo2ArwQIAJBuBBqIAJBCmoQp4CAgAAiA0H//wNxRQ2eASACQbgQakGw6cmAAEE/EKiAgIAAIAIvAdAQDaABIAJBoBBqQRBqIAJBuBBqQRBqKQIANwMAIAJBoBBqQQhqIgEgAkG4EGpBCGopAgA3AwAgAiACKQK4EDcDoBACQCABIAJBCmoQp4CAgABB//8DcUUNACACQaAQ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ECEEIAIoAtQQIQEMAQsgAigCvBAhASACKALEECEECyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDBQLIAJCgBA3AsAQIAJBwL/HgAA2ArgQIAIgAkEgajYCvBACQAJAAkAgAkG4EGoQuICAgAAiA0H//wNxRQ0AIAJBuBBqQbDpyYAAQcEAEKiAgIAAIAIvAdAQDQIgAkGgEGpBEGogAkG4EGpBEGopAgA3AwAgAkGgEGpBCGoiASACQbgQakEIaikCADcDACACIAIpArgQNwOgEAJAIAEQuICAgABB//8DcUUNACACQaAQahCpgICAAAwDCyACQdQQaiACQaAQahCqgICAACACQaAQahCpgICAACACLwHcEA0CIAIoAtgQIQQgAigC1BAhAQwBCyACKAK8ECEBIAIoAsQQIQQLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMEwsgAkKAEDcCwBAgAkHAv8eAADYCuBAgAiACQSBqNgK8EAJAAkACQCACQbgQahC5gICAACIDQf//A3FFDQAgAkG4EGpBsOnJgABBwQAQqICAgAAgAi8B0BANAiACQaAQakEQaiACQbgQakEQaikCADcDACACQaAQakEIaiIBIAJBuBBqQQhqKQIANwMAIAIgAikCuBA3A6AQAkAgARC5gICAAEH//wNxRQ0AIAJBoBBqEKmAgIAADAMLIAJB1BBqIAJBoBBqEKqAgIAAIAJBoBBqEKmAgIAAIAIvAdwQDQIgAigC2BAhBCACKALUECEBDAELIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwSCyACQoAQNwLAECACQcC/x4AANgK4ECACIAJBIGo2ArwQAkACQAJAIAJBuBBqELqAgIAAIgNB//8DcUUNACACQbgQakGw6cmAAEHBABCogICAACACLwHQEA0CIAJBoBBqQRBqIAJBuBBqQRBqKQIANwMAIAJBoBBqQQhqIgEgAkG4EGpBCGopAgA3AwAgAiACKQK4EDcDoBACQCABELqAgIAAQf//A3FFDQAgAkGgEGoQqYCAgAAMAwsgAkHUEGogAkGgEGoQqoCAgAAgAkGgEGoQqYCAgAAgAi8B3BANAiACKALYECEEIAIoAtQQIQEMAQsgAigCvBAhASACKALEECEECyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDBELIAJCgBA3AsAQIAJBwL/HgAA2ArgQIAIgAkEgajYCvBACQAJAAkAgAkG4EGoQu4CAgAAiA0H//wNxRQ0AIAJBuBBqQbDpyYAAQcEAEKiAgIAAIAIvAdAQDQIgAkGgEGpBEGogAkG4EGpBEGopAgA3AwAgAkGgEGpBCGoiASACQbgQakEIaikCADcDACACIAIpArgQNwOgEAJAIAEQu4CAgABB//8DcUUNACACQaAQahCpgICAAAwDCyACQdQQaiACQaAQahCqgICAACACQaAQahCpgICAACACLwHcEA0CIAIoAtgQIQQgAigC1BAhAQwBCyACKAK8ECEBIAIoAsQQIQQLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMEAsgAkKAEDcCwBAgAkHAv8eAADYCuBAgAiACQSBqNgK8EAJAAkACQCACQbgQahC8gICAACIDQf//A3FFDQAgAkG4EGpBsOnJgABBwQAQqICAgAAgAi8B0BANAiACQaAQakEQaiACQbgQakEQaikCADcDACACQaAQakEIaiIBIAJBuBBqQQhqKQIANwMAIAIgAikCuBA3A6AQAkAgARC8gICAAEH//wNxRQ0AIAJBoBBqEKmAgIAADAMLIAJB1BBqIAJBoBBqEKqAgIAAIAJBoBBqEKmAgIAAIAIvAdwQDQIgAigC2BAhBCACKALUECEBDAELIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwPCyAAQRw6AEwMDgsgAkKAEDcCwBAgAkHAv8eAADYCuBAgAiACQSBqNgK8EAJAAkACQCACQbgQahC9gICAACIDQf//A3FFDQAgAkG4EGpBsOnJgABBwQAQqICAgAAgAi8B0BANAiACQaAQakEQaiACQbgQakEQaikCADcDACACQaAQakEIaiIBIAJBuBBqQQhqKQIANwMAIAIgAikCuBA3A6AQAkAgARC9gICAAEH//wNxRQ0AIAJBoBBqEKmAgIAADAMLIAJB1BBqIAJBoBBqEKqAgIAAIAJBoBBqEKmAgIAAIAIvAdwQDQIgAigC2BAhBCACKALUECEBDAELIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwNCyACQoAQNwLAECACQcC/x4AANgK4ECACIAJBIGo2ArwQAkACQAJAIAJBuBBqEL6AgIAAIgNB//8DcUUNACACQbgQakGw6cmAAEHBABCogICAACACLwHQEA0CIAJBoBBqQRBqIAJBuBBqQRBqKQIANwMAIAJBoBBqQQhqIgEgAkG4EGpBCGopAgA3AwAgAiACKQK4EDcDoBACQCABEL6AgIAAQf//A3FFDQAgAkGgEGoQqYCAgAAMAwsgAkHUEGogAkGgEGoQqoCAgAAgAkGgEGoQqYCAgAAgAi8B3BANAiACKALYECEEIAIoAtQQIQEMAQsgAigCvBAhASACKALEECEECyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDAwLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMCgsgAEEBOgBMDAkLIAJCgBA3AsAQIAJBwL/HgAA2ArgQIAIgAkEgajYCvBACQAJAAkAgAkG4EGoQv4CAgAAiA0H//wNxRQ0AIAJBuBBqQbDpyYAAQcIAEKiAgIAAIAIvAdAQDQIgAkGgEGpBEGogAkG4EGpBEGopAgA3AwAgAkGgEGpBCGoiASACQbgQakEIaikCADcDACACIAIpArgQNwOgEAJAIAEQv4CAgABB//8DcUUNACACQaAQahCpgICAAAwDCyACQdQQaiACQaAQahCqgICAACACQaAQahCpgICAACACLwHcEA0CIAIoAtgQIQQgAigC1BAhAQwBCyACKAK8ECEBIAIoAsQQIQQLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMCAsgAEEBOgDNECAAQQE2AgwgAEEqOgBMIAAgBDYCOCAAIABBEGo2AkQMBwsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwFCyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAA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gAAMBAsgA0EAOgA4IAMgAy0ADjoAMSADIAMtAA86ADAgBiADQRhqIANBMGoQ8oOAgAAiBUH//wNxRQ0DIAMgBTsBPiADQT5qEPODgIAADAMLIAMgBTYCTCADIAQ2AkggA0KAEDcCgBEgA0HAv8eAADYC+BAgAyADQeAAajYC/BACQAJAIANB+BBqIANByABqEPWDgIAAIgVB//8DcUUNACADQfgQakGw6cmAAEE/EKiAgIAAIAMvAZARDQQgA0HgEGpBEGogA0H4EGpBEGopAgA3AwAgA0HgEGpBCGoiBCADQfgQakEIaikCADcDACADIAMpAvgQNwPgEAJAIAQgA0HIAGoQ9YOAgABB//8DcUUNACADQeAQahCpgICAAAwFCyADQZQRaiADQeAQahCqgICAACADQeAQahCpgICAACADLwGcEQ0EIAMoApgRIQYgAygClBEhBAwBCyADKAL8ECEEIAMoAoQRIQYLIAQgBhCAgICAACAFQf//A3FFDQJBsOnJgAAgBCAGELaAgIAADAILIAQgBhCAgICAACAFQf//A3FFDQFBsOnJgAAgBCAGELaAgIAADAELIAQgBhCAgICAACAFQf//A3FFDQBBsOnJgAAgBCAGELaAgIAACyADQaARaiSAgICAAAuRAQECfwJAAkAgACgCOCAAKAI8IgFHDQBBACEBQYv2wYAAIQIMAQsgASAAQc0AaiICakF/akEAOgAAIAIgACgCOCIBaiECIAAoAjwgAUF/c2ohAQsCQCAAKAJEIAAoAkhBmLDAgABBAhCxgICAAEEBcUUNACAAKAIMQQ1HDQAgAUUNACAAIAE2AhQgACACNgIQCwv9AgEFfyOAgICAAEEQayIEJICAgIAAAkACQCABIANHDQBBASEFIAFFDQEgAEGq1arVeiABGyIGIAJBqtWq1XogAxsiB0YNAQJAIAFBEEsNAAJAIAFBBE8NACAALQAAIActAABGIAAgAUF/aiIDai0AACAHIANqLQAARnEgACABQQF2IgNqLQAAIAcgA2otAABGcSEFDAMLQQAhAyAEQQA2AgAgBCABQXxqIgU2AgQgBCABQQF2QQxxIgA2AgggBCAFIABrNgIMQQAhBQJAA0AgA0EQRg0BIAcgBCADaigCACIAaigAACAGIABqKAAAcyAFciEFIANBBGohAwwACwsgBUUhBQwC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IANBwAD8CgAACyABIAA2AgACQEHEAEUNACABQQRqIAJBGGpBxAD8CgAAC0EBIQMLIAJBoAFqJICAgIAAIAMLyRMBCn8CQCABKAIEIgIgASgCDCIDSw0AIAEgA0EBajYCDCAAQbzAx4AAQaTAx4AAIAMbIgEpAgA3AgAgAEEIaiABQQhqKQIANwIAIABBEGogAUEQaikCADcCAA8LIAEgA0EBaiIENgIMIAIgA2shBSABKAIAIgYgA0EBdGoiBy8BACEIAkAgAS8BCCABQQpqLQAAQRB0ciIJQQEgA3RxIgpB////B3FFDQACQCAIQVpqIgtBFEsNAEEBIAt0QYGIwABxDQELIAhBBEYNACAJQf///wdxIQlBASEIA0AgAyAIaiEKIAhBAWohCCAJIAp2QQFxDQALIABBAToAFCAAIAc2AgwgACACNgIIIAAgBjYCBCAAQQE2AgAgASADIAhqNgIMIAAgCCAFIAggBUkbNgIQDwsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCA48AAECAxcEBQYHCBYWFhYWFhYWFhYWCQoLDA0WDg8QFhYWFhYWFhYYERYWFhYWFhYWGRIWFhYTFhQWFhoVFgsgAEEQakEAKQK0wMeAADcCACAAQQhqQQApAqzAx4AANwIAIABBACkCpMDHgAA3AgAPCyAAQRBqQQApAuTAx4AANwIAIABBCGpBACkC3MDHgAA3AgAgAEEAKQLUwMeAADcCAA8LIABBEGpBACkC/MDHgAA3AgAgAEEIakEAKQL0wMeAADcCACAAQQApAuzAx4AANwIADwsgAEEQakEAKQKUwceAADcCACAAQQhqQQApAozBx4AANwIAIABBACkChMHHgAA3AgAPCyAAQRBqQQApAqzBx4AANwIAIABBCGpBACkCpMHHgAA3AgAgAEEAKQKcwceAADcCAA8LIABBEGpBACkCrMHHgAA3AgAgAEEIakEAKQKkwceAADcCACAAQQApApzBx4AANwIADwsgAEEQakEAKQLEwceAADcCACAAQQhqQQApArzBx4AANwIAIABBACkCtMHHgAA3AgAPCyAAQRBqQQApAtzBx4AANwIAIABBCGpBACkC1MHHgAA3AgAgAEEAKQLMwceAADcCAA8LIABBEGpBACkC9MHHgAA3AgAgAEEIakEAKQLswceAADcCACAAQQApAuTBx4AANwIADwsgAEECOgAEIABBBzYCACAAQQE6ABQPCyAAQRBqQQApAozCx4AANwIAIABBCGpBACkChMLHgAA3AgAgAEEAKQL8wceAADcCAA8LIABBEGpBACkCpMLHgAA3AgAgAEEIakEAKQKcwseAADcCACAAQQApApTCx4AANwIADwsgAEEAOgAEIABBBzYCACAAQQE6ABQPCyAAQRBqQQApArzCx4AANwIAIABBCGpBACkCtMLHgAA3AgAgAEEAKQKswseAADcCAA8LIABBEGpBACkC1MLHgAA3AgAgAEEIakEAKQLMwseAADcCACAAQQApAsTCx4AANwIADwsgAEEQakEAKQLswseAADcCACAAQQhqQQApAuTCx4AANwIAIABBACkC3MLHgAA3AgAPCyAAQRBqQQApAoTDx4AANwIAIABBCGpBACkC/MLHgAA3AgAgAEEAKQL0wseAADcCAA8LIABBEGpBACkCnMPHgAA3AgAgAEEIakEAKQKUw8eAADcCACAAQQApAozDx4AANwIADwsgAEEQakEAKQK0w8eAADcCACAAQQhqQQApAqzDx4AANwIAIABBACkCpMPHgAA3AgAPCyAAQRBqQQApAszDx4AANwIAIABBCGpBACkCxMPHgAA3AgAgAEEAKQK8w8eAADcCAA8LIABBEGpBACkC5MPHgAA3AgAgAEEIakEAKQLcw8eAADcCACAAQQApAtTDx4AANwIADwsgAEEQakEAKQL8w8eAADcCACAAQQhqQQApAvTDx4AANwIAIABBACkC7MPHgAA3AgAPCyAIQWJqQf//A3FBCEkNByAIQfj/A3FBKEYNBiAIQaZ/akH//wNxQQhJDQUgCEGcf2pB//8DcUEITw0JIABBGzYCACAAQQE6ABQgACAHLQAAQaR/ajoABA8LIApB////B3FFDQNBASEIIAlB////B3EgBHZBAXENByAAQQE6ABQgAEEHNgIAIAEgA0ECajYCDAJAIAcvAQIiAUEFSw0AIAEhCAsgACAIQQdxOgAEDwsgBUEBTQ0HAkACQCAHLwECQX5qDgQACQkBCQtBBSEIIAVBBUkNCEEEIQICQAJAIApB////B3ENAEEGIQpBCCEJDAELQQYhCkEIIQkC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AiEFCyAEQRBqJICAgIAAIAULrg8CCn8BfiOAgICAAEGwBGsiAySAgICAACACKAIAIQQgAi8BCiEFIAIvAQghBiADQQA2AqAEIANCADcDmAQgAyABKQIANwOQBEEEIQcCQAJAAkACQAJAA0AgB0UNASADQagEaiADQZAEahDngICAACADLwGsBCIIDQIgAygCqAQiCCADKAKgBDYCACADIAg2AqAEIAdBf2ohBwwACwsgA0HgA2pBCGogA0GQBGpBCGopAwA3AwAgA0HgA2pBEGogA0GQBGpBEGooAgA2AgAgAyADKQOQBDcD4AMgA0IANwOYBCADQQA2AqAEIANBACkDsOnJgAA3A5AEQQQhBwJAA0AgB0UNASADQagEaiADQZAEahDqgICAAAJAIAMvAawEIggNACADKAKoBCIIIAMoAqAENgIAIAMgCDYCoAQgB0F/aiEHDAELCyADQZAEahD7gICAACADQeADahD7gICAAAwCC0EIIQcgA0H4A2pBCGogA0GQBGpBCGopAwA3AwAgA0H4A2pBEGogA0GQBGpBEGooAgA2AgAgAyADKQOQBDcD+AMgA0EANgKgBCADQgA3A5gEIAMgASkCADcDkAQCQANAIAdFDQEgA0GoBGogA0GQBGoQ+ICAgAACQCADLwGsBCIIDQAgAygCqAQiCCADKAKgBDYCACADIAg2AqAEIAdBf2ohBwwBCwsgA0GQBGoQ+4CAgAAgA0H4A2oQ+4CAgAAgA0HgA2oQ+4CAgAAMAgsgA0HYAmpBCGoiCCADQZAEakEIaikDADcDACADQdgCakEQaiIHIANBkARqQRBqKAIANgIAIANBiANqQQhqIgkgA0HgA2pBCGopAwA3AwAgA0GIA2pBEGoiCiADQeADakEQaigCADYCACADQfACakEIaiILIANB+ANqQQhqKQMANwMAIANB8AJqQRBqIgwgA0H4A2pBEGooAgA2AgAgAyADKQOQBDcD2AIgAyADKQPgAzcDiAMgAyADKQP4AzcD8AIgAyABKQIANwOQAiADQagCaiAKKAIANgIAIANBkAJqQRBqIAkpAwA3AwAgAyADKQOIAzcDmAIgA0G8AmogDCgCADYCACADQbQCaiALKQMANwIAIAMgAykD8AI3AqwCIANB0AJqIAcoAgA2AgAgA0HIAmogCCkDADcDACADIAMpA9gCNwPAAiADQgA3A6ADIANBqANqIANBkAJqIANBoANqIAYgBRDsgICAAAJAIAMvAbQDIghFDQAgA0GQAmoQ+oCAgAAMAgsgAygCsAMhCiADKAKsAyELIAMoAqgDIQkgA0G4A2ogBiAFEPaAgIAAAkAgAy8BvAMiCEUNACADQZACahD6gICAAAwCCyADKAK4AyEMIANBwANqIANBwAJqEPeAgIAAAkAgAy8BxAMiCEUNACADQZACahD6gICAAAwCCyADKALAAyIHQQA6AAggB0EANgEEIAcgCTYCACADQdADakIANwMAIANCADcDyAMgA0HIA2ogA0GQAmogBxD8gICAACIIQf//A3FFDQIgA0HIA2ogA0GQAmoQg4GAgAAgA0GQAmoQ+oCAgAAMAQsgA0GQBGoQ+4CAgAALIAAgCDsB8AIMAQsgA0EBOgDcAyADQQA6ANsDIAMpA6ADIQ0CQEHEAEUNACADQRBqIANBkAJqQcQA/AoAAAsgA0GQAWpBCGoiCCADQcgDakEIaikDADcDACADIAMpA8gDNwOQASADIAU2AmggAyAMNgJkIAMgBDYCYCADIAo2AlwgAyALNgJYIAMgCTYCVCADQgA3AwggAyANNwMAIAMtANwDIQQgAy0A2wMhCiADQfQAaiAIKQMANwIAIAMgAykDkAE3AmwgAyAKOgCNASADIAQ6AIwBIAMgBTsBigEgAyAGOwGIASADQgA3A4ABIAMgBzYCfCADQQA6AKgBIANBADYCpAEgAyAJNgKgASADQawBaiADIANBoAFqEISBgIAAAkAgAy8BsAEiCEUNACADEIWBgIAAIAAgCDsB8AIMAQsgA0EAOgCHAiADQQA6AIYCIAMgAigCAEU6ALgBIAMoAqwBIggoAgAiBygCGCAHKAIQIgdqIAgvAQRBA3RqIgIoAgAhBSAILwEGIQYgASkCACENIANBAToAiAICQEHIAEUNACADQb0BakEBakEAQcgA/AsACyAAQQA7AfACIANBADoAtgEgA0EAOgC3AQJAQZABRQ0AIAAgA0GQAfwKAAALIAAgDTcDkAECQEEkRSIBDQAgAEGYAWpBAEEk/AsACyAAQgA3A8gBIAAgBSAHaiAGQQN0ajYCxAEgACACNgLAASAAIAg2ArwBIAAgAy0AiAI6ANABIAAgAy0AhwI6ANEBIAAgAy0AhgI6ANIBAkBByQBFDQAgAEHTAWogA0G9AWpByQD8CgAACwJAIAENACAAQZwCakEAQST8CwALIABCADcB4gIgAEHqAmpBADoAACAAQdgCakEAKQOop8iAADcDACAAQdACakEAKQOgp8iAADcDACAAQcgCakEAKQOYp8iAADcDACAAQQApA5CnyIAANwPAAiAAIAMtALgBOgDgAiAAIAMtALcBOgDhAiAAIAMtALYBOgDrAgsgA0GwBGokgICAgAALzgEBAn8jgICAgABBEGsiBSSAgICAACAFIANBH3E6AA8CQAJAQSAgAkEEaiICQQEgA3QiAyACIANLGyIDQX9qZ2siAkH//wNxQX1qIgZBDU8NACABQgEgAqyGp2pBfGogBkECdEGYvMqAAGoiAygCADYCACADIAE2AgAMAQsgAUIBQSAgA0GDgARqQRB2QX9qZ2siA61C//8Dg4anQRB0akF8aiADQf//A3FBAnRBgL3KgABqIgMoAgA2AgAgAyABNgIACyAFQRBqJICAgIAAC9wBAQF/I4CAgIAAQfAAayIDJICAgIAAAkBBzABFDQAgA0EMakHI9sGAAEHMAPwKAAALIAMgAjYCDCADIAEpAgA3A1gCQAJAAkAgAkGBBEkNACADQeQAaiADQdgAaiACQYB8ahCIgYCAACADLwFsIgINASADKAJkIQICQCADKAJoIgFFDQAgAkEAIAH8CwALIAMgATYCFCADIAI2AhALIANBDGpBCBCJgYCAACAAQQA7AUxBzABFDQEgACADQQxqQcwA/AoAAAwBCyAAIAI7AUwLIANB8ABqJICAgIAAC6ABAQN/I4CAgIAAQRBrIgIkgICAgAAgASgCBCEDIAEoAgAhBCACIAAtAAxBA3EiAToADyAAQQRqIQACQANAIAFBA3FFDQEgAiABQX9qIAFxQQNxOgAMIAAgAWhBA3FBAnRqIgEoAgAQi4GAgAAgBCABKAIAQfACQQNBACADKAIMEYGAgIAAgICAgAAgAi0ADCEBDAALCyACQRBqJICAgIAACyMAIAAoAgAgAUH4LEEDQQAgACgCBCgCDBGBgICAAICAgIAAC3cBAn8jgICAgABBEGsiAiSAgICAAAJAAkACQCABKAIQIgNFDQAgASADKAIANgIQDAELIAJBCGogARDngICAAAJAIAIvAQwiAUUNACAAIAE7AQQMAgsgAigCCCEDCyAAIAM2AgAgAEEAOwEECyACQRBqJICAgIAAC2IBAX8jgICAgABBIGsiAiSAgICAACACQeymyIAANgIQIAIgATYCDCACQRRqIAJBDGpBuAIQ6ICAgAACQCACLwEcIgENACAAIAIoAhQ2AgALIAAgATsBBCACQSBqJICAgIAAC8UBAgF/AX4jgICAgABBIGsiAySAgICAAEKAgICAECEEAkACQEEADQACQAJAIAINAEL4////DyEEDAELIAEpAgAiBKcgAkEDQQAgBEIgiKcoAgARgICAgACAgICAACIBRa1CIIYgAa2EIQQgAUUNAQsgAyACNgIUIAMgBD4CECADQQA7ARggA0EQaiECDAELIAMgBEIgiD0BDCADQQRqIQILIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgA0EgaiSAgICAAAt3AQJ/I4CAgIAAQRBrIgIkgICAgAACQAJAAkAgASgCECIDRQ0AIAEgAygCADYCEAwBCyACQQhqIAEQ6oCAgAACQCACLwEMIgFFDQAgACABOwEEDAILIAIoAgghAwsgACADNgIAIABBADsBBAsgAkEQaiSAgICAAAtjAQF/I4CAgIAAQSBrIgIkgICAgAAgAkHspsiAADYCECACIAE2AgwgAkEUaiACQQxqQYCAJBDrgICAAAJAIAIvARwiAQ0AIAAgAigCFDYCAAsgACABOwEEIAJBIGokgICAgAALxQECAX8BfiOAgICAAEEgayIDJICAgIAAQoCAgIAQIQQCQAJAQQANAAJAAkAgAg0AQoCA/P8PIQQMAQsgASkCACIEpyACQRBBACAEQiCIpygCABGAgICAAICAgIAAIgFFrUIghiABrYQhBCABRQ0BCyADIAI2AhQgAyAEPgIQIANBADsBGCADQRBqIQIMAQsgAyAEQiCIPQEMIANBBGohAgsgACACKQIANwIAIABBCGogAkEIaigCADYCACADQSBqJICAgIAAC+oNASp/I4CAgIAAQcAEayIFJICAgIAAIAVBAToABiAFIAM7AQQgBUEIakHAksmAACAFQQRqEO2AgIAAAkACQCAFLwEcIgNFDQAgACADOwEMDAELQQBCAUEgIAUoAgwiBkEcbiIHQQR0QX9qZ2uthqcgBkEcSRshCCAFLwEaIgkgBS8BGCIKbEH//wNxQQN0IgsgCUEDdCIMaiINQQdyIQ4gCkEDdCEPIAUoAhAiEEEEdiERIAFBHGohEiABQQhqIRMgBUHAAmohFCAFQagCaiEVIAVBpAFqQfAAaiEWIAVBgAJqIRcgBUHsAWohGCAFQdgBaiEZIAVBvAFqIRogBSgCFCEbIAUoAgghHEEAIR1BACEeQQAhHwNAAkACQAJAAkACQCAEQf//A3EiIEUNACAFQSBqIBMQ5oCAgAACQCAFLwEkIgFFDQAgACABOwEMDAcLIAUoAiAhISAFQShqIBIQ6YCAgAACQCAFLwEsIgFFDQAgACABOwEMDAcLIAUoAighIiAFQTBqIBwQ7oCAgAAgBUEwakEQaiIBKAIAISMgBUHIAGogEBDvgICAACAFKAJIISQgBUHYAGogERDwgICAACAFKAJYISUgBUHoAGogGxDxgICAACAFKAJoISYgBUH4AGogBxDygICAACAFQfgAakEQaiInKAIAISggBUGQAWogCBDzgICAACAaIAUpAzA3AgAgGkEIaiAFQTBqQQhqKQMANwIAIBpBEGogASkDADcCACAZIAUpA0g3AgAgGUEIaiAFQcgAakEIaikDADcCACAFIA02ArgBIAUgCzYCtAEgBSAMNgKwASAFIAw2AqwBQQAhAyAFQQA2AqgBIAUgDiAjakF4cSIjNgLUASAFICQgI2pBA2pBfHEiJDYC6AEgBSAoICYgJSAkakEHakF4cSIlakEDakF8cSIpakEDakF8cSImIAUoApABakH//wNqQYCAfHEiKjYCpAEgGEEIaiAFQdgAakEIaikDADcCACAYIAUpA1g3AgAgF0EIaiAFQegAakEIaikDADcCACAXIAUpA2g3AgAgFkEIaiAFQZABakEIaikDADcCACAWIAUpA5ABNwIAIBVBEGogJykDADcCACAVQQhqIAVB+ABqQQhqKQMANwIAIBUgBSkDeDcCACAFICU2AvwBIAUgJjYCkAIgBSApNgKkAiAFIAk7AdICIAUgCjsB0AIgBSAbNgLMAiAFIBA2AsgCIAUgBjYCxAIgBSAcNgLAAkEAIQECQANAIAwgAUYNASAiIAFqIAwgA2qtNwMAIAMgD2ohAyABQQhqIQEMAAsLIAUgDTYCtAQgBSAiNgKwBCAFQcgDaiAFQbAEaiAaEPSAgIAAIAUoAogCICVqIQMCQCAFKAKEAiIrQQN0IgFFDQAgAyAiakH/ASAB/AsACyAFKALgASAjaiEnIAUoAowCISwCQCAFKALcASItQQN0IgFFDQAgJyAiakH/ASAB/AsACyAiICRqIgFBADYCDCABIAUoAvgBIig2AgggASAFKQLwAUIgiTcCACAFKALkASEuAkAgKEUNACABQRBqQQAgKPwLAAsgIiAmaiIBQQA2AgwgASAFKAKgAiIoNgIIIAEgBSkCmAJCIIk3AgACQCAoRQ0AIAFBEGpBACAo/AsACyAFICk2ArwEIAUgIjYCuAQgBUHYAmogBUG4BGogFUGMxceAABD1gICAACAhICRBEGo2AjggISAuICNqNgI0ICEgLTYCMCAhICc2AiwgISAsICVqNgIoICEgKzYCJCAhIAM2AiAgISAMNgIcICFBADYCGCAhICo2AhQgISAiNgIQIAVBADoA1AICQEHoAEUNACAhQTxqIAVByANqQegA/AoAAAsgISAmQRBqNgKkAQJAQfAARQ0AICFBqAFqIAVB2AJqQfAA/AoAAAsgISAJOwGuAiAhIAo7AawCICEgCTsBqgIgISAKOwGoAiAhQaACaiAUQQhqKQIANwIAICEgFCkCADcCmAIgISAFLQDUAjoAsAIgISACKQMANwMAICFCADcCCCAhICAgCSAgIAlJGyIBOwGuAgJAIB1FDQAgISAdNgIIICEhAyAdKAIMIiJFDQQgISAiNgIMICIgITYCCCAdIQMMBAsgHkUNASAhIB42AgwgISEDIB4oAggiIkUNAiAhICI2AgggIiAhNgIMIB4hAwwCCyAAIB82AgggACAdNgIEIAAgHjYCACAAQQA7AQwMBQsgIUEANgIMICEhHSAhIR4MAgsgHiAhNgIIQQAhHSADIR4MAQsgHSAhNgIMIAMhHQsgBCABayEEIAIgAikDAEIBfDcDACAfQYCAJGohHwwACwsgBUHABGokgICAgAALlQQBCn8jgICAgABB8ABrIgMkgICAgAAgAS8BEiEEIAEvARAhBQJAAkACQCACLQACDQAgBSECDAELIAIvAQAhAiADIAEoAgAQ7oCAgAAgAygCECEGIANBGGogASgCCCIHEO+AgIAAIAMoAhghCCADQShqIAdBBHYQ8ICAgAAgAygCKCEHIANBOGogASgCDBDxgICAACADKAI4IQkgA0HIAGogASgCBCIKQRxuIgsQ8oCAgAAgCSAHIAggBiAEIAVsQf//A3EgBGpBA3RqQQdqQfj///8BcWpBA2pB/P///wFxakEHakH4////AXFqQQNqQfz///8BcSEMQQAhBSADKAJYIQQCQCAKQRtNDQBCAUEgIAtBBHRBf2pna62GpyEFCyADQeAAaiAFEPOAgIAAAkAgAkEGdEHAAGoiCiAEIAxqQQNqQfz///8BcSADKAJgIgVqQf//A2pBgID8/wFxIAVrQfz///8BcSAEa0H8////AXEgCWtB+P///wFxIAdrQfz///8BcSAIa0H4////AXEgBmtBA3RBYHEiBE0NACAAQRBqQQApAtjEx4AANwIAIABBCGpBACkC0MTHgAA3AgAgAEEAKQLIxMeAADcCAAwCCyAEIApuIQQLIABBADsBFCAAIAQ7ARIgACACOwEQIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgALIANB8ABqJICAgIAAC5gBAQR/AkACQCABDQBBACECQQAhAUEAIQNBACEEQQAhBQwBC0IBQSAgAUF/amciA2utQv//A4OGpyIBuEQAAAAAAADqP6L8AyICQSRsIAFBAXRBA2pB/P///wdxIgRqIQVBf0EAIANrdEF/cyEDCyAAIAM7ARQgACABNgIEIAAgAjYCACAAIAU2AhAgACAENgIMIABBADYCCAtFAQF/IABBADYCCCAAIAFBD2oiAUEEdkE/aiICQQZ2NgIEIAAgAkEDdkH4//8fcSICNgIMIAAgAiABQQR0QYB+cWo2AgALSgEBfyAAIAE2AgwgACABQRNqIgJB/P///wFxQXBqNgIEIAAgAiABQQJ0aiICQfz///8HcUFwajYCCCAAIAIgAUEDdGpBfHE2AgALRQEBfyAAQQA2AgggACABQR9qIgFBBXZBP2oiAkEGdjYCBCAAIAJBA3ZB+P//D3EiAjYCDCAAIAIgAUEFdEGAeHFqNgIAC5gBAQR/AkACQCABDQBBACECQQAhAUEAIQNBACEEQQAhBQwBC0IBQSAgAUF/amciA2utQv//A4OGpyIBuEQAAAAAAADqP6L8AyICQRxsIAFBAXRBA2pB/P///wdxIgRqIQVBf0EAIANrdEF/cyEDCyAAIAM7ARQgACABNgIEIAAgAjYCACAAIAU2AhAgACAENgIMIABBADYCCAtCAQF/IAAgATYCDCAAIAFBE2pBfHEiAkFwajYCBCAAIAIgAUECdGoiAkFwajYCCCAAIAFBAXQgAmpBA2pBfHE2AgAL5QECAX4EfyACKAIIIAEpAgAiA0IgiKciBGohBSACKAIMIQYCQCACKAIEQQF0IgdFDQAgBSADp2pBACAH/AsACyACKAIAQSRsIQcgBiAEaiIEIAEoAgBqIQECQANAIAdFDQECQEEkRQ0AIAFBgJLJgABBJPwKAAALIAdBXGohByABQSRqIQEMAAsLIAAgBDYCBCAAIAU2AgAgAEEANgIIIAAgAikCADcCDCAAQRRqIAJBCGopAgA3AgAgAEEcaiACQRBqKQIANwIAAkBBwgBFDQAgAEEkakEAQcIA/AsACyAAQQE7AWYLmgICAX4EfyACKAIIIAEpAgAiBEIgiKciBWohBiACKAIMIQcCQCACKAIEQQF0IghFDQAgBiAEp2pBACAI/AsACyACKAIAQRxsIQggByAFaiIFIAEoAgBqIQECQANAIAhFDQEgAUEYakEAKAK8ksmAADYCACABQRBqQQApArSSyYAANwIAIAFBCGpBACkCrJLJgAA3AgAgAUEAKQKkksmAADcCACAIQWRqIQggAUEcaiEBDAALCyAAIAU2AgQgACAGNgIAIABBADYCCCAAIAIpAgA3AgwgACADKQIANwIkIABBFGogAkEIaikCADcCACAAQRxqIAJBEGopAgA3AgACQEHCAEUNACAAQSxqQQBBwgD8CwALIABBATsBbguwAQECfyOAgICAAEEgayIDJICAgIAAIANBAToABiADIAE7AQQgA0EIakHAksmAACADQQRqEO2AgIAAAkACQCADLwEcIgFFDQAgACABOwEEDAELQYCAyAAhAQJAIAMvARoiBCACQf//A3FPDQACQCAEDQAgAEEZOwEEDAILIAJBf2pB//8DcSAEbkGAgCRsQYCAyABqIQELIAAgATYCACAAQQA7AQQLIANBIGokgICAgAALdwECfyOAgICAAEEQayICJICAgIAAAkACQAJAIAEoAhAiA0UNACABIAMoAgA2AhAMAQsgAkEIaiABEPiAgIAAAkAgAi8BDCIBRQ0AIAAgATsBBAwCCyACKAIIIQMLIAAgAzYCACAAQQA7AQQLIAJBEGokgICAgAALYQEBfyOAgICAAEEgayICJICAgIAAIAJB7KbIgAA2AhAgAiABNgIM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hCEDDCYLIANCfYNCAkIAIAJBAXEbhCEDDCULIANCd4NCCEIAIAJBAXEbhCEDDCQLIANCb4NCEEIAIAJBAXEbhCEDDCMLIANCX4NCIEIAIAJBAXEbhCEDDCILIANCv3+DQsAAQgAgAkEBcRuEIQMMIQsgA0L/foNCgAFCACACQQFxG4QhAwwgCyADQv99g0KAAkIAIAJBAXEbhCEDDB8LIANC/3uDQoAEQgAgAkEBcRuEIQMMHgsgA0L/d4NCgAhCACACQQFxG4QhAwwdCyADQv9vg0KAEEIAIAJBAXEbhCEDDBwLIANC/1+DQoAgQgAgAkEBcRuEIQMMGwsgA0L/v3+DQoDAAEIAIAJBAXEbhCEDDBoLIANC//9+g0KAgAFCACACQQFxG4QhAwwZCyADQv//fYNCgIACQgAgAkEBcRuEIQMMGAsgA0L//3uDQoCABEIAIAJBAXEbhCEDDBcLIANC//93g0KAgAhCACACQQFxG4QhAwwWCyADQv//b4NCgIAQQgAgAkEBcRuEIQMMFQsgA0L//1+DQoCAIEIAIAJBAXEbhCEDDBQLIANC//+/f4NCgIDAAEIAIAJBAXEbhCEDDBMLIANC////foNCgICAAUIAIAJBAXEbhCEDDBILIANC////fYNCgICAAkIAIAJBAXEbhCEDDBELIANC////e4NCgICABEIAIAJBAXEbhCEDDBALIANC////d4NCgICACEIAIAJBAXEbhCEDDA8LIANC////b4NCgICAEEIAIAJBAXEbhCEDDA4LIANC////X4NCgICAIEIAIAJBAXEbhCEDDA0LIANC////v3+DQoCAgMAAQgAgAkEBcRuEIQMMDAsgA0L/////foNCgICAgAFCACACQQFxG4QhAwwLCyADQv////99g0KAgICAAkIAIAJBAXEbhCEDDAoLIANC/////3uDQoCAgIAEQgAgAkEBcRuEIQMMCQsgA0L/////d4NCgICAgAhCACACQQFxG4QhAwwICyADQv////9vg0KAgICAEEIAIAJBAXEbhCEDDAcLIANC/////1+DQoCAgIAgQgAgAkEBcRuEIQMMBgsgA0L/////v3+DQoCAgIDAAEIAIAJBAXEbhCEDDAULIANC//////9+g0KAgICAgAFCACACQQFxG4QhAwwECyADQv//////fYNCgICAgIACQgAgAkEBcRuEIQMMAwsgA0L//////3uDQoCAgICABEIAIAJBAXEbhCEDDAILIANC//////93g0KAgICAgAhCACACQQFxG4QhAwwBCyADQv//////D4NCgICAgIBwQgAgAkEBcRuEIQMLIAAgAz4CACAAQQRqIANCIIg8AAAPCwALvQEBA38jgICAgABBEGsiASSAgICAAAJAIABFDQAgASAAKQKoGzcDCCAAKAKoGyECIAAoAqwbIQMgAEHUG2oQpICAgAAgAEHoLGogAUEIahDDgICAACAAQYASaiABQQhqEI6BgIAAIABBMGogAUEIahCPgYCAACAAQRhqIAFBCGoQ5ICAgAAgAEGEAWogAUEIahDDgICAACACIABB+CxBA0EAIAMoAgwRgYCAgACAgICAAAsgAUEQaiSAgICAAAvuAQEFfyOAgICAAEHAAGsiAiSAgICAACACQRxqIABByAhqIgMQkIGAgAAgAigCPCEEIAIoAjghBSACKAIcIQYgAkEcaiADEJCBgIAAAkAgBEUNACACKAIoQarVqtV6IAIoAjwbIQQDQCAFRQ0BIAIgBikCADcDECACIAEpAgA3AwggAkEIahD7gICAACAEIAEQkYGAgAAgBEEMaiEEIAZBCGohBiAFQX9qIQUMAAsLAkAgACgC0AgiBUUNACABKAIAIAMoAgAgBUE7bEEDQQAgASgCBCgCDBGBgICAAICAgIAACyACQcAAaiSAgICAAAs0AQF/AkAgACgCCCICRQ0AIAEoAgAgACgCBCACQQBBACABKAIEKAIMEYGAgIAAgICAgAALC5gBAQN/I4CAgIAAQTBrIgIkgICAgAAgAiABKAIENgIoIAIgASgCCCIDNgIsIAEoAgAhBEFkIQECQANAIAFFDQEgAkEMaiABQZSqyIAAaigCAEECdGogBDYCACAEIAFB+KnIgABqKAIAIANsaiEEIAFBBGohAQwACwsCQEEkRQ0AIAAgAkEMakEk/AoAAAsgAkEwaiSAgICAAAs3AQF/AkAgACgCCCICRQ0AIAEoAgAgACgCACACQSxsQQNBACABKAIEKAIMEYGAgIAAgICAgAALC80CAQZ/I4CAgIAAQTBrIgEkgICAgAAgAEGYAWohAiAAKAK8ASgCACEDAkAgAC8BzAEiBEUNACADQTxqIAMoAhAgBBCTgYCAAAtBACEEIAJB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NwMAIAUgASkCADcDEAJAIAogBTMBJiILWA0AIABBADYBAAwDCwJAIAogC1INACAFLwEoQf//A3FFDQAgBUEIaiADIAVBEGoQxYGAgABBAXFFDQAgAEEBOgACIAAgAjsBAAwDCyAKQgF8IQoMAAsLIABBADYBAAsgBUEwaiSAgICAAAvgAwEJfyOAgICAAEEgayIEJICAgIAAIARBAmogAUELai0AADoAACAEIAEvAAk7AQAgASgCECEFIAEoAgwhBiABLQAIIQcgASgCBCEIIAEoAgAhCQJAAkAgAiADRw0AIAAgBzoACCAAIAg2AgQgACAJNgIAIABBADsBFCAAIAU2AhAgACAGNgIMIAAgAUEJaiIBLwAAOwAJIABBC2ogAUECai0AADoAAAwBCyACKAIAIQogBEEIaiADQRBqIgsgAygCACAFEMCBgIAAAkAgBC8BECIBRQ0AIAAgATsBFAwBCyAEKAIIIQECQCAEKAIMIgxFDQAgASAGIApqIAz8CgAACyABIAMoAgAiBmshAQJAIAdBAXENACACKAIAIQcgBEEUaiALIAYgCBDAgYCAAAJAIAQvARwiAkUNACALIAMoAgAiAyABIANqIAUQwYGAgAAgACACOwEUDAILIAQoAhQhAgJAIAQoAhgiBkUNACACIAkgB2ogBvwKAAALQQAhByAEQQA6AAQgAiADKAIAayEJCyAAIAc6AAggACAINgIEIAAgCTYCACAAQQA7ARQgACAELwEAOwAJIAAgBTYCECAAIAE2AgwgAEELaiAEQQJqLQAAOgAACyAEQSBqJICAgIAAC+UDAQN/I4CAgIAAQTBrIgYkgICAgAAgBiAFKQIANwMIAkACQCAEQf//A3EiByABLwFuTw0AAkACQCABKAIEIAJqIgggB0EcbGoiBy8BGA0AAkAgAS8BbEUNACAAQQRqQQAvAYjFx4AAOwEAIABBACgBhMXHgAA2AQAMBAsgASACIAQgBRDCgYCAACAGIAUpAgA3AyAgBkEsaiABIAIgAyAFEKyBgIAAAkACQCAGLQAuRQ0AIAYvASwhBSAGQSBqIAMQw4GAgAAMAQsgASACIAMgBCAFEMSBgIAAIQULIAggBUH//wNxIgJBHGxqIgMgAy8BGEEBajsBGCABIAEoAghBAWo2AghBiKfIgAAhASACIARB//8DcUYNASAGQQE6ABggBiAFOwEWIAZBADsBGiAGQRZqIQEMAQsgBkEIaiADIAcQxYGAgABBAXFFDQEgBkEIaiADEMOBgIAAIABBADYBACAAQQRqQQA7AQAgByAHLwEYQQFqOwEYDAILIAAgASgBADYBACAAQQRqIAFBBGovAQA7AQAMAQsgBkEcaiABIAIgAyAFEMaBgIAAAkAgBi8BHiIBRQ0AIAAgATsBBAwBCyAAQQA7AQQgAEEBOgACIAAgBi8BHDsBAAsgBkEwaiSAgICAAAuKAwEEfyOAgICAAEEQayIFJICAgIAAAkACQAJAAkAgBEH//wNxIgYgAS8BZk8NAAJAIAEoAgQgAmoiByAGQSRsaiIGLwEgIggNAEEBIQYgAS8BZA0DIAEgAiAEEMiBgIAAIAVBDGogASACIAMQyYGAgAACQAJAIAUtAA5FDQAgBS8BDCECDAELIAEgAiADIAQQyoGAgAAhAgsgByACQf//A3EiA0EkbGoiBiAGLwEgQQFqOwEgIAEgASgCCEEBajYCCEGIp8iAACEBAkAgAyAEQf//A3FGDQAgBUEBOgACIAUgAjsBACAFIQELIAEoAQAiAUGAgPwHcSECIAFBgICAeHEhBAwCCyADIAYQlIGAgABBAXFFDQAgBiAIQQFqOwEgQQAhBEEAIQJBACEBDAELIAVBCGogASACIAMQmIGAgAAgBS8BCiIGDQFBgIAEIQJBACEEIAUvAQghAQsgAEEAOwEEIAAgAiAEciABQf//A3FyNgEADAELIAAgBjsBBAsgBUEQaiSAgICAAAuIAQEBfyAAIAAoAlwgASgCFGs2AlwCQAJAIAEoAhQiAkGAgCRLDQACQCACRQ0AIAEoAhBBACAC/AsACyABKAIQIgIgACgCPDYCACAAIAI2AjwMAQsgACgCLCABKAIQIAJBEEEAIAAoAjAoAgwRgYCAgACAgICAAAsgASAAKAIoNgIAIAAgATYCKAvAHQIYfwF+I4CAgIAAQYAJayICJICAgIAAAkACQCABKAJYIgMvAaoCIAMvAa4CIgRNDQAgAyAEQQFqOwGuAiAAQQApA4CIwoAANwIAIAEgASgCaEEBajYCaAwBCyABQdgAaiEFAkAgASgCVCIGRQ0AIAYgA0YNACABKAJcQYCAJGogASgCYCIEIAEoAmQiByAEIAdLG00NAEEAIQggBSEHA0AgBygCACIERQ0BIARBCGohByAIIAQvAa4CaiIIIAEvAYoBSQ0ACyACQQE6AAYgAiABLwGIATsBBCACQQhqQcCSyYAAIAJBBGoQ7YCAgAACQCACLwEcIgRFDQAgACAEOwEEDAILIAIvARghCSACLwEaIQogAigCDCEEIAIoAhQhCyACKAIQIQcgAkEgaiACKAIIIgwQ7oCAgAAgAigCMCENIAJBOGogBxDvgICAACACKAI4IQ4gAkHIAGogB0EEdhDwgICAACACKAJIIQ8gAkHYAGogCxDxgICAACACKAJYIRAgAkHoAGogBEEcbiIREPKAgIAAIBAgDyAOIA0gCiAJbEH//wNxQQN0IhIgCkEDdCIIaiITakEHakF4cSIUakEDakF8cSIOakEHakF4cSIPakEDakF8cSEQIAIoAnghFUEAIQ0CQCAEQRxJDQBCAUEgIBFBBHRBf2pna62GpyENCyACQYABaiANEPOAgIAAIAJBtAFqIAJBIGpBCGopAwA3AgAgAkG8AWogAkEgakEQaikDADcCACACQdABaiACQThqQQhqKQMANwIAIAIgEzYCqAEgAiASNgKkASACIAg2AqABIAIgCDYCnAEgAkEANgKYASACIBQ2AsQBIAIgDjYC2AEgAiACKQMgNwKsASACIAIpAzg3AsgBIAIgFSAQakEDakF8cSISIAIoAoABakH//wNqQYCAfHEiFTYClAEgAkHkAWogAkHIAGpBCGopAwA3AgAgAkH4AWogAkHYAGpBCGopAwA3AgAgAkGMAmogAkGAAWpBCGopAwA3AgAgAkGgAmogAkHoAGpBCGopAwA3AgAgAkGoAmogAkHoAGpBEGopAwA3AgAgAiAPNgLsASACIBI2AoACIAIgEDYClAIgAiACKQNINwLcASACIAIpA1g3AvABIAIgAikDgAE3AoQCIAIgAikDaDcCmAIgAiAKOwHCAiACIAk7AcACIAIgCzYCvAIgAiAHNgK4AiACIAQ2ArQCIAIgDDYCsAICQAJAIAYoAggiB0UNACAHIAYoAgwiBDYCDAwBCyABIAYoAgwiBDYCVAsCQAJAIARFDQAgBCAGKAIINgIIDAELIAUgBigCCDYCAAsgBigCECELAkAgBigCFCIERQ0AIAtBACAE/AsACyABIAEoAmggBi8BrgJrQQFqNgJoAkAgAS0AjQFBAkcNACAB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AUcNAAJAIAEoAggiBQ0AIAEoAgwhBQsgBEEANgEEIAQgBTYCAAsgA0EEaiEDIAJBf2ohAgwACwsgASgCDCECAkACQCABKAIIIgNFDQAgAyACNgIMDAELIAAgAjYCVAsgASgCCCEDAkACQCACRQ0AIAIgAzYCCAwBCyAAIAM2AlgLIAAgARCwgYCAAAvEAQIDfwF+I4CAgIAAQTBrIgMkgICAgAACQAJAIAIvAQQiBCABLwGIAUkNACAAQgA3AgAgAEEIakIANwIADAELIAIoAgAhBSADQQxqIAEgAi0ACBC7gYCAACADQRhqIANBDGogBRDPgYCAAAJAIAMtACgNACAAIAMpAxgiBj4CACAAQQE6AAwgACADKAIgNgIIIAAgBDsBBiAAQQRqIAZCIIg9AQAMAQsgAEIANwIAIABBCGpCADcCAAsgA0EwaiSAgICAAAs4AgF/AX4jgICAgABBEGsiASSAgICAACABIAA2AgwgAUEMahCkhICAACECIAFBEGokgICAgAAgAgukAgECfyOAgICAAEEgayIDJICAgIAAAkACQAJAAkACQAJAAkACQCACQQNxDgQGAAEBBgsgAS0AjQEOAwECAwELIABBADoACCAAQQA2AgQgACABKAJUNgIADAULIANBCGogAUEAELuBgIAAIANBCGohAQwCCyADQQA6ABwgA0EANgIYIAMgASgCVDYCFCADQRRqIQEMAQsgASgCfCEBCyAAIAEpAgA3AgAgAEEIaiABQQhqKAIANgIADAELIAFB2ABqIQIgAS8BigEhAQNAAkAgAUH//wNxIAIoAgAiAi8BrgIiBEsNACAAQQA6AAggAEEAOwEGIAAgAjYCACAAIAQgAWs7AQQMAgsgAkEIaiECIAEgBGshAQwACwsgA0EgaiSAgICAAAvLDgEYfyOAgICAAEHABGsiAySAgICAACAAKAIUIQQCQAJAAkAgAC8BGiAAKAIEIgUvAZoCQX9qQf//A3FHDQAgACgCECEGIANBCGogAUEYahDmgICAACADLwEMIgUNAiACLwEQIQcgAi8BEiEFIAMoAgghCCADQRBqIAIoAgAQ7oCAgAAgAygCICEJIANBKGogAigCCCIKEO+AgIAAIAMoAighCyADQThqIApBBHYQ8ICAgAAgAygCOCEKIANByABqIAIoAgwQ8YCAgAAgAygCSCEMIANB2ABqIAIoAgQiDUEcbiIOEPKAgIAAIAwgCiALIAkgByAFbEH//wNxQQN0IgcgBUEDdCIPaiIQakEHakF4cSIRakEDakF8cSISakEHakF4cSITakEDakF8cSELIAMoAmghCUEAIQUgDUEbTQ0BQgFBICAOQQR0QX9qZ2uthqchBQwBCyAFIAUvAZ4CQQFqOwGeAiAAIAAoAggiAkEIajYCCCAAKAIEKAIAIQcgAigCCCECQQAhBSAAQQA6ABwgAEEAOwEYIAAgAC8BGkEBajsBGiAAIAIgB2o2AgwMAQsgA0HwAGogBRDzgICAACADQaABaiADQRBqQQhqKQMANwIAIANBqAFqIANBEGpBEGopAwA3AgAgA0G8AWogA0EoakEIaikDADcCACADIBA2ApQBIAMgBzYCkAEgAyAPNgKMASADIA82AogBIANBADYChAEgAyARNgKwASADIBI2AsQBIAMgAykDEDcCmAEgAyADKQMoNwK0ASADIAkgC2pBA2pBfHEiDCADKAJwakH//wNqQYCAfHEiDTYCgAEgA0HQAWogA0E4akEIaikDADcCACADQeQBaiADQcgAakEIaikDADcCACADQfgBaiADQfAAakEIaikDADcCACADQYwCaiADQdgAakEIaikDADcCACADQZQCaiADQdgAakEQaikDADcCACADIBM2AtgBIAMgDDYC7AEgAyALNgKAAiADIAMpAzg3AsgBIAMgAykDSDcC3AEgAyADKQNwNwLwASADIAMpA1g3AoQCIANBrAJqIAJBEGooAgA2AgAgA0GkAmogAkEIaikCADcCACADIAIpAgA3ApwCIAMgASkCLDcDsAICQAJAAkAgDUGBgCRPDQAgA0G4AmogAUEsahDpgICAACADLwG8AiIFDQJBgIAkIRQgA0G4AmohAgwBCyADQcACaiADQbACaiANEOuAgIAAIAMvAcgCIgUNASADQcACaiECIAMoAsQCIRQLIANBnAJqIQ4gA0GEAmohFSADQZgBaiEWIAMvAa4CIhdBA3QhCSADLwGsAiIYQQN0IQogAigCACEHQQAhAiAPIQUCQANAIAkgAkYNASAHIAJqIAWtNwMAIAJBCGohAiAFIApqIQUMAAsLIAMgEDYCsAQgAyAHNgKsBCADQcADaiADQawEaiAWEPSAgIAAIAMoAuQBIBNqIQUCQCADKALgASIQQQN0IgJFDQAgBSAHakH/ASAC/AsACyADKAK8ASARaiEJIAMoAugBIRYCQCADKAK4ASIZQQN0IgJFDQAgCSAHakH/ASAC/AsACyAHIBJqIgJBADYCDCACIAMoAtQBIgo2AgggAiADKQLMAUIgiTcCACADKALAASEaAkAgCkUNACACQRBqQQAgCvwLAAsgByAMaiICQQA2AgwgAiADKAL8ASIKNgIIIAIgAykC9AFCIIk3AgACQCAKRQ0AIAJBEGpBACAK/AsACyADIAs2ArgEIAMgBzYCtAQgA0HQAmogA0G0BGogFUGMxceAABD1gICAACAIIBJBEGo2AjggCCAaIBFqNgI0IAggGTYCMCAIIAk2AiwgCCAWIBNqNgIoIAggEDYCJCAIIAU2AiAgCCAPNgIcIAhBADYCGCAIIA02AhQgCCAHNgIQIANBADoAzAICQEHoAEUNACAIQTxqIANBwANqQegA/AoAAAsgCCAMQRBqNgKkAQJAQfAARQ0AIAhBqAFqIANB0AJqQfAA/AoAAAsgCCAXOwGuAiAIIBg7AawCIAggFzsBqgIgCCAYOwGoAiAIQaACaiAOQQhqKQIANwIAIAggDikCADcCmAIgCCADLQDMAjoAsAIgCCABKQMANwMAIAhCADcCCCAIQQA7Aa4CIAEgASgCXCAUajYCXCABIAEpAwBCAXw3AwAgCEEBOwGuAiAIIAAoAgAiAjYCCCAIQRBqIQcCQAJAIAIoAgwiBUUNACAIIAU2AgwgBSAINgIIDAELIAhBADYCDCABIAg2AlgLIAIgCDYCDCAIKAIYIAgoAhAiAmoiCSgCACEKIAgvAa4CIQFBACEFIABBADYCGCAAIAE2AhQgACAJNgIIIAAgBzYCBCAAQQA6ABwgACAGNgIQIAAgCDYCACAAIAogAmo2AgwgA0EAOgC8BAwBCyAIIAEoAig2AgAgASAINgIoCyAAIARBAWo2AhQgA0HABGokgICAgAAgBQv/AQEIfyOAgICAAEEQayIDJICAgIAAIAAoAhQhBCAALwEaIQUgAC8BGCEGIANBBGogASAAKAIAIAIQmYGAgAACQCADLwEIIgENACADKAIEIgIoAhggAigCECIHaiIIKAIAIQkgAi8BrgIhCiAAIAggBUEDdGoiCDYCCCAAIAJBEGo2AgQgACAKNgIUIABBADYCECAAQQA2AhggAEEAOgAcIAAgAjYCACAAIAkgB2o2AgwgCCgCACEHIAIoAhAhAiAAQQA6ABwgACAGOwEYIAAgBTsBGiAAIAQ2AhQgACAHIAJqIAZBA3RqNgIMIANBADoADAsgA0EQaiSAgICAACABC+MDAwR/An4FfwJAAkACQAJAIANBwQBJDQAgAUEIaiEEQQAhBQNAIAUiBiACTw0CAkAgASAGQQN0IgVqIgcpAwAiCEJ/hXkiCVBFDQAgBkEBaiEFDAELIAQgBWohCiADIAmnIgtrIgwhDSAGQQFqIg4hBQJAA0AgDUHBAEkNAQJAIAIgBUcNACAAQgA3AgAPCyAKKQMAQn9SDQIgCkEIaiEKIAVBAWohBSANQUBqIQ0MAAsLIA0gCikDAEJ/hXqnSw0ACyAHQn9BwAAgC2siDUE/ca2GIAiFNwMAIAxBBnYhBSABIA5BA3RqIQMCQANAIAVFDQEgA0IANwMAIANBCGohAyAFQX9qIQUMAAsLIAxBP3FFDQMgCiAKKQMAQn9BACAMa0E/ca2IhTcDAAwDC0EAIQ0DQCANIAJGDQJBASEFIAEgDUEDdGoiCikDACIIIQkCQANAIAMgBUYNASAIIAVBP3GtiCAJgyEJIAVBAWohBQwACwsCQCAJQgBSDQAgDUEBaiENDAELCyAAQQE6AAQgACANQQZ0IAl6IgmncjYCACAKQn9BACADa0E/ca2IIAmGIAiFNwMADwsgAEIANwIADwsgAEIANwIADwsgAEEBOgAEIAAgBkEGdCANQf8AcXI2AgALqgEDBH8BfgN/AkAgACgCACICQXxqKAIADQBBAA8LIAJBdGohAyACQXhqKAIAIgRBf2oiBSABELqBgIAAIgancSEAIAZCOYinIQcDfwJAAkAgAiAAaiwAACIIQQBHIARBAEdxIglBAUcNACAIQX9KDQEgByAIQf8AcUcNASABIAMoAgAgAmogAEECdGooAgBHDQELIAkPCyAEQX9qIQQgAEEBaiAFcSEADAALC74BAQF/I4CAgIAAQRBrIgQkgICAgAACQAJAQQANACAEQQRqIAEoAgAgAmogASgCBCADQX9qQQV2QQFqEL6BgIAAAkAgBC0ACEUNACAAQQA7AQggACADNgIEIAAgASgCCCACaiAEKAIEQQV0ajYCAAwCCyAAQQhqQQAoAoDFx4AANgIAIABBACkC+MTHgAA3AgAMAQsgAEEIakEAKAKAxceAADYCACAAQQApAvjEx4AANwIACyAEQRBqJICAgIAAC64BACAAKAIAIAFqIAIgACgCCCABamsiAUEIdkH4//8HcWoiAEJ/QQAgA0EfakEFdiIDQcAAIAFBBXZBP3EiAWsiAiADIAJJGyICa0E/ca2IIAGthiAAKQMAhDcDACAAQQhqIQEgAyACayEAAkADQCAAQcEASQ0BIAFCfzcDACABQQhqIQEgAEFAaiEADAALCwJAIABFDQAgASABKQMAQn9BACAAa0E/ca2IhDcDAAsLlQQBCH8jgICAgABBMGsiBCSAgICAACAEQRBqQRBqIAAoAgQgAWoiBSACQf//A3FBHGxqIgJBEGoiBikCADcDACAEQRBqQQhqIAJBCGoiBykCADcDACAEQRBqQRhqIAJBGGoiCCgCADYCACAEIAMpAgA3AwggBCACKQIANwMQAkAgACgCECAELwEkIgNJDQAgACgCACEJIARBCGogBEEQahDDgYCAACAAQS5qIgogBC8BJkEBdGoiCyALLwEAQX9qOwEAIAkgAWoiASADQQF0akEAOwEAIAhBACgCvJLJgAA2AgAgBkEAKQK0ksmAADcCACAHQQApAqySyYAANwIAIAJBACkCpJLJgAA3AgACQANAIAEgAC8BICADQQFqcSIHQf//A3FBAXRqIgIvAQAiBkUNASAFIAZBHGxqIgYvARZFDQEgBkEUaiADOwEAIAogBSACLwEAQRxsai8BFkEBdGoiBiAGLwEAQX9qOwEAIAUgAi8BAEEcbGoiBiAGLwEWQX9qOwEWIAogBSACLwEAQRxsai8BFkEBdGoiBiAGLwEAQQFqOwEAIAEgA0H//wNxQQF0aiACLwEAOwEAIAchAwwACwsgAC8BLCECAkADQCACQf//A3EiBUUNASAKIAVBAXRqLwEADQEgACACQX9qIgI7ASwMAAsLIAEgA0H//wNxQQF0akEAOwEACyAEQTBqJICAgIAAC10BBH8gACgCACIAQRBqIQIgASgCECEDIAEoAgwhBAJAIAEtAAhBAXENACACIAAoAgAiBSAFIAEoAgBqIAEoAgQQwYGAgAALIAIgACgCACIBIAQgAWogAxDBgYCAAAu8BQMFfwJ+Bn8jgICAgABBMGsiBSSAgICAACAFQRBq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AR4gCUIBfCEJIApCf3whCgwBCwsgDSALOwEAIAIgDDsBHCAGIAIvAR5BAXRqIgEgAS8BAEEBajsBACAAIAAvASQiASACLwEeIgIgASACSxs7ASQLIAggBC8BJEEBdGogAzsBAAJAQSRFDQAgByADQf//A3FBJGxqIARBCGpBJPwKAAALIARBMGokgICAgAAgAwuXNAQDfwF+F38BfiOAgICAAEHwDWsiAySAgICAACAAIAE7AYgBAkACQAJAIAItAARFDQBBACEEIANBADoAECADIAIvAQA7AQwgAyACLwECIgU2AgggA0EUaiAAIANBCGoQuYGAgAAgAy0AIEUNACADQSRqIABBlMXHgAAQuYGAgAACQCADLQAwRQ0AIANBmAFqQQhqIANBJGpBCGooAgA2AgAgAyADKQIkNwOYAUECIQQLIANB6ABqQQhqIANBFGpBCGooAgA2AgAgA0GAAWogA0GYAWpBCGooAgA2AgAgA0EAOgCQASADIAMpAhQ3A2ggA0EBOgB0IAMgAykDmAE3A3ggAyAEOgCUASADIAQ6AIQBIANBADoAiAEgA0GoAWogA0HoAGoQtIGAgAACQAJAIAMtALABRQ0AAkBBJEUNACADQewBaiADQegAakEk/AoAAAsgA0EBOgCYAiADIAMpA6gBIgY3ApACIAMgBkIwiKdBf2o7AZwCIANB7AFqIQIMAQsCQEEkRQ0AIANBuAFqIANB6ABqQST8CgAACyADQeIBakIANwEAIANCADcC3AEgA0G4AWohAgsCQEE0RQ0AIANBNGogAkE0/AoAAAtBACEHAkADQCADQaACaiADQTRqELeBgIAAIAMtAKwCRQ0BIAMoAqACIgIoAhggAigCEGogAy8BpAJBA3RqKQMAQiGIp0EBcSAHaiEHDAALCyADQbACaiAAIANBFGoQhIGAgAAgAy8BtAIiAg0CIAAvAYoBIAVBf3NqQf//A3EhCEEAIQkgAygCsAIhCgwBC0EBIQkLIAAoAlQhAiADQbgCaiAAQYiIwoAAQZzUx4AAEMyBgIAAIANBAToA7gIgAyABOwHsAiADQfACaiACQZgCaiADQewCahDtgICAAAJAAkAgAy8BhAMiAg0AIAMvAYIDIQsgAy8BgAMhDCADKAL8AiENIAMoAvgCIQEgAygC9AIhBSADKALwAiEOIANBiANqIABBGGoQ5oCAgAAgAy8BjAMiAg0AIAMoAogDIQ8gA0GQA2ogDhDugICAACADKAKgAyECIANBqANqIAEQ74CAgAAgAygCqAMhECADQbgDaiABQQR2EPCAgIAAIAMoArgDIREgA0HIA2ogDRDxgICAACADKALIAyESIANB2ANqIAVBHG4iExDygICAACASIBEgECACIAsgDGxB//8DcUEDdCIUIAtBA3QiBGoiFWpBB2pBeHEiFmpBA2pBfHEiF2pBB2pBeHEiEWpBA2pBfHEhECADKALoAyESQQAhAgJAIAVBG00NAEIBQSAgE0EEdEF/amdrrYanIQILIANB8ANqIAIQ84CAgAAgA0GgBGogA0GQA2pBCGopAwA3AgAgA0GoBGogA0GQA2pBEGopAwA3AgAgA0G8BGogA0GoA2pBCGopAwA3AgAgAyAVNgKUBCADIBQ2ApAEIAMgBDYCjAQgAyAENgKIBCADQQA2AoQEIAMgFjYCsAQgAyAXNgLEBCADIAMpA5ADNwKYBCADIAMpA6gDNwK0BCADIBIgEGpBA2pBfHEiEiADKALwA2pB//8DakGAgHxxIhQ2AoAEIANB0ARqIANBuANqQQhqKQMANwIAIANB5ARqIANByANqQQhqKQMANwIAIANB+ARqIANB8ANqQQhqKQMANwIAIANBjAVqIANB2ANqQQhqKQMANwIAIANBlAVqIANB2ANqQRBqKQMANwIAIAMgETYC2AQgAyASNgLsBCADIBA2AoAFIAMgAykDuAM3AsgEIAMgAykDyAM3AtwEIAMgAykD8AM3AvAEIAMgAykD2AM3AoQFIAMgCzsBrgUgAyAMOwGsBSADIA02AqgFIAMgATYCpAUgAyAFNgKgBSADIA42ApwFIAMgACkCLDcDsAUCQAJAAkACQCAUQYGAJE8NACADQbgFaiAAQSxqEOmAgIAAIAMvAbwFIgINAkGAgCQhEyADQbgFaiECDAELIANBwAVqIANBsAVqIBQQ64CAgAAgAy8ByAUiAg0BIANBwAVqIQIgAygCxAUhEwsgAEHUAGohGCADQZwFaiEOIANBhAVqIRkgA0GYBGohGiAMQQN0IQ0gAigCACEFQQAhAUEAIQIDQCAEIAJGDQIgBSACaiAEIAFqrTcDACABIA1qIQEgAkEIaiECDAALCyAPIAAoAig2AgAgACAPNgIoDAELIAMgFTYCrAcgAyAFNgKoByADQcAGaiADQagHaiAaEPSAgIAAIAMoAuQEIBFqIQECQCADKALgBCIaQQN0IgJFDQAgASAFakH/ASAC/AsACyADKAK8BCAWaiENIAMoAugEIRsCQCADKAK4BCIcQQN0IgJFDQAgDSAFakH/ASAC/AsACyAFIBdqIgJBADYCDCACIAMoAtQEIhU2AgggAiADKQLMBEIgiTcCACADKALABCEdAkAgFUUNACACQRBqQQAgFfwLAAsgBSASaiICQQA2AgwgAiADKAL8BCIVNgIIIAIgAykC9ARCIIk3AgACQCAVRQ0AIAJBEGpBACAV/AsACyADIBA2ArQHIAMgBTYCsAcgA0HQBWogA0GwB2ogGUGMxceAABD1gICAACAPIBdBEGo2AjggDyAdIBZqNgI0IA8gHDYCMCAPIA02AiwgDyAbIBFqNgIoIA8gGjYCJCAPIAE2AiAgDyAENgIcIA9BADYCGCAPIBQ2AhQgDyAFNgIQIANBADoAzAUCQEHoAEUNACAPQTxqIANBwAZqQegA/AoAAAsgDyASQRBqNgKkAQJAQfAARQ0AIA9BqAFqIANB0AVqQfAA/AoAAAsgDyALOwGuAiAPIAw7AawCIA8gCzsBqgIgDyAMOwGoAiAPQaACaiAOQQhqKQIANwIAIA8gDikCADcCmAIgDyADLQDMBToAsAIgDyAAKQMANwMAIA9CADcCCCAPQQA7Aa4CIAAgACgCXCATajYCXCAAIAApAwBCAXw3AwAgD0EBOwGuAiAAIA82AlggACAPNgJUIA8oAhAhAiAPKAIYIQEgA0EAOgDYByABIAJqIgEoAgAhBCADQQA6ANQHIANBADYC0AcgAyAPLwGuAjYCzAcgAyABNgLAByADIA9BEGo2ArwHIAMgDzYCuAcgA0EANgLIByADIAQgAmo2AsQHIANByA1qQQhqIRMgA0GIC2pBEGohGQNAIANB3AdqIANBuAJqELeBgIAAAkACQCADLQDoB0UNACADKALcByEFIAMvAeAHIQ8gA0EBOgCWCiADIAMoArwHLwGcAjsBlAogBSgCGCAFKAIQIgRqIA9BA3RqIhIoAgAhDSAFLwGsAiEBIANBmApqIAVBmAJqIANBlApqEO2AgIAAIAMvAawKIgINAyANIARqIREgA0GwCmpBEGogA0GYCmpBEGooAgA2AgAgA0GwCmpBCGogA0GYCmpBCGopAgA3AwAgAyADKQKYCjcDsAoCQCASKQMAIh5CgICAgBCDQgBRDQAgASENDAILIAFBAWohDSARIAFBA3RqQXhqIQICQANAIA1BAUYNASANQX9qIQ0gAikDACEGIAJBeGohAiAGQv7//4OAgAODUEUNAwwACwsgHkKAgICAgByDQgBSIQ0MAQsgACADKALMBzYCaEEAIQECQAJAA0AgGCgCACICRQ0BIAJBDGohGCABIAIvAa4CaiIBIAAvAYoBSQ0ADAILCyAALwGKASABa0EBaiEBA0AgAUF/aiIBRQ0BIANB7AdqIAAQsYGAgAAgAy8B8AciAg0EDAALC0EAIQIgCQ0EQQAhAiADQfQHaiAAQQAgChDNgYCAACADLQCACEUNAyADQYQIaiAAQZTFx4AAELmBgIAAQQAhAgJAIAMtAJAIRQ0AIANB+AhqQQhqIANBhAhqQQhqKAIANgIAIAMgAykChAg3A/gIQQIhAgsgA0HICGpBCGogCkEIaigCADYCACADQeAIaiADQfgIakEIaigCADYCACADQQA6APAIIANBAToA1AggAyADKQP4CDcD2AggAyACOgD0CCADIAI6AOQIIANBADoA6AggAyAKKQIANwPICCADQYgJaiADQcgIahC0gYCAAAJAAkAgAy0AkAlFDQACQEEkRQ0AIANByAlqIANByAhqQST8CgAACyADQQE6APQJIAMgAykDiAkiBjcC7AkgAyAGQjCIp0F/ajsB+AkgA0HICWohAgwBCwJAQSRFDQAgA0GUCWogA0HICGpBJPwKAAALIANBvglqQgA3AQAgA0IANwK4CSADQZQJaiECCwJAQTRFDQAgA0GUCGogAkE0/AoAAAtBACECAkADQCADQfwJaiADQZQIahC3gYCAACADLQCICkUNASADKAL8CSIBKAIYIAEoAhBqIAMvAYAKQQN0aikDAEIhiKdBAXEgAmohAgwACwsgCEF/cyAIQQAgAiAHayIBIAEgAksbIgIgCCACSRtqIAMoAvQHQX9zIAAvAYoBaiIBQQAgCCACayICIAIgCEsbIgIgASACSRtqIQECQANAIAFBAWoiAUUNASADQYwKaiAAELGBgIAAIAMvAZAKIgJFDQAMBQsLQQAhAgwDCyAFQRBqIRQgACgCdCELIAAoAnAhDCAAKAJsIQFBACECIAMvAcAKIAMvAdAHQX9zakH//wNxIRYDQAJAAkACQCALRQ0AIAwgAk0NACABKAIAIgQoAgAgBUcNAiAELwEEIA9HDQIgBC8BBiIQIA1B//8DcSINSQ0BIAQgECAWIBAgFkkbIhA7AQYMAQsCQAJAAkAgDUH//wNxIhdFDQACQANAIAMoAsgHIgJFDQEgAyACQX9qNgLIByADQbgHaiAAIANBmApqELyBgIAAIgJB//8DcQ0JDAALCyADKALAByILIAspAwBC//////9jgyASKQMAQoCAgICAHIOENwMAQQAhDANAAkACQCAMIg0gF08NACADLQDUB0UNASALIAspAwBCgICAgBCENwMAIANBuAdqIAAgA0GwCmoQvIGAgAAiAkH//wNxDQogAygCwAciCyALKQMAQv/////fY4MgEikDAEKAgICAgByDhEKAgICAIIQ3AwAMAQsgEi0ABEEBcUUNAwwECwJAIAAoAnRFDQAgACgCcCECIAAoAmwhASADLwHSByEMIAMvAdAHIRAgAygCuAchFgNAIAJFDQECQCABKAIAIgQoAgAgBUcNACAELwEEIA9HDQAgDSAELwEGRw0AIAQgEDsBBiAEIBY2AgAgBCAMOwEECyACQX9qIQIgAUEEaiEBDAALCyANQQFqIQwCQAJAIBEgDUEDdGoiECkDACIGQgKDUA0AIAMoAsQHIgIgBjcDACADLwHQByIBIAMoArwHLwGcAkF/akH//wNxRg0BIAMgAUEBajsB0AcgAyACQQhqNgLEBwwCCwJAAkACQCAGQiqIp0EDcQ4EAgEABAILIAMoArwHLwGcAkEBTQ0DDAELAkAgAygCvAciAi8BnAIiAUEBSw0AIAMoAsQHIgEgASkDAEKDgID8//98gzcDAAJAAkAgAy8B0AciBCACLwGcAkF/akH//wNxRw0AIANBAToA1AcMAQsgAyAEQQFqOwHQByADIAFBCGo2AsQHCyANQQJqIQwMAwsgAy8B0AciBCABQX9qQf//A3FHDQAgAygCxAciASABKQMAQoCAgByDQoCAgICAgAOENwMAAkAgBCACLwGcAkF/akH//wNxRw0AIANBAToA1AcgDSEMDAMLIAMgBEEBajsB0AcgAyABQQhqNgLEByANIQwMAgsgAygCxAciAiAGQvz//5+AgHeDNwMAAkAgECkDACIGQgODQgFSDQAgAyAFKAI4IAUoAhAiAmo2AsgKIANBzApqIANByApqIBAgAmsQp4GAgAACQAJAIAMtANQKDQBBACEOQQAhFgwBCyADKALMCiACaiEOIAMoAtAKIRYLAkAgAygCvAciASgCKCABKAIAIgJqIgRBfGooAgAgBEF4aigCAEkNACADQdgKakEIakIANwMAIANCADcD2AogA0IANwPwCiADQQE6AOwKIAMgAygCuApBAXQ2AugKIANBuAdqIAAgA0HYCmoQvYGAgAAiAkH//wNxDQsgAygCvAciASgCACECCyADQfwKaiABQRxqIgQgAiAWEKiBgIAAAkACQCADLwGECw0AIAQgASgCACADKAL8CiADKAKACxCigYCAAAwBCyAWQQJ0IQQgAygCuAoiDSECA0AgAiIBQQF0IQIgASANayAESQ0ACyAZQgA3AwAgGUEIakIANwMAIANBAToAlAsgAyABNgKQCyADQgA3A4gLIANBuAdqIAAgA0GIC2oQvYGAgAAiAkH//wNxDQsgAygCvAchAQsgAyABKAIoIAEoAgAiBGo2AqgLIAMoAsQHIQIgAygCwAchCyADQawLaiABQRxqIhogBCAWEKiBgIAAAkAgAy8BtAtFDQBBIiECDAsLIAMoAqwLIQ0CQCADKAKwCyIWQQJ0IhVFDQAgDSAOIBX8CgAACyABKAIAIQ4gAyAWNgK8CyADIA0gDms2ArgLAkAgA0GoC2ogAiAEayADQbgLahCpgYCAAEH//wNxRQ0AIBogASgCACANIBYQooGAgABBISECDAsLIAIgAikDAEJ8g0IBhDcDACALIAspAwBCgICAgMAAhDcDACAQKQMAIQYLAkACQCAGQoCAgICAgAiDQgBSDQAgAygCvAchAQwBCyADIAUoAqQBIAUoAhAiBGo2AsALIANBxAtqIANBwAtqIBAgBGsQqoGAgAAgAy8BxAshFiAFKAKsASELAkAgAygCvAciASgClAEgASgCACICaiINQXxqKAIAIA1BeGooAgBJDQAgA0HIC2pBCGpCADcDACADQgA3A8gLIANCADcD4AsgA0EBOgDcCyADIAMoArQKQQF0NgLYCyADQbgHaiAAIANByAtqEL2BgIAAIgJB//8DcQ0LIAMoArwHIgEoAgAhAgsgA0HsC2ogAUEQaiINIAJBACALIARqIBZBHGxqIgsoAgQgCy0ACEEBcRsgCygCEGoiBBDAgYCAAAJAAkAgAy8B9AsNACANIAEoAgAgAygC7AsgAygC8AsQwYGAgAAMAQsgAygCvAoiDSECA0AgAiIBQQF0IQIgASANayAESQ0ACyADQfgLakEQakIANwMAIANB+AtqQQhqQgA3AwAgA0IANwP4CyADQQE6AJQMIAMgATYCkAwgA0G4B2ogACADQfgLahC9gYCAACICQf//A3ENCyADKAK8ByEBCyABKAIAIQQgA0GYDGogCyAUIAEQrYGAgAAgAy8BrAwiAg0KIANBADYCtAwgAyABNgKwDCADQboMaiABQZgBaiAEIANBmAxqIBYgA0GwDGoQroGAgAAgA0G6DGohASADLQC8DCECAkACQAJAAkAgAy8BvgwOAgMBAAtBvM3HgAAhAgwBCyADQcAMakEIakIANwMAIANCADcDwAwgA0IANwPYDCADQQE6ANQMIAMgAygCtApBAXQ2AtAMIANBwAxqIQILIANBuAdqIAAgAhC9gYCAACICQf//A3ENCyADKAK8ByIBKAIAIQQgA0HkDGogCyAUIAEQrYGAgAAgAy8B+AwiAg0LIANBADYCgA0gAyABNgL8DCADQYQNaiABQZgBaiAEIANB5AxqIBYgA0H8DGoQroGAgAAgAy8BiA0iAg0LIAMgAy8BhA07AYoNIANBig1qIQEgAy0Ahg0hAgsCQCACQf8BcUUNACABLwEAIRYLIAMgAygCvAciASgClAEgASgCACIEajYCjA0gAygCwAchCyADQZANaiADQYwNaiADKALEByICIARrEKuBgIAAAkAgAy8BnA1FDQBBICECDAsLIAMoApQNIQ0CQAJAIAMtAJgNRQ0AIAFBmAFqIAEoAgAgDS8BABClgYCAAEKAgICAgIAIIQYgAiEEIA0vAQAgFkH//wNxRg0BCyANIBY7AQAgAiACKQMAQoCAgICAgAiENwMAQoCAgICAAiEGIAshBAsgBCAEKQMAIAaENwMAIBApAwAhBgsCQCAGQhqIpyIEQf//A3EiDUUNACADQaANakEIaiAFKAJAIAUoAhBqIA1BJGxqIgJBCGopAgA3AwAgA0GgDWpBEGogAkEQaikCADcDACADQaANakEYaiACQRhqKAIANgIAIAMgAikCADcDoA0gA0HCDWog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gzcDAAwBCwJAAkAgECAFLwGsAiICRg0AIAJBAWohBiAPKAIAIAUoAhBqIQICQANAIAZBf2oiBkUNASACLQAFIRQgAkEIaiECIBRBIHENAwwACwsgDyAPKQMAQv//////fYMiFzcDAAwECyAPIA8pAwBC//////99gyIXNwMADAMLIA8pAwAhFwwCCyACQQhqIQIgFEEIaiEUIAZBf2ohBgwACwsCQCAXQoCAgICAAYNQDQAgCyEGIBAhAgNAAkACQAJAAkACQCACRQ0AIAYpAwBCGoinIhRB//8DcQ0BDAQLIBAgBS8BrAIiAkcNAQwCCyAKIAUoAhAgFBCTgYCAAAwCCyACQQFqIQYgDygCACAFKAIQaiECA0AgBkF/aiIGRQ0BIAIoAQIhFCACQQhqIQIgFEGA+P8fcQ0EDAALCyAPIA8pAwBC//////9+gzcDAAwCCyAGQQhqIQYgAkF/aiECDAALCwJAIBBBA3QiAkUNACALQQAgAvwLAAsgE0EBaiETDAALC0IBQSAgEkEEdEF/amdrrYanIQYMAwsgACAFELiBgIAADAELAkAgACgCdEUNACAAKAJwIQIgACgCbCEGA0AgAkUNAQJAIAYoAgAiFCgCACAFRw0AAkAgFC8BBCIIIAdPDQAgFEEANgEEDAELIBQgCCAHazsBBAsgBkEEaiEGIAJBf2ohAgwACwsgBSANOwGuAgsgBCAHaiEEDAELCyAFQZgCaiESIAQgB2ohBCADQZABaiAGEPOAgIAAIANBxAFqIANBMGpBCGopAwA3AgAgA0HMAWogA0EwakEQaikDADcCACADQeABaiADQcgAakEIaikDADcCACADIBU2ArgBIAMgEzYCtAEgAyAUNgKwASADIBQ2AqwBQQAhBiADQQA2AqgBIAMgDjYC1AEgAyAPNgLoASADIAMpAzA3ArwBIAMgAykDSDcC2AEgAyAWIBFqQQNqQXxxIhMgAygCkAFqQf//A2pBgIB8cSIHNgKkASADQfQBaiADQdgAakEIaikDADcCACADQYgCaiADQegAakEIaikDADcCACADQZwCaiADQZABakEIaikDADcCACADQbgCaiADQfgAakEQaikDADcCACADQbACaiADQfgAakEIaikDADcCACADIBA2AvwBIAMgEzYCkAIgAyARNgKkAiADIAMpA1g3AuwBIAMg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AWogAkGwAWooAgA2AgAgAUHkAWogAkGoAWopAgA3AgAgAUHcAWogAkGgAWopAgA3AgAgASAAKAIYLQDSAUEBcToAlAIgASAAKAIYLQDRAUEBcToAlQIgASAAKAIAQQh2QQFxOgCWAiABIAAoAhgiACkCwAI3AvABIAFBiAJqIABB2AJqKQIANwIAIAFBgAJqIABB0AJqKQIANwIAIAFB+AFqIABByAJqKQIANwIAC60FAwd/BH4DfyOAgICAAEHgAGsiASSAgICAAAJAAkAgACgCGCICLQCYAkUNACACLwGQAiEDIAIvAZICIQQgAi0AlAIhBSACLQCVAiEGIAItAJYCIQcCQEE8RQ0AIAEgAkHUAWpBPPwKAAALQoACQgAgB0EBcRshCAwBC0EAIQUgAUEYakEANgIAQgAhCCABQRBqQgA3AwAgAUEIakIANwMAIAFBJGpBACkDmKfIgAA3AgAgAUEsakEAKQOgp8iAADcCACABQTRqQQApA6inyIAANwIAIAFCADcDACABQQApA5CnyIAANwIcQQAhBkEAIQNBACEECyACKQKYASEJIAIgASkDADcCmAEgAkGgAWoiBykCACEKIAcgAUEIaikDADcCACACQagBaiIHKQIAIQsgByABQRBqKQMANwIAIAJBsAFqIgIoAgAhByACIAFBGGooAgA2AgAgAUHAAGpBGGoiDCAHNgIAIAFBwABqQRBqIg0gCzcDACABQcAAakEIaiIOIAo3AwAgASAJNwNAIAAoAhgQkoGAgAAhByAAKAIYIQICQAJAIAdB//8DcUUNACACIAEpA0A3ApgBIAJBsAFqIAwoAgA2AgAgAkGoAWogDSkDADcCACACQaABaiAOKQMANwIADAELIAIgASkCHDcCwAIgAkHYAmogAUE0aikCADcCACACQdACaiABQSxqKQIANwIAIAJByAJqIAFBJGopAgA3AgAgACAANQIAQv/9//8PgyAIhD4CACAAKAIYIAZBAXE6ANEBIAAoAhggBUEBcToA0gEgACgCGCADQf//A3EiAiAALwHyEUF/akH//wNxIgMgAiADSRsgBEH//wNxIgIgAC8B8BFBf2pB//8DcSIAIAIgAEkbEN6BgIAACyABQeAAaiSAgICAACAHC6sIAwd/AX4BfyOAgICAAEGAAWsiAySAgICAAAJAAkACQAJAIAJB//8DcSIEIAAvAcoBIgVPDQAgA0EMaiAAKAK8ASIGIAUgAmtB//8DcRDfgYCAACADLQAcDQIgA0EgakEIaiADQQxqQQhqKAIANgIAIAMgAykCDDcDICADQSBqIQUMAQsgACgCvAEhBgJAIAQgBUsNACAGIQUMAwsgA0E0aiAGIAIgBWtB//8DcRDPgYCAACADLQBEDQEgA0HIAGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3A0ggA0HIAGohBQsgBUEBOgAMDAELQazNx4AAIQULIAUoAgghByAFLwEEIQQgBSgCACEFIAAgAjsBygEgACABOwHIAQJAAkACQAJAAkAgBSAGKAIARw0AIAYvAQRB//8DcSAERw0AIAYvAQYgAUH//wNxRg0BCyAAKALAASIGIAYpAwBCgICAgIDAAIQ3AwAgBSgCGCAFKAIQaiAEQQN0aiIGIAYpAwBCgICAgIDAAIQ3AwAgACgCvAEiBigCACAFRg0AIABBmAFqIQIgAC8BzAENAUHMp8iAACEIQbCnyIAAIQkMAgsgBiAHNgIIIAYgATsBBiAGIAQ7AQQgBiAFNgIADAILIANB9ABqIQggAikCACEKIAJCADcDACADQdgAakEYaiACQRhqIgYoAgA2AgAgA0HYAGpBEGogAkEQaiIJKQIANwMAIANB2ABqQQhqIAJBCGoiCykCADcDACALQgA3AwAgCUIANwMAIAZBADYCACADQQE6AHQgAyAKNwNYIAAQkoGAgAAaIAAoArwBIQYgA0HYAGohCQsCQCAAKAK4AUUNACAGKAIAIgZBqAFqIAYoAhAgAC8BzgEQpYGAgAAgACgCvAEhBgsgBiAHNgIIIAYgATsBBiAGIAQ7AQQgBiAFNgIAAkAgCC0AAEUNACACIAkpAgA3AgAgAkEYaiIGIAlBGGooAgA2AgAgAkEQaiIFIAlBEGopAgA3AgAgAkEIaiIBIAlBCGopAgA3AgAgABCSgYCAACIEQf//A3FFDQAgAyAEOwF8IANB/ABqEOCBgIAAIAZBADYCACAFQgA3AwAgAUIANwMAIAJCADcDACAAQQA7AcwBCyAAKAK4ASIGRQ0AIABBADYCuAEgAEEAOwHOAQJAIAAgBigCDCAGKAIQQQAgBigCACAGLQAIQQFxIgUbQQAgBigCBCAFGxDTgYCAACIFQf//A3FFDQAgAyAFOwF+IANB/gBqEOGBgIAACyAGIABBkAFqIgUQnYGAgAAgBSAGEJ6BgIAACyAAKAK8ASIGKAIAIgUoAhggBSgCECIFaiAGLwEEQQN0aiICKAIAIQEgBi8BBiEGIAAgAjYCwAEgACABIAVqIAZBA3RqNgLEASADQYABaiSAgICAAAvSAQECfwJAIAIgAS8BBCIDSw0AIABBADoAECAAQQA6AAggACADIAJrOwEEIAAgASgCADYCACAAIAEvAQY7AQYPCyACIANrIQIgASgCACEEAkADQCAEKAIIIgNFDQECQCACIAMvAa4CIgRLDQAgACADNgIAIABBADoAECAAQQA6AAggACAEIAJrOwEEIAAgAS8BBjsBBg8LIAIgBGshAiADIQQMAAsLIABBADsBBCAAIAQ2AgAgAEEBOgAQIAAgAjYCDCAAQQA6AAggACABLwEGOwEGC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABDtgYCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBPRCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQ7YGAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABDugYCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBwQAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEO6BgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsg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gYCAAAJAAkAgAi0AFEUNAEEAIQQMAQsgAigCDCEEIAIvAQohBSACLwEIIQYgAigCBCEBCwJAAkACQAJAAkAgAygCACABRw0AIAMvAQRB//8DcSAGQf//A3FHDQAgAy8BBiAFQf//A3FGDQELIAAoAsABIgMgAykDAEKAgICAgMAAhDcDACABKAIYIAEoAhBqIAZB//8DcUEDdGoiAyADKQMAQoCAgICAwACENwMAIAAoArwBIgMoAgAgAUYNACAAQZgBaiEHIAAvAcwBDQFBzKfIgAAhCEGwp8iAACEJDAILIAMgBDYCCCADIAU7AQYgAyAGOwEEIAMgATYCAAwCCyACQTRqIQggBykCACEKIAdCADcDACACQRhqQRhqIAdBGGoiAygCADYCACACQRhqQRBqIAdBEGoiCSkCADcDACACQRhqQQhqIAdBCGoiCykCADcDACALQgA3AwAgCUIANwMAIANBADYCACACQQE6ADQgAiAKNwMYIAAQkoGAgAAaIAAoArwBIQMgAkEYaiEJCwJAIAAoArgBRQ0AIAMoAgAiA0GoAWogAygCECAALwHOARClgYCAACAAKAK8ASEDCyADIAQ2AgggAyAFOwEGIAMgBjsBBCADIAE2AgACQCAILQAARQ0AIAcgCSkCADcCACAHQRhqIgMgCUEYaigCADYCACAHQRBqIgQgCUEQaikCADcCACAHQQhqIgggCUEIaikCADcCACAAEJKBgIAAIglB//8DcUUNACACIAk7ATwgAkE8ahDggYCAACADQQA2AgAgBEIANwMAIAhCADcDACAHQgA3AwAgAEEAOwHMAQsgACgCuAEiA0UNACAAQQA2ArgBIABBADsBzgECQCAAIAMoAgwgAygCEEEAIAMoAgAgAy0ACEEBcSIHG0EAIAMoAgQgBxsQ04GAgAAiB0H//wNxRQ0AIAIgBzsBPiACQT5qEOGBgIAACyADIABBkAFqIgcQnYGAgAAgByADEJ6BgIAACyABKAIYIAEoAhAiA2ogBkH//wNxQQN0aiIBKAIAIQYgACABNgLAASAAIAYgA2ogBUH//wNxQQN0ajYCxAEgAkHAAGokgICAgAALgQEBA38jgICAgABBEGsiAiSAgICAACACIAAoAiggACgCACIDajYCACACQQRqIAIgASADaxChgYCAACACKAIEIQQgAEEcaiADIAMgAigCCCIAKAIAaiAAKAIEEKKBgIAAIAIgBBCjgYCAACABIAEpAwBCfIM3AwAgAkEQaiSAgICAAAuGAQECfyOAgICAAEEQayICJICAgIAAIAIgACgClAEgACgCACIDajYCACACQQRqIAIgASADaxCkgYCAAAJAIAItAAxFDQAgAEGYAWogAyACKAIILwEAEKWBgIAAIAIgAigCBBCmgYCAACABIAEpAwBC////////d4M3AwALIAJBEGokgICAgAALjQEBAX8gAS8BCCABQQpqLQAAQRB0ciECAkACQAJAIAEtAAwOAwABAgALIABCADcDACAAQQhqQgA3AwAPCyAAQQE6AAggACAAKQMAQoD4/x+DIAJBAnRB/AdxQQJyrYQ3AwAPCyAAQQE6AAggACACQYCA/AdxQRB2rUIShiACQQJ0Qfz/D3FBA3KthDcDAAsxAQF/AkAgAEH07MmAAEE7EJqAgIAAIgJB//8DcQ0AIAAgAS8BABCnhICAACECCyACCzEBAX8CQCAAQa/tyYAAQT8QmoCAgAAiAkH//wNxDQAgACABLwEAEKeEgIAAIQILIAILvAkDCX8BfgF/I4CAgIAAQcAAayIBJICAgIAAIAFBBGogACgCvAEiAkEBEM+BgIAAAkACQCABLQAURQ0AQQAhAwwBCyABKAIMIQMgAS8BCiEEIAEvAQghBSABKAIEIQYLAkACQAJAAkACQCACKAIAIAZHDQAgAi8BBEH//wNxIAVB//8DcUcNACACLwEGIARB//8DcUYNAQsgACgCwAEiAiACKQMAQoCAgICAwACENwMAIAYoAhggBigCEGogBUH//wNxQQN0aiICIAIpAwBCgICAgIDAAIQ3AwAgACgCvAEiAigCACAGRg0AIABBmAFqIQcgAC8BzAENAUHMp8iAACEIQbCnyIAAIQkMAgsgAiADNgIIIAIgBDsBBiACIAU7AQQgAiAGNgIADAILIAFBNGohCCAHKQIAIQogB0IANwMAIAFBGGpBGGogB0EYaiICKAIANgIAIAFBGGpBEGogB0EQaiIJKQIANwMAIAFBGGpBCGogB0EIaiILKQIANwMAIAtCADcDACAJQgA3AwAgAkEANgIAIAFBAToANCABIAo3AxggABCSgYCAABogACgCvAEhAiABQRhqIQkLAkAgACgCuAFFDQAgAigCACIC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AkEIaiECIApCA4NCAVENAwwACwsgDCAMKQMAQv////+/f4MiCjcDAAwECyAMIAwpAwBC/////79/gyIKNwMADAMLIAwpAwAhCgwCCyAFQX9qIQUgB0EIaiEHIAJBCGohAgwACwsCQCAKQoCAgICAAoNQDQAgBkGoAWohCSAPIQUgDiEHIA4hAgNAAkACQCAFRQ0AIAItAAVBIHFFDQEgASAGKAKkASAGKAIQIghqNgJMIAFB0ABqIAFBzABqIAcgCGsQpIGAgAAgAS0AWEUNASAJIAggASgCVC8BABClgYCAACABQcwAaiABKAJQEKaBgIAAIAIgAikDAEL///////93gzcDAAwBCwJAAkAgDyAGLwGsAiICRg0AIAJBAWohBSAMKAIAIAYoAhBqIQICQANAIAVBf2oiBUUNASACLQAFIQcgAkEIaiECIAdBIHENAwwACwsgDCAMKQMAQv//////fYMiCjcDAAwECyAMIAwpAwBC//////99gyIKNwMADAMLIAwpAwAhCgwCCyAFQX9qIQUgB0EIaiEHIAJBCGohAgwACwsCQCAKQoCAgICAAYNQDQAgBkE8aiEIIA8hAiAOIQUDQAJAAkACQAJAAkAgAkUNACAFKQMAQhqIpyIHQf//A3ENAQwECyAPIAYvAawCIgJHDQEMAgsgCCAGKAIQIAcQk4GAgAAMAgsgAkEBaiEFIAwoAgAgBigCEGohAgNAIAVBf2oiBUUNASACKAECIQcgAkEIaiECIAdBgPj/H3ENBAwACwsgDCAMKQMAQv//////foM3AwAMAgsgAkF/aiECIAVBCGohBQwACwsCQCAPQQN0IgJFDQAgDkEAIAL8CwALIAwpAwAhCgJAIA1BA3QiAkUNACAMIAxBCGogAvwKAAALIAwgAmogCjcDACAGQQE6ALACAkAgAy0AjQFBAkcNACADLQCEAUUNACADKAJ8IgIoAgAgBkcNACACLwEEIgJFDQAgAiALSQ0AIAsgDWogAkkNACADIAMoAoABQX9qNgKAAQsgAygCdEUNASALIA1qIQggAygCcCECIAMoAmwhBQNAIAJFDQICQCAFKAIAIgMoAgAgBkcNACADLwEEIgcgC0kNACAIIAdJDQACQCAHDQAgA0EAOwEGDAELIAMgB0F/ajsBBAsgAkF/aiECIAVBBGohBQwACwsgDCkDACEKAkAgBSALQX9zakEDdCICRQ0AIAwgDEEIaiAC/AoAAAsgDCACaiAKNwMAIAZBAToAsAIgBi8BrgIhAgJAIAMtAI0BQQJHDQAgAy0AhAFFDQAgAygCfCIFKAIAIAZHDQAgBS8BBCIFIAtJDQAgBUUNACADIAMoAoABQX9qNgKAAQsgAiALayERAkAgAygCdEUNACADKAJwIQIgAygCbCEFA0AgAkUNAQJAIAUoAgAiBygCACAGRw0AIAcvAQQiCCALSQ0AAkAgCA0AIAdBADsBBgwBCyAHIAhBf2o7AQQLIAJBf2ohAiAFQQRqIQUMAAsLIBFB//8DcSELAkADQCAJIQUgBiICKAIMIgZFDQEgAkEQaiAGQRBqIgcgBSACLwGuAkF/akH//wNxQQN0aiAGKAIYIAYoAhBqIglBACACLwGsAhCggYCAACICQf//A3ENCQJAIA0gC2siCCAGLwGuAiICTw0AIAkoAgAgBigCEGohDiAGLwGsAiEPAkAgCSkDACIKQoCAgIDAAINQDQAgBkEsaiEQIA8hBSAOIQsgDiECA0ACQAJAIAVFDQAgAikDAEIDg0IBUg0BIAEgBigCOCAGKAIQIg1qNgJcIAFB4ABqIAFB3ABqIAsgDWsQoYGAgAAgASgCYCERIBAgDSANIAEoAmQiDCgCAGogDCgCBBCigYCAACABQdwAaiAREKOBgIAAIAIgAikDAEJ8gzcDAAwBCwJAAkAgDyAGLwGsAiICRg0AIAJBAWohBSAJKAIAIAcoAgBqIQICQANAIAVBf2oiBUUNASACKQMAIQogAkEIaiECIApCA4NCAVENAwwACwsgCSAJKQMAQv////+/f4MiCjcDAAwECyAJIAkpAwBC/////79/gyIKNwMADAMLIAkpAwAhCgwCCyAFQX9qIQUgC0EIaiELIAJBCGohAgwACwsCQCAKQoCAgICAAoNQDQAgBkGoAWohESAPIQUgDiELIA4hAgNAAkACQCAFRQ0AIAItAAVBIHFFDQEgASAGKAKkASAGKAIQIg1qNgJsIAFBKGogAUHsAGogCyANaxCkgYCAACABLQAwRQ0BIBEgDSABKAIsLwEAEKWBgIAAIAFB7ABqIAEoAigQpoGAgAAgAiACKQMAQv///////3eDNwMADAELAkACQCAPIAYvAawCIgJGDQAgAkEBaiEFIAkoAgAgBygCAGohAgJAA0AgBUF/aiIFRQ0BIAItAAUhCyACQQhqIQIgC0EgcQ0DDAALCyAJIAkpAwBC//////99gyIKNwMADAQLIAkgCSkDAEL//////32DIgo3AwAMAwsgCSkDACEKDAILIAVBf2ohBSALQQhqIQsgAkEIaiECDAALCwJAIApCgICAgIABg1ANACAGQTxqIQ0gDyECIA4hBQNAAkACQAJAAkACQCACRQ0AIAUpAwBCGoinIgtB//8DcQ0BDAQLIA8gBi8BrAIiAkcNAQwCCyANIAcoAgAgCxCTgYCAAAwCCyACQQFqIQUgCSgCACAHKAIAaiECA0AgBUF/aiIFRQ0BIAIoAQIhByACQQhqIQIgB0GA+P8fcQ0EDAALCyAJIAkpAwBC//////9+gzcDAAwCCyACQX9qIQIgBUEIaiEFDAALCwJAIA9BA3QiAkUNACAOQQAgAvwLAAsgCSkDACEKAkAgCEEDdCICRQ0AIAkgCUEIaiAC/AoAAAsgCSACaiAKNwMAIAZBAToAsAICQCADLQCNAUECRw0AIAMtAIQBRQ0AIAMoAnwiAigCACAGRw0AIAggAi8BBEkNACADIAMoAoABQX9qNgKAAQsgAygCdEUNAyADKAJwIQIgAygCbCEFA0AgAkUNBAJAIAUoAgAiAygCACAGRw0AIAggAy8BBCIHSQ0AAkAgBw0AIAMgBigCCCIHNgIAIAcvAa4CIQcLIAMgB0F/ajsBBAsgAkF/aiECIAVBBGohBQwACwsgCSkDACEKAkAgAkEDdEF4aiICRQ0AIAkgCUEIaiAC/AoAAAsgCSACaiAKNwMAIAZBAToAsAIgBi8BrgIhAgJAIAMtAI0BQQJHDQAgAy0AhAFFDQAgAygCfCgCACAGRw0AIAMgAygCgAFBf2o2AoABCyALIAJqIQsgAygCcCECIAMoAmwhBSADKAJ0RQ0AA0AgAkUNAQJAIAUoAgAiBygCACAGRw0AAkAgBy8BBCIIDQAgByAGKAIIIgg2AgAgCC8BrgIhCAsgByAIQX9qOwEECyACQX9qIQIgBUEEaiEFDAALCwsgBSACLwGuAkF/akH//wNxQQN0aiINKAIAIAIoAhBqIQwgAi8BrAIhEQJAIA0pAwAiCkKAgICAwACDUA0AIAJBLGohCyARIQMgDCEGIAwhBQNAAkACQCADRQ0AIAUpAwBCA4NCAVINASABIAIoAjggAigCECIHajYCcCABQfgQaiABQfAAaiAGIAdrEKGBgIAAIAEoAvgQIQcgCyACKAIQIgggCCABKAL8ECIJKAIAaiAJKAIEEKKBgIAAIAFB8ABqIAcQo4GAgAAgBSAFKQMAQnyDNwMADAELAkACQCARIAIvAawCIgVGDQAgBUEBaiEDIA0oAgAgAigCEGohBQJAA0AgA0F/aiIDRQ0BIAUpAwAhCiAFQQhqIQUgCkIDg0IBUQ0DDAALCyANIA0pAwBC/////79/gyIKNwMADAQLIA0gDSkDAEL/////v3+DIgo3AwAMAwsgDSkDACEKDAILIANBf2ohAyAGQQhqIQYgBUEIaiEFDAALCwJAIApCgICAgIACg1ANACACQagBaiEIIBEhAyAMIQYgDCEFA0ACQAJAIANFDQAgBS0ABUEgcUUNASABIAIoAqQBIAIoAhAiB2o2AnQgAUGQEWogAUH0AGogBiAHaxCkgYCAACABLQCYEUUNASAIIAIoAhAgASgClBEvAQAQpYGAgAAgAUH0AGogASgCkBEQpoGAgAAgBSAFKQMAQv///////3eDNwMADAELAkACQCARIAIvAawCIgVGDQAgBUEBaiEDIA0oAgAgAigCEGohBQJAA0AgA0F/aiIDRQ0BIAUtAAUhBiAFQQhqIQUgBkEgcQ0DDAALCyANIA0pAwBC//////99gyIKNwMADAQLIA0gDSkDAEL//////32DIgo3AwAMAwsgDSkDACEKDAILIANBf2ohAyAGQQhqIQYgBUEIaiEFDAALCwJAIApCgICAgIABg1ANACACQTxqIQcgESEFIAwhAwNAAkACQAJAAkACQCAFRQ0AIAMpAwBCGoinIgZB//8DcQ0BDAQLIBEgAi8BrAIiBUcNAQwCCyAHIAIoAhAgBhCTgYCAAAwCCyAFQQFqIQUgDSgCACACKAIQaiECA0AgBUF/aiIFRQ0BIAIoAQIhAyACQQhqIQIgA0GA+P8fcQ0EDAALCyANIA0pAwBC//////9+gzcDAAwCCyAFQX9qIQUgA0EIaiEDDAALCyARQQN0IgJFDQAgDEEAIAL8CwALIAAoAhggBEF/ajsBygEgACgCGEEBEOmBgIAAIAAoAhgQkoGAgAAiBEH//wNxDQELQQAhAgwFCyABIAQ7ASYgAUKAEDcCmBEgAUHAv8eAADYCkBEgASABQfgAajYClBECQAJAAkAgAUGQEWogAUEmahDygYCAACIEQf//A3FFDQAgAUGQEWpBsOnJgABBLRCogICAACABLwGoEQ0CIAFB+BBqQRBqIAFBkBFqQRBqKQIANwMAIAFB+BBqQQhqIgIgAUGQEWpBCGopAgA3AwAgASABKQKQETcD+BACQCACIAFBJmoQ8oGAgABB//8DcUUNACABQfgQahCpgICAAAwDCyABQShqIAFB+BBqEKqAgIAAIAFB+BBqEKmAgIAAIAEvATANAiABKAIsIQUgASgCKCECDAELIAEoApQRIQIgASgCnBEhBQsgAiAFEICAgIAAIARB//8DcUUNAEGw6cmAACACIAUQtoCAgAALIAAoAhgiBEIANwKYAUEAIQIgBEGwAWpBADYCACAEQagBakIANwIAIARBoAFqQgA3AgAgACgCGBCSgYCAABoMBAsgAUEoaiADELGBgIAAIAEvASwiAg0DAkACQCABKAIoRQ0AIAMQ74GAgAAiAkH//wNxRQ0BDAULAkAgAygCvAEiACgCACADKAJYRw0AIAFB+ABqIABBARDPgYCAAEGszceAACEEAkAgAS0AiAENACABQfgQakEIaiABQfgAakEIaigCADYCACABIAEpAng3A/gQIAFB+BBqIQQLIAAgBCkCADcCACAAQQhqIARBCGooAgA2AgAgAygCvAEiBCgCACIAKAIYIAAoAhBqIAQvAQQiAkEDdGoiBCAALwGuAiACQX9zakEDdCICaikDACEKAkAgAkUNACAEQQhqIAQgAvwKAAALIAQgCjcDACAAQQE6ALACIAMoArwBIgAoAgAiBCgCGCAEKAIQIgRqIAAvAQRBA3RqIgIoAgAhBSAALwEGIQAgAyACNgLAASADIAUgBGogAEEDdGo2AsQBDAELIAMQ74GAgAAiAkH//wNxDQQLQQAhAiADLwHMAUUNAyABQZARaiAIEOyBgIAAIAEtAJgRRQ0DIAMvAYgBQQN0IQAgAygCxAEgAy8ByAFBA3RrIQQgASkDkBEhCgNAIABFDQQgBCAKNwMAIABBeGohACAEQQhqIQQMAAsLIAMoArwBKAIAIQQgAUHgAGogAxCxgYCAACABLwFkIgINAgJAAkAgBCADKAK8ASIAKAIAIgdGDQAgAUHQAGpBBmohBCABQdAAakEEaiEFIAFB0ABqQQhqIABBCGooAgA2AgAgASAAKQIANwNQIAEgAy8ByAE7AVYgAUHQAGohAgwBCyABQZARaiAAQQEQz4GAgAACQCABLQCgEUUNAEGszceAACECQbLNx4AAIQRBsM3HgAAhBQwBCyABQShqQQZqIQQgAUEoakEEaiEFIAFBKGpBCGogAUGQEWpBCGooAgA2AgAgASABKQKQETcDKCABQShqIQILIAQvAQAhBiAFLwEAIQUCQAJAAkACQAJAIAcgAigCACIERw0AIAAvAQQgBUcNACAALwEGQf//A3EgBkYNAQsgAygCwAEiACAAKQMAQoCAgICAwACENwMAIAQoAhggBCgCEGogBUEDdGoiACAAKQMAQoCAgICAwACENwMAIAMoArwBIgAoAgAgAigCAEYNACADLwHMAQ0BQcynyIAAIQlBsKfIgAAhBwwCCyAAIAIpAgA3AgAgAEEIaiACQQhqKAIANgIADAILIAFBlAFqIQkgCCkCACEKIAhCADcDACABQfgAakEYaiAIQRhqIgAoAgA2AgAgAUH4AGpBEGogCEEQaiIHKQIANwMAIAFB+ABqQQhqIAhBCGoiCykCADcDACALQgA3AwAgB0IANwMAIABBADYCACABQQE6AJQBIAEgCjcDeCADEJKBgIAAGiADKAK8ASEAIAFB+ABqIQcLAkAgAygCuAFFDQAgACgCACIAQagBaiAAKAIQIAMvAc4BEKWBgIAAIAMoArwBIQALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgACQCAJLQAARQ0AIAggBykCADcCACAIQRhqIgAgB0EYaigCADYCACAIQRBqIgIgB0EQaikCADcCACAIQQhqIAdBCGopAgA3AgAgAxCSgYCAACIHQf//A3FFDQAgASAHOwF0IAFB9ABqEOCBgIAAIABBADYCACACQgA3AwAgCEEIakIANwMAIAhCADcDACADQQA7AcwBCyADKAK4ASIARQ0AIANBADYCuAEgA0EAOwHOAQJAIAMgACgCDCAAKAIQQQAgACgCACAALQAIQQFxIgIbQQAgACgCBCACGxDTgYCAACICQf//A3FFDQAgASACOwFAIAFBwABqEOGBgIAACyAAIANBkAFqIgIQnYGAgAAgAiAAEJ6BgIAACyAEKAIYIAQoAhAiAmogBUEDdGoiACgCACEFIAMgADYCwAEgAyAFIAJqIAZBA3RqNgLEASAAIAApAwBCgICAgIDAAIQ3AwAgAy0ApAFFDQEgAyAEQRBqIAMoAsABIgAgACgCACAEKAIQaiAELwGsAhDogYCAAAwBCyADQQEQ2IGAgAAgAkEBOgCwAgJAA0AgAigCDCIFRQ0BIAJBEGogBUEQaiAGIAIvAa4CQX9qQf//A3FBA3RqIAUoAhggBSgCEGoiB0EAIAIvAawCEKCBgIAAIgJB//8DcQ0DIAcpAwAhCgJAIAUvAa4CQQN0QXhqIgBFDQAgByAHQQhqIAD8CgAACyAHIABqIAo3AwAgBUEBOgCwAiADKAJwIQAgAygCbCEEIAchBiAFIQIgAygCdEUNAANAAkAgAA0AIAchBiAFIQIMAgsCQCAEKAIAIgIoAgAgBUcNAAJAIAIvAQQiBg0AIAIgBSgCCCIGNgIAIAYvAa4CIQYLIAIgBkF/ajsBBAsgAEF/aiEAIARBBGohBAwACwsLIAYgAi8BrgJBf2pB//8DcUEDdGoiDSgCACACKAIQaiEMIAIvAawCIRECQCANKQMAIgpCgICAgMAAg1ANACACQSxqIQsgESEEIAwhBSAMIQADQAJAAkAgBEUNACAAKQMAQgODQgFSDQEgASACKAI4IAIoAhAiBmo2AnAgAUHgAGogAUHwAGogBSAGaxChgYCAACABKAJgIQYgCyACKAIQIgcgByABKAJkIgkoAgBqIAkoAgQQooGAgAAgAUHwAGogBhCjgYCAACAAIAApAwBCfIM3AwAMAQsCQAJAIBEgAi8BrAIiAEYNACAAQQFqIQQgDSgCACACKAIQaiEAAkADQCAEQX9qIgRFDQEgACkDACEKIABBCGohACAKQgODQgFRDQMMAAsLIA0gDSkDAEL/////v3+DIgo3AwAMBAsgDSANKQMAQv////+/f4MiCjcDAAwDCyANKQMAIQoMAgsgBEF/aiEEIAVBCGohBSAAQQhqIQAMAAsLAkAgCkKAgICAgAKDUA0AIAJBqAFqIQcgESEEIAwhBSAMIQADQAJAAkAgBEUNACAALQAFQSBxRQ0BIAEgAigCpAEgAigCECIGajYCdCABQfgQaiABQfQAaiAFIAZrEKSBgIAAIAEtAIARRQ0BIAcgAigCECABKAL8EC8BABClgYCAACABQfQAaiABKAL4EBCmgYCAACAAIAApAwBC////////d4M3AwAMAQsCQAJAIBEgAi8BrAIiAEYNACAAQQFqIQQgDSgCACACKAIQaiEAAkADQCAEQX9qIgRFDQEgAC0ABSEFIABBCGohACAFQSBxDQMMAAsLIA0gDSkDAEL//////32DIgo3AwAMBAsgDSANKQMAQv//////fYMiCjcDAAwDCyANKQMAIQoMAgsgBEF/aiEEIAVBCGohBSAAQQhqIQAMAAsLAkAgCkKAgICAgAGDUA0AIAJBPGohBiARIQAgDCEEA0ACQAJAAkACQAJAIABFDQAgBCkDAEIaiKciBUH//wNxDQEMBAsgESACLwGsAiIARw0BDAILIAYgAigCECAFEJOBgIAADAILIABBAWohBCANKAIAIAIoAhBqIQADQCAEQX9qIgRFDQEgACgBAiECIABBCGohACACQYD4/x9xRQ0ADAQLCyANIA0pAwBC//////9+gzcDAAwCCyAAQX9qIQAgBEEIaiEEDAALCwJAIBFBA3QiAEUNACAMQQAgAPwLAAsgAygCvAEiACABKQNANwIAIABBCGogAUHAAGpBCGooAgA2AgAgAygCvAEiACgCACIEKAIYIAQoAhAiBGogAC8BBEEDdGoiAigCACEFIAAvAQYhACADIAI2AsABIAMgBSAEaiAAQQN0ajYCxAELQQAhAiADLwHMAUUNACABQfgQaiAIEOyBgIAAIAEtAIARRQ0AIAMvAYgBQQN0IQAgAygCxAEgAy8ByAFBA3RrIQQgASkD+BAhCgNAIABFDQEgBCAKNwMAIABBeGohACAEQQhqIQQMAAsLIAFBsBFqJICAgIAAIAILXAEEfyAAKAIYIgItANEBIQMgAi8BygEhBCACLwHIASEFIAIgAC8B+BEgAC8B9BEQ3oGAgAAgACABEPOBgIAAIAAoAhggBSAEEN6BgIAAIAAoAhggA0EBcToA0QELMQEBfwJAIABB7u3JgABBKxCagICAACICQf//A3ENACAAIAEvAQAQp4SAgAAhAgsgAguECQMPfwF+AX8jgICAgABBwAFrIgIkgICAgAACQCABRQ0AIAAoAhgiAy8BygEiBCAALwH0EUkNACAALwH2ESIFIARJDQAgAy8ByAEiBiAALwH4ESIHSQ0AIAYgAC8B+hEiCEsNAEEAIQkCQCAHDQAgCCAALwHyEUF/akH//wNxTyEJCyACIAMgAygCvAEQhIGAgAACQAJAIAIvAQQiAw0AIAUgBGtBAWoiAyABIANB//8DcSIKIAEgCkkbIgtrQf//A3EhDCACQSBqQQhqIQ0gAkGAAWpBEGohDkEAIQ8gAigCACEBDAELIAIgAzsBCiACQQpqELCCgIAAAAsDQCAPIAxJIRACQAJAAkADQCAPIApPDQMgASgCACIDKAIYIAMoAhBqIAEvAQRBA3RqIgMgAykDACIRQoCAgICAwACENwMAAkACQAJAIBBFDQAgAkEMaiABIAsQz4GAgAAgAigCDCIGKAIQIQUgBigCGCEHIAIvARAhCCAAIAEoAgBBEGogAxCtgoCAACAAIAZBEGoiEiAHIAVqIAhBA3RqIgUQrYKAgAAgCUUNASAFIAUpAwBC/////2+DNwMAIAMgAykDAEL/////b4M3AwAgBSAFKQMAQv////9fgzcDACADIAMpAwBC/////1+DIhE3AwAgBiABKAIAIgdHDQIgAyAFKQMANwMAIAUgETcDACADIAMpAwBCgICAgIDAAIQ3AwAMBQsgACgCGCABKAIAIgVBEGogAyARpyAFKAIQaiAALwH4ESIFQQN0aiAALwH6EUEBakH//wNxIAVrEOiBgIAADAQLIAYgASgCACIHRg0CCyAHQRBqIBIgAyAFIAAvAfgRIAAvAfoRQQFqQf//A3EQoIGAgABB//8DcSIGRQ0CIAEoAgAhA0G8zceAACEFAkACQAJAAkACQCAGQWVqDggABAECBAIDAwALIA1CADcCACANQQhqQgA3AgAgDUEQakIANwIAIAJBAToAJCACIAMoApgCQQF0NgIgIAJBIGohBQwDCyACQcAAakEIakIANwMAIAJBwABqQRBqQgA3AwAgAkIANwNAIAJBAToAXCACIAMoAqQCQQF0NgJYIAJBwABqIQUMAgsgAkHgAGpBCGpCADcDACACQgA3A2AgAkIANwN4IAJBAToAdCACIAMoApwCQQF0NgJwIAJB4ABqIQUMAQsgDkIANwMAIA5BCGpCADcDACACQgA3A4ABIAJBAToAjAEgAiADKAKgAkEBdDYCiAEgAkGAAWohBQsgAkGkAWogACgCGCADIAUQloGAgAACQCACLwGoAQ4CAQAACwsACyAHQRBqIAUgAC8B+BEiBiADIAYgAC8B+hEg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BCgCGCAEKAIQaiADLwGEAkEDdGopAwBCJYinQQdxDgUBAAAAAgELCyAAKAIYIgQQi4KAgABB//8DcQ0AIAQQn4GAgAALIAAoAhhBlMXHgABBnNTHgAAgARDmgYCAACAAKAIYQQA6ANEBIABB7hFqIgAgAC0AAEEBcjoAAAwBCyAEEJ+BgIAAIAAoAhhBADoA0QELIANBsAJqJICAgIAAC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCOgoCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBwAAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEI6CgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAu3AQECfyOAgICAAEEQayICJICAgIAAAkAgAEHp8smAAEE9EJqAgIAAIgNB//8DcQ0AIAEtAAAhAyACQe7qwIAANgIAIAJBATYCBCACQQlBByADQQFxIgMbNgIMIAJB4azAgABB3JPAgAAgAxs2AgggACACEKmEgIAAIgNB//8DcQ0AIABBpvPJgABBBRCagICAACIDQf//A3ENACAAIAEvAQIQp4SAgAAhAwsgAkEQaiSAgICAACADC6YCAgp/AX4jgICAgABBEGsiASSAgICAACAAKAJYIQJBACEDAkADQCACKAIYIAIoAhAiBGogAi8BrgIiBUEDdGohBiADIAVqIQdBACEIAkADQAJAAkAgCCAFRg0AIAAvAYgBQQFqIQkgBiAIQX9zQQN0aigCACAEaiEKA0AgCUF/aiIJRQ0CIAopAwAhCyAKQQhqIQogC0L+//+DgIADg1ANAAsgAC8BigEgA2shCgwFCyAHIQMgAigCCCICDQMMAgsgAyAALwGKAU8NASAIQQFqIQggA0EBaiEDDAALCwtBACEKCyAKQQFqIQoCQANAAkAgCkF/aiIKDQBBACEJDAILIAFBCGogABCxgYCAACABLwEMIglFDQALCyABQRBqJICAgIAAIAkLyQIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEISEgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEHDABCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQhISAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC6cFAQR/I4CAgIAAQdAQayIDJICAgIAAAkACQAJAAkACQAJAAkACQAJAAkACQCABQf8BcQ4DAQACAwsgACgCGCIBLwHIASABKALEASkDAEKAgICAgIADg0KAgICAgIABUWpBAWohBAwHCyAAKAIYIgQvAcgBIgENAkEAIQEMAwsgAC8B8hEhBAwFCyADIAE6AA8gA0KAEDcCsBAgA0HAv8eAADYCqBAgAyADQRBqNgKsECADQagQaiADQQ9qEKqCgIAAIgBB//8DcUUNAiADQagQakGw6cmAAEEyEKiAgIAAIAMvAcAQDQYgA0GQEGpBEGogA0GoEGpBEGopAgA3AwAgA0GQEGpBCGoiASADQagQakEIaikCADcDACADIAMpAqgQNwOQEAJAIAEgA0EPahCqgoCAAEH//wNxRQ0AIANBkBBqEKmAgIAADAcLIANBxBBqIANBkBBqEKqAgIAAIANBkBBqEKmAgIAAIAMvAcwQDQYgAygCyBAhBCADKALEECEBDAMLIAEgBCgCxAEpAwBCgICAgICAA4NCgICAgICAAlFrQf//A3EhAQsgBBCrgoCAACAALwHyESEEDAMLIAMoAqwQIQEgAygCtBAhBAsgASAEEICAgIAAIABB//8DcUUNAkGw6cmAACABIAQQtoCAgAAMAgtBACEBCyAAKAIYQQA6ANEBIAAoAhgoAsABIgUgBSkDAEKAgICAgMAAhDcDACAAKAIYIgAoAsQBIAAvAcgBQQN0ayABQQN0aiEFIARB//8DcSABayEBIAAoArwBKAIAQRBqIQQgACgCwAEhBgJAIAAtAOECQQNxQQFGDQAgAkEBcQ0AIAAgBCAGIAUgARDogYCAAAwBCyAAIAQgBiAFIAEQ54GAgAALIANB0BBqJICAgIAACzEBAX8CQCAAQavyyYAAQT4QmoCAgAAiAkH//wNxDQAgACABLwEAEKeEgIAAIQILIAILpAMCAX8BfiAAKAIIIAEgAhCMgYCAAEEAIQMCQAJAAkACQAJAAkACQCABQf//A3EiAUHpd2oOAwEFAgALAkACQAJAIAFBfWoOBAUICAEACyABQS9GDQEgAUHFAEYNBQwHCyAAKAIIQQFBARDjgYCAAEEADwsgACgCCEEAIAIQh4KAgAAPCyAAKAIIQQEgAhCHgoCAAA8LIAAoAghBAiACEIeCgIAADwsCQCAAKAIIIgE1AgAgAUEEaiIAMQAAQiCGhCIEQoCAAYNCAFINACAAIARCIIg8AAAgASAEQt///v8Pgz4CAEEADwsgACAEQiCIPAAAIAEgBELf////D4NCIEIAIAJBAXEiABuEPgIAIAEgASgCGEGQAWpBhAFB0AAgABsgAS8B8BEQ2YGAgAAiA0H//wNxDQIgAUECQQAQiIKAgAAgAUEBQQEQ44GAgABBAA8LIAJBAXENASAAKAIIQQA7AfgRIAAoAggiASABLwHyEUF/ajsB+hFBAA8LIAAoAgghAQJAIAJBAXENACABEN2BgIAADwsgARDcgYCAAEEADwsgAwsRACAAIAEvAQBBARCPgoCAAAsRACAAIAEvAQBBABCPgoCAAAsPACAAKAIIQQEQk4KAgAAL7QMDAX8Bfgh/I4CAgIAAQSBrIgIkgICAgAACQAJAAkACQCAANQIAIABBBGoxAABCIIaEIgNCgASDQgBSDQAgAUEBIAFBAUsbIQEMAQsgAUEBIAFBAUsbIQEgA0KAgIKACINQRQ0BCyAAKAIYIgQgASAELwHIASIEIAEgBEkbEOWBgIAAIAAoAhhBADoA0QEMAQsgA0KAgICACIMhAwJAIAAoAhgiBS0A0QFFDQAgBUEAOgDRASABQX9qIQEgACgCGCEFC0EAIAAvAfgRIgYgBS8ByAEiBCAGSRshByAALwH6ESEIIAAvAfYRIQkgAC8B9BEhCgJAIANCAFINACAEIAdHDQAgBS8BygEgCkH//wNxSw0AIAUgBCAKEN6BgIAADAELA0AgBSAEIAdrQf//A3EiBCABIAQgAUkbIgYQ5YGAgAAgASAETQ0BAkACQCAAKAIYIgQvAcoBIgUgCkH//wNxRw0AIAkhBSADUA0DDAELIAVFDQICQCADUEUNACACQQxqIAQoArwBQQEQ34GAgAAgAigCDCILKAIYIAsoAhBqIAIvARBBA3RqLQAEQQFxRQ0DCyAFQX9qIQULIAQgCCAFEN6BgIAAIAEgBkF/c2ohASAAKAIYIgUvAcgBIQQMAAsLIAJBIGokgICAgAALVAECfyABQQN2IQIgAUEHcUHQp8iAAGotAAAhAwJAAkAgAUGABE8NACAAIAJqQQxqIQEMAQsgAiAAKAIEakFAaiEBCyADQf8BcSIAIAEtAABxIABGC5EBAQZ/IAFB//8DcSECQQAhAwJAA0AgAyACRg0BIAAoAggiAUEwaiEEIAEoAhgiBS8ByAEiBiEHAkADQCAHQf//A3EgAS8B+hFPDQEgBUEBEOSBgIAAIAQgASgCGCIFLwHIASIHEJSCgIAAQQFxRQ0ACwsgA0EBaiEDIAZB//8DcSAAKAIIKAIYLwHIAUcNAAsLCw0AIAAoAggQ9oGAgAALMgEBfwJAIAAoAggiABDwgYCAACIBQf//A3ENACAALQAAQQhxRQ0AIAAQ9oGAgAALIAELxQECA38BfgJAIAAoAhgiAS8ByAEiAiAALwHyEUF/aiIDQf//A3FHDQAgASgCwAEiASABKQMAQoCAgIAQhDcDACAAKAIYIQELIAEoAsABKQMAIQQCQCAAEPCBgIAAIgFB//8DcQ0AIAAoAhggAC8B+BEQ94GAgAAgAiADQf//A3FHDQAgACgCGCgCwAEiAiACKQMAQv//////Y4MgBEKAgICAgByDhDcDACAAKAIYKALAASIAIAApAwBCgICAgCCENwMACyABC8QCAQR/I4CAgIAAQTBrIgMkgICAgABBACEEAkAgACgCvAEoAgBBEGogACgCwAEgASACEJqCgIAAQf//A3FFDQAgA0EgakIANwMAIANCADcDGCADQgA3AwggA0EBOgAUIAMgACgCvAEoAgAiBCgCoAJBAXQ2AhAgACgCxAEhBSAALwHIASEGIANBKGogACAEIANBCGoQloGAgAAgAy8BLCIEDQACQAJAAkACQEECIAEgBkEDdCAFa2pBA3YiBCAALwHIASIBSSAEIAFGGw4DAgEAAgsgACgCxAEhAQwCCyAAKALEASABIARrQf//A3FBA3RrIQEMAQsgACgCxAEgBCABa0EDdGohAQtBACEEIAAoArwBKAIAQRBqIAAoAsABIAEgAhCagoCAACIAQf//A3FFDQAgACEECyADQTBqJICAgIAAIAQLqgUDCX8BfgF/I4CAgIAAQTBrIgQkgICAgAAgBCAAKAIoIAAoAgAiBWoiBjYCDCACIAVrIQcCQAJAAkACQCACKQMAQgODQgFRDQAgBEEQaiAAQRxqIgYgBUEBEKiBgIAAIAQvARgiCEUNAQwDC0EAIQkgBkF8aigCAEUNASAGQXBqIQogBkF0aiELIAZBeGooAgAiCEF/aiIMIAcQuoGAgAAiDadxIQIgDUI5iKchDgNAIAYgAmosAAAiAUUNAiAIRQ0CAkAgAUF/Sg0AIA4gAUH/AHFHDQAgByALKAIAIAZqIAJBAnRqKAIARw0AIAooAgAgBmogAkEDdGohCQwDCyAIQX9qIQggAkEBaiAMcSECDAALCyAEKAIQIgggAzsBACAIQQJqIANB////AHFBEHY6AAAgBEEBNgIgIAQgCCAAKAIAazYCHCAEKAIUIQwCQCAEQQxqIAcgBEEcahCpgYCAAEH//wNxRQ0AIAYgACgCACAIIAwQooGAgABBASEIDAILIAIgAikDAEJ8g0IBhDcDACABIAEpAwBCgICAgMAAhDcDAEEAIQgMAQsCQCAJKAIEIgJBA3FFDQAgCSgCACAFaiACQQJ0aiICIAM7AQAgAkECaiADQf///wBxQRB2OgAAIAkgCSgCBEEBajYCBEEAIQgMAQsgBEEkaiAAQRxqIgEgBSACQQFyEKiBgIAAIAQvASwiCA0AIAkoAgAgACgCAGohCCAEKAIkIQICQCAJKAIEIgZBAnQiDEUNACACIAggDPwKAAALIAIgCSgCBEECdGoiDCADOwEAIAxBAmogA0H///8AcUEQdjoAACAJIAIgACgCAGs2AgAgCSAJKAIEQQFqNgIEIAEgACgCACAIIAYQooGAgABBACEICyAEQTBqJICAgIAAIAgLhAQDB38BfgF/I4CAgIAAQdAAayIBJICAgIAAIAAvAc4BIQIgAUEwaiEDAkACQAJAAkADQCABIAAoArwBKAIAIgQoAqQBIAQoAhAiBWo2AgggACgCwAEhBiABQQxqIAFBCGogACgCxAEiByAFaxCrgYCAAAJAIAEvARgNAAJAIAEtABQNACABKAIQIQUMAwsgBEGoAWogBCgCECABKAIQIgUvAQAQpYGAgABCgICAgICACCEIIAUvAQAgAkH//wNxRw0CIAchBgwDCwJAAkAgACgCuAEiBQ0AQQAhBwwBCyAFKAIQIQcLIAQoAqQCIQIgAUEcaiAEQSBqIAQoAhAgBxDAgYCAACACIQUCQAJAIAEvASQNACACIQkMAQsDQCAFIAJrIQYgBSEJIAVBAXQhBSAGIAdJDQALCyADQgA3AwAgAUIANwMoIAFBAToARCABIAk2AkAgAUEBOgA8IAEgBCgCnAJBAXQ2AjggAUHIAGogACAAKAK8ASgCACABQShqEJaBgIAAIAEvAUwiBQ0EIAAvAc4BIgINAAwDCwsgBSACOwEAIAcgBykDAEKAgICAgIAIhDcDAEKAgICAgAIhCAsgBiAGKQMAIAiENwMAIAQoAqwBIAQoAhBqIAAvAc4BQRxsaiIFIAUvARhBAWo7ARgLQQAhBQsgAUHQAGokgICAgAAgBQvVFAUGfwJ+An8BfgV/I4CAgIAAQSBrIgIkgICAgABBACEDAkACQCAAKAIsDQACQAJAIAAoAhgiBC8ByAEiBSAALwH6ESIGSw0AIAZBAWohBwwBCyAALwHyESEHCyAANQIAIABBBGoxAABCIIaEIQhBASEGAkACQAJAAkACQAJAAkACQCABQf///wBxQf8BTQ0AIAhCgICAgIAEgyEJAkAgBUUNACAJUA0AIAdBf2ohCiAEKALEASEGQQEhCwJAIAhCgASDQgBSDQAgBSAKQf//A3FHDQAgBikDACIMQgKDQgGIpyAMQvz//wODUHIhCwsCQCAGIAtBA3RrIg0pAwAiDEKAgICAgIADg0KAgICAgIACUg0AIAYgC0EBaiILQQN0ayINKQMAIQwLIAxCAoNCAFINACAMQvz//wODUA0AQQAhBiACQQA6AAcgDEICiKciDiEPAkAgDKdBAXFFDQAgAiAEKAK8ASgCACIQKAI4IBAoAhAiEGo2AgggAkEMaiACQQhqIA0gEGsQp4GAgAACQAJAIAItABQNAEEAIRAMAQsgAigCDCAQaiEGIAIoAhAhEAsgDiEPA0AgEEUNASAPIAYvAQAgBkECai0AAEEQdHIiESACQQdqEJ2CgIAAGiAGQQRqIQYgEEF/aiEQIBEhDwwACwsgDyABIAJBB2oQnYKAgABBAXENACABQf7//wBxQY78A0cNCEEAIQMgDkH/AXEgDkGA/v8AcUEHdkGUiMKAAGovAQBqQQF0QZSIw4AAai8BAEGU8MaAAGotAABBwABxRQ0KIAxCgICAgICAA4MhCAJAIAFB////AHFBj/wDRw0AIAhCgICAgICAAVENCSAEIAsQ5YGAgAAgACgCGC8ByAEgCkH//wNxIgZHDQggAC0AAUECcUUNCyAAQQBBf0EAIAdB//8DcSAALwHyEUYbEJ6CgIAAIAAQmIKAgAAiA0H//wNxDQsMCAsgCEKAgICAgIABUg0IIA0gDEL9//////98gzcDACAAKAIYKALEASALQX9qQf//A3FBA3RrIgMgAykDAEL///////98gzcDAAJAIAAoAhgiAy8ByAEgCkH//wNxRw0AIANBADoA0QEMCQsgA0EBEOWBgIAADAgLIAFB/wFxIAFBgP7/AHFBB3ZBlIjCgABqLwEAakEBdEGUiMOAAGovAQBBlPDGgABqLQAAQQNxIgYNACAJUEUNCSAFDQEMBQsgACABOwHgESAAQQE6AOQRIABB4hFqIAFBEHZBH3EiAzoAACACIAE7ARggAiADOgAaIAQtANEBRQ0DIAhCgASDQgBSDQEMAwsgBCgCxAEiAEFwaiAAQXhqIgAgACkDAEKAgICAgIADg0KAgICAgIACURsiACkDACIIQgKDQgBSDQMgCEL8//8Dg0IAUQ0DIAFB/v//AHFBjvwDRw0BQQAhAyAIQgKIpyIGQf8BcSAGQYD+/wBxQQd2QZSIwoAAai8BAGpBAXRBlIjDgABqLwEAQZTwxoAAai0AAEECdkEPcUELRw0HDAELIAAQmIKAgAAiA0H//wNxDQYgADUCACAAQQRqMQAAQiCGhCEIDAELIAQgACABEJmCgIAAIQMMBQsCQCAIQgKDUA0AIAYgACgCGC8ByAFqIAAvAfIRTw0AIAAgBhCfgoCAAAsCQAJAAkACQCAGQQFHDQAgACgCGCgCwAEiAyADKQMAQoCAgICAwACENwMAAkACQCAAKAIYIgMtANwCRQ0AIAMoAtgCIQYgA0IANwLYAiAAKAIYIQMMAQsgAygC0AIhBgsgAUEgIAMgBkECdGpBwAJqKAIAIgRBAkkiBhshBQJAIAFB////AHFB/wFLDQAgBg0AQa7wxoAAQa70xoAAIARBAkYbIAFB////AHFBAXRqLwEAIQULAkACQCADKALEASIGKQMAQiqIp0EDcQ4EBAABBAQLIAMvAcgBIAAvAfIRQX9qQf//A3FPDQMgAyADKAK8ASgCAEEQaiADKALAASAGQQhqQQEQ6IGAgAAgACgCGCIBLwHKAUUNAyABLwHIAUECSQ0CDAMLIAMgAygCvAEoAgBBEGogAygCwAEgBkF4akEBEOiBgIAAIAAoAhgiAS8BygFFDQIgAS8ByAFBAkkNAQwCCyAAKAIYIQMCQCAHIAAvAfgRa0H//wNxQQFLDQAgAygCwAEiASABKQMAQoCAgICAwACENwMAIABBAEEAEJ6CgIAADAMLAkAgAy8ByAEgB0F/akH//wNxRw0AIAAtAAFBAnFFDQcgAEEAQX9BACAHQf//A3EgAC8B8hFGGxCegoCAACAAEJiCgIAAIgNB//8DcQ0IIAAoAhghAwsgAygCwAEiAyADKQMAQoCAgICAwACENwMAIAAgAUEBEJ6CgIAAIAAoAhhBARDkgYCAACAAQQBBAhCegoCAAAwCCyABEKCCgIAAIgEgASkDAEL///////98gzcDAAsgACgCGCEEAkAgBikDAEIDg0IBUg0AIAQoArwBKAIAIgFBEGogBhDqgYCAACABLwGsAkEBaiEDIAAoAhgiBCgCwAEiECgCACABKAIQaiEBAkADQCADQX9qIgNFDQEgASkDACEIIAFBCGohASAIQgODQgFRDQIMAAsLIBAgECkDAEL/////v3+DNwMAIAAoAhghBAsCQCAELwHMASAGKQMAIghCGoinIhBB//8DcSIBRiIDDQAgAUUNACAEKAK8ASgCACIBQTxqIAEoAhAgEBCTgYCAACAGKQMAIQgLIAYgCEKAgIB8gyAFrUL///8Ag0IChoQiCTcDACAGIAAoAhgvAcwBIgGtQhqGIAlC/P//n4CAfIOEIgk3AwAgBkKAgICAgIAEQgAgACgCGC0A0gEbIAlC/P//////AIOENwMAAkAgAw0AIAFFDQAgACgCGCgCvAEoAgAiAygCQCADKAIQaiABQSRsaiIBIAEvASBBAWo7ASAgACgCGCgCwAEiASABKQMAQoCAgICAAYQ3AwALAkAgACgCGCIBLwHOAUUNACABEJuCgIAAIgFB//8DcUUNASACIAE7AR4gAkEeahChgoCAAAwBCyAIQoCAgICAgAiDUA0AIAEoArwBKAIAIgFBEGogBhDrgYCAACABLwGsAkEBaiEDIAAoAhgoAsABIgQoAgAgASgCEGohAQJAA0AgA0F/aiIDRQ0BIAEtAAUhBiABQQhqIQEgBkEgcUUNAAwCCwsgBCAEKQMAQv//////fYM3AwALAkAgACgCGCIALwHIASAHQX9qQf//A3FHDQAgAEEBOgDRAQwECyAAQQEQ5IGAgAAMAwsQooKAgAAMAgsgACANKQMAQgKIp0EBEJ6CgIAAIAAoAhhBARDkgYCAACAAQQBBAhCegoCAAAJAIAAoAhgiAy8ByAEgBkcNACADQQE6ANEBDAELIANBARDkgYCAAAsgACgCGCgCwAEiAyADKQMAQoCAgICAwACENwMAIAAoAhggDSABEJmCgIAAIQMMAQtBACEDCyACQSBqJICAgIAAIAMLlQEAIAIgAUH/AXEgAUGA/v8AcUEHdkGUiMKAAGovAQBqQQF0QZSIw4AAai8BAEGU8MaAAGotAABBBHRBwAdxIAItAABBA3EgAEH/AXEgAEGA/v8AcUEHdkGUiMKAAGovAQBqQQF0QZSIw4AAai8BAEGU8MaAAGotAABBPHFyckGsxceAAGotAAAiAEEBdkEDcToAACAAC84HAgZ/An4jgICAgABBEGsiAySAgICAAAJAAkAgACgCGCIELQDcAkUNACAEKALYAiEFIARCADcC2AIgACgCGCEEDAELIAQoAtACIQULAkAgBCAFQQJ0akHAAmooAgAiBUECSQ0AIAFB////AHEhBkEgIQEgBkH/AUsNAEGu8MaAAEGu9MaAACAFQQJGGyAGQQF0ai8BACEBCwJAIAJBA3EgBCgCxAEiBikDAEIqiKdBA3EiBUYNAAJAAkACQCAFDgQDAAEDAwsgBC8ByAEgAC8B8hFBf2pB//8DcU8NAiAEIAQoArwBKAIAQRBqIAQoAsABIAZBCGpBARDogYCAACAAKAIYIgQvAcoBRQ0CIAQvAcgBQQJJDQEMAgsgBCAEKAK8ASgCAEEQaiAEKALAASAGQXhqQQEQ6IGAgAAgACgCGCIELwHKAUUNASAELwHIAUECTw0BCyAEEKCCgIAAIgQgBCkDAEL///////98gzcDAAsgACgCGCEHAkAgBikDAEIDg0IBUg0AIAcoArwBKAIAIgRBEGogBhDqgYCAACAELwGsAkEBaiEFIAAoAhgiBygCwAEiCCgCACAEKAIQaiEEAkADQCAFQX9qIgVFDQEgBCkDACEJIARBCGohBCAJQgODQgFRDQIMAAsLIAggCCkDAEL/////v3+DNwMAIAAoAhghBwsCQCAHLwHMASAGKQMAIglCGoinIghB//8DcSIERiIFDQAgBEUNACAHKAK8ASgCACIEQTxqIAQoAhAgCBCTgYCAACAGKQMAIQkLIAYgCUKAgIB8gyABrUL///8Ag0IChoQiCjcDACAGIAAoAhgvAcwBIgStQhqGIApC/P//n4CAfIMgAq1CA4NCKoaEhCIKNwMAIAZCgICAgICABEIAIAAoAhgtANIBGyAKQvz//////wODhDcDAAJAIAUNACAERQ0AIAAoAhgoArwBKAIAIgUoAkAgBSgCEGogBEEkbGoiBCAELwEgQQFqOwEgIAAoAhgoAsABIgQgBCkDAEKAgICAgAGENwMACwJAAkAgACgCGCIELwHOAUUNACAEEJuCgIAAIgRB//8DcUUNASADIAQ7AQ4gA0EOahChgoCAAAwBCyAJQoCAgICAgAiDUA0AIAQoArwBKAIAIgRBEGogBhDrgYCAACAELwGsAkEBaiEFIAAoAhgoAsABIgYoAgAgBCgCEGohBAJAA0AgBUF/aiIFRQ0BIAQtAAUhACAEQQhqIQQgAEEgcQ0CDAALCyAGIAYpAwBC//////99gzcDAAsgA0EQaiSAgICAAAvUCAMLfwF+A38jgICAgABBkAFrIgIkgICAgAAgACgCGEEAOgDRAQJAIAAoAhgiAy8ByAEiBCAALwH4EUkNACAEIAAvAfoRIgVLDQAgAygCvAEoAgAiBkEQaiEHAkAgAygCxAEiCCkDAEKAgICAgIADg0KAgICAgIACUg0AIAMgByADKALAASAIQXhqQQIQ6IGAgAAgAC8B+hEhBSAAKAIYIgMvAcgBIQQLAkAgBSAEayIFQQFqQf//A3EiBCABIAQgASAESRsiCUYNAAJAIAggBSAJa0H//wNxQQN0IgRqIgEpAwBCgICAgICAA4NCgICAgICAAVINACADIAcgAygCwAEgAUECEOiBgIAACyAIIQUgCCAJQQN0aiIKIQsgCCEMA0ACQAJAAkACQAJAIAwgBGoiAyAISQ0AIAsgBGoiASkDAEIDgyENIAMpAwBCA4NCAVENASANQgFRDQIMBAsgACgCGCEDDAULIAYoAjggBigCECIOaiEPIAQgCmogDmshECAEIAVqIA5rIQ4gDUIBUQ0BIAIgDzYCCCACQQxqIAJBCGogDhChgYCAACACIAIoAhApAgA3AxggAkEIaiACKAIMEKOBgIAAIAJBCGogECACQRhqEKSCgIAADAILIAIgBigCOCAGKAIQIg5qNgIgIAJBJGogAkEgaiAEIApqIA5rEKGBgIAAIAIgAigCKCkCADcDMCACQSBqIAIoAiQQo4GAgAAgAkEgaiAEIAVqIA5rIAJBMGoQpIKAgAAMAQsgAiAPNgI4IAJBPGogAkE4aiAOEKGBgIAAIAIoAkAhDiACQcgAaiACQThqIBAQoYGAgAAgDikCACENIA4gAigCTCIPKQIANwIAIA8gDTcCAAsgASkDAEKAgICAgIAIgyENAkACQCADLQAFQSBxDQAgDVANASACIAYoAqQBIAYoAhAiDmo2AmQgAkHoAGogAkHkAGogBCAKaiAOaxCkgYCAACACKAJsLwEAIQ8gAkHkAGogAigCaBCmgYCAACACQeQAaiAEIAVqIA5rIA8QpYKAgAAMAQsgBigCpAEgBigCECIOaiEPIAQgCmogDmshECAEIAVqIA5rIQ4CQCANQgBSDQAgAiAPNgJUIAJB2ABqIAJB1ABqIA4QpIGAgAAgAigCXC8BACEOIAJB1ABqIAIoAlgQpoGAgAAgAkHUAGogECAOEKWCgIAADAELIAIgDzYCdCACQfgAaiACQfQAaiAOEKSBgIAAIAIoAnwhDiACQYQBaiACQfQAaiAQEKSBgIAAIA4vAQAhDyAOIAIoAogBIhAvAQA7AQAgECAPOwEACyABKQMAIQ0gASADKQMANwMAIAMgDTcDACAFQXhqIQUgCkF4aiEKIAtBeGohCyAMQXhqIQwMAAsLIAMgByADKALAASAIIAkQ6IGAgAAgACgCGCgCwAEiBCAEKQMAQoCAgICAwACENwMACyACQZABaiSAgICAAAtuAQN/I4CAgIAAQSBrIgEkgICAgAAgAUEMaiAAKAK8AUEBEN+BgIAAIAEoAgwiAigCGCACKAIQIgJqIAEvARBBA3RqKAIAIQMgAC8BiAEhACABQSBqJICAgIAAIAMgAmogAEF/akH//wNxQQN0agvJAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQpoKAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQdkAEKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCmgoCAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALxQIBBH8jgICAgABBwBBrIgAkgICAgAAgAEKAEDcCoBAgAEHAv8eAADYCmBAgACAANgKcEAJAAkACQCAAQZgQahCjgoCAACIBQf//A3ENACAAKAKcECECIAAoAqQQIQMMAQsgAEGYEGpBsOnJgABByQAQqICAgAAgAC8BsBANASAAQYAQakEQaiAAQZgQakEQaikCADcDACAAQYAQakEIaiICIABBmBBqQQhqKQIANwMAIAAgACkCmBA3A4AQAkAgAhCjgoCAAEH//wNxRQ0AIABBgBBqEKmAgIAADAILIABBtBBqIABBgBBqEKqAgIAAIABBgBBqEKmAgIAAIAAvAbwQDQEgACgCuBAhAyAAKAK0ECECCyACIAMQgICAgAAgAUH//wNxRQ0AQbDpyYAAIAIgAxC2gICAAAsgAEHAEGokgICAgAALEwAgAEGG9MmAAEHJABCagICAAAufAwMBfwF+Cn8jgICAgABBEGsiAySAgICAACABELqBgIAAIQQCQAJAIAAoAgAiBQ0AIASnIQZBACEHQX8hCAwBCyAFQXhqKAIAIgdBf2oiCCAEp3EhBgsgBUF0aiEJIAVBeGohCiAEQjmIpyELIAchDAJAAkADQCAFIAZqIg0sAAAiDkUNASAMRQ0BAkACQCAOQX9KDQAgCyAOQf8AcUcNACABIAkoAgAgBWogBkECdGoiDigCAEcNASADQQE6AAggBUFwaigCACAFaiAGQQN0aiEGIANBCGohDAwECyAHIAooAgBHDQAgBiAHIA5BAUYbIQcLIAxBf2ohDCAGQQFqIAhxIQYMAAsLIAUgB2ogDSAHIAooAgBJIg4bIAtBgAFyOgAAIAAoAgAiDEF8aiIFIAUoAgBBAWo2AgAgA0EAOgAMIAwgDEFwaigCAGogByAGIA4bIg5BA3RqIQYgDCAMQXRqKAIAaiAOQQJ0aiEOIANBDGohDAsCQCAMLQAAQQFxDQAgDiABNgIACyAGIAIpAgA3AgAgA0EQaiSAgICAAAtNAQF/I4CAgIAAQRBrIgMkgICAgAAgA0EEaiAAIAEQx4GAgAACQCADLQAMDQAgAygCBCABNgIACyADKAIIIAI7AQAgA0EQaiSAgICAAAsyAQF/AkAgAEHP9MmAAEHXABCagICAACICQf//A3ENACAAIAEvAQAQp4SAgAAhAgsgAgseACAAKAIIIAEvAQAgAUECai0AAEEQdHIQnIKAgAALegEDfyABLwEAIQIgACgCCCIBKAIYQQA6ANEBAkACQCABLwH2ESIDIAEoAhgiAC8BygEiBEkNACADIARrIQEMAQsgAS8B8BEgBEF/c2ohAQsgACABQf//A3EiASACQf//A3EiAkEBIAJBAUsbIgIgASACSRsQ6YGAgAALEgAgACgCCCABLwEAEPqBgIAACzcBAX8CQCAAQciwyoAAQTAQmoCAgAAiAkH//wNxDQAgAEGctcqAACABLQAAELOEgIAAIQILIAILhgIDAn8BfgN/I4CAgIAAQSBrIgEkgICAgAAgAEEAOgDRAQJAIAAoAsABIgIpAwAiA0KAgICAEINCAFENACACIANC/////2+DNwMAIAFBDGogACgCvAEiBEEBEM+BgIAAAkAgAS0AHA0AIAEoAgwiBCgCGCAEKAIQaiABLwEQQQN0aiIEIAQpAwBC/////1+DNwMAIAAoArwBIQQLIAQoAgAiBSgCGCAFKAIQIgZqIAQvAQRBA3RqKAIAIAZqIAUvAawCQX9qQf//A3FBA3RqIgQpAwBCgICAgICAA4NCgICAgICAA1INACAAIAVBEGogAiAEQQEQ6IGAgAALIAFBIGokgICAgAALygkDCn8BfgN/I4CAgIAAQfABayICJICAgIAAAkAgAUUNACAAKAIYIgMvAcoBIgQgAC8B9BFJDQAgAC8B9hEiBSAESQ0AIAMvAcgBIgYgAC8B+BEiB0kNACAGIAAvAfoRIghLDQBBACEJAkAgBw0AIAggAC8B8hFBf2pB//8DcU8hCQsgAkEMaiADKAK8ASAFIARrIgZB//8DcRDPgYCAAEGszceAACEFAkAgAi0AHA0AIAJBIGpBCGogAkEMakEIaigCADYCACACIAIpAgw3AyAgAkEBOgAsIAJBIGohBQsgAkEwaiADIAUQhIGAgAACQCACLwE0IgMNACABIAZBAWpB//8DcSIHIAEgB0kbIQggAkHQAGpBCGohCiACQbABakEQaiELIAIoAjAhAQNAAkACQCAHRQ0AIAEoAgAiAygCGCADKAIQaiABLwEEQQN0aiIDIAMpAwAiDEKAgICAgMAAhDcDAAJAAkACQAJAIAcgCE0NACACQTxqIAEgCBDfgYCAACACKAI8IgYoAhAhBSAGKAIYIQ0gAi8BQCEOIAAgASgCAEEQaiADEK2CgIAAIAAgBkEQaiIPIA0gBWogDkEDdGoiBRCtgoCAACAJRQ0BIAUgBSkDAEL/////b4M3AwAgAyADKQMAQv////9vgzcDACAFIAUpAwBC/////1+DNwMAIAMgAykDAEL/////X4MiDDcDACAGIAEoAgAiDUcNAiADIAUpAwA3AwAgBSAMNwMAIAMgAykDAEKAgICAgMAAhDcDAAwFCyAAKAIYIAEoAgAiBUEQaiADIAynIAUoAhBqIAAvAfgRIgVBA3RqIAAvAfoRQQFqQf//A3EgBWsQ6IGAgAAMBAsgBiABKAIAIg1GDQELIA1BEGogDyADIAUgAC8B+BEgAC8B+hFBAWpB//8DcRCggYCAAEH//wNxIgZFDQIgASgCACEDQbzNx4AAIQUCQAJAAkACQAJAIAZBZWoOCAAEAQIEAgMDAAsgCkIANwIAIApBCGpCADcCACAKQRBqQgA3AgAgAkEBOgBUIAIgAygCmAJBAXQ2AlAgAkHQAGohBQwDCyACQfAAakEIakIANwMAIAJB8ABqQRBqQgA3AwAgAkIANwNwIAJBAToAjAEgAiADKAKkAkEBdDYCiAEgAkHwAGohBQwCCyACQZABakEIakIANwMAIAJCADcDkAEgAkIANwOoASACQQE6AKQBIAIgAygCnAJBAXQ2AqABIAJBkAFqIQUMAQsgC0IANwMAIAtBCGpCADcDACACQgA3A7ABIAJBAToAvAEgAiADKAKgAkEBdDYCuAEgAkGwAWohBQsgAkHUAWogACgCGCADIAUQloGAgAACQCACLwHYAQ4CBAAACwALIA1BEGogBSAALwH4ESIGIAMgBiAALwH6ESAGa0EBakH//wNxEK6CgIAADAELIAAoAhggARDOgYCAACAAKAIYIAAvAfgRIAQQ3oGAgAAgACgCGEEAOgDRAQwDCyACQdwBaiABQQEQ34GAgAAgB0F/aiEHIAItAOwBDQAgASACKQLcATcCACABQQhqIAJB3AFqQQhqKAIANgIADAALCyACIAM7ATogAkE6ahCvgoCAAAALIAJB8AFqJICAgIAAC6kEAwN/AX4DfyACKAIAIAEoAgBqIQMCQAJAIAAvAfoRIgQgAC8B8hFBf2pB//8DcUYNACAALwH4EUEBSw0BCyADIAEvAZwCQX9qQf//A3FBA3RqIgUpAwAiBkKAgICAgIADg0KAgICAgIADUg0AIAUgBkL///////98gzcDACAALwH6ESEECyADIARB//8DcUEDdGohBwJAIAMgAC8B+BEiBEEDdGoiCCkDAEKAgICAgIADg0KAgICAgIACUg0AAkAgAyAEQX9qQf//A3FBA3RqIgkpAwBCA4NCAVINACABIAkQ6oGAgAAgAS8BnAJBAWohBSACKAIAIAEoAgBqIQQCQANAIAVBf2oiBUUNASAEKQMAIQYgBEEIaiEEIAZCA4NCAVENAgwACwsgAiACKQMAQv////+/f4M3AwALIAkgCSkDAEKDgID8//98gzcDACAIIAgpAwBC////////fIM3AwALAkAgBykDACIGQoCAgICAgAODQoCAgICAgAFRDQAPCyADIAAvAfoRQQFqQf//A3FBA3RqIQACQCAGQgODQgFSDQAgASAHEOqBgIAAIAEvAZwCQQFqIQUgAigCACABKAIAaiEEAkADQCAFQX9qIgVFDQEgBCkDACEGIARBCGohBCAGQgODQgFRDQIMAAsLIAIgAikDAEL/////v3+DNwMACyAHIAcpAwBCg4CA/P//fIM3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QYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCGhICAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMhCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQhoSAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACw8AIAAoAghBABCygoCAAAviAwEDfyOAgICAAEHQEGsiAiSAgICAAAJAAkACQAJAIAFB/wFxDgQAAgIBAgsgACgCGC8ByAEiAUEHcSEDIAFBA3YhBAJAIAFB/wNLDQAgACAEaiIBIANB0KfIgABqLQAAIAEtADxzOgA8DAMLIAQgACgCNGpBQGoiASADQdCnyIAAai0AACABLQAAczoAAAwCCyAAQTBqQQAQiYGAgAAMAQsgAiABOgAPIAJCgBA3ArAQIAJBwL/HgAA2AqgQIAIgAkEQajYCrBACQAJAIAJBqBBqIAJBD2oQs4KAgAAiAUH//wNxRQ0AIAJBqBBqQbDpyYAAQTsQqICAgAAgAi8BwBANAiACQZAQakEQaiACQagQakEQaikCADcDACACQZAQakEIaiIAIAJBqBBqQQhqKQIANwMAIAIgAikCqBA3A5AQAkAgACACQQ9qELOCgIAAQf//A3FFDQAgAkGQEGoQqYCAgAAMAwsgAkHEEGogAkGQEGoQqoCAgAAgAkGQEGoQqYCAgAAgAi8BzBANAiACKALIECEDIAIoAsQQIQAMAQsgAigCrBAhACACKAK0ECEDCyAA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aiIDOgCcEQwCCyAALQCcESIDQRdLDQIgACADQQF0aiAALwGUETsB5BAgAC0AnBEhAwJAIAFB/wFxQTpHDQAgACAALwEQIABBEmoiBy0AAEEQdHJBASADQf8BcXRyIgk7ARAgByAJQRB2OgAACyAAQQA6AJ0RIABBADsBlBEgACADQQFqOgCcEQwCCyACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGoQvIKAgAAiA0H//wNxRQ0AIAJBqChqQbDpyYAAQSwQqICAgAAgAi8BwCgNAyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiIHIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgBxC8goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADAQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDQMgAigCyCghCSACKALEKCEHDAELIAIoAqwoIQcgAigCtCghCQsgByAJEICAgIAAIANB//8DcUUNAUGw6cmAACAHIAkQtoCAgAAMAQsgAkECOgCwASADQf8BcSEHIABB5BBqIQkgAEGXEWohCiAALwEQIABBEmotAABBEHRyIQMgAC0AmxEhCwJAAkAgAUH/AXFB7QBGDQAgA0H///8HcUUNACACIAM7AcQBIAJBxgFqIANBEHY6AAAgAiABOgDIASACIAc2AsABIAIgCTYCvAEgAiALNgK4ASACIAo2ArQBIAIgAi0AsAE6AOABIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkG0AWoQvYKAgAAiA0H//wNxDQAgAigCrCghByACKAK0KCEJDAILIAJBqChqQbDpyYAAQdUAEKiAgIAAIAIvAcAoDQIgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGoiByACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAcgAkG0AWoQvYKAgABB//8DcUUNACACQZAoahCpgICAAAwDCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0CIAIoAsgoIQkgAigCxCghBwwBCyACIAM7AfQBIAJB5AFqQRJqIANBEHY6AAAgAiABOgD4ASACIAc2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QbQUahC/goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADIwBCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA2LASACKALIKCEFIAIoAsQoIQQMhwELIAhFDYQBIAIgCDYC2AUgAiAENgLUBSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB1AVqEMCCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQyEAQsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNigEgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB1AVqEMCCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMiwELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDYoBIAIoAsgoIQUgAigCxCghBAyDAQsgCEUNgQEgAiAINgL4BSACIAQ2AvQFIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkH0BWoQwYKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDIEBCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA2JASACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH0BWoQwYKAgABB//8DcUUNACACQZAoahCpgICAAAyKAQsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNiQEgAigCyCghBSACKALEKCEEDIABCyAIRQ19IAIgCDYCnAYgAiAENgKYBiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBmAZqEMKCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQx9CyACQagoakGw6cmAAEHFABCogICAACACLwHAKA2IASACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGYBmoQwoKAgABB//8DcUUNACACQZAoahCpgICAAAyJAQsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNiAEgAigCyCghBSACKALEKCEEDHwLIAhFDXogAiAINgLABiACIAQ2ArwGIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkG8BmoQw4KAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDHoLIAJBqChqQbDpyYAAQcUAEKiAgIAAIAIvAcAoDYcBIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbwGahDDgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADIgBCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA2HASACKALIKCEFIAIoAsQoIQQMeQsgCEUNdyACIAg2AuAGIAIgBDYC3AYgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQdwGahDEgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMdwsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNhgEgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB3AZqEMSCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMhwELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDYYBIAIoAsgoIQUgAigCxCghBAx2C0HasseAAEHcsseAACAELQAAQT9GGyEBDHQLQdqyx4AAQdyyx4AAIAQtAABBP0YbIQEMcgsgCEUNcCACIAg2AuAHIAIgBDYC3AcgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQdwHahDFgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMcAsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNgwEgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB3AdqEMWCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMhAELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDYMBIAIoAsgoIQUgAigCxCghBAxvCyAIRQ1tIAIgCDYCgAggAiAENgL8ByACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB/AdqEMaCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxtCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA2CASACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH8B2oQxoKAgABB//8DcUUNACACQZAoahCpgICAAAyDAQsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNggEgAigCyCghBSACKALEKCEEDGwLIAhFDWogAiAINgKgCCACIAQ2ApwIIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGcCGoQx4KAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDGoLIAJBqChqQbDpyYAAQcUAEKiAgIAAIAIvAcAoDYEBIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZwIahDHgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADIIBCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA2BASACKALIKCEFIAIoAsQoIQQMaQsgCEUNZyACIAg2AsAIIAIgBDYCvAggAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQbwIahDIgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMZwsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNgAEgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBvAhqEMiCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMgQELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDYABIAIoAsgoIQUgAigCxCghBAxmCyAIRQ1kIAIgCDYC4AggAiAENgLcCCACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB3AhqEMmCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxkCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA1/IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdwIahDJgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADIABCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1/IAIoAsgoIQUgAigCxCghBAxjCyAHDgJ9AV8LIAIgCDYCmAkgAiAENgKUCSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQZQJahDKgoCAACIBQf//A3FFDV8gAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNfSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGUCWoQyoKAgABB//8DcUUNACACQZAoahCpgICAAAx+CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA19IAIoAsgoIQUgAigCxCghBAxgCwJAAkAgBS8BAA4GfV8AX18BXwsgABCxgoCAAAxeCyAAELSCgIAADF0LIAQtAABBP0YNWgxbCyAIRQ1YIAIgCDYCuAkgAiAENgK0CSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBtAlqEMuCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxYCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA16IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbQJahDLgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHsLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXogAigCyCghBSACKALEKCEEDFcLIAhFDVUgAiAINgLYCSACIAQ2AtQJIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkHUCWoQzIKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDFULIAJBqChqQbDpyYAAQcUAEKiAgIAAIAIvAcAoDXkgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB1AlqEMyCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMegsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNeSACKALIKCEFIAIoAsQoIQQMVAsgCEUNUiACIAg2AvgJIAIgBDYC9AkgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQfQJahDNgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMUgsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNeCACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH0CWoQzYKAgABB//8DcUUNACACQZAoahCpgICAAAx5CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA14IAIoAsgoIQUgAigCxCghBAxRCyAIRQ1NIAIgCDYCmAogAiAENgKUCiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBlApqEM6CgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxNCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA13IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZQKahDOgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHgLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXcgAigCyCghBSACKALEKCEEDEwLQeiyx4AAQfCyx4AAQfiyx4AAIAQtAAAiAUE9RhsgAUE+RhshAQxKCyAIRQ1IIAIgCDYC0AogAiAENgLMCiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBzApqEM+CgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxICyACQagoakGw6cmAAEHFABCogICAACACLwHAKA11IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQcwKahDPgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHYLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXUgAigCyCghBSACKALEKCEEDEcLIAhFDUUgAiAINgLwCiACIAQ2AuwKIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkHsCmoQ0IKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDEULIAJBqChqQbDpyYAAQcUAEKiAgIAAIAIvAcAoDXQgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB7ApqENCCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMdQsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNdCACKALIKCEFIAIoAsQoIQQMRAsCQCAIRQ0AIAIgCDYClAsgAiAENgKQCyACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBkAtqENGCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxECyACQagoakGw6cmAAEHFABCogICAACACLwHAKA10IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZALahDRgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHULIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXQgAigCyCghBSACKALEKCEEDEMLIAdBAUYNQSAlIAovAAA7AAAgAiALOwGECyACQYYLaiALQRB2OgAAICVBAmogCkECai0AADoAACACQecAOgCICyACIFI6AIcLIAIgBzYCgAsgAiAFNgL8CiACQQA2AvgKIAIgBDYC9AogAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQfQKahDSgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMQQsgAkGoKGpBsOnJgABBLxCogICAACACLwHAKA1zIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQfQKahDSgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXMgAigCyCghBSACKALEKCEEDEALA0AgB0UNcyACQbALaiAFLwEAIgEgCEUQ04KAgAACQAJAIAItALILRQ0AIAIgAi8BsAs7AbQLIAAgAkG0C2oQkIKAgAAiBEH//wNxDXgMAQsgAiABOwG2CyACQbYLahDUgoCAAAsgBUECaiEFIAdBf2ohBwwACwtB+LLHgAAhAQxFC0HcsseAACEBDF4LQdyyx4AAIQEMXgsgACgCCCgCGCgCwAEiASkDAEL//////2ODIQYCQCAHQR50QYCAgIB8akEedUF/Sg0AIAEgBkKAgICAgASENwMAIAAoAggiASABLwHsEUH+/wNxIAdBCHZBAXFyOwHsEQxvCyABIAZCgICAgIAIhDcDAAxuCyAIIAUQ1YKAgABBAXENbSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGoQ1oKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQcYAEKiAgIAAIAIvAcAoDW4gAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgDCACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwQ1oKAgABB//8DcUUNACACQZAoahCpgICAAAxvCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1uIAIoAsgoIQUgAigCxCghBAsgBCAFEICAgIAAIAFFDW1BsOnJgAAgBCAFELaAgIAADG0LIAEvASohUyABLQApIVQgAS0AKCFVIFAgCi8AADsAACBPIAFBGGoiASkCADcCACBQQQJqIApBAmotAAA6AAAgT0EIaiABQQhqKQIANwIAIAIgCToAoBcgAiAHNgKYFyACIAU2ApQXIAIgCDYCkBcgAiAENgKMFyACIFM7AbYXIAIgVDoAtRcgAiBVOgC0FyACIFJBGHQgC0H///8HcXI2ApwXIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQYwXahDXgoCAAEH//wNxIgFFDQAgAkGoKGpBsOnJgABBLxCogICAACACLwHAKA1uIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAwgAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBjBdqENeCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMbwsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNbiACKALIKCEFIAIoAsQoIQQMAQsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUUNbEGw6cmAACAEIAUQtoCAgAAMbAsgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqENiCgIAAQf//A3EiAUUNACACQagoakGw6cmAAEExEKiAgIAAIAIvAcAoDW0gAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgDCACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwQ2IKAgABB//8DcUUNACACQZAoahCpgICAAAxuCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1tIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABRQ1rQbDpyYAAIAQgBRC2gICAAAxrCyAAKAIIKAIYEISCgIAADGoLAkACQAJAAkAgBUFsakFwSQ0AQQBBNyAFQQJ0QfzSx4AAaigCACIEayIBIAFBN0sbQQFqIQcgBEEDdEHczceAAGohASAEQQJ0QZzRx4AAaiEEA0AgAUEEaigCACAFRw0BIAEoAgAgBSAIENmCgIAAQQFxDQIgAUEIaiEBIARBBGohBCAHQX9qIgcNAAsLIAIgBTYCiBcgAiAINgKEFyACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQYQXahDagoCAAEH//wNxIgENASACKAKsKCEEIAIoArQoIQUMAgsgACgCCCAEKAIANgLoEQxrCyACQagoakGw6cmAAEEqEKiAgIAAIAIvAcAoDWogAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgDCACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGEF2oQ2oKAgABB//8DcUUNACACQZAoahCpgICAAAxrCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1qIAIoAsgoIQUgAigCxCghBAsgBCAFEICAgIAAIAFFDWlBsOnJgAAgBCAFELaAgIAADGkLIAAoAggoAhgoAsABIgEgASkDAEL//////2ODQoCAgICADIQ3AwAMaAsgACgCCCgCGCgCwAEiASABKQMAQv//////Y4NCgICAgIAQhDcDAAxnCyAAKAIIKAIYKALAASIBIAEpAwBC//////9jg0KAgICAgAyENwMADGYLIAAoAggoAhggByBSQRh0IAtB////B3FyIAggBRDTgYCAACIEQf//A3ENaAxlCwJAIAhFDQAgAiABOwD1FiACQewWakELaiABQRB2OgAAIAJBPjoA9BYgAiAINgLwFiACIAQ2AuwWIAJB7BZqENuCgIAADGULIABBhPnGgAAQkYKAgAAhBAwXCwJAIAhFDQAgAiABOwDpFiACQeAWakELaiABQRB2OgAAIAJBPToA6BYgAiAINgLkFiACIAQ2AuAWIAJB4BZqENuCgIAADGQLIABBhPnGgAAQkIKAgAAhBAwWCwJAIAhFDQAgAiABOwDdFiACQdQWakELaiABQRB2OgAAIAJB/AA6ANwWIAIgCDYC2BYgAiAENgLUFiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkHUFmoQ3IKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQTsQqICAgAAgAi8BwCgNZCACQZAoakEQaiACQagoakEQaikCADcDACAMIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdQWahDcgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADGULIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDWQgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUUNY0Gw6cmAACAEIAUQtoCAgAAMYwsgAEH4+MaAABD8gYCAAAxiCwJAIAhFDQAgAiABOwDRFiACQcgWakELaiABQRB2OgAAIAJB/QA6ANAWIAIgCDYCzBYgAiAENgLIFiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkHIFmoQ3YKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQTsQqICAgAAgAi8BwCgNYyACQZAoakEQaiACQagoakEQaikCADcDACAMIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQcgWahDdgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADGQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDWMgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUUNYkGw6cmAACAEIAUQtoCAgAAMYgsgAEHs+MaAABD8gYCAAAxhCwJAIAhFDQAgAiABOwDFFiACQbwWakELaiABQRB2OgAAIAJB/gA6AMQWIAIgCDYCwBYgAiAENgK8FiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkG8FmoQ3oKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQTsQqICAgAAgAi8BwCgNYiACQZAoakEQaiACQagoakEQaikCADcDACAMIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbwWahDegoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADGMLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDWIgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUUNYUGw6cmAACAEIAUQtoCAgAAM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qICAgAAgAi8BwCgNTCACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGUFGoQ64KAgABB//8DcUUNACACQZAoahCpgICAAAxNCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1MIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDUpBsOnJgAAgBCAFELaAgIAADEoLAkAgCEUNACACIAg2ApAUIAIgBDYCjBQgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJBjBRqEOyCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQwBCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA1LIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQYwUahDsgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADEwLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUsgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUH//wNxRQ1KQbDpyYAAIAQgBRC2gICAAAxKC0EBIQECQAJAAkAgBw4CAQACCyAFLwEAIQELIAAoAggiBCAEKAIYLwHKAUEBakH//wNxIAEQ44GAgAAMSgsgTSAKLwAAOwAAIAIgCzsBhBQgAkGGFGogC0EQdjoAACBNQQJqIApBAmotAAA6AAAgAiAJOgCIFCACIFI6AIcUIAIgBzYCgBQgAiAFNgL8EyACQQA2AvgTIAIgBDYC9BMgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJB9BNqEO2CgIAAIgFB//8DcUUNACACQagoakGw6cmAAEEpEKiAgIAAIAIvAcAoDUsgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB9BNqEO2CgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAM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QZwRahD5goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADEQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUMgAigCyCghBSACKALEKCEEDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAdFDQAgBS8BAEFyag4KAgEDAQQBAQUGBwELIDggCi8AADsAACACIAs7AZQRIAJBlhFqIAtBEHY6AAAgOEECaiAKQQJqLQAAOgAAIAJB9AA6AJgRIAIgUjoAlxEgAkEANgKQESACIAU2AowRIAJBADYCiBEgAiAENgKEESACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQYQRahD6goCAACIBQf//A3FFDQ8gAkGoKGpBsOnJgABBNRCogICAACACLwHAKA1TIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQYQRahD6goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADFQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDVMgAigCyCghBSACKALEKCEEDBALIDkgCi8AADsAACACIAs7AfwQIAJB/hBqIAtBEHY6AAAgOUECaiAKQQJqLQAAOgAAIAJB9AA6AIARIAIgUjoA/xAgAiAHNgL4ECACIAU2AvQQIAJBADYC8BAgAiAENgLsECACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQewQahD7goCAACIBQf//A3FFDQwgAkGoKGpBsOnJgABBwQAQqICAgAAgAi8BwCgNUiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkHsEGoQ+4KAgABB//8DcUUNACACQZAoahCpgICAAAxTCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1SIAIoAsgoIQUgAigCxCghBAwNCyAHQQFGDVEgOiAKLwAAOwAAIAIgCzsB7A8gAkHuD2ogC0EQdjoAACA6QQJqIApBAmotAAA6AAAgAkH0ADoA8A8gAiBSOgDvDyACIAc2AugPIAIgBTYC5A8gAkEANgLgDyACIAQ2AtwPIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkHcD2oQ/IKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAsLIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNUSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkHcD2oQ/IKAgABB//8DcUUNACACQZAoahCpgICAAAxSCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1RIAIoAsgoIQUgAigCxCghBAwKCyAHQQFGDVAgOyAKLwAAOwAAIAIgCzsBhBAgAkGGEGogC0EQdjoAACA7QQJqIApBAmotAAA6AAAgAkH0ADoAiBAgAiBSOgCHECACIAc2AoAQIAIgBTYC/A8gAkEANgL4DyACIAQ2AvQPIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkH0D2oQ/YKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAkLIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNUCACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH0D2oQ/YKAgABB//8DcUUNACACQZAoahCpgICAAAxRCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1QIAIoAsgoIQUgAigCxCghBAwICyAHQQFGDU8gPCAKLwAAOwAAIAIgCzsBnBAgAkGeEGogC0EQdjoAACA8QQJqIApBAmotAAA6AAAgAkH0ADoAoBAgAiBSOgCfECACIAc2ApgQIAIgBTYClBAgAkEANgKQECACIAQ2AowQIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGMEGoQ/oKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAcLIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNTyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGMEGoQ/oKAgABB//8DcUUNACACQZAoahCpgICAAAxQCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1PIAIoAsgoIQUgAigCxCghBAwGCyAHQQFGDU4gPSAKLwAAOwAAIAIgCzsBtBAgAkG2EGogC0EQdjoAACA9QQJqIApBAmotAAA6AAAgAkH0ADoAuBAgAiBSOgC3ECACIAc2ArAQIAIgBTYCrBAgAkEANgKoECACIAQ2AqQQIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGkEGoQ/4KAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAULIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNTiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGkEGoQ/4KAgABB//8DcUUNACACQZAoahCpgICAAAxPCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1OIAIoAsgoIQUgAigCxCghBAwECyAHQX5xQQJGDQEMAgsCQCAHQX5xQQJHDQAgBS8BAg4DTQBNAAsgPyAKLwAAOwAAIAIgCzsB5BAgAkHmEGogC0EQdjoAACA/QQJqIApBAmotAAA6AAAgAkH0ADoA6BAgAiBSOgDnECACIAc2AuAQIAIgBTYC3BAgAkEANgLYECACIAQ2AtQQIAJB1BBqEICDgIAADEwLIAUvAQIOA0sASwALID4gCi8AADsAACACIAs7AcwQIAJBzhBqIAtBEHY6AAAgPkECaiAKQQJqLQAAOgAAIAJB9AA6ANAQIAIgUjoAzxAgAiAHNgLIECACIAU2AsQQIAJBADYCwBAgAiAENgK8ECACQbwQahCAg4CAAAxKCyAEIAUQgICAgAAgAUH//wNxRQ1JQbDpyYAAIAQgBRC2gICAAAxJCyAEIAUQgICAgAAgAUH//wNxRQ1IQbDpyYAAIAQgBRC2gICAAAxICyAEIAUQgICAgAAgAUH//wNxRQ1HQbDpyYAAIAQgBRC2gICAAAxHCyAEIAUQgICAgAAgAUH//wNxRQ1GQbDpyYAAIAQgBRC2gICAAAxGCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDURBsOnJgAAgBCAFELaAgIAADEQLIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNQkGw6cmAACAEIAUQtoCAgAAMQgsgBCAFEICAgIAAIAFB//8DcUUNQUGw6cmAACAEIAUQtoCAgAAMQQsgMyAKLwAAOwAAIAIgCzsB1A8gAkHWD2ogC0EQdjoAACAzQQJqIApBAmotAAA6AAAgAkHzADoA2A8gAiBSOgDXDyACIAc2AtAPIAIgBTYCzA8gAiAINgLIDyACIAQ2AsQPIAJBxA9qEIGDgIAADEALAkACQAJAAkACQAJAIAQtAABBQmoOAgACAQtBgAIhASAHDgIEAwILIDUgCi8AADsAACACIAs7AbwPIAJBvg9qIAtBEHY6AAAgNUECaiAKQQJqLQAAOgAAIAJB8wA6AMAPIAIgUjoAvw8gAiAHNgK4DyACIAU2ArQPIAJBATYCsA8gAiAENgKsDyACQawPahD2goCAAAxDCwNAIAdFDUMgAkH2DmogBS8BACIBQQAQ04KAgAACQAJAIAItAPgORQ0AIAAoAggiAUEMajEAACFWIAE1AgghVyABQQRqMQAAIVggATUCACFZAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIvAfYOIgRBf2oOGQE2AgMEBQYHCDY2CTY2NjY2NjY2NjY2NgoACwJAIARBmHhqDhEQNhESExQVFjY2NjY2NjYXGAALAkAgBEH1d2oODxkaNjYbNjY2NjYcNh0eHwALAkAgBEGWcGoOBiEiNjY2IwALAkAgBEFTag4DDDYNAAsCQCAEQb5/ag4EDjY2DwALQgEhBkL+/////x8hWgJAIARB/v99ag4DJjYlAAsgBEEoRg0KIARB1A9GDR8gBEGAEEYNIwJAIARBjIACRw0AQgQhBkL7/////x8hWgwmC0IIIQZC9/////8fIVoMJQtCECEGQu//////HyFaDCQLQt//////HyFaQiAhBgwjC0LAACEGQr//////HyFaDCILQoABIQZC//7///8fIVoMIQtCgAIhBkL//f///x8hWgwgC0KABCEGQv/7////HyFaDB8LQoAIIQZC//f///8fIVoMHgtCgBAhBkL/7////x8hWgwdC0KAICEGQv/f////HyFaDBwLQoDAACEGQv+/////HyFaDBsLQoCAASEGQv///v//HyFaDBoLQoCAAiEGQv///f//HyFaDBkLQoCABCEGQv//+///HyFaDBgLQoCACCEGQv//9///HyFaDBcLQoCAECEGQv//7///HyFaDBYLQoCAICEGQv//3///HyFaDBULQoCAwAAhBkL//7///x8hWgwUC0KAgIABIQZC/////v8fIVoMEwtCgICAAiEGQv////3/HyFaDBILQoCAgAQhBkL////7/x8hWgwRC0KAgIAIIQZC////9/8fIVoMEAtCgICAECEGQv///+//HyFaDA8LQoCAgCAhBkL////f/x8hWgwOC0KAgIDAACEGQv///7//HyFaDA0LQoCAgIABIQZC//////4fIVoMDAtCgICAgAIhBkL//////R8hWgwLC0KAgICABCEGQv/////7HyFaDAoLQoCAgIAIIQZC//////cfIVoMCQtCgICAgBAhBkL/////7x8hWgwIC0KAgICAICEGQv/////fHyFaDAcLQoCAgIDAACEGQv////+/HyFaDAYLQoCAgICAASEGQv//////HiFaDAULQoCAgICAAiEGQv//////HSFaDAQLQoCAgICABCEGQv//////GyFaDAMLQoCAgICACCEGQv//////FyFaDAILQoCAgICAECEGQv//////DyFaDAELQgIhBkL9/////x8hWgsgASAGIFkgWEIghoSDIFogVyBWQiCGhIOEIgY+AgggAUEMaiAGQiCIPAAADAELIAIgATsB+g4gAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJB+g5qEIKDgIAAIgFB//8DcUUNACACQagoakGw6cmAAEEsEKiAgIAAIAIvAcAoDQIgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB+g5qEIKDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMAwsgAkHEKGogAkGQ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IAJBkChqEKmAgIAAIAIvAcwoDQQgAigCyCghCCACKALEKCEEDAILIAFBBGogBkIgiDwAACABIAZC/f///w+DIFpCAoMiBoQ+AgAgBkIBiKchAQwCCyACKAKsKCEEIAIoArQoIQgLIAQgCBCAgICAACABQf//A3FFDQFBsOnJgAAgBCAIELaAgIAADAELIAAgBCABEI+CgIAAIgRB//8DcQ1BCyAFQQJqIQUgB0F/aiEHDAALCwJAAkACQAJAIAcOAwABAgMLIABBhrPHgAAQtoKAgAAMPgsgAkEAOwH+DSACIAUvAQA7AfwNIAAgAkH8DWoQtoKAgAAMPQsgAiAFKAEANgGADiAAIAJBgA5qELaCgIAADDwLIDEgCi8AADsAACACIAs7AZQOIAJBlg5qIAtBEHY6AAAgMUECaiAKQQJqLQAAOgAAIAJB8gA6AJgOIAIgUjoAlw4gAiAHNgKQDiACIAU2AowOIAJBADYCiA4gAiAENgKEDiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkGEDmoQhoOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQS0QqICAgAAgAi8BwCgNPSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGEDmoQhoOAgABB//8DcUUNACACQZAoahCpgICAAAw+CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA09IAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDTtBsOnJgAAgBCAFELaAgIAADDsLAkAgCEEBRg0AIAIgCDYC+A0gAiAENgL0DSACQfQNahCHg4CAAAw7CwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQtAAAiAUFgag4DAAMBAgtCACEGQQEhASAHDgITAwQLQYCzx4AAIQEgBw4CCwgJCyABQT5GDU0LIAJBATYC8A0gAiAENgLsDSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB7A1qEIiDgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQwSCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA1MIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQewNahCIg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADE0LIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUwgAigCyCghBSACKALEKCEEDBELQQIhAUKAICEGIAUvAQAiBA4HDQ4NDwMBAgQLIC4gCi8AADsAACACIAs7AcwNIAJBzg1qIAtBEHY6AAAgLkECaiAKQQJqLQAAOgAAIAJB8QA6ANANIAIgUjoAzw0gAiAHNgLIDSACIAU2AsQNIAJBATYCwA0gAiAENgK8DSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQbwNahCJg4CAACIBQf//A3FFDQogAkGoKGpBsOnJgABBNRCogICAACACLwHAKA1KIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbwNahCJg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADEsLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUogAigCyCghBSACKALEKCEEDAsLQQAhAQwNC0EAIQELQgAhBgwLCyACIAQ7AboNIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoIAJBqChqIAJBug1qEIqDgIAAIgFB//8DcUUNBCACQagoakGw6cmAAEEvEKiAgIAAIAIvAcAoDUYgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBug1qEIqDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMRwsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNRiACKALIKCEFIAIoAsQoIQQMBQsgBS8BACIBQQNJDQELQYSzx4AAIQEMAQsgAUECdEHwuMqAAGooAgAhAQsCQAJAAkACQAJAAkAgAS0AAUUNACAAKAIIIgUoAhghBCABLQAAQQNxDgMBAgMBCyAvIAovAAA7AAAgAiALOwHkDSACQeYNaiALQRB2OgAAIC9BAmogCkECai0AADoAACACQfEAOgDoDSACIFI6AOcNIAIgBzYC4A0gAiAFNgLcDSACQQE2AtgNIAIgBDYC1A0gAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCggAkGoKGogAkHUDWoQi4OAgAAiAUH//wNxRQ0DIAJBqChqQbDpyYAAQTgQqICAgAAgAi8BwCgNRyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkHUDWoQi4OAgABB//8DcUUNACACQZAoahCpgICAAAxICyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1HIAIoAsgoIQUgAigCxCghBAwECyAEQQA6ANIBDEYLIARBAToA0gEgBSgCGEEBOgDhAgxFCyAEQQE6ANIBIAUoAhhBAjoA4QIMRAsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ1CQbDpyYAAIAQgBRC2gICAAAxCCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDUBBsOnJgAAgBCAFELaAgIAADEALIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNPkGw6cmAACAEIAUQtoCAgAAMPgtCACEGC0EBIQELIAAoAggiBCAENQIAQv/f//8PgyAGhD4CACAAKAIIKAIYIAE6ANABDDsLIAQgBRCAgICAACABQf//A3FFDTpBsOnJgAAgBCAFELaAgIAADDoLAkAgCEECRg0AIAIgCDYCtA0gAiAENgKwDSACQbANahCHg4CAAAw6CwJAIAQtAABBP0cNACAELQABQSRHDQAgB0EBRg06IC0gCi8AADsAACACIAs7AagNIAJBqg1qIAtBEHY6AAAgAkECNgKcDSAtQQJqIApBAmotAAA6AAAgAkHwADoArA0gAiBSOgCrDSACIAc2AqQNIAIgBTYCoA0gAiAENgKYDSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkGYDWoQjIOAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQSwQqICAgAAgAi8BwCgNOyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGYDWoQjIOAgABB//8DcUUNACACQZAoahCpgICAAAw8CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA07IAIoAsgoIQUgAigCxCghBAsgBCAFEICAgIAAIAFB//8DcUUNOkGw6cmAACAEIAUQtoCAgAAMOgsgAkECNgKUDSACIAQ2ApANIAJBkA1qEIeDgIAADDkLAkACQAJAAkACQAJAAkACQAJAAkACQCAIRQ0AIAQtAAAiAUE/Rw0FIAdBAUcNASAIQQFGDQMgLCAKLwAAOwAAIAIgCzsB5AwgAkHmDGogC0EQdjoAACAsQQJqIApBAmotAAA6AAAgAkHuADoA6AwgAiBSOgDnDCACQQE2AuAMIAIgBTYC3AwgAiAINgLYDCACIAQ2AtQMIAJB1AxqEL6CgIAADEMLIAdBAUYNAQsgKyAKLwAAOwAAIAIgCzsBzAwgAkHODGogC0EQdjoAACArQQJqIApBAmotAAA6AAAgAkHuADoA0AwgAiBSOgDPDCACIAc2AsgMIAIgBTYCxAwgAiAINgLADCACIAQ2ArwMIAJBvAxqEI2DgIAADEELAkACQCAFLwEAQXtqDgIAAQMLIAAoAgwgAEHupMCAAEEEEP2BgIAAIQQMGQsgACgCCCIBKAIYIgUvAcoBIQQgBS8ByAEhBSABLQABQQFxDQMMBwsgBS8BAEHkB0YNFgsgKiAKLwAAOwAAIAIgCzsB/AwgAkH+DGogC0EQdjoAACAqQQJqIApBAmotAAA6AAAgAkHuADoAgA0gAiBSOgD/DCACQQE2AvgMIAIgBTYC9AwgAiAINgLwDCACIAQ2AuwMIAJB7AxqEI2DgIAADD4LAkAgCEEBRg0AIAIgCDYCjA0gAiAENgKIDSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBiA1qEI6DgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQwFCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA0+IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQYgNahCOg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADD8LIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDT4gAigCyCghBSACKALEKCEEDAQLIAFBPkYNAiACIAE6AIcNIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGHDWoQj4OAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAILIAJBqChqQbDpyYAAQTQQqICAgAAgAi8BwCgNPSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGHDWoQj4OAgABB//8DcUUNACACQZAoahCpgICAAAw+CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA09IAIoAsgoIQUgAigCxCghBAwBC0EAIARB//8DcSIEIAEvAfQRayIHIAcgBEsbIQRBACAFQf//A3EiBSABLwH4EWsiASABIAVLGyEFDAMLIAQgBRCAgICAACABQf//A3FFDTtBsOnJgAAgBCAFELaAgIAADDsLIAAoAggiASABLwHsEUH9/wNxOwHsEQw6CyAEIAUQgICAgAAgAUH//wNxRQ05QbDpyYAAIAQgBRC2gICAAAw5CyACQiA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoIAJBqChqQdinyIAAQQIQmoCAgABB//8DcQ0PIAJBqChqQZy1yoAAIARBAWoQkIOAgABB//8DcQ0PIAJBqChqQdqnyIAAQQEQmoCAgABB//8DcQ0PIAJBqChqQZy1yoAAIAVBAWoQkIOAgABB//8DcQ0PIAJBqChqQdunyIAAQQEQmoCAgABB//8DcQ0PIAAoAgwgACACKAKsKCACKAK0KBD9gYCAACEEDBALAkACQCAELQAAIgFBPkYNACACIAE6ALMMIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGzDGoQkYOAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAILIAJBqChqQbDpyYAAQTQQqICAgAAgAi8BwCgNOSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGzDGoQkYOAgABB//8DcUUNACACQZAoahCpgICAAAw6CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA05IAIoAsgoIQUgAigCxCghBAwBCwJAIAdFDQBBACEIAkACQAJAAkACQAJAIAUvAQAiAQ4FAwABBAIEC0EBIQEMAgtBAiEBDAELQQMhAUEBIQgLAkAgB0ECTQ0AICkgCi8AADsAACACIAs7AagMIAJBqgxqIAtBEHY6AAAgKUECaiAKQQJqLQAAOgAAIAJB7QA6AKwMIAIgUjoAqwwgAiAHNgKkDCACIAU2AqAMIAJBATYCnAwgAiAENgKYDCACQZgMahCSg4CAAAw8CyAHQQJGIAhxRQ0BQQVBAyAFLwECQQJGGyEBDAELICggCi8AADsAACACIAs7AZAMIAJBkgxqIAtBEHY6AAAgKEECaiAKQQJqLQAAOgAAIAJB7QA6AJQMIAIgUjoAkwwgAiAHNgKMDCACIAU2AogMIAJBATYChAwgAiAENgKADCACQYAMahCSg4CAAAw6CyAAIAEQtYKAgAAMOQsgACgCCCIBIAEvAewRQf3/A3E7AewRDDgLIAQgBRCAgICAACABQf//A3FFDTdBsOnJgAAgBCAFELaAgIAADDcLIAIgCzsB4AsgAkHiC2ogC0EQdjoAACACQQA2AuQLIAIgBzYC3AsgAiAFNgLYCwNAIAJB6AtqIAJB2AtqENeAgIAAIAItAPwLRQ03IAIoAugLIgRBAUYNACAAKAIIKAIYIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDh8AIAECAwQFBgcICQoLDA0ODxAREhMUFRcWGBkbGh0cAAsgAUIANwOYASABQbABakEANgIAIAFBqAFqQgA3AwAgAUGgAWpCADcDAAwdCyABIAEvAbABQQFyOwGwAQwcCyABIAEvAbABQfr/A3E7AbABDBsLIAEgAS8BsAFBAnI7AbABDBoLIAEgAS8BsAFB/f8DcTsBsAEMGQsgASABLwGwAUEEcjsBsAEMGAsgASACLQDsC0EHcUEIdCABLwGwAUH/8QNxcjsBsAEMFwsgAUECOgCsASABIAIvAewLIgQ6AKgBIAEgBEEIdjoAqQEgASACQe4Lai0AADoAqgEMFgsgAUEBOgCsASABIAItAOwLOgCoAQwVCyABQgA3A6gBDBQLIAEgAS8BsAFBgAFyOwGwAQwTCyABIAEvAbABQf/+A3E7AbABDBILIAEgAS8BsAFBCHI7AbABDBELIAEgAS8BsAFB9/8DcTsBsAEMEAsgASABLwGwAUEQcjsBsAEMDwsgASABLwGwAUHv/wNxOwGwAQwOCyABIAEvAbABQSByOwGwAQwNCyABIAEvAbABQd//A3E7AbABDAwLIAEgAS8BsAFBwAByOwGwAQwLCyABIAEvAbABQb//A3E7AbABDAoLIAFBAjoAnAEgASACLwHsCyIEOgCYASABIARBCHY6AJkBIAEgAkHuC2otAAA6AJoBDAkLIAFBAjoApAEgASACLwHsCyIEOgCgASABIARBCHY6AKEBIAEgAkHuC2otAAA6AKIBDAgLIAFBAToAnAEgASACLQDsCzoAmAEMBwsgAUEBOgCkASABIAItAOwLOgCgAQwGCyABQgA3A5gBDAULIAFCADcDoAEMBAsgAUEBOgCcASABIAItAOwLOgCYAQwDCyABQQE6AKQBIAEgAi0A7As6AKABDAILIAFBAToAnAEgASACLQDsCzoAmAEMAQsgAUEBOgCkASABIAItAOwLOgCgAQsgARCSgYCAABoMAAsLAAsgAiAINgK4DCACIAQ2ArQMIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQbQMahCTg4CAACIBQf//A3FFDQAgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNNiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkG0DGoQk4OAgABB//8DcUUNACACQZAoahCpgICAAAw3CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA02IAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDTRBsOnJgAAgBCAFELaAgIAADDQLA0AgB0UNNCACQdALaiAFLwEAIgEgCEUQ04KAgAACQAJAIAItANILRQ0AIAIgAi8B0As7AdQLIAAgAkHUC2oQkYKAgAAiBEH//wNxDTkMAQsgAiABOwHWCyACQdYLahDUgoCAAAsgBUECaiEFIAdBf2ohBwwACwsgBCAFEICAgIAAIAFB//8DcUUNMkGw6cmAACAEIAUQtoCAgAAMMgsCQAJAAkAgBS8BACIBDgQAAgIBAgsgABCxgoCAAAwzCyAAELSCgIAADDILIAIgAToAjwsgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJBjwtqEJSDgIAAIgFB//8DcUUNACACQagoakGw6cmAAEErEKiAgIAAIAIvAcAoDTMgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBjwtqEJSDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMNAsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNMyACKALIKCEFIAIoAsQoIQQMAQsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ0xQbDpyYAAIAQgBRC2gICAAAwxCyAEIAUQgICAgAAgAUH//wNxRQ0wQbDpyYAAIAQgBRC2gICAAAwwCyAEIAUQgICAgAAgAUH//wNxRQ0vQbDpyYAAIAQgBRC2gICAAAwvC0EBIQECQAJAAkAgBw4CAQACCyAFLwEAIQELIAAoAggiBCAEKAIYIgQvAcoBQQFqQf//A3EgAUH//wNxaiIBQf//AyABQf//A0kbIAQvAcgBQQFqQf//A3EQ44GAgAAMLwsgJCAKLwAAOwAAIAIgCzsB5AogAkHmCmogC0EQdjoAACAkQQJqIApBAmotAAA6AAAgAkHlADoA6AogAiBSOgDnCiACIAc2AuAKIAIgBTYC3AogAkEANgLYCiACIAQ2AtQKIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQdQKahCVg4CAACIBQf//A3FFDQAgAkGoKGpBsOnJgABBKRCogICAACACLwHAKA0wIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdQKahCVg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADDELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDTAgAigCyCghBSACKALEKCEEDAELIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNLkGw6cmAACAEIAUQtoCAgAAMLgsgBCAFEICAgIAAIAFB//8DcUUNLUGw6cmAACAEIAUQtoCAgAAMLQtBASEBAkACQAJAIAcOAgEAAgsgBS8BACEBCyAAKAIIIgQgASAEKAIYLwHIAUEBakH//wNxEOOBgIAADC0LICMgCi8AADsAACACIAs7AcQKIAJBxgpqIAtBEHY6AAAgI0ECaiAKQQJqLQAAOgAAIAJB5AA6AMgKIAIgUjoAxwogAiAHNgLACiACIAU2ArwKIAJBADYCuAogAiAENgK0CiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkG0CmoQloOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQSkQqICAgAAgAi8BwCgNLiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkG0CmoQloOAgABB//8DcUUNACACQZAoahCpgICAAAwvCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0uIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDSxBsOnJgAAgBCAFELaAgIAADCwLAkAgAS0ABEUNACAAIAEoAgAQ/4GAgAAhBAwECyAiIAovAAA7AAAgAiALOwGsCiACQa4KaiALQRB2OgAAICJBAmogCkECai0AADoAACACQeMAOgCwCiACIFI6AK8KIAIgBzYCqAogAiAFNgKkCiACIAg2AqAKIAIgBDYCnAogAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJBnApqEJeDgIAAIgFB//8DcUUNACACQagoakGw6cmAAEE3EKiAgIAAIAIvAcAoDS0gAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBnApqEJeDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMLgsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNLSACKALIKCEFIAIoAsQoIQQMAQsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ0rQbDpyYAAIAQgBRC2gICAAAwrCyAEIAUQgICAgAAgAUH//wNxRQ0qQbDpyYAAIAQgBRC2gICAAAwqC0EBIQECQAJAAkAgBw4CAQACCyAFLwEAIQELIAIgACgCCCIFQeIRai0AADoAkhggAiAFLwHgETsBkBggBS0A5BFFDQEgAi8BkBggAi0AkhhBEHRyIQcgAUEBIAFBAUsbQQFqIQEDQCABQX9qIgFFDQIgBSAHEJyCgIAAIgRB//8DcUUNAAwDCwsgISAKLwAAOwAAIAIgCzsBjAogAkGOCmogC0EQdjoAACAhQQJqIApBAmotAAA6AAAgAkHiADoAkAogAiBSOgCPCiACIAc2AogKIAIgBTYChAogAkEANgKACiACIAQ2AvwJIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQfwJahCYg4CAACIBQf//A3FFDQAgAkGoKGpBsOnJgABBMhCogICAACACLwHAKA0rIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQfwJahCYg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADCwLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDSsgAigCyCghBSACKALEKCEEDAELIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNKUGw6cmAACAEIAUQtoCAgAAMKQtBACEECyAEQf//A3ENKgwnCyAEIAUQgICAgAAgAUH//wNxRQ0mQbDpyYAAIAQgBRC2gICAAAwmC0EBIQECQAJAAkAgBw4CAQACCyAFLwEAIQELIAAoAggiBCAEKAIYIgQvAcoBQQFqQf//A3EgBC8ByAFBAWpB//8DcSABQf//A3FqIgFB//8DIAFB//8DSRsQ44GAgAAMJgsgICAKLwAAOwAAIAIgCzsB7AkgAkHuCWogC0EQdjoAACAgQQJqIApBAmotAAA6AAAgAkHhADoA8AkgAiBSOgDvCSACIAc2AugJIAIgBTYC5AkgAkEANgLgCSACIAQ2AtwJIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQdwJahCZg4CAACIBQf//A3FFDQAgAkGoKGpBsOnJgABBKRCogICAACACLwHAKA0nIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdwJahCZg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADCgLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDScgAigCyCghBSACKALEKCEEDAELIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNJUGw6cmAACAEIAUQtoCAgAAMJQsgBCAFEICAgIAAIAFB//8DcUUNJEGw6cmAACAEIAUQtoCAgAAMJAtBASFTAkACQAJAIAcOAgEAAgsgBS8BACFTC0EAIQkDQCAJIFNGDSUgACgCCCIFKAIYIQFBACEHAkAgBS0AAUEBcUUNACAFLwH4ESEHCyAFQTBqIQggAS8ByAEiCiEEAkADQCAEQf//A3EgB0H//wNxTQ0BIAFBARDlgYCAACAIIAUoAhgiAS8ByAEiBBCUgoCAAEEBcUUNAAsLIAlBAWohCSAKQf//A3EgACgCCCgCGC8ByAFHDQAMJQsLIB8gCi8AADsAACACIAs7AcwJIAJBzglqIAtBEHY6AAAgH0ECaiAKQQJqLQAAOgAAIAJB2gA6ANAJIAIgUjoAzwkgAiAHNgLICSACIAU2AsQJIAJBADYCwAkgAiAENgK8CSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkG8CWoQmoOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQTkQqICAgAAgAi8BwCgNJSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkG8CWoQmoOAgABB//8DcUUNACACQZAoahCpgICAAAwmCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0lIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDSNBsOnJgAAgBCAFELaAgIAADCMLIAQgBRCAgICAACABQf//A3FFDSJBsOnJgAAgBCAFELaAgIAADCILQQEhCAJAAkACQAJAAkACQAJAIAcOAgEAAgsgBS8BACEICyAAKAIIIgEvAfIRIAEoAhgiBS8ByAEiCWsiB0H//wNxIgQgBCAIQQEgCEEBSxsiCCAEIAhJGyIIRw0BDAQLIB4gCi8AADsAACACIAs7AawJIAJBrglqIAtBEHY6AAAgHkECaiAKQQJqLQAAOgAAIAJB2AA6ALAJIAIgUjoArwkgAiAHNgKoCSACIAU2AqQJIAJBADYCoAkgAiAENgKcCSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQZwJahCbg4CAACIBQf//A3FFDQEgAkGoKGpBsOnJgABBNhCogICAACACLwHAKA0lIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZwJahCbg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADCYLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDSUgAigCyCghBSACKALEKCEEDAILIAUoAsQBIAhBf2pB//8DcUEDdGopAwBCgICAgICAA4NCgICAgICAAVEgCGoiB0H//wNxIQQMAgsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ0iQbDpyYAAIAQgBRC2gICAAAwiCyAFIAkQnIOAgAAgASgCGCIFIAUvAcgBIAdqEJyDgIAAIAEoAhgQq4KAgAAgASgCGCgCwAEiBSAFKQMAQoCAgICAwACENwMAIAEoAhgi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QcgXahCkgoCAAAwCCyACIAcoAjggBygCECIIajYC0BcgAkHUF2ogAkHQF2ogASAIaxChgYCAACACIAIoAtgXKQIANwPgFyACQdAXaiACKALUFxCjgYCAACACQdAXaiAEIAhrIAJB4BdqEKSCgIAADAELIAIgUzYC6BcgAkHsF2ogAkHoF2ogCBChgYCAACACKALwFyEIIAJB+BdqIAJB6BdqIFQQoYGAgAAgCCkCACEGIAggAigC/BciUykCADcCACBTIAY3AgALIAEpAwBCgICAgICACIMhBgJAAkAgBC0ABUEgcQ0AIAZQDQEgAiAHKAKkASAHKAIQIghqNgKIGCACQZAoaiACQYgYaiABIAhrEKSBgIAAIAIoApQoLwEAIVMgAkGIGGogAigCkCgQpoGAgAAgAkGIGGogBCAIayBTEKWCgIAADAELIAcoAqQBIAcoAhAiCGohUyABIAhrIVQgBCAIayEIAkAgBkIAUg0AIAIgUzYChBggAkHEKGogAkGEGGogCBCkgYCAACACKALIKC8BACEIIAJBhBhqIAIoAsQoEKaBgIAAIAJBhBhqIFQgCBClgoCAAAwBCyACIFM2AowYIAJBqChqIAJBjBhqIAgQpIGAgAAgAigCrCghCCACQZAYaiACQYwYaiBUEKSBgIAAIAgvAQAhUyAIIAIoApQYIlQvAQA7AQAgVCBTOwEACyABKQMAIQYgASAEKQMANwMAIAQgBjcDACAFQQhqIQUMAAsLIBkgCi8AADsAACACIAs7AZQIIAJBlghqIAtBEHY6AAAgGUECaiAKQQJqLQAAOgAAIAJB0AA6AJgIIAIgUjoAlwggAiAHNgKQCCACIAU2AowIIAJBADYCiAggAiAENgKECCACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkGECGoQoIOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQTcQqICAgAAgAi8BwCgNGSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGECGoQoIOAgABB//8DcUUNACACQZAoahCpgICAAAwaCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0ZIAIoAsgo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IABBnLXKgAAQr4SAgAAiA0H//wNxDQEgAi0ANCEBCwJAIAFBD3FBCEcNACAAQZy1yoAAEK+EgIAAIgNB//8DcQ0BIAItADQhAQsCQCABQQ9xQQlHDQAgAiACLQAIOgA6IAAgAkE6ahCrhICAACIDQf//A3ENASACLQA0IQELAkAgAUEPcUEKRw0AIABBnLXKgAAQr4SAgAAiA0H//wNxDQELIABBo5LAgABBAhCagICAACEDCyACQcAAaiSAgICAACADC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC0g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBLhCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQtIOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQZuYyoAAQSsQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILPQEBfwJAIABB0vbJgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEHD98mAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQbH4yYAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABB8/jJgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEHm+cmAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQar7yYAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABBkfzJgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEGH/cmAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQfX9yYAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABB5f7JgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEHb/8mAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQdCAyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABByIHKgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEGwgsqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQaGDyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABBvYTKgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEGlhcqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQbyGyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILLgEBfwJAIABB54XKgABBLBCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgvoCwECfwJAIAFB//8DcSIDQQJHDQAgAkEBcUUNACAAQQE6AAIgAEGCgAI7AQAPCwJAIANBBEcNACACQQFxRQ0AIABBAToAAiAAQYSAAjsBAA8LAkAgAUH//wNxIgNBDEcNACACQQFxRQ0AIABBAToAAiAAQYyAAjsBAA8LAkAgA0EURw0AIAJBAXFFDQAgAEEBOgACIABBlIACOwEADwsCQCABQf//A3EiA0EBRw0AIAJBAXENACAAQQE6AAIgAEEBOwEADwsCQCADQQNHDQAgAkEBcQ0AIABBAToAAiAAQQM7AQAPCwJAIAFB//8DcSIDQQRGIAJBAXMiBHFBAUcNACAAQQE6AAIgAEGEgH5BBCACQQFxGzsBAA8LAkAgA0EFRw0AIAJBAXENACAAQQE6AAIgAEEFOwEADwsCQCABQf//A3EiA0EGRw0AIAJBAXENACAAQQE6AAIgAEEGOwEADwsCQCADQQdHDQAgAkEBcQ0AIABBAToAAiAAQQc7AQAPCwJAIAFB//8DcSIDQQhHDQAgAkEBcQ0AIABBAToAAiAAQQg7AQAPCwJAIANBCUcNACACQQFxDQAgAEEBOgACIABBCTsBAA8LAkAgAUH//wNxIgNBDEYgBHFBAUcNACAAQQE6AAIgAEGMgH5BDCACQQFxGzsBAA8LAkAgA0EZRw0AIAJBAXENACAAQQE6AAIgAEEZOwEADwsCQCABQf//A3EiA0EoRw0AIAJBAXENACAAQQE6AAIgAEEoOwEADwsCQCADQS1HDQAgAkEBcQ0AIABBAToAAiAAQS07AQAPCwJAIAFB//8DcSIDQS9HDQAgAkEBcQ0AIABBAToAAiAAQS87AQAPCwJAIANBwgBHDQAgAkEBcQ0AIABBAToAAiAAQcIAOwEADwsCQCABQf//A3EiA0HFAEcNACACQQFxDQAgAEEBOgACIABBxQA7AQAPCwJAIANB6AdHDQAgAkEBcQ0AIABBAToAAiAAQegHOwEADwsCQCABQf//A3EiA0HqB0cNACACQQFxDQAgAEEBOgACIABB6gc7AQAPCwJAIANB6wdHDQAgAkEBcQ0AIABBAToAAiAAQesHOwEADwsCQCABQf//A3EiA0HsB0cNACACQQFxDQAgAEEBOgACIABB7Ac7AQAPCwJAIANB7QdHDQAgAkEBcQ0AIABBAToAAiAAQe0HOwEADwsCQCABQf//A3EiA0HuB0cNACACQQFxDQAgAEEBOgACIABB7gc7AQAPCwJAIANB7wdHDQAgAkEBcQ0AIABBAToAAiAAQe8HOwEADwsCQCABQf//A3EiA0H3B0cNACACQQFxDQAgAEEBOgACIABB9wc7AQAPCwJAIANB+AdHDQAgAkEBcQ0AIABBAToAAiAAQfgHOwEADwsCQCABQf//A3EiA0GLCEcNACACQQFxDQAgAEEBOgACIABBiwg7AQAPCwJAIANBjAhHDQAgAkEBcQ0AIABBAToAAiAAQYwIOwEADwsCQCABQf//A3EiA0GPCEcNACACQQFxDQAgAEEBOgACIABBjwg7AQAPCwJAIANBlQhHDQAgAkEBcQ0AIABBAToAAiAAQZUIOwEADwsCQCABQf//A3EiA0GXCEcNACACQQFxDQAgAEEBOgACIABBlwg7AQAPCwJAIANBmAhHDQAgAkEBcQ0AIABBAToAAiAAQZgIOwEADwsCQCABQf//A3EiA0GZCEcNACACQQFxDQAgAEEBOgACIABBmQg7AQAPCwJAIANB1A9HDQAgAkEBcQ0AIABBAToAAiAAQdQPOwEADwsCQCABQf//A3EiA0HqD0cNACACQQFxDQAgAEEBOgACIABB6g87AQAPCwJAIANB6w9HDQAgAkEBcQ0AIABBAToAAiAAQesPOwEADwsCQCABQf//A3EiAUHvD0cNACACQQFxDQAgAEEBOgACIABB7w87AQAPCwJAIAFBgBBHDQAgAkEBcQ0AIABBAToAAiAAQYAQOwEADwsgAEEANgEAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC1g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBJxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQtYOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC+kBAgZ/AX5BACECA38CQAJAIAIgAU8iAw0AAkAgACACaiIELAAAIgVBAEgNAEEBIQUMAgsgBUH/AXFB3KfIgABqLQAAIgZB8QFGDQAgAiAGQQdxIgVqIAFLDQAgBEEBai0AACIHQoDBgoSJECAGQQF2QfgAca0iCIinQbABcUkNACAHQr///vz7ESAIiKdB/wFxSw0AAkACQCAFQX5qDgMDAAEDCyAEQQJqLAAAQb9/Sg0BQQMhBQwCCyAEQQJqLAAAQb9/Sg0AIARBA2osAABBQE4NAEEEIQUMAQsgAw8LIAUgAmohAgwACwsTACAAQcaYyoAAQcYAEJqAgIAACzQBAX8CQCAAQeSZyoAAQS0QmoCAgAAiAkH//wNxDQAgAEGctcqAACABEK6EgIAAIQILIAILEgAgAEGzmcqAAEExEJqAgIAAC1ABA38CQAJAIAAgAkcNAEEBIQMMAQsDQCABRSEDIAFFDQEgAUF/aiEBIAItAAAhBCAALQAAIQUgAkEBaiECIABBAWohACAFIARGDQALCyADCzwBAX8CQCAAQYyZyoAAQScQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQrYOAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQSsQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEK2DgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAsuAQF/AkAgAEHz8cmAAEE4EJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQbvxyYAAQTgQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILLgEBfwJAIABBg/HJgABBOBCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQq4OAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQTQQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEKuDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQqoOAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQTQQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEKqDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQrIOAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQTAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEKyDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAsuAQF/AkAgAEGX78mAAEEwEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQe3uyYAAQSoQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILLgEBfwJAIABBwe7JgABBLBCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgsuAQF/AkAgAEGZ7smAAEEoEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQafsyYAAQSIQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEKiDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEE0EKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCog4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEKmDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEEuEKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCpg4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALLgEBfwJAIABB1vDJgABBLRCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgs9AQF/AkAgAEHZl8qAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCy4BAX8CQCAAQbOXyoAAQSYQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILPQEBfwJAIABB8ZbKgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgsuAQF/AkAgAEHLlsqAAEEmEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCz0BAX8CQCAAQYmWyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILLgEBfwJAIABB25XKgABBLhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgs9AQF/AkAgAEGZlcqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCwg4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBLxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQsIOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC+g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMBCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQvoOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQb2UyoAAQS8QmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABBl5TKgABBJhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHok8qAAEEvEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC5g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBNRCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQuYOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQYGTyoAAQTQQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEL2DgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEE2EKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABC9g4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALLwEBfwJAIABBv5LKgABBwgAQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABBjZLKgABBMhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHPkcqAAEE+EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQaqPyoAAQToQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB5I/KgABBOhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEGekMqAAEE6EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQdiQyoAAQToQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyQIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAELyDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEHAABCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQvIOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC6g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBxQAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAELqDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAs3AQF/AkAgAEHQjsqAAEEqEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS8BABCQg4CAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC7g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQu4OAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQaaOyoAAQSoQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILNwEBfwJAIABBhY3KgABBLRCagICAACICQf//A3ENACAAQZy1yoAAIAEvAQAQkIOAgAAhAgsgAgsuAQF/AkAgAEHbjMqAAEEqEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC4g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBxQAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAELiDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAs9AQF/AkAgAEGZjMqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCy4BAX8CQCAAQbKLyoAAQTIQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILNwEBfwJAIABBhYvKgABBLRCagICAACICQf//A3ENACAAQZy1yoAAIAEvAQAQkIOAgAAhAgsgAgsuAQF/AkAgAEHki8qAAEE1EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQdyKyoAAQSkQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAELeDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEE6EKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABC3g4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALPQEB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gABBLhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHJ/cmAAEEsEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQdP8yYAAQTQQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB7PvJgABBJRCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEGF+8mAAEElEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCyg4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMBCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQsoOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCxg4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQsYOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQbX5yYAAQTEQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEK+DgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEExEKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCvg4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALLgEBfwJAIABBlPfJgABBLxCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgu7AQECfwJAIABB+OvJgABBLxCagICAACICQf//A3ENACABKAIEIQMgASgCACEBIABBgevAgABBAhCagICAACICQf//A3ENAANAAkACQCADRQ0AIAAgAS0AAEEKQQBBnLXKgAAQ6IOAgAAiAkH//wNxDQMgA0EBRg0BIABBiOvAgABBAhCagICAACICQf//A3FFDQEMAwsgAEGjksCAAEECEJqAgIAADwsgAUEBaiEBIANBf2ohAwwACwsgAgsuAQF/AkAgAEHJ7MmAAEErEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQcfvyYAAQTEQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILLgEBfwJAIABB+O/JgABBMRCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgsuAQF/AkAgAEGp8MmAAEEtEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQavzyYAAQSgQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILNwEBfwJAIABB0/PJgABBMxCagICAACICQf//A3ENACAAQZy1yoAAIAEtAAAQqoSAgAAhAgsgAgsuAQF/AkAgAEGk9smAAEEuEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQYX4yYAAQSwQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABBqPrJgABBMBCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHY+smAAEEtEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQaf/yYAAQTQQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB/obKgABBKxCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgs3AQF/AkAgAEGph8qAAEElEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS8BABCQg4CAACECCyACCy4BAX8CQCAAQc6HyoAAQS0QmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB74jKgABBNxCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgs9AQF/AkAgAEGaisqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCy4BAX8CQCAAQbKNyoAAQTIQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLwEBfwJAIABB5I3KgABBwgAQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB+o7KgABBMBCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEGSkcqAAEE9EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQbWTyoAAQTMQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB7JTKgABBLRCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgvdCQMCfwJ+CH8jgICAgABBIGsiAySAgICAAAJAIABFDQAgAEHAG2ohBEEAKQP4tceAACIFQoCAgIDwH4MhBiAFpyEHIABB4ixqIQggAEHSG2ohCQNAIAJFDQEgAS0AACEKAkACQAJAAkACQCAALQDWLEEPcQ0AIApBirPHgABqLQAAIQsgAC0A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QAJAAkAgAUG4A2ogBxDBg4CAAEEDcQ4EAAECAwALIAFBkANqQRhqIAUoAgAiBTYCACABQZADakEQaiAIKQMANwMAIAFBkANqQQhqIAwpAwA3AwAgASABKQO4AyIJNwOQAyABQeADakEIaiAJpyABQZADaiAFQQFxGyIFQQhqKAIANgIAIAEgBSkCADcD4AMgAUHgA2ohCAwDCyABQZADakEYaiAFKAIAIgU2AgAgAUGQA2pBEGogCCkDADcDACABQZADakEIaiAMKQMANwMAIAEgASkDuAM3A5ADIAFB4ANqQQhqIAEoApQDIAFBnANqIAVBAXEbIgVBCGooAgA2AgAgASAFKQIANwPgAyABQeADaiEIDAILIAFBkANqQRhqIAUoAgAiDTYCACABQZADakEQaiAIKQMANwMAIAFBkANqQQhqIAwpAwA3AwAgASABKQO4AyIJNwOQAyABQeADakEIaiAJpyABQZADaiANQQFxGyIIQQhqKAIANgIAIAEgCCkCADcD4AMgASABLwHKAzsBkAMgASABKAK8A0EGaiABQZADaiAFLQAAQQFxGy8BADsB5gMgAUHgA2ohCAwBCyABQZADakEYaiAFKAIAIg02AgAgAUGQA2pBEGogCCkDADcDACABQZADakEIaiAMKQMANwMAIAEgASkDuAM3A5ADIAFB4ANqQQhqIAEoApQDIAFBnANqIA1BAXEbIghBCGooAgA2AgAgASAIKQIANwPgAyABIAEvAb4DOwGQAyABIAEoArgDQQZqIAFBkANqIAUtAABBAXEbLwEAOwHmAyABQeADaiEICyAAQeQaaiEFIAFB+AFqQQhqIAhBCGooAgA2AgAgASAIKQIANwP4ASABQbgDakEYaiIIIARBGGopAgA3AwAgAUG4A2pBEGoiDCAEQRBqKQIANwMAIAFBuANqQQhqIg0gBEEIaikCADcDACABIAQpAgA3A7gDAkACQAJAAkACQCABQbgDaiAHEMGDgIAAQQNxDgQAAQIDAAsgAUGQA2pBGGogCCgCACIENgIAIAFBkANqQRBqIAwpAwA3AwAgAUGQA2pBCGogDSkDADcDACABIAEpA7gDNwOQAyABQeADakEIaiABKAKUAyABQZwDaiAEQQFxGyIEQQhqKAIANgIAIAEgBCkCADcD4AMgAUHgA2ohBAwDCyABQZADakEY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FPwKAAALIA1BBGogDDYCACANIB82AgALIARBCGohBCAQQQhqIRAgBUEcaiEFIA1BCGohDQwACwsgHiABKQPgATcCAEEBIRALICBBAWohIAwACwsgAUHwA2okgICAgAAgAkH/AXELtgQCC38BfiOAgICAAEGAAWsiAiSAgICAACACQRhqIgMgAEEYaiIEKQIANwMAIAJBEGoiBSAAQRBqIgYpAgA3AwAgAkEIaiIHIABBCGoiCCkCADcDACACIAApAgA3AwAgAkHgAGpBGGoiCSAEKAIAIgo2AgAgAkHgAGpBEGoiCyAGKQIANwMAIAJB4ABqQQhqIgwgCCkCADcDACACIAApAgAiDTcDYEEBIQQgAkEgakEIaiANpyACQeAAaiAKQQFxGyIGQQhqKAIANgIAIAIgBikCADcDICACQTBqIAFBAiACQSBqEM2BgIAAIAIvATQhCCACKAIwIQYgCSADKAIAIgM2AgAgCyAFKQMANwMAIAwgBykDADcDACACIAIpAwA3A2AgAkHAAGpBCGogAigCZCACQewAaiADQQFxGyIDQQhqKAIANgIAIAIgAykCADcDQCACQdAAaiABQQIgAkHAAGoQzYGAgAAgAi8BVCEDIAIoAlAhAQJAAkACQAJAIAAtABxFDQACQCAGIAFNIgANACAIQf//A3EgA0H//wNxTw0ECwJAIAYgAUkiAQ0AIAhB//8DcSADQf//A3FLDQQLIAANASAIQf//A3EgA0H//wNxTw0BQQMhBAwDCyAGIAFPDQFBACEEDAILQX5BACAIQf//A3EgA0H//wNxSxtBACABGyEEDAELAkAgBiABTQ0AQQEhBAwBCyAIQf//A3EgA0H//wNxSyEECyACQYABaiSAgICAACAEC5sBAgJ/AX4jgICAgABBEGsiAySAgICAACABKAIEIQQgASgCACEBIAMgAkH/////A0s6AAwCQAJAIAJBgICAgARJDQBCgICAgBAhBQwBCwJAIAJBAnQiAg0AQvz///8PIQUMAQsgASACQQJBACAEKAIAEYCAgIAAgICAgAAiAkWtQiCGIAKthCEFCyAAIAU3AgAgA0EQaiSAgICAAAsSAAJAIAANAEEADwsgAC8BohsLEgACQCAADQBBAA8LIAAvAaAbCxIAAkAgAA0AQQAPCyAALwGMEgsSAAJAIAANAEEADwsgACgC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OgAEIAAgAyACQfwHcWoiAi8BADsBACAAQQJqIAJBAmotAAA6AAAMAgsgAEEBOgAEIAAgBUISiDwAAiAAIAVCCog8AAEgACAFQgKIPAAADAELIAEvAQggAUEKai0AAEEQdHIhBkHA1MeAACECAkACQAJAAkAgAS0ADA4DAwABAwsgBCADIAZB/wFxQQJ0aiICLwEAOwEAIAQgAkECai0AADoAAiAEIQIMAQsgBCAGOwEIIAQgBkEQdjoACiAEQQhqIQILIAJBAToABAsgACACKQIANwIACyAEQRBqJICAgIAAC5cDAgN/AX4jgICAgABBMGsiBSSAgICAAEF/IQYCQCAARQ0AIAFBAEgNACACQX9MDQACQCABIAAvAaAbTw0AIAIgAC8BohtPDQAgBEUNACAFQQA6AAwgBUEAOwEIIAUgATYCBCAFQRBqIAAoAhggBUEEahC5gYCAACAFLQAcRQ0AQX8hBiACIAUoAhAiAS8BrAJPDQEgASgCOCEHQQAhACADIAEoAhggASgCECIBaiAFLwEUQQN0aigCACABaiACQQN0aiICKQMAIginQQJ2Qf///wBxQQAgCEICg1AbNgIAQQEhBiACKQMAQgODQgFSDQEgBSAHIAFqNgIgIAVBJGogBUEgaiACIAFrEKeBgIAAAkACQCAFLQAsDQBBACECDAELIAUoAiQgAWohACAFKAIoIQILIABFDQEgA0EEaiEBQQEhBgNAIAZBf2ogAk8NAiAGIARPDQIgASAALwEAIABBAmotAABBEHRyNgIAIABBBGohACABQQRqIQEgBkEBaiEGDAALC0F/IQYLIAVBMGokgICAgAAgBgseAAJAAkAgAA0AQQAhAAwBCyAALQAoIQALIABBAXELPAEBfgJAIAANAEEADwsCQCAANQIAIABBBGoxAABCIIaEIgFCgIDgAINQDQBBAQ8LIAFCgICAAYNCFYinC/sHAgJ/AX4jgICAgABBEGsiAySAgICAAEEAIQQCQCAARQ0AIANBDGogASACENOCgIAAIAMtAA5FDQAgADUCACAAQQRqMAAAQiCGhCEFAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAy8BDCIAQX9qDhkBJQID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CWo2AgwMAQsDQAJAIAcgCSAJIAdLGyIIRQ0AIAogCyAI/AoAAAsgASABKAIMIAhqNgIMIAogB2ohCiAJIAdJIQggCSAHayEJIAhFDQALC0KAgICAICEFCyAAIAU3AgALBABBAAsEAEECCxIAIAAgAkEKQQAgARDog4CAAAvQAgEEfyOAgICAAEEwayIFJICAgIAAAkACQCACQf8BcSICQQpHDQBBACECAkADQCABQeQASQ0BIAVBD2ogAmpBH2ogASABQeQAbiIDQeQAbGsiASABQf8BcUEKbiIBQQpsa0EIdCABckGw4AByOwAAIAJBfmohAiADIQEMAAsLAkAgAUEJSw0AIAVBD2ogAmpBIGogAUEwcjoAACACQSBqIQYMAgsgBUEPaiACakEfaiABIAFB/wFxQQpuIgNBCmxrQQh0IANyQbDgAHI7AAAgAkEfaiEGDAELQTdB1wAgA0EBcRshB0EhIQYDQCAGQX9qIgYgBUEPamogASABIAJuIgggAmxrIgNBMHIgByADaiADQQpJGzoAACABIAJJIQMgCCEBIANFDQALCyAAIAVBD2ogBmpBISAGayAEEKOEgIAAIQEgBUEwaiSAgICAACABC48BAAJAAkAgAkEEcUUNACADLQAHDQELIABBADYBAA8LAkAgASgCDEEBRg0AAkAgAS8BECABQRJqLQAAQRB0ciICQYD+/wBqQf///wBxQYH+/wBPDQAgAEEANgEADwsgAEEBOgADIAAgAjoAAiAAQQA7AQAPCyAAQQE6AAMgAEEAOwEAIAAgASgCCC0AADoAAgs3AQF/AkAgAEH2kcmAAEEBEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS0AABCggICAACECCyACC3cBAX8gAkEEaiEFIAIgA0F/aiIDQQN0aigCBCAEbCECAkADQCADRQ0BIANBf2ohAyAFKAIAIAJqIQIgBUEIaiEFDAALCyAAQQA7AQQgACACNgIAIAEoAgwhAyABQQA2AgwgAUF4aiIFIAUpAwAgAyACaq18NwMAC2oBA38jgICAgABBEGsiASSAgICAACAAKAIAKAIAIQICQANAAkAgACgCDA0AQQAhAwwCCyABQQhqIABB2NTHgABBAUEBIAIRgYCAgACAgICAACABLwEMIgNFDQALCyABQRBqJICAgIAAIAML3QEBBH8jgICA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OwEADAULIANBFGogAUEBakECEIiEgIAAAkAgAy8BFCIIRQ0AIAAgCDsBBAwFCyADLQAWIQggA0EYaiABQQNqQQIQiISAgAACQCADLwEYIglFDQAgACAJOwEEDAULIAMtABohCSADQRxqIAFBBWpBAhCIhICAAAJAIAMvARwiCkUNACAAIAo7AQQMBQsgAEEAOwEEIABBAmogAy0AHjoAACAAIAlBCHQgCEH/AXFyOwEADAQLIANBIGogAUEBakEDEIiEgIAAAkAgAy8BICIIRQ0AIAAgCDsBBAwECyADLQAiIQggA0EkaiABQQRqQQMQiISAgAACQCADLwEkIglFDQAgACAJOwEEDAQLIAMtACYhCSADQShqIAFBB2pBAxCIhICAAAJAIAMvASgiCkUNACAAIAo7AQQMBAsgAEEAOwEEIABBAmogAy0AKjoAACAAIAlBCHQgCEH/AXFyOwEADAMLIANBLGogAUEBakEEEIiEgIAAAkAgAy8BLCIIRQ0AIAAgCDsBBAwDCyADLQAuIQggA0EwaiABQQVqQQQQiISAgAACQCADLwEwIglFDQAgACAJOwEEDAMLIAMtADIhCSADQTRqIAFBCWpBBBCIhICAAAJAIAMvATQiCkUNACAAIAo7AQQMAwsgAEEAOwEEIABBAmogAy0ANjoAACAAIAlBCHQgCEH/AXFyOwEADAILIABBADsBBCAAIAZBAnRByI3IgABqIggvAQA7AQAgAEECaiAIQQJqLQAAOgAADAELAkAgAUEEQQMgAS0AAyIIQekARhsiCWotAABBOkYNACAAQoCAgICgBTcCAAwBCyADQThqIAEgAiAJQQFqIglBLxCAhICAAAJAAkACQAJAAkAgAy0APEUNACADKAI4IgsgCWshCiABIAlqIQkgCEHpAEcNASADQcAAaiAJIAoQiYSAgAAgAy8BQCIJDQIgA0HAAGpBAmohCQwECyAAQoCAgICgBTcCAAwECyADQcQAaiAJIAoQiISAgAAgAy8BRCIJDQEgA0HEAGpBAmohCQwCCyAAIAk7AQQMAgsgACAJOwEEDAELIAktAAAhDCADQcgAaiABIAIgC0EBaiIJQS8QgISAgAACQAJAAkACQAJAAkACQCADLQBMRQ0AIAMoAkgiC0EBaiEKIAsgCWshCyABIAlqIQkgCEHpAEcNASADQdAAaiAJIAsQiYSAgAAgAy8BUCIIRQ0CIAAgCDsBBAwHCyAAQoCAgICgBTcCAAwGCyADQdQAaiAJIAsQiISAgAAgAy8BVCIIRQ0BIAAgCDsBBAwFCyADLQBSIQggA0HYAGogASAKaiACIAprEImEgIAAIAMvAVgiCQ0BIANB2ABqQQJqIQkMAwsgAy0AViEIIANB3ABqIAEgCmogAiAKaxCIhICAACADLwFcIgkNASADQdwAakECaiEJDAILIAAgCTsBBAwCCyAAIAk7AQQMAQsgAEEAOwEEIABBAmogCS0AADoAACAAIAhBCHQgDEH/AXFyOwEACyADQeAAaiSAgICAAAs8AQF/AkAgAEGGtMqAAEE8EJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILJAEBf0EAIQQCQCADIAFLDQAgACADIAIgAxCxgICAACEECyAECxoAIAAgAWpBf2pBAUH/6sCAAEEBELGAgIAAC5sCAgR/AX4jgICAgABBIGsiAySAgICAAEEAIQQCQCAAKAIIIgUgAk8NACAFIQQDQEF/IARBAXYgBGpBwABqIgYgBiAESRsiBCACSQ0ACyADIAEpAgAiBzcDCCADIANBCGogACgCACICIAUgBBCihICAAAJAAkAgAygCACIGRQ0AIAMoAgQhBCAAIAY2AgAMAQsgA0EUaiADQQhqIAQQiIGAgAAgAy8BHCIEDQEgAygCGCEEIAMoAhQhBgJAIAAoAgQiAUUNACAGIAAoAgAgAfwKAAALAkAgBUUNACAHpyACIAVBAEEAIAdCIIinKAIMEYGAgIAAgICAgAALIAAgBjYCAAsgACAENgIIQQAhBAsgA0EgaiSAgICAACAECzoBAX8CQCACQQJ0IgNFDQAgACgCACABQarVqtV6IAIbIANBAkEAIAAoAgQoAgwRgYCAgACAgICAAAsL5QEBBn8gASgCCCICIAEoAgQiAyACIANLGyEEAkADQAJAAkAgBCACRg0AIAEoAgAgAmotAAAgAS0ADEYNASACIQQLQQAhBUEAIQZBACEHIAQgA0YNAiADIAQgAyAESxshByABKAIAIQYgBCEDA0ACQAJAIAcgA0YNACAGIANqLQAAIAEtAAxHDQEgAyEHCyAHIARrIQcgBiAEaiEGDAQLIANBAWohAwwACwsgASACQQFqIgI2AggMAAsLAkACQCAGDQBBACEHDAELIAEgByACajYCCCAGIQULIAAgBTYCACAAIAc2AgQL+QMBBX8jgICAgABBIGsiAySAgICAAAJAAkAgAg0AQQAhBEElIQUMAQsCQAJAAkAgAS0AAEFVag4DAAIBAgsgA0EQaiABQQFqIAJBf2oQpoSAgAAgAygCECIEQRB2IQUMAgtBJSEFAkAgAkF/aiIGDQBBACEEDAILQQAhBCADQQA7AQ4gAUEBaiIHLQAAQd8ARg0BIAEgAmpBf2otAABB3wBGDQEDQAJAAkACQAJAIAZFDQAgBy0AACICQd8ARg0DIANBEGogAkEKELOAgIAAQQAhBCADLwEQIgUNBiADLQASIQICQCADLwEOQf8DcSIFDQACQCACQf8BcQ0AQQAhAiADQQA7ARgMBAtBGCEFDAcLIANBCjsBFiADIAVBCmwiBUH/A3E7AR4gAyAFQQl2IgVBAEc6ABwgBQ0BIAMgAkH/AXEiAjsBGiADIAMvAR5B/wNxIgU7AQ4gAyAFIAJrIgJB/wNxIgU7AR4gAyAFIAJHOgAcIAUgAkcNASADLwEeIQIMAgsgAyADLwEOQf8DcSIEOwEeQQAhBQwFC0EYIQUMBAsgAyACQf8DcTsBDgsgBkF/aiEGIAdBAWohBwwACwsgA0EQaiABIAIQpoSAgAAgAygCECIEQRB2IQULIAAgBUEQdCAEQf//A3FyNgEAIANBIGokgICAgAALfgEDfyOAgICAAEEQayICJICAgIAAQXshAwJAAkADQCADRQ0BIANBhrXKgABqIQQgA0EBaiEDIAFBB3EgBC0AAEEHcUcNAAsgAEEAOwEAIAAgAUEHcSIDOgACIAIgAzoADSACIAM6AA4MAQsgAEEjNgEACyACQRBqJICAgIAAC7wEAwJ/AX4IfyOAgICAAEEgayIDJICAgIAAIAEoAiAhBCADIAIpAgAiBTcDACAEIQYCQAJAQQEgBEEDaiIHZyIIQR9zdCAHRyAIa0EdaiIJQR9xIgogASgCHCIIQR9xTQ0AIAIoAgQhCyACKAIAIQwgAyAFNwMQIANBGGogA0EQaiAKEMKDgIAAAkAgAy8BHCINDQAgAygCGCECQQAhBgNAIAMgBkEfcSIGOgAPAkAgBiAIQR9xSQ0AA0ACQAJAAkAgCUEfcSAGQR9xIgdNDQAgAyAFNwMQIANBGGogA0EQakEBIAZBAmp0EJmEgIAAIAMvARwiDUUNAgNAIAZBH3EiByAIQR9xTQ0CIAwgAiAHQQJ0aigCAEEMIAZBAmp0QQJBACALKAIMEYGAgIAAgICAgAAgAyAGQX9qQR9xIgY6AA8MAAsLIAMgASgCGCABKAIcEPmDgIAAIAEgCjYCHCABIAI2AhggASgCICEGDAYLIAMgAiAKEPmDgIAADAQLIAIgB0ECdGogAygCGDYCACADIAZBAWpBH3EiBjoADwwACwsgAiAGQQJ0IgdqIAEoAhggB2ooAgA2AgAgBkEBaiEGDAALCyAAIA07AQQMAQsgBEEBaiECAkACQCAGQQJPDQAgASAGQQxsaiEGDAELIAEoAhhBHSAGQQJqIgZnIgdrQQJ0aigCACAGQQxsakF/IAdBH3N0QQxsaiEGCyAAQQA7AQQgASACNgIgIAAgBjYCAAsgA0EgaiSAgICAAAuZBAEEfyOAgICAAEHQAGsiBCSAgICAAAJAQSRFDQAgBEEIakG4lMmAAEEk/AoAAAsCQANAIAQgAkEfcToALyAEIAMQ+oOAgAACQAJAAkACQCAEKAIAIgJFDQAgAiAEKAIEIgVB0rvAgABBARCxgICAAEEBcUUNAiAEQTBqIARBCGogARD9g4CAACAELwE0IgJFDQEgACACOwEkDAULIABBADsBJEEkRQ0EIAAgBEEIakEk/AoAAAwECyAEKAIwIgJBAToACCACQQI6AAAgAiAELQAvIgVBH3E6AAEMAQsgBEE4aiACIAUQ9IOAgAACQCAELwE8RQ0AIABBADsBJEEkRQ0DIAAgBEEIakEk/AoAAAwDCyAELwE4IQUgBC0AOiEGIARBwABqIARBCGogARD9g4CAAAJAIAQvAUQiAkUNACAAIAI7ASQMAwsgBCgCQCICIAUgBkEQdHIiBTsBACACQQA6AAggAkECOgAEIAJBAmogBUEQdjoAACACIAQtAC8iBUEfcToABQsgBUEBaiEGQXYhAgJAAkADQCACRQ0BIAJBurXKgABqIQUgAkEBaiECIAZBH3EiByAFLQAAQR9xRw0ACyAEQQE6AEwgBCAHOgBLIARBywBqIQIMAQtBuOnJgAAhAgsgAi8AACICQYACTw0ACyAAQQA7ASRBJEUNACAAIARBCGpBJPwKAAALIARB0ABqJICAgIAAC90BAQF/I4CAgIAAQcAAayIEJICAgIAAAkBBJEUNACAEQRRqQbiUyYAAQST8CgAACyAEQQhqIAMQ+oOAgAACQAJAIAQoAghFDQAgAEEAOwEkQSRFDQEgAEG4lMmAAEEk/AoAAAwBCyAEQThqIARBFGogARD9g4CAAAJAIAQvATwiA0UNACAEQRRqIAEQwoCAgAAgACADOwEkDAELIAQoAjgiA0ECOgAIIANBAjoAACAAQQA7ASQgAyACQR9xOgABQSRFDQAgACAEQRRqQST8CgAACyAEQcAAaiSAgICAAAtYAAJAIAMgAkkNACAAQgA3AgAPCyAEQf8BcSEEAkADQCACIANGDQECQCABIANqLQAAIARHDQAgAEEBOgAEIAAgAzYCAA8LIANBAWohAwwACwsgAEIANwIAC3kCAX8BfiOAgICAAEEQayIDJICAgIAAAkACQEEBDQBCgICAgBAhBAwBCwJAIAINAEL/////DyEEDAELIAEoAgAgAkEAQQAgASgCBCgCABGAgICAAICAgIAAIgJFrUIghiACrYQhBAsgACAENwIAIANBEGokgICAgAALewECfyOAgICAAEEgayIEJICAgIAAIAQgASkCADcDCCAEQRRqIARBCGogAxCIgYCAAAJAIAQvARwiBQ0AIAQoAhQhAQJAIAQoAhgiA0UNACABIAIgA/wKAAALIAAgAzYCBCAAIAE2AgALIAAgBTsBCCAEQSBqJICAgIAAC5oGAgd/A34jgICAgABBoAFrIgIkgICAgAACQCAAKAIEIgMNACAAKAIAIQMLIAEoAhAhBCABKAIMIQUgAS0ACCEGIAEoAgQhByABKAIAIQggAygCACEAIAJBOGpCADcDACACQgA3AzAgAkKsmuLTo9Lw+h83A1AgAkKsmuLTo9Lw+h83A0ggAkKsmuLTo9Lw+h83A0ACQEE4RQ0AIAJB2ABqQYjryYAAQTj8CgAACyACIAZBAXEiAToAYCACQoGAgIAQNwNYIAIgAToAkAECQAJAIAFFDQAgAiAINgBhIAJChYCAgNAANwNYDAELIAJBMGogCCAAaiAHEKGEgIAACyACQeAAaiEGIAJBMGogACAFaiAEEKGEgIAAIAIpA0AhCSACKAJcIQACQAJAAkACQAJAAkAgAigCWCIFQRBLDQAgAEEDTQ0BIAI1AmBCIIYgBiAAQQF2QQxxIgFqNQIAhCEKIAYgAEF8aiIAajUAAEIghiAGIAAgAWtqNQAAhCELDAULIAIpA1AhCiACKQNIIQtBACEBIABBEEkNAUEAIQMgACEIDAILQgAhCyAADQJCACEKDAMLQRAhCAJAQRAgAGsiA0UNACACQZABaiAGIABqQSBqIAP8CgAACwJAIABFDQAgAkGQAWogA2ogBiAA/AoAAAsgAkGQAWohBgsgBiADaiEEIAggA2shAyALIAqFIAmFIQkCQANAIAFBEGoiACADTw0BIAJBIGogBCABaiIBQQhqKQAAIAmFQgAgASkAAELb0dCFmtrfgWeFQgAQx4SAgAAgAikDKCACKQMghSEJIAAhAQwACwsgBiAIaiIBQXhqKQAAIQsgAUFwaikAACEKDAELIAYgAEEBdmoxAABCCIYgAjEAYEIQhoQgBiAAakF/ajEAAIQhCgsgAkEQaiAKQtvR0IWa2t+BZ4VCACALIAmFQgAQx4SAgAAgAiACKQMYQtvR0IWa2t+BZ4VCACAFrSACKQMQhUKvyPXFx6yHu6B/hUIAEMeEgIAAIAIpAwAhCSACKQMIIQogAkGgAWokgICAgAAgCiAJhQsyAQF/AkAgAEGHsMqAAEHBABCagICAACICQf//A3ENACAAIAEvAQAQp4SAgAAhAgsgAgsxAQF/AkAgAEH4sMqAAEEwEJqAgIAAIgJB//8DcQ0AIAAgAS8BABCnhICAACECCyACCzEBAX8CQCAAQaixyoAAQTAQmoCAgAAiAkH//wNxDQAgACABLwEAEKeEgIAAIQILIAILMwEBfyAAQQhqIQBBACEBAkADQCAAKAIAIgBFDQEgASAAQXxqKAIAakF4aiEBDAALCyABC4IBAQF/I4CAgIAAQRBrIgMkgICAgAACQAJAIAJBe2pBfE8NACAAQSo2AQAMAQsgA0EMaiABIAJBEBDIgICAAAJAIAMvAQ4NACAAQQA7AQAgACADLwEMQf8BbCACQQJ0QfS7yoAAaigCAG46AAIMAQsgAEEqNgEACyADQRBqJICAgIAAC9siCgR/AX4CfwF+An8BfgJ/AXwBfgN/I4CAgIAAQYAHayIDJICAgIAAAkACQAJAAkACQAJAAkAgAkUNACACIAEtAAAiBEFVakH9AXFFIgVGDQAgASAFaiEGAkACQAJAAkACQAJAIAIgBWsiBUECSQ0AIAYtAABBMEcNACAGLQABIgJBv39qQf8BcUEaSUEFdCACckH/AXFB+ABHDQBCACEHIANCADcC7AYgAyAFQX5qNgLoBkECIQggAyAGQQJqNgLkBiADQgA3A0ggA0HkBmogA0HIAGoQioSAgAAgAygC7AYiAiADKALwBiIBayEJAkACQCACIAMoAugGTw0AIAMoAuQGIAJqLQAAQS5GDQELQgAhCiAJIQsMAgsgAyACQQFqIgI2AuwGIANB5AZqIANByABqEIqEgIAAIAEgAmsgAygC7AYiAiADKALwBiIBa2oiDCAJaiELQgAgDK1CAoZ9IQoMAQtCACEKIANCADcC7AYgAyAFNgLoBiADIAY2AuQGIANCADcDSCADQeQGaiADQcgAahCLhICAACADKALsBiIIIAMoAvAGIgJrIQkCQAJAAkAgCCADKALoBk8NACADKALkBiAIai0AAEEuRg0BC0IAIQcgCSELDAELIAMgCEEBaiIBNgLsBiADQeQGaiADQcgAahCLhICAACACIAFrIAMoAuwGIgggAygC8AYiAmtqIgEgCWohC0IAIAGtfSEHCwJAAkACQCALRQ0AQgAhDQJAIAggAygC6AZPDQAgAygC5AYgCGotAABB3wFxQcUARw0AIAMgCEEBajYC7AYgA0HYAGogA0HkBmoQjISAgAACQCADLQBgDQBCACEKDAILIAMpA1giDSAHfCEHIAMoAvAGIQIgAygC7AYhCAsCQCACRQ0AQQAhAiADKALoBiEBIAMoAuQGIQwDQCACIAFPDQECQCAMIAJqIg4tAABB3wBHDQBCACEKQQAhDyACRQ0FIAJBAWoiAiABRg0FIA5Bf2otAABBUGpB/wFxQQlLDQQgDCACai0AAEFQakH/AXFBCk8NBAsgAkEBaiECDAALCwJAAkAgC0ETSg0AIANBADoA9gYgAyAEQf8BcUEtRjoA+AYgA0H2BmohDCADQfgGaiEBIANB1gBqIQ4MAQsgA0IANwLsBiALQW1qIQwgAygC5AYhDkEBIQJBACEPA0ACQAJAIANB5AZqEI2EgIAAQQFxRQ0AAkAgDiACakF/ai0AACIBQd8ARg0AIAxBACABQVFqIgsgCyABSxtrIQwMAgsgAyAPQQFqIg82AvAGDAELAkAgDEEASiICRQ0AIANCADcC7AYgA0IANwNIIANB5AZqIANByABqEI6EgIAAAkAgAykDSEETEI+EgIAAWg0AIAMgAygC7AZBAWoiATYC7AYgASADKALwBmshCSADQeQGaiADQcgAahCOhICAAAsgDSAJrXwgAygC7AYgAygC8AZrrX0hBwsgAyACOgD2BiADIARB/wFxQS1GOgD4BiADQfYGaiEMIANB+AZqIQEgA0HWAGohDgwCCyADIAI2AuwGIAJBAWohAgwACwsgAykDSCEKQQAhAiAOQQA6AAAgAS0AACEBIAwtAAAhDAwEC0EAIQgLQQAhDwtBACECQQAhDEEAIQFCACEHDAQLAkAgCw0AQQAhAQwCC0IAIQ0CQAJAAkAgAiADKALoBk8NACADKALkBiACai0AAEHfAXFB0ABGDQELIAohBwwBCyADIAJBAWo2AuwGIANB2ABqIANB5AZqEIyEgIAAAkAgAy0AYA0AQQAhAUIAIQcMAwsgAykDWCINIAp8IQcgAygC8AYhASADKALsBiECCyACQQJqIQgCQCABRQ0AQQAhAiADKALoBiEMIAMoAuQGIQ4DQCACIAxPDQECQCAOIAJqIg8tAABB3wBHDQBBACEBQgAhCgJAIAJFDQAgAkEBaiICIAxGDQACQCAPQX9qLQAAEJCEgIAAQQFxRQ0AIA4gAmotAAAQkISAgABBAXENAgtBACEBC0IAIQcMBQsgAkEBaiECDAALCwJAAkAgC0EQSg0AIANBADoA9gYgAyAEQf8BcUEtRjoA+AYgA0H2BmohDCADQfgGaiEBIANB1gBqIQ4MAQsgA0IANwLsBiALQXBqIQwgAygC5AYhDkEBIQJBACEPA0ACQAJAIANB5AZqEI2EgIAAQQFxRQ0AAkAgDiACakF/ai0AACIBQd8ARg0AIAxBACABQVFqIgsgCyABSxtrIQwMAgsgAyAPQQFqIg82AvAGDAELAkAgDEEASiICRQ0AIANCADcC7AYgA0IANwNIIANB5AZqIANByABqEJGEgIAAAkAgAykDSEEQEI+EgIAAWg0AIAMgAygC7AZBAWoiATYC7AYgASADKALwBmshCSADQeQGaiADQcgAahCRhICAAAsgCa0gAygC7AYgAygC8AZrrX1CAoYgDXwhBwsgAyACOgD2BiADIARB/wFxQS1GOgD4BiADQfYGaiEMIANB+AZqIQEgA0HWAGohDgwCCyADIAI2AuwGIAJBAWohAgwACwsgAykDSCEKQQEhAiAOQQE6AAAgAS0AACEBIAwtAAAhDAtBASEPDAILQgAhCgtBACEMQQAhAkEAIQ8LAkAgD0UNACAFIAhHDQAgAg0CIAdCWnxCRFQNBSAKQoCAgICAgIAQVg0FIAxBAXFFDQMMBQtBAyECAkACQCAGIAVB1KnAgABBAxCShICAAEEBcUUNAEEIQQMgBkEDaiAFQX1qQa+SwIAAQQUQkoSAgABBAXEbIQJEAAAAAAAA8P9EAAAAAAAA8H8gBEH/AXFBLUYbIRAMAQtEAAAAAAAA+H8hECAGIAVBmqTAgABBAxCShICAAEEBcUUNAQsgBSACRg0FCyAAQSo2AQAMBQsCQCAKQgBSDQBEAAAAAAAAAIBEAAAAAAAAAAAgAUEBcRshEAwECyAHQjd8IQcCQANAIApCf3xC/v///////x9WDQEgB0J/fCEHIApCAYYhCgwACwsgCiAMrUIBg4QhCgJAA0ACQCAKQv////////8/Vg0AAkADQCAKQgJUDQEgB0J9fEL/d1UNASAKQgGIIApCAYOEIQogB0IBfCEHDAALCyAHQn98IREgCkICiCINQgGDIApCA4OEQgNRDQIMBAsgCkIBiCAKQgGDhCEKIAdCAXwhBwwACwtCgICAgICAgAggDUIBfCIKIApCgICAgICAgBBRIgIbIQ0gByARIAIbIREMAQsCQAJAIAdCFlUNACAHpyECIAq6IRACQCAHQgBZDQAgEEHolMmAACACQQN0aysDAKMhEAwCCyACQQN0QeiUyYAAaisDACAQoiEQDAELIAMgCkIAIAenQQN0QbiVyYAAaikDAEIAEMeEgIAAIAMgAykDCEIAUiICOgBYIAINAiADKQMAIg1CgICAgICAgBBWDQIgDbpEktVNBs/wgESiIRALIBCaIBAgAUEBcRshEAwCCwJAQoF4IBEgDUKAgICAgICACFQbIgpC/wdXDQBEAAAAAAAA8P9EAAAAAAAA8H8gAUEBcRshEAwCCyAKQjSGQoCAgICAgID4P3xCgICAgICAgPj/AIMgDUL/////////B4OEIgpCgICAgICAgICAf4QgCiABQQFxG78hEAwBCyADQRhqIAcgChCThICAAAJAIAMtAChFDQAgAygCICECIAMpAxghDQJAIAxBAXENACACrUI0hiANhL8iEJogECABQQFxGyEQDAILIANBMGogByAKQgF8EJOEgIAAIAMtAEBFDQAgDSADKQMwUg0AIAIgAygCOEcNACACrUI0hiANhL8iEJogECABQQFxGyEQDAELQQAhAgJAQYUGRQ0AIANB3ABqQQBBhQb8CwALIANBADYC8AYgAyAFNgLoBiADIAY2AuQGAkADQAJAIAUgAkcNACAFIQIMAgsCQCAGIAJqLQAAIgFB3wBGDQAgAUEwRw0CCyACQQFqIQIMAAsLIAMgAjYC7AYgA0HhAGohAUEAIQICQANAIANB9gZqIANB5AZqEJSEgIAAIAMtAPcGRQ0BAkAgAkH/BUsNACABIAJqIAMtAPYGOgAACyACQQFqIQIMAAsLIAMgAjYCWEEAIQ8CQAJAAkAgAygC7AYiDiADKALoBiIITw0AIAMoAuQGIhIgDmotAABBLkYNAQtBACEFIAIhAQwBCyADKALwBiETIA5BAWoiFCEMAkAgAg0AIAhBf2ohCyASQQFqIQkDQAJAIAsgDkcNACAIIQwMAgsgCSAOaiEFIA5BAWoiDCEOIAUtAABBMEYNAAsLIBQgE2shEyABIAJqIQkgEiAMaiELQQAhBQJAA0AgAiAFaiEBIAwgBWoiDkEIaiAISw0BIAFB9wVLDQEgCyAFaikAACIKQsaMmbLkyJGjxgB8IApC0J+//vz58+dPfCIKhEKAgYKEiJCgwIB/g0IAUg0BIAkgBWogCjcAACAFQQhqIQUMAAsLIAMgDjYC7AYCQANAIANB+AZqIANB5AZqEJSEgIAAIAMtAPkGRQ0BAkAgAUH/BUsNACADQdgAaiABakEJaiADLQD4BjoAAAsgAUEBaiEBDAALCyADIAE2AlggAyATIAMoAvAGIAMoAuwGIg5raiIFNgJcCwJAIAFFDQAgDiADKALwBkF/c2ohAkEAIQwCQANAAkACQCAGIAJqLQAAQVJqDgMBAwADCyAMQQFqIQwLIAJBf2oiAg0ACwsgAyABIAVqIgU2AlwgAyABIAxrIgI2AlhBgAYhDwJAIAJBgAZLDQAgAiEPDAELIANBgAY2AlggA0EBOgBgCwJAIA4gAygC6AYiAU8NACADKALkBiIMIA5qLQAAQd8BcUHFAEcNAEEBIQsgAyAOQQFqIgg2AuwGQQAhAkEAIQYCQCAIIAFPDQBBACEGAkACQCAMIAhqLQAAQVVqDgMAAgECC0EAIQsLIAMgDkECajYC7AYgCyEGCwJAA0AgA0HIAGogA0HkBmoQlISAgAAgAy0ASUUNASACQQpsIAMtAEhqIAIgAkGAgARIGyECDAALCyADQQAgAmsgAiAGGyAFaiIFNgJcCyAPQRMgD0ETSxshASAPIQICQANAIAEgAkYNASADQdgAaiACakEJakEAOgAAIAJBAWohAgwACwtCACEHAkACQCAPRQ0AIAVBvH1IDQBCgICAgICAgPj/ACEKIAVBtQJKDQFBACEBA0ACQCAFQQBKDQAgA0HhAGohDANAAkACQAJAIAVBAEoNAAJAIAUNAEECIQIgDC0AACIGQQJJDQMgBkF7akH/AXFBBUkNAUEBIQIMAwtBACAFayICQRJNDQFBPCECDAILIAFBf2ohAgJAA0AgAkGBeEoNASADQdgAakGCeCACayIBQTwgAUE8SRsiARCVhICAACABIAJqIQIMAAsLIAJB/wdKDQYgA0HYAGpBNRCWhICAAAJAIANB2ABqEJeEgIAAIg1C/////////w9YDQAgA0HYAGpBARCVhICAACADQdgAahCXhICAACENIAJB/wdGDQcgAkEBaiECCyANQv////////8HgyEHQf4HQf8HIA1CgICAgICAgAhUGyACaq1CNIYhCgwGCyACQZjpyYAAai0AACECCyADQdgAaiACEJaEgIAAIAMoAlwiBUH/D0oNBCABIAJrIQEMAAsLQTwhAgJAIAVBEksNACAFQZjpyYAAai0AACECCyADQdgAaiACEJWEgIAAIAIgAWohASADKAJcIgVBgXBODQALC0IAIQoLIAogB4S/IhCaIBAgBEH/AXFBLUYbIRALAkACQCAQRAAAAAAAAAAAYw0AIBBEAAAAAAAA8D9kRQ0BCyAAQSo2AQAMAQsgAEEAOwEAIAAgEEQAAAAAAOBvQKL8AzoAAgsgA0GAB2okgICAgAALUAEBfyOAgICAAEEQayICJICAgIAAAkADQCACQQ5qIAAQtISAgAAgAi0AD0UNASABIAEpAwBCBIYgAjEADnw3AwAMAAsLIAJBEGokgICAgAALgQICAn8BfiOAgICAAEEQayICJICAgIAAIAAoAgghAwJAA0AgA0EIaiAAKAIESw0BIAAoAgAgA2opAAAiBELGjJmy5MiRo8YAfCAEQtCfv/78+fPn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QQNxDgQDAAECAwtBDCEEQf2iwIAAIQUMAgtBCSEEQeSTwIAAIQUMAQtBBSEEQYubwIAAIQULIAMgBTYCCCADIAQ2AgwgACADEKmEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQceWwIAAQQYQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACLQANELeEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQb+UwIAAQQsQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACLQAOELeEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQZWcwIAAQQwQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACLQAPELeEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEEERw0AIAAgARCvhICAACIEQf//A3ENASACKAIAIQQLAkAgBEEFRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEGcrcCAAEEHEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAigCBCACKAIIELaEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEEGRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEGcrsCAAEEJEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAkEEahC4hICAACIEQf//A3ENASAAQaOSwIAAQQIQmoCAgAAiBEH//wNxDQEgAigCACEECwJAIARBB0cNACAAQaaSwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHt6sCAAEECEJqAgIAAIgRB//8DcQ0BIABBva/AgABBBBCagICAACIEQf//A3ENASAAQYTrwIAAQQMQmoCAgAAiBEH//wNxDQEg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7erAgABBAhCagICAACIEQf//A3ENASAAQdWcwIAAQQUQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIABBnpLAgABBBxCagICAACIEQf//A3ENASAAQezqwIAAQQMQmoCAgAAiBEH//wNxDQEgAEG1ksCAAEEIEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAigCDBDng4CAACIEQf//A3ENASAAQaOSwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHs6sCAAEEDEJqAgIAAIgRB//8DcQ0BIABB953AgABBChCagICAACIEQf//A3ENASAAQYTrwIAAQQMQmoCAgAAiBEH//wNxDQEgACABIAItABAQuYSAgAAiBEH//wNxDQEgAEGjksCAAEECEJqAgIAAIgRB//8DcQ0BIAIoAgAhBAsCQCAEQQxHDQAgAEGmksCAAEECEJqAgIAAIgRB//8DcQ0BIABB7erAgABBAhCagICAACIEQf//A3ENASAAQd2twIAAQQUQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACKAIEIAIoAghBARC1hICAACIEQf//A3ENASAAQezqwIAAQQMQmoCAgAAiBEH//wNxDQEgAEHLlMCAAEEEEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAigCDCACKAIQQQEQtYSAgAAiBEH//wNxDQEgAEGjksCAAEECEJqAgIAAIgRB//8DcQ0BIAIoAgAhBAsCQCAEQQ1HDQAgAEGmksCAAEECEJqAgIAAIgRB//8DcQ0BIABB7erAgABBAhCagICAACIEQf//A3ENASAAQZiwwIAAQQIQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACKAIEIAIoAggQtoSAgAAiBEH//wNxDQEgAEHs6sCAAEEDEJqAgIAAIgRB//8DcQ0BIABBlKjAgABBAxCagICAACIEQf//A3ENASAAQYTrwIAAQQMQmoCAgAAiBEH//wNxDQEgACABIAIoAgwgAigCEEEBELWEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEEORw0AIAAgARCvhICAACIEQf//A3ENASACKAIAIQQLAkAgBEEPRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHinMCAAEELEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAi8BBBCQg4CAACIEQf//A3ENASAAQaOSwIAAQQIQmoCAgAAiBEH//wNxDQEgAigCACEECwJAIARBEEcNACAAIAEgAigCBCACKAIIQQIQtYSAgAAiBEH//wNxDQEgAigCACEECwJAIARBEUcNACAAQefqwIAAQQQQmoCAgAAiBEH//wNxDQEgAEGGrMCAAEGim8CAACACLQAMG0EFEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENAQJAAkAgAi0ADA0AIAAgARCvhICAACIEQf//A3ENAyACLQAMRQ0BCyAAIAEgAigCBCACKAIIQQEQtYSAgAAiBEH//wNxDQILIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEESRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHbrMCAAEEFEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASACKAIEIQYgA0EBNgIEIANB7urAgAA2AgBBBiEEQe6qwIAAIQUCQAJAAkACQAJAIAYOBQQAAQIDBAtBAyEEQaSbwIAAIQUMAwtBBSEEQYmewIAAIQUMAgtBDSEEQeuswIAAIQUMAQtBBSEEQfmswIAAIQULIAMgBTYCCCADIAQ2AgwgACADEKmEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQcycwIAAQQgQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACQQhqELiEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEETRw0AIAAgARCvhICAACIEQf//A3ENASACKAIAIQQLAkAgBEEURw0AIAAgASAC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IAdLDQBBACEJAkADQCAJIAZPDQECQCACKAIEIglFDQAgCCAKaiACKAIAIAn8CgAACyABIAEoAgwgCWoiCjYCDEEBIQkMAAsLIAIgBkEDdGoiCSgCACECAkACQCAJKAIEIgkOAgMAAQsCQCAERQ0AIAggCmogAi0AACAE/AsACyABIAEoAgwgBGo2AgwMAgsDQCAERQ0CAkAgCUUNACAIIApqIAIgCfwKAAALIAEgASgCDCAJaiIKNgIMIARBf2ohBAwACwsgBUEIaiABIAIgAyAEIAEoAgAoAgARgYCAgACAgICAACAAIAUpAwg3AgAMAQsgACALNgIAIABBADsBBAsgBUEQaiSAgICAAAtgAQJ/QgFBICAAQX9qZ2siAK1C//8Dg4anIQECQCAAQf//A3FBAnRBgL3KgABqIgIoAgAiAEUNACACIAFBEHQgAGpBfGooAgA2AgAgAA8LQQAgAUAAIgBBEHQgAEF/RhsL4AEBAn8jgICAgABBEGsiBiSAgICAACAGIANBH3E6AA9BfyAEQQRqIgcgByAESRsiBEEBIAN0IgMgBCADSxshBAJAAkACQCACQQRqIgIgAyACIANLGyIDQX9qZyICQW9qQQxLDQAgBEF/amciAw0BQQAhAwwCC0IBQSAgA0GDgARqQRB2QX9qZ2utQv//A4OGp0IBQSAgBEGDgARqQRB2QX9qZ2utQv//A4OGp0YhAwwBC0IBQSAgAmutQv//A4OGp0IBQSAgA2utQv//A4OGp0YhAwsgBkEQaiSAgICAACADCxwAIAFBACAEIAQgAiADIAQgBBC8hICAAEEBcRsLIwAgACgCACABIAJBH3EgAyAAKAIEKAIAEYCAgIAAgICAgAALJwAgACgCACABIAIgA0EfcSAEIAUgACgCBCgCBBGCgICAAICAgIAACycAIAAoAgAgASACIANBH3EgBCAFIAAoAgQoAggRgoCAgACAgICAAAslACAAKAIAIAEgAiADQR9xIAQgACgCBCgCDBGBgICAAICAgIAAC4QEAQt/I4CAgIAAQSBrIgUkgICAgAAgAiADQQN0aiIGQXhqKAIAIQcgBkF8aigCACEIIAFBCGoiBigCACEJIAZBADYCACABQQRqIgYoAgAhCiAGQarVqtV6NgIAIAFBDGoiBigCACELIAZBADYCACAFIAFBeGopAgA3Awgg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TzExeQAbTzEweQBjb25lbXVfc2hvd19tZXNzYWdlX2JveABjb25lbXVfbWVzc2FnZV9ib3gAG094ABtPOXgAG084eAAbTzd4ABtPNngAG08xNngAG081eAAbTzE1eAAbTzR4ABtPMTR4ABtPM3gAG08xM3gAG08yeAAbTzEyeAAbTzExeAAbTzEweABxdWVzdGlvbl9hcnJvdwBzd2FsbG93AE92ZXJmbG93AHJlZHJhdwAbT3cAG085dwAbTzh3ABtPN3cAG082dwAbTzE2dwAbTzV3ABtPMTV3ABtPNHcAG08xNHcAG08zdwAbTzEzdwAbTzJ3ABtPMTJ3ABtPMTF3ABtPMTB3ABtPdgAbTzl2ABtPOHYAG083dgAbTzZ2ABtPMTZ2ABtPNXYAG08xNXYAG080dgAbTzE0dgAbTzN2ABtPMTN2ABtPMnYAG08xMnYAG08xMXYAG08xMHYAY29udGV4dC1tZW51ABtPdQAbTzl1ABtPOHUAG083dQAbTzZ1ABtPMTZ1ABtPNXUAG08xNXUAG080dQAbTzE0dQAbTzN1ABtPMTN1ABtPMnUAG08xMnUAG08xMXUAG08xMHUAY29uZW11X3RhYl90eHQAY3Vyc29yX3RleHQAdmVydGljYWwtdGV4dABJbnB1dE91dHB1dABjb25lbXVfd2FpdF9pbnB1dABlbmRfb2ZfaW5wdXQAZGNzX3B1dABhcGNfcHV0AHpvb20tb3V0AENvbm5lY3Rpb25UaW1lZE91dABsaXN0AGNvbmVtdV9wcm9ncmVzc19yZXBvcnQAcHJvbXB0X3N0YXJ0AHNlbWFudGljX29wdGlvbl9zdGFydABoeXBlcmxpbmtfc3RhcnQAc2VtYW50aWNfZXhpdF9jb2RlX3N0YXJ0AGFwY19zdGFydABzZW1hbnRpY19wcm9tcHQAcHJpbnQAY3VycmVudABwcmVhbGxvY19zZWdtZW50AGRlZmF1bHQAd2FpdAByaWdodABsZWZ0AE5vU3BhY2VMZWZ0AHJlc2V0AEludmFsaWRGb3JtYXQAG090ABtPOXQAG084dAAbTzd0ABtPNnQAG08xNnQAG081dAAbTzE1dAAbTzR0ABtPMTR0ABtPM3QAG08xM3QAG08ydAAbTzEydAAbTzExdAAbTzEwdAByZXF1ZXN0cwBjbGlja19ldmVudHMAY2xpcGJvYXJkX2NvbnRlbnRzAGR5bmFtaWNfc2VnbWVudHMAY3Jvc3MAcHJvZ3Jlc3MAaXRlbXMAcGFyYW1zAGR1cmF0aW9uX21zAGludGVybWVkaWF0ZXMAU3lzdGVtUmVzb3VyY2VzAGFsaWFzABtPcwAbTzlzABtPOHMAG083cwAbTzZzABtPMTZzABtPNXMAG08xNXMAG080cwAbTzE0cwAbTzNzABtPMTNzABtPMnMAG08xMnMAG08xMXMAG08xMHMAZmxldXIAbGVmdF9wdHIAdGVybWluYXRvcgBjdXJzb3IAZXJyb3IARGVjb2RlRXJyb3IAb3NjX2NvbG9yAGNyb3NzaGFpcgBJc0RpcgBwb2ludGVyAEludmFsaWRDaGFyYWN0ZXIAdG9wX3JpZ2h0X2Nvcm5lcgBib3R0b21fcmlnaHRfY29ybmVyAHRvcF9sZWZ0X2Nvcm5lcgBib3R0b21fbGVmdF9jb3JuZXIAQ29ubmVjdGlvblJlc2V0QnlQZWVyABtPcgAbTzlyABtPOHIAG083cgAbTzZyABtPMTZyABtPNXIAG08xNXIAG080cgAbTzE0cgAbTzNyABtPMTNyABtPMnIAG08xMnIAG08xMXIAG08xMHIAG09xABtPOXEAG084cQAbTzdxABtPNnEAG08xNnEAG081cQAbTzE1cQAbTzRxABtPMTRxABtPM3EAG08xM3EAG08ycQAbTzEycQAbTzExcQAbTzEwcQBkbmQtbm8tZHJvcABoZWxwAHBhcmFtc19zZXAAY29uZW11X3NsZWVwAHJpZ2h0X3VubGVzc19wZW5kaW5nX3dyYXAAG09wABtPOXAAG084cAAbTzdwABtPNnAAG08xNnAAG081cAAbTzE1cAAbTzRwABtPMTRwABtPM3AAG08xM3AAG08ycAAbTzEycAAbTzExcAAbTzEwcABEaXZpc2lvbkJ5WmVybwBjb25lbXVfZ3VpbWFjcm8AG09vABtPOW8AG084bwAbTzdvABtPNm8AG08xNm8AG081bwAbTzE1bwAbTzRvABtPMTRvABtPM28AG08xM28AG08ybwAbTzEybwAbTzExbwAbTzEwbwB0ZXJtaW5hbC5QYXJzZXIuQWN0aW9uAGNvbnRpbnVhdGlvbgBVdGY4RXhwZWN0ZWRDb250aW51YXRpb24AY29sb3Jfb3BlcmF0aW9uAE1pc3NpbmdPcGVyYXRpb24ATG9ja1Zpb2xhdGlvbgBzaG93X2Rlc2t0b3Bfbm90aWZpY2F0aW9uAHJ4dnRfZXh0ZW5zaW9uAGNoYW5nZV93aW5kb3dfaWNvbgB6b29tLWluAGxlbgBuYW4AG09uABtPOW4AG084bgAbTzduABtPNm4AG08xNm4AG081bgAbTzE1bgAbTzRuABtPMTRuABtPM24AG08xM24AG08ybgAbTzEybgAbTzExbgAbWzBuABtPMTBuAHh0ZXJtAEVuZE9mU3RyZWFtABtPbQAbTzltABtPOG0AG083bQAbTzZtABtPMTZtABtPNW0AG08xNW0AG080bQAbTzE0bQAbTzNtABtPMTNtABtPMm0AG08xMm0AG08xMW0AG08xMG0AY21kbGluZV91cmwAa2l0dHlfY29sb3JfcHJvdG9jb2wAbnVsbABhbGwtc2Nyb2xsAGNlbGwAdmlzdWFsX2JlbGwAYWxsAGJlbABmaW5hbABtYXNrAGRjc191bmhvb2sAZGNzX2hvb2sAZG5kLWxpbmsAV291bGRCbG9jawAbT2sAG085awAbTzhrABtPN2sAG082awAbTzE2awAbTzVrABtPMTVrABtPNGsAG08xNGsAG08zawAbTzEzawAbTzJrABtPMTJrABtPMTFrABtPMTBrABtPagAbTzlqABtPOGoAG083agAbTzZqABtPMTZqABtPNWoAG08xNWoAG080agAbTzE0agAbTzNqABtPMTNqABtPMmoAG08xMmoAG08xMWoAG08xMGoAaHlwZXJsaW5rX3VyaQBIeXBlcmxpbmtTZXROZWVkc1JlaGFzaABTdHlsZVNldE5lZWRzUmVoYXNoAGxlZnRfcHRyX3dhdGNoAGNzaV9kaXNwYXRjaABvc2NfZGlzcGF0Y2gAZXNjX2Rpc3BhdGNoAGFsbG9jYWJsZV9zdHJpbmcAU3RyZWFtaW5nAFV0ZjhPdmVybG9uZ0VuY29kaW5nAE5vdE9wZW5Gb3JSZWFkaW5nAGdyYWJiaW5nAEludmFsaWRFbnVtVGFnAGluZgBVdGY4RW5jb2Rlc1N1cnJvZ2F0ZUhhbGYAVXRmOENhbm5vdEVuY29kZVN1cnJvZ2F0ZUhhbGYAbmVzdy1yZXNpemUAcm93LXJlc2l6ZQBudy1yZXNpemUAZXctcmVzaXplAG5zLXJlc2l6ZQBuLXJlc2l6ZQBjb2wtcmVzaXplAG53c2UtcmVzaXplAG5lLXJlc2l6ZQByZW1vdmUAZG5kLW1vdmUAdHJ1ZQBjb25lbXVfcHJvZ3Jlc3NfcHJldmFsdWUAY29uZW11X3Byb2dyZXNzX3ZhbHVlAGNvbmVtdV9zbGVlcF92YWx1ZQBzZW1hbnRpY19vcHRpb25fdmFsdWUAaHlwZXJsaW5rX3BhcmFtX3ZhbHVlAGtpdHR5X2NvbG9yX3Byb3RvY29sX3ZhbHVlAFV0ZjhJbnZhbGlkU3RhcnRCeXRlAGV4ZWN1dGUAY29tcGxldGUAY29uZW11X3Byb2dyZXNzX3ByZXN0YXRlAGNvbmVtdV9wcm9ncmVzc19zdGF0ZQBhbHRlcm5hdGUAaW5kZXRlcm1pbmF0ZQBwYXVzZQBmYWxzZQBCcm9rZW5QaXBlAG1vdXNlX3NoYXBlAGNtZGxpbmUAY2hhbmdlX3dpbmRvd190aXRsZQBub3RpZmljYXRpb25fdGl0bGUAY29uZW11X2NoYW5nZV90YWJfdGl0bGUAY3Jvc3NlZF9jaXJjbGUAVW5zZWVrYWJsZQBVdGY4Q29kZXBvaW50VG9vTGFyZ2UAc2VtYW50aWNfZXhpdF9jb2RlAHJpZ2h0X3NpZGUAbGVmdF9zaWRlAHRvcF9zaWRlAGJvdHRvbV9zaWRlAHJlcG9ydF9wd2QAc2Vjb25kX3RyYW5zcGFyZW50X2JhY2tncm91bmQAc2VsZWN0aW9uX2JhY2tncm91bmQAc2VsZWN0aW9uX2ZvcmVncm91bmQAUHJvY2Vzc05vdEZvdW5kAGNsaXBib2FyZF9raW5kAHByb21wdF9lbmQAaHlwZXJsaW5rX2VuZABjbGlwYm9hcmRfa2luZF9lbmQAYXBjX2VuZABlbmRfb2ZfY29tbWFuZABoYW5kAHZvaWQAaW52YWxpZABhaWQAbm90LWFsbG93ZWQAT3BlcmF0aW9uQWJvcnRlZABVbmltcGxlbWVudGVkAFVuZXhwZWN0ZWQAU29ja2V0Tm90Q29ubmVjdGVkAFdyaXRlRmFpbGVkAFJlYWRGYWlsZWQAQ2FuY2VsZWQAQWNjZXNzRGVuaWVkAFBlcm1pc3Npb25EZW5pZWQAG1s/NjI7MjJj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OTUxNTMxMzgyNTY5MTg3MTc4NTIxNzMwMTc0OTA3MTMzOTE0NTMwMjc3MjUyMTk3MjY1NjI1ADQ4MTQ4MjQ4NjA5NjgwODk2MzI2Mzk5NDQ4NTY0NjIzMTgyOTYzNDUyNTQxMjA1Mzg0NzA0ODgwOTk4NDY5ODg5MTYzOTcwOTQ3MjY1NjI1ADg4ODE3ODQxOTcwMDEyNTIzMjMzODkwNTMzNDQ3MjY1NjI1ADMxNTU0NDM2MjA4ODQwNDcyMjE2NDY5MTQyNjExMzExNDQ5MTg2OTI4MjU3NDA0MzYwOTIwMTkwODExMTU3MjI2NTYyNQA1ODIwNzY2MDkxMzQ2NzQwNzIyNjU2MjUAMTM1NTI1MjcxNTYwNjg4MDU0MjUwOTMxNjAwMTA4NzQyNzEzOTI4MjIyNjU2MjUANTA0ODcwOTc5MzQxNDQ3NTU1NDYzNTA2MjgxNzgwOTgzMTg2OTkwODUyMTE4NDY5Nzc0NzIzMDUyOTc4NTE1NjI1ADkzMTMyMjU3NDYxNTQ3ODUxNTYyNQAxMTc1NDk0MzUwODIyMjg3NTA3OTY4NzM2NTM3MjIyMjQ1Njc3ODE4NjY1NTU2NzcyMDg3NTIxNTA4NzUxNzA2Mjc4NDE3MjU5NDU0NzI3MTcyODUxNTYyNQAyMTY4NDA0MzQ0OTcxMDA4ODY4MDE0OTA1NjAxNzM5ODgzNDIyODUxNTYyNQAxNDIxMDg1NDcxNTIwMjAwMzcxNzQyMjQ4NTM1MTU2MjUANzcwMzcxOTc3NzU0ODk0MzQxMjIyMzkxMTc3MDMzOTcwOTI3NDE1MjQwNjU5Mjg2MTU1Mjc4MDk1OTc1NTE4MjI2NjIzNTM1MTU2MjUAMzMwODcyMjQ1MDIxMjExMDY5OTQ4NTYzNDc2ODI3OTg1MTQxNDI2MzI0ODQ0MzYwMzUxNTYyNQA2MTAzNTE1NjI1ADE5NzIxNTIyNjMwNTI1Mjk1MTM1MjkzMjE0MTMyMDY5NjU1NzQxODMwMTYwODc3NzI1NTc1MTE5MjU2OTczMjY2NjAxNTYyNQAzNjM3OTc4ODA3MDkxNzEyOTUxNjYwMTU2MjUAODQ3MDMyOTQ3MjU0MzAwMzM5MDY4MzIyNTAwNjc5NjQxOTYyMDUxMzkxNjAxNTYyNQAyMzg0MTg1NzkxMDE1NjI1ADEyOTI0Njk3MDcxMTQxMDU3NDE5ODY1NzYwODEzNTkzMTY5NTg2OTY1ODE0MjMyODI2MjMyOTEwMTU2MjUANTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjUAMzAwOTI2NTUzODEwNTA1NjAyMDM5OTk2NTUzNTI4ODk0ODkzNTIxNTc4MzgyNTMzNjU0NDA1NTA2MjQwNDM2ODA3Mjc0ODE4NDIwNDEwMTU2MjUAMTUyNTg3ODkwNjI1ADgyNzE4MDYxMjU1MzAyNzY3NDg3MTQwODY5MjA2OTk2Mjg1MzU2NTgxMjExMDkwMDg3ODkwNjI1ADE5MjU5Mjk5NDQzODcyMzU4NTMwNTU5Nzc5NDI1ODQ5MjczMTg1MzgxMDE2NDgyMTUzODgxOTUyMzk5Mzg3OTU1NjY1NTg4Mzc4OTA2MjUAMzU1MjcxMzY3ODgwMDUwMDkyOTM1NTYyMTMzNzg5MDYyNQAyMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNQAxMjYyMTc3NDQ4MzUzNjE4ODg4NjU4NzY1NzA0NDUyNDU3OTY3NDc3MTMwMjk2MTc0NDM2ODA3NjMyNDQ2Mjg5MDYyNQA1NDIxMDEwODYyNDI3NTIyMTcwMDM3MjY0MDA0MzQ5NzA4NTU3MTI4OTA2MjUANTk2MDQ2NDQ3NzUzOTA2MjUAMzIzMTE3NDI2Nzc4NTI2NDM1NDk2NjQ0MDIwMzM5ODI5MjM5Njc0MTQ1MzU1ODIwNjU1ODIyNzUzOTA2MjUAMTM4Nzc3ODc4MDc4MTQ0NTY3NTUyOTUzOTU4NTExMzUyNTM5MDYyNQA3NTIzMTYzODQ1MjYyNjQwMDUwOTk5OTEzODM4MjIyMzcyMzM4MDM5NDU5NTYzMzQxMzYwMTM3NjU2MDEwOTIwMTgxODcwNDYwNTEwMjUzOTA2MjUANDkzMDM4MDY1NzYzMTMyMzc4MzgyMzMwMzUzMzAxNzQxMzkzNTQ1NzU0MDIxOTQzMTM5Mzc3OTgxNDI0MzMxNjY1MDM5MDYyNQA5MDk0OTQ3MDE3NzI5MjgyMzc5MTUwMzkwNjI1ADIxMTc1ODIzNjgxMzU3NTA4NDc2NzA4MDYyNTE2OTkxMDQ5MDUxMjg0NzkwMDM5MDYyNQAzMzg4MTMxNzg5MDE3MjAxMzU2MjczMjkwMDAyNzE4NTY3ODQ4MjA1NTY2NDA2MjUAMTQ1NTE5MTUyMjgzNjY4NTE4MDY2NDA2MjUANzg4ODYwOTA1MjIxMDExODA1NDExNzI4NTY1MjgyNzg2MjI5NjczMjA2NDM1MTA5MDIzMDA0NzcwMjc4OTMwNjY0MDYyNQAxMjAzNzA2MjE1MjQyMDIyNDA4MTU5OTg2MjE0MTE1NTc5NTc0MDg2MzEzNTMwMTM0NjE3NjIyMDI0OTYxNzQ3MjI5MDk5MjczNjgxNjQwNjI1ADIyMjA0NDYwNDkyNTAzMTMwODA4NDcyNjMzMzYxODE2NDA2MjUANTE2OTg3ODgyODQ1NjQyMjk2Nzk0NjMwNDMyNTQzNzI2NzgzNDc4NjMyNTY5MzEzMDQ5MzE2NDA2MjUAOTUzNjc0MzE2NDA2MjUANDcwMTk3NzQwMzI4OTE1MDAzMTg3NDk0NjE0ODg4ODk4MjcxMTI3NDY2MjIyNzA4ODM1MDA4NjAzNTAwNjgyNTExMzY2OTAzNzgxODkwODY5MTQwNjI1ADg2NzM2MTczNzk4ODQwMzU0NzIwNTk2MjI0MDY5NTk1MzM2OTE0MDYyNQAzNzI1MjkwMjk4NDYxOTE0MDYyNQAyMDE5NDgzOTE3MzY1NzkwMjIxODU0MDI1MTI3MTIzOTMyNzQ3OTYzNDA4NDczODc5MDk4ODkyMjExOTE0MDYyNQA1Njg0MzQxODg2MDgwODAxNDg2OTY4OTk0MTQwNjI1ADMwODE0ODc5MTEwMTk1NzczNjQ4ODk1NjQ3MDgxMzU4ODM3MDk2NjA5NjI2MzcxNDQ2MjExMTIzODM5MDIwNzI5MDY0OTQxNDA2MjUAMTMyMzQ4ODk4MDA4NDg0NDI3OTc5NDI1MzkwNzMxMTk0MDU2NTcwNTI5OTM3NzQ0MTQwNjI1ADI0NDE0MDYyNQAzODUxODU5ODg4Nzc0NDcxNzA2MTExOTU1ODg1MTY5ODU0NjM3MDc2MjAzMjk2NDMwNzc2MzkwNDc5ODc3NTkxMTMzMTE3Njc1NzgxMjUANzEwNTQyNzM1NzYwMTAwMTg1ODcxMTI0MjY3NTc4MTI1ADMwNTE3NTc4MTI1ADE2NTQzNjEyMjUxMDYwNTUzNDk3NDI4MTczODQxMzk5MjU3MDcxMzE2MjQyMjE4MDE3NTc4MTI1ADI1MjQzNTQ4OTY3MDcyMzc3NzczMTc1MzE0MDg5MDQ5MTU5MzQ5NTQyNjA1OTIzNDg4NzM2MTUyNjQ4OTI1NzgxMjUANDY1NjYxMjg3MzA3NzM5MjU3ODEyNQA1ODc3NDcxNzU0MTExNDM3NTM5ODQzNjgyNjg2MTExMjI4Mzg5MDkzMzI3NzgzODYwNDM3NjA3NTQzNzU4NTMxMzkyMDg2Mjk3MjczNjM1ODY0MjU3ODEyNQAxMDg0MjAyMTcyNDg1NTA0NDM0MDA3NDUyODAwODY5OTQxNzExNDI1NzgxMjUAMTE5MjA5Mjg5NTUwNzgxMjUANjQ2MjM0ODUzNTU3MDUyODcwOTkzMjg4MDQwNjc5NjU4NDc5MzQ4MjkwNzExNjQxMzExNjQ1NTA3ODEyNQAyNzc1NTU3NTYxNTYyODkxMzUxMDU5MDc5MTcwMjI3MDUwNzgxMjUAMTUwNDYzMjc2OTA1MjUyODAxMDE5OTk4Mjc2NzY0NDQ3NDQ2NzYwNzg5MTkxMjY2ODI3MjAyNzUzMTIwMjE4NDAzNjM3NDA5MjEwMjA1MDc4MTI1ADQyMzUxNjQ3MzYyNzE1MDE2OTUzNDE2MTI1MDMzOTgyMDk4MTAyNTY5NTgwMDc4MTI1ADE4MTg5ODk0MDM1NDU4NTY0NzU4MzAwNzgxMjUAOTg2MDc2MTMxNTI2MjY0NzU2NzY0NjYwNzA2NjAzNDgyNzg3MDkxNTA4MDQzODg2Mjc4NzU1OTYyODQ4NjYzMzMwMDc4MTI1ADExMzY4NjgzNzcyMTYxNjAyOTczOTM3OTg4MjgxMjUANjE2Mjk3NTgyMjAzOTE1NDcyOTc3OTEyOTQxNjI3MTc2NzQxOTMyMTkyNTI3NDI4OTI0MjIyNDc2NzgwNDE0NTgxMjk4ODI4MTI1ADI2NDY5Nzc5NjAxNjk2ODg1NTk1ODg1MDc4MTQ2MjM4ODExMzE0MTA1OTg3NTQ4ODI4MTI1ADE3MzQ3MjM0NzU5NzY4MDcwOTQ0MTE5MjQ0ODEzOTE5MDY3MzgyODEyNQA5NDAzOTU0ODA2NTc4MzAwMDYzNzQ5ODkyMjk3Nzc3OTY1NDIyNTQ5MzI0NDU0MTc2NzAwMTcyMDcwMDEzNjUwMjI3MzM4MDc1NjM3ODE3MzgyODEyNQA3NDUwNTgwNTk2OTIzODI4MTI1ADQwMzg5Njc4MzQ3MzE1ODA0NDM3MDgwNTAyNTQyNDc4NjU0OTU5MjY4MTY5NDc3NTgxOTc3ODQ0MjM4MjgxMjUAMTAzMzk3NTc2NTY5MTI4NDU5MzU4OTI2MDg2NTA4NzQ1MzU2Njk1NzI2NTEzODYyNjA5ODYzMjgxMjUAMTkwNzM0ODYzMjgxMjUAMjQwNzQxMjQzMDQ4NDA0NDgxNjMxOTk3MjQyODIzMTE1OTE0ODE3MjYyNzA2MDI2OTIzNTI0NDA0OTkyMzQ5NDQ1ODE5ODU0NzM2MzI4MTI1ADQ0NDA4OTIwOTg1MDA2MjYxNjE2OTQ1MjY2NzIzNjMyODEyNQAxNTc3NzIxODEwNDQyMDIzNjEwODIzNDU3MTMwNTY1NTcyNDU5MzQ2NDEyODcwMjE4MDQ2MDA5NTQwNTU3ODYxMzI4MTI1ADI5MTAzODMwNDU2NzMzNzAzNjEzMjgxMjUANjc3NjI2MzU3ODAzNDQwMjcxMjU0NjU4MDAwNTQzNzEzNTY5NjQxMTEzMjgxMjUAMjk4MDIzMjIzODc2OTUzMTI1ADE2MTU1ODcxMzM4OTI2MzIxNzc0ODMyMjAxMDE2OTkxNDYxOTgzNzA3MjY3NzkxMDMyNzkxMTM3Njk1MzEyNQA2OTM4ODkzOTAzOTA3MjI4Mzc3NjQ3Njk3OTI1NTY3NjI2OTUzMTI1ADM3NjE1ODE5MjI2MzEzMjAwMjU0OTk5NTY5MTkxMTExODYxNjkwMTk3Mjk3ODE2NzA2ODAwNjg4MjgwMDU0NjAwOTA5MzUyMzAyNTUxMjY5NTMxMjUANDU0NzQ3MzUwODg2NDY0MTE4OTU3NTE5NTMxMjUAMjQ2NTE5MDMyODgxNTY2MTg5MTkxMTY1MTc2NjUwODcwNjk2NzcyODc3MDEwOTcxNTY5Njg4OTkwNzEyMTY1ODMyNTE5NTMxMjUAMTA1ODc5MTE4NDA2Nzg3NTQyMzgzNTQwMzEyNTg0OTU1MjQ1MjU2NDIzOTUwMTk1MzEyNQAxNzc2MzU2ODM5NDAwMjUwNDY0Njc3ODEwNjY4OTQ1MzEyNQA5NjI5NjQ5NzIxOTM2MTc5MjY1Mjc5ODg5NzEyOTI0NjM2NTkyNjkwNTA4MjQxMDc2OTQwOTc2MTk5NjkzOTc3ODMyNzk0MTg5NDUzMTI1ADc2MjkzOTQ1MzEyNQA0MTM1OTAzMDYyNzY1MTM4Mzc0MzU3MDQzNDYwMzQ5ODE0MjY3ODI5MDYwNTU0NTA0Mzk0NTMxMjUAMjcxMDUwNTQzMTIxMzc2MTA4NTAxODYzMjAwMjE3NDg1NDI3ODU2NDQ1MzEyNQAxMTY0MTUzMjE4MjY5MzQ4MTQ0NTMxMjUANjMxMDg4NzI0MTc2ODA5NDQ0MzI5MzgyODUyMjI2MjI4OTgzNzM4NTY1MTQ4MDg3MjE4NDAzODE2MjIzMTQ0NTMxMjUAMTAwOTc0MTk1ODY4Mjg5NTExMDkyNzAxMjU2MzU2MTk2NjM3Mzk4MTcwNDIzNjkzOTU0OTQ0NjEwNTk1NzAzMTI1ADE4NjI2NDUxNDkyMzA5NTcwMzEyNQA0MzM2ODA4Njg5OTQyMDE3NzM2MDI5ODExMjAzNDc5NzY2ODQ1NzAzMTI1ADIzNTA5ODg3MDE2NDQ1NzUwMTU5Mzc0NzMwNzQ0NDQ0OTEzNTU2MzczMzExMTM1NDQxNzUwNDMwMTc1MDM0MTI1NTY4MzQ1MTg5MDk0NTQzNDU3MDMxMjUAMjg0MjE3MDk0MzA0MDQwMDc0MzQ4NDQ5NzA3MDMxMjUAMTU0MDc0Mzk1NTUwOTc4ODY4MjQ0NDc4MjM1NDA2Nzk0MTg1NDgzMDQ4MTMxODU3MjMxMDU1NjE5MTk1MTAzNjQ1MzI0NzA3MDMxMjUANjYxNzQ0NDkwMDQyNDIyMTM5ODk3MTI2OTUzNjU1OTcwMjgyODUyNjQ5Njg4NzIwNzAzMTI1ADEyMjA3MDMxMjUAMjU4NDkzOTQxNDIyODIxMTQ4Mzk3MzE1MjE2MjcxODYzMzkxNzM5MzE2Mjg0NjU2NTI0NjU4MjAzMTI1ADQ3NjgzNzE1ODIwMzEyNQAxMTEwMjIzMDI0NjI1MTU2NTQwNDIzNjMxNjY4MDkwODIwMzEyNQA2MDE4NTMxMDc2MjEwMTEyMDQwNzk5OTMxMDcwNTc3ODk3ODcwNDMxNTY3NjUwNjczMDg4MTEwMTI0ODA4NzM2MTQ1NDk2MzY4NDA4MjAzMTI1ADE2OTQwNjU4OTQ1MDg2MDA2NzgxMzY2NDUwMDEzNTkyODM5MjQxMDI3ODMyMDMxMjUAMzk0NDMwNDUyNjEwNTA1OTAyNzA1ODY0MjgyNjQxMzkzMTE0ODM2NjAzMjE3NTU0NTExNTAyMzg1MTM5NDY1MzMyMDMxMjUANzI3NTk1NzYxNDE4MzQyNTkwMzMyMDMxMjUAb3NjXzE1AG9zY18xMTUAb3NjXzEwNQBvc2NfNABvc2NfMTQAb3NjXzExNABvc2NfMTA0ADEzMwBvc2NfMTMAb3NjXzExMwA1MgAyMgBvc2NfMTIAb3NjXzExMgBoYW5kMQAyMQBvc2NfMTEAb3NjXzExMQBvc2NfMTAAb3NjXzExMABlcnJvci4ALnsgLgAsIC4AQGVudW1Gcm9tSW50KAAkJwB7IAAgPSAALCAAGxsAGw0AMjU1IDI1MCAyNTAJCXNub3cKMjQ4IDI0OCAyNTUJCWdob3N0IHdoaXRlCjI0OCAyNDggMjU1CQlHaG9zdFdoaXRlCjI0NSAyNDUgMjQ1CQl3aGl0ZSBzbW9rZQoyNDUgMjQ1IDI0NQkJV2hpdGVTbW9rZQoyMjAgMjIwIDIyMAkJZ2FpbnNib3JvCjI1NSAyNTAgMjQwCQlmbG9yYWwgd2hpdGUKMjU1IDI1MCAyNDAJCUZsb3JhbFdoaXRlCjI1MyAyNDUgMjMwCQlvbGQgbGFjZQoyNTMgMjQ1IDIzMAkJT2xkTGFjZQoyNTAgMjQwIDIzMAkJbGluZW4KMjUwIDIzNSAyMTUJCWFudGlxdWUgd2hpdGUKMjUwIDIzNSAyMTUJCUFudGlxdWVXaGl0ZQoyNTUgMjM5IDIxMwkJcGFwYXlhIHdoaXAKMjU1IDIzOSAyMTMJCVBhcGF5YVdoaXAKMjU1IDIzNSAyMDUJCWJsYW5jaGVkIGFsbW9uZAoyNTUgMjM1IDIwNQkJQmxhbmNoZWRBbG1vbmQKMjU1IDIyOCAxOTYJCWJpc3F1ZQoyNTUgMjE4IDE4NQkJcGVhY2ggcHVmZgoyNTUgMjE4IDE4NQkJUGVhY2hQdWZmCjI1NSAyMjIgMTczCQluYXZham8gd2hpdGUKMjU1IDIyMiAxNzMJCU5hdmFqb1doaXRlCjI1NSAyMjggMTgxCQltb2NjYXNpbgoyNTUgMjQ4IDIyMAkJY29ybnNpbGsKMjU1IDI1NSAyNDAJCWl2b3J5CjI1NSAyNTAgMjA1CQlsZW1vbiBjaGlmZm9uCjI1NSAyNTAgMjA1CQlMZW1vbkNoaWZmb24KMjU1IDI0NSAyMzgJCXNlYXNoZWxsCjI0MCAyNTUgMjQwCQlob25leWRldwoyNDUgMjU1IDI1MAkJbWludCBjcmVhbQoyNDUgMjU1IDI1MAkJTWludENyZWFtCjI0MCAyNTUgMjU1CQlhenVyZQoyNDAgMjQ4IDI1NQkJYWxpY2UgYmx1ZQoyNDAgMjQ4IDI1NQkJQWxpY2VCbHVlCjIzMCAyMzAgMjUwCQlsYXZlbmRlcgoyNTUgMjQwIDI0NQkJbGF2ZW5kZXIgYmx1c2gKMjU1IDI0MCAyNDUJCUxhdmVuZGVyQmx1c2gKMjU1IDIyOCAyMjUJCW1pc3R5IHJvc2UKMjU1IDIyOCAyMjUJCU1pc3R5Um9zZQoyNTUgMjU1IDI1NQkJd2hpdGUKICAwICAgMCAgIDAJCWJsYWNrCiA0NyAgNzkgIDc5CQlkYXJrIHNsYXRlIGdyYXkKIDQ3ICA3OSAgNzkJCURhcmtTbGF0ZUdyYXkKIDQ3ICA3OSAgNzkJCWRhcmsgc2xhdGUgZ3JleQogNDcgIDc5ICA3OQkJRGFya1NsYXRlR3JleQoxMDUgMTA1IDEwNQkJZGltIGdyYXkKMTA1IDEwNSAxMDUJCURpbUdyYXkKMTA1IDEwNSAxMDUJCWRpbSBncmV5CjEwNSAxMDUgMTA1CQlEaW1HcmV5CjExMiAxMjggMTQ0CQlzbGF0ZSBncmF5CjExMiAxMjggMTQ0CQlTbGF0ZUdyYXkKMTEyIDEyOCAxNDQJCXNsYXRlIGdyZXkKMTEyIDEyOCAxNDQJCVNsYXRlR3JleQoxMTkgMTM2IDE1MwkJbGlnaHQgc2xhdGUgZ3JheQoxMTkgMTM2IDE1MwkJTGlnaHRTbGF0ZUdyYXkKMTE5IDEzNiAxNTMJCWxpZ2h0IHNsYXRlIGdyZXkKMTE5IDEzNiAxNTMJCUxpZ2h0U2xhdGVHcmV5CjE5MCAxOTAgMTkwCQlncmF5CjE5MCAxOTAgMTkwCQlncmV5CjE5MCAxOTAgMTkwCQl4MTEgZ3JheQoxOTAgMTkwIDE5MAkJWDExR3JheQoxOTAgMTkwIDE5MAkJeDExIGdyZXkKMTkwIDE5MCAxOTAJCVgxMUdyZXkKMTI4IDEyOCAxMjgJCXdlYiBncmF5CjEyOCAxMjggMTI4CQlXZWJHcmF5CjEyOCAxMjggMTI4CQl3ZWIgZ3JleQoxMjggMTI4IDEyOAkJV2ViR3JleQoyMTEgMjExIDIxMQkJbGlnaHQgZ3JleQoyMTEgMjExIDIxMQkJTGlnaHRHcmV5CjIxMSAyMTEgMjExCQlsaWdodCBncmF5CjIxMSAyMTEgMjExCQlMaWdodEdyYXkKIDI1ICAyNSAxMTIJCW1pZG5pZ2h0IGJsdWUKIDI1ICAyNSAxMTIJCU1pZG5pZ2h0Qmx1ZQogIDAgICAwIDEyOAkJbmF2eQogIDAgICAwIDEyOAkJbmF2eSBibHVlCiAgMCAgIDAgMTI4CQlOYXZ5Qmx1ZQoxMDAgMTQ5IDIzNwkJY29ybmZsb3dlciBibHVlCjEwMCAxNDkgMjM3CQlDb3JuZmxvd2VyQmx1ZQogNzIgIDYxIDEzOQkJZGFyayBzbGF0ZSBibHVlCiA3MiAgNjEgMTM5CQlEYXJrU2xhdGVCbHVlCjEwNiAgOTAgMjA1CQlzbGF0ZSBibHVlCjEwNiAgOTAgMjA1CQlTbGF0ZUJsdWUKMTIzIDEwNCAyMzgJCW1lZGl1bSBzbGF0ZSBibHVlCjEyMyAxMDQgMjM4CQlNZWRpdW1TbGF0ZUJsdWUKMTMyIDExMiAyNTUJCWxpZ2h0IHNsYXRlIGJsdWUKMTMyIDExMiAyNTUJCUxpZ2h0U2xhdGVCbHVlCiAgMCAgIDAgMjA1CQltZWRpdW0gYmx1ZQogIDAgICAwIDIwNQkJTWVkaXVtQmx1ZQogNjUgMTA1IDIyNQkJcm95YWwgYmx1ZQogNjUgMTA1IDIyNQkJUm95YWxCbHVlCiAgMCAgIDAgMjU1CQlibHVlCiAzMCAxNDQgMjU1CQlkb2RnZXIgYmx1ZQogMzAgMTQ0IDI1NQkJRG9kZ2VyQmx1ZQogIDAgMTkxIDI1NQkJZGVlcCBza3kgYmx1ZQogIDAgMTkxIDI1NQkJRGVlcFNreUJsdWUKMTM1IDIwNiAyMzUJCXNreSBibHVlCjEzNSAyMDYgMjM1CQlTa3lCbHVlCjEzNSAyMDYgMjUwCQlsaWdodCBza3kgYmx1ZQoxMzUgMjA2IDI1MAkJTGlnaHRTa3lCbHVlCiA3MCAxMzAgMTgwCQlzdGVlbCBibHVlCiA3MCAxMzAgMTgwCQlTdGVlbEJsdWUKMTc2IDE5NiAyMjIJCWxpZ2h0IHN0ZWVsIGJsdWUKMTc2IDE5NiAyMjIJCUxpZ2h0U3RlZWxCbHVlCjE3MyAyMTYgMjMwCQlsaWdodCBibHVlCjE3MyAyMTYgMjMwCQlMaWdodEJsdWUKMTc2IDIyNCAyMzAJCXBvd2RlciBibHVlCjE3NiAyMjQgMjMwCQlQb3dkZXJCbHVlCjE3NSAyMzggMjM4CQlwYWxlIHR1cnF1b2lzZQoxNzUgMjM4IDIzOAkJUGFsZVR1cnF1b2lzZQogIDAgMjA2IDIwOQkJZGFyayB0dXJxdW9pc2UKICAwIDIwNiAyMDkJCURhcmtUdXJxdW9pc2UKIDcyIDIwOSAyMDQJCW1lZGl1bSB0dXJxdW9pc2UKIDcyIDIwOSAyMDQJCU1lZGl1bVR1cnF1b2lzZQogNjQgMjI0IDIwOAkJdHVycXVvaXNlCiAgMCAyNTUgMjU1CQljeWFuCiAgMCAyNTUgMjU1CQlhcXVhCjIyNCAyNTUgMjU1CQlsaWdodCBjeWFuCjIyNCAyNTUgMjU1CQlMaWdodEN5YW4KIDk1IDE1OCAxNjAJCWNhZGV0IGJsdWUKIDk1IDE1OCAxNjAJCUNhZGV0Qmx1ZQoxMDIgMjA1IDE3MAkJbWVkaXVtIGFxdWFtYXJpbmUKMTAyIDIwNSAxNzAJCU1lZGl1bUFxdWFtYXJpbmUKMTI3IDI1NSAyMTIJCWFxdWFtYXJpbmUKICAwIDEwMCAgIDAJCWRhcmsgZ3JlZW4KICAwIDEwMCAgIDAJCURhcmtHcmVlbgogODUgMTA3ICA0NwkJZGFyayBvbGl2ZSBncmVlbgogODUgMTA3ICA0NwkJRGFya09saXZlR3JlZW4KMTQzIDE4OCAxNDMJCWRhcmsgc2VhIGdyZWVuCjE0MyAxODggMTQzCQlEYXJrU2VhR3JlZW4KIDQ2IDEzOSAgODcJCXNlYSBncmVlbgogNDYgMTM5ICA4NwkJU2VhR3JlZW4KIDYwIDE3OSAxMTMJCW1lZGl1bSBzZWEgZ3JlZW4KIDYwIDE3OSAxMTMJCU1lZGl1bVNlYUdyZWVuCiAzMiAxNzggMTcwCQlsaWdodCBzZWEgZ3JlZW4KIDMyIDE3OCAxNzAJCUxpZ2h0U2VhR3JlZW4KMTUyIDI1MSAxNTIJCXBhbGUgZ3JlZW4KMTUyIDI1MSAxNTIJCVBhbGVHcmVlbgogIDAgMjU1IDEyNwkJc3ByaW5nIGdyZWVuCiAgMCAyNTUgMTI3CQlTcHJpbmdHcmVlbgoxMjQgMjUyICAgMAkJbGF3biBncmVlbgoxMjQgMjUyICAgMAkJTGF3bkdyZWVuCiAgMCAyNTUgICAwCQlncmVlbgogIDAgMjU1ICAgMAkJbGltZQogIDAgMjU1ICAgMAkJeDExIGdyZWVuCiAgMCAyNTUgICAwCQlYMTFHcmVlbgogIDAgMTI4ICAgMAkJd2ViIGdyZWVuCiAgMCAxMjggICAwCQlXZWJHcmVlbgoxMjcgMjU1ICAgMAkJY2hhcnRyZXVzZQogIDAgMjUwIDE1NAkJbWVkaXVtIHNwcmluZyBncmVlbgogIDAgMjUwIDE1NAkJTWVkaXVtU3ByaW5nR3JlZW4KMTczIDI1NSAgNDcJCWdyZWVuIHllbGxvdwoxNzMgMjU1ICA0NwkJR3JlZW5ZZWxsb3cKIDUwIDIwNSAgNTAJCWxpbWUgZ3JlZW4KIDUwIDIwNSAgNTAJCUxpbWVHcmVlbgoxNTQgMjA1ICA1MAkJeWVsbG93IGdyZWVuCjE1NCAyMDUgIDUwCQlZZWxsb3dHcmVlbgogMzQgMTM5ICAzNAkJZm9yZXN0IGdyZWVuCiAzNCAxMzkgIDM0CQlGb3Jlc3RHcmVlbgoxMDcgMTQyICAzNQkJb2xpdmUgZHJhYgoxMDcgMTQyICAzNQkJT2xpdmVEcmFiCjE4OSAxODMgMTA3CQlkYXJrIGtoYWtpCjE4OSAxODMgMTA3CQlEYXJrS2hha2kKMjQwIDIzMCAxNDAJCWtoYWtpCjIzOCAyMzIgMTcwCQlwYWxlIGdvbGRlbnJvZAoyMzggMjMyIDE3MAkJUGFsZUdvbGRlbnJvZAoyNTAgMjUwIDIxMAkJbGlnaHQgZ29sZGVucm9kIHllbGxvdwoyNTAgMjUwIDIxMAkJTGlnaHRHb2xkZW5yb2RZZWxsb3cKMjU1IDI1NSAyMjQJCWxpZ2h0IHllbGxvdwoyNTUgMjU1IDIyNAkJTGlnaHRZZWxsb3cKMjU1IDI1NSAgIDAJCXllbGxvdwoyNTUgMjE1ICAgMAkJZ29sZAoyMzggMjIxIDEzMAkJbGlnaHQgZ29sZGVucm9kCjIzOCAyMjEgMTMwCQlMaWdodEdvbGRlbnJvZAoyMTggMTY1ICAzMgkJZ29sZGVucm9kCjE4NCAxMzQgIDExCQlkYXJrIGdvbGRlbnJvZAoxODQgMTM0ICAxMQkJRGFya0dvbGRlbnJvZAoxODggMTQzIDE0MwkJcm9zeSBicm93bgoxODggMTQzIDE0MwkJUm9zeUJyb3duCjIwNSAgOTIgIDkyCQlpbmRpYW4gcmVkCjIwNSAgOTIgIDkyCQlJbmRpYW5SZWQKMTM5ICA2OSAgMTkJCXNhZGRsZSBicm93bgoxMzkgIDY5ICAxOQkJU2FkZGxlQnJvd24KMTYwICA4MiAgNDUJCXNpZW5uYQoyMDUgMTMzICA2MwkJcGVydQoyMjIgMTg0IDEzNQkJYnVybHl3b29kCjI0NSAyNDUgMjIwCQliZWlnZQoyNDUgMjIyIDE3OQkJd2hlYXQKMjQ0IDE2NCAgOTYJCXNhbmR5IGJyb3duCjI0NCAxNjQgIDk2CQlTYW5keUJyb3duCjIxMCAxODAgMTQwCQl0YW4KMjEwIDEwNSAgMzAJCWNob2NvbGF0ZQoxNzggIDM0ICAzNAkJZmlyZWJyaWNrCjE2NSAgNDIgIDQyCQlicm93bgoyMzMgMTUwIDEyMgkJZGFyayBzYWxtb24KMjMzIDE1MCAxMjIJCURhcmtTYWxtb24KMjUwIDEyOCAxMTQJCXNhbG1vbgoyNTUgMTYwIDEyMgkJbGlnaHQgc2FsbW9uCjI1NSAxNjAgMTIyCQlMaWdodFNhbG1vbgoyNTUgMTY1ICAgMAkJb3JhbmdlCjI1NSAxNDAgICAwCQlkYXJrIG9yYW5nZQoyNTUgMTQwICAgMAkJRGFya09yYW5nZQoyNTUgMTI3ICA4MAkJY29yYWwKMjQwIDEyOCAxMjgJCWxpZ2h0IGNvcmFsCjI0MCAxMjggMTI4CQlMaWdodENvcmFsCjI1NSAgOTkgIDcxCQl0b21hdG8KMjU1ICA2OSAgIDAJCW9yYW5nZSByZWQKMjU1ICA2OSAgIDAJCU9yYW5nZVJlZAoyNTUgICAwICAgMAkJcmVkCjI1NSAxMDUgMTgwCQlob3QgcGluawoyNTUgMTA1IDE4MAkJSG90UGluawoyNTUgIDIwIDE0NwkJZGVlcCBwaW5rCjI1NSAgMjAgMTQ3CQlEZWVwUGluawoyNTUgMTkyIDIwMwkJcGluawoyNTUgMTgyIDE5MwkJbGlnaHQgcGluawoyNTUgMTgyIDE5MwkJTGlnaHRQaW5rCjIxOSAxMTIgMTQ3CQlwYWxlIHZpb2xldCByZWQKMjE5IDExMiAxNDcJCVBhbGVWaW9sZXRSZWQKMTc2ICA0OCAgOTYJCW1hcm9vbgoxNzYgIDQ4ICA5NgkJeDExIG1hcm9vbgoxNzYgIDQ4ICA5NgkJWDExTWFyb29uCjEyOCAgIDAgICAwCQl3ZWIgbWFyb29uCjEyOCAgIDAgICAwCQlXZWJNYXJvb24KMTk5ICAyMSAxMzMJCW1lZGl1bSB2aW9sZXQgcmVkCjE5OSAgMjEgMTMzCQlNZWRpdW1WaW9sZXRSZWQKMjA4ICAzMiAxNDQJCXZpb2xldCByZWQKMjA4ICAzMiAxNDQJCVZpb2xldFJlZAoyNTUgICAwIDI1NQkJbWFnZW50YQoyNTUgICAwIDI1NQkJZnVjaHNpYQoyMzggMTMwIDIzOAkJdmlvbGV0CjIyMSAxNjAgMjIxCQlwbHVtCjIxOCAxMTIgMjE0CQlvcmNoaWQKMTg2ICA4NSAyMTEJCW1lZGl1bSBvcmNoaWQKMTg2ICA4NSAyMTEJCU1lZGl1bU9yY2hpZAoxNTMgIDUwIDIwNAkJZGFyayBvcmNoaWQKMTUzICA1MCAyMDQJCURhcmtPcmNoaWQKMTQ4ICAgMCAyMTEJCWRhcmsgdmlvbGV0CjE0OCAgIDAgMjExCQlEYXJrVmlvbGV0CjEzOCAgNDMgMjI2CQlibHVlIHZpb2xldAoxMzggIDQzIDIyNgkJQmx1ZVZpb2xldAoxNjAgIDMyIDI0MAkJcHVycGxlCjE2MCAgMzIgMjQwCQl4MTEgcHVycGxlCjE2MCAgMzIgMjQwCQlYMTFQdXJwbGUKMTI4ICAgMCAxMjgJCXdlYiBwdXJwbGUKMTI4ICAgMCAxMjgJCVdlYlB1cnBsZQoxNDcgMTEyIDIxOQkJbWVkaXVtIHB1cnBsZQoxNDcgMTEyIDIxOQkJTWVkaXVtUHVycGxlCjIxNiAxOTEgMjE2CQl0aGlzdGxlCjI1NSAyNTAgMjUwCQlzbm93MQoyMzggMjMzIDIzMwkJc25vdzIKMjA1IDIwMSAyMDEJCXNub3czCjEzOSAxMzcgMTM3CQlzbm93NAoyNTUgMjQ1IDIzOAkJc2Vhc2hlbGwxCjIzOCAyMjkgMjIyCQlzZWFzaGVsbDIKMjA1IDE5NyAxOTEJCXNlYXNoZWxsMwoxMzkgMTM0IDEzMAkJc2Vhc2hlbGw0CjI1NSAyMzkgMjE5CQlBbnRpcXVlV2hpdGUxCjIzOCAyMjMgMjA0CQlBbnRpcXVlV2hpdGUyCjIwNSAxOTIgMTc2CQlBbnRpcXVlV2hpdGUzCjEzOSAxMzEgMTIwCQlBbnRpcXVlV2hpdGU0CjI1NSAyMjggMTk2CQliaXNxdWUxCjIzOCAyMTMgMTgzCQliaXNxdWUyCjIwNSAxODMgMTU4CQliaXNxdWUzCjEzOSAxMjUgMTA3CQliaXNxdWU0CjI1NSAyMTggMTg1CQlQZWFjaFB1ZmYxCjIzOCAyMDMgMTczCQlQZWFjaFB1ZmYyCjIwNSAxNzUgMTQ5CQlQZWFjaFB1ZmYzCjEzOSAxMTkgMTAxCQlQZWFjaFB1ZmY0CjI1NSAyMjIgMTczCQlOYXZham9XaGl0ZTEKMjM4IDIwNyAxNjEJCU5hdmFqb1doaXRlMgoyMDUgMTc5IDEzOQkJTmF2YWpvV2hpdGUzCjEzOSAxMjEgIDk0CQlOYXZham9XaGl0ZTQKMjU1IDI1MCAyMDUJCUxlbW9uQ2hpZmZvbjEKMjM4IDIzMyAxOTEJCUxlbW9uQ2hpZmZvbjIKMjA1IDIwMSAxNjUJCUxlbW9uQ2hpZmZvbjMKMTM5IDEzNyAxMTIJCUxlbW9uQ2hpZmZvbjQKMjU1IDI0OCAyMjAJCWNvcm5zaWxrMQoyMzggMjMyIDIwNQkJY29ybnNpbGsyCjIwNSAyMDAgMTc3CQljb3Juc2lsazMKMTM5IDEzNiAxMjAJCWNvcm5zaWxrNAoyNTUgMjU1IDI0MAkJaXZvcnkxCjIzOCAyMzggMjI0CQlpdm9yeTIKMjA1IDIwNSAxOTMJCWl2b3J5MwoxMzkgMTM5IDEzMQkJaXZvcnk0CjI0MCAyNTUgMjQwCQlob25leWRldzEKMjI0IDIzOCAyMjQJCWhvbmV5ZGV3MgoxOTMgMjA1IDE5MwkJaG9uZXlkZXczCjEzMSAxMzkgMTMxCQlob25leWRldzQKMjU1IDI0MCAyNDUJCUxhdmVuZGVyQmx1c2gxCjIzOCAyMjQgMjI5CQlMYXZlbmRlckJsdXNoMgoyMDUgMTkzIDE5NwkJTGF2ZW5kZXJCbHVzaDMKMTM5IDEzMSAxMzQJCUxhdmVuZGVyQmx1c2g0CjI1NSAyMjggMjI1CQlNaXN0eVJvc2UxCjIzOCAyMTMgMjEwCQlNaXN0eVJvc2UyCjIwNSAxODMgMTgxCQlNaXN0eVJvc2UzCjEzOSAxMjUgMTIzCQlNaXN0eVJvc2U0CjI0MCAyNTUgMjU1CQlhenVyZTEKMjI0IDIzOCAyMzgJCWF6dXJlMgoxOTMgMjA1IDIwNQkJYXp1cmUzCjEzMSAxMzkgMTM5CQlhenVyZTQKMTMxIDExMSAyNTUJCVNsYXRlQmx1ZTEKMTIyIDEwMyAyMzgJCVNsYXRlQmx1ZTIKMTA1ICA4OSAyMDUJCVNsYXRlQmx1ZTMKIDcxICA2MCAxMzkJCVNsYXRlQmx1ZTQKIDcyIDExOCAyNTUJCVJveWFsQmx1ZTEKIDY3IDExMCAyMzgJCVJveWFsQmx1ZTIKIDU4ICA5NSAyMDUJCVJveWFsQmx1ZTMKIDM5ICA2NCAxMzkJCVJveWFsQmx1ZTQKICAwICAgMCAyNTUJCWJsdWUxCiAgMCAgIDAgMjM4CQlibHVlMgogIDAgICAwIDIwNQkJYmx1ZTMKICAwICAgMCAxMzkJCWJsdWU0CiAzMCAxNDQgMjU1CQlEb2RnZXJCbHVlMQogMjggMTM0IDIzOAkJRG9kZ2VyQmx1ZTIKIDI0IDExNiAyMDUJCURvZGdlckJsdWUzCiAxNiAgNzggMTM5CQlEb2RnZXJCbHVlNAogOTkgMTg0IDI1NQkJU3RlZWxCbHVlMQogOTIgMTcyIDIzOAkJU3RlZWxCbHVlMgogNzkgMTQ4IDIwNQkJU3RlZWxCbHVlMwogNTQgMTAwIDEzOQkJU3RlZWxCbHVlNAogIDAgMTkxIDI1NQkJRGVlcFNreUJsdWUxCiAgMCAxNzggMjM4CQlEZWVwU2t5Qmx1ZTIKICAwIDE1NCAyMDUJCURlZXBTa3lCbHVlMwogIDAgMTA0IDEzOQkJRGVlcFNreUJsdWU0CjEzNSAyMDYgMjU1CQlTa3lCbHVlMQoxMjYgMTkyIDIzOAkJU2t5Qmx1ZTIKMTA4IDE2NiAyMDUJCVNreUJsdWUzCiA3NCAxMTIgMTM5CQlTa3lCbHVlNAoxNzYgMjI2IDI1NQkJTGlnaHRTa3lCbHVlMQoxNjQgMjExIDIzOAkJTGlnaHRTa3lCbHVlMgoxNDEgMTgyIDIwNQkJTGlnaHRTa3lCbHVlMwogOTYgMTIzIDEzOQkJTGlnaHRTa3lCbHVlNAoxOTggMjI2IDI1NQkJU2xhdGVHcmF5MQoxODUgMjExIDIzOAkJU2xhdGVHcmF5MgoxNTkgMTgyIDIwNQkJU2xhdGVHcmF5MwoxMDggMTIzIDEzOQkJU2xhdGVHcmF5NAoyMDIgMjI1IDI1NQkJTGlnaHRTdGVlbEJsdWUxCjE4OCAyMTAgMjM4CQlMaWdodFN0ZWVsQmx1ZTIKMTYyIDE4MSAyMDUJCUxpZ2h0U3RlZWxCbHVlMwoxMTAgMTIzIDEzOQkJTGlnaHRTdGVlbEJsdWU0CjE5MSAyMzkgMjU1CQlMaWdodEJsdWUxCjE3OCAyMjMgMjM4CQlMaWdodEJsdWUyCjE1NCAxOTIgMjA1CQlMaWdodEJsdWUzCjEwNCAxMzEgMTM5CQlMaWdodEJsdWU0CjIyNCAyNTUgMjU1CQlMaWdodEN5YW4xCjIwOSAyMzggMjM4CQlMaWdodEN5YW4yCjE4MCAyMDUgMjA1CQlMaWdodEN5YW4zCjEyMiAxMzkgMTM5CQlMaWdodEN5YW40CjE4NyAyNTUgMjU1CQlQYWxlVHVycXVvaXNlMQoxNzQgMjM4IDIzOAkJUGFsZVR1cnF1b2lzZTIKMTUwIDIwNSAyMDUJCVBhbGVUdXJxdW9pc2UzCjEwMiAxMzkgMTM5CQlQYWxlVHVycXVvaXNlNAoxNTIgMjQ1IDI1NQkJQ2FkZXRCbHVlMQoxNDIgMjI5IDIzOAkJQ2FkZXRCbHVlMgoxMjIgMTk3IDIwNQkJQ2FkZXRCbHVlMwogODMgMTM0IDEzOQkJQ2FkZXRCbHVlNAogIDAgMjQ1IDI1NQkJdHVycXVvaXNlMQogIDAgMjI5IDIzOAkJdHVycXVvaXNlMgogIDAgMTk3IDIwNQkJdHVycXVvaXNlMwogIDAgMTM0IDEzOQkJdHVycXVvaXNlNAogIDAgMjU1IDI1NQkJY3lhbjEKICAwIDIzOCAyMzgJCWN5YW4yCiAgMCAyMDUgMjA1CQljeWFuMwogIDAgMTM5IDEzOQkJY3lhbjQKMTUxIDI1NSAyNTUJCURhcmtTbGF0ZUdyYXkxCjE0MSAyMzggMjM4CQlEYXJrU2xhdGVHcmF5MgoxMjEgMjA1IDIwNQkJRGFya1NsYXRlR3JheTMKIDgyIDEzOSAxMzkJCURhcmtTbGF0ZUdyYXk0CjEyNyAyNTUgMjEyCQlhcXVhbWFyaW5lMQoxMTggMjM4IDE5OAkJYXF1YW1hcmluZTIKMTAyIDIwNSAxNzAJCWFxdWFtYXJpbmUzCiA2OSAxMzkgMTE2CQlhcXVhbWFyaW5lNAoxOTMgMjU1IDE5MwkJRGFya1NlYUdyZWVuMQoxODAgMjM4IDE4MAkJRGFya1NlYUdyZWVuMgoxNTUgMjA1IDE1NQkJRGFya1NlYUdyZWVuMwoxMDUgMTM5IDEwNQkJRGFya1NlYUdyZWVuNAogODQgMjU1IDE1OQkJU2VhR3JlZW4xCiA3OCAyMzggMTQ4CQlTZWFHcmVlbjIKIDY3IDIwNSAxMjgJCVNlYUdyZWVuMwogNDYgMTM5ICA4NwkJU2VhR3JlZW40CjE1NCAyNTUgMTU0CQlQYWxlR3JlZW4xCjE0NCAyMzggMTQ0CQlQYWxlR3JlZW4yCjEyNCAyMDUgMTI0CQlQYWxlR3JlZW4zCiA4NCAxMzkgIDg0CQlQYWxlR3JlZW40CiAgMCAyNTUgMTI3CQlTcHJpbmdHcmVlbjEKICAwIDIzOCAxMTgJCVNwcmluZ0dyZWVuMgogIDAgMjA1IDEwMgkJU3ByaW5nR3JlZW4zCiAgMCAxMzkgIDY5CQlTcHJpbmdHcmVlbjQKICAwIDI1NSAgIDAJCWdyZWVuMQogIDAgMjM4ICAgMAkJZ3JlZW4yCiAgMCAyMDUgICAwCQlncmVlbjMKICAwIDEzOSAgIDAJCWdyZWVuNAoxMjcgMjU1ICAgMAkJY2hhcnRyZXVzZTEKMTE4IDIzOCAgIDAJCWNoYXJ0cmV1c2UyCjEwMiAyMDUgICAwCQljaGFydHJldXNlMwogNjkgMTM5ICAgMAkJY2hhcnRyZXVzZTQKMTkyIDI1NSAgNjIJCU9saXZlRHJhYjEKMTc5IDIzOCAgNTgJCU9saXZlRHJhYjIKMTU0IDIwNSAgNTAJCU9saXZlRHJhYjMKMTA1IDEzOSAgMzQJCU9saXZlRHJhYjQKMjAyIDI1NSAxMTIJCURhcmtPbGl2ZUdyZWVuMQoxODggMjM4IDEwNAkJRGFya09saXZlR3JlZW4yCjE2MiAyMDUgIDkwCQlEYXJrT2xpdmVHcmVlbjMKMTEwIDEzOSAgNjEJCURhcmtPbGl2ZUdyZWVuNAoyNTUgMjQ2IDE0MwkJa2hha2kxCjIzOCAyMzAgMTMzCQlraGFraTIKMjA1IDE5OCAxMTUJCWtoYWtpMwoxMzkgMTM0ICA3OAkJa2hha2k0CjI1NSAyMzYgMTM5CQlMaWdodEdvbGRlbnJvZDEKMjM4IDIyMCAxMzAJCUxpZ2h0R29sZGVucm9kMgoyMDUgMTkwIDExMgkJTGlnaHRHb2xkZW5yb2QzCjEzOSAxMjkgIDc2CQlMaWdodEdvbGRlbnJvZDQKMjU1IDI1NSAyMjQJCUxpZ2h0WWVsbG93MQoyMzggMjM4IDIwOQkJTGlnaHRZZWxsb3cyCjIwNSAyMDUgMTgwCQlMaWdodFllbGxvdzMKMTM5IDEzOSAxMjIJCUxpZ2h0WWVsbG93NAoyNTUgMjU1ICAgMAkJeWVsbG93MQoyMzggMjM4ICAgMAkJeWVsbG93MgoyMDUgMjA1ICAgMAkJeWVsbG93MwoxMzkgMTM5ICAgMAkJeWVsbG93NAoyNTUgMjE1ICAgMAkJZ29sZDEKMjM4IDIwMSAgIDAJCWdvbGQyCjIwNSAxNzMgICAwCQlnb2xkMwoxMzkgMTE3ICAgMAkJZ29sZDQKMjU1IDE5MyAgMzcJCWdvbGRlbnJvZDEKMjM4IDE4MCAgMzQJCWdvbGRlbnJvZDIKMjA1IDE1NSAgMjkJCWdvbGRlbnJvZDMKMTM5IDEwNSAgMjAJCWdvbGRlbnJvZDQKMjU1IDE4NSAgMTUJCURhcmtHb2xkZW5yb2QxCjIzOCAxNzMgIDE0CQlEYXJrR29sZGVucm9kMgoyMDUgMTQ5ICAxMgkJRGFya0dvbGRlbnJvZDMKMTM5IDEwMSAgIDgJCURhcmtHb2xkZW5yb2Q0CjI1NSAxOTMgMTkzCQlSb3N5QnJvd24xCjIzOCAxODAgMTgwCQlSb3N5QnJvd24yCjIwNSAxNTUgMTU1CQlSb3N5QnJvd24zCjEzOSAxMDUgMTA1CQlSb3N5QnJvd240CjI1NSAxMDYgMTA2CQlJbmRpYW5SZWQxCjIzOCAgOTkgIDk5CQlJbmRpYW5SZWQyCjIwNSAgODUgIDg1CQlJbmRpYW5SZWQzCjEzOSAgNTggIDU4CQlJbmRpYW5SZWQ0CjI1NSAxMzAgIDcxCQlzaWVubmExCjIzOCAxMjEgIDY2CQlzaWVubmEyCjIwNSAxMDQgIDU3CQlzaWVubmEzCjEzOSAgNzEgIDM4CQlzaWVubmE0CjI1NSAyMTEgMTU1CQlidXJseXdvb2QxCjIzOCAxOTcgMTQ1CQlidXJseXdvb2QyCjIwNSAxNzAgMTI1CQlidXJseXdvb2QzCjEzOSAxMTUgIDg1CQlidXJseXdvb2Q0CjI1NSAyMzEgMTg2CQl3aGVhdDEKMjM4IDIxNiAxNzQJCXdoZWF0MgoyMDUgMTg2IDE1MAkJd2hlYXQzCjEzOSAxMjYgMTAyCQl3aGVhdDQKMjU1IDE2NSAgNzkJCXRhbjEKMjM4IDE1NCAgNzMJCXRhbjIKMjA1IDEzMyAgNjMJCXRhbjMKMTM5ICA5MCAgNDMJCXRhbjQKMjU1IDEyNyAgMzYJCWNob2NvbGF0ZTEKMjM4IDExOCAgMzMJCWNob2NvbGF0ZTIKMjA1IDEwMiAgMjkJCWNob2NvbGF0ZTMKMTM5ICA2OSAgMTkJCWNob2NvbGF0ZTQKMjU1ICA0OCAgNDgJCWZpcmVicmljazEKMjM4ICA0NCAgNDQJCWZpcmVicmljazIKMjA1ICAzOCAgMzgJCWZpcmVicmljazMKMTM5ICAyNiAgMjYJCWZpcmVicmljazQKMjU1ICA2NCAgNjQJCWJyb3duMQoyMzggIDU5ICA1OQkJYnJvd24yCjIwNSAgNTEgIDUxCQlicm93bjMKMTM5ICAzNSAgMzUJCWJyb3duNAoyNTUgMTQwIDEwNQkJc2FsbW9uMQoyMzggMTMwICA5OAkJc2FsbW9uMgoyMDUgMTEyICA4NAkJc2FsbW9uMwoxMzkgIDc2ICA1NwkJc2FsbW9uNAoyNTUgMTYwIDEyMgkJTGlnaHRTYWxtb24xCjIzOCAxNDkgMTE0CQlMaWdodFNhbG1vbjIKMjA1IDEyOSAgOTgJCUxpZ2h0U2FsbW9uMwoxMzkgIDg3ICA2NgkJTGlnaHRTYWxtb240CjI1NSAxNjUgICAwCQlvcmFuZ2UxCjIzOCAxNTQgICAwCQlvcmFuZ2UyCjIwNSAxMzMgICAwCQlvcmFuZ2UzCjEzOSAgOTAgICAwCQlvcmFuZ2U0CjI1NSAxMjcgICAwCQlEYXJrT3JhbmdlMQoyMzggMTE4ICAgMAkJRGFya09yYW5nZTIKMjA1IDEwMiAgIDAJCURhcmtPcmFuZ2UzCjEzOSAgNjkgICAwCQlEYXJrT3JhbmdlNAoyNTUgMTE0ICA4NgkJY29yYWwxCjIzOCAxMDYgIDgwCQljb3JhbDIKMjA1ICA5MSAgNjkJCWNvcmFsMwoxMzkgIDYyICA0NwkJY29yYWw0CjI1NSAgOTkgIDcxCQl0b21hdG8xCjIzOCAgOTIgIDY2CQl0b21hdG8yCjIwNSAgNzkgIDU3CQl0b21hdG8zCjEzOSAgNTQgIDM4CQl0b21hdG80CjI1NSAgNjkgICAwCQlPcmFuZ2VSZWQxCjIzOCAgNjQgICAwCQlPcmFuZ2VSZWQyCjIwNSAgNTUgICAwCQlPcmFuZ2VSZWQzCjEzOSAgMzcgICAwCQlPcmFuZ2VSZWQ0CjI1NSAgIDAgICAwCQlyZWQxCjIzOCAgIDAgICAwCQlyZWQyCjIwNSAgIDAgICAwCQlyZWQzCjEzOSAgIDAgICAwCQlyZWQ0CjI1NSAgMjAgMTQ3CQlEZWVwUGluazEKMjM4ICAxOCAxMzcJCURlZXBQaW5rMgoyMDUgIDE2IDExOAkJRGVlcFBpbmszCjEzOSAgMTAgIDgwCQlEZWVwUGluazQKMjU1IDExMCAxODAJCUhvdFBpbmsxCjIzOCAxMDYgMTY3CQlIb3RQaW5rMgoyMDUgIDk2IDE0NAkJSG90UGluazMKMTM5ICA1OCAgOTgJCUhvdFBpbms0CjI1NSAxODEgMTk3CQlwaW5rMQoyMzggMTY5IDE4NAkJcGluazIKMjA1IDE0NSAxNTgJCXBpbmszCjEzOSAgOTkgMTA4CQlwaW5rNAoyNTUgMTc0IDE4NQkJTGlnaHRQaW5rMQoyMzggMTYyIDE3MwkJTGlnaHRQaW5rMgoyMDUgMTQwIDE0OQkJTGlnaHRQaW5rMwoxMzkgIDk1IDEwMQkJTGlnaHRQaW5rNAoyNTUgMTMwIDE3MQkJUGFsZVZpb2xldFJlZDEKMjM4IDEyMSAxNTkJCVBhbGVWaW9sZXRSZWQyCjIwNSAxMDQgMTM3CQlQYWxlVmlvbGV0UmVkMwoxMzkgIDcxICA5MwkJUGFsZVZpb2xldFJlZDQKMjU1ICA1MiAxNzkJCW1hcm9vbjEKMjM4ICA0OCAxNjcJCW1hcm9vbjIKMjA1ICA0MSAxNDQJCW1hcm9vbjMKMTM5ICAyOCAgOTgJCW1hcm9vbjQKMjU1ICA2MiAxNTAJCVZpb2xldFJlZDEKMjM4ICA1OCAxNDAJCVZpb2xldFJlZDIKMjA1ICA1MCAxMjAJCVZpb2xldFJlZDMKMTM5ICAzNCAgODIJCVZpb2xldFJlZDQKMjU1ICAgMCAyNTUJCW1hZ2VudGExCjIzOCAgIDAgMjM4CQltYWdlbnRhMgoyMDUgICAwIDIwNQkJbWFnZW50YTMKMTM5ICAgMCAxMzkJCW1hZ2VudGE0CjI1NSAxMzEgMjUwCQlvcmNoaWQxCjIzOCAxMjIgMjMzCQlvcmNoaWQyCjIwNSAxMDUgMjAxCQlvcmNoaWQzCjEzOSAgNzEgMTM3CQlvcmNoaWQ0CjI1NSAxODcgMjU1CQlwbHVtMQoyMzggMTc0IDIzOAkJcGx1bTIKMjA1IDE1MCAyMDUJCXBsdW0zCjEzOSAxMDIgMTM5CQlwbHVtNAoyMjQgMTAyIDI1NQkJTWVkaXVtT3JjaGlkMQoyMDkgIDk1IDIzOAkJTWVkaXVtT3JjaGlkMgoxODAgIDgyIDIwNQkJTWVkaXVtT3JjaGlkMwoxMjIgIDU1IDEzOQkJTWVkaXVtT3JjaGlkNAoxOTEgIDYyIDI1NQkJRGFya09yY2hpZDEKMTc4ICA1OCAyMzgJCURhcmtPcmNoaWQyCjE1NCAgNTAgMjA1CQlEYXJrT3JjaGlkMwoxMDQgIDM0IDEzOQkJRGFya09yY2hpZDQKMTU1ICA0OCAyNTUJCXB1cnBsZTEKMTQ1ICA0NCAyMzgJCXB1cnBsZTIKMTI1ICAzOCAyMDUJCXB1cnBsZTMKIDg1ICAyNiAxMzkJCXB1cnBsZTQKMTcxIDEzMCAyNTUJCU1lZGl1bVB1cnBsZTEKMTU5IDEyMSAyMzgJCU1lZGl1bVB1cnBsZTIKMTM3IDEwNCAyMDUJCU1lZGl1bVB1cnBsZTMKIDkzICA3MSAxMzkJCU1lZGl1bVB1cnBsZTQKMjU1IDIyNSAyNTUJCXRoaXN0bGUxCjIzOCAyMTAgMjM4CQl0aGlzdGxlMgoyMDUgMTgxIDIwNQkJdGhpc3RsZTMKMTM5IDEyMyAxMzkJCXRoaXN0bGU0CiAgMCAgIDAgICAwCQlncmF5MAogIDAgICAwICAgMAkJZ3JleTAKICAzICAgMyAgIDMJCWdyYXkxCiAgMyAgIDMgICAzCQlncmV5MQogIDUgICA1ICAgNQkJZ3JheTIKICA1ICAgNSAgIDUJCWdyZXkyCiAgOCAgIDggICA4CQlncmF5MwogIDggICA4ICAgOAkJZ3JleTMKIDEwICAxMCAgMTAJCWdyYXk0CiAxMCAgMTAgIDEwCQlncmV5NAogMTMgIDEzICAxMwkJZ3JheTUKIDEzICAxMyAgMTMJCWdyZXk1CiAxNSAgMTUgIDE1CQlncmF5NgogMTUgIDE1ICAxNQkJZ3JleTYKIDE4ICAxOCAgMTgJCWdyYXk3CiAxOCAgMTggIDE4CQlncmV5NwogMjAgIDIwICAyMAkJZ3JheTgKIDIwICAyMCAgMjAJCWdyZXk4CiAyMyAgMjMgIDIzCQlncmF5OQogMjMgIDIzICAyMwkJZ3JleTkKIDI2ICAyNiAgMjYJCWdyYXkxMAogMjYgIDI2ICAyNgkJZ3JleTEwCiAyOCAgMjggIDI4CQlncmF5MTEKIDI4ICAyOCAgMjgJCWdyZXkxMQogMzEgIDMxICAzMQkJZ3JheTEyCiAzMSAgMzEgIDMxCQlncmV5MTIKIDMzICAzMyAgMzMJCWdyYXkxMwogMzMgIDMzICAzMwkJZ3JleTEzCiAzNiAgMzYgIDM2CQlncmF5MTQKIDM2ICAzNiAgMzYJCWdyZXkxNAogMzggIDM4ICAzOAkJZ3JheTE1CiAzOCAgMzggIDM4CQlncmV5MTUKIDQxICA0MSAgNDEJCWdyYXkxNgogNDEgIDQxICA0MQkJZ3JleTE2CiA0MyAgNDMgIDQzCQlncmF5MTcKIDQzICA0MyAgNDMJCWdyZXkxNwogNDYgIDQ2ICA0NgkJZ3JheTE4CiA0NiAgNDYgIDQ2CQlncmV5MTgKIDQ4ICA0OCAgNDgJCWdyYXkxOQogNDggIDQ4ICA0OAkJZ3JleTE5CiA1MSAgNTEgIDUxCQlncmF5MjAKIDUxICA1MSAgNTEJCWdyZXkyMAogNTQgIDU0ICA1NAkJZ3JheTIxCiA1NCAgNTQgIDU0CQlncmV5MjEKIDU2ICA1NiAgNTYJCWdyYXkyMgogNTYgIDU2ICA1NgkJZ3JleTIyCiA1OSAgNTkgIDU5CQlncmF5MjMKIDU5ICA1OSAgNTkJCWdyZXkyMwogNjEgIDYxICA2MQkJZ3JheTI0CiA2MSAgNjEgIDYxCQlncmV5MjQKIDY0ICA2NCAgNjQJCWdyYXkyNQogNjQgIDY0ICA2NAkJZ3JleTI1CiA2NiAgNjYgIDY2CQlncmF5MjYKIDY2ICA2NiAgNjYJCWdyZXkyNgogNjkgIDY5ICA2OQkJZ3JheTI3CiA2OSAgNjkgIDY5CQlncmV5MjcKIDcxICA3MSAgNzEJCWdyYXkyOAogNzEgIDcxICA3MQkJZ3JleTI4CiA3NCAgNzQgIDc0CQlncmF5MjkKIDc0ICA3NCAgNzQJCWdyZXkyOQogNzcgIDc3ICA3NwkJZ3JheTMwCiA3NyAgNzcgIDc3CQlncmV5MzAKIDc5ICA3OSAgNzkJCWdyYXkzMQogNzkgIDc5ICA3OQkJZ3JleTMxCiA4MiAgODIgIDgyCQlncmF5MzIKIDgyICA4MiAgODIJCWdyZXkzMgogODQgIDg0ICA4NAkJZ3JheTMzCiA4NCAgODQgIDg0CQlncmV5MzMKIDg3ICA4NyAgODcJCWdyYXkzNAogODcgIDg3ICA4NwkJZ3JleTM0CiA4OSAgODkgIDg5CQlncmF5MzUKIDg5ICA4OSAgODkJCWdyZXkzNQogOTIgIDkyICA5MgkJZ3JheTM2CiA5MiAgOTIgIDkyCQlncmV5MzYKIDk0ICA5NCAgOTQJCWdyYXkzNwogOTQgIDk0ICA5NAkJZ3JleTM3CiA5NyAgOTcgIDk3CQlncmF5MzgKIDk3ICA5NyAgOTcJCWdyZXkzOAogOTkgIDk5ICA5OQkJZ3JheTM5CiA5OSAgOTkgIDk5CQlncmV5MzkKMTAyIDEwMiAxMDIJCWdyYXk0MAoxMDIgMTAyIDEwMgkJZ3JleTQwCjEwNSAxMDUgMTA1CQlncmF5NDEKMTA1IDEwNSAxMDUJCWdyZXk0MQoxMDcgMTA3IDEwNwkJZ3JheTQyCjEwNyAxMDcgMTA3CQlncmV5NDIKMTEwIDExMCAxMTAJCWdyYXk0MwoxMTAgMTEwIDExMAkJZ3JleTQzCjExMiAxMTIgMTEyCQlncmF5NDQKMTEyIDExMiAxMTIJCWdyZXk0NAoxMTUgMTE1IDExNQkJZ3JheTQ1CjExNSAxMTUgMTE1CQlncmV5NDUKMTE3IDExNyAxMTcJCWdyYXk0NgoxMTcgMTE3IDExNwkJZ3JleTQ2CjEyMCAxMjAgMTIwCQlncmF5NDcKMTIwIDEyMCAxMjAJCWdyZXk0NwoxMjIgMTIyIDEyMgkJZ3JheTQ4CjEyMiAxMjIgMTIyCQlncmV5NDgKMTI1IDEyNSAxMjUJCWdyYXk0OQoxMjUgMTI1IDEyNQkJZ3JleTQ5CjEyNyAxMjcgMTI3CQlncmF5NTAKMTI3IDEyNyAxMjcJCWdyZXk1MAoxMzAgMTMwIDEzMAkJZ3JheTUxCjEzMCAxMzAgMTMwCQlncmV5NTEKMTMzIDEzMyAxMzMJCWdyYXk1MgoxMzMgMTMzIDEzMwkJZ3JleTUyCjEzNSAxMzUgMTM1CQlncmF5NTMKMTM1IDEzNSAxMzUJCWdyZXk1MwoxMzggMTM4IDEzOAkJZ3JheTU0CjEzOCAxMzggMTM4CQlncmV5NTQKMTQwIDE0MCAxNDAJCWdyYXk1NQoxNDAgMTQwIDE0MAkJZ3JleTU1CjE0MyAxNDMgMTQzCQlncmF5NTYKMTQzIDE0MyAxNDMJCWdyZXk1NgoxNDUgMTQ1IDE0NQkJZ3JheTU3CjE0NSAxNDUgMTQ1CQlncmV5NTcKMTQ4IDE0OCAxNDgJCWdyYXk1OAoxNDggMTQ4IDE0OAkJZ3JleTU4CjE1MCAxNTAgMTUwCQlncmF5NTkKMTUwIDE1MCAxNTAJCWdyZXk1OQoxNTMgMTUzIDE1MwkJZ3JheTYwCjE1MyAxNTMgMTUzCQlncmV5NjAKMTU2IDE1NiAxNTYJCWdyYXk2MQoxNTYgMTU2IDE1NgkJZ3JleTYxCjE1OCAxNTggMTU4CQlncmF5NjIKMTU4IDE1OCAxNTgJCWdyZXk2MgoxNjEgMTYxIDE2MQkJZ3JheTYzCjE2MSAxNjEgMTYxCQlncmV5NjMKMTYzIDE2MyAxNjMJCWdyYXk2NAoxNjMgMTYzIDE2MwkJZ3JleTY0CjE2NiAxNjYgMTY2CQlncmF5NjUKMTY2IDE2NiAxNjYJCWdyZXk2NQoxNjggMTY4IDE2OAkJZ3JheTY2CjE2OCAxNjggMTY4CQlncmV5NjYKMTcxIDE3MSAxNzEJCWdyYXk2NwoxNzEgMTcxIDE3MQkJZ3JleTY3CjE3MyAxNzMgMTczCQlncmF5NjgKMTczIDE3MyAxNzMJCWdyZXk2OAoxNzYgMTc2IDE3NgkJZ3JheTY5CjE3NiAxNzYgMTc2CQlncmV5NjkKMTc5IDE3OSAxNzkJCWdyYXk3MAoxNzkgMTc5IDE3OQkJZ3JleTcwCjE4MSAxODEgMTgxCQlncmF5NzEKMTgxIDE4MSAxODEJCWdyZXk3MQoxODQgMTg0IDE4NAkJZ3JheTcyCjE4NCAxODQgMTg0CQlncmV5NzIKMTg2IDE4NiAxODYJCWdyYXk3MwoxODYgMTg2IDE4NgkJZ3JleTczCjE4OSAxODkgMTg5CQlncmF5NzQKMTg5IDE4OSAxODkJCWdyZXk3NAoxOTEgMTkxIDE5MQkJZ3JheTc1CjE5MSAxOTEgMTkxCQlncmV5NzUKMTk0IDE5NCAxOTQJCWdyYXk3NgoxOTQgMTk0IDE5NAkJZ3JleTc2CjE5NiAxOTYgMTk2CQlncmF5NzcKMTk2IDE5NiAxOTYJCWdyZXk3NwoxOTkgMTk5IDE5OQkJZ3JheTc4CjE5OSAxOTkgMTk5CQlncmV5NzgKMjAxIDIwMSAyMDEJCWdyYXk3OQoyMDEgMjAxIDIwMQkJZ3JleTc5CjIwNCAyMDQgMjA0CQlncmF5ODAKMjA0IDIwNCAyMDQJCWdyZXk4MAoyMDcgMjA3IDIwNwkJZ3JheTgxCjIwNyAyMDcgMjA3CQlncmV5ODEKMjA5IDIwOSAyMDkJCWdyYXk4MgoyMDkgMjA5IDIwOQkJZ3JleTgyCjIxMiAyMTIgMjEyCQlncmF5ODMKMjEyIDIxMiAyMTIJCWdyZXk4MwoyMTQgMjE0IDIxNAkJZ3JheTg0CjIxNCAyMTQgMjE0CQlncmV5ODQKMjE3IDIxNyAyMTcJCWdyYXk4NQoyMTcgMjE3IDIxNwkJZ3JleTg1CjIxOSAyMTkgMjE5CQlncmF5ODYKMjE5IDIxOSAyMTkJCWdyZXk4NgoyMjIgMjIyIDIyMgkJZ3JheTg3CjIyMiAyMjIgMjIyCQlncmV5ODcKMjI0IDIyNCAyMjQJCWdyYXk4OAoyMjQgMjI0IDIyNAkJZ3JleTg4CjIyNyAyMjcgMjI3CQlncmF5ODkKMjI3IDIyNyAyMjcJCWdyZXk4OQoyMjkgMjI5IDIyOQkJZ3JheTkwCjIyOSAyMjkgMjI5CQlncmV5OTAK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AK/X1wCv1/8Ar/8AAK//XwCv/4cAr/+vAK//1wCv//8A1wAAANcAXwDXAIcA1wCvANcA1wDXAP8A118AANdfXwDXX4cA11+vANdf1wDXX/8A14cAANeHXwDXh4cA14evANeH1wDXh/8A168AANevXwDXr4cA16+vANev1wDXr/8A19cAANfXXwDX14cA19evANfX1wDX1/8A1/8AANf/XwDX/4cA1/+vANf/1wDX//8A/wAAAP8AXwD/AIcA/wCvAP8A1wD/AP8A/18AAP9fXwD/X4cA/1+vAP9f1wD/X/8A/4cAAP+HXwD/h4cA/4evAP+H1wD/h/8A/68AAP+vXwD/r4cA/6+vAP+v1wD/r/8A/9cAAP/XXwD/14cA/9evAP/X1wD/1/8A//8AAP//XwD//4cA//+vAP//1wD///8ACAgIABISEgAcHBwAJiYmADAwMAA6OjoAREREAE5OTgBYWFgAYmJiAGxsbAB2dnYAgICAAIqKigCUlJQAnp6eAKioqACysrIAvLy8AMbGxgDQ0NAA2traAOTk5ADu7u4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAABAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAAQARAAEAAQABABIAEwAUABUAFgAXABgAAQABABkAGgABABsAHAAdAB4AHwABACAAAQAhACIAIwAkACUAJgAnACgAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACoAAQArAAEALAAtAC4ALwAwADEAMgAzADQANQA2ADAAMQAyADMANAA1ADYAMAAxADIAMwA0ADUANgAwADEAMgAzADQANQA2ADAAMQAyADMANAA1ADYAMAAxADIAMwA0ADUANgAwADcAOAA4ADgAOAA4ADgAOAA4AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAKQApADkAAQABADoAOwABADwAPQA+AAEAAQABAAEAAQABAD8AAQABAEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQABAE4ATwBQAFEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAFIAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAFMAAQABAAEAAQABAAEAAQABAFQAVQABAFYAAQBXACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQBYACkAKQApACkAWQBaAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAFsAKQBcAF0AAQABAAEAAQABAAEAAQABAAEAXgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQBfAAEAYABhAGIAAQABAAEAAQABAAEAYwABAAEAAQABAAEAZABVAGUAAQBmAGcAAQABAGgAaQABAAEAAQABAAEAAQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAAQB1AHUAdQB2ACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApAHcAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAdwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAHgAeQA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAIAAQABAAEAAQABAAEAAgABAAEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQADAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEABAABAAQABAABAAQABAABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAFAAEABAAEAAQABAAEAAQAAQABAAQABAABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQAEAAQABAAEAAQABAAEAAQABAABAAQABAAEAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAFAAUAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAGAAQAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAYABgAEAAYABgABAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABwAGAAYABAAEAAQABAABAAEABgAGAAEAAQAGAAYABAABAAEAAQABAAEAAQABAAEAAQAHAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQAEAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAYABgAGAAQABAABAAEAAQABAAQABAABAAEABAAEAAQAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQAGAAYABgAEAAQABAAEAAQAAQAEAAQABgABAAYABgAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAABAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABwAEAAYABAAEAAQABAABAAEABgAGAAEAAQAGAAYABAABAAEAAQABAAEAAQABAAQABAAHAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAcABgAEAAYABgABAAEAAQAGAAYABgABAAYABgAGAAQAAQABAAEAAQABAAEAAQABAAEABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQAEAAQABAAGAAYABgAGAAEABAAEAAQAAQAEAAQABAAEAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAEAAcABgAHAAYABgABAAQABwAHAAEABwAHAAQABAABAAEAAQABAAEAAQABAAcABwABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAcABgAGAAQABAAEAAQAAQAGAAYABgABAAYABgAGAAQABQABAAEAAQABAAEAAQABAAEABwABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAGAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEABwAGAAYABAAEAAQAAQAEAAEABgAGAAYABgAGAAYABgAHAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQAGAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABAABAAQAAQABAAEAAQAGAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABgAEAAQABAAEAAQAAQAEAAQAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAGAAQABAAEAAQABAAEAAEABAAEAAYABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAEAAQAAQABAAEAAQAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAEAAQAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAHAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYABAAEAAQABAAEAAQABAAGAAYABgAGAAYABgAGAAYABAAGAAYABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAGAAYABgAGAAQABAAGAAYABgABAAEAAQABAAYABgAEAAYABgAGAAYABgAGAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAGAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAQABgAEAAQABAAEAAQABAAEAAEABAABAAQAAQABAAQABAAEAAQABAAEAAQABAAGAAYABgAGAAYABgAEAAQABAAEAAQABAAEAAQABAAEAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABwAEAAQABAAEAAQABwAEAAcABgAGAAYABgAEAAcABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABgAEAAQABAAEAAYABgAEAAQABwAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAGAAQABAAGAAYABgAEAAYABAAEAAQABwAHAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAYABgAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAYABAAEAAQABAAEAAQABAABAAEAAQABAAQAAQABAAEAAQABAAEABAABAAEABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAAAEAAwAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwADAAMAAwADAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA0ADQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA0ADQANAA0AAwADAAMADQADAAMADQABAAEAAQABAAMAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAMAAQABAAEAAQABAAEAAQABAAEAAQADAAEAAQABAAEAAQABAAEAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAMADQANAAEAAwADAAMAAwADAA8AAQAPAA8ADwAPAA8ADwAPAAMADwAPAAMADwABAA0ADQAPAA8AAwAPAA8ADwAPABAADwAPAAMADwADAAMADwAPAAMADwAPAA8AAwAPAA8ADwADAAMAEQARABEAEQARABEAEQARAAMAAwADAA8ADwAPAA8ADwADAA8AAwAPAA8ADwAPAA8ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAMAAwAPAA8AAwAPAAMAAwAPAAMADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAwAPAA8AAwANAA8ADwAPAA8ADwAPAAEAAQABAAEADgAOAA4ADgAOAA4ADwAPAAMADQADAAMAAwADAA8AAwAPAAMAAwAPAA8ADwADAA0ADwAPAA8ADwAPAAMADwAPAA0ADQAPAA8ADwAPAAMAAwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADQANAA8ADwAPAA8ADwANAA0ADwAPAAMADwAPAA8ADwAPAA0AAwAPAAMADwADAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAMADQAPAA8ADwAPAA8AAwADAA0ADQADAA0ADwADAAMAEAANAA8ADwANAA8ADwAPAA8AAwAPAA8ADQABAAEAAwADABIAEgAQABAADwADAA8ADwADAAEAAwABAAMAAQABAAEAAQABAAEAAwABAAEAAQADAAEAAQABAAEAAQABAA0AAQABAAEAAQABAAEAAQABAAEAAQADAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAwABAAEAAQABAA0AAQANAAEAAQABAAEADQANAA0AAQANAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAMADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQANAA0AAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQANAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA0AAQABAAEAAQANAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAQABAAEAAQAEwATAA0ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADQAOAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAQABAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA0ADgANAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAQAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABAAEAAYAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAGAAcAAQABAAEAAQABAAEAAQABAAEAAQABAAEACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAEAAQABAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAQABAAEAAQABgAGAAQABAAGAAYABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABgAGAAQABAAGAAYABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAQABAAEAAEAAQAEAAQAAQABAAEAAQABAAQABAABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABAAEAAYABgABAAEAAQABAAEABgAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABAAGAAYABAAGAAYAAQAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAAQABAAEAAQABAAEAAQABAAEAAQABAAEACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAEAAQABAAEACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAcAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAABAAQABAABAAEAAQABAAEABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABgAGAAYABAAEAAQABAAGAAYABAAEAAEAAQAFAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAUAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAGAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABAAGAAcAAQAFAAUAAQABAAEAAQABAAQABAAEAAQAAQAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAQABAAEAAYABgAEAAcABAAEAAEAAQABAAEAAQABAAQAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAYABgAGAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEABwAGAAQABgAGAAYABgABAAEABgAGAAEAAQAGAAYABwABAAEAAQABAAEAAQABAAEAAQAHAAEAAQABAAEAAQABAAEAAQABAAEABgAGAAEAAQAEAAQABAAEAAQABAAEAAEAAQABAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAcABgAGAAQABAAEAAQABAAEAAEABwABAAEABwABAAcABwAHAAYAAQAGAAYABAAHAAQABQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAQABAAEAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAYABgAEAAQABAAEAAQABAAGAAQABgAGAAcABgAEAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAYABgAEAAQABAAEAAEAAQAGAAYABgAGAAQABAAGAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAYABAAGAAYABAAEAAQABAAEAAQABwAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAYABAABAAEABAAEAAQABAAGAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAQABAAEAAQABAAEAAQABAAEAAYABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAYABgAGAAYABgABAAYABgABAAEABAAEAAcABAAFAAYABQAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABgAGAAYABAAEAAQABAABAAEABAAEAAYABgAGAAYABAABAAEAAQAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAYABQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAYABgAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABAAEAAQABAAEAAQABAABAAQABAAEAAQABAAEAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQAGAAQABAAEAAQABAAEAAQABgAEAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAEAAQABAAQAAQAEAAQAAQAEAAQABAAEAAQABAAEAAUABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAGAAYAAQAEAAQAAQAGAAYABAAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAGAAYAAQABAAEAAQABAAEAAQABAAEABAAEAAUABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABAAEAAQABAAEAAEAAQABAAYABgAEAAcABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAYABgAGAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAoAAQABAAEACgAKAAoACgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ABAABAAEAAQABAAEAAQABAAEAAQABAAEAEwATAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAAEADgAOAA4ADgAOAA4ADgABAA4ADgABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgABAAEADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADgAOAA4ADgABAAEAAQABAAEAAQABAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAcABwAEAAQABAABAAEAAQAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAEAAQAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQAEAAQABAAEAAQABAAEAAEABAAEAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwARAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA8ADwAPAA8AAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEQABAAEAEQARABEAEQARABEAEQARABEAEQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYADgARAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAOAA4ADgAOAA4ADgAOAA4ADgAOAA0ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA0ADgAOABEAEQARABEAEQANABEAEQARAA4ADwAPAA8ADwAOAA4ADgAOAA4ADgAOAA4ADgAPAA8ADwAPAA8ADwAPABEAEQAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AEQARABEAEQARABEADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQARAA0ADQANABEAEQARABEAEQANABEAEQARABEAEQARAA0AEQARABEAEQADAA8ADwADAAMAAwADAAMAAwADAAMAAwARABEAEQARABEAEQARABEAEQADABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARABEAAwARABEAEQARABEAEQARABcAEQARABEAEQARABEAEQARABEAEQARABEAEQANAA8ADwADAAMADwADAAMAAwAPAA8AAwADABEAEQARABEAEQARABEADQARABEAEQARAA0ADQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEgAXABIAEQANABcAEQARABIAEAAQAAMAAwARABEAEQARABEAAwADAAMAAwADAAMAAwADAAMAAwADAAMADQARABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARAA8ADwADABEAAwAPAAMAEQARABEAGAAYABgAGAAYABEAEQARABEAEQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARAA0AEQARABEAEQARABEAEQARABEADQARABEAEQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAAMAEQADABIAFwARABEAEgASABIAEgAXABcAFwASABIAFwAXABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwAXABcAEgAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEQARABEAFwANABEAEQARABcAFwAXABEAFwAXABcAEQARABEAEQARABEAEQAXABEAFwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEADQARABEAEQARABEAEQAXABEAEQARABEAEQANABEAEQANABEAEQARABEAEQARABEADQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARABEADQARABEAEQARAA0ADQANABEAEQARAA0ADQANAA0AEQARABEAEQARABEAEQARABEADQARAA0ADQANABEAAwAPABEAEQARABEAEQARABEAEQARAA0AEQARABEAEQANABEAEQARABEADQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAAEAAQABAAEAAQABAAEAAQAPAA8ADwADAAMAEQARABEAEQAPAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA8ADwAPAA8ADwAPAA8AAwADAA8ADwADABAAEAADAAMAAwADABcADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAwAPAA8AAwADAAMAAwAPAA8AEAAPAA8ADwAPABcAFwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPABEAAwAPAA8AAwAPAA8ADwAPAA8ADwAPAA8AAwADAA8ADwAPAA8ADwAPAA8ADwAPAAMADwAPAA8ADwAPAAMAAwADAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAMAAwADAA8ADwAPAA8ADwAPAA8ADwADAAMAAwAPAA8AAwAPAAMADwAPAA8ADwADAA8ADwAPAA8ADwAPAAMADwAPAA8AAwAPAA8ADwAPAA8ADwADABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAA0AEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQAXABcAFwARABEAEQAXABcAFwAXABcAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEQARABEAEQARABEAEQANABEAEQARABEAEQANABEAEQARAA0AEQARAA0AEQARABEADQARABEAEQARABEAEQARABEAEQARABcAEQARABEAEQARABEAEQARABEADQARABEAEQARAA0AEQAXABcAFwARABEADQANABEADQARABEAEQAXABEAEQARABEAEQAPAA8ADwAPAA8AAwAXAAMAAwADABEAEQARAA8ADwARABEAEQAPAA8ADwAPABEAEQARABEAAwADAAMAAwADAAMADwAPAA8AAwAPABEAEQAPAA8ADwADAA8ADwADABEAEQARABEAEQARABEAEQARAA8ADwAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQAPAA8ADwAPABEADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwAPAA8ADwAPAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA8ADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwABAAEAAQABAAEAAQABAAEAAQABAAEAAQAXABEAEQAXABEAEQARABEAEQARABEAEQAXABcAFwAXABcAFwAXABcAEQARABEAEQARABEAFwARABEAEQARABEAEQARABEAEQAXABcAFwAXABcAFwAXABcAFwAXABEAAQAXABcAFwARABEAEQARABEAEQARAAEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAFwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwARABcAFwARABcAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwAXABEAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AEQARABEAEQARABEAEQARABEAEQARABEAEQAPAA8ADwARABEAEQARABEAEQARABEAEQARAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwAXABEADwAPAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQAPAA8AEQARABEAEQARABEAEQARABEAEQARAA8ADwAPAA8ADwAPABcAFwAXABcAFwAXABcAFwAXAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQW0cGSUdBgQIDCBuAi1xLnIeEhYqMjYAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiAKMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgB/AIAAgQCCAIMAhACFAIYAhwCIAIkAigCLAIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACdAJ4AnwCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvALAAsQCyALMAtAC1ALYAtwC4ALkAugC7ALwAvQC+AL8AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A/wAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwDGJZIlCSQMJA0kCiSwALEAJCQLJBglECUMJRQlPCW6I7sjACW8I70jHCUkJTQlLCUCJWQiZSLAA2AiowC3AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCuAK8AsACxALIAswC0ALUAtgC3ALgAuQC6ALsAvAC9AL4AvwDAAMEAwgDDAMQAxQDGAMcAyADJAMoAywDMAM0AzgDPANAA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgA6QDqAOsA7ADtAO4A7wDwAPEA8gDzAPQA9QD2APcA+AD5APoA+wD8AP0A/gD/AAAAAAAAAAIAAAABAAAAAAAAAAMAAAABAAAAAAAAAAIAAAAAAAAAAAAAAAMAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAQAAAAMAAAAAAAAAQgAAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBAAANCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBQUGAAUFBgEIBQgFCwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBQUGAAUFBgEIBQgFCwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBQUGAAUFBgEIBQgFCwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBgAGAAUFBgELAAsACwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBAYABgAGAQgECwALAAoICwAMCQ0KAAIABgAGBQQGAAYABgEIBAsACwAKCAsADAkNCgACAAYABgUEBgAGAAYBCAQLAAsACggLAAwJDQoAAgAGAAYFBAYABgAGAQgECwALAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACBwAABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAINAAAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIDAAAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgwAAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAINAAAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACDQAABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIBAQIBAwEEAQUBBgEHAQgBCQEKAQsADAkNCgADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMHAAcABwAHAAcABwAHAAcABwAHAAcABwAMCQcAAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAw0ADQANAA0ADQANAA0ADQANAA0ADQANAAwJDQAAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwMAAwADAAMAAwADAAMAAwADAAMAAwADAAwJAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCQAADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAkMAA0ADQANAA0ADQANAA0ADQANAA0ADQANAAwJDQANAA0ADQANAA0ADQANAA0ADQANAA0ADQAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAABAAAAAgAAAAEAAAAAAAAAAAAAAAABAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEJCQkJCQkJCQkJCQkJCQkJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcICAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgoDAwMDAwMDAwMDAwMEAwMLBgYGBQgICAgICAgICAgIAAwYJDxgVAwMDDBIDAwMDAwMDAwMDAwMDAAMDAwMDAAM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AAAAAAABAAAACwAAAAAAAAAAAAAAAAAAAAAAAAABAAAADAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQMFBwEDBQcBAwUHAQMFBwEDBQcBAwUHAAIEBgEDBQcBAwUHAQMFBwEDBQcDAwcHAwMHBwEDBQcAAAAAAAAAAAEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwACBAYBAwUHAQMFBwEDBQcBAwUHAwMHBwMDBwcBAwUHAAAAAAAAAAABAwUHAAIEBgACBAYBAwUHAAIEBgEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwMDBwcDAwcHAQMFBwAAAAAAAAAAAQMFBwEDBQcAAgQGAAIEBgACBAYAAgQGAAIEBgEDBQcBAwUHAQMFBwEDBQcDAwcHAwMHBwEDBQcAAAAAAAAAAAEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwACBAYBAwUHAQMFBwEDBQcBAwUHAwMHBwMDBwcBAwUHAAAAAAAAAAABAwUHAAIEBgEDBQcBAwUHAQMFBwEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwMDBwcDAwcHAQMFBwAAAAAAAAAAAQMFBwEDBQcBAwUHAQMFBwEDBQcBAwUHAAIEBgEDBQcBAwUHAQMFBwEDBQcDAwcHAwMHBwEDBQcAAAAAAAAAAAACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAgIGBgICBgYAAgQGAAAAAAAAAAAAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgICBgYCAgYGAAIEBgAAAAAAAAAAAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYCAgYGAgIGBgACBAYAAAAAAAAAAAEDBQcBAwUHAQMF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AAoAAAA8VxAACgAAACRXEAAKAAAADFcQAAoAAAD0VhAACgAAANxWEAAKAAAAxFYQAAoAAACsVhAACgAAACRWEAAKAAAADFYQAAoAAAD0VRAACgAAANxVEAAKAAAAxFUQAAoAAACROBAACgAAAKxVEAAKAAAATzgQAAoAAAAcZRAACgAAADRlEAAKAAAATGUQAAoAAABkZRAACgAAAJRVEAAKAAAAfFUQAAoAAADwVBAACgAAANhUEAAKAAAAqFQQAAoAAABkUxAACgAAAExTEAAKAAAANFMQAAoAAABAZhAACgAAAFhmEAAKAAAAcGYQAAoAAACIZhAACgAAABxTEAAKAAAAVFIQAAoAAAA8UhAACgAAACRSEAAKAAAADFIQAAoAAAD0URAACgAAANxREAAKAAAAxFEQAAoAAACsURAACgAAAERREAAKAAAALFEQAAoAAAAUURAACgAAAPxQEAAKAAAAmE4QAAoAAACAThAACgAAAGhOEAAKAAAAUE4QAAoAAABAXhAACgAAAG9MEAAKAAAAQEwQAAoAAAAUTBAACgAAAONLEAAKAAAAsksQAAoAAADRShAACgAAAGZKEAAKAAAAN0oQAAoAAAC8SRAACgAAABJJEAAKAAAA5kgQAAoAAACiSBAACgAAAMo7EAAKAAAAk0cQAAoAAAD5OxAACgAAALVGEAAKAAAAhkYQAAoAAADnRBAACgAAALhEEAAKAAAATTcQAAoAAAAjRBAACgAAAJhDEAAKAAAA6kIQAAoAAADoNhAACgAAAIhCEAAKAAAASkEQAAoAAAAyQRAACgAAAMZAEAAKAAAAl0AQAAoAAACbPxAACgAAAFM/EAAKAAAA6j4QAAoAAAD6NRAACgAAABZIEAAKAAAAPT4QAAoAAADjPRAACgAAAMs9EAAKAAAAYXoQAAoAAADJNRAACgAAAFpYEAALAAAAuFIQAAsAAACwNRAACwAAAEM2EAALAAAAsj0QAAsAAABIehAACwAAAM82EAALAAAAJD4QAAsAAAAEehAACwAAAHA+EAALAAAAljcQAAsAAACCPxAACwAAANFCEAALAAAACkQQAAsAAABsRBAACwAAAE9oEAALAAAANmgQAAsAAAAdaBAACwAAAARoEAALAAAAn0QQAAsAAADARRAACwAAAP5GEAALAAAAekcQAAsAAAD9RxAACwAA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AAIAAABeExAAAwAAAAAAAAACAAAAnRMQAAQAAAABAAEAAgAAAJITEAAEAAAABAABAAIAAACHExAABAAAAAUAAQACAAAAfBMQAAQAAAACAAEAAgAAAHETEAAEAAAAAwABAAIAAABsExAABAAAAAYAAQACAAAAZxMQAAQAAAAHAAEAAgAAAGITEAAEAAAACAABAAIAAACuExAABQAAAAkAAQACAAAAqBMQAAUAAAAMAAEAAgAAAKITEAAFAAAADQABAAIAAACXExAABQAAAAoAAQACAAAAjBMQAAUAAAALAAEAAgAAAIETEAAFAAAADgABAAIAAAB2ExAABQAAAA8AAQACAAAAHhIQAAMAAAAAAAAAAgAAAF0SEAAEAAAAAQABAAIAAABSEhAABAAAAAQAAQACAAAARxIQAAQAAAAFAAEAAgAAADwSEAAEAAAAAgABAAIAAAAxEhAABAAAAAMAAQACAAAALBIQAAQAAAAGAAEAAgAAACcSEAAEAAAABwABAAIAAAAiEhAABAAAAAgAAQACAAAAcxIQAAUAAAAJAAEAAgAAAGgSEAAFAAAADAABAAIAAABiEhAABQAAAA0AAQACAAAAVxIQAAUAAAAKAAEAAgAAAEwSEAAFAAAACwABAAIAAABBEhAABQAAAA4AAQACAAAANhIQAAUAAAAPAAEAAgAAABAREAADAAAAAAAAAAIAAABPERAABAAAAAEAAQACAAAARBEQAAQAAAAEAAEAAgAAADkREAAEAAAABQABAAIAAAAuERAABAAAAAIAAQACAAAAIxEQAAQAAAADAAEAAgAAAB4REAAEAAAABgABAAIAAAAZERAABAAAAAcAAQACAAAAFBEQAAQAAAAIAAEAAgAAAGAREAAFAAAACQABAAIAAABaERAABQAAAAwAAQACAAAAVBEQAAUAAAANAAEAAgAAAEkREAAFAAAACgABAAIAAAA+ERAABQAAAAsAAQACAAAAMxEQAAUAAAAOAAEAAgAAACgREAAFAAAADwABAAIAAAA0GhAAAwAAAAAAAAACAAAAcxoQAAQAAAABAAEAAgAAAGgaEAAEAAAABAABAAIAAABdGhAABAAAAAUAAQACAAAAUhoQAAQAAAACAAEAAgAAAEcaEAAEAAAAAwABAAIAAABCGhAABAAAAAYAAQACAAAAPRoQAAQAAAAHAAEAAgAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlcnJvcihzY3JlZW4pOiBmYWlsZWQgdG8gdXBkYXRlIGh5cGVybGluayBvbiByZXNpemUgZXJyPXdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBjaGFyc2V0IGludGVybWVkaWF0ZTogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBFU0MgYWN0aW9uOiBlcnJvcihzY3JlZW4pOiBmYWlsZWQgdG8gdXBkYXRlIHN0eWxlIG9uIGN1cnNvciBjaGFuZ2UgZXJyPWVycm9yKHNjcmVlbik6IGZhaWxlZCB0byB1cGRhdGUgaHlwZXJsaW5rIG9uIGN1cnNvciBjaGFuZ2UgZXJyPXdhcm5pbmc6IGRlbGV0ZUxpbmVzIG1hbnVhbFN0eWxlVXBkYXRlIGVycj13YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgaW5kZXggY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIG5leHQgbGluZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgdGFiIHNldCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgcmV2ZXJzZSBpbmRleCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgc2luZ2xlIHNoaWZ0IDIgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHNpbmdsZSBzaGlmdCAzIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBFU0MgY2FsbGJhY2s6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBmdWxsIHJlc2V0IGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBsb2NraW5nIHNoaWZ0IDEgcmlnaHQgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGxvY2tpbmcgc2hpZnQgMiByaWdodCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgbG9ja2luZyBzaGlmdCAzIHJpZ2h0IGNvbW1hbmQ6IHdhcm5pbmcodGVybWluYWwpOiBjdXJzb3IgY29weSBmYWlsZWQgZW50ZXJpbmcgYWx0IHNjcmVlbiBlcnI9d2FybmluZyh0ZXJtaW5hbCk6IHJlc3RvcmUgY3Vyc29yIG9uIHN3aXRjaCBzY3JlZW4gZmFpbGVkIHRvPSBlcnI9d2FybmluZyhzdHJlYW0pOiB1bmltcGxlbWVudGVkIHNldE1vZGU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBDMCBjaGFyYWN0ZXIsIGlnbm9yaW5nOiAweHdhcm5pbmcodGVybWluYWwpOiB6ZXJvLXdpZHRoIGNoYXJhY3RlciB3aXRoIG5vIHByaW9yIGNoYXJhY3RlciwgaWdub3Jpbmd3YXJuaW5nKHRlcm1pbmFsKTogZXJyb3IgcmVhbGxvY2F0aW5nIGZvciBtb3JlIGh5cGVybGluayBzcGFjZSwgaWdub3JpbmcgaHlwZXJsaW5rIGVycj13YXJuaW5nKHBhcnNlcik6IGludmFsaWQgaW50ZXJtZWRpYXRlcyBjb3VudHdhcm5pbmcocGFyc2VyKTogQ1NJIGNvbG9uIG9yIG1peGVkIHNlcGFyYXRvcnMgb25seSBhbGxvd2VkIGZvciAnbScgY29tbWFuZCwgZ290OiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIGRvd24gY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBCIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGN1cnNvciByaWdodCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEMgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIHVwIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgRSB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgRiB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBob3Jpem9udGFsIHRhYiBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEkgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgZXJhc2UgZGlzcGxheSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgZXJhc2UgbGluZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgSUwgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBMIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIERMIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgTSB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBkZWxldGUgY2hhcmFjdGVycyBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIFAgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgc2Nyb2xsIHVwIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgUyB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBzY3JvbGwgZG93biBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIFQgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIHRhYnVsYXRpb24gY29udHJvbDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBXIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGVyYXNlIGNoYXJhY3RlcnMgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBYIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGhvcml6b250YWwgdGFiIGJhY2sgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBaIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIEhQUiBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIGEgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgcHJpbnQgcmVwZWF0IGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgYiB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBkZXZpY2UgYXR0cmlidXRlcyBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgVlBBIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgZCB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBWUFIgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBlIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHRhYiBjbGVhciBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IHVua25vd24gdGFiIGNsZWFyIG1vZGU6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgZyB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBzZXQgbW9kZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IHVuaW1wbGVtZW50ZWQgbW9kZTogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHNldE1vZGlmeUtleUZvcm1hdDogd2FybmluZyhzdHJlYW0pOiB1bmtub3duIENTSSBtIHdpdGggaW50ZXJtZWRpYXRlOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIG0gd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgZGV2aWNlIHN0YXR1cyByZXBvcnQgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiB1bmtub3duIENTSSBuIHdpdGggaW50ZXJtZWRpYXRlOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIG4gd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIHAgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgREVDUlFNIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBjdXJzb3Igc3R5bGUgdmFsdWU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBzZXQgY3Vyb3Igc3R5bGUgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHNldCBwcm90ZWN0ZWQgbW9kZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIHEgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgREVDU1RCTSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IHVuaW1wbGVtZW50ZWQgcmVzdG9yZSBtb2RlOiB3YXJuaW5nKHN0cmVhbSk6IHVua25vd24gQ1NJIHMgd2l0aCBpbnRlcm1lZGlhdGU6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgcyB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBERUNTTFJNIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBzYXZlIG1vZGU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBYVFNISUZURVNDQVBFIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgQ1NJIDE0IHQgd2l0aCBleHRyYSBwYXJhbWV0ZXJzOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIENTSSAxNiB0IHdpdGggZXh0cmEgcGFyYW1ldGVyczogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyBDU0kgMTggdCB3aXRoIGV4dHJhIHBhcmFtZXRlcnM6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgQ1NJIDIxIHQgd2l0aCBleHRyYSBwYXJhbWV0ZXJzOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIENTSSAyMi8yMyB0IHdpdGggZXh0cmEgcGFyYW1ldGVyczogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyBDU0kgdCB3aXRoIHVuaW1wbGVtZW50ZWQgcGFyYW1ldGVyOiBlcnJvcihzdHJlYW0pOiBpZ25vcmluZyBDU0kgdCB3aXRoIG5vIHBhcmFtZXRlcnM6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgdCB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBwdXNoS2l0dHlLZXlib2FyZCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgc2V0S2l0dHlLZXlib2FyZCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIHU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBJQ0ggY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBAOiB3YXJuaW5nKHN0cmVhbSk6IHVuaW1wbGVtZW50ZWQgQ1NJIGNhbGxiYWNrOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEEgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIGxlZnQgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBEIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIEhQQSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEcgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgQ1VQIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgSCB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBDU0kgYWN0aW9uOiB3YXJuaW5nKHN0cmVhbSk6IGNoYW5nZSB0aXRsZSByZXF1ZXN0OiBpbnZhbGlkIHV0Zi04LCBpZ25vcmluZyByZXF1ZXN0d2FybmluZyhzdHJlYW0pOiB1bmtub3duIGN1cnNvciBzaGFwZTogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIE9TQywgc2hvdWxkIG5ldmVyIGhhcHBlbndhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBPU0MgY2FsbGJhY2s6IHdhcm5pbmcob3NjKTogT1NDIHNlcXVlbmNlIHRvbyBsb25nICg+ICksIGlnbm9yaW5nLiBzdGF0ZT13YXJuaW5nKG9zYyk6IE9TQyAxMCByZXF1aXJlcyBhbiBhbGxvY2F0b3IsIGJ1dCBub25lIHdhcyBwcm92aWRlZHdhcm5pbmcob3NjKTogT1NDIDEwNCByZXF1aXJlcyBhbiBhbGxvY2F0b3IsIGJ1dCBub25lIHdhcyBwcm92aWRlZHdhcm5pbmcob3NjKTogT1NDIDExIHJlcXVpcmVzIGFuIGFsbG9jYXRv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AFsJEAAOAAAANRQQAA4AAADpHRAACwAAAKgNEAANAAAADw8QAAsAAACzERAAEAAAAIoREAAYAAAAlRQQABQAAADYFBAAGAAAAP0WEAAVAAAADBYQABQAAADxFBAAHQAAAAEXEAARAAAAgNkRAILZEQCA2REAskgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAtEgSALZIEgC4SBIAskgSALpIEgC8SBIAvkgSAMBIEgC0SBIAwkgSAMRIEgCwSBIAsEgSALBIEgCwSBIAsEgSAMJIEgCySBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAvEgSAL5IEgDASBIAtEgSALBIEgDGSBIAyEgSAMpIEgDMSBIAzkgSANBIEgDSSBIA1EgSALBIEgDWSBIA2EgSANpIEgCwSBIA3EgSAN5IEgDgSBIA4kgSAORIEgDmSBIA6EgSAOpIEgDsSBIA7kgSAPBIEgDySBIA9EgSALBIEgCwSBIAsEgSAMBIEgAPAAAA/wAAAP8PAAD//wAACAAAAAAAAAACAAAABAAAAA==",self.location),V=[];if($.protocol==="file:"){let J=$.pathname;J.match(/^\/[A-Za-z]:\//)&&(J=J.slice(1)),V.push(J)}V.push($.href,"./ghostty-vt.wasm","/ghostty-vt.wasm");let Z=null;for(let J of V)try{return await M.loadFromPath(J)}catch(X){Z=X instanceof Error?X:Error(String(X))}throw Z||Error("Failed to load Ghostty WASM")}static async loadFromPath(j){let $;if(typeof Bun<"u"&&typeof Bun.file=="function")try{let J=Bun.file(j);await J.exists()&&($=await J.arrayBuffer())}catch{}if(!$)try{let J=await(await Promise.resolve().then(() => (t(),B))).readFile(j);$=J.buffer.slice(J.byteOffset,J.byteOffset+J.byteLength)}catch{}if(!$){let J=await fetch(j);if(!J.ok)throw Error(`Failed to fetch WASM: ${J.status} ${J.statusText}`);if($=await J.arrayBuffer(),$.byteLength===0)throw Error(`WASM file is empty (0 bytes). Check path: ${j}`)}if(!$)throw Error(`Could not load WASM from path: ${j}`);let V=await WebAssembly.compile($),Z=await WebAssembly.instantiate(V,{env:{log:(J,X)=>{let K=new Uint8Array(Z.exports.memory.buffer,J,X);console.log("[ghostty-vt]",new TextDecoder().decode(K))}}});return new M(Z)}}class A{constructor(j){this.encoder=0,this.exports=j;let $=this.exports.ghostty_wasm_alloc_opaque(),V=this.exports.ghostty_key_encoder_new(0,$);if(V!==0)throw Error(`Failed to create key encoder: ${V}`);let Z=new DataView(this.exports.memory.buffer);this.encoder=Z.getUint32($,!0),this.exports.ghostty_wasm_free_opaque($)}setOption(j,$){let V=this.exports.ghostty_wasm_alloc_u8();new DataView(this.exports.memory.buffer).setUint8(V,typeof $=="boolean"?$?1:0:$),this.exports.ghostty_key_encoder_setopt(this.encoder,j,V),this.exports.ghostty_wasm_free_u8(V)}setKittyFlags(j){this.setOption(r.KITTY_KEYBOARD_FLAGS,j)}encode(j){let $=this.exports.ghostty_wasm_alloc_opaque(),V=this.exports.ghostty_key_event_new(0,$);if(V!==0)throw Error(`Failed to create key event: ${V}`);let Z=new DataView(this.exports.memory.buffer),J=Z.getUint32($,!0);if(this.exports.ghostty_wasm_free_opaque($),this.exports.ghostty_key_event_set_action(J,j.action),this.exports.ghostty_key_event_set_key(J,j.key),this.exports.ghostty_key_event_set_mods(J,j.mods),j.utf8){let U=new TextEncoder().encode(j.utf8),H=this.exports.ghostty_wasm_alloc_u8_array(U.length);new Uint8Array(this.exports.memory.buffer).set(U,H),this.exports.ghostty_key_event_set_utf8(J,H,U.length),this.exports.ghostty_wasm_free_u8_array(H,U.length)}let X=32,K=this.exports.ghostty_wasm_alloc_u8_array(X),z=this.exports.ghostty_wasm_alloc_usize(),O=this.exports.ghostty_key_encoder_encode(this.encoder,J,K,X,z);if(O!==0)throw this.exports.ghostty_wasm_free_u8_array(K,X),this.exports.ghostty_wasm_free_usize(z),this.exports.ghostty_key_event_free(J),Error(`Failed to encode key: ${O}`);let W=Z.getUint32(z,!0),R=new Uint8Array(this.exports.memory.buffer,K,W).slice();return this.exports.ghostty_wasm_free_u8_array(K,X),this.exports.ghostty_wasm_free_usize(z),this.exports.ghostty_key_event_free(J),R}dispose(){this.encoder&&(this.exports.ghostty_key_encoder_free(this.encoder),this.encoder=0)}}var j0=class j{constructor($,V,Z=80,J=24,X){var K;if(this.viewportBufferPtr=0,this.viewportBufferSize=0,this.cellPool=[],this.graphemeBuffer=null,this.graphemeBufferPtr=0,this.exports=$,this.memory=V,this._cols=Z,this._rows=J,X){let z=this.exports.ghostty_wasm_alloc_u8_array(Q);if(z===0)throw Error("Failed to allocate config (out of memory)");try{let O=new DataView(this.memory.buffer),W=z;O.setUint32(W,X.scrollbackLimit??1e4,!0),W+=4,O.setUint32(W,X.fgColor??0,!0),W+=4,O.setUint32(W,X.bgColor??0,!0),W+=4,O.setUint32(W,X.cursorColor??0,!0),W+=4;for(let R=0;R<16;R++)O.setUint32(W,((K=X.palette)==null?void 0:K[R])??0,!0),W+=4;this.handle=this.exports.ghostty_terminal_new_with_config(Z,J,z)}finally{this.exports.ghostty_wasm_free_u8_array(z,Q)}}else this.handle=this.exports.ghostty_terminal_new(Z,J);if(!this.handle)throw Error("Failed to create terminal");this.initCellPool()}get cols(){return this._cols}get rows(){return this._rows}write($){let V=typeof $=="string"?new TextEncoder().encode($):$,Z=this.exports.ghostty_wasm_alloc_u8_array(V.length);new Uint8Array(this.memory.buffer).set(V,Z),this.exports.ghostty_terminal_write(this.handle,Z,V.length),this.exports.ghostty_wasm_free_u8_array(Z,V.length)}resize($,V){$===this._cols&&V===this._rows||(this._cols=$,this._rows=V,this.exports.ghostty_terminal_resize(this.handle,$,V),this.invalidateBuffers(),this.initCellPool())}free(){this.viewportBufferPtr&&(this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr,this.viewportBufferSize),this.viewportBufferPtr=0),this.exports.ghostty_terminal_free(this.handle)}update(){return this.exports.ghostty_render_state_update(this.handle)}getCursor(){return this.update(),{x:this.exports.ghostty_render_state_get_cursor_x(this.handle),y:this.exports.ghostty_render_state_get_cursor_y(this.handle),viewportX:this.exports.ghostty_render_state_get_cursor_x(this.handle),viewportY:this.exports.ghostty_render_state_get_cursor_y(this.handle),visible:this.exports.ghostty_render_state_get_cursor_visible(this.handle),blinking:!1,style:"block"}}getColors(){let $=this.exports.ghostty_render_state_get_bg_color(this.handle),V=this.exports.ghostty_render_state_get_fg_color(this.handle);return{background:{r:$>>16&255,g:$>>8&255,b:$&255},foreground:{r:V>>16&255,g:V>>8&255,b:V&255},cursor:null}}isRowDirty($){return this.exports.ghostty_render_state_is_row_dirty(this.handle,$)}markClean(){this.exports.ghostty_render_state_mark_clean(this.handle)}getViewport(){let $=this._cols*this._rows,V=$*j.CELL_SIZE;return(!this.viewportBufferPtr||this.viewportBufferSize=this._rows)return null;this.update();let V=this.getViewport(),Z=$*this._cols;return V.slice(Z,Z+this._cols).map((J)=>({...J}))}isDirty(){return this.update()!==h.NONE}needsFullRedraw(){return this.update()===h.FULL}clearDirty(){this.markClean()}isAlternateScreen(){return!!this.exports.ghostty_terminal_is_alternate_screen(this.handle)}hasBracketedPaste(){return this.getMode(2004,!1)}hasFocusEvents(){return this.getMode(1004,!1)}hasMouseTracking(){return this.exports.ghostty_terminal_has_mouse_tracking(this.handle)!==0}getDimensions(){return{cols:this._cols,rows:this._rows}}getScrollbackLength(){return this.exports.ghostty_terminal_get_scrollback_length(this.handle)}getScrollbackLine($){let V=this._cols*j.CELL_SIZE;(!this.viewportBufferPtr||this.viewportBufferSize(this.listeners.push(j),{dispose:()=>{let $=this.listeners.indexOf(j);$>=0&&this.listeners.splice($,1)}})}fire(j){for(let $ of this.listeners)$(j)}dispose(){this.listeners=[]}}class $0{constructor(j){this.bufferChangeEmitter=new v,this.terminal=j}get active(){let j=this.terminal.wasmTerm;return j?j.isAlternateScreen()?this.alternate:this.normal:this.normal}get normal(){return this._normalBuffer||(this._normalBuffer=new m(this.terminal,"normal")),this._normalBuffer}get alternate(){return this._alternateBuffer||(this._alternateBuffer=new m(this.terminal,"alternate")),this._alternateBuffer}get onBufferChange(){return this.bufferChangeEmitter.event}_fireBufferChange(j){this.bufferChangeEmitter.fire(j)}}class m{constructor(j,$){this.terminal=j,this.bufferType=$;let V={codepoint:0,fg_r:204,fg_g:204,fg_b:204,bg_r:0,bg_g:0,bg_b:0,flags:0,width:1,hyperlink_id:0,grapheme_len:0};this.nullCell=new p(V,0)}get type(){return this.bufferType}get cursorX(){let j=this.getWasmTerm();return j?j.getCursor().x:0}get cursorY(){let j=this.getWasmTerm();return j?j.getCursor().y:0}get viewportY(){return 0}get baseY(){return 0}get length(){let j=this.getWasmTerm();return j?this.bufferType==="alternate"?j.rows:j.getScrollbackLength()+j.rows:0}getLine(j){let $=this.getWasmTerm();if(!$||j<0||j>=this.length)return;let V=$.getScrollbackLength(),Z,J,X;if(this.bufferType==="normal"&&j=this._length))return j>=this.cells.length?new p({codepoint:0,fg_r:204,fg_g:204,fg_b:204,bg_r:0,bg_g:0,bg_b:0,flags:0,width:1,hyperlink_id:0,grapheme_len:0},j):new p(this.cells[j],j)}translateToString(j=!1,$=0,V=this._length){let Z=Math.max(0,Math.min($,this._length)),J=Math.max(Z,Math.min(V,this._length)),X="";for(let K=Z;K1114111||j>=55296&&j<=57343?"�":String.fromCodePoint(j)}getCode(){return this.cell.codepoint}getWidth(){return this.cell.width}getFgColorMode(){return-1}getBgColorMode(){return-1}getFgColor(){return this.cell.fg_r<<16|this.cell.fg_g<<8|this.cell.fg_b}getBgColor(){return this.cell.bg_r<<16|this.cell.bg_g<<8|this.cell.bg_b}isBold(){return this.cell.flags&b.BOLD?1:0}isItalic(){return this.cell.flags&b.ITALIC?1:0}isUnderline(){return this.cell.flags&b.UNDERLINE?1:0}isStrikethrough(){return this.cell.flags&b.STRIKETHROUGH?1:0}isBlink(){return this.cell.flags&b.BLINK?1:0}isInverse(){return this.cell.flags&b.INVERSE?1:0}isInvisible(){return this.cell.flags&b.INVISIBLE?1:0}isFaint(){return this.cell.flags&b.FAINT?1:0}getHyperlinkId(){return this.cell.hyperlink_id}getCodepoint(){return this.cell.codepoint}isDim(){return(this.cell.flags&b.FAINT)!==0}}var _0={KeyA:G.A,KeyB:G.B,KeyC:G.C,KeyD:G.D,KeyE:G.E,KeyF:G.F,KeyG:G.G,KeyH:G.H,KeyI:G.I,KeyJ:G.J,KeyK:G.K,KeyL:G.L,KeyM:G.M,KeyN:G.N,KeyO:G.O,KeyP:G.P,KeyQ:G.Q,KeyR:G.R,KeyS:G.S,KeyT:G.T,KeyU:G.U,KeyV:G.V,KeyW:G.W,KeyX:G.X,KeyY:G.Y,KeyZ:G.Z,Digit1:G.ONE,Digit2:G.TWO,Digit3:G.THREE,Digit4:G.FOUR,Digit5:G.FIVE,Digit6:G.SIX,Digit7:G.SEVEN,Digit8:G.EIGHT,Digit9:G.NINE,Digit0:G.ZERO,Enter:G.ENTER,Escape:G.ESCAPE,Backspace:G.BACKSPACE,Tab:G.TAB,Space:G.SPACE,Minus:G.MINUS,Equal:G.EQUAL,BracketLeft:G.BRACKET_LEFT,BracketRight:G.BRACKET_RIGHT,Backslash:G.BACKSLASH,Semicolon:G.SEMICOLON,Quote:G.QUOTE,Backquote:G.GRAVE,Comma:G.COMMA,Period:G.PERIOD,Slash:G.SLASH,CapsLock:G.CAPS_LOCK,F1:G.F1,F2:G.F2,F3:G.F3,F4:G.F4,F5:G.F5,F6:G.F6,F7:G.F7,F8:G.F8,F9:G.F9,F10:G.F10,F11:G.F11,F12:G.F12,PrintScreen:G.PRINT_SCREEN,ScrollLock:G.SCROLL_LOCK,Pause:G.PAUSE,Insert:G.INSERT,Home:G.HOME,PageUp:G.PAGE_UP,Delete:G.DELETE,End:G.END,PageDown:G.PAGE_DOWN,ArrowRight:G.RIGHT,ArrowLeft:G.LEFT,ArrowDown:G.DOWN,ArrowUp:G.UP,NumLock:G.NUM_LOCK,NumpadDivide:G.KP_DIVIDE,NumpadMultiply:G.KP_MULTIPLY,NumpadSubtract:G.KP_MINUS,NumpadAdd:G.KP_PLUS,NumpadEnter:G.KP_ENTER,Numpad1:G.KP_1,Numpad2:G.KP_2,Numpad3:G.KP_3,Numpad4:G.KP_4,Numpad5:G.KP_5,Numpad6:G.KP_6,Numpad7:G.KP_7,Numpad8:G.KP_8,Numpad9:G.KP_9,Numpad0:G.KP_0,NumpadDecimal:G.KP_PERIOD,IntlBackslash:G.INTL_BACKSLASH,ContextMenu:G.CONTEXT_MENU,F13:G.F13,F14:G.F14,F15:G.F15,F16:G.F16,F17:G.F17,F18:G.F18,F19:G.F19,F20:G.F20,F21:G.F21,F22:G.F22,F23:G.F23,F24:G.F24},Z0=class j{constructor($,V,Z,J,X,K,z,O,W,R){this.keydownListener=null,this.keypressListener=null,this.pasteListener=null,this.beforeInputListener=null,this.compositionStartListener=null,this.compositionUpdateListener=null,this.compositionEndListener=null,this.mousedownListener=null,this.mouseupListener=null,this.mousemoveListener=null,this.wheelListener=null,this.isComposing=!1,this.compositionJustEnded=!1,this.pendingKeyAfterComposition=null,this.isDisposed=!1,this.mouseButtonsPressed=0,this.lastKeyDownData=null,this.lastKeyDownTime=0,this.lastPasteData=null,this.lastPasteTime=0,this.lastPasteSource=null,this.lastCompositionData=null,this.lastCompositionTime=0,this.lastBeforeInputData=null,this.lastBeforeInputTime=0,this.encoder=$.createKeyEncoder(),this.container=V,this.inputElement=W,this.onDataCallback=Z,this.onBellCallback=J,this.onKeyCallback=X,this.customKeyEventHandler=K,this.getModeCallback=z,this.onCopyCallback=O,this.mouseConfig=R,this.attach()}setCustomKeyEventHandler($){this.customKeyEventHandler=$}attach(){typeof this.container.hasAttribute=="function"&&typeof this.container.setAttribute=="function"&&(this.container.hasAttribute("tabindex")||this.container.setAttribute("tabindex","0"),this.container.style&&(this.container.style.outline="none")),this.keydownListener=this.handleKeyDown.bind(this),this.container.addEventListener("keydown",this.keydownListener),this.pasteListener=this.handlePaste.bind(this),this.container.addEventListener("paste",this.pasteListener),this.inputElement&&this.inputElement!==this.container&&this.inputElement.addEventListener("paste",this.pasteListener),this.inputElement&&(this.beforeInputListener=this.handleBeforeInput.bind(this),this.inputElement.addEventListener("beforeinput",this.beforeInputListener));let $=this.inputElement||this.container;this.compositionStartListener=this.handleCompositionStart.bind(this),$.addEventListener("compositionstart",this.compositionStartListener),this.compositionUpdateListener=this.handleCompositionUpdate.bind(this),$.addEventListener("compositionupdate",this.compositionUpdateListener),this.compositionEndListener=this.handleCompositionEnd.bind(this),$.addEventListener("compositionend",this.compositionEndListener),this.mousedownListener=this.handleMouseDown.bind(this),this.container.addEventListener("mousedown",this.mousedownListener),this.mouseupListener=this.handleMouseUp.bind(this),this.container.addEventListener("mouseup",this.mouseupListener),this.mousemoveListener=this.handleMouseMove.bind(this),this.container.addEventListener("mousemove",this.mousemoveListener),this.wheelListener=this.handleWheel.bind(this),this.container.addEventListener("wheel",this.wheelListener,{passive:!1})}mapKeyCode($){return _0[$]??null}extractModifiers($){let V=S.NONE;return $.shiftKey&&(V|=S.SHIFT),$.ctrlKey&&(V|=S.CTRL),$.altKey&&(V|=S.ALT),$.metaKey&&(V|=S.SUPER),V}isPrintableCharacter($){return $.ctrlKey&&!$.altKey||$.altKey&&!$.ctrlKey||$.metaKey?!1:$.key.length===1}handleKeyDown($){if(this.isDisposed||$.isComposing||$.keyCode===229)return;if(this.isComposing){this.pendingKeyAfterComposition=$.key,$.preventDefault();return}if(this.compositionJustEnded){this.compositionJustEnded=!1;return}if(this.onKeyCallback&&this.onKeyCallback({key:$.key,domEvent:$}),this.customKeyEventHandler){let X=this.customKeyEventHandler($);if(X===!0){$.preventDefault();return}if(X===!1)return}if(($.ctrlKey||$.metaKey)&&$.code==="KeyV")return;if($.metaKey&&$.code==="KeyC"){this.onCopyCallback&&this.onCopyCallback()&&$.preventDefault();return}if($.metaKey&&!$.ctrlKey)return;if(this.isPrintableCharacter($)){$.preventDefault(),this.onDataCallback($.key),this.recordKeyDownData($.key);return}let V=this.mapKeyCode($.code);if(V===null)return;let Z=this.extractModifiers($);if(Z===S.NONE||Z===S.SHIFT){let X=null;switch(V){case G.ENTER:X="\r";break;case G.TAB:Z===S.SHIFT?X="\x1B[Z":X="\t";break;case G.BACKSPACE:X="";break;case G.ESCAPE:X="\x1B";break;case G.HOME:X="\x1B[H";break;case G.END:X="\x1B[F";break;case G.INSERT:X="\x1B[2~";break;case G.DELETE:X="\x1B[3~";break;case G.PAGE_UP:X="\x1B[5~";break;case G.PAGE_DOWN:X="\x1B[6~";break;case G.F1:X="\x1BOP";break;case G.F2:X="\x1BOQ";break;case G.F3:X="\x1BOR";break;case G.F4:X="\x1BOS";break;case G.F5:X="\x1B[15~";break;case G.F6:X="\x1B[17~";break;case G.F7:X="\x1B[18~";break;case G.F8:X="\x1B[19~";break;case G.F9:X="\x1B[20~";break;case G.F10:X="\x1B[21~";break;case G.F11:X="\x1B[23~";break;case G.F12:X="\x1B[24~";break}if(X!==null){$.preventDefault(),this.onDataCallback(X),this.recordKeyDownData(X);return}}let J=g.PRESS;try{if(this.getModeCallback){let O=this.getModeCallback(1);this.encoder.setOption(r.CURSOR_KEY_APPLICATION,O)}let X=$.key.length===1&&$.key.charCodeAt(0)<128?$.key.toLowerCase():void 0,K=this.encoder.encode({action:J,key:V,mods:Z,utf8:X}),z=new TextDecoder().decode(K);$.preventDefault(),$.stopPropagation(),z.length>0&&(this.onDataCallback(z),this.recordKeyDownData(z))}catch(X){console.warn("Failed to encode key:",$.code,X)}}handlePaste($){if(this.isDisposed)return;$.preventDefault(),$.stopPropagation();let V=$.clipboardData;if(!V){console.warn("No clipboard data available");return}let Z=V.getData("text/plain");if(!Z){console.warn("No text in clipboard");return}this.shouldIgnorePasteEvent(Z,"paste")||(this.emitPasteData(Z),this.recordPasteData(Z,"paste"))}handleBeforeInput($){if(this.isDisposed||this.isComposing||$.isComposing)return;let V=$.inputType,Z=$.data??"",J=null;switch(V){case"insertText":case"insertReplacementText":J=Z.length>0?Z.replace(/\n/g,"\r"):null;break;case"insertLineBreak":case"insertParagraph":J="\r";break;case"deleteContentBackward":J="";break;case"deleteContentForward":J="\x1B[3~";break;case"insertFromPaste":if(!Z)return;if(this.shouldIgnorePasteEvent(Z,"beforeinput")){$.preventDefault(),$.stopPropagation();return}$.preventDefault(),$.stopPropagation(),this.emitPasteData(Z),this.recordPasteData(Z,"beforeinput");return;default:return}if(J){if(this.shouldIgnoreBeforeInput(J)){$.preventDefault(),$.stopPropagation();return}if(Z&&this.shouldIgnoreBeforeInputFromComposition(Z)){$.preventDefault(),$.stopPropagation();return}$.preventDefault(),$.stopPropagation(),this.onDataCallback(J),Z&&this.recordBeforeInputData(Z)}}handleCompositionStart($){this.isDisposed||(this.isComposing=!0)}handleCompositionUpdate($){this.isDisposed}handleCompositionEnd($){if(this.isDisposed)return;this.isComposing=!1;let V=$.data;if(V&&V.length>0){if(this.shouldIgnoreCompositionEnd(V)){this.cleanupCompositionTextNodes(),this.processPendingKeyAfterComposition();return}this.onDataCallback(V),this.recordCompositionData(V)}this.cleanupCompositionTextNodes(),this.processPendingKeyAfterComposition()}processPendingKeyAfterComposition(){if(this.pendingKeyAfterComposition){let $=this.pendingKeyAfterComposition;this.pendingKeyAfterComposition=null,this.onDataCallback($)}}cleanupCompositionTextNodes(){if(this.container&&this.container.childNodes)for(let $=this.container.childNodes.length-1;$>=0;$--){let V=this.container.childNodes[$];V.nodeType===3&&this.container.removeChild(V)}}pixelToCell($){if(!this.mouseConfig)return null;let V=this.mouseConfig.getCellDimensions(),Z=this.mouseConfig.getCanvasOffset();if(V.width<=0||V.height<=0)return null;let J=$.clientX-Z.left,X=$.clientY-Z.top,K=Math.floor(J/V.width)+1,z=Math.floor(X/V.height)+1;return{col:Math.max(1,K),row:Math.max(1,z)}}getMouseModifiers($){let V=0;return $.shiftKey&&(V|=4),$.metaKey&&(V|=8),$.ctrlKey&&(V|=16),V}encodeMouseSGR($,V,Z,J,X){return`\x1B[<${$+X};${V};${Z}${J?"m":"M"}`}encodeMouseX10($,V,Z,J){let X=$+J+32,K=String.fromCharCode(Math.min(V+32,255)),z=String.fromCharCode(Math.min(Z+32,255));return`\x1B[M${String.fromCharCode(X)}${K}${z}`}sendMouseEvent($,V,Z,J,X){var K,z;let O=this.getMouseModifiers(X),W=((z=(K=this.mouseConfig)==null?void 0:K.hasSgrMouseMode)==null?void 0:z.call(K))??!0,R;if(W)R=this.encodeMouseSGR($,V,Z,J,O);else{let U=J?3:$;R=this.encodeMouseX10(U,V,Z,O)}this.onDataCallback(R)}handleMouseDown($){var V;if(this.isDisposed||!((V=this.mouseConfig)!=null&&V.hasMouseTracking()))return;let Z=this.pixelToCell($);if(!Z)return;let J=$.button;this.mouseButtonsPressed|=1<=V.length||!V.getCell(j))){for(let Z of this.linkCache.values())if(this.isPositionInLink(j,$,Z))return Z;this.scannedRows.has($)||await this.scanRow($);for(let Z of this.linkCache.values())if(this.isPositionInLink(j,$,Z))return Z}}async scanRow(j){this.scannedRows.add(j);let $=[];for(let V of this.providers){let Z=await new Promise((J)=>{V.provideLinks(j,J)});Z&&$.push(...Z)}for(let V of $)this.cacheLink(V)}cacheLink(j){let{start:$,end:V}=j.range,Z=`r${$.y}:${$.x}-${V.x}`;this.linkCache.set(Z,j)}isPositionInLink(j,$,V){let{start:Z,end:J}=V.range;return $J.y?!1:Z.y===J.y?j>=Z.x&&j<=J.x:$===Z.y?j>=Z.x:$===J.y?j<=J.x:!0}invalidateCache(){this.linkCache.clear(),this.scannedRows.clear()}invalidateRows(j,$){for(let Z=j;Z<=$;Z++)this.scannedRows.delete(Z);let V=[];for(let[Z,J]of this.linkCache.entries()){let{start:X,end:K}=J.range;(X.y>=j&&X.y<=$||K.y>=j&&K.y<=$||X.y$)&&V.push(Z)}for(let Z of V)this.linkCache.delete(Z)}dispose(){var j;this.linkCache.clear(),this.scannedRows.clear();for(let $ of this.providers)(j=$.dispose)==null||j.call($);this.providers=[]}}class X0{constructor(j){this.terminal=j}provideLinks(j,$){let V=[],Z=new Set,J=this.terminal.buffer.active.getLine(j);if(!J){$(void 0);return}for(let X=0;X{(H.ctrlKey||H.metaKey)&&window.open(W,"_blank","noopener,noreferrer")}})}}$(V.length>0?V:void 0)}findLinkRange(j,$,V){let Z=this.terminal.buffer.active,J=$,X=V;for(;X>0;){let W=Z.getLine(J);if(!W)break;let R=W.getCell(X-1);if(!R||R.getHyperlinkId()!==j)break;X--}if(X===0&&J>0){let W=J-1;for(;W>=0;){let R=Z.getLine(W);if(!R||R.length===0)break;let U=R.getCell(R.length-1);if(!U||U.getHyperlinkId()!==j)break;J=W,X=0;for(let H=R.length-1;H>=0;H--){let L=R.getCell(H);if(!L||L.getHyperlinkId()!==j){X=H+1;break}}if(X===0)W--;else break}}let K=$,z=V,O=Z.getLine(K);if(O){for(;z8&&Z.push({text:z,range:{start:{x:O,y:$},end:{x:W,y:$}},activate:(U)=>{(U.ctrlKey||U.metaKey)&&window.open(z,"_blank","noopener,noreferrer")}}),K=j.URL_REGEX.exec(X)}V(Z.length>0?Z:void 0)}lineToText($){let V=[];for(let Z=0;Z<$.length;Z++){let J=$.getCell(Z);if(!J){V.push(" ");continue}let X=J.getCodepoint();X===0||X<32?V.push(" "):V.push(String.fromCodePoint(X))}return V.join("")}dispose(){}};I.URL_REGEX=/(?:https?:\/\/|mailto:|ftp:\/\/|ssh:\/\/|git:\/\/|tel:|magnet:|gemini:\/\/|gopher:\/\/|news:)[\w\-.~:\/?#@!$&*+,;=%]+/gi;I.TRAILING_PUNCTUATION=/[.,;!?)\]]+$/;var x0=I,d={foreground:"#d4d4d4",background:"#1e1e1e",cursor:"#ffffff",cursorAccent:"#1e1e1e",selectionBackground:"#d4d4d4",selectionForeground:"#1e1e1e",black:"#000000",red:"#cd3131",green:"#0dbc79",yellow:"#e5e510",blue:"#2472c8",magenta:"#bc3fbc",cyan:"#11a8cd",white:"#e5e5e5",brightBlack:"#666666",brightRed:"#f14c4c",brightGreen:"#23d18b",brightYellow:"#f5f543",brightBlue:"#3b8eea",brightMagenta:"#d670d6",brightCyan:"#29b8db",brightWhite:"#ffffff"};class K0{constructor(j,$={}){this.cursorVisible=!0,this.lastCursorPosition={x:0,y:0},this.lastViewportY=0,this.currentBuffer=null,this.currentSelectionCoords=null,this.hoveredHyperlinkId=0,this.previousHoveredHyperlinkId=0,this.hoveredLinkRange=null,this.previousHoveredLinkRange=null,this.canvas=j;let V=j.getContext("2d",{alpha:!0});if(!V)throw Error("Failed to get 2D rendering context");this.ctx=V,this.fontSize=$.fontSize??15,this.fontFamily=$.fontFamily??"monospace",this.cursorStyle=$.cursorStyle??"block",this.cursorBlink=$.cursorBlink??!1,this.theme={...d,...$.theme},this.devicePixelRatio=$.devicePixelRatio??window.devicePixelRatio??1,this.palette=[this.theme.black,this.theme.red,this.theme.green,this.theme.yellow,this.theme.blue,this.theme.magenta,this.theme.cyan,this.theme.white,this.theme.brightBlack,this.theme.brightRed,this.theme.brightGreen,this.theme.brightYellow,this.theme.brightBlue,this.theme.brightMagenta,this.theme.brightCyan,this.theme.brightWhite],this.metrics=this.measureFont(),this.cursorBlink&&this.startCursorBlink()}buildFontString(j=""){let $=this.fontFamily.split(",").map((V)=>{let Z=V.trim();return Z.startsWith('"')||Z.startsWith("'")||!Z.includes(" ")?Z:`"${Z}"`}).join(", ");return`${j}${this.fontSize}px ${$}`}measureFont(){let j=document.createElement("canvas").getContext("2d");j.font=this.buildFontString();let $=j.measureText("M"),V=Math.ceil($.width),Z=$.fontBoundingBoxAscent??$.actualBoundingBoxAscent??this.fontSize*0.8,J=$.fontBoundingBoxDescent??$.actualBoundingBoxDescent??this.fontSize*0.2,X=Math.ceil(Z+J),K=Math.ceil(Z);return{width:V,height:X,baseline:K}}remeasureFont(){this.metrics=this.measureFont()}rgbToCSS(j,$,V){return`rgb(${j}, ${$}, ${V})`}resize(j,$){let V=j*this.metrics.width,Z=$*this.metrics.height;this.canvas.style.width=`${V}px`,this.canvas.style.height=`${Z}px`,this.canvas.width=V*this.devicePixelRatio,this.canvas.height=Z*this.devicePixelRatio,this.ctx.scale(this.devicePixelRatio,this.devicePixelRatio),this.ctx.textBaseline="alphabetic",this.ctx.textAlign="left",this.ctx.fillStyle=this.theme.background,this.ctx.fillRect(0,0,V,Z)}render(j,$=!1,V=0,Z,J=1){var X;let K=0,z=null;typeof V=="object"?z=V:K=V,this.currentBuffer=j;let O=j.getCursor(),W=j.getDimensions(),R=Z?Z.getScrollbackLength():0;(X=j.needsFullRedraw)!=null&&X.call(j)&&($=!0),(this.canvas.width!==W.cols*this.metrics.width*this.devicePixelRatio||this.canvas.height!==W.rows*this.metrics.height*this.devicePixelRatio)&&(this.resize(W.cols,W.rows),$=!0),K!==this.lastViewportY&&($=!0,this.lastViewportY=K);let U=O.x!==this.lastCursorPosition.x||O.y!==this.lastCursorPosition.y;if(U||this.cursorBlink){if(!$&&!j.isRowDirty(O.y)){let q=j.getLine(O.y);q&&this.renderLine(q,O.y,W.cols)}if(U&&this.lastCursorPosition.y!==O.y&&!$&&!j.isRowDirty(this.lastCursorPosition.y)){let q=j.getLine(this.lastCursorPosition.y);q&&this.renderLine(q,this.lastCursorPosition.y,W.cols)}}let H=z||this.selectionManager&&this.selectionManager.hasSelection(),L=new Set;if(z?this.currentSelectionCoords={startCol:z.start.x,startRow:z.start.y,endCol:z.end.x,endRow:z.end.y}:this.currentSelectionCoords=H?this.selectionManager.getSelectionCoords():null,this.currentSelectionCoords){let q=this.currentSelectionCoords;for(let P=q.startRow;P<=q.endRow;P++)L.add(P)}if(this.selectionManager){let q=this.selectionManager.getDirtySelectionRows();if(q.size>0){for(let P of q)L.add(P);this.selectionManager.clearDirtySelectionRows()}}let Y=new Set,T=this.hoveredHyperlinkId!==this.previousHoveredHyperlinkId,x=JSON.stringify(this.hoveredLinkRange)!==JSON.stringify(this.previousHoveredLinkRange);if(T){for(let q=0;q0)if(q0?!0:$||j.isRowDirty(q)||L.has(q)||Y.has(q))&&(N.add(q),q>0&&N.add(q-1),q0)if(q0?q-Math.floor(K):q;P=j.getLine(_)}else P=j.getLine(q);P&&this.renderLine(P,q,W.cols)}if(K===0&&O.visible&&this.cursorVisible){let q=O.style??this.cursorStyle;this.renderCursor(O.x,O.y,q)}Z&&J>0&&this.renderScrollbar(K,R,W.rows,J),this.lastCursorPosition={x:O.x,y:O.y},j.clearDirty()}renderLine(j,$,V){let Z=$*this.metrics.height,J=V*this.metrics.width;this.ctx.clearRect(0,Z,J,this.metrics.height),this.ctx.fillStyle=this.theme.background,this.ctx.fillRect(0,Z,J,this.metrics.height);for(let X=0;X0&&((J=this.currentBuffer)!=null&&J.getGraphemeString)?T=this.currentBuffer.getGraphemeString(V,$):T=String.fromCodePoint(j.codepoint||32);let x=j.codepoint||32;if(this.renderBlockChar(x,X,K,z)||this.renderPowerlineGlyph(x,X,K,z)||this.ctx.fillText(T,L,Y),j.flags&b.FAINT&&(this.ctx.globalAlpha=1),j.flags&b.UNDERLINE){let N=K+this.metrics.baseline+2;this.ctx.strokeStyle=this.ctx.fillStyle,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(X,N),this.ctx.lineTo(X+z,N),this.ctx.stroke()}if(j.flags&b.STRIKETHROUGH){let N=K+this.metrics.height/2;this.ctx.strokeStyle=this.ctx.fillStyle,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(X,N),this.ctx.lineTo(X+z,N),this.ctx.stroke()}if(j.hyperlink_id>0&&j.hyperlink_id===this.hoveredHyperlinkId){let N=K+this.metrics.baseline+2;this.ctx.strokeStyle="#4A90E2",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(X,N),this.ctx.lineTo(X+z,N),this.ctx.stroke()}if(this.hoveredLinkRange){let N=this.hoveredLinkRange;if(V===N.startY&&$>=N.startX&&(VN.startY&&VN.startY||$>=N.startX)){let q=K+this.metrics.baseline+2;this.ctx.strokeStyle="#4A90E2",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(X,q),this.ctx.lineTo(X+z,q),this.ctx.stroke()}}}renderBlockChar(j,$,V,Z){let J=this.metrics.height;switch(j){case 9600:return this.ctx.fillRect($,V,Z,J/2),!0;case 9601:return this.ctx.fillRect($,V+J*7/8,Z,J/8),!0;case 9602:return this.ctx.fillRect($,V+J*3/4,Z,J/4),!0;case 9603:return this.ctx.fillRect($,V+J*5/8,Z,J*3/8),!0;case 9604:return this.ctx.fillRect($,V+J/2,Z,J/2),!0;case 9605:return this.ctx.fillRect($,V+J*3/8,Z,J*5/8),!0;case 9606:return this.ctx.fillRect($,V+J/4,Z,J*3/4),!0;case 9607:return this.ctx.fillRect($,V+J/8,Z,J*7/8),!0;case 9608:return this.ctx.fillRect($,V,Z,J),!0;case 9609:return this.ctx.fillRect($,V,Z*7/8,J),!0;case 9610:return this.ctx.fillRect($,V,Z*3/4,J),!0;case 9611:return this.ctx.fillRect($,V,Z*5/8,J),!0;case 9612:return this.ctx.fillRect($,V,Z/2,J),!0;case 9613:return this.ctx.fillRect($,V,Z*3/8,J),!0;case 9614:return this.ctx.fillRect($,V,Z/4,J),!0;case 9615:return this.ctx.fillRect($,V,Z/8,J),!0;case 9616:return this.ctx.fillRect($+Z/2,V,Z/2,J),!0;case 9620:return this.ctx.fillRect($,V,Z,J/8),!0;case 9621:return this.ctx.fillRect($+Z*7/8,V,Z/8,J),!0;default:return!1}}renderPowerlineGlyph(j,$,V,Z){let J=this.metrics.height,X=this.ctx;switch(j){case 57520:return X.beginPath(),X.moveTo($,V),X.lineTo($+Z,V+J/2),X.lineTo($,V+J),X.closePath(),X.fill(),!0;case 57521:return X.beginPath(),X.moveTo($,V),X.lineTo($+Z,V+J/2),X.lineTo($,V+J),X.strokeStyle=X.fillStyle,X.lineWidth=1,X.stroke(),!0;case 57522:return X.beginPath(),X.moveTo($+Z,V),X.lineTo($,V+J/2),X.lineTo($+Z,V+J),X.closePath(),X.fill(),!0;case 57523:return X.beginPath(),X.moveTo($+Z,V),X.lineTo($,V+J/2),X.lineTo($+Z,V+J),X.strokeStyle=X.fillStyle,X.lineWidth=1,X.stroke(),!0;case 57524:return X.beginPath(),X.moveTo($,V),X.ellipse($,V+J/2,Z,J/2,0,-Math.PI/2,Math.PI/2,!1),X.closePath(),X.fill(),!0;case 57525:return X.beginPath(),X.moveTo($,V),X.ellipse($,V+J/2,Z,J/2,0,-Math.PI/2,Math.PI/2,!1),X.strokeStyle=X.fillStyle,X.lineWidth=1,X.stroke(),!0;case 57526:return X.beginPath(),X.moveTo($+Z,V),X.ellipse($+Z,V+J/2,Z,J/2,0,-Math.PI/2,Math.PI/2,!0),X.closePath(),X.fill(),!0;case 57527:return X.beginPath(),X.moveTo($+Z,V),X.ellipse($+Z,V+J/2,Z,J/2,0,-Math.PI/2,Math.PI/2,!0),X.strokeStyle=X.fillStyle,X.lineWidth=1,X.stroke(),!0;default:return!1}}renderCursor(j,$,V){var Z;let J=j*this.metrics.width,X=$*this.metrics.height,K=V??this.cursorStyle;switch(this.ctx.fillStyle=this.theme.cursor,K){case"block":this.ctx.fillRect(J,X,this.metrics.width,this.metrics.height);let z=(Z=this.currentBuffer)==null?void 0:Z.getLine($);z!=null&&z[j]&&this.renderCellText(z[j],j,$,this.theme.cursorAccent);break;case"underline":let O=Math.max(2,Math.floor(this.metrics.height*0.15));this.ctx.fillRect(J,X+this.metrics.height-O,this.metrics.width,O);break;case"bar":let W=Math.max(2,Math.floor(this.metrics.width*0.15));this.ctx.fillRect(J,X,W,this.metrics.height);break}}startCursorBlink(){this.cursorBlinkInterval=window.setInterval(()=>{this.cursorVisible=!this.cursorVisible},530)}stopCursorBlink(){this.cursorBlinkInterval!==void 0&&(clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=void 0),this.cursorVisible=!0}setTheme(j){this.theme={...d,...j},this.palette=[this.theme.black,this.theme.red,this.theme.green,this.theme.yellow,this.theme.blue,this.theme.magenta,this.theme.cyan,this.theme.white,this.theme.brightBlack,this.theme.brightRed,this.theme.brightGreen,this.theme.brightYellow,this.theme.brightBlue,this.theme.brightMagenta,this.theme.brightCyan,this.theme.brightWhite]}setFontSize(j){this.fontSize=j,this.metrics=this.measureFont()}setFontFamily(j){this.fontFamily=j,this.metrics=this.measureFont()}setCursorStyle(j){this.cursorStyle=j}setCursorBlink(j){j&&!this.cursorBlink?(this.cursorBlink=!0,this.startCursorBlink()):!j&&this.cursorBlink&&(this.cursorBlink=!1,this.stopCursorBlink())}renderScrollbar(j,$,V,Z=1){let J=this.ctx,X=this.canvas.height/this.devicePixelRatio,K=this.canvas.width/this.devicePixelRatio,O=K-8-4,R=X-8;if(J.clearRect(O-2,0,14,X),J.fillStyle=this.theme.background,J.fillRect(O-2,0,14,X),Z<=0||$===0)return;let U=$+V,H=Math.max(20,V/U*R),L=j/$,Y=4+(R-H)*(1-L);J.fillStyle=`rgba(128, 128, 128, ${0.1*Z})`,J.fillRect(O,4,8,R);let T=j>0?0.5:0.3;J.fillStyle=`rgba(128, 128, 128, ${T*Z})`,J.fillRect(O,Y,8,H)}getMetrics(){return{...this.metrics}}getCanvas(){return this.canvas}setSelectionManager(j){this.selectionManager=j}isInSelection(j,$){let V=this.currentSelectionCoords;if(!V)return!1;let{startCol:Z,startRow:J,endCol:X,endRow:K}=V;return J===K?$===J&&j>=Z&&j<=X:$===J?j>=Z:$===K?j<=X:$>J&&$J||V===J&&$>Z)&&([$,Z]=[Z,$],[V,J]=[J,V]);let X=this.wasmTerm.getScrollbackLength(),K="";for(let z=V;z<=J;z++){let O=null;if(z0)if(z=0?H=H.substring(0,W):H="",K+=H,z=J.cols;)K-=J.cols,X++;X=Math.min(X,J.rows-1);let z=this.getViewportY();this.selectionStart={col:$,absoluteRow:z+V},this.selectionEnd={col:K,absoluteRow:z+X},this.requestRender(),this.selectionChangedEmitter.fire()}selectLines($,V){let Z=this.wasmTerm.getDimensions();$=Math.max(0,Math.min($,Z.rows-1)),V=Math.max(0,Math.min(V,Z.rows-1)),$>V&&([$,V]=[V,$]);let J=this.getViewportY();this.selectionStart={col:0,absoluteRow:J+$},this.selectionEnd={col:Z.cols-1,absoluteRow:J+V},this.requestRender(),this.selectionChangedEmitter.fire()}getSelectionPosition(){let $=this.normalizeSelection();if($)return{start:{x:$.startCol,y:$.startRow},end:{x:$.endCol,y:$.endRow}}}deselect(){this.clearSelection(),this.selectionChangedEmitter.fire()}focus(){let $=this.renderer.getCanvas();$.parentElement&&$.parentElement.focus()}getSelectionCoords(){return this.normalizeSelection()}getDirtySelectionRows(){return this.dirtySelectionRows}clearDirtySelectionRows(){this.dirtySelectionRows.clear()}get onSelectionChange(){return this.selectionChangedEmitter.event}dispose(){this.selectionChangedEmitter.dispose(),this.stopAutoScroll(),this.boundMouseUpHandler&&(document.removeEventListener("mouseup",this.boundMouseUpHandler),this.boundMouseUpHandler=null),this.boundDocumentMouseMoveHandler&&(document.removeEventListener("mousemove",this.boundDocumentMouseMoveHandler),this.boundDocumentMouseMoveHandler=null),this.boundContextMenuHandler&&(this.renderer.getCanvas().removeEventListener("contextmenu",this.boundContextMenuHandler),this.boundContextMenuHandler=null),this.boundClickHandler&&(document.removeEventListener("click",this.boundClickHandler),this.boundClickHandler=null)}hasSGRMouseMode(){let $=this.terminal.wasmTerm;return $?$.getMode(1006,!1):!1}shouldReportMotion($){let V=this.terminal.wasmTerm;return V?!!(V.getMode(1003,!1)||V.getMode(1002,!1)&&$):!1}mapButton($){return $>=0&&$<=2?$:null}encodeModifiers($){let V=0;return $.shiftKey&&(V+=4),($.altKey||$.metaKey)&&(V+=8),$.ctrlKey&&(V+=16),V}sendMouseEvent($,V,Z,J,X=0,K=!1){var z;if(!this.hasSGRMouseMode())return;let O=$+1,W=V+1,R=Z;K&&(R+=32),R+=X;let U=`\x1B[<${R};${O};${W}${J?"m":"M"}`;(z=this.terminal.dataEmitter)==null||z.fire(U)}sendScrollEvent($,V,Z,J=0){let X=Z?64:65;this.sendMouseEvent($,V,X,!1,J,!1)}attachEventListeners(){let $=this.renderer.getCanvas();$.addEventListener("mousedown",(V)=>{$.parentElement&&$.parentElement.focus();let Z=this.pixelToCell(V.offsetX,V.offsetY);if(this.terminal.hasMouseTracking()){let J=this.mapButton(V.button);if(J===null)return;this.mouseButtonsPressed.add(J);let X=this.encodeModifiers(V);this.sendMouseEvent(Z.col,Z.row,J,!1,X),V.preventDefault();return}if(V.button===0){this.hasSelection()&&this.clearSelection();let J=this.viewportRowToAbsolute(Z.row);this.selectionStart={col:Z.col,absoluteRow:J},this.selectionEnd={col:Z.col,absoluteRow:J},this.isSelecting=!0}}),$.addEventListener("mousemove",(V)=>{if(this.terminal.hasMouseTracking()){let Z=this.mouseButtonsPressed.size>0;if(this.shouldReportMotion(Z)){let J=this.pixelToCell(V.offsetX,V.offsetY),X=this.encodeModifiers(V),K=Z?[...this.mouseButtonsPressed][0]:3;this.sendMouseEvent(J.col,J.row,K,!1,X,!0);return}if(Z)return}if(this.isSelecting){this.markCurrentSelectionDirty();let Z=this.pixelToCell(V.offsetX,V.offsetY),J=this.viewportRowToAbsolute(Z.row);this.selectionEnd={col:Z.col,absoluteRow:J},this.requestRender(),this.updateAutoScroll(V.offsetY,$.clientHeight)}}),$.addEventListener("mouseleave",(V)=>{if(this.isSelecting){let Z=$.getBoundingClientRect();V.clientYZ.bottom&&this.startAutoScroll(1)}}),$.addEventListener("mouseenter",()=>{this.isSelecting&&this.stopAutoScroll()}),this.boundDocumentMouseMoveHandler=(V)=>{if(this.isSelecting){let Z=$.getBoundingClientRect(),J=Math.max(Z.left,Math.min(V.clientX,Z.right)),X=Math.max(Z.top,Math.min(V.clientY,Z.bottom)),K=J-Z.left,z=X-Z.top;if((V.clientXZ.right||V.clientYZ.bottom)&&(V.clientYZ.bottom?this.startAutoScroll(1):this.stopAutoScroll(),this.autoScrollDirection===0)){this.markCurrentSelectionDirty();let O=this.pixelToCell(K,z),W=this.viewportRowToAbsolute(O.row);this.selectionEnd={col:O.col,absoluteRow:W},this.requestRender()}}},document.addEventListener("mousemove",this.boundDocumentMouseMoveHandler),document.addEventListener("mousedown",(V)=>{this.mouseDownTarget=V.target}),this.boundMouseUpHandler=(V)=>{let Z=this.mapButton(V.button);if(Z!==null&&this.mouseButtonsPressed.has(Z)&&this.terminal.hasMouseTracking()){let J=$.getBoundingClientRect(),X=Math.max(0,Math.min(V.clientX-J.left,J.width)),K=Math.max(0,Math.min(V.clientY-J.top,J.height)),z=this.pixelToCell(X,K),O=this.encodeModifiers(V);this.sendMouseEvent(z.col,z.row,Z,!0,O),this.mouseButtonsPressed.delete(Z);return}if(Z!==null&&this.mouseButtonsPressed.delete(Z),this.isSelecting){if(this.isSelecting=!1,this.stopAutoScroll(),this.selectionStart&&this.selectionEnd&&this.selectionStart.col===this.selectionEnd.col&&this.selectionStart.absoluteRow===this.selectionEnd.absoluteRow){this.selectionStart=null,this.selectionEnd=null;return}if(this.hasSelection()){let J=this.getSelection();J&&(this.copyToClipboard(J),this.selectionChangedEmitter.fire())}}},document.addEventListener("mouseup",this.boundMouseUpHandler),$.addEventListener("click",(V)=>{if(V.detail===2){let Z=this.pixelToCell(V.offsetX,V.offsetY),J=this.getWordAtCell(Z.col,Z.row);if(J){let X=this.viewportRowToAbsolute(Z.row);this.selectionStart={col:J.startCol,absoluteRow:X},this.selectionEnd={col:J.endCol,absoluteRow:X},this.requestRender();let K=this.getSelection();K&&(this.copyToClipboard(K),this.selectionChangedEmitter.fire())}}else if(V.detail>=3){let Z=this.pixelToCell(V.offsetX,V.offsetY),J=this.viewportRowToAbsolute(Z.row),X=this.wasmTerm.getScrollbackLength(),K=null;if(J=0;O--)if(K[O]&&K[O].codepoint!==0&&K[O].codepoint!==32){z=O;break}}if(z>=0){this.selectionStart={col:0,absoluteRow:J},this.selectionEnd={col:z,absoluteRow:J},this.requestRender();let O=this.getSelection();O&&(this.copyToClipboard(O),this.selectionChangedEmitter.fire())}}}),this.boundContextMenuHandler=(V)=>{if(this.terminal.hasMouseTracking()){V.preventDefault();return}if(this.renderer.getCanvas().getBoundingClientRect(),this.textarea.style.position="fixed",this.textarea.style.left=`${V.clientX}px`,this.textarea.style.top=`${V.clientY}px`,this.textarea.style.width="1px",this.textarea.style.height="1px",this.textarea.style.zIndex="1000",this.textarea.style.opacity="0",this.textarea.style.pointerEvents="auto",this.hasSelection()){let Z=this.getSelection();this.textarea.value=Z,this.textarea.select(),this.textarea.setSelectionRange(0,Z.length)}else this.textarea.value="";this.textarea.focus(),setTimeout(()=>{let Z=()=>{this.textarea.style.pointerEvents="none",this.textarea.style.zIndex="-10",this.textarea.style.width="0",this.textarea.style.height="0",this.textarea.style.left="0",this.textarea.style.top="0",this.textarea.value="",document.removeEventListener("click",Z),document.removeEventListener("contextmenu",Z),this.textarea.removeEventListener("blur",Z)};document.addEventListener("click",Z,{once:!0}),document.addEventListener("contextmenu",Z,{once:!0}),this.textarea.addEventListener("blur",Z,{once:!0})},10)},$.addEventListener("contextmenu",this.boundContextMenuHandler),this.boundClickHandler=(V)=>{if(this.isSelecting||this.mouseDownTarget&&$.contains(this.mouseDownTarget))return;let Z=V.target;$.contains(Z)||this.hasSelection()&&this.clearSelection()},document.addEventListener("click",this.boundClickHandler)}markCurrentSelectionDirty(){let $=this.normalizeSelection();if($)for(let V=$.startRow;V<=$.endRow;V++)this.dirtySelectionRows.add(V)}updateAutoScroll($,V){let Z=j.AUTO_SCROLL_EDGE_SIZE;$V-Z?this.startAutoScroll(1):this.stopAutoScroll()}startAutoScroll($){this.autoScrollInterval!==null&&this.autoScrollDirection===$||(this.stopAutoScroll(),this.autoScrollDirection=$,this.autoScrollInterval=setInterval(()=>{if(!this.isSelecting){this.stopAutoScroll();return}let V=j.AUTO_SCROLL_SPEED*this.autoScrollDirection;if(this.terminal.scrollLines(V),this.selectionEnd){let Z=this.wasmTerm.getDimensions();if(this.autoScrollDirection<0){let J=this.viewportRowToAbsolute(0);Jthis.selectionEnd.absoluteRow&&(this.selectionEnd={col:Z.cols-1,absoluteRow:J})}}this.requestRender()},j.AUTO_SCROLL_INTERVAL))}stopAutoScroll(){this.autoScrollInterval!==null&&(clearInterval(this.autoScrollInterval),this.autoScrollInterval=null),this.autoScrollDirection=0}pixelToCell($,V){let Z=this.renderer.getMetrics(),J=Math.floor($/Z.width),X=Math.floor(V/Z.height);return{col:Math.max(0,Math.min(J,this.terminal.cols-1)),row:Math.max(0,Math.min(X,this.terminal.rows-1))}}normalizeSelection(){if(!this.selectionStart||!this.selectionEnd)return null;let{col:$,absoluteRow:V}=this.selectionStart,{col:Z,absoluteRow:J}=this.selectionEnd;(V>J||V===J&&$>Z)&&([$,Z]=[Z,$],[V,J]=[J,V]);let X=this.absoluteRowToViewport(V),K=this.absoluteRowToViewport(J),z=this.wasmTerm.getDimensions(),O=z.rows-1;return K<0||X>O?null:(X<0&&(X=0,$=0),K>O&&(K=O,Z=z.cols-1),{startCol:$,startRow:X,endCol:Z,endRow:K})}getWordAtCell($,V){let Z=this.wasmTerm.getLine(V);if(!Z)return null;let J=(z)=>{if(!z||z.codepoint===0)return!1;let O=String.fromCodePoint(z.codepoint);return/[\w\-./~:@+]/.test(O)};if(!J(Z[$]))return null;let X=$;for(;X>0&&J(Z[X-1]);)X--;let K=$;for(;K{console.warn("ClipboardItem write failed, trying writeText:",J),this.copyWithWriteText($)});return}catch{}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText($).catch((V)=>{console.warn("Clipboard writeText failed, trying execCommand:",V),this.copyWithExecCommand($)});return}this.copyWithExecCommand($)}}copyWithWriteText($){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText($).catch((V)=>{console.warn("Clipboard writeText failed, trying execCommand:",V),this.copyWithExecCommand($)}):this.copyWithExecCommand($)}copyWithExecCommand($){let V=document.activeElement;try{let Z=this.textarea;Z.value=$,Z.style.position="fixed",Z.style.left="-9999px",Z.style.top="0",Z.style.width="1px",Z.style.height="1px",Z.style.opacity="0",Z.focus(),Z.select(),Z.setSelectionRange(0,$.length);let J=document.execCommand("copy");V&&V.focus(),J||console.warn("execCommand copy failed")}catch(Z){console.warn("execCommand copy threw:",Z),V&&V.focus()}}requestRender(){}};w.AUTO_SCROLL_EDGE_SIZE=30;w.AUTO_SCROLL_SPEED=3;w.AUTO_SCROLL_INTERVAL=50;var v0=w;class z0{constructor(j){this.terminal=j}getLine(j){var $;let V=this.terminal.getSnapshotCells();return V&&j>=0&&j=0&&j{if(!this.wasmTerm||this.scrollAnimationStartTime===void 0)return;let V=this.options.smoothScrollDuration??100,Z=this.targetViewportY-this.viewportY;if(Math.abs(Z)<0.01){this.viewportY=this.targetViewportY,this.scrollEmitter.fire(Math.floor(this.viewportY)),this.getScrollbackLength()>0&&this.showScrollbar(),this.scrollAnimationFrame=void 0,this.scrollAnimationStartTime=void 0,this.scrollAnimationStartY=void 0;return}let J=1-(1/(V/1000*60))**2;this.viewportY+=Z*J;let X=Math.floor(this.viewportY);this.scrollEmitter.fire(X),this.getScrollbackLength()>0&&this.showScrollbar(),this.scrollAnimationFrame=requestAnimationFrame(this.animateScroll)},this.handleMouseMove=(V)=>{if(!(!this.canvas||!this.renderer||!this.wasmTerm)){if(this.isDraggingScrollbar){this.processScrollbarDrag(V);return}if(this.linkDetector){if(this.mouseMoveThrottleTimeout){this.pendingMouseMove=V;return}this.processMouseMove(V),this.mouseMoveThrottleTimeout=window.setTimeout(()=>{if(this.mouseMoveThrottleTimeout=void 0,this.pendingMouseMove){let Z=this.pendingMouseMove;this.pendingMouseMove=void 0,this.processMouseMove(Z)}},16)}}},this.handleMouseLeave=()=>{var V,Z;this.renderer&&this.wasmTerm&&((this.renderer.hoveredHyperlinkId||0)>0&&this.renderer.setHoveredHyperlinkId(0),this.renderer.setHoveredLinkRange(null)),this.currentHoveredLink&&((Z=(V=this.currentHoveredLink).hover)==null||Z.call(V,!1),this.currentHoveredLink=void 0,this.element&&(this.element.style.cursor="text"))},this.handleClick=async(V)=>{if(!this.canvas||!this.renderer||!this.linkDetector||!this.wasmTerm)return;let Z=this.canvas.getBoundingClientRect(),J=Math.floor((V.clientX-Z.left)/this.renderer.charWidth),X=Math.floor((V.clientY-Z.top)/this.renderer.charHeight),K=this.wasmTerm.getScrollbackLength(),z,O=this.getViewportY(),W=Math.max(0,Math.floor(O));if(W>0)if(X{var Z,J,X,K;if(V.preventDefault(),V.stopPropagation(),this.customWheelEventHandler&&this.customWheelEventHandler(V))return;let z=((Z=this.wasmTerm)==null?void 0:Z.getMode(1006,!1))??!1;if(this.hasMouseTracking()&&z&&this.canvas&&this.renderer){let O=this.canvas.getBoundingClientRect(),W=V.clientX-O.left,R=V.clientY-O.top,U=this.renderer.getMetrics(),H=Math.max(0,Math.min(Math.floor(W/U.width),this.cols-1)),L=Math.max(0,Math.min(Math.floor(R/U.height),this.rows-1)),Y=0;V.shiftKey&&(Y+=4),(V.altKey||V.metaKey)&&(Y+=8),V.ctrlKey&&(Y+=16);let T=Math.min(Math.abs(Math.round(V.deltaY/33)),5),x=(V.deltaY<0?64:65)+Y;for(let N=0;N0?"down":"up",W=Math.min(Math.abs(Math.round(V.deltaY/33)),5);for(let R=0;R{if(!this.canvas||!this.renderer||!this.wasmTerm)return;let Z=this.wasmTerm.getScrollbackLength();if(Z===0)return;let J=this.canvas.getBoundingClientRect(),X=V.clientX-J.left,K=V.clientY-J.top,z=J.width,O=J.height,W=8,R=z-W-4,U=4;if(X>=R&&X<=R+W){V.preventDefault(),V.stopPropagation(),V.stopImmediatePropagation();let H=O-U*2,L=this.rows,Y=Z+L,T=Math.max(20,L/Y*H),x=this.viewportY/Z,N=U+(H-T)*(1-x);if(K>=N&&K<=N+T)this.isDraggingScrollbar=!0,this.scrollbarDragStart=K,this.scrollbarDragStartViewportY=this.viewportY,this.canvas&&(this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none");else{let q=1-(K-U)/H,P=Math.round(q*Z);this.scrollToLine(Math.max(0,Math.min(Z,P)))}}},this.handleMouseUp=()=>{this.isDraggingScrollbar&&(this.isDraggingScrollbar=!1,this.scrollbarDragStart=null,this.canvas&&(this.canvas.style.userSelect="",this.canvas.style.webkitUserSelect=""),this.scrollbarVisible&&this.getScrollbackLength()>0&&this.showScrollbar())},this.ghostty=j.ghostty??M0(),this.linkClickHandler=j.onLinkClick;let $={cols:j.cols??80,rows:j.rows??24,cursorBlink:j.cursorBlink??!1,cursorStyle:j.cursorStyle??"block",theme:j.theme??{},scrollback:j.scrollback??1e4,fontSize:j.fontSize??15,fontFamily:j.fontFamily??"monospace",allowTransparency:j.allowTransparency??!1,convertEol:j.convertEol??!1,disableStdin:j.disableStdin??!1,smoothScrollDuration:j.smoothScrollDuration??100};this.options=new Proxy($,{set:(V,Z,J)=>{let X=V[Z];return V[Z]=J,this.isOpen&&this.handleOptionChange(Z,J,X),!0}}),this.cols=this.options.cols,this.rows=this.options.rows,this.buffer=new $0(this),this.snapshotBuffer=new z0(this)}handleOptionChange(j,$,V){if($!==V)switch(j){case"disableStdin":break;case"cursorBlink":case"cursorStyle":this.renderer&&(this.renderer.setCursorStyle(this.options.cursorStyle),this.renderer.setCursorBlink(this.options.cursorBlink));break;case"theme":this.renderer&&(this.renderer.setTheme(this.options.theme),this.wasmTerm&&this.renderer.render(this.wasmTerm,!0,this.viewportY,this));break;case"fontSize":this.renderer&&(this.renderer.setFontSize(this.options.fontSize),this.handleFontChange());break;case"fontFamily":this.renderer&&(this.renderer.setFontFamily(this.options.fontFamily),this.handleFontChange());break;case"cols":case"rows":this.resize(this.options.cols,this.options.rows);break}}handleFontChange(){if(!this.renderer||!this.wasmTerm||!this.canvas)return;this.selectionManager&&this.selectionManager.clearSelection(),this.renderer.resize(this.cols,this.rows);let j=this.renderer.getMetrics();this.canvas.width=j.width*this.cols,this.canvas.height=j.height*this.rows,this.canvas.style.width=`${j.width*this.cols}px`,this.canvas.style.height=`${j.height*this.rows}px`,this.renderer.render(this.wasmTerm,!0,this.viewportY,this)}parseColorToHex(j){if(!j)return 0;if(j.startsWith("#")){let V=j.slice(1);V.length===3&&(V=V[0]+V[0]+V[1]+V[1]+V[2]+V[2]);let Z=Number.parseInt(V,16);return Number.isNaN(Z)?0:Z}let $=j.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if($){let V=Number.parseInt($[1],10),Z=Number.parseInt($[2],10),J=Number.parseInt($[3],10);return V<<16|Z<<8|J}return 0}buildWasmConfig(){let j=this.options.theme,$=this.options.scrollback;if(!j&&$===1e4)return;let V={...d,...j},Z=[this.parseColorToHex(V.black),this.parseColorToHex(V.red),this.parseColorToHex(V.green),this.parseColorToHex(V.yellow),this.parseColorToHex(V.blue),this.parseColorToHex(V.magenta),this.parseColorToHex(V.cyan),this.parseColorToHex(V.white),this.parseColorToHex(V.brightBlack),this.parseColorToHex(V.brightRed),this.parseColorToHex(V.brightGreen),this.parseColorToHex(V.brightYellow),this.parseColorToHex(V.brightBlue),this.parseColorToHex(V.brightMagenta),this.parseColorToHex(V.brightCyan),this.parseColorToHex(V.brightWhite)];return{scrollbackLimit:$,fgColor:this.parseColorToHex(V.foreground),bgColor:this.parseColorToHex(V.background),cursorColor:this.parseColorToHex(V.cursor),palette:Z}}open(j){if(this.isOpen)throw Error("Terminal is already open");if(this.isDisposed)throw Error("Terminal has been disposed");this.element=j,this.isOpen=!0;try{j.setAttribute("tabindex","-1"),j.setAttribute("role","textbox"),j.setAttribute("aria-label","Terminal input"),j.setAttribute("aria-multiline","true");let $=this.buildWasmConfig();this.wasmTerm=this.ghostty.createTerminal(this.cols,this.rows,$),this.canvas=document.createElement("canvas"),this.canvas.style.display="block",j.appendChild(this.canvas),this.textarea=document.createElement("textarea"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.setAttribute("tabindex","0"),this.textarea.setAttribute("aria-label","Terminal input"),this.textarea.style.position="absolute",this.textarea.style.left="0",this.textarea.style.top="0",this.textarea.style.width="1px",this.textarea.style.height="1px",this.textarea.style.padding="0",this.textarea.style.border="none",this.textarea.style.margin="0",this.textarea.style.opacity="0",this.textarea.style.clipPath="inset(50%)",this.textarea.style.overflow="hidden",this.textarea.style.whiteSpace="nowrap",this.textarea.style.resize="none",j.appendChild(this.textarea),this.compositionPreview=document.createElement("div"),this.compositionPreview.style.position="absolute",this.compositionPreview.style.top="4px",this.compositionPreview.style.right="4px",this.compositionPreview.style.padding="2px 8px",this.compositionPreview.style.backgroundColor="rgba(0, 0, 0, 0.7)",this.compositionPreview.style.color="#ffcc00",this.compositionPreview.style.fontFamily="monospace",this.compositionPreview.style.fontSize="12px",this.compositionPreview.style.borderRadius="3px",this.compositionPreview.style.display="none",this.compositionPreview.style.zIndex="1000",j.appendChild(this.compositionPreview),this.textarea.addEventListener("compositionupdate",(z)=>{z.data&&(this.compositionPreview.textContent=`조합중: ${z.data}`,this.compositionPreview.style.display="block")}),this.textarea.addEventListener("compositionend",()=>{this.compositionPreview.style.display="none"});let V=this.textarea;this.canvas.addEventListener("mousedown",(z)=>{z.preventDefault(),V.focus()}),this.canvas.addEventListener("touchend",(z)=>{z.preventDefault(),V.focus()}),j.addEventListener("mousedown",(z)=>{z.target===j&&(z.preventDefault(),V.focus())}),j.addEventListener("focus",()=>{V.focus()}),this.renderer=new K0(this.canvas,{fontSize:this.options.fontSize,fontFamily:this.options.fontFamily,cursorStyle:this.options.cursorStyle,cursorBlink:this.options.cursorBlink,theme:this.options.theme}),this.renderer.resize(this.cols,this.rows);let Z=this.canvas,J=this.renderer,X=this.wasmTerm,K={hasMouseTracking:()=>(X==null?void 0:X.hasMouseTracking())??!1,hasSgrMouseMode:()=>(X==null?void 0:X.getMode(1006,!1))??!0,getCellDimensions:()=>({width:J.charWidth,height:J.charHeight}),getCanvasOffset:()=>{let z=Z.getBoundingClientRect();return{left:z.left,top:z.top}}};this.inputHandler=new b0(this.ghostty,j,(z)=>{this.options.disableStdin||this.dataEmitter.fire(z)},()=>{this.bellEmitter.fire()},(z)=>{this.keyEmitter.fire(z)},this.customKeyEventHandler,(z)=>{var O;return((O=this.wasmTerm)==null?void 0:O.getMode(z,!1))??!1},()=>this.copySelection(),this.textarea,K),this.selectionManager=new v0(this,this.renderer,this.wasmTerm,this.textarea),this.renderer.setSelectionManager(this.selectionManager),this.selectionManager.onSelectionChange(()=>{this.selectionChangeEmitter.fire()}),this.linkDetector=new J0(this),this.linkDetector.registerProvider(new X0(this)),this.linkDetector.registerProvider(new x0(this)),j.addEventListener("mousedown",this.handleMouseDown,{capture:!0}),j.addEventListener("mousemove",this.handleMouseMove),j.addEventListener("mouseleave",this.handleMouseLeave),j.addEventListener("click",this.handleClick),document.addEventListener("mouseup",this.handleMouseUp),j.addEventListener("wheel",this.handleWheel,{passive:!1,capture:!0}),this.isOpen=!0,this.renderer.render(this.snapshotBuffer,!0,this.viewportY,this,this.scrollbarOpacity),this.startRenderLoop(),this.focus()}catch($){throw this.isOpen=!1,this.cleanupComponents(),Error(`Failed to open terminal: ${$}`)}}write(j,$){if(this.assertOpen(),this.options.convertEol&&typeof j=="string"&&(j=j.replace(/\n/g,`\r -`)),this._isResizing){let V=j instanceof Uint8Array?new Uint8Array(j):j;this._writeQueue.push({data:V,callback:$});return}this.writeInternal(j,$)}writeInternal(j,$){var V;this.wasmTerm.write(j),this.processTerminalResponses(),typeof j=="string"&&j.includes("\x07")?this.bellEmitter.fire():j instanceof Uint8Array&&j.includes(7)&&this.bellEmitter.fire(),(V=this.linkDetector)==null||V.invalidateCache(),this.viewportY!==0&&this.scrollToBottom(),typeof j=="string"&&j.includes("\x1B]")&&this.checkForTitleChange(j),$&&requestAnimationFrame($)}writeln(j,$){if(typeof j=="string")this.write(j+`\r -`,$);else{let V=new Uint8Array(j.length+2);V.set(j),V[j.length]=13,V[j.length+1]=10,this.write(V,$)}}paste(j){this.assertOpen(),!this.options.disableStdin&&(this.wasmTerm.hasBracketedPaste()?this.dataEmitter.fire("\x1B[200~"+j+"\x1B[201~"):this.dataEmitter.fire(j))}input(j,$=!1){this.assertOpen(),!this.options.disableStdin&&($?this.dataEmitter.fire(j):this.write(j))}resize(j,$){if(this.assertOpen(),j===this.cols&&$===this.rows)return;this._resizeFlushFrameId&&(cancelAnimationFrame(this._resizeFlushFrameId),this._resizeFlushFrameId=void 0),this._isResizing=!0;let V=this.animationFrameId!==void 0;this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=void 0);try{this.wasmTerm.resize(j,$),this.cols=j,this.rows=$,this.renderer.resize(j,$);let Z=this.renderer.getMetrics();this.canvas.width=Z.width*j,this.canvas.height=Z.height*$,this.canvas.style.width=`${Z.width*j}px`,this.canvas.style.height=`${Z.height*$}px`,this.resizeEmitter.fire({cols:j,rows:$}),this.renderer.render(this.snapshotBuffer,!0,this.viewportY,this)}catch(Z){console.error("[ghostty-web] Resize error:",Z)}V&&this.startRenderLoop(),this._resizeFlushFrameId=requestAnimationFrame(()=>{this._resizeFlushFrameId=void 0,this._isResizing=!1,this.flushWriteQueue()})}flushWriteQueue(){if(this.isDisposed||!this.isOpen){this._writeQueue=[];return}let j=this._writeQueue;this._writeQueue=[];for(let{data:$,callback:V}of j)this.writeInternal($,V)}clear(){this.assertOpen(),this.wasmTerm.write("\x1B[2J\x1B[H")}reset(){this.assertOpen(),this.wasmTerm&&this.wasmTerm.free();let j=this.buildWasmConfig();this.wasmTerm=this.ghostty.createTerminal(this.cols,this.rows,j),this.renderer.clear(),this.currentTitle=""}focus(){if(this.isOpen){let j=this.textarea||this.element;j&&(j.focus(),setTimeout(()=>{j==null||j.focus()},0))}}blur(){this.isOpen&&this.element&&this.element.blur()}loadAddon(j){j.activate(this),this.addons.push(j)}getSelection(){var j;return((j=this.selectionManager)==null?void 0:j.getSelection())||""}hasSelection(){var j;return((j=this.selectionManager)==null?void 0:j.hasSelection())||!1}clearSelection(){var j;(j=this.selectionManager)==null||j.clearSelection()}copySelection(){var j;return((j=this.selectionManager)==null?void 0:j.copySelection())||!1}selectAll(){var j;(j=this.selectionManager)==null||j.selectAll()}select(j,$,V){var Z;(Z=this.selectionManager)==null||Z.select(j,$,V)}selectLines(j,$){var V;(V=this.selectionManager)==null||V.selectLines(j,$)}getViewportY(){return this.viewportY}getSelectionPosition(){var j;return(j=this.selectionManager)==null?void 0:j.getSelectionPosition()}attachCustomKeyEventHandler(j){this.customKeyEventHandler=j,this.inputHandler&&this.inputHandler.setCustomKeyEventHandler(j)}attachCustomWheelEventHandler(j){this.customWheelEventHandler=j}loadFonts(){this.renderer&&(this.renderer.remeasureFont(),this.handleFontChange())}registerLinkProvider(j){if(!this.linkDetector)throw Error("Terminal must be opened before registering link providers");this.linkDetector.registerProvider(j)}scrollLines(j){if(!this.wasmTerm)throw Error("Terminal not open");let $=this.getScrollbackLength(),V=Math.max(0,Math.min($,this.viewportY-j));V!==this.viewportY&&(this.viewportY=V,this.scrollEmitter.fire(this.viewportY),$>0&&this.showScrollbar())}scrollPages(j){this.scrollLines(j*this.rows)}scrollToTop(){let j=this.getScrollbackLength();j>0&&this.viewportY!==j&&(this.viewportY=j,this.scrollEmitter.fire(this.viewportY),this.showScrollbar())}scrollToBottom(){this.viewportY!==0&&(this.viewportY=0,this.scrollEmitter.fire(this.viewportY),this.getScrollbackLength()>0&&this.showScrollbar())}scrollToLine(j){let $=this.getScrollbackLength(),V=Math.max(0,Math.min($,j));V!==this.viewportY&&(this.viewportY=V,this.scrollEmitter.fire(this.viewportY),$>0&&this.showScrollbar())}smoothScrollTo(j){if(!this.wasmTerm)return;let $=this.getScrollbackLength(),V=Math.max(0,Math.min($,j));if((this.options.smoothScrollDuration??100)===0){this.viewportY=V,this.targetViewportY=V,this.scrollEmitter.fire(Math.floor(this.viewportY)),$>0&&this.showScrollbar();return}this.targetViewportY=V,!this.scrollAnimationFrame&&(this.scrollAnimationStartTime=Date.now(),this.scrollAnimationStartY=this.viewportY,this.animateScroll())}dispose(){if(!this.isDisposed){this.isDisposed=!0,this.isOpen=!1,this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=void 0),this.scrollAnimationFrame&&(cancelAnimationFrame(this.scrollAnimationFrame),this.scrollAnimationFrame=void 0),this._resizeFlushFrameId&&(cancelAnimationFrame(this._resizeFlushFrameId),this._resizeFlushFrameId=void 0),this._writeQueue=[],this._isResizing=!1,this.mouseMoveThrottleTimeout&&(clearTimeout(this.mouseMoveThrottleTimeout),this.mouseMoveThrottleTimeout=void 0),this.pendingMouseMove=void 0;for(let j of this.addons)j.dispose();this.addons=[],this.cleanupComponents(),this.dataEmitter.dispose(),this.resizeEmitter.dispose(),this.bellEmitter.dispose(),this.selectionChangeEmitter.dispose(),this.keyEmitter.dispose(),this.titleChangeEmitter.dispose(),this.scrollEmitter.dispose(),this.renderEmitter.dispose(),this.cursorMoveEmitter.dispose()}}startRenderLoop(){let j=()=>{if(!this.isDisposed&&this.isOpen){try{this.renderer.render(this.snapshotBuffer,!1,this.viewportY,this,this.scrollbarOpacity);let $=this.wasmTerm.getCursor();$.y!==this.lastCursorY&&(this.lastCursorY=$.y,this.cursorMoveEmitter.fire())}catch($){console.error("[ghostty-web] render loop error (recovering):",$)}this.animationFrameId=requestAnimationFrame(j)}};j()}getScrollbackLine(j){return this.wasmTerm?this.wasmTerm.getScrollbackLine(j):null}getScrollbackLength(){return this.wasmTerm?this.wasmTerm.getScrollbackLength():0}cleanupComponents(){this.selectionManager&&(this.selectionManager.dispose(),this.selectionManager=void 0),this.inputHandler&&(this.inputHandler.dispose(),this.inputHandler=void 0),this.renderer&&(this.renderer.dispose(),this.renderer=void 0),this.canvas&&this.canvas.parentNode&&(this.canvas.parentNode.removeChild(this.canvas),this.canvas=void 0),this.textarea&&this.textarea.parentNode&&(this.textarea.parentNode.removeChild(this.textarea),this.textarea=void 0),this.compositionPreview&&this.compositionPreview.parentNode&&(this.compositionPreview.parentNode.removeChild(this.compositionPreview),this.compositionPreview=void 0),this.element&&(this.element.removeEventListener("wheel",this.handleWheel),this.element.removeEventListener("mousedown",this.handleMouseDown,{capture:!0}),this.element.removeEventListener("mousemove",this.handleMouseMove),this.element.removeEventListener("mouseleave",this.handleMouseLeave),this.element.removeEventListener("click",this.handleClick),this.element.removeAttribute("role"),this.element.removeAttribute("aria-label"),this.element.removeAttribute("aria-multiline")),this.isOpen&&typeof document<"u"&&document.removeEventListener("mouseup",this.handleMouseUp),this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.linkDetector&&(this.linkDetector.dispose(),this.linkDetector=void 0),this.wasmTerm&&(this.wasmTerm.free(),this.wasmTerm=void 0),this.ghostty=void 0,this.element=void 0,this.textarea=void 0}assertOpen(){if(this.isDisposed)throw Error("Terminal has been disposed");if(!this.isOpen)throw Error("Terminal must be opened before use. Call terminal.open(parent) first.")}processMouseMove(j){if(!this.canvas||!this.renderer||!this.linkDetector||!this.wasmTerm)return;let $=this.canvas.getBoundingClientRect(),V=Math.floor((j.clientX-$.left)/this.renderer.charWidth),Z=Math.floor((j.clientY-$.top)/this.renderer.charHeight),J=0,X=null,K=this.getViewportY(),z=Math.max(0,Math.floor(K));if(z>0){let L=this.wasmTerm.getScrollbackLength();if(Z=0&&V0)if(Z{var Y,T,x,N;if(L!==this.currentHoveredLink&&((T=(Y=this.currentHoveredLink)==null?void 0:Y.hover)==null||T.call(Y,!1),this.currentHoveredLink=L,(x=L==null?void 0:L.hover)==null||x.call(L,!0),this.element&&(this.element.style.cursor=L?"pointer":"text"),this.renderer))if(L){let q=((N=this.wasmTerm)==null?void 0:N.getScrollbackLength())||0,P=this.getViewportY(),_=Math.max(0,Math.floor(P)),F=L.range.start.y-q+_,u=L.range.end.y-q+_;F=0?this.renderer.setHoveredLinkRange({startX:L.range.start.x,startY:Math.max(0,F),endX:L.range.end.x,endY:Math.min(this.rows-1,u)}):this.renderer.setHoveredLinkRange(null)}else this.renderer.setHoveredLinkRange(null)}).catch((L)=>{console.warn("Link detection error:",L)})}processScrollbarDrag(j){if(!this.canvas||!this.renderer||!this.wasmTerm||this.scrollbarDragStart===null)return;let $=this.wasmTerm.getScrollbackLength();if($===0)return;let V=this.canvas.getBoundingClientRect(),Z=j.clientY-V.top-this.scrollbarDragStart,J=V.height-8,X=this.rows,K=$+X,z=Math.max(20,X/K*J),O=-Z/(J-z),W=Math.round(O*$),R=this.scrollbarDragStartViewportY+W;this.scrollToLine(Math.max(0,Math.min($,R)))}showScrollbar(){this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.scrollbarVisible?this.scrollbarOpacity=1:(this.scrollbarVisible=!0,this.scrollbarOpacity=0,this.fadeInScrollbar()),this.isDraggingScrollbar||(this.scrollbarHideTimeout=window.setTimeout(()=>{this.hideScrollbar()},this.SCROLLBAR_HIDE_DELAY_MS))}hideScrollbar(){this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.scrollbarVisible&&this.fadeOutScrollbar()}fadeInScrollbar(){let j=Date.now(),$=()=>{let V=Date.now()-j,Z=Math.min(V/this.SCROLLBAR_FADE_DURATION_MS,1);this.scrollbarOpacity=Z,this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,this.scrollbarOpacity),Z<1&&requestAnimationFrame($)};$()}fadeOutScrollbar(){let j=Date.now(),$=this.scrollbarOpacity,V=()=>{let Z=Date.now()-j,J=Math.min(Z/this.SCROLLBAR_FADE_DURATION_MS,1);this.scrollbarOpacity=$*(1-J),this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,this.scrollbarOpacity),J<1?requestAnimationFrame(V):(this.scrollbarVisible=!1,this.scrollbarOpacity=0,this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,0))};V()}processTerminalResponses(){if(this.wasmTerm)for(;;){let j=this.wasmTerm.readResponse();if(j===null)break;this.dataEmitter.fire(j)}}checkForTitleChange(j){let $=/\x1b\]([012]);([^\x07\x1b]*?)(?:\x07|\x1b\\)/g,V=null;for(;(V=$.exec(j))!==null;){let Z=V[1],J=V[2];(Z==="0"||Z==="2")&&J!==this.currentTitle&&(this.currentTitle=J,this.titleChangeEmitter.fire(J))}}getMode(j,$=!1){return this.assertOpen(),this.wasmTerm.getMode(j,$)}hasBracketedPaste(){return this.assertOpen(),this.wasmTerm.hasBracketedPaste()}hasFocusEvents(){return this.assertOpen(),this.wasmTerm.hasFocusEvents()}hasMouseTracking(){return this.assertOpen(),this.wasmTerm.hasMouseTracking()}setSnapshot(j,$){let V=[];for(let Z=0;Z{this._isResizing=!1},50)}}}proposeDimensions(){var j;if(!((j=this._terminal)!=null&&j.element))return;let $=this._terminal.renderer;if(!$||typeof $.getMetrics!="function")return;let V=$.getMetrics();if(!V||V.width===0||V.height===0)return;let Z=this._terminal.element;if(typeof Z.clientWidth>"u")return;let J=window.getComputedStyle(Z),X=Number.parseInt(J.getPropertyValue("padding-top"))||0,K=Number.parseInt(J.getPropertyValue("padding-bottom"))||0,z=Number.parseInt(J.getPropertyValue("padding-left"))||0,O=Number.parseInt(J.getPropertyValue("padding-right"))||0,W=Z.clientWidth,R=Z.clientHeight;if(W===0||R===0)return;let U=W-z-O-f0,H=R-X-K,L=Math.max(F0,Math.floor(U/V.width)),Y=Math.max(S0,Math.floor(H/V.height));return{cols:L,rows:Y}}observeResize(){var j;(j=this._terminal)!=null&&j.element&&(this._resizeObserver||(this._resizeObserver=new ResizeObserver(($)=>{this._isResizing||!$[0]||(this._resizeDebounceTimer&&clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=setTimeout(()=>{this.fit()},u0))}),this._resizeObserver.observe(this._terminal.element)))}}var e=null;function M0(){if(!e)throw Error(`ghostty-web not initialized. Call init() before creating Terminal instances. +var qD=Object.defineProperty;var VD=($)=>$;function ND($,j){this[$]=VD.bind(null,j)}var JD=($,j)=>{for(var O in j)qD($,O,{get:j[O],enumerable:!0,configurable:!0,set:ND.bind(j,O)})};var vD=($,j)=>()=>($&&(j=$($=0)),j);var ZZ=(($)=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy($,{get:(j,O)=>(typeof require<"u"?require:j)[O]}):$)(function($){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+$+'" is not supported')});var ER={};JD(ER,{default:()=>RD});var RD;var QR=vD(()=>{RD={}});var CV=(($)=>($[$.CURSOR_KEY_APPLICATION=0]="CURSOR_KEY_APPLICATION",$[$.KEYPAD_KEY_APPLICATION=1]="KEYPAD_KEY_APPLICATION",$[$.IGNORE_KEYPAD_WITH_NUMLOCK=2]="IGNORE_KEYPAD_WITH_NUMLOCK",$[$.ALT_ESC_PREFIX=3]="ALT_ESC_PREFIX",$[$.MODIFY_OTHER_KEYS_STATE_2=4]="MODIFY_OTHER_KEYS_STATE_2",$[$.KITTY_KEYBOARD_FLAGS=5]="KITTY_KEYBOARD_FLAGS",$))(CV||{}),hR=(($)=>($[$.RELEASE=0]="RELEASE",$[$.PRESS=1]="PRESS",$[$.REPEAT=2]="REPEAT",$))(hR||{}),n0=(($)=>($[$.UNIDENTIFIED=0]="UNIDENTIFIED",$[$.GRAVE=1]="GRAVE",$[$.BACKSLASH=2]="BACKSLASH",$[$.BRACKET_LEFT=3]="BRACKET_LEFT",$[$.BRACKET_RIGHT=4]="BRACKET_RIGHT",$[$.COMMA=5]="COMMA",$[$.ZERO=6]="ZERO",$[$.ONE=7]="ONE",$[$.TWO=8]="TWO",$[$.THREE=9]="THREE",$[$.FOUR=10]="FOUR",$[$.FIVE=11]="FIVE",$[$.SIX=12]="SIX",$[$.SEVEN=13]="SEVEN",$[$.EIGHT=14]="EIGHT",$[$.NINE=15]="NINE",$[$.EQUAL=16]="EQUAL",$[$.INTL_BACKSLASH=17]="INTL_BACKSLASH",$[$.INTL_RO=18]="INTL_RO",$[$.INTL_YEN=19]="INTL_YEN",$[$.A=20]="A",$[$.B=21]="B",$[$.C=22]="C",$[$.D=23]="D",$[$.E=24]="E",$[$.F=25]="F",$[$.G=26]="G",$[$.H=27]="H",$[$.I=28]="I",$[$.J=29]="J",$[$.K=30]="K",$[$.L=31]="L",$[$.M=32]="M",$[$.N=33]="N",$[$.O=34]="O",$[$.P=35]="P",$[$.Q=36]="Q",$[$.R=37]="R",$[$.S=38]="S",$[$.T=39]="T",$[$.U=40]="U",$[$.V=41]="V",$[$.W=42]="W",$[$.X=43]="X",$[$.Y=44]="Y",$[$.Z=45]="Z",$[$.MINUS=46]="MINUS",$[$.PERIOD=47]="PERIOD",$[$.QUOTE=48]="QUOTE",$[$.SEMICOLON=49]="SEMICOLON",$[$.SLASH=50]="SLASH",$[$.ALT_LEFT=51]="ALT_LEFT",$[$.ALT_RIGHT=52]="ALT_RIGHT",$[$.BACKSPACE=53]="BACKSPACE",$[$.CAPS_LOCK=54]="CAPS_LOCK",$[$.CONTEXT_MENU=55]="CONTEXT_MENU",$[$.CONTROL_LEFT=56]="CONTROL_LEFT",$[$.CONTROL_RIGHT=57]="CONTROL_RIGHT",$[$.ENTER=58]="ENTER",$[$.META_LEFT=59]="META_LEFT",$[$.META_RIGHT=60]="META_RIGHT",$[$.SHIFT_LEFT=61]="SHIFT_LEFT",$[$.SHIFT_RIGHT=62]="SHIFT_RIGHT",$[$.SPACE=63]="SPACE",$[$.TAB=64]="TAB",$[$.CONVERT=65]="CONVERT",$[$.KANA_MODE=66]="KANA_MODE",$[$.NON_CONVERT=67]="NON_CONVERT",$[$.DELETE=68]="DELETE",$[$.END=69]="END",$[$.HELP=70]="HELP",$[$.HOME=71]="HOME",$[$.INSERT=72]="INSERT",$[$.PAGE_DOWN=73]="PAGE_DOWN",$[$.PAGE_UP=74]="PAGE_UP",$[$.DOWN=75]="DOWN",$[$.LEFT=76]="LEFT",$[$.RIGHT=77]="RIGHT",$[$.UP=78]="UP",$[$.NUM_LOCK=79]="NUM_LOCK",$[$.KP_0=80]="KP_0",$[$.KP_1=81]="KP_1",$[$.KP_2=82]="KP_2",$[$.KP_3=83]="KP_3",$[$.KP_4=84]="KP_4",$[$.KP_5=85]="KP_5",$[$.KP_6=86]="KP_6",$[$.KP_7=87]="KP_7",$[$.KP_8=88]="KP_8",$[$.KP_9=89]="KP_9",$[$.KP_PLUS=90]="KP_PLUS",$[$.KP_BACKSPACE=91]="KP_BACKSPACE",$[$.KP_CLEAR=92]="KP_CLEAR",$[$.KP_CLEAR_ENTRY=93]="KP_CLEAR_ENTRY",$[$.KP_COMMA=94]="KP_COMMA",$[$.KP_PERIOD=95]="KP_PERIOD",$[$.KP_DIVIDE=96]="KP_DIVIDE",$[$.KP_ENTER=97]="KP_ENTER",$[$.KP_EQUAL=98]="KP_EQUAL",$[$.KP_MEMORY_ADD=99]="KP_MEMORY_ADD",$[$.KP_MEMORY_CLEAR=100]="KP_MEMORY_CLEAR",$[$.KP_MEMORY_RECALL=101]="KP_MEMORY_RECALL",$[$.KP_MEMORY_STORE=102]="KP_MEMORY_STORE",$[$.KP_MEMORY_SUBTRACT=103]="KP_MEMORY_SUBTRACT",$[$.KP_MULTIPLY=104]="KP_MULTIPLY",$[$.KP_PAREN_LEFT=105]="KP_PAREN_LEFT",$[$.KP_PAREN_RIGHT=106]="KP_PAREN_RIGHT",$[$.KP_MINUS=107]="KP_MINUS",$[$.KP_SEPARATOR=108]="KP_SEPARATOR",$[$.NUMPAD_UP=109]="NUMPAD_UP",$[$.NUMPAD_DOWN=110]="NUMPAD_DOWN",$[$.NUMPAD_RIGHT=111]="NUMPAD_RIGHT",$[$.NUMPAD_LEFT=112]="NUMPAD_LEFT",$[$.NUMPAD_BEGIN=113]="NUMPAD_BEGIN",$[$.NUMPAD_HOME=114]="NUMPAD_HOME",$[$.NUMPAD_END=115]="NUMPAD_END",$[$.NUMPAD_INSERT=116]="NUMPAD_INSERT",$[$.NUMPAD_DELETE=117]="NUMPAD_DELETE",$[$.NUMPAD_PAGE_UP=118]="NUMPAD_PAGE_UP",$[$.NUMPAD_PAGE_DOWN=119]="NUMPAD_PAGE_DOWN",$[$.ESCAPE=120]="ESCAPE",$[$.F1=121]="F1",$[$.F2=122]="F2",$[$.F3=123]="F3",$[$.F4=124]="F4",$[$.F5=125]="F5",$[$.F6=126]="F6",$[$.F7=127]="F7",$[$.F8=128]="F8",$[$.F9=129]="F9",$[$.F10=130]="F10",$[$.F11=131]="F11",$[$.F12=132]="F12",$[$.F13=133]="F13",$[$.F14=134]="F14",$[$.F15=135]="F15",$[$.F16=136]="F16",$[$.F17=137]="F17",$[$.F18=138]="F18",$[$.F19=139]="F19",$[$.F20=140]="F20",$[$.F21=141]="F21",$[$.F22=142]="F22",$[$.F23=143]="F23",$[$.F24=144]="F24",$[$.F25=145]="F25",$[$.FN_LOCK=146]="FN_LOCK",$[$.PRINT_SCREEN=147]="PRINT_SCREEN",$[$.SCROLL_LOCK=148]="SCROLL_LOCK",$[$.PAUSE=149]="PAUSE",$[$.BROWSER_BACK=150]="BROWSER_BACK",$[$.BROWSER_FAVORITES=151]="BROWSER_FAVORITES",$[$.BROWSER_FORWARD=152]="BROWSER_FORWARD",$[$.BROWSER_HOME=153]="BROWSER_HOME",$[$.BROWSER_REFRESH=154]="BROWSER_REFRESH",$[$.BROWSER_SEARCH=155]="BROWSER_SEARCH",$[$.BROWSER_STOP=156]="BROWSER_STOP",$[$.EJECT=157]="EJECT",$[$.LAUNCH_APP_1=158]="LAUNCH_APP_1",$[$.LAUNCH_APP_2=159]="LAUNCH_APP_2",$[$.LAUNCH_MAIL=160]="LAUNCH_MAIL",$[$.MEDIA_PLAY_PAUSE=161]="MEDIA_PLAY_PAUSE",$[$.MEDIA_SELECT=162]="MEDIA_SELECT",$[$.MEDIA_STOP=163]="MEDIA_STOP",$[$.MEDIA_TRACK_NEXT=164]="MEDIA_TRACK_NEXT",$[$.MEDIA_TRACK_PREVIOUS=165]="MEDIA_TRACK_PREVIOUS",$[$.POWER=166]="POWER",$[$.SLEEP=167]="SLEEP",$[$.AUDIO_VOLUME_DOWN=168]="AUDIO_VOLUME_DOWN",$[$.AUDIO_VOLUME_MUTE=169]="AUDIO_VOLUME_MUTE",$[$.AUDIO_VOLUME_UP=170]="AUDIO_VOLUME_UP",$[$.WAKE_UP=171]="WAKE_UP",$[$.COPY=172]="COPY",$[$.CUT=173]="CUT",$[$.PASTE=174]="PASTE",$))(n0||{}),X4=(($)=>($[$.NONE=0]="NONE",$[$.SHIFT=1]="SHIFT",$[$.CTRL=2]="CTRL",$[$.ALT=4]="ALT",$[$.SUPER=8]="SUPER",$[$.CAPSLOCK=16]="CAPSLOCK",$[$.NUMLOCK=32]="NUMLOCK",$))(X4||{}),wV=(($)=>($[$.NONE=0]="NONE",$[$.PARTIAL=1]="PARTIAL",$[$.FULL=2]="FULL",$))(wV||{}),CR=80,O1=(($)=>($[$.BOLD=1]="BOLD",$[$.ITALIC=2]="ITALIC",$[$.UNDERLINE=4]="UNDERLINE",$[$.STRIKETHROUGH=8]="STRIKETHROUGH",$[$.INVERSE=16]="INVERSE",$[$.INVISIBLE=32]="INVISIBLE",$[$.BLINK=64]="BLINK",$[$.FAINT=128]="FAINT",$))(O1||{});class HG{constructor($){this.exports=$.exports,this.memory=this.exports.memory}createKeyEncoder(){return new cR(this.exports)}createTerminal($=80,j=24,O){return new UD(this.exports,this.memory,$,j,O)}static async load($){if($)return HG.loadFromPath($);let j=new URL("data:application/wasm;base64,AGFzbQEAAAABdRJgBH9/f38Bf2AFf39/f38AYAZ/f39/f38Bf2ACf38AYAJ/fwF/YAF/AGABfwF/YAN/f38AYAV/f39/fwF/YAN/f38Bf2AEf39/fwBgBn9/f39/fwBgAX8BfmAAAGAAAX9gAn9/AX5gA39+fgBgBX9+fn5+AAILAQNlbnYDbG9nAAMDyQTHBAQFAwYDBgMGAwYDBgcEAwYEBQcICQkEBwMJAwkECQkJBAMFBQMDBAcFAwYGBQQHBQAEBwUJBwYGBgYGBgYGBgUHAwMEBAQGCgUFBgkEAQoEBQUABwQEAwYFBAQGBgQJAAcBBwMDAwMHAwMHAQcDAwMDAwMHCgcDAwcFBQkGAwsLCwYDBwUDAwcDAwUHBQMDAwMGBwQKCgQKCgQEBAMDBQIHCgMHBwMHCgkHBwEKCwEDAwQKAwcEAwMHDAcJCQoECgoKAwgJAQcHCgAJCgoDBwMABwgEBQQEAwAHAwUGBwcFBQYHAwMKAQEDAwMDBAQGBgMEAwYGBQMFBQMDAwAJBAUDAwUFBAQJBwUEBgUHBAkEBAUDBAMFBgYJAAYECQcDBgUNBgcHBAQDAwQFAwcLBQUFAwQFAwMHAwcEBQYEBQQEBAQEBAQEBAQEBAQEBAQEBAQEBwUEBgQGCQQFBAQEBQUFBAQEBAQFBQQEBAQEBAQEBQUEBAQFBAUEBAQEBAQEBQUEBQQEBAUEBAQEBAUEBAkEBQQEBAQEBAQEBAMFBAQEBAQFBQQFBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBwYEBwYGBgYGBgYEAwUJCggGBgkGAAgECAYJDgUGAwYDDgUOBQEGCQkICgQBBgkGBAcGCQUHBAAECQcDBwMHCgoBBwoPBAQEBgcHAwMDBgMMBgMAEAMDAwwDBwQACQICAQwHAQAMBQcEBAQJBAkJCQQECQkJAwgACQkJAQYCAgACAgEBCgkFDhEEBQFwARYWBQMBABMGCQF/AUGAgMAACwesEk4GbWVtb3J5AgAVZ2hvc3R0eV9rZXlfZXZlbnRfbmV3AAEWZ2hvc3R0eV9rZXlfZXZlbnRfZnJlZQACHGdob3N0dHlfa2V5X2V2ZW50X3NldF9hY3Rpb24AAxxnaG9zdHR5X2tleV9ldmVudF9nZXRfYWN0aW9uAAQZZ2hvc3R0eV9rZXlfZXZlbnRfc2V0X2tleQAFGWdob3N0dHlfa2V5X2V2ZW50X2dldF9rZXkABhpnaG9zdHR5X2tleV9ldmVudF9zZXRfbW9kcwAHGmdob3N0dHlfa2V5X2V2ZW50X2dldF9tb2RzAAgjZ2hvc3R0eV9rZXlfZXZlbnRfc2V0X2NvbnN1bWVkX21vZHMACSNnaG9zdHR5X2tleV9ldmVudF9nZXRfY29uc3VtZWRfbW9kcwAKH2dob3N0dHlfa2V5X2V2ZW50X3NldF9jb21wb3NpbmcACx9naG9zdHR5X2tleV9ldmVudF9nZXRfY29tcG9zaW5nAAwaZ2hvc3R0eV9rZXlfZXZlbnRfc2V0X3V0ZjgADRpnaG9zdHR5X2tleV9ldmVudF9nZXRfdXRmOAAOKWdob3N0dHlfa2V5X2V2ZW50X3NldF91bnNoaWZ0ZWRfY29kZXBvaW50AA8pZ2hvc3R0eV9rZXlfZXZlbnRfZ2V0X3Vuc2hpZnRlZF9jb2RlcG9pbnQAEBdnaG9zdHR5X2tleV9lbmNvZGVyX25ldwARGGdob3N0dHlfa2V5X2VuY29kZXJfZnJlZQASGmdob3N0dHlfa2V5X2VuY29kZXJfc2V0b3B0ABMaZ2hvc3R0eV9rZXlfZW5jb2Rlcl9lbmNvZGUAFA9naG9zdHR5X29zY19uZXcAIRBnaG9zdHR5X29zY19mcmVlACMQZ2hvc3R0eV9vc2NfbmV4dAAlEWdob3N0dHlfb3NjX3Jlc2V0AEAPZ2hvc3R0eV9vc2NfZW5kAEQYZ2hvc3R0eV9vc2NfY29tbWFuZF90eXBlAEsYZ2hvc3R0eV9vc2NfY29tbWFuZF9kYXRhAEwVZ2hvc3R0eV9wYXN0ZV9pc19zYWZlAE0VZ2hvc3R0eV9jb2xvcl9yZ2JfZ2V0AE8PZ2hvc3R0eV9zZ3JfbmV3AFAQZ2hvc3R0eV9zZ3JfZnJlZQBREWdob3N0dHlfc2dyX3Jlc2V0AFIWZ2hvc3R0eV9zZ3Jfc2V0X3BhcmFtcwBTEGdob3N0dHlfc2dyX25leHQAVhhnaG9zdHR5X3Nncl91bmtub3duX2Z1bGwAWhtnaG9zdHR5X3Nncl91bmtub3duX3BhcnRpYWwAWxlnaG9zdHR5X3Nncl9hdHRyaWJ1dGVfdGFnAFwbZ2hvc3R0eV9zZ3JfYXR0cmlidXRlX3ZhbHVlAF0UZ2hvc3R0eV90ZXJtaW5hbF9uZXcAXiBnaG9zdHR5X3Rlcm1pbmFsX25ld193aXRoX2NvbmZpZwBfFWdob3N0dHlfdGVybWluYWxfZnJlZQCNARdnaG9zdHR5X3Rlcm1pbmFsX3Jlc2l6ZQDaARZnaG9zdHR5X3Rlcm1pbmFsX3dyaXRlAL8DG2dob3N0dHlfcmVuZGVyX3N0YXRlX3VwZGF0ZQDAAx1naG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfY29scwDDAx1naG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfcm93cwDEAyFnaG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfY3Vyc29yX3gAxQMhZ2hvc3R0eV9yZW5kZXJfc3RhdGVfZ2V0X2N1cnNvcl95AMYDJ2dob3N0dHlfcmVuZGVyX3N0YXRlX2dldF9jdXJzb3JfdmlzaWJsZQDHAyFnaG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfYmdfY29sb3IAyAMhZ2hvc3R0eV9yZW5kZXJfc3RhdGVfZ2V0X2ZnX2NvbG9yAMkDIWdob3N0dHlfcmVuZGVyX3N0YXRlX2lzX3Jvd19kaXJ0eQDKAx9naG9zdHR5X3JlbmRlcl9zdGF0ZV9tYXJrX2NsZWFuAMwDIWdob3N0dHlfcmVuZGVyX3N0YXRlX2dldF92aWV3cG9ydADNAyFnaG9zdHR5X3JlbmRlcl9zdGF0ZV9nZXRfZ3JhcGhlbWUAzwMkZ2hvc3R0eV90ZXJtaW5hbF9pc19hbHRlcm5hdGVfc2NyZWVuANADI2dob3N0dHlfdGVybWluYWxfaGFzX21vdXNlX3RyYWNraW5nANEDGWdob3N0dHlfdGVybWluYWxfZ2V0X21vZGUA0gMmZ2hvc3R0eV90ZXJtaW5hbF9nZXRfc2Nyb2xsYmFja19sZW5ndGgA0wMkZ2hvc3R0eV90ZXJtaW5hbF9nZXRfc2Nyb2xsYmFja19saW5lANQDKGdob3N0dHlfdGVybWluYWxfZ2V0X3Njcm9sbGJhY2tfZ3JhcGhlbWUA1QMfZ2hvc3R0eV90ZXJtaW5hbF9pc19yb3dfd3JhcHBlZADWAyJnaG9zdHR5X3Rlcm1pbmFsX2dldF9oeXBlcmxpbmtfdXJpANcDHWdob3N0dHlfdGVybWluYWxfaGFz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rciAACECDBILQQApA5CtyIAAIQIMEQtBACkDmK3IgAAhAgwQC0EAKQPAqsiAACECDA8LQQApA8iqyIAAIQIMDgtBACkD0KrIgAAhAgwNC0EAKQPYqsiAACECDAwLQQApA+CqyIAAIQIMCwtBACkD6KrIgAAhAgwKC0EAKQPwqsiAACECDAkLQQApA/iqyIAAIQIMCAtBACkDgKvIgAAhAgwHC0EAKQOIq8iAACECDAYLQQApA6CtyIAAIQIMBQtBACkD8KzIgAAhAgwEC0EAKQOIrciAACECDAMLQQApA5CryIAAIQIMAgtBACkDqK3IgAAhAgwBC0EAKQPorMiAACECCyAAIAI3AgALGAAgACACQf///wBxQQpBACABEOiDgIAAC0MBAX8CQCAAQdyUyYAAQQEQmoCAgAAiAkH//wNxDQAgAEGctcqAACABLwEAIAFBAmotAABBEHRyEJyAgIAAIQILIAILFgAgACACQf8DcUEKQQAgARDog4CAAAsVACAAIAJBA3FBCkEAIAEQ6IOAgAALPAEBfyOAgICAAEEQayIDJICAgIAAIAMgAjoADyAAIANBD2pBASABEKOEgIAAIQIgA0EQaiSAgICAACACC8kBAgF/AX4jgICAgABB8BBrIgIkgICAgAACQAJAIAANAEGw6cmAACEADAELIAJByNTHgAA2AuwQIAIgADYC6BAgAkHoEGohAAsCQAJAIAApAgAiA6dB0BBBAkEAIANCIIinKAIAEYCAgIAAgICAgAAiAA0AQX8hAAwBCyACQQE6ABAgAiADNwMIIAJBGGogAkEIahCigICAAAJAQdAQRQ0AIAAgAkEYakHQEPwKAAALIAEgADYCAEEAIQALIAJB8BBqJICAgIAAIAALmQEBAX8jgICAgABBwABrIgIkgICAgAAgAkEIakEIaiABQQhqKAIANgIAIAJBADoABCACIAEpAgA3AwgCQEEsRQ0AIAJBFGpBAEEs/AsACyACQQA6AAMCQEE4RQ0AIAAgAkEIakE4/AoAAAsgAEEANgJAIABCADcCOCAAIAItAAQ6AEwgACACLQADOgDNECACQcAAaiSAgICAAAs9AQJ/AkAgAEUNACAAKAIAIQEgACgCBCECIAAQpICAgAAgASAAQdAQQQJBACACKAIMEYGAgIAAgICAgAALC+IBAQR/I4CAgIAAQRBrIgEkgICAgAACQCAALQBMQT9xRQ0AAkACQAJAIAAoAgxBdmoOAgEAAgsgASAAKQIANwMIIAFBCGogACgCECAAKAIYEMGAgIAADAELIABBEGogABDCgICAAAsgAEEAOgDNECAAQQA6AEwCQEE0RQ0AIABBDGpBAEE0/AsACyAAKAJAIgJFDQAgASAAKQIANwMAIAAoAgAhAyAAKAIEIQQgAiABEMOAgIAAIAMgAkEMQQJBACAEKAIMEYGAgIAAgICAgAAgAEEANgJACyABQRBqJICAgIAACwwAIAAgARCmgICAAAuvTAIFfwF+I4CAgIAAQeAQayICJICAgIAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAI8IgNB/w9JDQAgAC0ATEE/cSIDQQFHDQEMogELIAAgA0EBaiIENgI8IABBzQBqIgUgA2oiBiABOgAAIAAtAExBP3EOOQIBogEbAwQsLS4FMzQ1Njc4OQY9QUIIRglMTU5VD29wcXIQR0iiAQoLogFTVBF2B0AMXRFeXw1gDmdoaQILIAIgAzoACiACQoAQNwLAECACQcC/x4AANgK4ECACIAJBIGo2ArwQIAJBuBBqIAJBCmoQp4CAgAAiA0H//wNxRQ2eASACQbgQakGw6cmAAEE/EKiAgIAAIAIvAdAQDaABIAJBoBBqQRBqIAJBuBBqQRBqKQIANwMAIAJBoBBqQQhqIgEgAkG4EGpBCGopAgA3AwAgAiACKQK4EDcDoBACQCABIAJBCmoQp4CAgABB//8DcUUNACACQaAQ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ECEEIAIoAtQQIQEMAQsgAigCvBAhASACKALEECEECyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDBQLIAJCgBA3AsAQIAJBwL/HgAA2ArgQIAIgAkEgajYCvBACQAJAAkAgAkG4EGoQuICAgAAiA0H//wNxRQ0AIAJBuBBqQbDpyYAAQcEAEKiAgIAAIAIvAdAQDQIgAkGgEGpBEGogAkG4EGpBEGopAgA3AwAgAkGgEGpBCGoiASACQbgQakEIaikCADcDACACIAIpArgQNwOgEAJAIAEQuICAgABB//8DcUUNACACQaAQahCpgICAAAwDCyACQdQQaiACQaAQahCqgICAACACQaAQahCpgICAACACLwHcEA0CIAIoAtgQIQQgAigC1BAhAQwBCyACKAK8ECEBIAIoAsQQIQQLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMEwsgAkKAEDcCwBAgAkHAv8eAADYCuBAgAiACQSBqNgK8EAJAAkACQCACQbgQahC5gICAACIDQf//A3FFDQAgAkG4EGpBsOnJgABBwQAQqICAgAAgAi8B0BANAiACQaAQakEQaiACQbgQakEQaikCADcDACACQaAQakEIaiIBIAJBuBBqQQhqKQIANwMAIAIgAikCuBA3A6AQAkAgARC5gICAAEH//wNxRQ0AIAJBoBBqEKmAgIAADAMLIAJB1BBqIAJBoBBqEKqAgIAAIAJBoBBqEKmAgIAAIAIvAdwQDQIgAigC2BAhBCACKALUECEBDAELIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwSCyACQoAQNwLAECACQcC/x4AANgK4ECACIAJBIGo2ArwQAkACQAJAIAJBuBBqELqAgIAAIgNB//8DcUUNACACQbgQakGw6cmAAEHBABCogICAACACLwHQEA0CIAJBoBBqQRBqIAJBuBBqQRBqKQIANwMAIAJBoBBqQQhqIgEgAkG4EGpBCGopAgA3AwAgAiACKQK4EDcDoBACQCABELqAgIAAQf//A3FFDQAgAkGgEGoQqYCAgAAMAwsgAkHUEGogAkGgEGoQqoCAgAAgAkGgEGoQqYCAgAAgAi8B3BANAiACKALYECEEIAIoAtQQIQEMAQsgAigCvBAhASACKALEECEECyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDBELIAJCgBA3AsAQIAJBwL/HgAA2ArgQIAIgAkEgajYCvBACQAJAAkAgAkG4EGoQu4CAgAAiA0H//wNxRQ0AIAJBuBBqQbDpyYAAQcEAEKiAgIAAIAIvAdAQDQIgAkGgEGpBEGogAkG4EGpBEGopAgA3AwAgAkGgEGpBCGoiASACQbgQakEIaikCADcDACACIAIpArgQNwOgEAJAIAEQu4CAgABB//8DcUUNACACQaAQahCpgICAAAwDCyACQdQQaiACQaAQahCqgICAACACQaAQahCpgICAACACLwHcEA0CIAIoAtgQIQQgAigC1BAhAQwBCyACKAK8ECEBIAIoAsQQIQQLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMEAsgAkKAEDcCwBAgAkHAv8eAADYCuBAgAiACQSBqNgK8EAJAAkACQCACQbgQahC8gICAACIDQf//A3FFDQAgAkG4EGpBsOnJgABBwQAQqICAgAAgAi8B0BANAiACQaAQakEQaiACQbgQakEQaikCADcDACACQaAQakEIaiIBIAJBuBBqQQhqKQIANwMAIAIgAikCuBA3A6AQAkAgARC8gICAAEH//wNxRQ0AIAJBoBBqEKmAgIAADAMLIAJB1BBqIAJBoBBqEKqAgIAAIAJBoBBqEKmAgIAAIAIvAdwQDQIgAigC2BAhBCACKALUECEBDAELIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwPCyAAQRw6AEwMDgsgAkKAEDcCwBAgAkHAv8eAADYCuBAgAiACQSBqNgK8EAJAAkACQCACQbgQahC9gICAACIDQf//A3FFDQAgAkG4EGpBsOnJgABBwQAQqICAgAAgAi8B0BANAiACQaAQakEQaiACQbgQakEQaikCADcDACACQaAQakEIaiIBIAJBuBBqQQhqKQIANwMAIAIgAikCuBA3A6AQAkAgARC9gICAAEH//wNxRQ0AIAJBoBBqEKmAgIAADAMLIAJB1BBqIAJBoBBqEKqAgIAAIAJBoBBqEKmAgIAAIAIvAdwQDQIgAigC2BAhBCACKALUECEBDAELIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwNCyACQoAQNwLAECACQcC/x4AANgK4ECACIAJBIGo2ArwQAkACQAJAIAJBuBBqEL6AgIAAIgNB//8DcUUNACACQbgQakGw6cmAAEHBABCogICAACACLwHQEA0CIAJBoBBqQRBqIAJBuBBqQRBqKQIANwMAIAJBoBBqQQhqIgEgAkG4EGpBCGopAgA3AwAgAiACKQK4EDcDoBACQCABEL6AgIAAQf//A3FFDQAgAkGgEGoQqYCAgAAMAwsgAkHUEGogAkGgEGoQqoCAgAAgAkGgEGoQqYCAgAAgAi8B3BANAiACKALYECEEIAIoAtQQIQEMAQsgAigCvBAhASACKALEECEECyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDAwLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMCgsgAEEBOgBMDAkLIAJCgBA3AsAQIAJBwL/HgAA2ArgQIAIgAkEgajYCvBACQAJAAkAgAkG4EGoQv4CAgAAiA0H//wNxRQ0AIAJBuBBqQbDpyYAAQcIAEKiAgIAAIAIvAdAQDQIgAkGgEGpBEGogAkG4EGpBEGopAgA3AwAgAkGgEGpBCGoiASACQbgQakEIaikCADcDACACIAIpArgQNwOgEAJAIAEQv4CAgABB//8DcUUNACACQaAQahCpgICAAAwDCyACQdQQaiACQaAQahCqgICAACACQaAQahCpgICAACACLwHcEA0CIAIoAtgQIQQgAigC1BAhAQwBCyACKAK8ECEBIAIoAsQQIQQLIAEgBBCAgICAACADQf//A3FFDQBBsOnJgAAgASAEELaAgIAACyAAQQE6AEwMCAsgAEEBOgDNECAAQQE2AgwgAEEqOgBMIAAgBDYCOCAAIABBEGo2AkQMBwsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBAToATAwFCyABIAQQgICAgAAgA0H//wNxRQ0AQbDpyYAAIAEgBBC2gICAAAsgAEEBOgBMDAMLIAIoArwQIQEgAigCxBAhBAsgASAEEICAgIAAIANB//8DcUUNAEGw6cmAACABIAQQtoCAgAALIABBADoAzRAgAEEBOgBMCyACQeAQaiSAgICAAAuqCQEDfyOAgICAAEEQayICJICAgIAAAkAgAEGRmsqAAEEnEJqAgIAAIgNB//8DcQ0AIABBgBBBCkEAQZy1yoAAEOiDgIAAIgNB//8DcQ0AIABBuJrKgABBExCagICAACIDQf//A3ENACABLQAAIQQgAkEBNgIEIAJB7urAgAA2AgBBBSEBQamSwIAAIQMCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBEE/cQ45OAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3OAtBByEBQY+wwIAAIQMMNwtBByEBQbaWwIAAIQMMNgtB3urAgAAhA0EBIQEMNQtBz+rAgAAhA0EBIQEMNAtBAiEBQd3qwIAAIQMMMwtBAyEBQY3qwIAAIQMMMgtBAiEBQc7qwIAAIQMMMQtBAiEBQbbqwIAAIQMMMAtBAiEBQaHqwIAAIQMMLwtBAyEBQZHqwIAAIQMMLgtBAiEBQYbqwIAAIQMMLQtBAiEBQenpwIAAIQMMLAtBAiEBQaO8wIAAIQMMKwtBAiEBQZS8wIAAIQMMKgtBAiEBQYG8wIAAIQMMKQtBAiEBQea7wIAAIQMMKAtBt+rAgAAhA0EBIQEMJwtBAiEBQb/qwIAAIQMMJgtBAiEBQafqwIAAIQMMJQtBj+rAgAAhA0EBIQEMJAtB8unAgAAhA0EBIQEMIwtBAiEBQaTqwIAAIQMMIgtBlbzAgAAhA0EBIQEMIQtBAiEBQYW8wIAAIQMMIAtBAyEBQYS8wIAAIQMMHwtBgrzAgAAhA0EBIQEMHgtB57vAgAAhA0EBIQEMHQtBDyEBQc+awIAAIQMMHAtBFSEBQYaawIAAIQMMGwtBEyEBQf6TwIAAIQMMGgtBFSEBQcWrwIAAIQMMGQtBGCEBQayawIAAIQMMGAtBEiEBQZOuwIAAIQMMFwtBDiEBQbOvwIAAIQMMFgtBEiEBQduvwIAAIQMMFQtBCSEBQZuewIAAIQMMFAtBEyEBQZKUwIAAIQMMEwtBFSEBQdurwIAAIQMMEgtBDSEBQYqowIAAIQMMEQtBDiEBQeyjwIAAIQMMEAtBEiEBQbitwIAAIQMMDwtBBiEBQYSpwIAAIQMMDgtBECEBQfqowIAAIQMMDQtBGCEBQaaUwIAAIQMMDAtBGiEBQfGrwIAAIQMMCwtB1LvAgAAhAwwKC0EMIQFB9KDAgAAhAwwJC0ESIQFBsqvAgAAhAwwIC0ESIQFBvpXAgAAhAwwHC0EKIQFBu7HAgAAhAwwGC0EOIQFB3ZjAgAAhAwwFC0EYIQFBsqzAgAAhAwwEC0EVIQFBy6zAgAAhAwwDC0EYIQFBg6vAgAAhAwwCC0EVIQFBnKvAgAAhAwwBC0EPIQFBgKLAgAAhAwsgAiADNgIIIAIgATYCDCAAIAIQqYSAgAAhAwsgAkEQaiSAgICAACADC4MBAgF/AX4jgICAgABBIGsiAySAgICAACAAQQA7ARggACABKQIAIgQ3AgAgAyAENwMIIANBFGogA0EIaiACEIiBgIAAAkACQCADLwEcIgFFDQAgACABOwEYDAELIAAgAykCFDcCDCAAQQA2AhQgAEGQ6smAADYCCAsgA0EgaiSAgICAAAsUACAAIAAoAgwgACgCEBC2gICAAAuuAgEHfyOAgICAAEEgayICJICAgIAAIAEoAhQhA0EAIQQgAUEANgIUIAEoAhAhBSABKAIMIQYgAUKq1arVCjcCDCACIAEpAgA3AwggAiACQQhqIAYgBSADEKKEgIAAAkACQAJAIAIoAgAiB0UNACACKAIEIQhBqtWq1XohBgwBCyACQRRqIAJBCGogAxCIgYCAAAJAIAIvARwiBEUNAAwCCyACKAIUIQcCQCACKAIYIghFDQAgByAGIAj8CgAACwJAIAUNAEEAIQQMAQtBACEEIAEoAgAgBiAFQQBBACABKAIEKAIMEYGAgIAAgICAgAALQQAhBUEAIQMLIAEgAzYCFCABIAU2AhAgASAGNgIMIAAgBDsBCCAAIAg2AgQgACAHNgIAIAJBIGokgICAgAALEwAgAEHLmsqAAEHBABCagICAAAsTACAAQZGdyoAAQcEAEJqAgIAAC28DAX8BfgF/QSohAQJAIAAtAAhFDQAgACkCACICp0EMQQJBACACQiCIpygCABGAgICAAICAgIAAIgNFDQAgA0EIakEAKALopsiAADYCACADQQApA+CmyIAANwIAIAAgAzYCQEErIQELIAAgAToATAtQAQF/AkAgAEGPnMqAAEEUEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS0AABCggICAACICQf//A3ENACAAQaOcyoAAQS0QmoCAgAAhAgsgAguyEAEIfyOAgICAAEGgEWsiAySAgICAAAJAAkACQCAAKAJIIgQNACADQoAQNwKAESADQcC/x4AANgL4ECADIANB4ABqNgL8EAJAIANB+BBqEO6DgIAAIgVB//8DcQ0AIAMoAvwQIQQgAygChBEhBgwCCyADQfgQakGw6cmAAEE1EKiAgIAAIAMvAZARDQIgA0HgEGpBEGogA0H4EGpBEGopAgA3AwAgA0HgEGpBCGoiBCADQfgQakEIaikCADcDACADIAMpAvgQNwPgEAJAIAQQ7oOAgABB//8DcUUNACADQeAQahCpgICAAAwDCyADQZQRaiADQeAQahCqgICAACADQeAQahCpgICAACADLwGcEQ0CIAMoApgRIQYgAygClBEhBAwBCyAAKAJEIQcCQAJAAkACQAJAIARBYmpBaEkNACAEQQJ0QaiTyYAAaigCACIGQQcgBkEHSxtBAWohCCAGQQN0QeCSyYAAaiEFA0AgBUEEaigCACAERw0BIAUoAgAgBCAHENmCgIAAQQFxDQIgBUEIaiEFIAggBkEBaiIGRw0ACwsgA0EAOgAPAkAgBy0AAEHfAEYNACAHIARqQX9qLQAAQd8ARg0AIAQhBSAHIQZBACEIAkADQCAFRQ0BAkAgBi0AACIJQd8ARg0AIANB4ABqIAlBChCzgICAACADLwFgDQMgAy0AYiEJAkACQCAIQf8BcSIIDQBBACEIDAELIAMgCEEKbCIIQQh2IgpBAEc6APgQIAoNBAsgAyAIQf8BcSAJQf8BcWoiCEH/AXEiCSAIRzoA+BAgCSAIRw0DCyAFQX9qIQUgBkEBaiEGDAALCyADIAg6AA4MBAsgAyAENgIUIAMgBzYCECADQoAQNwKAESADQcC/x4AANgL4ECADIANB4ABqNgL8ECADQfgQaiADQRBqEO+DgIAAIgVB//8DcUUNASADQfgQakGw6cmAAEE2EKiAgIAAIAMvAZARDQUgA0HgEGpBEGogA0H4EGpBEGopAgA3AwAgA0HgEGpBCGoiBCADQfgQakEIaikCADcDACADIAMpAvgQNwPgEAJAIAQgA0EQahDvg4CAAEH//wNxRQ0AIANB4BBqEKmAgIAADAYLIANBlBFqIANB4BBqEKqAgIAAIANB4BBqEKmAgIAAIAMvAZwRDQUgAygCmBEhBiADKAKUESEEDAILIANBAToADyADIAZBoJPJgABqLQAAQQdxOgAODAILIAMoAvwQIQQgAygChBEhBgsgBCAGEICAgIAAIAVB//8DcUUNAkGw6cmAACAEIAYQtoCAgAAMAgsCQAJAIAAoAjgiBSAAKAI8IgRHDQBBACEFQYv2wYAAIQQMAQsgAyAAIAVqQc0AaiAEQQAgBWsgBUF/cyACQQFxG2oQ8IOAgAAgAygCBCEFIAMoAgAhBAsgACgCDEELRw0BAkACQCAAKAIUQY4ESQ0AIABBAToATCADQoAQNwKAESADQcC/x4AANgL4ECADIANB4ABqNgL8EAJAIANB+BBqEPGDgIAAIgVB//8DcQ0AIAMoAvwQIQQgAygChBEhBgwCCyADQfgQakGw6cmAAEHRABCogICAACADLwGQEQ0DIANB4BBqQRBqIANB+BBqQRBqKQIANwMAIANB4BBqQQhqIgQgA0H4EGpBCGopAgA3AwAgAyADKQL4EDcD4BACQCAEEPGDgIAAQf//A3FFDQAgA0HgEGoQqYCAgAAMBAsgA0GUEWogA0HgEGoQqoCAgAAgA0HgEGoQqYCAgAAgAy8BnBENAyADKAKYESEGIAMoApQRIQQMAQsgAEEQaiEGIAMgACkCADcDGAJAAkAgAUEBcUUNACAFDQELIANBAjoAKCADIAMtAA46ACEgAyADLQAPOgAgIAYgA0EYaiADQSBqEPKDgIAAIgVB//8DcUUNAyADIAU7AS4gA0EuahDzg4CAAAwDCwJAAkBB0rvAgABBASAEIAUQsYCAgABBAXENACADQcAAaiAEIAUQ9IOAgAAgAy8BRA0BIAMgAy0AQjoAUiADIAMvAUA7AVAgA0EBOgBYIAMgAy0ADjoAVSADIAMtAA86AFQgBiADQRhqIANB0ABqEPKDgIAAIgVB//8DcUUNBCADIAU7AV4gA0HeAGoQ84OAgAAMBAsgA0EAOgA4IAMgAy0ADjoAMSADIAMtAA86ADAgBiADQRhqIANBMGoQ8oOAgAAiBUH//wNxRQ0DIAMgBTsBPiADQT5qEPODgIAADAMLIAMgBTYCTCADIAQ2AkggA0KAEDcCgBEgA0HAv8eAADYC+BAgAyADQeAAajYC/BACQAJAIANB+BBqIANByABqEPWDgIAAIgVB//8DcUUNACADQfgQakGw6cmAAEE/EKiAgIAAIAMvAZARDQQgA0HgEGpBEGogA0H4EGpBEGopAgA3AwAgA0HgEGpBCGoiBCADQfgQakEIaikCADcDACADIAMpAvgQNwPgEAJAIAQgA0HIAGoQ9YOAgABB//8DcUUNACADQeAQahCpgICAAAwFCyADQZQRaiADQeAQahCqgICAACADQeAQahCpgICAACADLwGcEQ0EIAMoApgRIQYgAygClBEhBAwBCyADKAL8ECEEIAMoAoQRIQYLIAQgBhCAgICAACAFQf//A3FFDQJBsOnJgAAgBCAGELaAgIAADAILIAQgBhCAgICAACAFQf//A3FFDQFBsOnJgAAgBCAGELaAgIAADAELIAQgBhCAgICAACAFQf//A3FFDQBBsOnJgAAgBCAGELaAgIAACyADQaARaiSAgICAAAuRAQECfwJAAkAgACgCOCAAKAI8IgFHDQBBACEBQYv2wYAAIQIMAQsgASAAQc0AaiICakF/akEAOgAAIAIgACgCOCIBaiECIAAoAjwgAUF/c2ohAQsCQCAAKAJEIAAoAkhBmLDAgABBAhCxgICAAEEBcUUNACAAKAIMQQ1HDQAgAUUNACAAIAE2AhQgACACNgIQCwv9AgEFfyOAgICAAEEQayIEJICAgIAAAkACQCABIANHDQBBASEFIAFFDQEgAEGq1arVeiABGyIGIAJBqtWq1XogAxsiB0YNAQJAIAFBEEsNAAJAIAFBBE8NACAALQAAIActAABGIAAgAUF/aiIDai0AACAHIANqLQAARnEgACABQQF2IgNqLQAAIAcgA2otAABGcSEFDAMLQQAhAyAEQQA2AgAgBCABQXxqIgU2AgQgBCABQQF2QQxxIgA2AgggBCAFIABrNgIMQQAhBQJAA0AgA0EQRg0BIAcgBCADaigCACIAaigAACAGIABqKAAAcyAFciEFIANBBGohAwwACwsgBUUhBQwC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IANBwAD8CgAACyABIAA2AgACQEHEAEUNACABQQRqIAJBGGpBxAD8CgAAC0EBIQMLIAJBoAFqJICAgIAAIAMLyRMBCn8CQCABKAIEIgIgASgCDCIDSw0AIAEgA0EBajYCDCAAQbzAx4AAQaTAx4AAIAMbIgEpAgA3AgAgAEEIaiABQQhqKQIANwIAIABBEGogAUEQaikCADcCAA8LIAEgA0EBaiIENgIMIAIgA2shBSABKAIAIgYgA0EBdGoiBy8BACEIAkAgAS8BCCABQQpqLQAAQRB0ciIJQQEgA3RxIgpB////B3FFDQACQCAIQVpqIgtBFEsNAEEBIAt0QYGIwABxDQELIAhBBEYNACAJQf///wdxIQlBASEIA0AgAyAIaiEKIAhBAWohCCAJIAp2QQFxDQALIABBAToAFCAAIAc2AgwgACACNgIIIAAgBjYCBCAAQQE2AgAgASADIAhqNgIMIAAgCCAFIAggBUkbNgIQDwsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgCA48AAECAxcEBQYHCBYWFhYWFhYWFhYWCQoLDA0WDg8QFhYWFhYWFhYYERYWFhYWFhYWGRIWFhYTFhQWFhoVFgsgAEEQakEAKQK0wMeAADcCACAAQQhqQQApAqzAx4AANwIAIABBACkCpMDHgAA3AgAPCyAAQRBqQQApAuTAx4AANwIAIABBCGpBACkC3MDHgAA3AgAgAEEAKQLUwMeAADcCAA8LIABBEGpBACkC/MDHgAA3AgAgAEEIakEAKQL0wMeAADcCACAAQQApAuzAx4AANwIADwsgAEEQakEAKQKUwceAADcCACAAQQhqQQApAozBx4AANwIAIABBACkChMHHgAA3AgAPCyAAQRBqQQApAqzBx4AANwIAIABBCGpBACkCpMHHgAA3AgAgAEEAKQKcwceAADcCAA8LIABBEGpBACkCrMHHgAA3AgAgAEEIakEAKQKkwceAADcCACAAQQApApzBx4AANwIADwsgAEEQakEAKQLEwceAADcCACAAQQhqQQApArzBx4AANwIAIABBACkCtMHHgAA3AgAPCyAAQRBqQQApAtzBx4AANwIAIABBCGpBACkC1MHHgAA3AgAgAEEAKQLMwceAADcCAA8LIABBEGpBACkC9MHHgAA3AgAgAEEIakEAKQLswceAADcCACAAQQApAuTBx4AANwIADwsgAEECOgAEIABBBzYCACAAQQE6ABQPCyAAQRBqQQApAozCx4AANwIAIABBCGpBACkChMLHgAA3AgAgAEEAKQL8wceAADcCAA8LIABBEGpBACkCpMLHgAA3AgAgAEEIakEAKQKcwseAADcCACAAQQApApTCx4AANwIADwsgAEEAOgAEIABBBzYCACAAQQE6ABQPCyAAQRBqQQApArzCx4AANwIAIABBCGpBACkCtMLHgAA3AgAgAEEAKQKswseAADcCAA8LIABBEGpBACkC1MLHgAA3AgAgAEEIakEAKQLMwseAADcCACAAQQApAsTCx4AANwIADwsgAEEQakEAKQLswseAADcCACAAQQhqQQApAuTCx4AANwIAIABBACkC3MLHgAA3AgAPCyAAQRBqQQApAoTDx4AANwIAIABBCGpBACkC/MLHgAA3AgAgAEEAKQL0wseAADcCAA8LIABBEGpBACkCnMPHgAA3AgAgAEEIakEAKQKUw8eAADcCACAAQQApAozDx4AANwIADwsgAEEQakEAKQK0w8eAADcCACAAQQhqQQApAqzDx4AANwIAIABBACkCpMPHgAA3AgAPCyAAQRBqQQApAszDx4AANwIAIABBCGpBACkCxMPHgAA3AgAgAEEAKQK8w8eAADcCAA8LIABBEGpBACkC5MPHgAA3AgAgAEEIakEAKQLcw8eAADcCACAAQQApAtTDx4AANwIADwsgAEEQakEAKQL8w8eAADcCACAAQQhqQQApAvTDx4AANwIAIABBACkC7MPHgAA3AgAPCyAIQWJqQf//A3FBCEkNByAIQfj/A3FBKEYNBiAIQaZ/akH//wNxQQhJDQUgCEGcf2pB//8DcUEITw0JIABBGzYCACAAQQE6ABQgACAHLQAAQaR/ajoABA8LIApB////B3FFDQNBASEIIAlB////B3EgBHZBAXENByAAQQE6ABQgAEEHNgIAIAEgA0ECajYCDAJAIAcvAQIiAUEFSw0AIAEhCAsgACAIQQdxOgAEDwsgBUEBTQ0HAkACQCAHLwECQX5qDgQACQkBCQtBBSEIIAVBBUkNCEEEIQICQAJAIApB////B3ENAEEGIQpBCCEJDAELQQYhCkEIIQkC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AiEFCyAEQRBqJICAgIAAIAULrg8CCn8BfiOAgICAAEGwBGsiAySAgICAACACKAIAIQQgAi8BCiEFIAIvAQghBiADQQA2AqAEIANCADcDmAQgAyABKQIANwOQBEEEIQcCQAJAAkACQAJAA0AgB0UNASADQagEaiADQZAEahDngICAACADLwGsBCIIDQIgAygCqAQiCCADKAKgBDYCACADIAg2AqAEIAdBf2ohBwwACwsgA0HgA2pBCGogA0GQBGpBCGopAwA3AwAgA0HgA2pBEGogA0GQBGpBEGooAgA2AgAgAyADKQOQBDcD4AMgA0IANwOYBCADQQA2AqAEIANBACkDsOnJgAA3A5AEQQQhBwJAA0AgB0UNASADQagEaiADQZAEahDqgICAAAJAIAMvAawEIggNACADKAKoBCIIIAMoAqAENgIAIAMgCDYCoAQgB0F/aiEHDAELCyADQZAEahD7gICAACADQeADahD7gICAAAwCC0EIIQcgA0H4A2pBCGogA0GQBGpBCGopAwA3AwAgA0H4A2pBEGogA0GQBGpBEGooAgA2AgAgAyADKQOQBDcD+AMgA0EANgKgBCADQgA3A5gEIAMgASkCADcDkAQCQANAIAdFDQEgA0GoBGogA0GQBGoQ+ICAgAACQCADLwGsBCIIDQAgAygCqAQiCCADKAKgBDYCACADIAg2AqAEIAdBf2ohBwwBCwsgA0GQBGoQ+4CAgAAgA0H4A2oQ+4CAgAAgA0HgA2oQ+4CAgAAMAgsgA0HYAmpBCGoiCCADQZAEakEIaikDADcDACADQdgCakEQaiIHIANBkARqQRBqKAIANgIAIANBiANqQQhqIgkgA0HgA2pBCGopAwA3AwAgA0GIA2pBEGoiCiADQeADakEQaigCADYCACADQfACakEIaiILIANB+ANqQQhqKQMANwMAIANB8AJqQRBqIgwgA0H4A2pBEGooAgA2AgAgAyADKQOQBDcD2AIgAyADKQPgAzcDiAMgAyADKQP4AzcD8AIgAyABKQIANwOQAiADQagCaiAKKAIANgIAIANBkAJqQRBqIAkpAwA3AwAgAyADKQOIAzcDmAIgA0G8AmogDCgCADYCACADQbQCaiALKQMANwIAIAMgAykD8AI3AqwCIANB0AJqIAcoAgA2AgAgA0HIAmogCCkDADcDACADIAMpA9gCNwPAAiADQgA3A6ADIANBqANqIANBkAJqIANBoANqIAYgBRDsgICAAAJAIAMvAbQDIghFDQAgA0GQAmoQ+oCAgAAMAgsgAygCsAMhCiADKAKsAyELIAMoAqgDIQkgA0G4A2ogBiAFEPaAgIAAAkAgAy8BvAMiCEUNACADQZACahD6gICAAAwCCyADKAK4AyEMIANBwANqIANBwAJqEPeAgIAAAkAgAy8BxAMiCEUNACADQZACahD6gICAAAwCCyADKALAAyIHQQA6AAggB0EANgEEIAcgCTYCACADQdADakIANwMAIANCADcDyAMgA0HIA2ogA0GQAmogBxD8gICAACIIQf//A3FFDQIgA0HIA2ogA0GQAmoQg4GAgAAgA0GQAmoQ+oCAgAAMAQsgA0GQBGoQ+4CAgAALIAAgCDsB8AIMAQsgA0EBOgDcAyADQQA6ANsDIAMpA6ADIQ0CQEHEAEUNACADQRBqIANBkAJqQcQA/AoAAAsgA0GQAWpBCGoiCCADQcgDakEIaikDADcDACADIAMpA8gDNwOQASADIAU2AmggAyAMNgJkIAMgBDYCYCADIAo2AlwgAyALNgJYIAMgCTYCVCADQgA3AwggAyANNwMAIAMtANwDIQQgAy0A2wMhCiADQfQAaiAIKQMANwIAIAMgAykDkAE3AmwgAyAKOgCNASADIAQ6AIwBIAMgBTsBigEgAyAGOwGIASADQgA3A4ABIAMgBzYCfCADQQA6AKgBIANBADYCpAEgAyAJNgKgASADQawBaiADIANBoAFqEISBgIAAAkAgAy8BsAEiCEUNACADEIWBgIAAIAAgCDsB8AIMAQsgA0EAOgCHAiADQQA6AIYCIAMgAigCAEU6ALgBIAMoAqwBIggoAgAiBygCGCAHKAIQIgdqIAgvAQRBA3RqIgIoAgAhBSAILwEGIQYgASkCACENIANBAToAiAICQEHIAEUNACADQb0BakEBakEAQcgA/AsACyAAQQA7AfACIANBADoAtgEgA0EAOgC3AQJAQZABRQ0AIAAgA0GQAfwKAAALIAAgDTcDkAECQEEkRSIBDQAgAEGYAWpBAEEk/AsACyAAQgA3A8gBIAAgBSAHaiAGQQN0ajYCxAEgACACNgLAASAAIAg2ArwBIAAgAy0AiAI6ANABIAAgAy0AhwI6ANEBIAAgAy0AhgI6ANIBAkBByQBFDQAgAEHTAWogA0G9AWpByQD8CgAACwJAIAENACAAQZwCakEAQST8CwALIABCADcB4gIgAEHqAmpBADoAACAAQdgCakEAKQOop8iAADcDACAAQdACakEAKQOgp8iAADcDACAAQcgCakEAKQOYp8iAADcDACAAQQApA5CnyIAANwPAAiAAIAMtALgBOgDgAiAAIAMtALcBOgDhAiAAIAMtALYBOgDrAgsgA0GwBGokgICAgAALzgEBAn8jgICAgABBEGsiBSSAgICAACAFIANBH3E6AA8CQAJAQSAgAkEEaiICQQEgA3QiAyACIANLGyIDQX9qZ2siAkH//wNxQX1qIgZBDU8NACABQgEgAqyGp2pBfGogBkECdEGYvMqAAGoiAygCADYCACADIAE2AgAMAQsgAUIBQSAgA0GDgARqQRB2QX9qZ2siA61C//8Dg4anQRB0akF8aiADQf//A3FBAnRBgL3KgABqIgMoAgA2AgAgAyABNgIACyAFQRBqJICAgIAAC9wBAQF/I4CAgIAAQfAAayIDJICAgIAAAkBBzABFDQAgA0EMakHI9sGAAEHMAPwKAAALIAMgAjYCDCADIAEpAgA3A1gCQAJAAkAgAkGBBEkNACADQeQAaiADQdgAaiACQYB8ahCIgYCAACADLwFsIgINASADKAJkIQICQCADKAJoIgFFDQAgAkEAIAH8CwALIAMgATYCFCADIAI2AhALIANBDGpBCBCJgYCAACAAQQA7AUxBzABFDQEgACADQQxqQcwA/AoAAAwBCyAAIAI7AUwLIANB8ABqJICAgIAAC6ABAQN/I4CAgIAAQRBrIgIkgICAgAAgASgCBCEDIAEoAgAhBCACIAAtAAxBA3EiAToADyAAQQRqIQACQANAIAFBA3FFDQEgAiABQX9qIAFxQQNxOgAMIAAgAWhBA3FBAnRqIgEoAgAQi4GAgAAgBCABKAIAQfACQQNBACADKAIMEYGAgIAAgICAgAAgAi0ADCEBDAALCyACQRBqJICAgIAACyMAIAAoAgAgAUH4LEEDQQAgACgCBCgCDBGBgICAAICAgIAAC3cBAn8jgICAgABBEGsiAiSAgICAAAJAAkACQCABKAIQIgNFDQAgASADKAIANgIQDAELIAJBCGogARDngICAAAJAIAIvAQwiAUUNACAAIAE7AQQMAgsgAigCCCEDCyAAIAM2AgAgAEEAOwEECyACQRBqJICAgIAAC2IBAX8jgICAgABBIGsiAiSAgICAACACQeymyIAANgIQIAIgATYCDCACQRRqIAJBDGpBuAIQ6ICAgAACQCACLwEcIgENACAAIAIoAhQ2AgALIAAgATsBBCACQSBqJICAgIAAC8UBAgF/AX4jgICAgABBIGsiAySAgICAAEKAgICAECEEAkACQEEADQACQAJAIAINAEL4////DyEEDAELIAEpAgAiBKcgAkEDQQAgBEIgiKcoAgARgICAgACAgICAACIBRa1CIIYgAa2EIQQgAUUNAQsgAyACNgIUIAMgBD4CECADQQA7ARggA0EQaiECDAELIAMgBEIgiD0BDCADQQRqIQILIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgAgA0EgaiSAgICAAAt3AQJ/I4CAgIAAQRBrIgIkgICAgAACQAJAAkAgASgCECIDRQ0AIAEgAygCADYCEAwBCyACQQhqIAEQ6oCAgAACQCACLwEMIgFFDQAgACABOwEEDAILIAIoAgghAwsgACADNgIAIABBADsBBAsgAkEQaiSAgICAAAtjAQF/I4CAgIAAQSBrIgIkgICAgAAgAkHspsiAADYCECACIAE2AgwgAkEUaiACQQxqQYCAJBDrgICAAAJAIAIvARwiAQ0AIAAgAigCFDYCAAsgACABOwEEIAJBIGokgICAgAALxQECAX8BfiOAgICAAEEgayIDJICAgIAAQoCAgIAQIQQCQAJAQQANAAJAAkAgAg0AQoCA/P8PIQQMAQsgASkCACIEpyACQRBBACAEQiCIpygCABGAgICAAICAgIAAIgFFrUIghiABrYQhBCABRQ0BCyADIAI2AhQgAyAEPgIQIANBADsBGCADQRBqIQIMAQsgAyAEQiCIPQEMIANBBGohAgsgACACKQIANwIAIABBCGogAkEIaigCADYCACADQSBqJICAgIAAC+oNASp/I4CAgIAAQcAEayIFJICAgIAAIAVBAToABiAFIAM7AQQgBUEIakHAksmAACAFQQRqEO2AgIAAAkACQCAFLwEcIgNFDQAgACADOwEMDAELQQBCAUEgIAUoAgwiBkEcbiIHQQR0QX9qZ2uthqcgBkEcSRshCCAFLwEaIgkgBS8BGCIKbEH//wNxQQN0IgsgCUEDdCIMaiINQQdyIQ4gCkEDdCEPIAUoAhAiEEEEdiERIAFBHGohEiABQQhqIRMgBUHAAmohFCAFQagCaiEVIAVBpAFqQfAAaiEWIAVBgAJqIRcgBUHsAWohGCAFQdgBaiEZIAVBvAFqIRogBSgCFCEbIAUoAgghHEEAIR1BACEeQQAhHwNAAkACQAJAAkACQCAEQf//A3EiIEUNACAFQSBqIBMQ5oCAgAACQCAFLwEkIgFFDQAgACABOwEMDAcLIAUoAiAhISAFQShqIBIQ6YCAgAACQCAFLwEsIgFFDQAgACABOwEMDAcLIAUoAighIiAFQTBqIBwQ7oCAgAAgBUEwakEQaiIBKAIAISMgBUHIAGogEBDvgICAACAFKAJIISQgBUHYAGogERDwgICAACAFKAJYISUgBUHoAGogGxDxgICAACAFKAJoISYgBUH4AGogBxDygICAACAFQfgAakEQaiInKAIAISggBUGQAWogCBDzgICAACAaIAUpAzA3AgAgGkEIaiAFQTBqQQhqKQMANwIAIBpBEGogASkDADcCACAZIAUpA0g3AgAgGUEIaiAFQcgAakEIaikDADcCACAFIA02ArgBIAUgCzYCtAEgBSAMNgKwASAFIAw2AqwBQQAhAyAFQQA2AqgBIAUgDiAjakF4cSIjNgLUASAFICQgI2pBA2pBfHEiJDYC6AEgBSAoICYgJSAkakEHakF4cSIlakEDakF8cSIpakEDakF8cSImIAUoApABakH//wNqQYCAfHEiKjYCpAEgGEEIaiAFQdgAakEIaikDADcCACAYIAUpA1g3AgAgF0EIaiAFQegAakEIaikDADcCACAXIAUpA2g3AgAgFkEIaiAFQZABakEIaikDADcCACAWIAUpA5ABNwIAIBVBEGogJykDADcCACAVQQhqIAVB+ABqQQhqKQMANwIAIBUgBSkDeDcCACAFICU2AvwBIAUgJjYCkAIgBSApNgKkAiAFIAk7AdICIAUgCjsB0AIgBSAbNgLMAiAFIBA2AsgCIAUgBjYCxAIgBSAcNgLAAkEAIQECQANAIAwgAUYNASAiIAFqIAwgA2qtNwMAIAMgD2ohAyABQQhqIQEMAAsLIAUgDTYCtAQgBSAiNgKwBCAFQcgDaiAFQbAEaiAaEPSAgIAAIAUoAogCICVqIQMCQCAFKAKEAiIrQQN0IgFFDQAgAyAiakH/ASAB/AsACyAFKALgASAjaiEnIAUoAowCISwCQCAFKALcASItQQN0IgFFDQAgJyAiakH/ASAB/AsACyAiICRqIgFBADYCDCABIAUoAvgBIig2AgggASAFKQLwAUIgiTcCACAFKALkASEuAkAgKEUNACABQRBqQQAgKPwLAAsgIiAmaiIBQQA2AgwgASAFKAKgAiIoNgIIIAEgBSkCmAJCIIk3AgACQCAoRQ0AIAFBEGpBACAo/AsACyAFICk2ArwEIAUgIjYCuAQgBUHYAmogBUG4BGogFUGMxceAABD1gICAACAhICRBEGo2AjggISAuICNqNgI0ICEgLTYCMCAhICc2AiwgISAsICVqNgIoICEgKzYCJCAhIAM2AiAgISAMNgIcICFBADYCGCAhICo2AhQgISAiNgIQIAVBADoA1AICQEHoAEUNACAhQTxqIAVByANqQegA/AoAAAsgISAmQRBqNgKkAQJAQfAARQ0AICFBqAFqIAVB2AJqQfAA/AoAAAsgISAJOwGuAiAhIAo7AawCICEgCTsBqgIgISAKOwGoAiAhQaACaiAUQQhqKQIANwIAICEgFCkCADcCmAIgISAFLQDUAjoAsAIgISACKQMANwMAICFCADcCCCAhICAgCSAgIAlJGyIBOwGuAgJAIB1FDQAgISAdNgIIICEhAyAdKAIMIiJFDQQgISAiNgIMICIgITYCCCAdIQMMBAsgHkUNASAhIB42AgwgISEDIB4oAggiIkUNAiAhICI2AgggIiAhNgIMIB4hAwwCCyAAIB82AgggACAdNgIEIAAgHjYCACAAQQA7AQwMBQsgIUEANgIMICEhHSAhIR4MAgsgHiAhNgIIQQAhHSADIR4MAQsgHSAhNgIMIAMhHQsgBCABayEEIAIgAikDAEIBfDcDACAfQYCAJGohHwwACwsgBUHABGokgICAgAALlQQBCn8jgICAgABB8ABrIgMkgICAgAAgAS8BEiEEIAEvARAhBQJAAkACQCACLQACDQAgBSECDAELIAIvAQAhAiADIAEoAgAQ7oCAgAAgAygCECEGIANBGGogASgCCCIHEO+AgIAAIAMoAhghCCADQShqIAdBBHYQ8ICAgAAgAygCKCEHIANBOGogASgCDBDxgICAACADKAI4IQkgA0HIAGogASgCBCIKQRxuIgsQ8oCAgAAgCSAHIAggBiAEIAVsQf//A3EgBGpBA3RqQQdqQfj///8BcWpBA2pB/P///wFxakEHakH4////AXFqQQNqQfz///8BcSEMQQAhBSADKAJYIQQCQCAKQRtNDQBCAUEgIAtBBHRBf2pna62GpyEFCyADQeAAaiAFEPOAgIAAAkAgAkEGdEHAAGoiCiAEIAxqQQNqQfz///8BcSADKAJgIgVqQf//A2pBgID8/wFxIAVrQfz///8BcSAEa0H8////AXEgCWtB+P///wFxIAdrQfz///8BcSAIa0H4////AXEgBmtBA3RBYHEiBE0NACAAQRBqQQApAtjEx4AANwIAIABBCGpBACkC0MTHgAA3AgAgAEEAKQLIxMeAADcCAAwCCyAEIApuIQQLIABBADsBFCAAIAQ7ARIgACACOwEQIAAgASkCADcCACAAQQhqIAFBCGopAgA3AgALIANB8ABqJICAgIAAC5gBAQR/AkACQCABDQBBACECQQAhAUEAIQNBACEEQQAhBQwBC0IBQSAgAUF/amciA2utQv//A4OGpyIBuEQAAAAAAADqP6L8AyICQSRsIAFBAXRBA2pB/P///wdxIgRqIQVBf0EAIANrdEF/cyEDCyAAIAM7ARQgACABNgIEIAAgAjYCACAAIAU2AhAgACAENgIMIABBADYCCAtFAQF/IABBADYCCCAAIAFBD2oiAUEEdkE/aiICQQZ2NgIEIAAgAkEDdkH4//8fcSICNgIMIAAgAiABQQR0QYB+cWo2AgALSgEBfyAAIAE2AgwgACABQRNqIgJB/P///wFxQXBqNgIEIAAgAiABQQJ0aiICQfz///8HcUFwajYCCCAAIAIgAUEDdGpBfHE2AgALRQEBfyAAQQA2AgggACABQR9qIgFBBXZBP2oiAkEGdjYCBCAAIAJBA3ZB+P//D3EiAjYCDCAAIAIgAUEFdEGAeHFqNgIAC5gBAQR/AkACQCABDQBBACECQQAhAUEAIQNBACEEQQAhBQwBC0IBQSAgAUF/amciA2utQv//A4OGpyIBuEQAAAAAAADqP6L8AyICQRxsIAFBAXRBA2pB/P///wdxIgRqIQVBf0EAIANrdEF/cyEDCyAAIAM7ARQgACABNgIEIAAgAjYCACAAIAU2AhAgACAENgIMIABBADYCCAtCAQF/IAAgATYCDCAAIAFBE2pBfHEiAkFwajYCBCAAIAIgAUECdGoiAkFwajYCCCAAIAFBAXQgAmpBA2pBfHE2AgAL5QECAX4EfyACKAIIIAEpAgAiA0IgiKciBGohBSACKAIMIQYCQCACKAIEQQF0IgdFDQAgBSADp2pBACAH/AsACyACKAIAQSRsIQcgBiAEaiIEIAEoAgBqIQECQANAIAdFDQECQEEkRQ0AIAFBgJLJgABBJPwKAAALIAdBXGohByABQSRqIQEMAAsLIAAgBDYCBCAAIAU2AgAgAEEANgIIIAAgAikCADcCDCAAQRRqIAJBCGopAgA3AgAgAEEcaiACQRBqKQIANwIAAkBBwgBFDQAgAEEkakEAQcIA/AsACyAAQQE7AWYLmgICAX4EfyACKAIIIAEpAgAiBEIgiKciBWohBiACKAIMIQcCQCACKAIEQQF0IghFDQAgBiAEp2pBACAI/AsACyACKAIAQRxsIQggByAFaiIFIAEoAgBqIQECQANAIAhFDQEgAUEYakEAKAK8ksmAADYCACABQRBqQQApArSSyYAANwIAIAFBCGpBACkCrJLJgAA3AgAgAUEAKQKkksmAADcCACAIQWRqIQggAUEcaiEBDAALCyAAIAU2AgQgACAGNgIAIABBADYCCCAAIAIpAgA3AgwgACADKQIANwIkIABBFGogAkEIaikCADcCACAAQRxqIAJBEGopAgA3AgACQEHCAEUNACAAQSxqQQBBwgD8CwALIABBATsBbguwAQECfyOAgICAAEEgayIDJICAgIAAIANBAToABiADIAE7AQQgA0EIakHAksmAACADQQRqEO2AgIAAAkACQCADLwEcIgFFDQAgACABOwEEDAELQYCAyAAhAQJAIAMvARoiBCACQf//A3FPDQACQCAEDQAgAEEZOwEEDAILIAJBf2pB//8DcSAEbkGAgCRsQYCAyABqIQELIAAgATYCACAAQQA7AQQLIANBIGokgICAgAALdwECfyOAgICAAEEQayICJICAgIAAAkACQAJAIAEoAhAiA0UNACABIAMoAgA2AhAMAQsgAkEIaiABEPiAgIAAAkAgAi8BDCIBRQ0AIAAgATsBBAwCCyACKAIIIQMLIAAgAzYCACAAQQA7AQQLIAJBEGokgICAgAALYQEBfyOAgICAAEEgayICJICAgIAAIAJB7KbIgAA2AhAgAiABNgIM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hCEDDCYLIANCfYNCAkIAIAJBAXEbhCEDDCULIANCd4NCCEIAIAJBAXEbhCEDDCQLIANCb4NCEEIAIAJBAXEbhCEDDCMLIANCX4NCIEIAIAJBAXEbhCEDDCILIANCv3+DQsAAQgAgAkEBcRuEIQMMIQsgA0L/foNCgAFCACACQQFxG4QhAwwgCyADQv99g0KAAkIAIAJBAXEbhCEDDB8LIANC/3uDQoAEQgAgAkEBcRuEIQMMHgsgA0L/d4NCgAhCACACQQFxG4QhAwwdCyADQv9vg0KAEEIAIAJBAXEbhCEDDBwLIANC/1+DQoAgQgAgAkEBcRuEIQMMGwsgA0L/v3+DQoDAAEIAIAJBAXEbhCEDDBoLIANC//9+g0KAgAFCACACQQFxG4QhAwwZCyADQv//fYNCgIACQgAgAkEBcRuEIQMMGAsgA0L//3uDQoCABEIAIAJBAXEbhCEDDBcLIANC//93g0KAgAhCACACQQFxG4QhAwwWCyADQv//b4NCgIAQQgAgAkEBcRuEIQMMFQsgA0L//1+DQoCAIEIAIAJBAXEbhCEDDBQLIANC//+/f4NCgIDAAEIAIAJBAXEbhCEDDBMLIANC////foNCgICAAUIAIAJBAXEbhCEDDBILIANC////fYNCgICAAkIAIAJBAXEbhCEDDBELIANC////e4NCgICABEIAIAJBAXEbhCEDDBALIANC////d4NCgICACEIAIAJBAXEbhCEDDA8LIANC////b4NCgICAEEIAIAJBAXEbhCEDDA4LIANC////X4NCgICAIEIAIAJBAXEbhCEDDA0LIANC////v3+DQoCAgMAAQgAgAkEBcRuEIQMMDAsgA0L/////foNCgICAgAFCACACQQFxG4QhAwwLCyADQv////99g0KAgICAAkIAIAJBAXEbhCEDDAoLIANC/////3uDQoCAgIAEQgAgAkEBcRuEIQMMCQsgA0L/////d4NCgICAgAhCACACQQFxG4QhAwwICyADQv////9vg0KAgICAEEIAIAJBAXEbhCEDDAcLIANC/////1+DQoCAgIAgQgAgAkEBcRuEIQMMBgsgA0L/////v3+DQoCAgIDAAEIAIAJBAXEbhCEDDAULIANC//////9+g0KAgICAgAFCACACQQFxG4QhAwwECyADQv//////fYNCgICAgIACQgAgAkEBcRuEIQMMAwsgA0L//////3uDQoCAgICABEIAIAJBAXEbhCEDDAILIANC//////93g0KAgICAgAhCACACQQFxG4QhAwwBCyADQv//////D4NCgICAgIBwQgAgAkEBcRuEIQMLIAAgAz4CACAAQQRqIANCIIg8AAAPCwALvQEBA38jgICAgABBEGsiASSAgICAAAJAIABFDQAgASAAKQKoGzcDCCAAKAKoGyECIAAoAqwbIQMgAEHUG2oQpICAgAAgAEHoLGogAUEIahDDgICAACAAQYASaiABQQhqEI6BgIAAIABBMGogAUEIahCPgYCAACAAQRhqIAFBCGoQ5ICAgAAgAEGEAWogAUEIahDDgICAACACIABB+CxBA0EAIAMoAgwRgYCAgACAgICAAAsgAUEQaiSAgICAAAvuAQEFfyOAgICAAEHAAGsiAiSAgICAACACQRxqIABByAhqIgMQkIGAgAAgAigCPCEEIAIoAjghBSACKAIcIQYgAkEcaiADEJCBgIAAAkAgBEUNACACKAIoQarVqtV6IAIoAjwbIQQDQCAFRQ0BIAIgBikCADcDECACIAEpAgA3AwggAkEIahD7gICAACAEIAEQkYGAgAAgBEEMaiEEIAZBCGohBiAFQX9qIQUMAAsLAkAgACgC0AgiBUUNACABKAIAIAMoAgAgBUE7bEEDQQAgASgCBCgCDBGBgICAAICAgIAACyACQcAAaiSAgICAAAs0AQF/AkAgACgCCCICRQ0AIAEoAgAgACgCBCACQQBBACABKAIEKAIMEYGAgIAAgICAgAALC5gBAQN/I4CAgIAAQTBrIgIkgICAgAAgAiABKAIENgIoIAIgASgCCCIDNgIsIAEoAgAhBEFkIQECQANAIAFFDQEgAkEMaiABQZSqyIAAaigCAEECdGogBDYCACAEIAFB+KnIgABqKAIAIANsaiEEIAFBBGohAQwACwsCQEEkRQ0AIAAgAkEMakEk/AoAAAsgAkEwaiSAgICAAAs3AQF/AkAgACgCCCICRQ0AIAEoAgAgACgCACACQSxsQQNBACABKAIEKAIMEYGAgIAAgICAgAALC80CAQZ/I4CAgIAAQTBrIgEkgICAgAAgAEGYAWohAiAAKAK8ASgCACEDAkAgAC8BzAEiBEUNACADQTxqIAMoAhAgBBCTgYCAAAtBACEEIAJB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NwMAIAUgASkCADcDEAJAIAogBTMBJiILWA0AIABBADYBAAwDCwJAIAogC1INACAFLwEoQf//A3FFDQAgBUEIaiADIAVBEGoQxYGAgABBAXFFDQAgAEEBOgACIAAgAjsBAAwDCyAKQgF8IQoMAAsLIABBADYBAAsgBUEwaiSAgICAAAvgAwEJfyOAgICAAEEgayIEJICAgIAAIARBAmogAUELai0AADoAACAEIAEvAAk7AQAgASgCECEFIAEoAgwhBiABLQAIIQcgASgCBCEIIAEoAgAhCQJAAkAgAiADRw0AIAAgBzoACCAAIAg2AgQgACAJNgIAIABBADsBFCAAIAU2AhAgACAGNgIMIAAgAUEJaiIBLwAAOwAJIABBC2ogAUECai0AADoAAAwBCyACKAIAIQogBEEIaiADQRBqIgsgAygCACAFEMCBgIAAAkAgBC8BECIBRQ0AIAAgATsBFAwBCyAEKAIIIQECQCAEKAIMIgxFDQAgASAGIApqIAz8CgAACyABIAMoAgAiBmshAQJAIAdBAXENACACKAIAIQcgBEEUaiALIAYgCBDAgYCAAAJAIAQvARwiAkUNACALIAMoAgAiAyABIANqIAUQwYGAgAAgACACOwEUDAILIAQoAhQhAgJAIAQoAhgiBkUNACACIAkgB2ogBvwKAAALQQAhByAEQQA6AAQgAiADKAIAayEJCyAAIAc6AAggACAINgIEIAAgCTYCACAAQQA7ARQgACAELwEAOwAJIAAgBTYCECAAIAE2AgwgAEELaiAEQQJqLQAAOgAACyAEQSBqJICAgIAAC+UDAQN/I4CAgIAAQTBrIgYkgICAgAAgBiAFKQIANwMIAkACQCAEQf//A3EiByABLwFuTw0AAkACQCABKAIEIAJqIgggB0EcbGoiBy8BGA0AAkAgAS8BbEUNACAAQQRqQQAvAYjFx4AAOwEAIABBACgBhMXHgAA2AQAMBAsgASACIAQgBRDCgYCAACAGIAUpAgA3AyAgBkEsaiABIAIgAyAFEKyBgIAAAkACQCAGLQAuRQ0AIAYvASwhBSAGQSBqIAMQw4GAgAAMAQsgASACIAMgBCAFEMSBgIAAIQULIAggBUH//wNxIgJBHGxqIgMgAy8BGEEBajsBGCABIAEoAghBAWo2AghBiKfIgAAhASACIARB//8DcUYNASAGQQE6ABggBiAFOwEWIAZBADsBGiAGQRZqIQEMAQsgBkEIaiADIAcQxYGAgABBAXFFDQEgBkEIaiADEMOBgIAAIABBADYBACAAQQRqQQA7AQAgByAHLwEYQQFqOwEYDAILIAAgASgBADYBACAAQQRqIAFBBGovAQA7AQAMAQsgBkEcaiABIAIgAyAFEMaBgIAAAkAgBi8BHiIBRQ0AIAAgATsBBAwBCyAAQQA7AQQgAEEBOgACIAAgBi8BHDsBAAsgBkEwaiSAgICAAAuKAwEEfyOAgICAAEEQayIFJICAgIAAAkACQAJAAkAgBEH//wNxIgYgAS8BZk8NAAJAIAEoAgQgAmoiByAGQSRsaiIGLwEgIggNAEEBIQYgAS8BZA0DIAEgAiAEEMiBgIAAIAVBDGogASACIAMQyYGAgAACQAJAIAUtAA5FDQAgBS8BDCECDAELIAEgAiADIAQQyoGAgAAhAgsgByACQf//A3EiA0EkbGoiBiAGLwEgQQFqOwEgIAEgASgCCEEBajYCCEGIp8iAACEBAkAgAyAEQf//A3FGDQAgBUEBOgACIAUgAjsBACAFIQELIAEoAQAiAUGAgPwHcSECIAFBgICAeHEhBAwCCyADIAYQlIGAgABBAXFFDQAgBiAIQQFqOwEgQQAhBEEAIQJBACEBDAELIAVBCGogASACIAMQmIGAgAAgBS8BCiIGDQFBgIAEIQJBACEEIAUvAQghAQsgAEEAOwEEIAAgAiAEciABQf//A3FyNgEADAELIAAgBjsBBAsgBUEQaiSAgICAAAuIAQEBfyAAIAAoAlwgASgCFGs2AlwCQAJAIAEoAhQiAkGAgCRLDQACQCACRQ0AIAEoAhBBACAC/AsACyABKAIQIgIgACgCPDYCACAAIAI2AjwMAQsgACgCLCABKAIQIAJBEEEAIAAoAjAoAgwRgYCAgACAgICAAAsgASAAKAIoNgIAIAAgATYCKAvAHQIYfwF+I4CAgIAAQYAJayICJICAgIAAAkACQCABKAJYIgMvAaoCIAMvAa4CIgRNDQAgAyAEQQFqOwGuAiAAQQApA4CIwoAANwIAIAEgASgCaEEBajYCaAwBCyABQdgAaiEFAkAgASgCVCIGRQ0AIAYgA0YNACABKAJcQYCAJGogASgCYCIEIAEoAmQiByAEIAdLG00NAEEAIQggBSEHA0AgBygCACIERQ0BIARBCGohByAIIAQvAa4CaiIIIAEvAYoBSQ0ACyACQQE6AAYgAiABLwGIATsBBCACQQhqQcCSyYAAIAJBBGoQ7YCAgAACQCACLwEcIgRFDQAgACAEOwEEDAILIAIvARghCSACLwEaIQogAigCDCEEIAIoAhQhCyACKAIQIQcgAkEgaiACKAIIIgwQ7oCAgAAgAigCMCENIAJBOGogBxDvgICAACACKAI4IQ4gAkHIAGogB0EEdhDwgICAACACKAJIIQ8gAkHYAGogCxDxgICAACACKAJYIRAgAkHoAGogBEEcbiIREPKAgIAAIBAgDyAOIA0gCiAJbEH//wNxQQN0IhIgCkEDdCIIaiITakEHakF4cSIUakEDakF8cSIOakEHakF4cSIPakEDakF8cSEQIAIoAnghFUEAIQ0CQCAEQRxJDQBCAUEgIBFBBHRBf2pna62GpyENCyACQYABaiANEPOAgIAAIAJBtAFqIAJBIGpBCGopAwA3AgAgAkG8AWogAkEgakEQaikDADcCACACQdABaiACQThqQQhqKQMANwIAIAIgEzYCqAEgAiASNgKkASACIAg2AqABIAIgCDYCnAEgAkEANgKYASACIBQ2AsQBIAIgDjYC2AEgAiACKQMgNwKsASACIAIpAzg3AsgBIAIgFSAQakEDakF8cSISIAIoAoABakH//wNqQYCAfHEiFTYClAEgAkHkAWogAkHIAGpBCGopAwA3AgAgAkH4AWogAkHYAGpBCGopAwA3AgAgAkGMAmogAkGAAWpBCGopAwA3AgAgAkGgAmogAkHoAGpBCGopAwA3AgAgAkGoAmogAkHoAGpBEGopAwA3AgAgAiAPNgLsASACIBI2AoACIAIgEDYClAIgAiACKQNINwLcASACIAIpA1g3AvABIAIgAikDgAE3AoQCIAIgAikDaDcCmAIgAiAKOwHCAiACIAk7AcACIAIgCzYCvAIgAiAHNgK4AiACIAQ2ArQCIAIgDDYCsAICQAJAIAYoAggiB0UNACAHIAYoAgwiBDYCDAwBCyABIAYoAgwiBDYCVAsCQAJAIARFDQAgBCAGKAIINgIIDAELIAUgBigCCDYCAAsgBigCECELAkAgBigCFCIERQ0AIAtBACAE/AsACyABIAEoAmggBi8BrgJrQQFqNgJoAkAgAS0AjQFBAkcNACAB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AUcNAAJAIAEoAggiBQ0AIAEoAgwhBQsgBEEANgEEIAQgBTYCAAsgA0EEaiEDIAJBf2ohAgwACwsgASgCDCECAkACQCABKAIIIgNFDQAgAyACNgIMDAELIAAgAjYCVAsgASgCCCEDAkACQCACRQ0AIAIgAzYCCAwBCyAAIAM2AlgLIAAgARCwgYCAAAvEAQIDfwF+I4CAgIAAQTBrIgMkgICAgAACQAJAIAIvAQQiBCABLwGIAUkNACAAQgA3AgAgAEEIakIANwIADAELIAIoAgAhBSADQQxqIAEgAi0ACBC7gYCAACADQRhqIANBDGogBRDPgYCAAAJAIAMtACgNACAAIAMpAxgiBj4CACAAQQE6AAwgACADKAIgNgIIIAAgBDsBBiAAQQRqIAZCIIg9AQAMAQsgAEIANwIAIABBCGpCADcCAAsgA0EwaiSAgICAAAs4AgF/AX4jgICAgABBEGsiASSAgICAACABIAA2AgwgAUEMahCkhICAACECIAFBEGokgICAgAAgAgukAgECfyOAgICAAEEgayIDJICAgIAAAkACQAJAAkACQAJAAkACQCACQQNxDgQGAAEBBgsgAS0AjQEOAwECAwELIABBADoACCAAQQA2AgQgACABKAJUNgIADAULIANBCGogAUEAELuBgIAAIANBCGohAQwCCyADQQA6ABwgA0EANgIYIAMgASgCVDYCFCADQRRqIQEMAQsgASgCfCEBCyAAIAEpAgA3AgAgAEEIaiABQQhqKAIANgIADAELIAFB2ABqIQIgAS8BigEhAQNAAkAgAUH//wNxIAIoAgAiAi8BrgIiBEsNACAAQQA6AAggAEEAOwEGIAAgAjYCACAAIAQgAWs7AQQMAgsgAkEIaiECIAEgBGshAQwACwsgA0EgaiSAgICAAAvLDgEYfyOAgICAAEHABGsiAySAgICAACAAKAIUIQQCQAJAAkAgAC8BGiAAKAIEIgUvAZoCQX9qQf//A3FHDQAgACgCECEGIANBCGogAUEYahDmgICAACADLwEMIgUNAiACLwEQIQcgAi8BEiEFIAMoAgghCCADQRBqIAIoAgAQ7oCAgAAgAygCICEJIANBKGogAigCCCIKEO+AgIAAIAMoAighCyADQThqIApBBHYQ8ICAgAAgAygCOCEKIANByABqIAIoAgwQ8YCAgAAgAygCSCEMIANB2ABqIAIoAgQiDUEcbiIOEPKAgIAAIAwgCiALIAkgByAFbEH//wNxQQN0IgcgBUEDdCIPaiIQakEHakF4cSIRakEDakF8cSISakEHakF4cSITakEDakF8cSELIAMoAmghCUEAIQUgDUEbTQ0BQgFBICAOQQR0QX9qZ2uthqchBQwBCyAFIAUvAZ4CQQFqOwGeAiAAIAAoAggiAkEIajYCCCAAKAIEKAIAIQcgAigCCCECQQAhBSAAQQA6ABwgAEEAOwEYIAAgAC8BGkEBajsBGiAAIAIgB2o2AgwMAQsgA0HwAGogBRDzgICAACADQaABaiADQRBqQQhqKQMANwIAIANBqAFqIANBEGpBEGopAwA3AgAgA0G8AWogA0EoakEIaikDADcCACADIBA2ApQBIAMgBzYCkAEgAyAPNgKMASADIA82AogBIANBADYChAEgAyARNgKwASADIBI2AsQBIAMgAykDEDcCmAEgAyADKQMoNwK0ASADIAkgC2pBA2pBfHEiDCADKAJwakH//wNqQYCAfHEiDTYCgAEgA0HQAWogA0E4akEIaikDADcCACADQeQBaiADQcgAakEIaikDADcCACADQfgBaiADQfAAakEIaikDADcCACADQYwCaiADQdgAakEIaikDADcCACADQZQCaiADQdgAakEQaikDADcCACADIBM2AtgBIAMgDDYC7AEgAyALNgKAAiADIAMpAzg3AsgBIAMgAykDSDcC3AEgAyADKQNwNwLwASADIAMpA1g3AoQCIANBrAJqIAJBEGooAgA2AgAgA0GkAmogAkEIaikCADcCACADIAIpAgA3ApwCIAMgASkCLDcDsAICQAJAAkAgDUGBgCRPDQAgA0G4AmogAUEsahDpgICAACADLwG8AiIFDQJBgIAkIRQgA0G4AmohAgwBCyADQcACaiADQbACaiANEOuAgIAAIAMvAcgCIgUNASADQcACaiECIAMoAsQCIRQLIANBnAJqIQ4gA0GEAmohFSADQZgBaiEWIAMvAa4CIhdBA3QhCSADLwGsAiIYQQN0IQogAigCACEHQQAhAiAPIQUCQANAIAkgAkYNASAHIAJqIAWtNwMAIAJBCGohAiAFIApqIQUMAAsLIAMgEDYCsAQgAyAHNgKsBCADQcADaiADQawEaiAWEPSAgIAAIAMoAuQBIBNqIQUC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NgIAIABBACkC+MTHgAA3AgAMAQsgAEEIakEAKAKAxceAADYCACAAQQApAvjEx4AANwIACyAEQRBqJICAgIAAC64BACAAKAIAIAFqIAIgACgCCCABamsiAUEIdkH4//8HcWoiAEJ/QQAgA0EfakEFdiIDQcAAIAFBBXZBP3EiAWsiAiADIAJJGyICa0E/ca2IIAGthiAAKQMAhDcDACAAQQhqIQEgAyACayEAAkADQCAAQcEASQ0BIAFCfzcDACABQQhqIQEgAEFAaiEADAALCwJAIABFDQAgASABKQMAQn9BACAAa0E/ca2IhDcDAAsLlQQBCH8jgICAgABBMGsiBCSAgICAACAEQRBqQRBqIAAoAgQgAWoiBSACQf//A3FBHGxqIgJBEGoiBikCADcDACAEQRBqQQhqIAJBCGoiBykCADcDACAEQRBqQRhqIAJBGGoiCCgCADYCACAEIAMpAgA3AwggBCACKQIANwMQAkAgACgCECAELwEkIgNJDQAgACgCACEJIARBCGogBEEQahDDgYCAACAAQS5qIgogBC8BJkEBdGoiCyALLwEAQX9qOwEAIAkgAWoiASADQQF0akEAOwEAIAhBACgCvJLJgAA2AgAgBkEAKQK0ksmAADcCACAHQQApAqySyYAANwIAIAJBACkCpJLJgAA3AgACQANAIAEgAC8BICADQQFqcSIHQf//A3FBAXRqIgIvAQAiBkUNASAFIAZBHGxqIgYvARZFDQEgBkEUaiADOwEAIAogBSACLwEAQRxsai8BFkEBdGoiBiAGLwEAQX9qOwEAIAUgAi8BAEEcbGoiBiAGLwEWQX9qOwEWIAogBSACLwEAQRxsai8BFkEBdGoiBiAGLwEAQQFqOwEAIAEgA0H//wNxQQF0aiACLwEAOwEAIAchAwwACwsgAC8BLCECAkADQCACQf//A3EiBUUNASAKIAVBAXRqLwEADQEgACACQX9qIgI7ASwMAAsLIAEgA0H//wNxQQF0akEAOwEACyAEQTBqJICAgIAAC10BBH8gACgCACIAQRBqIQIgASgCECEDIAEoAgwhBAJAIAEtAAhBAXENACACIAAoAgAiBSAFIAEoAgBqIAEoAgQQwYGAgAALIAIgACgCACIBIAQgAWogAxDBgYCAAAu8BQMFfwJ+Bn8jgICAgABBMGsiBSSAgICAACAFQRBq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AR4gCUIBfCEJIApCf3whCgwBCwsgDSALOwEAIAIgDDsBHCAGIAIvAR5BAXRqIgEgAS8BAEEBajsBACAAIAAvASQiASACLwEeIgIgASACSxs7ASQLIAggBC8BJEEBdGogAzsBAAJAQSRFDQAgByADQf//A3FBJGxqIARBCGpBJPwKAAALIARBMGokgICAgAAgAwuXNAQDfwF+F38BfiOAgICAAEHwDWsiAySAgICAACAAIAE7AYgBAkACQAJAIAItAARFDQBBACEEIANBADoAECADIAIvAQA7AQwgAyACLwECIgU2AgggA0EUaiAAIANBCGoQuYGAgAAgAy0AIEUNACADQSRqIABBlMXHgAAQuYGAgAACQCADLQAwRQ0AIANBmAFqQQhqIANBJGpBCGooAgA2AgAgAyADKQIkNwOYAUECIQQLIANB6ABqQQhqIANBFGpBCGooAgA2AgAgA0GAAWogA0GYAWpBCGooAgA2AgAgA0EAOgCQASADIAMpAhQ3A2ggA0EBOgB0IAMgAykDmAE3A3ggAyAEOgCUASADIAQ6AIQBIANBADoAiAEgA0GoAWogA0HoAGoQtIGAgAACQAJAIAMtALABRQ0AAkBBJEUNACADQewBaiADQegAakEk/AoAAAsgA0EBOgCYAiADIAMpA6gBIgY3ApACIAMgBkIwiKdBf2o7AZwCIANB7AFqIQIMAQsCQEEkRQ0AIANBuAFqIANB6ABqQST8CgAACyADQeIBakIANwEAIANCADcC3AEgA0G4AWohAgsCQEE0RQ0AIANBNGogAkE0/AoAAAtBACEHAkADQCADQaACaiADQTRqELeBgIAAIAMtAKwCRQ0BIAMoAqACIgIoAhggAigCEGogAy8BpAJBA3RqKQMAQiGIp0EBcSAHaiEHDAALCyADQbACaiAAIANBFGoQhIGAgAAgAy8BtAIiAg0CIAAvAYoBIAVBf3NqQf//A3EhCEEAIQkgAygCsAIhCgwBC0EBIQkLIAAoAlQhAiADQbgCaiAAQYiIwoAAQZzUx4AAEMyBgIAAIANBAToA7gIgAyABOwHsAiADQfACaiACQZgCaiADQewCahDtgICAAAJAAkAgAy8BhAMiAg0AIAMvAYIDIQsgAy8BgAMhDCADKAL8AiENIAMoAvgCIQEgAygC9AIhBSADKALwAiEOIANBiANqIABB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AgA2AgAgA0GwCmpBCGogA0GYCmpBCGopAgA3AwAgAyADKQKYCjcDsAoCQCASKQMAIh5CgICAgBCDQgBRDQAgASENDAILIAFBAWohDSARIAFBA3RqQXhqIQICQANAIA1BAUYNASANQX9qIQ0gAikDACEGIAJBeGohAiAGQv7//4OAgAODUEUNAwwACwsgHkKAgICAgByDQgBSIQ0MAQsgACADKALMBzYCaEEAIQECQAJAA0AgGCgCACICRQ0BIAJBDGohGCABIAIvAa4CaiIBIAAvAYoBSQ0ADAILCyAALwGKASABa0EBaiEBA0AgAUF/aiIBRQ0BIANB7AdqIAAQsYGAgAAgAy8B8AciAg0EDAALC0EAIQIgCQ0EQQAhAiADQfQHaiAAQQAgChDNgYCAACADLQCACEUNAyADQYQIaiAAQZTFx4AAELmBgIAAQQAhAgJAIAMtAJAIRQ0AIANB+AhqQQhqIANBhAhqQQhqKAIANgIAIAMgAykChAg3A/gIQQIhAgsgA0HICGpBCGogCkEIaigCADYCACADQeAIaiADQfgIakEIaigCADYCACADQQA6APAIIANBAToA1AggAyADKQP4CDcD2AggAyACOgD0CCADIAI6AOQIIANBADoA6AggAyAKKQIANwPICCADQYgJaiADQcgIahC0gYCAAAJAAkAgAy0AkAlFDQACQEEkRQ0AIANByAlqIANByAhqQST8CgAACyADQQE6APQJIAMgAykDiAkiBjcC7AkgAyAGQjCIp0F/ajsB+AkgA0HICWohAgwBCwJAQSRFDQAgA0GUCWogA0HICGpBJPwKAAALIANBvglqQgA3AQAgA0IANwK4CSADQZQJaiECCwJAQTRFDQAgA0GUCGogAkE0/AoAAAtBACECAkADQCADQfwJaiADQZQIahC3gYCAACADLQCICkUNASADKAL8CSIBKAIYIAEoAhBqIAMvAYAKQQN0aikDAEIhiKdBAXEgAmohAgwACwsgCEF/cyAIQQAgAiAHayIBIAEgAksbIgIgCCACSRtqIAMoAvQHQX9zIAAvAYoBaiIBQQAgCCACayICIAIgCEsbIgIgASACSRtqIQECQANAIAFBAWoiAUUNASADQYwKaiAAELGBgIAAIAMvAZAKIgJFDQAMBQsLQQAhAgwDCyAFQRBqIRQgACgCdCELIAAoAnAhDCAAKAJsIQFBACECIAMvAcAKIAMvAdAHQX9zakH//wNxIRYDQAJAAkACQCALRQ0AIAwgAk0NACABKAIAIgQoAgAgBUcNAiAELwEEIA9HDQIgBC8BBiIQIA1B//8DcSINSQ0BIAQgECAWIBAgFkkbIhA7AQYMAQsCQAJAAkAgDUH//wNxIhdFDQACQANAIAMoAsgHIgJFDQEgAyACQX9qNgLIByADQbgHaiAAIANBmApqELyBgIAAIgJB//8DcQ0JDAALCyADKALAByILIAspAwBC//////9jgyASKQMAQoCAgICAHIOENwMAQQAhDANAAkACQCAMIg0gF08NACADLQDUB0UNASALIAspAwBCgICAgBCENwMAIANBuAdqIAAgA0GwCmoQvIGAgAAiAkH//wNxDQogAygCwAciCyALKQMAQv/////fY4MgEikDAEKAgICAgByDhEKAgICAIIQ3AwAMAQsgEi0ABEEBcUUNAwwECwJAIAAoAnRFDQAgACgCcCECIAAoAmwhASADLwHSByEMIAMvAdAHIRAgAygCuAchFgNAIAJFDQECQCABKAIAIgQoAgAgBUcNACAELwEEIA9HDQAgDSAELwEGRw0AIAQgEDsBBiAEIBY2AgAgBCAMOwEECyACQX9qIQIgAUEEaiEBDAALCyANQQFqIQwCQAJAIBEgDUEDdGoiECkDACIGQgKDUA0AIAMoAsQHIgIgBjcDACADLwHQByIBIAMoArwHLwGcAkF/akH//wNxRg0BIAMgAUEBajsB0AcgAyACQQhqNgLEBwwCCwJAAkACQCAGQiqIp0EDcQ4EAgEABAILIAMoArwHLwGcAkEBTQ0DDAELAkAgAygCvAciAi8BnAIiAUEBSw0AIAMoAsQHIgEgASkDAEKDgID8//98gzcDAAJAAkAgAy8B0AciBCACLwGcAkF/akH//wNxRw0AIANBAToA1AcMAQsgAyAEQQFqOwHQByADIAFBCGo2AsQHCyANQQJqIQwMAwsgAy8B0AciBCABQX9qQf//A3FHDQAgAygCxAciASABKQMAQoCAgByDQoCAgICAgAOENwMAAkAgBCACLwGcAkF/akH//wNxRw0AIANBAToA1AcgDSEMDAMLIAMgBEEBajsB0AcgAyABQQhqNgLEByANIQwMAgsgAygCxAciAiAGQvz//5+AgHeDNwMAAkAgECkDACIGQgODQgFSDQAgAyAFKAI4IAUoAhAiAmo2AsgKIANBzApqIANByApqIBAgAmsQp4GAgAACQAJAIAMtANQKDQBBACEOQQAhFgwBCyADKALMCiACaiEOIAMoAtAKIRYLAkAgAygCvAciASgCKCABKAIAIgJqIgRBfGooAgAgBEF4aigCAEkNACADQdgKakEIakIANwMAIANCADcD2AogA0IANwPwCiADQQE6AOwKIAMgAygCuApBAXQ2AugKIANBuAdqIAAgA0HYCmoQvYGAgAAiAkH//wNxDQsgAygCvAciASgCACECCyADQfwKaiABQRxqIgQgAiAWEKiBgIAAAkACQCADLwGECw0AIAQgASgCACADKAL8CiADKAKACxCigYCAAAwBCyAWQQJ0IQQgAygCuAoiDSECA0AgAiIBQQF0IQIgASANayAESQ0ACyAZQgA3AwAgGUEIakIANwMAIANBAToAlAsgAyABNgKQCyADQgA3A4gLIANBuAdqIAAgA0GIC2oQvYGAgAAiAkH//wNxDQsgAygCvAchAQsgAyABKAIoIAEoAgAiBGo2AqgLIAMoAsQHIQIgAygCwAchCyADQawLaiABQRxqIhogBCAWEKiBgIAAAkAgAy8BtAtFDQBBIiECDAsLIAMoAqwLIQ0CQCADKAKwCyIWQQJ0IhVFDQAgDSAOIBX8CgAACyABKAIAIQ4gAyAWNgK8CyADIA0gDms2ArgLAkAgA0GoC2ogAiAEayADQbgLahCpgYCAAEH//wNxRQ0AIBogASgCACANIBYQooGAgABBISECDAsLIAIgAikDAEJ8g0IBhDcDACALIAspAwBCgICAgMAAhDcDACAQKQMAIQYLAkACQCAGQoCAgICAgAiDQgBSDQAgAygCvAchAQwBCyADIAUoAqQBIAUoAhAiBGo2AsALIANBxAtqIANBwAtqIBAgBGsQqoGAgAAgAy8BxAshFiAFKAKsASELAkAgAygCvAciASgClAEgASgCACICaiINQXxqKAIAIA1BeGooAgBJDQAgA0HIC2pBCGpCADcDACADQgA3A8gLIANCADcD4AsgA0EBOgDcCyADIAMoArQKQQF0NgLYCyADQbgHaiAAIANByAtqEL2BgIAAIgJB//8DcQ0LIAMoArwHIgEoAgAhAgsgA0HsC2ogAUEQaiINIAJBACALIARqIBZBHGxqIgsoAgQgCy0ACEEBcRsgCygCEGoiBBDAgYCAAAJAAkAgAy8B9AsNACANIAEoAgAgAygC7AsgAygC8AsQwYGAgAAMAQsgAygCvAoiDSECA0AgAiIBQQF0IQIgASANayAESQ0ACyADQfgLakEQakIANwMAIANB+AtqQQhqQgA3AwAgA0IANwP4CyADQQE6AJQMIAMgATYCkAwgA0G4B2ogACADQfgLahC9gYCAACICQf//A3ENCyADKAK8ByEBCyABKAIAIQQgA0GYDGogCyAUIAEQrYGAgAAgAy8BrAwiAg0KIANBADYCtAwgAyABNgKwDCADQboMaiABQZgBaiAEIANBmAxqIBYgA0GwDGoQroGAgAAgA0G6DGohASADLQC8DCECAkACQAJAAkAgAy8BvgwOAgMBAAtBvM3HgAAhAgwBCyADQcAMakEIakIANwMAIANCADcDwAwgA0IANwPYDCADQQE6ANQMIAMgAygCtApBAXQ2AtAMIANBwAxqIQILIANBuAdqIAAgAhC9gYCAACICQf//A3ENCyADKAK8ByIBKAIAIQQgA0HkDGogCyAUIAEQrYGAgAAgAy8B+AwiAg0LIANBADYCgA0gAyABNgL8DCADQYQNaiABQZgBaiAEIANB5AxqIBYgA0H8DGoQroGAgAAgAy8BiA0iAg0LIAMgAy8BhA07AYoNIANBig1qIQEgAy0Ahg0hAgsCQCACQf8BcUUNACABLwEAIRYLIAMgAygCvAciASgClAEgASgCACIEajYCjA0gAygCwAchCyADQZANaiADQYwNaiADKALEByICIARrEKuBgIAAAkAgAy8BnA1FDQBBICECDAsLIAMoApQNIQ0CQAJAIAMtAJgNRQ0AIAFBmAFqIAEoAgAgDS8BABClgYCAAEKAgICAgIAIIQYgAiEEIA0vAQAgFkH//wNxRg0BCyANIBY7AQAgAiACKQMAQoCAgICAgAiENwMAQoCAgICAAiEGIAshBAsgBCAEKQMAIAaENwMAIBApAwAhBgsCQCAGQhqIpyIEQf//A3EiDUUNACADQaANakEIaiAFKAJAIAUoAhBqIA1BJGxqIgJBCGopAgA3AwAgA0GgDWpBEGogAkEQaikCADcDACADQaANakEYaiACQRhqKAIANgIAIAMgAikCADcDoA0gA0HCDWog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gzcDAAwBCwJAAkAgECAFLwGsAiICRg0AIAJBAWohBiAPKAIAIAUoAhBqIQICQANAIAZBf2oiBkUNASACLQAFIRQgAkEIaiECIBRBIHENAwwACwsgDyAPKQMAQv//////fYMiFzcDAAwECyAPIA8pAwBC//////99gyIXNwMADAMLIA8pAwAhFwwCCyACQQhqIQIgFEEIaiEUIAZBf2ohBgwACwsCQCAXQoCAgICAAYNQDQAgCyEGIBAhAgNAAkACQAJAAkACQCACRQ0AIAYpAwBCGoinIhRB//8DcQ0BDAQLIBAgBS8BrAIiAkcNAQwCCyAKIAUoAhAgFBCTgYCAAAwCCyACQQFqIQYgDygCACAFKAIQaiECA0AgBkF/aiIGRQ0BIAIoAQIhFCACQQhqIQIgFEGA+P8fcQ0EDAALCyAPIA8pAwBC//////9+gzcDAAwCCyAGQQhqIQYgAkF/aiECDAALCwJAIBBBA3QiAkUNACALQQAgAvwLAAsgE0EBaiETDAALC0IBQSAgEkEEdEF/amdrrYanIQYMAwsgACAFELiBgIAADAELAkAgACgCdEUNACAAKAJwIQIgACgCbCEGA0AgAkUNAQJAIAYoAgAiFCgCACAFRw0AAkAgFC8BBCIIIAdPDQAgFEEANgEEDAELIBQgCCAHazsBBAsgBkEEaiEGIAJBf2ohAgwACwsgBSANOwGuAgsgBCAHaiEEDAELCyAFQZgCaiESIAQgB2ohBCADQZABaiAGEPOAgIAAIANBxAFqIANBMGpBCGopAwA3AgAgA0HMAWogA0EwakEQaikDADcCACADQeABaiADQcgAakEIaikDADcCACADIBU2ArgBIAMgEzYCtAEgAyAUNgKwASADIBQ2AqwBQQAhBiADQQA2AqgBIAMgDjYC1AEgAyAPNgLoASADIAMpAzA3ArwBIAMgAykDSDcC2AEgAyAWIBFqQQNqQXxxIhMgAygCkAFqQf//A2pBgIB8cSIHNgKkASADQfQBaiADQdgAakEIaikDADcCACADQYgCaiADQegAakEIaikDADcCACADQZwCaiADQZABakEIaikDADcCACADQbgCaiADQfgAakEQaikDADcCACADQbACaiADQfgAakEIaikDADcCACADIBA2AvwBIAMgEzYCkAIgAyARNgKkAiADIAMpA1g3AuwBIAMgAykDaDcCgAIgAyADKQOQATcClAIgAyADKQN4NwKoAiADIAo7AdICIAMgCTsB0AIgAyALNgLMAiADIAw2AsgCIAMgAjYCxAIgAyANNgLAAiAJQQN0IQwgA0HAAmohCyADQagCaiENIANBvAFqIRZBACECAkADQCAUIAJGDQEgCCACaiAUIAZqrTcDACAGIAxqIQYgAkEIaiECDAALCyADIBU2ArgEIAMgCDYCtAQgA0HIA2ogA0G0BGogFhD0gICAACADKAKIAiAQaiEGAkAgAygChAIiFkEDdCICRQ0AIAYgCGpB/wEgAvwLAAsgAygC4AEgDmohDCADKAKMAiEYAkAgAygC3AEiGUEDdCICRQ0AIAwgCGpB/wEgAvwLAAsgCCAPaiICQQA2AgwgAiADKAL4ASIVNgIIIAIgAykC8AFCIIk3AgAgAygC5AEhGgJAIBVFDQAgAkEQakEAIBX8CwALIAggE2oiAkEANgIMIAIgAygCoAIiFTYCCCACIAMpApgCQiCJNwIAAkAgFUUNACACQRBqQQAgFfwLAAsgAyARNgLABCADIAg2ArwEIANB2AJqIANBvARqIA1BjMXHgAAQ9YCAgAAgBSAPQRBqNgI4IAUgGiAOajYCNCAFIBk2AjAgBSAMNgIsIAUgGCAQajYCKCAFIBY2AiQgBSAGNgIgIAUgFDYCHCAFQQA2AhggBSAHNgIUIAUgCDYCECADQQA6ANQCAkBB6ABFDQAgBUE8aiADQcgDakHoAPwKAAALIAUgE0EQajYCpAECQEHwAEUNACAFQagBaiADQdgCakHwAPwKAAALIAUgCTsBrAIgBSAKOwGqAiAFIAk7AagCIAVBADsBrgIgEkEIaiALQQhqKQIANwIAIBIgCykCADcCACAFIAMtANQCOgCwAgsgACAAKAJoIARrNgJoAkACQAJAAkAgAS0ACA0AIARBAWohAgNAIAJBf2oiAkUNASADQeQEaiAAELGBgIAAIAMvAegEIgZFDQALIAMgBjsB7gQgA0KAEDcCkBUgA0HAv8eAADYCiBUgAyADQfAEajYCjBUgA0GIFWogA0HuBGoQ14GAgAAiAkH//wNxDQEgAygCjBUhBiADKAKUFSEFDAILIAAgBBDYgYCAAAwCCyADQYgVakGw6cmAAEHBABCogICAACADLwGgFQ0BIANB8BRqQRBqIANBiBVqQRBqKQIANwMAIANB8BRqQQhqIgYgA0GIFWpBCGopAgA3AwAgAyADKQKIFTcD8BQCQCAGIANB7gRqENeBgIAAQf//A3FFDQAgA0HwFGoQqYCAgAAMAgsgA0GkFWogA0HwFGoQqoCAgAAgA0HwFGoQqYCAgAAgAy8BrBUNASADKAKoFSEFIAMoAqQVIQYLIAYgBRCAgICAACACQf//A3FFDQBBsOnJgAAgBiAFELaAgIAACyADQbAVaiSAgICAAAuoAwECfyOAgICAAEHwAGsiBSSAgICAACAFIAI2AhQgBSABNgIQAkACQCADRQ0AIAUgBDYCCCADIQIMAQsgACAAKAK0ASICQQFqNgK0AQsgBSACNgIEIAUgA0U6AAwgBUEYakEIaiEEIAVBKGohBgJAAkADQAJAAkACQAJAAkAgACAFQQRqEJuBgIAAIgJB//8DcSIBQVpqDgMBAwQACyABDgIGAQYLIARCADcDACAGQgA3AwAgBUIANwMYIAVBAToANCAFIAAoArwBKAIAIgIoAqQCQQF0NgIwIAVBOGogACACIAVBGGoQloGAgAAgBS8BPCICRQ0DDAQLQQEhAgwDCyAFQcAAakEIakIANwMAIAVCADcDQCAFQgA3A1ggBUEBOgBUIAUgACgCvAEoAgAiAigCnAJBAXQ2AlAgBUHgAGogACACIAVBwABqEJaBgIAAIAUvAWQiAkUNAQwCCyAFQegAaiAAIAAoArwBKAIAQbzNx4AAEJaBgIAAIAUvAWwiAkUNAAsLIAMNACAAIAAoArQBQX9qNgK0AQsgBUHwAGokgICAgAAgAgsxAQF/AkAgAEHA68mAAEE4EJqAgIAAIgJB//8DcQ0AIAAgAS8BABCnhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABDWgYCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBPRCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQ1oGAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACzEBAX8CQCAAQaDqyYAAQTsQmoCAgAAiAkH//wNxDQAgACABLwEAEKeEgIAAIQILIAILMQEBfwJAIABByK/KgABBPxCagICAACICQf//A3ENACAAIAEvAQAQp4SAgAAhAgsgAgu7AQECfyOAgICAAEEQayICJICAgIAAAkACQAJAAkACQCAALQCNAQ4DBAABBAsgAkEAOgAMIAJBADYCCCACIAAoAlQ2AgQgACACQQRqELaBgIAAQQFxDQEMAwsgACAAKAJ8ELaBgIAAQQFxDQEgAC0AhAFFDQICQCAAKAKAASIDIAFPDQAgAEEBOgCNAQwDCyAAIAMgAWs2AoABDAILIABBADoAjQEMAQsgAEEAOgCNAQsgAkEQaiSAgICAAAuCEQMEfwF+CH8jgICAgABBkARrIgQkgICAgAACQAJAAkAgAC8B8hEgAkH//wNxIgVHDQBBACEBIAAvAfARIANB//8DcUYNAgwBCyAAQTBqIgYgARCPgYCAACAEQQxqIAEgBRDjgICAACAELwFYIgENAUHMAEUNACAGIARBDGpBzAD8CgAAC0EAIQcCQCAALQAkQQFxRQ0AIAAoAhwhBwsCQCAALQAoQQFxDQAgAC8B7BEgAEHuEWotAABBEHRyQQFxRQ0AIARB4AFqQQhqIgUgBygCvAEiAUEIaigCADYCACAEIAEpAgA3A+ABIARBkAFqIAdBlMXHgAAQuYGAgABBACEBAkAgBC0AnAFFDQAgBEHQAWpBCGogBEGQAWpBCGooAgA2AgAgBCAEKQKQATcD0AFBAiEBCyAEQaABakEIaiAFKAIANgIAIARBuAFqIARB0AFqQQhqKAIANgIAIARBADoAyAEgBCAEKQPgATcDoAEgBEEBOgCsASAEIAQpA9ABNwOwASAEIAE6AMwBIAQgAToAvAEgBEEAOgDAASAEQfABaiAEQaABahC0gYCAAAJAAkAgBC0A+AFFDQACQEEkRQ0AIARB/AFqIARBoAFqQST8CgAACyAEQQE6AKgCIAQgBCkD8AEiCDcCoAIgBCAIQjCIp0F/ajsBrAIgBEH8AWohAQwBCwJAQSRFDQAgBEH8AWogBEGgAWpBJPwKAAALIARBpgJqQgA3AQAgBEIANwKgAiAEQfwBaiEBCwJAQTRFDQAgBEHcAGogAUE0/AoAAAtBACEFQQEhCQJAAkADQCAFIQogDCELIAYhDSABIQ4CQANAIARBsAJqIARB3ABqELeBgIAAIAQtALwCRQ0DIAQoArgCIQUgBC8BtgIhDAJAIAQoArACIgEoAhggASgCEGogBC8BtAIiBkEDdGopAwBCJYinQQdxDgUBAgIABAELCyAJQQFxIQ9BACEJIA8NAQwDCwsgBSEKIAwhCyAGIQ0gASEODAELIAlBAXENAQsgBEEBOgCYAyAEQQE6AIADIAQgCjYC/AIgBCALOwH6AiAEIA07AfgCIAQgDjYC9AIgBEEAOgCcAyAEQQA6AJADIARBAToAlAMgBEGgA2ogBEH0AmoQtIGAgAACQAJAIAQtAKgDRQ0AAkBBJEUNACAEQawDaiAEQfQCakEk/AoAAAsgBEEBOgDYAyAEIAQpA6ADIgg3AtADIAQgCEIgiD0B3AMgBEGsA2ohAQwBCwJAQSRFDQAgBEGsA2ogBEH0AmpBJPwKAAALIARB1gNqQgA3AQAgBEIANwLQAyAEQawDaiEBCwJAQTRFDQAgBEHAAmogAUE0/AoAAAsDQCAEQeADaiAEQcACahC3gYCAACAELQDsA0UNASAEKALgAyIGKAIYIAYoAhAiAWogBC8B5ANBA3RqIgkoAgAgAWohECAGLwGsAiEPAkAgCSkDACIIQoCAgIDAAINQDQAgBkEsaiEOIA8hBSAQIQwgECEBA0ACQAJAIAVFDQAgASkDAEIDg0IBUg0BIAQgBigCOCAGKAIQIgpqNgLwAyAEQfQDaiAEQfADaiAMIAprEKGBgIAAIAQoAvQDIQsgDiAKIAogBCgC+AMiDSgCAGogDSgCBBCigYCAACAEQfADaiALEKOBgIAAIAEgASkDAEJ8gzcDAAwBCwJAAkAgDyAGLwGsAiIBRg0AIAFBAWohBSAJKAIAIAYoAhBqIQECQANAIAVBf2oiBUUNASABKQMAIQggAUEIaiEBIAhCA4NCAVENAwwACwsgCSAJKQMAQv////+/f4MiCDcDAAwECyAJIAkpAwBC/////79/gyIINwMADAMLIAkpAwAhCAwCCyAFQX9qIQUgDEEIaiEMIAFBCGohAQwACwsCQCAIQoCAgICAAoNQDQAgBkGoAWohCyAPIQUgECEMIBAhAQNAAkACQCAFRQ0AIAEtAAVBIHFFDQEgBCAGKAKkASAGKAIQIgpqNgKABCAEQYQEaiAEQYAEaiAMIAprEKSBgIAAIAQtAIwERQ0BIAsgCiAEKAKIBC8BABClgYCAACAEQYAEaiAEKAKEBBCmgYCAACABIAEpAwBC////////d4M3AwAMAQsCQAJAIA8gBi8BrAIiAUYNACABQQFqIQUgCSgCACAGKAIQaiEBAkADQCAFQX9qIgVFDQEgAS0ABSEMIAFBCGohASAMQSBxDQMMAAsLIAkgCSkDAEL//////32DIgg3AwAMBAsgCSAJKQMAQv//////fYMiCDcDAAwDCyAJKQMAIQgMAgsgBUF/aiEFIAxBCGohDCABQQhqIQEMAAsLAkAgCEKAgICAgAGDUA0AIAZBPGohCiAPIQEgECEFA0ACQAJAAkACQAJAIAFFDQAgBSkDAEIaiKciDEH//wNxDQEMBAsgDyAGLwGsAiIBRw0BDAILIAogBigCECAMEJOBgIAADAILIAFBAWohBSAJKAIAIAYoAhBqIQEDQCAFQX9qIgVFDQEgASgBAiEGIAFBCGohASAGQYD4/x9xDQQMAAsLIAkgCSkDAEL//////36DNwMADAILIAFBf2ohASAFQQhqIQUMAAsLIA9BA3QiAUUNACAQQQAgAfwLAAwACwsCQAJAIAAtAAFBAnFFDQAgByACIANBARDRgYCAACIBQf//A3FFDQEMAgsgByACIANBABDRgYCAACIBQf//A3ENAQsCQCAALQAkQQJxRQ0AIAAoAiAiAUUNACABIAIgA0EAENGBgIAAIgFB//8DcQ0BCyAAIAI7AfIRQQAhASAAQQA7AfgRIABBADsB9BEgACADOwHwESAAIAJBf2o7AfoRIAAgA0F/ajsB9hEgAEHuEWoiBSAFLQAAQQFyOgAACyAEQZAEaiSAgICAACABCx0AAkAgAEUNACAAIABBqBtqIAEgAhDZgYCAABoLCx8AIAAoAggoAhggASgCAEECdGpBwAJqIAEoAgQ2AgAL8gEBAn8gACgCGCIBQQE6AJgCIAEgACgCGC8ByAE7AZACIAEgACgCGC8BygE7AZICIAEgACgCGCICKQKYATcC1AEgAUHsAWogAkGwAWooAgA2AgAgAUHkAWogAkGoAWopAgA3AgAgAUHcAWogAkGgAWopAgA3AgAgASAAKAIYLQDSAUEBcToAlAIgASAAKAIYLQDRAUEBcToAlQIgASAAKAIAQQh2QQFxOgCWAiABIAAoAhgiACkCwAI3AvABIAFBiAJqIABB2AJqKQIANwIAIAFBgAJqIABB0AJqKQIANwIAIAFB+AFqIABByAJqKQIANwIAC60FAwd/BH4DfyOAgICAAEHgAGsiASSAgICAAAJAAkAgACgCGCICLQCYAkUNACACLwGQAiEDIAIvAZICIQQgAi0AlAIhBSACLQCVAiEGIAItAJYCIQcCQEE8RQ0AIAEgAkHUAWpBPPwKAAALQoACQgAgB0EBcRshCAwBC0EAIQUgAUEYakEANgIAQgAhCCABQRBqQgA3AwAgAUEIakIANwMAIAFBJGpBACkDmKfIgAA3AgAgAUEsakEAKQOgp8iAADcCACABQTRqQQApA6inyIAANwIAIAFCADcDACABQQApA5CnyIAANwIcQQAhBkEAIQNBACEECyACKQKYASEJIAIgASkDADcCmAEgAkGgAWoiBykCACEKIAcgAUEIaikDADcCACACQagBaiIHKQIAIQsgByABQRBqKQMANwIAIAJBsAFqIgIoAgAhByACIAFBGGooAgA2AgAgAUHAAGpBGGoiDCAHNgIAIAFBwABqQRBqIg0gCzcDACABQcAAakEIaiIOIAo3AwAgASAJNwNAIAAoAhgQkoGAgAAhByAAKAIYIQICQAJAIAdB//8DcUUNACACIAEpA0A3ApgBIAJBsAFqIAwoAgA2AgAgAkGoAWogDSkDADcCACACQaABaiAOKQMANwIADAELIAIgASkCHDcCwAIgAkHYAmogAUE0aikCADcCACACQdACaiABQSxqKQIANwIAIAJByAJqIAFBJGopAgA3AgAgACAANQIAQv/9//8PgyAIhD4CACAAKAIYIAZBAXE6ANEBIAAoAhggBUEBcToA0gEgACgCGCADQf//A3EiAiAALwHyEUF/akH//wNxIgMgAiADSRsgBEH//wNxIgIgAC8B8BFBf2pB//8DcSIAIAIgAEkbEN6BgIAACyABQeAAaiSAgICAACAHC6sIAwd/AX4BfyOAgICAAEGAAWsiAySAgICAAAJAAkACQAJAIAJB//8DcSIEIAAvAcoBIgVPDQAgA0EMaiAAKAK8ASIGIAUgAmtB//8DcRDfgYCAACADLQAcDQIgA0EgakEIaiADQQxqQQhqKAIANgIAIAMgAykCDDcDICADQSBqIQUMAQsgACgCvAEhBgJAIAQgBUsNACAGIQUMAwsgA0E0aiAGIAIgBWtB//8DcRDPgYCAACADLQBEDQEgA0HIAGpBCGogA0E0akEIaigCADYCACADIAMpAjQ3A0ggA0HIAGohBQsgBUEBOgAMDAELQazNx4AAIQULIAUoAgghByAFLwEEIQQgBSgCACEFIAAgAjsBygEgACABOwHIAQJAAkACQAJAAkAgBSAGKAIARw0AIAYvAQRB//8DcSAERw0AIAYvAQYgAUH//wNxRg0BCyAAKALAASIGIAYpAwBCgICAgIDAAIQ3AwAgBSgCGCAFKAIQaiAEQQN0aiIGIAYpAwBCgICAgIDAAIQ3AwAgACgCvAEiBigCACAFRg0AIABBmAFqIQIgAC8BzAENAUHMp8iAACEIQbCnyIAAIQkMAgsgBiAHNgIIIAYgATsBBiAGIAQ7AQQgBiAFNgIADAILIANB9ABqIQggAikCACEKIAJCADcDACADQdgAakEYaiACQRhqIgYoAgA2AgAgA0HYAGpBEGogAkEQaiIJKQIANwMAIANB2ABqQQhqIAJBCGoiCykCADcDACALQgA3AwAgCUIANwMAIAZBADYCACADQQE6AHQgAyAKNwNYIAAQkoGAgAAaIAAoArwBIQYgA0HYAGohCQsCQCAAKAK4AUUNACAGKAIAIgZBqAFqIAYoAhAgAC8BzgEQpYGAgAAgACgCvAEhBgsgBiAHNgIIIAYgATsBBiAGIAQ7AQQgBiAFNgIAAkAgCC0AAEUNACACIAkpAgA3AgAgAkEYaiIGIAlBGGooAgA2AgAgAkEQaiIFIAlBEGopAgA3AgAgAkEIaiIBIAlBCGopAgA3AgAgABCSgYCAACIEQf//A3FFDQAgAyAEOwF8IANB/ABqEOCBgIAAIAZBADYCACAFQgA3AwAgAUIANwMAIAJCADcDACAAQQA7AcwBCyAAKAK4ASIGRQ0AIABBADYCuAEgAEEAOwHOAQJAIAAgBigCDCAGKAIQQQAgBigCACAGLQAIQQFxIgUbQQAgBigCBCAFGxDTgYCAACIFQf//A3FFDQAgAyAFOwF+IANB/gBqEOGBgIAACyAGIABBkAFqIgUQnYGAgAAgBSAGEJ6BgIAACyAAKAK8ASIGKAIAIgUoAhggBSgCECIFaiAGLwEEQQN0aiICKAIAIQEgBi8BBiEGIAAgAjYCwAEgACABIAVqIAZBA3RqNgLEASADQYABaiSAgICAAAvSAQECfwJAIAIgAS8BBCIDSw0AIABBADoAECAAQQA6AAggACADIAJrOwEEIAAgASgCADYCACAAIAEvAQY7AQYPCyACIANrIQIgASgCACEEAkADQCAEKAIIIgNFDQECQCACIAMvAa4CIgRLDQAgACADNgIAIABBADoAECAAQQA6AAggACAEIAJrOwEEIAAgAS8BBjsBBg8LIAIgBGshAiADIQQMAAsLIABBADsBBCAAIAQ2AgAgAEEBOgAQIAAgAjYCDCAAQQA6AAggACABLwEGOwEGC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABDtgYCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBPRCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQ7YGAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABDugYCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBwQAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEO6BgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsg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gYCAAAJAAkAgAi0AFEUNAEEAIQQMAQsgAigCDCEEIAIvAQohBSACLwEIIQYgAigCBCEBCwJAAkACQAJAAkAgAygCACABRw0AIAMvAQRB//8DcSAGQf//A3FHDQAgAy8BBiAFQf//A3FGDQELIAAoAsABIgMgAykDAEKAgICAgMAAhDcDACABKAIYIAEoAhBqIAZB//8DcUEDdGoiAyADKQMAQoCAgICAwACENwMAIAAoArwBIgMoAgAgAUYNACAAQZgBaiEHIAAvAcwBDQFBzKfIgAAhCEGwp8iAACEJDAILIAMgBDYCCCADIAU7AQYgAyAGOwEEIAMgATYCAAwCCyACQTRqIQggBykCACEKIAdCADcDACACQRhqQRhqIAdBGGoiAygCADYCACACQRhqQRBqIAdBEGoiCSkCADcDACACQRhqQQhqIAdBCGoiCykCADcDACALQgA3AwAgCUIANwMAIANBADYCACACQQE6ADQgAiAKNwMYIAAQkoGAgAAaIAAoArwBIQMgAkEYaiEJCwJAIAAoArgBRQ0AIAMoAgAiA0GoAWogAygCECAALwHOARClgYCAACAAKAK8ASEDCyADIAQ2AgggAyAFOwEGIAMgBjsBBCADIAE2AgACQCAILQAARQ0AIAcgCSkCADcCACAHQRhqIgMgCUEYaigCADYCACAHQRBqIgQgCUEQaikCADcCACAHQQhqIgggCUEIaikCADcCACAAEJKBgIAAIglB//8DcUUNACACIAk7ATwgAkE8ahDggYCAACADQQA2AgAgBEIANwMAIAhCADcDACAHQgA3AwAgAEEAOwHMAQsgACgCuAEiA0UNACAAQQA2ArgBIABBADsBzgECQCAAIAMoAgwgAygCEEEAIAMoAgAgAy0ACEEBcSIHG0EAIAMoAgQgBxsQ04GAgAAiB0H//wNxRQ0AIAIgBzsBPiACQT5qEOGBgIAACyADIABBkAFqIgcQnYGAgAAgByADEJ6BgIAACyABKAIYIAEoAhAiA2ogBkH//wNxQQN0aiIBKAIAIQYgACABNgLAASAAIAYgA2ogBUH//wNxQQN0ajYCxAEgAkHAAGokgICAgAALgQEBA38jgICAgABBEGsiAiSAgICAACACIAAoAiggACgCACIDajYCACACQQRqIAIgASADaxChgYCAACACKAIEIQQgAEEcaiADIAMgAigCCCIAKAIAaiAAKAIEEKKBgIAAIAIgBBCjgYCAACABIAEpAwBCfIM3AwAgAkEQaiSAgICAAAuGAQECfyOAgICAAEEQayICJICAgIAAIAIgACgClAEgACgCACIDajYCACACQQRqIAIgASADaxCkgYCAAAJAIAItAAxFDQAgAEGYAWogAyACKAIILwEAEKWBgIAAIAIgAigCBBCmgYCAACABIAEpAwBC////////d4M3AwALIAJBEGokgICAgAALjQEBAX8gAS8BCCABQQpqLQAAQRB0ciECAkACQAJAIAEtAAwOAwABAgALIABCADcDACAAQQhqQgA3AwAPCyAAQQE6AAggACAAKQMAQoD4/x+DIAJBAnRB/AdxQQJyrYQ3AwAPCyAAQQE6AAggACACQYCA/AdxQRB2rUIShiACQQJ0Qfz/D3FBA3KthDcDAAsxAQF/AkAgAEH07MmAAEE7EJqAgIAAIgJB//8DcQ0AIAAgAS8BABCnhICAACECCyACCzEBAX8CQCAAQa/tyYAAQT8QmoCAgAAiAkH//wNxDQAgACABLwEAEKeEgIAAIQILIAILvAkDCX8BfgF/I4CAgIAAQcAAayIBJICAgIAAIAFBBGogACgCvAEiAkEBEM+BgIAAAkACQCABLQAURQ0AQQAhAwwBCyABKAIMIQMgAS8BCiEEIAEvAQghBSABKAIEIQYLAkACQAJAAkACQCACKAIAIAZHDQAgAi8BBEH//wNxIAVB//8DcUcNACACLwEGIARB//8DcUYNAQsgACgCwAEiAiACKQMAQoCAgICAwACENwMAIAYoAhggBigCEGogBUH//wNxQQN0aiICIAIpAwBCgICAgIDAAIQ3AwAgACgCvAEiAigCACAGRg0AIABBmAFqIQcgAC8BzAENAUHMp8iAACEIQbCnyIAAIQkMAgsgAiADNgIIIAIgBDsBBiACIAU7AQQgAiAGNgIADAILIAFBNGohCCAHKQIAIQogB0IANwMAIAFBGGpBGGogB0EYaiICKAIANgIAIAFBGGpBEGogB0EQaiIJKQIANwMAIAFBGGpBCGogB0EIaiILKQIANwMAIAtCADcDACAJQgA3AwAgAkEANgIAIAFBAToANCABIAo3AxggABCSgYCAABogACgCvAEhAiABQRhqIQkLAkAgACgCuAFFDQAgAigCACICQagBaiACKAIQIAAvAc4BEKWBgIAAIAAoArwBIQILIAIgAzYCCCACIAQ7AQYgAiAFOwEEIAIgBjYCAAJAIAgtAABFDQAgByAJKQIANwIAIAdBGGoiAiAJQRhqKAIANgIAIAdBEGoiBiAJQRBqKQIANwIAIAdBCGoiBSAJQQhqKQIANwIAIAAQkoGAgAAiBEH//wNxRQ0AIAEgBDsBPCABQTxqEOCBgIAAIAJBADYCACAGQgA3AwAgBUIANwMAIAdCADcDACAAQQA7AcwBCyAAKAK4ASICRQ0AIABBADYCuAEgAEEAOwHOAQJAIAAgAigCDCACKAIQQQAgAigCACACLQAIQQFxIgYbQQAgAigCBCAGGxDTgYCAACIGQf//A3FFDQAgASAGOwE+IAFBPmoQ4YGAgAALIAIgAEGQAWoiBhCdgYCAACAGIAIQnoGAgAALIABB2ABqIQYCQAJAA0AgBigCACICIAAoArwBIgYoAgBGDQEgAigCGCACKAIQaiIGIAIvAa4CQQN0QXhqIgdqKQMAIQogAigCCCIFKAIQIQQgBSgCGCEDAkAgB0UNACAGQQhqIAYgB/wKAAALIAYgCjcDACACQRBqIAVBEGogBiADIARqIAUvAa4CQX9qQf//A3FBA3RqQQAgAi8BrAIQoIGAgAAiBkH//wNxDQIgAkEIaiEGIAJBAToAsAIMAAsLIAIoAhggAigCEGoiByAGLwEEIgVBA3RqIgYgAi8BrgIgBUF/c2pBA3QiBWopAwAhCgJAIAVFDQAgBkEIaiAGIAX8CgAACyAGIAo3AwAgACACQRBqIAcgACgCvAEvAQRBA3RqIgYgBigCACACKAIQaiACLwGsAhDogYCAACACQQE6ALACIAAoArwBIgIoAgAiBigCGCAGKAIQIgZqIAIvAQRBA3RqIgUoAgAhByACLwEGIQIgACAFNgLAASAAIAcgBmogAkEDdGo2AsQBQQAhBgsgAUHAAGokgICAgAAgBguxPgMJfwF+B38jgICAgABBsBFrIgEkgICAgABBACECIAAoAhhBADoA0QECQAJAAkAgACgCGCIDLwHKASIEIAAvAfQRIgVJDQAgBCAALwH2ESIGTQ0BCyAEIAAvAfARQX9qQf//A3FPDQEgA0EBEOmBgIAADAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQgBkcNACADLwHIASICIAAvAfgRIgdJDQAgAiAALwH6ESIISw0AIAcgBXINAiAIIAAvAfIRQX9qIgJB//8DcUcNAyADKALAASIAIAApAwBCgICAgIDAAIQ3AwAgA0GYAWohCCADLwHKASADLwGKASIAQX9qQf//A3FHDQggAy0A4AJFDQkgAygCvAEhBCAAQf//A3FBAUcNASADIAQoAgAiAEEQaiADKALAASIEIAQoAgAgACgCEGogAC8BrAIQ6IGAgAAgAygCwAEiACAAKQMAQoCAgICAwACENwMADAsLQQAhAiAEIAZPDQsgA0EBEOmBgIAADAsLIAFBwABqQQhqIARBCGooAgA2AgAgASAEKQIANwNAIAFBkBFqIANBlMXHgAAQuYGAgAAgASgCkBEiAigCGCACKAIQaiIGIAEvAZQRIglBA3RqIgApAwAhCgJAIAIvAa4CIAlBf3NqQQN0IgRFDQAgACAAQQhqIAT8CgAACyAAIARqIAo3AwAgAygCdEUNCCADKAJwIQAgAygCbCEEA0AgAEUNCQJAIAQoAgAiBSgCACACRw0AIAUvAQQiByAJTQ0AIAUgB0F/ajsBBAsgAEF/aiEAIARBBGohBAwACwsgBw0BIAAvAfIRQX9qIQILIAggAkH//wNxRw0AIAMvAcwBRQ0BIAFBCGogA0GYAWoQ7IGAgAAgAS0AEEUNASABKQMIUA0BCyAAQQEQ8YGAgAAMAQsgAUEAOgAgIAFBADsBHCABIAU2AhggAUH4AGogAyABQRhqELmBgIAAIAEoAngiBigCGCAGKAIQIgJqIgkgAS8BfCILQQN0aiEMAkACQCAEIAVrQf//A3EiDSAGLwGuAiIFIAtrQf//A3FPDQAgDCgCACACaiEOIAYvAawCIQ8CQCAMKQMAIgpCgICAgMAAg1ANACAGQSxqIRAgDyEFIA4hByAOIQIDQAJAAkAgBUUNACACKQMAQgODQgFSDQEgASAGKAI4IAYoAhAiCGo2AjwgAUHAAGogAUE8aiAHIAhrEKGBgIAAIAEoAkAhCSAQIAggCCABKAJEIhEoAgBqIBEoAgQQooGAgAAgAUE8aiAJEKOBgIAAIAIgAikDAEJ8gzcDAAwBCwJAAkAgDyAGLwGsAiICRg0AIAJBAWohBSAMKAIAIAYoAhBqIQICQANAIAVBf2oiBUUNASACKQMAIQogAkEIaiECIApCA4NCAVENAwwACwsgDCAMKQMAQv////+/f4MiCjcDAAwECyAMIAwpAwBC/////79/gyIKNwMADAMLIAwpAwAhCgwCCyAFQX9qIQUgB0EIaiEHIAJBCGohAgwACwsCQCAKQoCAgICAAoNQDQAgBkGoAWohCSAPIQUgDiEHIA4hAgNAAkACQCAFRQ0AIAItAAVBIHFFDQEgASAGKAKkASAGKAIQIghqNgJMIAFB0ABqIAFBzABqIAcgCGsQpIGAgAAgAS0AWEUNASAJIAggASgCVC8BABClgYCAACABQcwAaiABKAJQEKaBgIAAIAIgAikDAEL///////93gzcDAAwBCwJAAkAgDyAGLwGsAiICRg0AIAJBAWohBSAMKAIAIAYoAhBqIQICQANAIAVBf2oiBUUNASACLQAFIQcgAkEIaiECIAdBIHENAwwACwsgDCAMKQMAQv//////fYMiCjcDAAwECyAMIAwpAwBC//////99gyIKNwMADAMLIAwpAwAhCgwCCyAFQX9qIQUgB0EIaiEHIAJBCGohAgwACwsCQCAKQoCAgICAAYNQDQAgBkE8aiEIIA8hAiAOIQUDQAJAAkACQAJAAkAgAkUNACAFKQMAQhqIpyIHQf//A3ENAQwECyAPIAYvAawCIgJHDQEMAgsgCCAGKAIQIAcQk4GAgAAMAgsgAkEBaiEFIAwoAgAgBigCEGohAgNAIAVBf2oiBUUNASACKAECIQcgAkEIaiECIAdBgPj/H3ENBAwACwsgDCAMKQMAQv//////foM3AwAMAgsgAkF/aiECIAVBCGohBQwACwsCQCAPQQN0IgJFDQAgDkEAIAL8CwALIAwpAwAhCgJAIA1BA3QiAkUNACAMIAxBCGogAvwKAAALIAwgAmogCjcDACAGQQE6ALACAkAgAy0AjQFBAkcNACADLQCEAUUNACADKAJ8IgIoAgAgBkcNACACLwEEIgJFDQAgAiALSQ0AIAsgDWogAkkNACADIAMoAoABQX9qNgKAAQsgAygCdEUNASALIA1qIQggAygCcCECIAMoAmwhBQNAIAJFDQICQCAFKAIAIgMoAgAgBkcNACADLwEEIgcgC0kNACAIIAdJDQACQCAHDQAgA0EAOwEGDAELIAMgB0F/ajsBBAsgAkF/aiECIAVBBGohBQwACwsgDCkDACEK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mBEgAUHAv8eAADYCkBEgASABQfgAajYClBECQAJAAkAgAUGQEWogAUEmahDygYCAACIEQf//A3FFDQAgAUGQEWpBsOnJgABBLRCogICAACABLwGoEQ0CIAFB+BBqQRBqIAFBkBFqQRBqKQIANwMAIAFB+BBqQQhqIgIgAUGQEWpBCGopAgA3AwAgASABKQKQETcD+BACQCACIAFBJmoQ8oGAgABB//8DcUUNACABQfgQahCpgICAAAwDCyABQShqIAFB+BBqEKqAgIAAIAFB+BBqEKmAgIAAIAEvATANAiABKAIsIQUgASgCKCECDAELIAEoApQRIQIgASgCnBEhBQsgAiAFEICAgIAAIARB//8DcUUNAEGw6cmAACACIAUQtoCAgAALIAAoAhgiBEIANwKYAUEAIQIgBEGwAWpBADYCACAEQagBakIANwIAIARBoAFqQgA3AgAgACgCGBCSgYCAABoMBAsgAUEoaiADELGBgIAAIAEvASwiAg0DAkACQCABKAIoRQ0AIAMQ74GAgAAiAkH//wNxRQ0BDAULAkAgAygCvAEiACgCACADKAJYRw0AIAFB+ABqIABBARDPgYCAAEGszceAACEEAkAgAS0AiAENACABQfgQakEIaiABQfgAakEIaigCADYCACABIAEpAng3A/gQIAFB+BBqIQQLIAAgBCkCADcCACAAQQhqIARBCGooAgA2AgAgAygCvAEiBCgCACIAKAIYIAAoAhBqIAQvAQQiAkEDdGoiBCAALwGuAiACQX9zakEDdCICaikDACEKAkAgAkUNACAEQQhqIAQgAvwKAAALIAQgCjcDACAAQQE6ALACIAMoArwBIgAoAgAiBCgCGCAEKAIQIgRqIAAvAQRBA3RqIgIoAgAhBSAALwEGIQAgAyACNgLAASADIAUgBGogAEEDdGo2AsQBDAELIAMQ74GAgAAiAkH//wNxDQQLQQAhAiADLwHMAUUNAyABQZARaiAIEOyBgIAAIAEtAJgRRQ0DIAMvAYgBQQN0IQAgAygCxAEgAy8ByAFBA3RrIQQgASkDkBEhCgNAIABFDQQgBCAKNwMAIABBeGohACAEQQhqIQQMAAsLIAMoArwBKAIAIQQgAUHgAGogAxCxgYCAACABLwFkIgINAgJAAkAgBCADKAK8ASIAKAIAIgdGDQAgAUHQAGpBBmohBCABQdAAakEEaiEFIAFB0ABqQQhqIABBCGooAgA2AgAgASAAKQIANwNQIAEgAy8ByAE7AVYgAUHQAGohAgwBCyABQZARaiAAQQEQz4GAgAACQCABLQCgEUUNAEGszceAACECQbLNx4AAIQRBsM3HgAAhBQwBCyABQShqQQZqIQQgAUEoakEEaiEFIAFBKGpBCGogAUGQEWpBCGooAgA2AgAgASABKQKQETcDKCABQShqIQILIAQvAQAhBiAFLwEAIQUCQAJAAkACQAJAIAcgAigCACIERw0AIAAvAQQgBUcNACAALwEGQf//A3EgBkYNAQsgAygCwAEiACAAKQMAQoCAgICAwACENwMAIAQoAhggBCgCEGogBUEDdGoiACAAKQMAQoCAgICAwACENwMAIAMoArwBIgAoAgAgAigCAEYNACADLwHMAQ0BQcynyIAAIQlBsKfIgAAhBwwCCyAAIAIpAgA3AgAgAEEIaiACQQhqKAIANgIADAILIAFBlAFqIQkgCCkCACEKIAhCADcDACABQfgAakEYaiAIQRhqIgAoAgA2AgAgAUH4AGpBEGogCEEQaiIHKQIANwMAIAFB+ABqQQhqIAhBCGoiCykCADcDACALQgA3AwAgB0IANwMAIABBADYCACABQQE6AJQBIAEgCjcDeCADEJKBgIAAGiADKAK8ASEAIAFB+ABqIQcLAkAgAygCuAFFDQAgACgCACIAQagBaiAAKAIQIAMvAc4BEKWBgIAAIAMoArwBIQALIAAgAikCADcCACAAQQhqIAJBCGooAgA2AgACQCAJLQAARQ0AIAggBykCADcCACAIQRhqIgAgB0EYaigCADYCACAIQRBqIgIgB0EQaikCADcCACAIQQhqIAdBCGopAgA3AgAgAxCSgYCAACIHQf//A3FFDQAgASAHOwF0IAFB9ABqEOCBgIAAIABBADYCACACQgA3AwAgCEEIakIANwMAIAhCADcDACADQQA7AcwBCyADKAK4ASIARQ0AIANBADYCuAEgA0EAOwHOAQJAIAMgACgCDCAAKAIQQQAgACgCACAALQAIQQFxIgIbQQAgACgCBCACGxDTgYCAACICQf//A3FFDQAgASACOwFAIAFBwABqEOGBgIAACyAAIANBkAFqIgIQnYGAgAAgAiAAEJ6BgIAACyAEKAIYIAQoAhAiAmogBUEDdGoiACgCACEFIAMgADYCwAEgAyAFIAJqIAZBA3RqNgLEASAAIAApAwBCgICAgIDAAIQ3AwAgAy0ApAFFDQEgAyAEQRBqIAMoAsABIgAgACgCACAEKAIQaiAELwGsAhDogYCAAAwBCyADQQEQ2IGAgAAgAkEBOgCwAgJAA0AgAigCDCIFRQ0BIAJBEGogBUEQaiAGIAIvAa4CQX9qQf//A3FBA3RqIAUoAhggBSgCEGoiB0EAIAIvAawCEKCBgIAAIgJB//8DcQ0DIAcpAwAhCgJAIAUvAa4CQQN0QXhqIgBFDQAgByAHQQhqIAD8CgAACyAHIABqIAo3AwAgBUEBOgCwAiADKAJwIQAgAygCbCEEIAchBiAFIQIgAygCdEUNAANAAkAgAA0AIAchBiAFIQIMAgsCQCAEKAIAIgIoAgAgBUcNAAJAIAIvAQQiBg0AIAIgBSgCCCIGNgIAIAYvAa4CIQYLIAIgBkF/ajsBBAsgAEF/aiEAIARBBGohBAwACwsLIAYgAi8BrgJBf2pB//8DcUEDdGoiDSgCACACKAIQaiEMIAIvAawCIRECQCANKQMAIgpCgICAgMAAg1ANACACQSxqIQsgESEEIAwhBSAMIQADQAJAAkAgBEUNACAAKQMAQgODQgFSDQEgASACKAI4IAIoAhAiBmo2AnAgAUHgAGogAUHwAGogBSAGaxChgYCAACABKAJgIQYgCyACKAIQIgcgByABKAJkIgkoAgBqIAkoAgQQooGAgAAgAUHwAGogBhCjgYCAACAAIAApAwBCfIM3AwAMAQsCQAJAIBEgAi8BrAIiAEYNACAAQQFqIQQgDSgCACACKAIQaiEAAkADQCAEQX9qIgRFDQEgACkDACEKIABBCGohACAKQgODQgFRDQMMAAsLIA0gDSkDAEL/////v3+DIgo3AwAMBAsgDSANKQMAQv////+/f4MiCjcDAAwDCyANKQMAIQoMAgsgBEF/aiEEIAVBCGohBSAAQQhqIQAMAAsLAkAgCkKAgICAgAKDUA0AIAJBqAFqIQcgESEEIAwhBSAMIQADQAJAAkAgBEUNACAALQAFQSBxRQ0BIAEgAigCpAEgAigCECIGajYCdCABQfgQaiABQfQAaiAFIAZrEKSBgIAAIAEtAIARRQ0BIAcgAigCECABKAL8EC8BABClgYCAACABQfQAaiABKAL4EBCmgYCAACAAIAApAwBC////////d4M3AwAMAQsCQAJAIBEgAi8BrAIiAEYNACAAQQFqIQQgDSgCACACKAIQaiEAAkADQCAEQX9qIgRFDQEgAC0ABSEFIABBCGohACAFQSBxDQMMAAsLIA0gDSkDAEL//////32DIgo3AwAMBAsgDSANKQMAQv//////fYMiCjcDAAwDCyANKQMAIQoMAgsgBEF/aiEEIAVBCGohBSAAQQhqIQAMAAsLAkAgCkKAgICAgAGDUA0AIAJBPGohBiARIQAgDCEEA0ACQAJAAkACQAJAIABFDQAgBCkDAEIaiKciBUH//wNxDQEMBAsgESACLwGsAiIARw0BDAILIAYgAigCECAFEJOBgIAADAILIABBAWohBCANKAIAIAIoAhBqIQADQCAEQX9qIgRFDQEgACgBAiECIABBCGohACACQYD4/x9xRQ0ADAQLCyANIA0pAwBC//////9+gzcDAAwCCyAAQX9qIQAgBEEIaiEEDAALCwJAIBFBA3QiAEUNACAMQQAgAPwLAAsgAygCvAEiACABKQNANwIAIABBCGogAUHAAGpBCGooAgA2AgAgAygCvAEiACgCACIEKAIYIAQoAhAiBGogAC8BBEEDdGoiAigCACEFIAAvAQYhACADIAI2AsABIAMgBSAEaiAAQQN0ajYCxAELQQAhAiADLwHMAUUNACABQfgQaiAIEOyBgIAAIAEtAIARRQ0AIAMvAYgBQQN0IQAgAygCxAEgAy8ByAFBA3RrIQQgASkD+BAhCgNAIABFDQEgBCAKNwMAIABBeGohACAEQQhqIQQMAAsLIAFBsBFqJICAgIAAIAILXAEEfyAAKAIYIgItANEBIQMgAi8BygEhBCACLwHIASEFIAIgAC8B+BEgAC8B9BEQ3oGAgAAgACABEPOBgIAAIAAoAhggBSAEEN6BgIAAIAAoAhggA0EBcToA0QELMQEBfwJAIABB7u3JgABBKxCagICAACICQf//A3ENACAAIAEvAQAQp4SAgAAhAgsgAguECQMPfwF+AX8jgICAgABBwAFrIgIkgICAgAACQCABRQ0AIAAoAhgiAy8BygEiBCAALwH0EUkNACAALwH2ESIFIARJDQAgAy8ByAEiBiAALwH4ESIHSQ0AIAYgAC8B+hEiCEsNAEEAIQkCQCAHDQAgCCAALwHyEUF/akH//wNxTyEJCyACIAMgAygCvAEQhIGAgAACQAJAIAIvAQQiAw0AIAUgBGtBAWoiAyABIANB//8DcSIKIAEgCkkbIgtrQf//A3EhDCACQSBqQQhqIQ0gAkGAAWpBEGohDkEAIQ8gAigCACEBDAELIAIgAzsBCiACQQpqELCCgIAAAAsDQCAPIAxJIRACQAJAAkADQCAPIApPDQMgASgCACIDKAIYIAMoAhBqIAEvAQRBA3RqIgMgAykDACIRQoCAgICAwACENwMAAkACQAJAIBBFDQAgAkEMaiABIAsQz4GAgAAgAigCDCIGKAIQIQUgBigCGCEHIAIvARAhCCAAIAEoAgBBEGogAxCtgoCAACAAIAZBEGoiEiAHIAVqIAhBA3RqIgUQrYKAgAAgCUUNASAFIAUpAwBC/////2+DNwMAIAMgAykDAEL/////b4M3AwAgBSAFKQMAQv////9fgzcDACADIAMpAwBC/////1+DIhE3AwAgBiABKAIAIgdHDQIgAyAFKQMANwMAIAUgETcDACADIAMpAwBCgICAgIDAAIQ3AwAMBQsgACgCGCABKAIAIgVBEGogAyARpyAFKAIQaiAALwH4ESIFQQN0aiAALwH6EUEBakH//wNxIAVrEOiBgIAADAQLIAYgASgCACIHRg0CCyAHQRBqIBIgAyAFIAAvAfgRIAAvAfoRQQFqQf//A3EQoIGAgABB//8DcSIGRQ0CIAEoAgAhA0G8zceAACEFAkACQAJAAkACQCAGQWVqDggABAECBAIDAwALIA1CADcCACANQQhqQgA3AgAgDUEQakIANwIAIAJBAToAJCACIAMoApgCQQF0NgIgIAJBIGohBQwDCyACQcAAakEIakIANwMAIAJBwABqQRBqQgA3AwAgAkIANwNAIAJBAToAXCACIAMoAqQCQQF0NgJYIAJBwABqIQUMAgsgAkHgAGpBCGpCADcDACACQgA3A2AgAkIANwN4IAJBAToAdCACIAMoApwCQQF0NgJwIAJB4ABqIQUMAQsgDkIANwMAIA5BCGpCADcDACACQgA3A4ABIAJBAToAjAEgAiADKAKgAkEBdDYCiAEgAkGAAWohBQsgAkGkAWogACgCGCADIAUQloGAgAACQCACLwGoAQ4CAQAACwsACyAHQRBqIAUgAC8B+BEiBiADIAYgAC8B+hEg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BCgCGCAEKAIQaiADLwGEAkEDdGopAwBCJYinQQdxDgUBAAAAAgELCyAAKAIYIgQQi4KAgABB//8DcQ0AIAQQn4GAgAALIAAoAhhBlMXHgABBnNTHgAAgARDmgYCAACAAKAIYQQA6ANEBIABB7hFqIgAgAC0AAEEBcjoAAAwBCyAEEJ+BgIAAIAAoAhhBADoA0QELIANBsAJqJICAgIAAC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCOgoCAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBwAAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEI6CgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAu3AQECfyOAgICAAEEQayICJICAgIAAAkAgAEHp8smAAEE9EJqAgIAAIgNB//8DcQ0AIAEtAAAhAyACQe7qwIAANgIAIAJBATYCBCACQQlBByADQQFxIgMbNgIMIAJB4azAgABB3JPAgAAgAxs2AgggACACEKmEgIAAIgNB//8DcQ0AIABBpvPJgABBBRCagICAACIDQf//A3ENACAAIAEvAQIQp4SAgAAhAwsgAkEQaiSAgICAACADC6YCAgp/AX4jgICAgABBEGsiASSAgICAACAAKAJYIQJBACEDAkADQCACKAIYIAIoAhAiBGogAi8BrgIiBUEDdGohBiADIAVqIQdBACEIAkADQAJAAkAgCCAFRg0AIAAvAYgBQQFqIQkgBiAIQX9zQQN0aigCACAEaiEKA0AgCUF/aiIJRQ0CIAopAwAhCyAKQQhqIQogC0L+//+DgIADg1ANAAsgAC8BigEgA2shCgwFCyAHIQMgAigCCCICDQMMAgsgAyAALwGKAU8NASAIQQFqIQggA0EBaiEDDAALCwtBACEKCyAKQQFqIQoCQANAAkAgCkF/aiIKDQBBACEJDAILIAFBCGogABCxgYCAACABLwEMIglFDQALCyABQRBqJICAgIAAIAkLyQIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEISEgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEHDABCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQhISAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC6cFAQR/I4CAgIAAQdAQayIDJICAgIAAAkACQAJAAkACQAJAAkACQAJAAkACQCABQf8BcQ4DAQACAwsgACgCGCIBLwHIASABKALEASkDAEKAgICAgIADg0KAgICAgIABUWpBAWohBAwHCyAAKAIYIgQvAcgBIgENAkEAIQEMAwsgAC8B8hEhBAwFCyADIAE6AA8gA0KAEDcCsBAgA0HAv8eAADYCqBAgAyADQRBqNgKsECADQagQaiADQQ9qEKqCgIAAIgBB//8DcUUNAiADQagQakGw6cmAAEEyEKiAgIAAIAMvAcAQDQYgA0GQEGpBEGogA0GoEGpBEGopAgA3AwAgA0GQEGpBCGoiASADQagQakEIaikCADcDACADIAMpAqgQNwOQEAJAIAEgA0EPahCqgoCAAEH//wNxRQ0AIANBkBBqEKmAgIAADAcLIANBxBBqIANBkBBqEKqAgIAAIANBkBBqEKmAgIAAIAMvAcwQDQYgAygCyBAhBCADKALEECEBDAMLIAEgBCgCxAEpAwBCgICAgICAA4NCgICAgICAAlFrQf//A3EhAQsgBBCrgoCAACAALwHyESEEDAMLIAMoAqwQIQEgAygCtBAhBAsgASAEEICAgIAAIABB//8DcUUNAkGw6cmAACABIAQQtoCA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AkEBdDYCiAEgAkHwAGohBQwCCyACQZABakEIakIANwMAIAJCADcDkAEgAkIANwOoASACQQE6AKQBIAIgAygCnAJBAXQ2AqABIAJBkAFqIQUMAQsgC0IANwMAIAtBCGpCADcDACACQgA3A7ABIAJBAToAvAEgAiADKAKgAkEBdDYCuAEgAkGwAWohBQsgAkHUAWogACgCGCADIAUQloGAgAACQCACLwHYAQ4CBAAACwALIA1BEGogBSAALwH4ESIGIAMgBiAALwH6ESAGa0EBakH//wNxEK6CgIAADAELIAAoAhggARDOgYCAACAAKAIYIAAvAfgRIAQQ3oGAgAAgACgCGEEAOgDRAQwDCyACQdwBaiABQQEQ34GAgAAgB0F/aiEHIAItAOwBDQAgASACKQLcATcCACABQQhqIAJB3AFqQQhqKAIANgIADAALCyACIAM7ATogAkE6ahCvgoCAAAALIAJB8AFqJICAgIAAC6kEAwN/AX4DfyACKAIAIAEoAgBqIQMCQAJAIAAvAfoRIgQgAC8B8hFBf2pB//8DcUYNACAALwH4EUEBSw0BCyADIAEvAZwCQX9qQf//A3FBA3RqIgUpAwAiBkKAgICAgIADg0KAgICAgIADUg0AIAUgBkL///////98gzcDACAALwH6ESEECyADIARB//8DcUEDdGohBwJAIAMgAC8B+BEiBEEDdGoiCCkDAEKAgICAgIADg0KAgICAgIACUg0AAkAgAyAEQX9qQf//A3FBA3RqIgkpAwBCA4NCAVINACABIAkQ6oGAgAAgAS8BnAJBAWohBSACKAIAIAEoAgBqIQQCQANAIAVBf2oiBUUNASAEKQMAIQYgBEEIaiEEIAZCA4NCAVENAgwACwsgAiACKQMAQv////+/f4M3AwALIAkgCSkDAEKDgID8//98gzcDACAIIAgpAwBC////////fIM3AwALAkAgBykDACIGQoCAgICAgAODQoCAgICAgAFRDQAPCyADIAAvAfoRQQFqQf//A3FBA3RqIQACQCAGQgODQgFSDQAgASAHEOqBgIAAIAEvAZwCQQFqIQUgAigCACABKAIAaiEEAkADQCAFQX9qIgVFDQEgBCkDACEGIARBCGohBCAGQgODQgFRDQIMAAsLIAIgAikDAEL/////v3+DNwMACyAHIAcpAwBCg4CA/P//fIM3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QYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCGhICAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMhCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQhoSAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACw8AIAAoAghBABCygoCAAAviAwEDfyOAgICAAEHQEGsiAiSAgICAAAJAAkACQAJAIAFB/wFxDgQAAgIBAgsgACgCGC8ByAEiAUEHcSEDIAFBA3YhBAJAIAFB/wNLDQAgACAEaiIBIANB0KfIgABqLQAAIAEtADxzOgA8DAMLIAQgACgCNGpBQGoiASADQdCnyIAAai0AACABLQAAczoAAAwCCyAAQTBqQQAQiYGAgAAMAQsgAiABOgAPIAJCgBA3ArAQIAJBwL/HgAA2AqgQIAIgAkEQajYCrBACQAJAIAJBqBBqIAJBD2oQs4KAgAAiAUH//wNxRQ0AIAJBqBBqQbDpyYAAQTsQqICAgAAgAi8BwBANAiACQZAQakEQaiACQagQakEQaikCADcDACACQZAQakEIaiIAIAJBqBBqQQhqKQIANwMAIAIgAikCqBA3A5AQAkAgACACQQ9qELOCgIAAQf//A3FFDQAgAkGQEGoQqYCAgAAMAwsgAkHEEGogAkGQEGoQqoCAgAAgAkGQEGoQqYCAgAAgAi8BzBANAiACKALIECEDIAIoAsQQIQAMAQsgAigCrBAhACACKAK0ECEDCyAA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aiIDOgCcEQwCCyAALQCcESIDQRdLDQIgACADQQF0aiAALwGUETsB5BAgAC0AnBEhAwJAIAFB/wFxQTpHDQAgACAALwEQIABBEmoiBy0AAEEQdHJBASADQf8BcXRyIgk7ARAgByAJQRB2OgAACyAAQQA6AJ0RIABBADsBlBEgACADQQFqOgCcEQwCCyACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGoQvIKAgAAiA0H//wNxRQ0AIAJBqChqQbDpyYAAQSwQqICAgAAgAi8BwCgNAyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiIHIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgBxC8goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADAQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDQMgAigCyCghCSACKALEKCEHDAELIAIoAqwoIQcgAigCtCghCQsgByAJEICAgIAAIANB//8DcUUNAUGw6cmAACAHIAkQtoCAgAAMAQsgAkECOgCwASADQf8BcSEHIABB5BBqIQkgAEGXEWohCiAALwEQIABBEmotAABBEHRyIQMgAC0AmxEhCwJAAkAgAUH/AXFB7QBGDQAgA0H///8HcUUNACACIAM7AcQBIAJBxgFqIANBEHY6AAAgAiABOgDIASACIAc2AsABIAIgCTYCvAEgAiALNgK4ASACIAo2ArQBIAIgAi0AsAE6AOABIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkG0AWoQvYKAgAAiA0H//wNxDQAgAigCrCghByACKAK0KCEJDAILIAJBqChqQbDpyYAAQdUAEKiAgIAAIAIvAcAoDQIgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGoiByACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAcgAkG0AWoQvYKAgABB//8DcUUNACACQZAoahCpgICAAAwDCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0CIAIoAsgoIQkgAigCxCghBwwBCyACIAM7AfQBIAJB5AFqQRJqIANBEHY6AAAgAiABOgD4ASACIAc2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QbQUahC/goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADIwBCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA2LASACKALIKCEFIAIoAsQoIQQMhwELIAhFDYQBIAIgCDYC2AUgAiAENgLUBSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB1AVqEMCCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQyEAQsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNigEgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB1AVqEMCCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMiwELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDYoBIAIoAsgoIQUgAigCxCghBAyDAQsgCEUNgQEgAiAINgL4BSACIAQ2AvQFIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkH0BWoQwYKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDIEBCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA2JASACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH0BWoQwYKAgABB//8DcUUNACACQZAoahCpgICAAAyKAQsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNiQEgAigCyCghBSACKALEKCEEDIABCyAIRQ19IAIgCDYCnAYgAiAENgKYBiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBmAZqEMKCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQx9CyACQagoakGw6cmAAEHFABCogICAACACLwHAKA2IASACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGYBmoQwoKAgABB//8DcUUNACACQZAo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gQELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDYABIAIoAsgoIQUgAigCxCghBAxmCyAIRQ1kIAIgCDYC4AggAiAENgLcCCACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB3AhqEMmCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxkCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA1/IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdwIahDJgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADIABCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1/IAIoAsgoIQUgAigCxCghBAxjCyAHDgJ9AV8LIAIgCDYCmAkgAiAENgKUCSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQZQJahDKgoCAACIBQf//A3FFDV8gAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNfSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGUCWoQyoKAgABB//8DcUUNACACQZAoahCpgICAAAx+CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA19IAIoAsgoIQUgAigCxCghBAxgCwJAAkAgBS8BAA4GfV8AX18BXwsgABCxgoCAAAxeCyAAELSCgIAADF0LIAQtAABBP0YNWgxbCyAIRQ1YIAIgCDYCuAkgAiAENgK0CSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBtAlqEMuCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxYCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA16IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbQJahDLgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHsLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXogAigCyCghBSACKALEKCEEDFcLIAhFDVUgAiAINgLYCSACIAQ2AtQJIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkHUCWoQzIKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDFULIAJBqChqQbDpyYAAQcUAEKiAgIAAIAIvAcAoDXkgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB1AlqEMyCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMegsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNeSACKALIKCEFIAIoAsQoIQQMVAsgCEUNUiACIAg2AvgJIAIgBDYC9AkgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQfQJahDNgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMUgsgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNeCACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH0CWoQzYKAgABB//8DcUUNACACQZAoahCpgICAAAx5CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA14IAIoAsgoIQUgAigCxCghBAxRCyAIRQ1NIAIgCDYCmAogAiAENgKUCiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBlApqEM6CgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxNCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA13IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZQKahDOgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHgLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXcgAigCyCghBSACKALEKCEEDEwLQeiyx4AAQfCyx4AAQfiyx4AAIAQtAAAiAUE9RhsgAUE+RhshAQxKCyAIRQ1IIAIgCDYC0AogAiAENgLMCiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBzApqEM+CgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxICyACQagoakGw6cmAAEHFABCogICAACACLwHAKA11IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQcwKahDPgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHYLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXUgAigCyCghBSACKALEKCEEDEcLIAhFDUUgAiAINgLwCiACIAQ2AuwKIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkHsCmoQ0IKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDEULIAJBqChqQbDpyYAAQcUAEKiAgIAAIAIvAcAoDXQgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB7ApqENCCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMdQsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNdCACKALIKCEFIAIoAsQoIQQMRAsCQCAIRQ0AIAIgCDYClAsgAiAENgKQCyACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBkAtqENGCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQxECyACQagoakGw6cmAAEHFABCogICAACACLwHAKA10IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZALahDRgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHULIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXQgAigCyCghBSACKALEKCEEDEMLIAdBAUYNQSAlIAovAAA7AAAgAiALOwGECyACQYYLaiALQRB2OgAAICVBAmogCkECai0AADoAACACQecAOgCICyACIFI6AIcLIAIgBzYCgAsgAiAFNgL8CiACQQA2AvgKIAIgBDYC9AogAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQCACQagoaiACQfQKahDSgoCAACIBQf//A3ENACACKAKsKCEEIAIoArQoIQUMQQsgAkGoKGpBsOnJgABBLxCogICAACACLwHAKA1zIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQfQKahDSgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADHQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDXMgAigCyCghBSACKALEKCEEDEALA0AgB0UNcyACQbALaiAFLwEAIgEgCEUQ04KAgAACQAJAIAItALILRQ0AIAIgAi8BsAs7AbQLIAAgAkG0C2oQkIKAgAAiBEH//wNxDXgMAQsgAiABOwG2CyACQbYLahDUgoCAAAsgBUECaiEFIAdBf2ohBwwACwtB+LLHgAAhAQxFC0HcsseAACEBDF4LQdyyx4AAIQEMXgsgACgCCCgCGCgCwAEiASkDAEL//////2ODIQYCQCAHQR50QYCAgIB8akEedUF/Sg0AIAEgBkKAgICAgASENwMAIAAoAggiASABLwHsEUH+/wNxIAdBCHZBAXFyOwHsEQxvCyABIAZCgICAgIAIhDcDAAxuCyAIIAUQ1YKAgABBAXENbSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGoQ1oKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQcYAEKiAgIAAIAIvAcAoDW4gAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgDCACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwQ1oKAgABB//8DcUUNACACQZAoahCpgICAAAxvCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1uIAIoAsgoIQUgAigCxCghBAsgBCAFEICAgIAAIAFFDW1BsOnJgAAgBCAFELaAgIAADG0LIAEvASohUyABLQApIVQgAS0AKCFVIFAgCi8AADsAACBPIAFBGGoiASkCADcCACBQQQJqIApBAmotAAA6AAAgT0EIaiABQQhqKQIANwIAIAIgCToAoBcgAiAHNgKYFyACIAU2ApQXIAIgCDYCkBcgAiAENgKMFyACIFM7AbYXIAIgVDoAtRcgAiBVOgC0FyACIFJBGHQgC0H///8HcXI2ApwXIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQYwXahDXgoCAAEH//wNxIgFFDQAgAkGoKGpBsOnJgABBLxCogICAACACLwHAKA1uIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAwgAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBjBdqENeCgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMbwsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNbiACKALIKCEFIAIoAsQoIQQMAQsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUUNbEGw6cmAACAEIAUQtoCAgAAMbAsgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqENiCgIAAQf//A3EiAUUNACACQagoakGw6cmAAEExEKiAgIAAIAIvAcAoDW0gAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgDCACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwQ2IKAgABB//8DcUUNACACQZAoahCpgICAAAxuCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1tIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABRQ1rQbDpyYAAIAQgBRC2gICAAAxrCyAAKAIIKAIYEISCgIAADGoLAkACQAJAAkAgBUFsakFwSQ0AQQBBNyAFQQJ0QfzSx4AAaigCACIEayIBIAFBN0sbQQFqIQcgBEEDdEHczceAAGohASAEQQJ0QZzRx4AAaiEEA0AgAUEEaigCACAFRw0BIAEoAgAgBSAIENmCgIAAQQFxDQIgAUEIaiEBIARBBGohBCAHQX9qIgcNAAsLIAIgBTYCiBcgAiAINgKEFyACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQYQXahDagoCAAEH//wNxIgENASACKAKsKCEEIAIoArQoIQUMAgsgACgCCCAEKAIANgLoEQxrCyACQagoakGw6cmAAEEqEKiAgIAAIAIvAcAoDWogAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgDCACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGEF2oQ2oKAgABB//8DcUUNACACQZAoahCpgICAAAxrCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1qIAIoAsgoIQUgAigCxCghBAsgBCAFEICAgIAAIAFFDWlBsOnJgAAgBCAFELaAgIAADGkLIAAoAggoAhgoAsABIgEgASkDAEL//////2ODQoCAgICADIQ3AwAMaAsgACgCCCgCGCgCwAEiASABKQMAQv//////Y4NCgICAgIAQhDcDAAxnCyAAKAIIKAIYKALAASIBIAEpAwBC//////9jg0KAgICAgAyENwMADGYLIAAoAggoAhggByBSQRh0IAtB////B3FyIAggBRDTgYCAACIEQf//A3ENaAxlCwJAIAhFDQAgAiABOwD1FiACQewWakELaiABQRB2OgAAIAJBPjoA9BYgAiAINgLwFiACIAQ2AuwWIAJB7BZqENuCgIAADGULIABBhPnGgAAQkYKAgAAhBAwXCwJAIAhFDQAgAiABOwDpFiACQeAWakELaiABQRB2OgAAIAJBPToA6BYgAiAINgLkFiACIAQ2AuAWIAJB4BZqENuCgIAADGQLIABBhPnGgAAQkIKAgAAhBAwWCwJAIAhFDQAgAiABOwDdFiACQdQWakELaiABQRB2OgAAIAJB/AA6ANwWIAIgCDYC2BYgAiAENgLUFiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkHUFmoQ3IKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQTsQqICAgAAgAi8BwCgNZCACQZAoakEQaiACQagoakEQaikCADcDACAMIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdQWahDcgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADGULIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDWQgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUUNY0Gw6cmAACAEIAUQtoCAgAAMYwsgAEH4+MaAABD8gYCAAAxiCwJAIAhFDQAgAiABOwDRFiACQcgWakELaiABQRB2OgAAIAJB/QA6ANAWIAIgCDYCzBYgAiAENgLIFiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkHIFmoQ3YKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQTsQqICAgAAgAi8BwCgNYyACQZAoakEQaiACQagoakEQaikCADcDACAMIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQcgWahDdgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADGQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDWMgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUUNYkGw6cmAACAEIAUQtoCAgAAMYgsgAEHs+MaAABD8gYCAAAxhCwJAIAhFDQAgAiABOwDFFiACQbwWakELaiABQRB2OgAAIAJB/gA6AMQWIAIgCDYCwBYgAiAENgK8FiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkG8FmoQ3oKAgABB//8DcSIBDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQTsQqICAgAAgAi8BwCgNYiACQZAoakEQaiACQagoakEQaikCADcDACAMIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbwWahDegoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADGMLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDWIgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUUNYUGw6cmAACAEIAUQtoCAgAAM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qICAgAAgAi8BwCgNTCACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGUFGoQ64KAgABB//8DcUUNACACQZAoahCpgICAAAxNCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1MIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDUpBsOnJgAAgBCAFELaAgIAADEoLAkAgCEUNACACIAg2ApAUIAIgBDYCjBQgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJBjBRqEOyCgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQwBCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA1LIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQYwUahDsgoCAAEH//wNxRQ0AIAJBkChqEKmAgIAADEwLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUsgAigCyCghBSACKALEKCEECyAEIAUQgICAgAAgAUH//wNxRQ1KQbDpyYAAIAQgBRC2gICAAAxKC0EBIQECQAJAAkAgBw4CAQACCyAFLwEAIQELIAAoAggiBCAEKAIYLwHKAUEBakH//wNxIAEQ44GAgAAMSgsgTSAKLwAAOwAAIAIgCzsBhBQgAkGGFGogC0EQdjoAACBNQQJqIApBAmotAAA6AAAgAiAJOgCIFCACIFI6AIcUIAIgBzYCgBQgAiAFNgL8EyACQQA2AvgTIAIgBDYC9BMgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJB9BNqEO2CgIAAIgFB//8DcUUNACACQagoakGw6cmAAEEpEKiAgIAAIAIvAcAoDUsgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB9BNqEO2CgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAM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QZwRahD5goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADEQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUMgAigCyCghBSACKALEKCEEDAELAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAdFDQAgBS8BAEFyag4KAgEDAQQBAQUGBwELIDggCi8AADsAACACIAs7AZQRIAJBlhFqIAtBEHY6AAAgOEECaiAKQQJqLQAAOgAAIAJB9AA6AJgRIAIgUjoAlxEgAkEANgKQESACIAU2AowRIAJBADYCiBEgAiAENgKEESACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQYQRahD6goCAACIBQf//A3FFDQ8gAkGoKGpBsOnJgABBNRCogICAACACLwHAKA1TIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQYQRahD6goCAAEH//wNxRQ0AIAJBkChqEKmAgIAADFQLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDVMgAigCyCghBSACKALEKCEEDBALIDkgCi8AADsAACACIAs7AfwQIAJB/hBqIAtBEHY6AAAgOUECaiAKQQJqLQAAOgAAIAJB9AA6AIARIAIgUjoA/xAgAiAHNgL4ECACIAU2AvQQIAJBADYC8BAgAiAENgLsECACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQewQahD7goCAACIBQf//A3FFDQwgAkGoKGpBsOnJgABBwQAQqICAgAAgAi8BwCgNUiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkHsEGoQ+4KAgABB//8DcUUNACACQZAoahCpgICAAAxTCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1SIAIoAsgoIQUgAigCxCghBAwNCyAHQQFGDVEgOiAKLwAAOwAAIAIgCzsB7A8gAkHuD2ogC0EQdjoAACA6QQJqIApBAmotAAA6AAAgAkH0ADoA8A8gAiBSOgDvDyACIAc2AugPIAIgBTYC5A8gAkEANgLgDyACIAQ2AtwPIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkHcD2oQ/IKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAsLIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNUSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkHcD2oQ/IKAgABB//8DcUUNACACQZAoahCpgICAAAxSCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1RIAIoAsgoIQUgAigCxCghBAwKCyAHQQFGDVAgOyAKLwAAOwAAIAIgCzsBhBAgAkGGEGogC0EQdjoAACA7QQJqIApBAmotAAA6AAAgAkH0ADoAiBAgAiBSOgCHECACIAc2AoAQIAIgBTYC/A8gAkEANgL4DyACIAQ2AvQPIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkH0D2oQ/YKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAkLIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNUCACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkH0D2oQ/YKAgABB//8DcUUNACACQZAoahCpgICAAAxRCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1QIAIoAsgoIQUgAigCxCghBAwICyAHQQFGDU8gPCAKLwAAOwAAIAIgCzsBnBAgAkGeEGogC0EQdjoAACA8QQJqIApBAmotAAA6AAAgAkH0ADoAoBAgAiBSOgCfECACIAc2ApgQIAIgBTYClBAgAkEANgKQECACIAQ2AowQIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGMEGoQ/oKAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAcLIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNTyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGMEGoQ/oKAgABB//8DcUUNACACQZAoahCpgICAAAxQCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1PIAIoAsgoIQUgAigCxCghBAwGCyAHQQFGDU4gPSAKLwAAOwAAIAIgCzsBtBAgAkG2EGogC0EQdjoAACA9QQJqIApBAmotAAA6AAAgAkH0ADoAuBAgAiBSOgC3ECACIAc2ArAQIAIgBTYCrBAgAkEANgKoECACIAQ2AqQQIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGkEGoQ/4KAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAULIAJBqChqQbDpyYAAQT0QqICAgAAgAi8BwCgNTiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGkEGoQ/4KAgABB//8DcUUNACACQZAoahCpgICAAAxPCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1OIAIoAsgoIQUgAigCxCghBAwECyAHQX5xQQJGDQEMAgsCQCAHQX5xQQJHDQAgBS8BAg4DTQBNAAsgPyAKLwAAOwAAIAIgCzsB5BAgAkHmEGogC0EQdjoAACA/QQJqIApBAmotAAA6AAAgAkH0ADoA6BAgAiBSOgDnECACIAc2AuAQIAIgBTYC3BAgAkEANgLYECACIAQ2AtQQIAJB1BBqEICDgIAADEwLIAUvAQIOA0sASwALID4gCi8AADsAACACIAs7AcwQIAJBzhBqIAtBEHY6AAAgPkECaiAKQQJqLQAAOgAAIAJB9AA6ANAQIAIgUjoAzxAgAiAHNgLIECACIAU2AsQQIAJBADYCwBAgAiAENgK8ECACQbwQahCAg4CAAAxKCyAEIAUQgICAgAAgAUH//wNxRQ1JQbDpyYAAIAQgBRC2gICAAAxJCyAEIAUQgICAgAAgAUH//wNxRQ1IQbDpyYAAIAQgBRC2gICAAAxICyAEIAUQgICAgAAgAUH//wNxRQ1HQbDpyYAAIAQgBRC2gICAAAxHCyAEIAUQgICAgAAgAUH//wNxRQ1GQbDpyYAAIAQgBRC2gICAAAxGCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDURBsOnJgAAgBCAFELaAgIAADEQLIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNQkGw6cmAACAEIAUQtoCAgAAMQgsgBCAFEICAgIAAIAFB//8DcUUNQUGw6cmAACAEIAUQtoCAgAAMQQsgMyAKLwAAOwAAIAIgCzsB1A8gAkHWD2ogC0EQdjoAACAzQQJqIApBAmotAAA6AAAgAkHzADoA2A8gAiBSOgDXDyACIAc2AtAPIAIgBTYCzA8gAiAINgLIDyACIAQ2AsQPIAJBxA9qEIGDgIAADEALAkACQAJAAkACQAJAIAQtAABBQmoOAgACAQtBgAIhASAHDgIEAwILIDUgCi8AADsAACACIAs7AbwPIAJBvg9qIAtBEHY6AAAgNUECaiAKQQJqLQAAOgAAIAJB8wA6AMAPIAIgUjoAvw8gAiAHNgK4DyACIAU2ArQPIAJBATYCsA8gAiAENgKsDyACQawPahD2goCAAAxDCwNAIAdFDUMgAkH2DmogBS8BACIBQQAQ04KAgAACQAJAIAItAPgORQ0AIAAoAggiAUEMajEAACFWIAE1AgghVyABQQRqMQAAIVggATUCACFZAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAIvAfYOIgRBf2oOGQE2AgMEBQYHCDY2CTY2NjY2NjY2NjY2NgoACwJAIARBmHhqDhEQNhESExQVFjY2NjY2NjYXGAALAkAgBEH1d2oODxkaNjYbNjY2NjYcNh0eHwALAkAgBEGWcGoOBiEiNjY2IwALAkAgBEFTag4DDDYNAAsCQCAEQb5/ag4EDjY2DwALQgEhBkL+/////x8hWgJAIARB/v99ag4DJjYlAAsgBEEoRg0KIARB1A9GDR8gBEGAEEYNIwJAIARBjIACRw0AQgQhBkL7/////x8hWgwmC0IIIQZC9/////8fIVoMJQtCECEGQu//////HyFaDCQLQt//////HyFaQiAhBgwjC0LAACEGQr//////HyFaDCILQoABIQZC//7///8fIVoMIQtCgAIhBkL//f///x8hWgwgC0KABCEGQv/7////HyFaDB8LQoAIIQZC//f///8fIVoMHgtCgBAhBkL/7////x8hWgwdC0KAICEGQv/f////HyFaDBwLQoDAACEGQv+/////HyFaDBsLQoCAASEGQv///v//HyFaDBoLQoCAAiEGQv///f//HyFaDBkLQoCABCEGQv//+///HyFaDBgLQoCACCEGQv//9///HyFaDBcLQoCAECEGQv//7///HyFaDBYLQoCAICEGQv//3///HyFaDBULQoCAwAAhBkL//7///x8hWgwUC0KAgIABIQZC/////v8fIVoMEwtCgICAAiEGQv////3/HyFaDBILQoCAgAQhBkL////7/x8hWgwRC0KAgIAIIQZC////9/8fIVoMEAtCgICAECEGQv///+//HyFaDA8LQoCAgCAhBkL////f/x8hWgwOC0KAgIDAACEGQv///7//HyFaDA0LQoCAgIABIQZC//////4fIVoMDAtCgICAgAIhBkL//////R8hWgwLC0KAgICABCEGQv/////7HyFaDAoLQoCAgIAIIQZC//////cfIVoMCQtCgICAgBAhBkL/////7x8hWgwIC0KAgICAICEGQv/////fHyFaDAcLQoCAgIDAACEGQv////+/HyFaDAYLQoCAgICAASEGQv//////HiFaDAULQoCAgICAAiEGQv//////HSFaDAQLQoCAgICABCEGQv//////GyFaDAMLQoCAgICACCEGQv//////FyFaDAILQoCAgICAECEGQv//////DyFaDAELQgIhBkL9/////x8hWgsgASAGIFkgWEIghoSDIFogVyBWQiCGhIOEIgY+AgggAUEMaiAGQiCIPAAADAELIAIgATsB+g4gAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJB+g5qEIKDgIAAIgFB//8DcUUNACACQagoakGw6cmAAEEsEKiAgIAAIAIvAcAoDQIgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJB+g5qEIKDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMAwsgAkHEKGogAkGQ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IAJBkChqEKmAgIAAIAIvAcwoDQQgAigCyCghCCACKALEKCEEDAILIAFBBGogBkIgiDwAACABIAZC/f///w+DIFpCAoMiBoQ+AgAgBkIBiKchAQwCCyACKAKsKCEEIAIoArQoIQgLIAQgCBCAgICAACABQf//A3FFDQFBsOnJgAAgBCAIELaAgIAADAELIAAgBCABEI+CgIAAIgRB//8DcQ1BCyAFQQJqIQUgB0F/aiEHDAALCwJAAkACQAJAIAcOAwABAgMLIABBhrPHgAAQtoKAgAAMPgsgAkEAOwH+DSACIAUvAQA7AfwNIAAgAkH8DWoQtoKAgAAMPQsgAiAFKAEANgGADiAAIAJBgA5qELaCgIAADDwLIDEgCi8AADsAACACIAs7AZQOIAJBlg5qIAtBEHY6AAAgMUECaiAKQQJqLQAAOgAAIAJB8gA6AJgOIAIgUjoAlw4gAiAHNgKQDiACIAU2AowOIAJBADYCiA4gAiAENgKEDiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkGEDmoQhoOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQS0QqICAgAAgAi8BwCgNPSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGEDmoQhoOAgABB//8DcUUNACACQZAoahCpgICAAAw+CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA09IAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDTtBsOnJgAAgBCAFELaAgIAADDsLAkAgCEEBRg0AIAIgCDYC+A0gAiAENgL0DSACQfQNahCHg4CAAAw7CwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIAQtAAAiAUFgag4DAAMBAgtCACEGQQEhASAHDgITAwQLQYCzx4AAIQEgBw4CCwgJCyABQT5GDU0LIAJBATYC8A0gAiAENgLsDSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJB7A1qEIiDgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQwSCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA1MIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQewNahCIg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADE0LIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUwgAigCyCghBSACKALEKCEEDBELQQIhAUKAICEGIAUvAQAiBA4HDQ4NDwMBAgQLIC4gCi8AADsAACACIAs7AcwNIAJBzg1qIAtBEHY6AAAgLkECaiAKQQJqLQAAOgAAIAJB8QA6ANANIAIgUjoAzw0gAiAHNgLIDSACIAU2AsQNIAJBATYCwA0gAiAENgK8DSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQbwNahCJg4CAACIBQf//A3FFDQogAkGoKGpBsOnJgABBNRCogICAACACLwHAKA1KIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQbwNahCJg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADEsLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDUogAigCyCghBSACKALEKCEEDAsLQQAhAQwNC0EAIQELQgAhBgwLCyACIAQ7AboNIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoIAJBqChqIAJBug1qEIqDgIAAIgFB//8DcUUNBCACQagoakGw6cmAAEEvEKiAgIAAIAIvAcAoDUYgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBug1qEIqDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMRwsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNRiACKALIKCEFIAIoAsQoIQQMBQsgBS8BACIBQQNJDQELQYSzx4AAIQEMAQsgAUECdEHwuMqAAGooAgAhAQsCQAJAAkACQAJAAkAgAS0AAUUNACAAKAIIIgUoAhghBCABLQAAQQNxDgMBAgMBCyAvIAovAAA7AAAgAiALOwHkDSACQeYNaiALQRB2OgAAIC9BAmogCkECai0AADoAACACQfEAOgDoDSACIFI6AOcNIAIgBzYC4A0gAiAFNgLcDSACQQE2AtgNIAIgBDYC1A0gAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCggAkGoKGogAkHUDWoQi4OAgAAiAUH//wNxRQ0DIAJBqChqQbDpyYAAQTgQqICAgAAgAi8BwCgNRyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkHUDWoQi4OAgABB//8DcUUNACACQZAoahCpgICAAAxICyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA1HIAIoAsgoIQUgAigCxCghBAwECyAEQQA6ANIBDEYLIARBAToA0gEgBSgCGEEBOgDhAgxFCyAEQQE6ANIBIAUoAhhBAjoA4QIMRAsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ1CQbDpyYAAIAQgBRC2gICAAAxCCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDUBBsOnJgAAgBCAFELaAgIAADEALIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNPkGw6cmAACAEIAUQtoCAgAAMPgtCACEGC0EBIQELIAAoAggiBCAENQIAQv/f//8PgyAGhD4CACAAKAIIKAIYIAE6ANABDDsLIAQgBRCAgICAACABQf//A3FFDTpBsOnJgAAgBCAFELaAgIAADDoLAkAgCEECRg0AIAIgCDYCtA0gAiAENgKwDSACQbANahCHg4CAAAw6CwJAIAQtAABBP0cNACAELQABQSRHDQAgB0EBRg06IC0gCi8AADsAACACIAs7AagNIAJBqg1qIAtBEHY6AAAgAkECNgKcDSAtQQJqIApBAmotAAA6AAAgAkHwADoArA0gAiBSOgCrDSACIAc2AqQNIAIgBTYCoA0gAiAENgKYDSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkGYDWoQjIOAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAELIAJBqChqQbDpyYAAQSwQqICAgAAgAi8BwCgNOyACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGYDWoQjIOAgABB//8DcUUNACACQZAoahCpgICAAAw8CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA07IAIoAsgoIQUgAigCxCghBAsgBCAFEICAgIAAIAFB//8DcUUNOkGw6cmAACAEIAUQtoCAgAAMOgsgAkECNgKUDSACIAQ2ApANIAJBkA1qEIeDgIAADDkLAkACQAJAAkACQAJAAkACQAJAAkACQCAIRQ0AIAQtAAAiAUE/Rw0FIAdBAUcNASAIQQFGDQMgLCAKLwAAOwAAIAIgCzsB5AwgAkHmDGogC0EQdjoAACAsQQJqIApBAmotAAA6AAAgAkHuADoA6AwgAiBSOgDnDCACQQE2AuAMIAIgBTYC3AwgAiAINgLYDCACIAQ2AtQMIAJB1AxqEL6CgIAADEMLIAdBAUYNAQsgKyAKLwAAOwAAIAIgCzsBzAwgAkHODGogC0EQdjoAACArQQJqIApBAmotAAA6AAAgAkHuADoA0AwgAiBSOgDPDCACIAc2AsgMIAIgBTYCxAwgAiAINgLADCACIAQ2ArwMIAJBvAxqEI2DgIAADEELAkACQCAFLwEAQXtqDgIAAQMLIAAoAgwgAEHupMCAAEEEEP2BgIAAIQQMGQsgACgCCCIBKAIYIgUvAcoBIQQgBS8ByAEhBSABLQABQQFxDQMMBwsgBS8BAEHkB0YNFgsgKiAKLwAAOwAAIAIgCzsB/AwgAkH+DGogC0EQdjoAACAqQQJqIApBAmotAAA6AAAgAkHuADoAgA0gAiBSOgD/DCACQQE2AvgMIAIgBTYC9AwgAiAINgLwDCACIAQ2AuwMIAJB7AxqEI2DgIAADD4LAkAgCEEBRg0AIAIgCDYCjA0gAiAENgKIDSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAIAJBqChqIAJBiA1qEI6DgIAAIgFB//8DcQ0AIAIoAqwoIQQgAigCtCghBQwFCyACQagoakGw6cmAAEHFABCogICAACACLwHAKA0+IAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQYgNahCOg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADD8LIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDT4gAigCyCghBSACKALEKCEEDAQLIAFBPkYNAiACIAE6AIcNIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGHDWoQj4OAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAILIAJBqChqQbDpyYAAQTQQqICAgAAgAi8BwCgNPSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGHDWoQj4OAgABB//8DcUUNACACQZAoahCpgICAAAw+CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA09IAIoAsgoIQUgAigCxCghBAwBC0EAIARB//8DcSIEIAEvAfQRayIHIAcgBEsbIQRBACAFQf//A3EiBSABLwH4EWsiASABIAVLGyEFDAMLIAQgBRCAgICAACABQf//A3FFDTtBsOnJgAAgBCAFELaAgIAADDsLIAAoAggiASABLwHsEUH9/wNxOwHsEQw6CyAEIAUQgICAgAAgAUH//wNxRQ05QbDpyYAAIAQgBRC2gICAAAw5CyACQiA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoIAJBqChqQdinyIAAQQIQmoCAgABB//8DcQ0PIAJBqChqQZy1yoAAIARBAWoQkIOAgABB//8DcQ0PIAJBqChqQdqnyIAAQQEQmoCAgABB//8DcQ0PIAJBqChqQZy1yoAAIAVBAWoQkIOAgABB//8DcQ0PIAJBqChqQdunyIAAQQEQmoCAgABB//8DcQ0PIAAoAgwgACACKAKsKCACKAK0KBD9gYCAACEEDBALAkACQCAELQAAIgFBPkYNACACIAE6ALMMIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkAgAkGoKGogAkGzDGoQkYOAgAAiAUH//wNxDQAgAigCrCghBCACKAK0KCEFDAILIAJBqChqQbDpyYAAQTQQqICAgAAgAi8BwCgNOSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGzDGoQkYOAgABB//8DcUUNACACQZAoahCpgICAAAw6CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA05IAIoAsgoIQUgAigCxCghBAwBCwJAIAdFDQBBACEIAkACQAJAAkACQAJAIAUvAQAiAQ4FAwABBAIEC0EBIQEMAgtBAiEBDAELQQMhAUEBIQgLAkAgB0ECTQ0AICkgCi8AADsAACACIAs7AagMIAJBqgxqIAtBEHY6AAAgKUECaiAKQQJqLQAAOgAAIAJB7QA6AKwMIAIgUjoAqwwgAiAHNgKkDCACIAU2AqAMIAJBATYCnAwgAiAENgKYDCACQZgMahCSg4CAAAw8CyAHQQJGIAhxRQ0BQQVBAyAFLwECQQJGGyEBDAELICggCi8AADsAACACIAs7AZAMIAJBkgxqIAtBEHY6AAAgKEECaiAKQQJqLQAAOgAAIAJB7QA6AJQMIAIgUjoAkwwgAiAHNgKMDCACIAU2AogMIAJBATYChAwgAiAENgKADCACQYAMahCSg4CAAAw6CyAAIAEQtYKAgAAMOQsgACgCCCIBIAEvAewRQf3/A3E7AewRDDgLIAQgBRCAgICAACABQf//A3FFDTdBsOnJgAAgBCAFELaAgIAADDcLIAIgCzsB4AsgAkHiC2ogC0EQdjoAACACQQA2AuQLIAIgBzYC3AsgAiAFNgLYCwNAIAJB6AtqIAJB2AtqENeAgIAAIAItAPwLRQ03IAIoAugLIgRBAUYNACAAKAIIKAIYIQECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAEDh8AIAECAwQFBgcICQoLDA0ODxAREhMUFRcWGBkbGh0cAAsgAUIANwOYASABQbABakEANgIAIAFBqAFqQgA3AwAgAUGgAWpCADcDAAwdCyABIAEvAbABQQFyOwGwAQwcCyABIAEvAbABQfr/A3E7AbABDBsLIAEgAS8BsAFBAnI7AbABDBoLIAEgAS8BsAFB/f8DcTsBsAEMGQsgASABLwGwAUEEcjsBsAEMGAsgASACLQDsC0EHcUEIdCABLwGwAUH/8QNxcjsBsAEMFwsgAUECOgCsASABIAIvAewLIgQ6AKgBIAEgBEEIdjoAqQEgASACQe4Lai0AADoAqgEMFgsgAUEBOgCsASABIAItAOwLOgCoAQwVCyABQgA3A6gBDBQLIAEgAS8BsAFBgAFyOwGwAQwTCyABIAEvAbABQf/+A3E7AbABDBILIAEgAS8BsAFBCHI7AbABDBELIAEgAS8BsAFB9/8DcTsBsAEMEAsgASABLwGwAUEQcjsBsAEMDwsgASABLwGwAUHv/wNxOwGwAQwOCyABIAEvAbABQSByOwGwAQwNCyABIAEvAbABQd//A3E7AbABDAwLIAEgAS8BsAFBwAByOwGwAQwLCyABIAEvAbABQb//A3E7AbABDAoLIAFBAjoAnAEgASACLwHsCyIEOgCYASABIARBCHY6AJkBIAEgAkHuC2otAAA6AJoBDAkLIAFBAjoApAEgASACLwHsCyIEOgCgASABIARBCHY6AKEBIAEgAkHuC2otAAA6AKIBDAgLIAFBAToAnAEgASACLQDsCzoAmAEMBwsgAUEBOgCkASABIAItAOwLOgCgAQwGCyABQgA3A5gBDAULIAFCADcDoAEMBAsgAUEBOgCcASABIAItAOwLOgCYAQwDCyABQQE6AKQBIAEgAi0A7As6AKABDAILIAFBAToAnAEgASACLQDsCzoAmAEMAQsgAUEBOgCkASABIAItAOwLOgCgAQsgARCSgYCAABoMAAsLAAsgAiAINgK4DCACIAQ2ArQMIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQbQMahCTg4CAACIBQf//A3FFDQAgAkGoKGpBsOnJgABBxQAQqICAgAAgAi8BwCgNNiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkG0DGoQk4OAgABB//8DcUUNACACQZAoahCpgICAAAw3CyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA02IAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDTRBsOnJgAAgBCAFELaAgIAADDQLA0AgB0UNNCACQdALaiAFLwEAIgEgCEUQ04KAgAACQAJAIAItANILRQ0AIAIgAi8B0As7AdQLIAAgAkHUC2oQkYKAgAAiBEH//wNxDTkMAQsgAiABOwHWCyACQdYLahDUgoCAAAsgBUECaiEFIAdBf2ohBwwACwsgBCAFEICAgIAAIAFB//8DcUUNMkGw6cmAACAEIAUQtoCAgAAMMgsCQAJAAkAgBS8BACIBDgQAAgIBAgsgABCxgoCAAAwzCyAAELSCgIAADDILIAIgAToAjwsgAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYCrCgCQAJAIAJBqChqIAJBjwtqEJSDgIAAIgFB//8DcUUNACACQagoakGw6cmAAEErEKiAgIAAIAIvAcAoDTMgAkGQKGpBEGogAkGoKGpBEGopAgA3AwAgAkGQKGpBCGogAkGoKGpBCGopAgA3AwAgAiACKQKoKDcDkCgCQCAMIAJBjwtqEJSDgIAAQf//A3FFDQAgAkGQKGoQqYCAgAAMNAsgAkHEKGogAkGQKGoQqoCAgAAgAkGQKGoQqYCAgAAgAi8BzCgNMyACKALIKCEFIAIoAsQoIQQMAQsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ0xQbDpyYAAIAQgBRC2gICAAAwxCyAEIAUQgICAgAAgAUH//wNxRQ0wQbDpyYAAIAQgBRC2gICAAAwwCyAEIAUQgICAgAAgAUH//wNxRQ0vQbDpyYAAIAQgBRC2gICAAAwvC0EBIQECQAJAAkAgBw4CAQACCyAFLwEAIQELIAAoAggiBCAEKAIYIgQvAcoBQQFqQf//A3EgAUH//wNxaiIBQf//AyABQf//A0kbIAQvAcgBQQFqQf//A3EQ44GAgAAMLwsgJCAKLwAAOwAAIAIgCzsB5AogAkHmCmogC0EQdjoAACAkQQJqIApBAmotAAA6AAAgAkHlADoA6AogAiBSOgDnCiACIAc2AuAKIAIgBTYC3AogAkEANgLYCiACIAQ2AtQKIAJCgBA3ArAoIAJBwL/HgAA2AqgoIAIgAkGQGGo2AqwoAkACQCACQagoaiACQdQKahCVg4CAACIBQf//A3FFDQAgAkGoKGpBsOnJgABBKRCogICAACACLwHAKA0wIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQdQKahCVg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADDELIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDTAgAigCyCghBSACKALEKCEEDAELIAIoAqwoIQQgAigCtCghBQsgBCAFEICAgIAAIAFB//8DcUUNLkGw6cmAACAEIAUQtoCAgAAMLgsgBCAFEICAgIAAIAFB//8DcUUNLUGw6cmAACAEIAUQtoCAgAAMLQtBASEBAkACQAJAIAcOAgEAAgsgBS8BACEBCyAAKAIIIgQgASAEKAIYLwHIAUEBakH//wNxEOOBgIAADC0LICMgCi8AADsAACACIAs7AcQKIAJBxgpqIAtBEHY6AAAgI0ECaiAKQQJqLQAAOgAAIAJB5AA6AMgKIAIgUjoAxwogAiAHNgLACiACIAU2ArwKIAJBADYCuAogAiAENgK0CiACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkG0CmoQloOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQSkQqICAgAAgAi8BwCgNLiACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkG0CmoQloOAgABB//8DcUUNACACQZAoahCpgICAAAwvCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0uIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDSxBsOnJgAAgBCAFELaAgIAADCwLAkAgAS0ABEUNACAAIAEoAgAQ/4GAgAAhBAwECyAiIAovAAA7AAAgAiALOwGsCiACQa4KaiALQRB2OgAAICJBAmogCkECai0AADoAACACQeMAOgCwCiACIFI6AK8KIAIgBzYCqAogAiAFNgKkCiACIAg2AqAKIAIgBDYCnAogAkKAEDcCsCggAkHAv8eAADYCqCggAiACQZAYajYC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QbDpyYAAQTkQqICAgAAgAi8BwCgNJSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkG8CWoQmoOAgABB//8DcUUNACACQZAoahCpgICAAAwmCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0lIAIoAsgoIQUgAigCxCghBAwBCyACKAKsKCEEIAIoArQoIQULIAQgBRCAgICAACABQf//A3FFDSNBsOnJgAAgBCAFELaAgIAADCMLIAQgBRCAgICAACABQf//A3FFDSJBsOnJgAAgBCAFELaAgIAADCILQQEhCAJAAkACQAJAAkACQAJAIAcOAgEAAgsgBS8BACEICyAAKAIIIgEvAfIRIAEoAhgiBS8ByAEiCWsiB0H//wNxIgQgBCAIQQEgCEEBSxsiCCAEIAhJGyIIRw0BDAQLIB4gCi8AADsAACACIAs7AawJIAJBrglqIAtBEHY6AAAgHkECaiAKQQJqLQAAOgAAIAJB2AA6ALAJIAIgUjoArwkgAiAHNgKoCSACIAU2AqQJIAJBADYCoAkgAiAENgKcCSACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKCACQagoaiACQZwJahCbg4CAACIBQf//A3FFDQEgAkGoKGpBsOnJgABBNhCogICAACACLwHAKA0lIAJBkChqQRBqIAJBqChqQRBqKQIANwMAIAJBkChqQQhqIAJBqChqQQhqKQIANwMAIAIgAikCqCg3A5AoAkAgDCACQZwJahCbg4CAAEH//wNxRQ0AIAJBkChqEKmAgIAADCYLIAJBxChqIAJBkChqEKqAgIAAIAJBkChqEKmAgIAAIAIvAcwoDSUgAigCyCghBSACKALEKCEEDAILIAUoAsQBIAhBf2pB//8DcUEDdGopAwBCgICAgICAA4NCgICAgICAAVEgCGoiB0H//wNxIQQMAgsgAigCrCghBCACKAK0KCEFCyAEIAUQgICAgAAgAUH//wNxRQ0iQbDpyYAAIAQgBRC2gICAAAwiCyAFIAkQnIOAgAAgASgCGCIFIAUvAcgBIAdqEJyDgIAAIAEoAhgQq4KAgAAgASgCGCgCwAEiBSAFKQMAQoCAgICAwACENwMAIAEoAhgi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QcgXahCkgoCAAAwCCyACIAcoAjggBygCECIIajYC0BcgAkHUF2ogAkHQF2ogASAIaxChgYCAACACIAIoAtgXKQIANwPgFyACQdAXaiACKALUFxCjgYCAACACQdAXaiAEIAhrIAJB4BdqEKSCgIAADAELIAIgUzYC6BcgAkHsF2ogAkHoF2ogCBChgYCAACACKALwFyEIIAJB+BdqIAJB6BdqIFQQoYGAgAAgCCkCACEGIAggAigC/BciUykCADcCACBTIAY3AgALIAEpAwBCgICAgICACIMhBgJAAkAgBC0ABUEgcQ0AIAZQDQEgAiAHKAKkASAHKAIQIghqNgKIGCACQZAoaiACQYgYaiABIAhrEKSBgIAAIAIoApQoLwEAIVMgAkGIGGogAigCkCgQpoGAgAAgAkGIGGogBCAIayBTEKWCgIAADAELIAcoAqQBIAcoAhAiCGohUyABIAhrIVQgBCAIayEIAkAgBkIAUg0AIAIgUzYChBggAkHEKGogAkGEGGogCBCkgYCAACACKALIKC8BACEIIAJBhBhqIAIoAsQoEKaBgIAAIAJBhBhqIFQgCBClgoCAAAwBCyACIFM2AowYIAJBqChqIAJBjBhqIAgQpIGAgAAgAigCrCghCCACQZAYaiACQYwYaiBUEKSBgIAAIAgvAQAhUyAIIAIoApQYIlQvAQA7AQAgVCBTOwEACyABKQMAIQYgASAEKQMANwMAIAQgBjcDACAFQQhqIQUMAAsLIBkgCi8AADsAACACIAs7AZQIIAJBlghqIAtBEHY6AAAgGUECaiAKQQJqLQAAOgAAIAJB0AA6AJgIIAIgUjoAlwggAiAHNgKQCCACIAU2AowIIAJBADYCiAggAiAENgKECCACQoAQNwKwKCACQcC/x4AANgKoKCACIAJBkBhqNgKsKAJAAkAgAkGoKGogAkGECGoQoIOAgAAiAUH//wNxRQ0AIAJBqChqQbDpyYAAQTcQqICAgAAgAi8BwCgNGSACQZAoakEQaiACQagoakEQaikCADcDACACQZAoakEIaiACQagoakEIaikCADcDACACIAIpAqgoNwOQKAJAIAwgAkGECGoQoIOAgABB//8DcUUNACACQZAoahCpgICAAAwaCyACQcQoaiACQZAoahCqgICAACACQZAoahCpgICAACACLwHMKA0ZIAIoAsgo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IABBnLXKgAAQr4SAgAAiA0H//wNxDQEgAi0ANCEBCwJAIAFBD3FBCEcNACAAQZy1yoAAEK+EgIAAIgNB//8DcQ0BIAItADQhAQsCQCABQQ9xQQlHDQAgAiACLQAIOgA6IAAgAkE6ahCrhICAACIDQf//A3ENASACLQA0IQELAkAgAUEPcUEKRw0AIABBnLXKgAAQr4SAgAAiA0H//wNxDQELIABBo5LAgABBAhCagICAACEDCyACQcAAaiSAgICAACADC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC0g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBLhCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQtIOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQZuYyoAAQSsQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILPQEBfwJAIABB0vbJgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEHD98mAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQbH4yYAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABB8/jJgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEHm+cmAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQar7yYAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABBkfzJgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEGH/cmAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQfX9yYAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABB5f7JgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEHb/8mAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQdCAyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABByIHKgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEGwgsqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQaGDyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILPQEBfwJAIABBvYTKgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgs9AQF/AkAgAEGlhcqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCz0BAX8CQCAAQbyGyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILLgEBfwJAIABB54XKgABBLBCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgvoCwECfwJAIAFB//8DcSIDQQJHDQAgAkEBcUUNACAAQQE6AAIgAEGCgAI7AQAPCwJAIANBBEcNACACQQFxRQ0AIABBAToAAiAAQYSAAjsBAA8LAkAgAUH//wNxIgNBDEcNACACQQFxRQ0AIABBAToAAiAAQYyAAjsBAA8LAkAgA0EURw0AIAJBAXFFDQAgAEEBOgACIABBlIACOwEADwsCQCABQf//A3EiA0EBRw0AIAJBAXENACAAQQE6AAIgAEEBOwEADwsCQCADQQNHDQAgAkEBcQ0AIABBAToAAiAAQQM7AQAPCwJAIAFB//8DcSIDQQRGIAJBAXMiBHFBAUcNACAAQQE6AAIgAEGEgH5BBCACQQFxGzsBAA8LAkAgA0EFRw0AIAJBAXENACAAQQE6AAIgAEEFOwEADwsCQCABQf//A3EiA0EGRw0AIAJBAXENACAAQQE6AAIgAEEGOwEADwsCQCADQQdHDQAgAkEBcQ0AIABBAToAAiAAQQc7AQAPCwJAIAFB//8DcSIDQQhHDQAgAkEBcQ0AIABBAToAAiAAQQg7AQAPCwJAIANBCUcNACACQQFxDQAgAEEBOgACIABBCTsBAA8LAkAgAUH//wNxIgNBDEYgBHFBAUcNACAAQQE6AAIgAEGMgH5BDCACQQFxGzsBAA8LAkAgA0EZRw0AIAJBAXENACAAQQE6AAIgAEEZOwEADwsCQCABQf//A3EiA0EoRw0AIAJBAXENACAAQQE6AAIgAEEoOwEADwsCQCADQS1HDQAgAkEBcQ0AIABBAToAAiAAQS07AQAPCwJAIAFB//8DcSIDQS9HDQAgAkEBcQ0AIABBAToAAiAAQS87AQAPCwJAIANBwgBHDQAgAkEBcQ0AIABBAToAAiAAQcIAOwEADwsCQCABQf//A3EiA0HFAEcNACACQQFxDQAgAEEBOgACIABBxQA7AQAPCwJAIANB6AdHDQAgAkEBcQ0AIABBAToAAiAAQegHOwEADwsCQCABQf//A3EiA0HqB0cNACACQQFxDQAgAEEBOgACIABB6gc7AQAPCwJAIANB6wdHDQAgAkEBcQ0AIABBAToAAiAAQesHOwEADwsCQCABQf//A3EiA0HsB0cNACACQQFxDQAgAEEBOgACIABB7Ac7AQAPCwJAIANB7QdHDQAgAkEBcQ0AIABBAToAAiAAQe0HOwEADwsCQCABQf//A3EiA0HuB0cNACACQQFxDQAgAEEBOgACIABB7gc7AQAPCwJAIANB7wdHDQAgAkEBcQ0AIABBAToAAiAAQe8HOwEADwsCQCABQf//A3EiA0H3B0cNACACQQFxDQAgAEEBOgACIABB9wc7AQAPCwJAIANB+AdHDQAgAkEBcQ0AIABBAToAAiAAQfgHOwEADwsCQCABQf//A3EiA0GLCEcNACACQQFxDQAgAEEBOgACIABBiwg7AQAPCwJAIANBjAhHDQAgAkEBcQ0AIABBAToAAiAAQYwIOwEADwsCQCABQf//A3EiA0GPCEcNACACQQFxDQAgAEEBOgACIABBjwg7AQAPCwJAIANBlQhHDQAgAkEBcQ0AIABBAToAAiAAQZUIOwEADwsCQCABQf//A3EiA0GXCEcNACACQQFxDQAgAEEBOgACIABBlwg7AQAPCwJAIANBmAhHDQAgAkEBcQ0AIABBAToAAiAAQZgIOwEADwsCQCABQf//A3EiA0GZCEcNACACQQFxDQAgAEEBOgACIABBmQg7AQAPCwJAIANB1A9HDQAgAkEBcQ0AIABBAToAAiAAQdQPOwEADwsCQCABQf//A3EiA0HqD0cNACACQQFxDQAgAEEBOgACIABB6g87AQAPCwJAIANB6w9HDQAgAkEBcQ0AIABBAToAAiAAQesPOwEADwsCQCABQf//A3EiAUHvD0cNACACQQFxDQAgAEEBOgACIABB7w87AQAPCwJAIAFBgBBHDQAgAkEBcQ0AIABBAToAAiAAQYAQOwEADwsgAEEANgEAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC1g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBJxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQtYOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC+kBAgZ/AX5BACECA38CQAJAIAIgAU8iAw0AAkAgACACaiIELAAAIgVBAEgNAEEBIQUMAgsgBUH/AXFB3KfIgABqLQAAIgZB8QFGDQAgAiAGQQdxIgVqIAFLDQAgBEEBai0AACIHQoDBgoSJECAGQQF2QfgAca0iCIinQbABcUkNACAHQr///vz7ESAIiKdB/wFxSw0AAkACQCAFQX5qDgMDAAEDCyAEQQJqLAAAQb9/Sg0BQQMhBQwCCyAEQQJqLAAAQb9/Sg0AIARBA2osAABBQE4NAEEEIQUMAQsgAw8LIAUgAmohAgwACwsTACAAQcaYyoAAQcYAEJqAgIAACzQBAX8CQCAAQeSZyoAAQS0QmoCAgAAiAkH//wNxDQAgAEGctcqAACABEK6EgIAAIQILIAILEgAgAEGzmcqAAEExEJqAgIAAC1ABA38CQAJAIAAgAkcNAEEBIQMMAQsDQCABRSEDIAFFDQEgAUF/aiEBIAItAAAhBCAALQAAIQUgAkEBaiECIABBAWohACAFIARGDQALCyADCzwBAX8CQCAAQYyZyoAAQScQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQrYOAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQSsQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEK2DgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAsuAQF/AkAgAEHz8cmAAEE4EJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQbvxyYAAQTgQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILLgEBfwJAIABBg/HJgABBOBCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQq4OAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQTQQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEKuDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQqoOAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQTQQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEKqDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAvIAgEDfyOAgICAAEHAEGsiASSAgICAACABQoAQNwKgECABQcC/x4AANgKYECABIAE2ApwQAkACQAJAIAFBmBBqIAAQrIOAgAAiAkH//wNxDQAgASgCnBAhACABKAKkECEDDAELIAFBmBBqQbDpyYAAQTAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAEKyDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAsuAQF/AkAgAEGX78mAAEEwEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQe3uyYAAQSoQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILLgEBfwJAIABBwe7JgABBLBCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgsuAQF/AkAgAEGZ7smAAEEoEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQafsyYAAQSIQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEKiDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEE0EKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCog4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEKmDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEEuEKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCpg4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALLgEBfwJAIABB1vDJgABBLRCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgs9AQF/AkAgAEHZl8qAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCy4BAX8CQCAAQbOXyoAAQSYQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILPQEBfwJAIABB8ZbKgABBwgAQmoCAgAAiAkH//wNxDQAgACABKAIAIAEoAgRBnLXKgAAQo4SAgAAhAgsgAgsuAQF/AkAgAEHLlsqAAEEmEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCz0BAX8CQCAAQYmWyoAAQcIAEJqAgIAAIgJB//8DcQ0AIAAgASgCACABKAIEQZy1yoAAEKOEgIAAIQILIAILLgEBfwJAIABB25XKgABBLhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgs9AQF/AkAgAEGZlcqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCwg4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBLxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQsIOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC+g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMBCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQvoOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQb2UyoAAQS8QmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABBl5TKgABBJhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHok8qAAEEvEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC5g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBNRCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQuYOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQYGTyoAAQTQQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEL2DgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEE2EKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABC9g4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALLwEBfwJAIABBv5LKgABBwgAQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABBjZLKgABBMhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHPkcqAAEE+EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQaqPyoAAQToQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB5I/KgABBOhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEGekMqAAEE6EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQdiQyoAAQToQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyQIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAELyDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEHAABCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQvIOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC6g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBxQAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAELqDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAs3AQF/AkAgAEHQjsqAAEEqEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS8BABCQg4CAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC7g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQu4OAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQaaOyoAAQSoQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILNwEBfwJAIABBhY3KgABBLRCagICAACICQf//A3ENACAAQZy1yoAAIAEvAQAQkIOAgAAhAgsgAgsuAQF/AkAgAEHbjMqAAEEqEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACC8kCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABC4g4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBxQAQqICAgAAgAS8BsBANASABQYAQakEQaiABQZgQakEQaikCADcDACABQYAQakEIaiIDIAFBmBBqQQhqKQIANwMAIAEgASkCmBA3A4AQAkAgAyAAELiDgIAAQf//A3FFDQAgAUGAEGoQqYCAgAAMAgsgAUG0EGogAUGAEGoQqoCAgAAgAUGAEGoQqYCAgAAgAS8BvBANASABKAK4ECEDIAEoArQQIQALIAAgAxCAgICAACACQf//A3FFDQBBsOnJgAAgACADELaAgIAACyABQcAQaiSAgICAAAs9AQF/AkAgAEGZjMqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCy4BAX8CQCAAQbKLyoAAQTIQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILNwEBfwJAIABBhYvKgABBLRCagICAACICQf//A3ENACAAQZy1yoAAIAEvAQAQkIOAgAAhAgsgAgsuAQF/AkAgAEHki8qAAEE1EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQdyKyoAAQSkQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAELeDgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEE6EKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABC3g4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALPQEB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gABBLhCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHJ/cmAAEEsEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQdP8yYAAQTQQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB7PvJgABBJRCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEGF+8mAAEElEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCyg4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMBCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQsoOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAAC8gCAQN/I4CAgIAAQcAQayIBJICAgIAAIAFCgBA3AqAQIAFBwL/HgAA2ApgQIAEgATYCnBACQAJAAkAgAUGYEGogABCxg4CAACICQf//A3ENACABKAKcECEAIAEoAqQQIQMMAQsgAUGYEGpBsOnJgABBMxCogICAACABLwGwEA0BIAFBgBBqQRBqIAFBmBBqQRBqKQIANwMAIAFBgBBqQQhqIgMgAUGYEGpBCGopAgA3AwAgASABKQKYEDcDgBACQCADIAAQsYOAgABB//8DcUUNACABQYAQahCpgICAAAwCCyABQbQQaiABQYAQahCqgICAACABQYAQahCpgICAACABLwG8EA0BIAEoArgQIQMgASgCtBAhAAsgACADEICAgIAAIAJB//8DcUUNAEGw6cmAACAAIAMQtoCAgAALIAFBwBBqJICAgIAACy4BAX8CQCAAQbX5yYAAQTEQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILyAIBA38jgICAgABBwBBrIgEkgICAgAAgAUKAEDcCoBAgAUHAv8eAADYCmBAgASABNgKcEAJAAkACQCABQZgQaiAAEK+DgIAAIgJB//8DcQ0AIAEoApwQIQAgASgCpBAhAwwBCyABQZgQakGw6cmAAEExEKiAgIAAIAEvAbAQDQEgAUGAEGpBEGogAUGYEGpBEGopAgA3AwAgAUGAEGpBCGoiAyABQZgQakEIaikCADcDACABIAEpApgQNwOAEAJAIAMgABCvg4CAAEH//wNxRQ0AIAFBgBBqEKmAgIAADAILIAFBtBBqIAFBgBBqEKqAgIAAIAFBgBBqEKmAgIAAIAEvAbwQDQEgASgCuBAhAyABKAK0ECEACyAAIAMQgICAgAAgAkH//wNxRQ0AQbDpyYAAIAAgAxC2gICAAAsgAUHAEGokgICAgAALLgEBfwJAIABBlPfJgABBLxCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgu7AQECfwJAIABB+OvJgABBLxCagICAACICQf//A3ENACABKAIEIQMgASgCACEBIABBgevAgABBAhCagICAACICQf//A3ENAANAAkACQCADRQ0AIAAgAS0AAEEKQQBBnLXKgAAQ6IOAgAAiAkH//wNxDQMgA0EBRg0BIABBiOvAgABBAhCagICAACICQf//A3FFDQEMAwsgAEGjksCAAEECEJqAgIAADwsgAUEBaiEBIANBf2ohAwwACwsgAgsuAQF/AkAgAEHJ7MmAAEErEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQcfvyYAAQTEQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILLgEBfwJAIABB+O/JgABBMRCagICAACICQf//A3ENACAAIAEQqISAgAAhAgsgAgsuAQF/AkAgAEGp8MmAAEEtEJqAgIAAIgJB//8DcQ0AIAAgARCohICAACECCyACCy4BAX8CQCAAQavzyYAAQSgQmoCAgAAiAkH//wNxDQAgACABEKiEgIAAIQILIAILNwEBfwJAIABB0/PJgABBMxCagICAACICQf//A3ENACAAQZy1yoAAIAEtAAAQqoSAgAAhAgsgAgsuAQF/AkAgAEGk9smAAEEuEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQYX4yYAAQSwQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABBqPrJgABBMBCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEHY+smAAEEtEJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQaf/yYAAQTQQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB/obKgABBKxCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgs3AQF/AkAgAEGph8qAAEElEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS8BABCQg4CAACECCyACCy4BAX8CQCAAQc6HyoAAQS0QmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB74jKgABBNxCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgs9AQF/AkAgAEGaisqAAEHCABCagICAACICQf//A3ENACAAIAEoAgAgASgCBEGctcqAABCjhICAACECCyACCy4BAX8CQCAAQbKNyoAAQTIQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLwEBfwJAIABB5I3KgABBwgAQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB+o7KgABBMBCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgsuAQF/AkAgAEGSkcqAAEE9EJqAgIAAIgJB//8DcQ0AIAAgARCwhICAACECCyACCy4BAX8CQCAAQbWTyoAAQTMQmoCAgAAiAkH//wNxDQAgACABELCEgIAAIQILIAILLgEBfwJAIABB7JTKgABBLRCagICAACICQf//A3ENACAAIAEQsISAgAAhAgsgAgvdCQMCfwJ+CH8jgICAgABBIGsiAySAgICAAAJAIABFDQAgAEHAG2ohBEEAKQP4tceAACIFQoCAgIDwH4MhBiAFpyEHIABB4ixqIQggAEHSG2ohCQNAIAJFDQEgAS0AACEKAkACQAJAAkACQCAALQDWLEEPcQ0AIApBirPHgABqLQAAIQsgAC0A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QAJAAkAgAUG4A2ogBxDBg4CAAEEDcQ4EAAECAwALIAFBkANqQRhqIAUoAgAiBTYCACABQZADakEQaiAIKQMANwMAIAFBkANqQQhqIAwpAwA3AwAgASABKQO4AyIJNwOQAyABQeADakEIaiAJpyABQZADaiAFQQFxGyIFQQhqKAIANgIAIAEgBSkCADcD4AMgAUHgA2ohCAwDCyABQZADakEYaiAFKAIAIgU2AgAgAUGQA2pBEGogCCkDADcDACABQZADakEIaiAMKQMANwMAIAEgASkDuAM3A5ADIAFB4ANqQQhqIAEoApQDIAFBnANqIAVBAXEbIgVBCGooAgA2AgAgASAFKQIANwPgAyABQeADaiEIDAILIAFBkANqQRhqIAUoAgAiDTYCACABQZADakEQaiAIKQMANwMAIAFBkANqQQhqIAwpAwA3AwAgASABKQO4AyIJNwOQAyABQeADakEIaiAJpyABQZADaiANQQFxGyIIQQhqKAIANgIAIAEgCCkCADcD4AMgASABLwHKAzsBkAMgASABKAK8A0EGaiABQZADaiAFLQAAQQFxGy8BADsB5gMgAUHgA2ohCAwBCyABQZADakEYaiAFKAIAIg02AgAgAUGQA2pBEGogCCkDADcDACABQZADakEIaiAMKQMANwMAIAEgASkDuAM3A5ADIAFB4ANqQQhqIAEoApQDIAFBnANqIA1BAXEbIghBCGooAgA2AgAgASAIKQIANwPgAyABIAEvAb4DOwGQAyABIAEoArgDQQZqIAFBkANqIAUtAABBAXEbLwEAOwHmAyABQeADaiEICyAAQeQaaiEFIAFB+AFqQQhqIAhBCGooAgA2AgAgASAIKQIANwP4ASABQbgDakEYaiIIIARBGGopAgA3AwAgAUG4A2pBEGoiDCAEQRBqKQIANwMAIAFBuANqQQhqIg0gBEEIaikCADcDACABIAQpAgA3A7gDAkACQAJAAkACQCABQbgDaiAHEMGDgIAAQQNxDgQAAQIDAAsgAUGQA2pBGGogCCgCACIENgIAIAFBkANqQRBqIAwpAwA3AwAgAUGQA2pBCGogDSkDADcDACABIAEpA7gDNwOQAyABQeADakEIaiABKAKUAyABQZwDaiAEQQFxGyIEQQhqKAIANgIAIAEgBCkCADcD4AMgAUHgA2ohBAwDCyABQZADakEY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FPwKAAALIA1BBGogDDYCACANIB82AgALIARBCGohBCAQQQhqIRAgBUEcaiEFIA1BCGohDQwACwsgHiABKQPgATcCAEEBIRALICBBAWohIAwACwsgAUHwA2okgICAgAAgAkH/AXELtgQCC38BfiOAgICAAEGAAWsiAiSAgICAACACQRhqIgMgAEEYaiIEKQIANwMAIAJBEGoiBSAAQRBqIgYpAgA3AwAgAkEIaiIHIABBCGoiCCkCADcDACACIAApAgA3AwAgAkHgAGpBGGoiCSAEKAIAIgo2AgAgAkHgAGpBEGoiCyAGKQIANwMAIAJB4ABqQQhqIgwgCCkCADcDACACIAApAgAiDTcDYEEBIQQgAkEgakEIaiANpyACQeAAaiAKQQFxGyIGQQhqKAIANgIAIAIgBikCADcDICACQTBqIAFBAiACQSBqEM2BgIAAIAIvATQhCCACKAIwIQYgCSADKAIAIgM2AgAgCyAFKQMANwMAIAwgBykDADcDACACIAIpAwA3A2AgAkHAAGpBCGogAigCZCACQewAaiADQQFxGyIDQQhqKAIANgIAIAIgAykCADcDQCACQdAAaiABQQIgAkHAAGoQzYGAgAAgAi8BVCEDIAIoAlAhAQJAAkACQAJAIAAtABxFDQACQCAGIAFNIgANACAIQf//A3EgA0H//wNxTw0ECwJAIAYgAUkiAQ0AIAhB//8DcSADQf//A3FLDQQLIAANASAIQf//A3EgA0H//wNxTw0BQQMhBAwDCyAGIAFPDQFBACEEDAILQX5BACAIQf//A3EgA0H//wNxSxtBACABGyEEDAELAkAgBiABTQ0AQQEhBAwBCyAIQf//A3EgA0H//wNxSyEECyACQYABaiSAgICAACAEC5sBAgJ/AX4jgICAgABBEGsiAySAgICAACABKAIEIQQgASgCACEBIAMgAkH/////A0s6AAwCQAJAIAJBgICAgARJDQBCgICAgBAhBQwBCwJAIAJBAnQiAg0AQvz///8PIQUMAQsgASACQQJBACAEKAIAEYCAgIAAgICAgAAiAkWtQiCGIAKthCEFCyAAIAU3AgAgA0EQaiSAgICAAAsSAAJAIAANAEEADwsgAC8BohsLEgACQCAADQBBAA8LIAAvAaAbCxIAAkAgAA0AQQAPCyAALwGMEgsSAAJAIAANAEEADwsgACgC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OgAEIAAgAyACQfwHcWoiAi8BADsBACAAQQJqIAJBAmotAAA6AAAMAgsgAEEBOgAEIAAgBUISiDwAAiAAIAVCCog8AAEgACAFQgKIPAAADAELIAEvAQggAUEKai0AAEEQdHIhBkHA1MeAACECAkACQAJAAkAgAS0ADA4DAwABAwsgBCADIAZB/wFxQQJ0aiICLwEAOwEAIAQgAkECai0AADoAAiAEIQIMAQsgBCAGOwEIIAQgBkEQdjoACiAEQQhqIQILIAJBAToABAsgACACKQIANwIACyAEQRBqJICAgIAAC5cDAgN/AX4jgICAgABBMGsiBSSAgICAAEF/IQYCQCAARQ0AIAFBAEgNACACQX9MDQACQCABIAAvAaAbTw0AIAIgAC8BohtPDQAgBEUNACAFQQA6AAwgBUEAOwEIIAUgATYCBCAFQRBqIAAoAhggBUEEahC5gYCAACAFLQAcRQ0AQX8hBiACIAUoAhAiAS8BrAJPDQEgASgCOCEHQQAhACADIAEoAhggASgCECIBaiAFLwEUQQN0aigCACABaiACQQN0aiICKQMAIginQQJ2Qf///wBxQQAgCEICg1AbNgIAQQEhBiACKQMAQgODQgFSDQEgBSAHIAFqNgIgIAVBJGogBUEgaiACIAFrEKeBgIAAAkACQCAFLQAsDQBBACECDAELIAUoAiQgAWohACAFKAIoIQILIABFDQEgA0EEaiEBQQEhBgNAIAZBf2ogAk8NAiAGIARPDQIgASAALwEAIABBAmotAABBEHRyNgIAIABBBGohACABQQRqIQEgBkEBaiEGDAALC0F/IQYLIAVBMGokgICAgAAgBgseAAJAAkAgAA0AQQAhAAwBCyAALQAoIQALIABBAXELPAEBfgJAIAANAEEADwsCQCAANQIAIABBBGoxAABCIIaEIgFCgIDgAINQDQBBAQ8LIAFCgICAAYNCFYinC/sHAgJ/AX4jgICAgABBEGsiAySAgICAAEEAIQQCQCAARQ0AIANBDGogASACENOCgIAAIAMtAA5FDQAgADUCACAAQQRqMAAAQiCGhCEFAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAy8BDCIAQX9qDhkBJQID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CWo2AgwMAQsDQAJAIAcgCSAJIAdLGyIIRQ0AIAogCyAI/AoAAAsgASABKAIMIAhqNgIMIAogB2ohCiAJIAdJIQggCSAHayEJIAhFDQALC0KAgICAICEFCyAAIAU3AgALBABBAAsEAEECCxIAIAAgAkEKQQAgARDog4CAAAvQAgEEfyOAgICAAEEwayIFJICAgIAAAkACQCACQf8BcSICQQpHDQBBACECAkADQCABQeQASQ0BIAVBD2ogAmpBH2ogASABQeQAbiIDQeQAbGsiASABQf8BcUEKbiIBQQpsa0EIdCABckGw4AByOwAAIAJBfmohAiADIQEMAAsLAkAgAUEJSw0AIAVBD2ogAmpBIGogAUEwcjoAACACQSBqIQYMAgsgBUEPaiACakEfaiABIAFB/wFxQQpuIgNBCmxrQQh0IANyQbDgAHI7AAAgAkEfaiEGDAELQTdB1wAgA0EBcRshB0EhIQYDQCAGQX9qIgYgBUEPamogASABIAJuIgggAmxrIgNBMHIgByADaiADQQpJGzoAACABIAJJIQMgCCEBIANFDQALCyAAIAVBD2ogBmpBISAGayAEEKOEgIAAIQEgBUEwaiSAgICAACABC48BAAJAAkAgAkEEcUUNACADLQAHDQELIABBADYBAA8LAkAgASgCDEEBRg0AAkAgAS8BECABQRJqLQAAQRB0ciICQYD+/wBqQf///wBxQYH+/wBPDQAgAEEANgEADwsgAEEBOgADIAAgAjoAAiAAQQA7AQAPCyAAQQE6AAMgAEEAOwEAIAAgASgCCC0AADoAAgs3AQF/AkAgAEH2kcmAAEEBEJqAgIAAIgJB//8DcQ0AIABBnLXKgAAgAS0AABCggICAACECCyACC3cBAX8gAkEEaiEFIAIgA0F/aiIDQQN0aigCBCAEbCECAkADQCADRQ0BIANBf2ohAyAFKAIAIAJqIQIgBUEIaiEFDAALCyAAQQA7AQQgACACNgIAIAEoAgwhAyABQQA2AgwgAUF4aiIFIAUpAwAgAyACaq18NwMAC2oBA38jgICAgABBEGsiASSAgICAACAAKAIAKAIAIQICQANAAkAgACgCDA0AQQAhAwwCCyABQQhqIABB2NTHgABBAUEBIAIRgYCAgACAgICAACABLwEMIgNFDQALCyABQRBqJICAgIAAIAML3QEBBH8jgICA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OwEADAULIANBFGogAUEBakECEIiEgIAAAkAgAy8BFCIIRQ0AIAAgCDsBBAwFCyADLQAWIQggA0EYaiABQQNqQQIQiISAgAACQCADLwEYIglFDQAgACAJOwEEDAULIAMtABohCSADQRxqIAFBBWpBAhCIhICAAAJAIAMvARwiCkUNACAAIAo7AQQMBQsgAEEAOwEEIABBAmogAy0AHjoAACAAIAlBCHQgCEH/AXFyOwEADAQLIANBIGogAUEBakEDEIiEgIAAAkAgAy8BICIIRQ0AIAAgCDsBBAwECyADLQAiIQggA0EkaiABQQRqQQMQiISAgAACQCADLwEkIglFDQAgACAJOwEEDAQLIAMtACYhCSADQShqIAFBB2pBAxCIhICAAAJAIAMvASgiCkUNACAAIAo7AQQMBAsgAEEAOwEEIABBAmogAy0AKjoAACAAIAlBCHQgCEH/AXFyOwEADAMLIANBLGogAUEBakEEEIiEgIAAAkAgAy8BLCIIRQ0AIAAgCDsBBAwDCyADLQAuIQggA0EwaiABQQVqQQQQiISAgAACQCADLwEwIglFDQAgACAJOwEEDAMLIAMtADIhCSADQTRqIAFBCWpBBBCIhICAAAJAIAMvATQiCkUNACAAIAo7AQQMAwsgAEEAOwEEIABBAmogAy0ANjoAACAAIAlBCHQgCEH/AXFyOwEADAILIABBADsBBCAAIAZBAnRByI3IgABqIggvAQA7AQAgAEECaiAIQQJqLQAAOgAADAELAkAgAUEEQQMgAS0AAyIIQekARhsiCWotAABBOkYNACAAQoCAgICgBTcCAAwBCyADQThqIAEgAiAJQQFqIglBLxCAhICAAAJAAkACQAJAAkAgAy0APEUNACADKAI4IgsgCWshCiABIAlqIQkgCEHpAEcNASADQcAAaiAJIAoQiYSAgAAgAy8BQCIJDQIgA0HAAGpBAmohCQwECyAAQoCAgICgBTcCAAwECyADQcQAaiAJIAoQiISAgAAgAy8BRCIJDQEgA0HEAGpBAmohCQwCCyAAIAk7AQQMAgsgACAJOwEEDAELIAktAAAhDCADQcgAaiABIAIgC0EBaiIJQS8QgISAgAACQAJAAkACQAJAAkACQCADLQBMRQ0AIAMoAkgiC0EBaiEKIAsgCWshCyABIAlqIQkgCEHpAEcNASADQdAAaiAJ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IAJBAWohAgwACwsgAykDSCEKQQEhAiAOQQE6AAAgAS0AACEBIAwtAAAhDAtBASEPDAILQgAhCgtBACEMQQAhAkEAIQ8LAkAgD0UNACAFIAhHDQAgAg0CIAdCWnxCRFQNBSAKQoCAgICAgIAQVg0FIAxBAXFFDQMMBQtBAyECAkACQCAGIAVB1KnAgABBAxCShICAAEEBcUUNAEEIQQMgBkEDaiAFQX1qQa+SwIAAQQUQkoSAgABBAXEbIQJEAAAAAAAA8P9EAAAAAAAA8H8gBEH/AXFBLUYbIRAMAQtEAAAAAAAA+H8hECAGIAVBmqTAgABBAxCShICAAEEBcUUNAQsgBSACRg0FCyAAQSo2AQAMBQsCQCAKQgBSDQBEAAAAAAAAAIBEAAAAAAAAAAAgAUEBcRshEAwECyAHQjd8IQcCQANAIApCf3xC/v///////x9WDQEgB0J/fCEHIApCAYYhCgwACwsgCiAMrUIBg4QhCgJAA0ACQCAKQv////////8/Vg0AAkADQCAKQgJUDQEgB0J9fEL/d1UNASAKQgGIIApCAYOEIQogB0IBfCEHDAALCyAHQn98IREgCkICiCINQgGDIApCA4OEQgNRDQIMBAsgCkIBiCAKQgGDhCEKIAdCAXwhBwwACwtCgICAgICAgAggDUIBfCIKIApCgICAgICAgBBRIgIbIQ0gByARIAIbIREMAQsCQAJAIAdCFlUNACAHpyECIAq6IRACQCAHQgBZDQAgEEHolMmAACACQQN0aysDAKMhEAwCCyACQQN0QeiUyYAAaisDACAQoiEQDAELIAMgCkIAIAenQQN0QbiVyYAAaikDAEIAEMeEgIAAIAMgAykDCEIAUiICOgBYIAINAiADKQMAIg1CgICAgICAgBBWDQIgDbpEktVNBs/wgESiIRALIBCaIBAgAUEBcRshEAwCCwJAQoF4IBEgDUKAgICAgICACFQbIgpC/wdXDQBEAAAAAAAA8P9EAAAAAAAA8H8gAUEBcRshEAwCCyAKQjSGQoCAgICAgID4P3xCgICAgICAgPj/AIMgDUL/////////B4OEIgpCgICAgICAgICAf4QgCiABQQFxG78hEAwBCyADQRhqIAcgChCThICAAAJAIAMtAChFDQAgAygCICECIAMpAxghDQJAIAxBAXENACACrUI0hiANhL8iEJogECABQQFxGyEQDAILIANBMGogByAKQgF8EJOEgIAAIAMtAEBFDQAgDSADKQMwUg0AIAIgAygCOEcNACACrUI0hiANhL8iEJogECABQQFxGyEQDAELQQAhAgJAQYUGRQ0AIANB3ABqQQBBhQb8CwALIANBADYC8AYgAyAFNgLoBiADIAY2AuQGAkADQAJAIAUgAkcNACAFIQIMAgsCQCAGIAJqLQAAIgFB3wBGDQAgAUEwRw0CCyACQQFqIQIMAAsLIAMgAjYC7AYgA0HhAGohAUEAIQICQANAIANB9gZqIANB5AZqEJSEgIAAIAMtAPcGRQ0BAkAgAkH/BUsNACABIAJqIAMtAPYGOgAACyACQQFqIQIMAAsLIAMgAjYCWEEAIQ8CQAJAAkAgAygC7AYiDiADKALoBiIITw0AIAMoAuQGIhIgDmotAABBLkYNAQtBACEFIAIhAQwBCyADKALwBiETIA5BAWoiFCEMAkAgAg0AIAhBf2ohCyASQQFqIQkDQAJAIAsgDkcNACAIIQwMAgsgCSAOaiEFIA5BAWoiDCEOIAUtAABBMEYNAAsLIBQgE2shEyABIAJqIQkgEiAMaiELQQAhBQJAA0AgAiAFaiEBIAwgBWoiDkEIaiAISw0BIAFB9wVLDQEgCyAFaikAACIKQsaMmbLkyJGjxgB8IApC0J+//vz58+dPfCIKhEKAgYKEiJCgwIB/g0IAUg0BIAkgBWogCjcAACAFQQhqIQUMAAsLIAMgDjYC7AYCQANAIANB+AZqIANB5AZqEJSEgIAAIAMtAPkGRQ0BAkAgAUH/BUsNACADQdgAaiABakEJaiADLQD4BjoAAAsgAUEBaiEBDAALCyADIAE2AlggAyATIAMoAvAGIAMoAuwGIg5raiIFNgJcCwJAIAFFDQAgDiADKALwBkF/c2ohAkEAIQwCQANAAkACQCAGIAJqLQAAQVJqDgMBAwADCyAMQQFqIQwLIAJBf2oiAg0ACwsgAyABIAVqIgU2AlwgAyABIAxrIgI2AlhBgAYhDwJAIAJBgAZLDQAgAiEPDAELIANBgAY2AlggA0EBOgBgCwJAIA4gAygC6AYiAU8NACADKALkBiIMIA5qLQAAQd8BcUHFAEcNAEEBIQsgAyAOQQFqIgg2AuwGQQAhAkEAIQYCQCAIIAFPDQBBACEGAkACQCAMIAhqLQAAQVVqDgMAAgECC0EAIQsLIAMgDkECajYC7AYgCyEGCwJAA0AgA0HIAGogA0HkBmoQlISAgAAgAy0ASUUNASACQQpsIAMtAEhqIAIgAkGAgARIGyECDAALCyADQQAgAmsgAiAGGyAFaiIFNgJcCyAPQRMgD0ETSxshASAPIQICQANAIAEgAkYNASADQdgAaiACakEJakEAOgAAIAJBAWohAgwACwtCACEHAkACQCAPRQ0AIAVBvH1IDQBCgICAgICAgPj/ACEKIAVBtQJKDQFBACEBA0ACQCAFQQBKDQAgA0HhAGohDANAAkACQAJAIAVBAEoNAAJAIAUNAEECIQIgDC0AACIGQQJJDQMgBkF7akH/AXFBBUkNAUEBIQIMAwtBACAFayICQRJNDQFBPCECDAILIAFBf2ohAgJAA0AgAkGBeEoNASADQdgAakGCeCACayIBQTwgAUE8SRsiARCVhICAACABIAJqIQIMAAsLIAJB/wdKDQYgA0HYAGpBNRCWhICAAAJAIANB2ABqEJeEgIAAIg1C/////////w9YDQAgA0HYAGpBARCVhICAACADQdgAahCXhICAACENIAJB/wdGDQcgAkEBaiECCyANQv////////8HgyEHQf4HQf8HIA1CgICAgICAgAhUGyACaq1CNIYhCgwGCyACQZjpyYAAai0AACECCyADQdgAaiACEJaEgIAAIAMoAlwiBUH/D0oNBCABIAJrIQEMAAsLQTwhAgJAIAVBEksNACAFQZjpyYAAai0AACECCyADQdgAaiACEJWEgIAAIAIgAWohASADKAJcIgVBgXBODQALC0IAIQoLIAogB4S/IhCaIBAgBEH/AXFBLUYbIRALAkACQCAQRAAAAAAAAAAAYw0AIBBEAAAAAAAA8D9kRQ0BCyAAQSo2AQAMAQsgAEEAOwEAIAAgEEQAAAAAAOBvQKL8AzoAAgsgA0GAB2okgICAgAALUAEBfyOAgICAAEEQayICJICAgIAAAkADQCACQQ5qIAAQtISAgAAgAi0AD0UNASABIAEpAwBCBIYgAjEADnw3AwAMAAsLIAJBEGokgICAgAALgQICAn8BfiOAgICAAEEQayICJICAgIAAIAAoAgghAwJAA0AgA0EIaiAAKAIESw0BIAAoAgAgA2opAAAiBELGjJmy5MiRo8YAfCAEQtCfv/78+fPn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QQNxDgQDAAECAwtBDCEEQf2iwIAAIQUMAgtBCSEEQeSTwIAAIQUMAQtBBSEEQYubwIAAIQULIAMgBTYCCCADIAQ2AgwgACADEKmEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQceWwIAAQQYQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACLQANELeEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQb+UwIAAQQsQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACLQAOELeEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQZWcwIAAQQwQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACLQAPELeEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEEERw0AIAAgARCvhICAACIEQf//A3ENASACKAIAIQQLAkAgBEEFRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEGcrcCAAEEHEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAigCBCACKAIIELaEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEEGRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEGcrsCAAEEJEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAkEEahC4hICAACIEQf//A3ENASAAQaOSwIAAQQIQmoCAgAAiBEH//wNxDQEgAigCACEECwJAIARBB0cNACAAQaaSwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHt6sCAAEECEJqAgIAAIgRB//8DcQ0BIABBva/AgABBBBCagICAACIEQf//A3ENASAAQYTrwIAAQQMQmoCAgAAiBEH//wNxDQEg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7erAgABBAhCagICAACIEQf//A3ENASAAQdWcwIAAQQUQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIABBnpLAgABBBxCagICAACIEQf//A3ENASAAQezqwIAAQQMQmoCAgAAiBEH//wNxDQEgAEG1ksCAAEEIEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAigCDBDng4CAACIEQf//A3ENASAAQaOSwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHs6sCAAEEDEJqAgIAAIgRB//8DcQ0BIABB953AgABBChCagICAACIEQf//A3ENASAAQYTrwIAAQQMQmoCAgAAiBEH//wNxDQEgACABIAItABAQuYSAgAAiBEH//wNxDQEgAEGjksCAAEECEJqAgIAAIgRB//8DcQ0BIAIoAgAhBAsCQCAEQQxHDQAgAEGmksCAAEECEJqAgIAAIgRB//8DcQ0BIABB7erAgABBAhCagICAACIEQf//A3ENASAAQd2twIAAQQUQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACKAIEIAIoAghBARC1hICAACIEQf//A3ENASAAQezqwIAAQQMQmoCAgAAiBEH//wNxDQEgAEHLlMCAAEEEEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAigCDCACKAIQQQEQtYSAgAAiBEH//wNxDQEgAEGjksCAAEECEJqAgIAAIgRB//8DcQ0BIAIoAgAhBAsCQCAEQQ1HDQAgAEGmksCAAEECEJqAgIAAIgRB//8DcQ0BIABB7erAgABBAhCagICAACIEQf//A3ENASAAQZiwwIAAQQIQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACKAIEIAIoAggQtoSAgAAiBEH//wNxDQEgAEHs6sCAAEEDEJqAgIAAIgRB//8DcQ0BIABBlKjAgABBAxCagICAACIEQf//A3ENASAAQYTrwIAAQQMQmoCAgAAiBEH//wNxDQEgACABIAIoAgwgAigCEEEBELWEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEEORw0AIAAgARCvhICAACIEQf//A3ENASACKAIAIQQLAkAgBEEPRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHinMCAAEELEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASAAIAEgAi8BBBCQg4CAACIEQf//A3ENASAAQaOSwIAAQQIQmoCAgAAiBEH//wNxDQEgAigCACEECwJAIARBEEcNACAAIAEgAigCBCACKAIIQQIQtYSAgAAiBEH//wNxDQEgAigCACEECwJAIARBEUcNACAAQefqwIAAQQQQmoCAgAAiBEH//wNxDQEgAEGGrMCAAEGim8CAACACLQAMG0EFEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENAQJAAkAgAi0ADA0AIAAgARCvhICAACIEQf//A3ENAyACLQAMRQ0BCyAAIAEgAigCBCACKAIIQQEQtYSAgAAiBEH//wNxDQILIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEESRw0AIABBppLAgABBAhCagICAACIEQf//A3ENASAAQe3qwIAAQQIQmoCAgAAiBEH//wNxDQEgAEHbrMCAAEEFEJqAgIAAIgRB//8DcQ0BIABBhOvAgABBAxCagICAACIEQf//A3ENASACKAIEIQYgA0EBNgIEIANB7urAgAA2AgBBBiEEQe6qwIAAIQUCQAJAAkACQAJAIAYOBQQAAQIDBAtBAyEEQaSbwIAAIQUMAwtBBSEEQYmewIAAIQUMAgtBDSEEQeuswIAAIQUMAQtBBSEEQfmswIAAIQULIAMgBTYCCCADIAQ2AgwgACADEKmEgIAAIgRB//8DcQ0BIABB7OrAgABBAxCagICAACIEQf//A3ENASAAQcycwIAAQQgQmoCAgAAiBEH//wNxDQEgAEGE68CAAEEDEJqAgIAAIgRB//8DcQ0BIAAgASACQQhqELiEgIAAIgRB//8DcQ0BIABBo5LAgABBAhCagICAACIEQf//A3ENASACKAIAIQQLAkAgBEETRw0AIAAgARCvhICAACIEQf//A3ENASACKAIAIQQLAkAgBEEURw0AIAAgASAC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IAdLDQBBACEJAkADQCAJIAZPDQECQCACKAIEIglFDQAgCCAKaiACKAIAIAn8CgAACyABIAEoAgwgCWoiCjYCDEEBIQkMAAsLIAIgBkEDdGoiCSgCACECAkACQCAJKAIEIgkOAgMAAQsCQCAERQ0AIAggCmogAi0AACAE/AsACyABIAEoAgwgBGo2AgwMAgsDQCAERQ0CAkAgCUUNACAIIApqIAIgCfwKAAALIAEgASgCDCAJaiIKNgIMIARBf2ohBAwACwsgBUEIaiABIAIgAyAEIAEoAgAoAgARgYCAgACAgICAACAAIAUpAwg3AgAMAQsgACALNgIAIABBADsBBAsgBUEQaiSAgICAAAtgAQJ/QgFBICAAQX9qZ2siAK1C//8Dg4anIQECQCAAQf//A3FBAnRBgL3KgABqIgIoAgAiAEUNACACIAFBEHQgAGpBfGooAgA2AgAgAA8LQQAgAUAAIgBBEHQgAEF/RhsL4AEBAn8jgICAgABBEGsiBiSAgICAACAGIANBH3E6AA9BfyAEQQRqIgcgByAESRsiBEEBIAN0IgMgBCADSxshBAJAAkACQCACQQRqIgIgAyACIANLGyIDQX9qZyICQW9qQQxLDQAgBEF/amciAw0BQQAhAwwCC0IBQSAgA0GDgARqQRB2QX9qZ2utQv//A4OGp0IBQSAgBEGDgARqQRB2QX9qZ2utQv//A4OGp0YhAwwBC0IBQSAgAmutQv//A4OGp0IBQSAgA2utQv//A4OGp0YhAwsgBkEQaiSAgICAACADCxwAIAFBACAEIAQgAiADIAQgBBC8hICAAEEBcRsLIwAgACgCACABIAJBH3EgAyAAKAIEKAIAEYCAgIAAgICAgAALJwAgACgCACABIAIgA0EfcSAEIAUgACgCBCgCBBGCgICAAICAgIAACycAIAAoAgAgASACIANBH3EgBCAFIAAoAgQoAggRgoCAgACAgICAAAslACAAKAIAIAEgAiADQR9xIAQgACgCBCgCDBGBgICAAICAgIAAC4QEAQt/I4CAgIAAQSBrIgUkgICAgAAgAiADQQN0aiIGQXhqKAIAIQcgBkF8aigCACEIIAFBCGoiBigCACEJIAZBADYCACABQQRqIgYoAgAhCiAGQarVqtV6NgIAIAFBDGoiBigCACELIAZBADYCACAFIAFBeGopAgA3Awgg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TzExeQAbTzEweQBjb25lbXVfc2hvd19tZXNzYWdlX2JveABjb25lbXVfbWVzc2FnZV9ib3gAG094ABtPOXgAG084eAAbTzd4ABtPNngAG08xNngAG081eAAbTzE1eAAbTzR4ABtPMTR4ABtPM3gAG08xM3gAG08yeAAbTzEyeAAbTzExeAAbTzEweABxdWVzdGlvbl9hcnJvdwBzd2FsbG93AE92ZXJmbG93AHJlZHJhdwAbT3cAG085dwAbTzh3ABtPN3cAG082dwAbTzE2dwAbTzV3ABtPMTV3ABtPNHcAG08xNHcAG08zdwAbTzEzdwAbTzJ3ABtPMTJ3ABtPMTF3ABtPMTB3ABtPdgAbTzl2ABtPOHYAG083dgAbTzZ2ABtPMTZ2ABtPNXYAG08xNXYAG080dgAbTzE0dgAbTzN2ABtPMTN2ABtPMnYAG08xMnYAG08xMXYAG08xMHYAY29udGV4dC1tZW51ABtPdQAbTzl1ABtPOHUAG083dQAbTzZ1ABtPMTZ1ABtPNXUAG08xNXUAG080dQAbTzE0dQAbTzN1ABtPMTN1ABtPMnUAG08xMnUAG08xMXUAG08xMHUAY29uZW11X3RhYl90eHQAY3Vyc29yX3RleHQAdmVydGljYWwtdGV4dABJbnB1dE91dHB1dABjb25lbXVfd2FpdF9pbnB1dABlbmRfb2ZfaW5wdXQAZGNzX3B1dABhcGNfcHV0AHpvb20tb3V0AENvbm5lY3Rpb25UaW1lZE91dABsaXN0AGNvbmVtdV9wcm9ncmVzc19yZXBvcnQAcHJvbXB0X3N0YXJ0AHNlbWFudGljX29wdGlvbl9zdGFydABoeXBlcmxpbmtfc3RhcnQAc2VtYW50aWNfZXhpdF9jb2RlX3N0YXJ0AGFwY19zdGFydABzZW1hbnRpY19wcm9tcHQAcHJpbnQAY3VycmVudABwcmVhbGxvY19zZWdtZW50AGRlZmF1bHQAd2FpdAByaWdodABsZWZ0AE5vU3BhY2VMZWZ0AHJlc2V0AEludmFsaWRGb3JtYXQAG090ABtPOXQAG084dAAbTzd0ABtPNnQAG08xNnQAG081dAAbTzE1dAAbTzR0ABtPMTR0ABtPM3QAG08xM3QAG08ydAAbTzEydAAbTzExdAAbTzEwdAByZXF1ZXN0cwBjbGlja19ldmVudHMAY2xpcGJvYXJkX2NvbnRlbnRzAGR5bmFtaWNfc2VnbWVudHMAY3Jvc3MAcHJvZ3Jlc3MAaXRlbXMAcGFyYW1zAGR1cmF0aW9uX21zAGludGVybWVkaWF0ZXMAU3lzdGVtUmVzb3VyY2VzAGFsaWFzABtPcwAbTzlzABtPOHMAG083cwAbTzZzABtPMTZzABtPNXMAG08xNXMAG080cwAbTzE0cwAbTzNzABtPMTNzABtPMnMAG08xMnMAG08xMXMAG08xMHMAZmxldXIAbGVmdF9wdHIAdGVybWluYXRvcgBjdXJzb3IAZXJyb3IARGVjb2RlRXJyb3IAb3NjX2NvbG9yAGNyb3NzaGFpcgBJc0RpcgBwb2ludGVyAEludmFsaWRDaGFyYWN0ZXIAdG9wX3JpZ2h0X2Nvcm5lcgBib3R0b21fcmlnaHRfY29ybmVyAHRvcF9sZWZ0X2Nvcm5lcgBib3R0b21fbGVmdF9jb3JuZXIAQ29ubmVjdGlvblJlc2V0QnlQZWVyABtPcgAbTzlyABtPOHIAG083cgAbTzZyABtPMTZyABtPNXIAG08xNXIAG080cgAbTzE0cgAbTzNyABtPMTNyABtPMnIAG08xMnIAG08xMXIAG08xMHIAG09xABtPOXEAG084cQAbTzdxABtPNnEAG08xNnEAG081cQAbTzE1cQAbTzRxABtPMTRxABtPM3EAG08xM3EAG08ycQAbTzEycQAbTzExcQAbTzEwcQBkbmQtbm8tZHJvcABoZWxwAHBhcmFtc19zZXAAY29uZW11X3NsZWVwAHJpZ2h0X3VubGVzc19wZW5kaW5nX3dyYXAAG09wABtPOXAAG084cAAbTzdwABtPNnAAG08xNnAAG081cAAbTzE1cAAbTzRwABtPMTRwABtPM3AAG08xM3AAG08ycAAbTzEycAAbTzExcAAbTzEwcABEaXZpc2lvbkJ5WmVybwBjb25lbXVfZ3VpbWFjcm8AG09vABtPOW8AG084bwAbTzdvABtPNm8AG08xNm8AG081bwAbTzE1bwAbTzRvABtPMTRvABtPM28AG08xM28AG08ybwAbTzEybwAbTzExbwAbTzEwbwB0ZXJtaW5hbC5QYXJzZXIuQWN0aW9uAGNvbnRpbnVhdGlvbgBVdGY4RXhwZWN0ZWRDb250aW51YXRpb24AY29sb3Jfb3BlcmF0aW9uAE1pc3NpbmdPcGVyYXRpb24ATG9ja1Zpb2xhdGlvbgBzaG93X2Rlc2t0b3Bfbm90aWZpY2F0aW9uAHJ4dnRfZXh0ZW5zaW9uAGNoYW5nZV93aW5kb3dfaWNvbgB6b29tLWluAGxlbgBuYW4AG09uABtPOW4AG084bgAbTzduABtPNm4AG08xNm4AG081bgAbTzE1bgAbTzRuABtPMTRuABtPM24AG08xM24AG08ybgAbTzEybgAbTzExbgAbWzBuABtPMTBuAHh0ZXJtAEVuZE9mU3RyZWFtABtPbQAbTzltABtPOG0AG083bQAbTzZtABtPMTZtABtPNW0AG08xNW0AG080bQAbTzE0bQAbTzNtABtPMTNtABtPMm0AG08xMm0AG08xMW0AG08xMG0AY21kbGluZV91cmwAa2l0dHlfY29sb3JfcHJvdG9jb2wAbnVsbABhbGwtc2Nyb2xsAGNlbGwAdmlzdWFsX2JlbGwAYWxsAGJlbABmaW5hbABtYXNrAGRjc191bmhvb2sAZGNzX2hvb2sAZG5kLWxpbmsAV291bGRCbG9jawAbT2sAG085awAbTzhrABtPN2sAG082awAbTzE2awAbTzVrABtPMTVrABtPNGsAG08xNGsAG08zawAbTzEzawAbTzJrABtPMTJrABtPMTFrABtPMTBrABtPagAbTzlqABtPOGoAG083agAbTzZqABtPMTZqABtPNWoAG08xNWoAG080agAbTzE0agAbTzNqABtPMTNqABtPMmoAG08xMmoAG08xMWoAG08xMGoAaHlwZXJsaW5rX3VyaQBIeXBlcmxpbmtTZXROZWVkc1JlaGFzaABTdHlsZVNldE5lZWRzUmVoYXNoAGxlZnRfcHRyX3dhdGNoAGNzaV9kaXNwYXRjaABvc2NfZGlzcGF0Y2gAZXNjX2Rpc3BhdGNoAGFsbG9jYWJsZV9zdHJpbmcAU3RyZWFtaW5nAFV0ZjhPdmVybG9uZ0VuY29kaW5nAE5vdE9wZW5Gb3JSZWFkaW5nAGdyYWJiaW5nAEludmFsaWRFbnVtVGFnAGluZgBVdGY4RW5jb2Rlc1N1cnJvZ2F0ZUhhbGYAVXRmOENhbm5vdEVuY29kZVN1cnJvZ2F0ZUhhbGYAbmVzdy1yZXNpemUAcm93LXJlc2l6ZQBudy1yZXNpemUAZXctcmVzaXplAG5zLXJlc2l6ZQBuLXJlc2l6ZQBjb2wtcmVzaXplAG53c2UtcmVzaXplAG5lLXJlc2l6ZQByZW1vdmUAZG5kLW1vdmUAdHJ1ZQBjb25lbXVfcHJvZ3Jlc3NfcHJldmFsdWUAY29uZW11X3Byb2dyZXNzX3ZhbHVlAGNvbmVtdV9zbGVlcF92YWx1ZQBzZW1hbnRpY19vcHRpb25fdmFsdWUAaHlwZXJsaW5rX3BhcmFtX3ZhbHVlAGtpdHR5X2NvbG9yX3Byb3RvY29sX3ZhbHVlAFV0ZjhJbnZhbGlkU3RhcnRCeXRlAGV4ZWN1dGUAY29tcGxldGUAY29uZW11X3Byb2dyZXNzX3ByZXN0YXRlAGNvbmVtdV9wcm9ncmVzc19zdGF0ZQBhbHRlcm5hdGUAaW5kZXRlcm1pbmF0ZQBwYXVzZQBmYWxzZQBCcm9rZW5QaXBlAG1vdXNlX3NoYXBlAGNtZGxpbmUAY2hhbmdlX3dpbmRvd190aXRsZQBub3RpZmljYXRpb25fdGl0bGUAY29uZW11X2NoYW5nZV90YWJfdGl0bGUAY3Jvc3NlZF9jaXJjbGUAVW5zZWVrYWJsZQBVdGY4Q29kZXBvaW50VG9vTGFyZ2UAc2VtYW50aWNfZXhpdF9jb2RlAHJpZ2h0X3NpZGUAbGVmdF9zaWRlAHRvcF9zaWRlAGJvdHRvbV9zaWRlAHJlcG9ydF9wd2QAc2Vjb25kX3RyYW5zcGFyZW50X2JhY2tncm91bmQAc2VsZWN0aW9uX2JhY2tncm91bmQAc2VsZWN0aW9uX2ZvcmVncm91bmQAUHJvY2Vzc05vdEZvdW5kAGNsaXBib2FyZF9raW5kAHByb21wdF9lbmQAaHlwZXJsaW5rX2VuZABjbGlwYm9hcmRfa2luZF9lbmQAYXBjX2VuZABlbmRfb2ZfY29tbWFuZABoYW5kAHZvaWQAaW52YWxpZABhaWQAbm90LWFsbG93ZWQAT3BlcmF0aW9uQWJvcnRlZABVbmltcGxlbWVudGVkAFVuZXhwZWN0ZWQAU29ja2V0Tm90Q29ubmVjdGVkAFdyaXRlRmFpbGVkAFJlYWRGYWlsZWQAQ2FuY2VsZWQAQWNjZXNzRGVuaWVkAFBlcm1pc3Npb25EZW5pZWQAG1s/NjI7MjJj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OTUxNTMxMzgyNTY5MTg3MTc4NTIxNzMwMTc0OTA3MTMzOTE0NTMwMjc3MjUyMTk3MjY1NjI1ADQ4MTQ4MjQ4NjA5NjgwODk2MzI2Mzk5NDQ4NTY0NjIzMTgyOTYzNDUyNTQxMjA1Mzg0NzA0ODgwOTk4NDY5ODg5MTYzOTcwOTQ3MjY1NjI1ADg4ODE3ODQxOTcwMDEyNTIzMjMzODkwNTMzNDQ3MjY1NjI1ADMxNTU0NDM2MjA4ODQwNDcyMjE2NDY5MTQyNjExMzExNDQ5MTg2OTI4MjU3NDA0MzYwOTIwMTkwODExMTU3MjI2NTYyNQA1ODIwNzY2MDkxMzQ2NzQwNzIyNjU2MjUAMTM1NTI1MjcxNTYwNjg4MDU0MjUwOTMxNjAwMTA4NzQyNzEzOTI4MjIyNjU2MjUANTA0ODcwOTc5MzQxNDQ3NTU1NDYzNTA2MjgxNzgwOTgzMTg2OTkwODUyMTE4NDY5Nzc0NzIzMDUyOTc4NTE1NjI1ADkzMTMyMjU3NDYxNTQ3ODUxNTYyNQAxMTc1NDk0MzUwODIyMjg3NTA3OTY4NzM2NTM3MjIyMjQ1Njc3ODE4NjY1NTU2NzcyMDg3NTIxNTA4NzUxNzA2Mjc4NDE3MjU5NDU0NzI3MTcyODUxNTYyNQAyMTY4NDA0MzQ0OTcxMDA4ODY4MDE0OTA1NjAxNzM5ODgzNDIyODUxNTYyNQAxNDIxMDg1NDcxNTIwMjAwMzcxNzQyMjQ4NTM1MTU2MjUANzcwMzcxOTc3NzU0ODk0MzQxMjIyMzkxMTc3MDMzOTcwOTI3NDE1MjQwNjU5Mjg2MTU1Mjc4MDk1OTc1NTE4MjI2NjIzNTM1MTU2MjUAMzMwODcyMjQ1MDIxMjExMDY5OTQ4NTYzNDc2ODI3OTg1MTQxNDI2MzI0ODQ0MzYwMzUxNTYyNQA2MTAzNTE1NjI1ADE5NzIxNTIyNjMwNTI1Mjk1MTM1MjkzMjE0MTMyMDY5NjU1NzQxODMwMTYwODc3NzI1NTc1MTE5MjU2OTczMjY2NjAxNTYyNQAzNjM3OTc4ODA3MDkxNzEyOTUxNjYwMTU2MjUAODQ3MDMyOTQ3MjU0MzAwMzM5MDY4MzIyNTAwNjc5NjQxOTYyMDUxMzkxNjAxNTYyNQAyMzg0MTg1NzkxMDE1NjI1ADEyOTI0Njk3MDcxMTQxMDU3NDE5ODY1NzYwODEzNTkzMTY5NTg2OTY1ODE0MjMyODI2MjMyOTEwMTU2MjUANTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjUAMzAwOTI2NTUzODEwNTA1NjAyMDM5OTk2NTUzNTI4ODk0ODkzNTIxNTc4MzgyNTMzNjU0NDA1NTA2MjQwNDM2ODA3Mjc0ODE4NDIwNDEwMTU2MjUAMTUyNTg3ODkwNjI1ADgyNzE4MDYxMjU1MzAyNzY3NDg3MTQwODY5MjA2OTk2Mjg1MzU2NTgxMjExMDkwMDg3ODkwNjI1ADE5MjU5Mjk5NDQzODcyMzU4NTMwNTU5Nzc5NDI1ODQ5MjczMTg1MzgxMDE2NDgyMTUzODgxOTUyMzk5Mzg3OTU1NjY1NTg4Mzc4OTA2MjUAMzU1MjcxMzY3ODgwMDUwMDkyOTM1NTYyMTMzNzg5MDYyNQAyMzI4MzA2NDM2NTM4Njk2Mjg5MDYyNQAxMjYyMTc3NDQ4MzUzNjE4ODg4NjU4NzY1NzA0NDUyNDU3OTY3NDc3MTMwMjk2MTc0NDM2ODA3NjMyNDQ2Mjg5MDYyNQA1NDIxMDEwODYyNDI3NTIyMTcwMDM3MjY0MDA0MzQ5NzA4NTU3MTI4OTA2MjUANTk2MDQ2NDQ3NzUzOTA2MjUAMzIzMTE3NDI2Nzc4NTI2NDM1NDk2NjQ0MDIwMzM5ODI5MjM5Njc0MTQ1MzU1ODIwNjU1ODIyNzUzOTA2MjUAMTM4Nzc3ODc4MDc4MTQ0NTY3NTUyOTUzOTU4NTExMzUyNTM5MDYyNQA3NTIzMTYzODQ1MjYyNjQwMDUwOTk5OTEzODM4MjIyMzcyMzM4MDM5NDU5NTYzMzQxMzYwMTM3NjU2MDEwOTIwMTgxODcwNDYwNTEwMjUzOTA2MjUANDkzMDM4MDY1NzYzMTMyMzc4MzgyMzMwMzUzMzAxNzQxMzkzNTQ1NzU0MDIxOTQzMTM5Mzc3OTgxNDI0MzMxNjY1MDM5MDYyNQA5MDk0OTQ3MDE3NzI5MjgyMzc5MTUwMzkwNjI1ADIxMTc1ODIzNjgxMzU3NTA4NDc2NzA4MDYyNTE2OTkxMDQ5MDUxMjg0NzkwMDM5MDYyNQAzMzg4MTMxNzg5MDE3MjAxMzU2MjczMjkwMDAyNzE4NTY3ODQ4MjA1NTY2NDA2MjUAMTQ1NTE5MTUyMjgzNjY4NTE4MDY2NDA2MjUANzg4ODYwOTA1MjIxMDExODA1NDExNzI4NTY1MjgyNzg2MjI5NjczMjA2NDM1MTA5MDIzMDA0NzcwMjc4OTMwNjY0MDYyNQAxMjAzNzA2MjE1MjQyMDIyNDA4MTU5OTg2MjE0MTE1NTc5NTc0MDg2MzEzNTMwMTM0NjE3NjIyMDI0OTYxNzQ3MjI5MDk5MjczNjgxNjQwNjI1ADIyMjA0NDYwNDkyNTAzMTMwODA4NDcyNjMzMzYxODE2NDA2MjUANTE2OTg3ODgyODQ1NjQyMjk2Nzk0NjMwNDMyNTQzNzI2NzgzNDc4NjMyNTY5MzEzMDQ5MzE2NDA2MjUAOTUzNjc0MzE2NDA2MjUANDcwMTk3NzQwMzI4OTE1MDAzMTg3NDk0NjE0ODg4ODk4MjcxMTI3NDY2MjIyNzA4ODM1MDA4NjAzNTAwNjgyNTExMzY2OTAzNzgxODkwODY5MTQwNjI1ADg2NzM2MTczNzk4ODQwMzU0NzIwNTk2MjI0MDY5NTk1MzM2OTE0MDYyNQAzNzI1MjkwMjk4NDYxOTE0MDYyNQAyMDE5NDgzOTE3MzY1NzkwMjIxODU0MDI1MTI3MTIzOTMyNzQ3OTYzNDA4NDczODc5MDk4ODkyMjExOTE0MDYyNQA1Njg0MzQxODg2MDgwODAxNDg2OTY4OTk0MTQwNjI1ADMwODE0ODc5MTEwMTk1NzczNjQ4ODk1NjQ3MDgxMzU4ODM3MDk2NjA5NjI2MzcxNDQ2MjExMTIzODM5MDIwNzI5MDY0OTQxNDA2MjUAMTMyMzQ4ODk4MDA4NDg0NDI3OTc5NDI1MzkwNzMxMTk0MDU2NTcwNTI5OTM3NzQ0MTQwNjI1ADI0NDE0MDYyNQAzODUxODU5ODg4Nzc0NDcxNzA2MTExOTU1ODg1MTY5ODU0NjM3MDc2MjAzMjk2NDMwNzc2MzkwNDc5ODc3NTkxMTMzMTE3Njc1NzgxMjUANzEwNTQyNzM1NzYwMTAwMTg1ODcxMTI0MjY3NTc4MTI1ADMwNTE3NTc4MTI1ADE2NTQzNjEyMjUxMDYwNTUzNDk3NDI4MTczODQxMzk5MjU3MDcxMzE2MjQyMjE4MDE3NTc4MTI1ADI1MjQzNTQ4OTY3MDcyMzc3NzczMTc1MzE0MDg5MDQ5MTU5MzQ5NTQyNjA1OTIzNDg4NzM2MTUyNjQ4OTI1NzgxMjUANDY1NjYxMjg3MzA3NzM5MjU3ODEyNQA1ODc3NDcxNzU0MTExNDM3NTM5ODQzNjgyNjg2MTExMjI4Mzg5MDkzMzI3NzgzODYwNDM3NjA3NTQzNzU4NTMxMzkyMDg2Mjk3MjczNjM1ODY0MjU3ODEyNQAxMDg0MjAyMTcyNDg1NTA0NDM0MDA3NDUyODAwODY5OTQxNzExNDI1NzgxMjUAMTE5MjA5Mjg5NTUwNzgxMjUANjQ2MjM0ODUzNTU3MDUyODcwOTkzMjg4MDQwNjc5NjU4NDc5MzQ4MjkwNzExNjQxMzExNjQ1NTA3ODEyNQAyNzc1NTU3NTYxNTYyODkxMzUxMDU5MDc5MTcwMjI3MDUwNzgxMjUAMTUwNDYzMjc2OTA1MjUyODAxMDE5OTk4Mjc2NzY0NDQ3NDQ2NzYwNzg5MTkxMjY2ODI3MjAyNzUzMTIwMjE4NDAzNjM3NDA5MjEwMjA1MDc4MTI1ADQyMzUxNjQ3MzYyNzE1MDE2OTUzNDE2MTI1MDMzOTgyMDk4MTAyNTY5NTgwMDc4MTI1ADE4MTg5ODk0MDM1NDU4NTY0NzU4MzAwNzgxMjUAOTg2MDc2MTMxNTI2MjY0NzU2NzY0NjYwNzA2NjAzNDgyNzg3MDkxNTA4MDQzODg2Mjc4NzU1OTYyODQ4NjYzMzMwMDc4MTI1ADExMzY4NjgzNzcyMTYxNjAyOTczOTM3OTg4MjgxMjUANjE2Mjk3NTgyMjAzOTE1NDcyOTc3OTEyOTQxNjI3MTc2NzQxOTMyMTkyNTI3NDI4OTI0MjIyNDc2NzgwNDE0NTgxMjk4ODI4MTI1ADI2NDY5Nzc5NjAxNjk2ODg1NTk1ODg1MDc4MTQ2MjM4ODExMzE0MTA1OTg3NTQ4ODI4MTI1ADE3MzQ3MjM0NzU5NzY4MDcwOTQ0MTE5MjQ0ODEzOTE5MDY3MzgyODEyNQA5NDAzOTU0ODA2NTc4MzAwMDYzNzQ5ODkyMjk3Nzc3OTY1NDIyNTQ5MzI0NDU0MTc2NzAwMTcyMDcwMDEzNjUwMjI3MzM4MDc1NjM3ODE3MzgyODEyNQA3NDUwNTgwNTk2OTIzODI4MTI1ADQwMzg5Njc4MzQ3MzE1ODA0NDM3MDgwNTAyNTQyNDc4NjU0OTU5MjY4MTY5NDc3NTgxOTc3ODQ0MjM4MjgxMjUAMTAzMzk3NTc2NTY5MTI4NDU5MzU4OTI2MDg2NTA4NzQ1MzU2Njk1NzI2NTEzODYyNjA5ODYzMjgxMjUAMTkwNzM0ODYzMjgxMjUAMjQwNzQxMjQzMDQ4NDA0NDgxNjMxOTk3MjQyODIzMTE1OTE0ODE3MjYyNzA2MDI2OTIzNTI0NDA0OTkyMzQ5NDQ1ODE5ODU0NzM2MzI4MTI1ADQ0NDA4OTIwOTg1MDA2MjYxNjE2OTQ1MjY2NzIzNjMyODEyNQAxNTc3NzIxODEwNDQyMDIzNjEwODIzNDU3MTMwNTY1NTcyNDU5MzQ2NDEyODcwMjE4MDQ2MDA5NTQwNTU3ODYxMzI4MTI1ADI5MTAzODMwNDU2NzMzNzAzNjEzMjgxMjUANjc3NjI2MzU3ODAzNDQwMjcxMjU0NjU4MDAwNTQzNzEzNTY5NjQxMTEzMjgxMjUAMjk4MDIzMjIzODc2OTUzMTI1ADE2MTU1ODcxMzM4OTI2MzIxNzc0ODMyMjAxMDE2OTkxNDYxOTgzNzA3MjY3NzkxMDMyNzkxMTM3Njk1MzEyNQA2OTM4ODkzOTAzOTA3MjI4Mzc3NjQ3Njk3OTI1NTY3NjI2OTUzMTI1ADM3NjE1ODE5MjI2MzEzMjAwMjU0OTk5NTY5MTkxMTExODYxNjkwMTk3Mjk3ODE2NzA2ODAwNjg4MjgwMDU0NjAwOTA5MzUyMzAyNTUxMjY5NTMxMjUANDU0NzQ3MzUwODg2NDY0MTE4OTU3NTE5NTMxMjUAMjQ2NTE5MDMyODgxNTY2MTg5MTkxMTY1MTc2NjUwODcwNjk2NzcyODc3MDEwOTcxNTY5Njg4OTkwNzEyMTY1ODMyNTE5NTMxMjUAMTA1ODc5MTE4NDA2Nzg3NTQyMzgzNTQwMzEyNTg0OTU1MjQ1MjU2NDIzOTUwMTk1MzEyNQAxNzc2MzU2ODM5NDAwMjUwNDY0Njc3ODEwNjY4OTQ1MzEyNQA5NjI5NjQ5NzIxOTM2MTc5MjY1Mjc5ODg5NzEyOTI0NjM2NTkyNjkwNTA4MjQxMDc2OTQwOTc2MTk5NjkzOTc3ODMyNzk0MTg5NDUzMTI1ADc2MjkzOTQ1MzEyNQA0MTM1OTAzMDYyNzY1MTM4Mzc0MzU3MDQzNDYwMzQ5ODE0MjY3ODI5MDYwNTU0NTA0Mzk0NTMxMjUAMjcxMDUwNTQzMTIxMzc2MTA4NTAxODYzMjAwMjE3NDg1NDI3ODU2NDQ1MzEyNQAxMTY0MTUzMjE4MjY5MzQ4MTQ0NTMxMjUANjMxMDg4NzI0MTc2ODA5NDQ0MzI5MzgyODUyMjI2MjI4OTgzNzM4NTY1MTQ4MDg3MjE4NDAzODE2MjIzMTQ0NTMxMjUAMTAwOTc0MTk1ODY4Mjg5NTExMDkyNzAxMjU2MzU2MTk2NjM3Mzk4MTcwNDIzNjkzOTU0OTQ0NjEwNTk1NzAzMTI1ADE4NjI2NDUxNDkyMzA5NTcwMzEyNQA0MzM2ODA4Njg5OTQyMDE3NzM2MDI5ODExMjAzNDc5NzY2ODQ1NzAzMTI1ADIzNTA5ODg3MDE2NDQ1NzUwMTU5Mzc0NzMwNzQ0NDQ0OTEzNTU2MzczMzExMTM1NDQxNzUwNDMwMTc1MDM0MTI1NTY4MzQ1MTg5MDk0NTQzNDU3MDMxMjUAMjg0MjE3MDk0MzA0MDQwMDc0MzQ4NDQ5NzA3MDMxMjUAMTU0MDc0Mzk1NTUwOTc4ODY4MjQ0NDc4MjM1NDA2Nzk0MTg1NDgzMDQ4MTMxODU3MjMxMDU1NjE5MTk1MTAzNjQ1MzI0NzA3MDMxMjUANjYxNzQ0NDkwMDQyNDIyMTM5ODk3MTI2OTUzNjU1OTcwMjgyODUyNjQ5Njg4NzIwNzAzMTI1ADEyMjA3MDMxMjUAMjU4NDkzOTQxNDIyODIxMTQ4Mzk3MzE1MjE2MjcxODYzMzkxNzM5MzE2Mjg0NjU2NTI0NjU4MjAzMTI1ADQ3NjgzNzE1ODIwMzEyNQAxMTEwMjIzMDI0NjI1MTU2NTQwNDIzNjMxNjY4MDkwODIwMzEyNQA2MDE4NTMxMDc2MjEwMTEyMDQwNzk5OTMxMDcwNTc3ODk3ODcwNDMxNTY3NjUwNjczMDg4MTEwMTI0ODA4NzM2MTQ1NDk2MzY4NDA4MjAzMTI1ADE2OTQwNjU4OTQ1MDg2MDA2NzgxMzY2NDUwMDEzNTkyODM5MjQxMDI3ODMyMDMxMjUAMzk0NDMwNDUyNjEwNTA1OTAyNzA1ODY0MjgyNjQxMzkzMTE0ODM2NjAzMjE3NTU0NTExNTAyMzg1MTM5NDY1MzMyMDMxMjUANzI3NTk1NzYxNDE4MzQyNTkwMzMyMDMxMjUAb3NjXzE1AG9zY18xMTUAb3NjXzEwNQBvc2NfNABvc2NfMTQAb3NjXzExNABvc2NfMTA0ADEzMwBvc2NfMTMAb3NjXzExMwA1MgAyMgBvc2NfMTIAb3NjXzExMgBoYW5kMQAyMQBvc2NfMTEAb3NjXzExMQBvc2NfMTAAb3NjXzExMABlcnJvci4ALnsgLgAsIC4AQGVudW1Gcm9tSW50KAAkJwB7IAAgPSAALCAAGxsAGw0AMjU1IDI1MCAyNTAJCXNub3cKMjQ4IDI0OCAyNTUJCWdob3N0IHdoaXRlCjI0OCAyNDggMjU1CQlHaG9zdFdoaXRlCjI0NSAyNDUgMjQ1CQl3aGl0ZSBzbW9rZQoyNDUgMjQ1IDI0NQkJV2hpdGVTbW9rZQoyMjAgMjIwIDIyMAkJZ2FpbnNib3JvCjI1NSAyNTAgMjQwCQlmbG9yYWwgd2hpdGUKMjU1IDI1MCAyNDAJCUZsb3JhbFdoaXRlCjI1MyAyNDUgMjMwCQlvbGQgbGFjZQoyNTMgMjQ1IDIzMAkJT2xkTGFjZQoyNTAgMjQwIDIzMAkJbGluZW4KMjUwIDIzNSAyMTUJCWFudGlxdWUgd2hpdGUKMjUwIDIzNSAyMTUJCUFudGlxdWVXaGl0ZQoyNTUgMjM5IDIxMwkJcGFwYXlhIHdoaXAKMjU1IDIzOSAyMTMJCVBhcGF5YVdoaXAKMjU1IDIzNSAyMDUJCWJsYW5jaGVkIGFsbW9uZAoyNTUgMjM1IDIwNQkJQmxhbmNoZWRBbG1vbmQKMjU1IDIyOCAxOTYJCWJpc3F1ZQoyNTUgMjE4IDE4NQkJcGVhY2ggcHVmZgoyNTUgMjE4IDE4NQkJUGVhY2hQdWZmCjI1NSAyMjIgMTczCQluYXZham8gd2hpdGUKMjU1IDIyMiAxNzMJCU5hdmFqb1doaXRlCjI1NSAyMjggMTgxCQltb2NjYXNpbgoyNTUgMjQ4IDIyMAkJY29ybnNpbGsKMjU1IDI1NSAyNDAJCWl2b3J5CjI1NSAyNTAgMjA1CQlsZW1vbiBjaGlmZm9uCjI1NSAyNTAgMjA1CQlMZW1vbkNoaWZmb24KMjU1IDI0NSAyMzgJCXNlYXNoZWxsCjI0MCAyNTUgMjQwCQlob25leWRldwoyNDUgMjU1IDI1MAkJbWludCBjcmVhbQoyNDUgMjU1IDI1MAkJTWludENyZWFtCjI0MCAyNTUgMjU1CQlhenVyZQoyNDAgMjQ4IDI1NQkJYWxpY2UgYmx1ZQoyNDAgMjQ4IDI1NQkJQWxpY2VCbHVlCjIzMCAyMzAgMjUwCQlsYXZlbmRlcgoyNTUgMjQwIDI0NQkJbGF2ZW5kZXIgYmx1c2gKMjU1IDI0MCAyNDUJCUxhdmVuZGVyQmx1c2gKMjU1IDIyOCAyMjUJCW1pc3R5IHJvc2UKMjU1IDIyOCAyMjUJCU1pc3R5Um9zZQoyNTUgMjU1IDI1NQkJd2hpdGUKICAwICAgMCAgIDAJCWJsYWNrCiA0NyAgNzkgIDc5CQlkYXJrIHNsYXRlIGdyYXkKIDQ3ICA3OSAgNzkJCURhcmtTbGF0ZUdyYXkKIDQ3ICA3OSAgNzkJCWRhcmsgc2xhdGUgZ3JleQogNDcgIDc5ICA3OQkJRGFya1NsYXRlR3JleQoxMDUgMTA1IDEwNQkJZGltIGdyYXkKMTA1IDEwNSAxMDUJCURpbUdyYXkKMTA1IDEwNSAxMDUJCWRpbSBncmV5CjEwNSAxMDUgMTA1CQlEaW1HcmV5CjExMiAxMjggMTQ0CQlzbGF0ZSBncmF5CjExMiAxMjggMTQ0CQlTbGF0ZUdyYXkKMTEyIDEyOCAxNDQJCXNsYXRlIGdyZXkKMTEyIDEyOCAxNDQJCVNsYXRlR3JleQoxMTkgMTM2IDE1MwkJbGlnaHQgc2xhdGUgZ3JheQoxMTkgMTM2IDE1MwkJTGlnaHRTbGF0ZUdyYXkKMTE5IDEzNiAxNTMJCWxpZ2h0IHNsYXRlIGdyZXkKMTE5IDEzNiAxNTMJCUxpZ2h0U2xhdGVHcmV5CjE5MCAxOTAgMTkwCQlncmF5CjE5MCAxOTAgMTkwCQlncmV5CjE5MCAxOTAgMTkwCQl4MTEgZ3JheQoxOTAgMTkwIDE5MAkJWDExR3JheQoxOTAgMTkwIDE5MAkJeDExIGdyZXkKMTkwIDE5MCAxOTAJCVgxMUdyZXkKMTI4IDEyOCAxMjgJCXdlYiBncmF5CjEyOCAxMjggMTI4CQlXZWJHcmF5CjEyOCAxMjggMTI4CQl3ZWIgZ3JleQoxMjggMTI4IDEyOAkJV2ViR3JleQoyMTEgMjExIDIxMQkJbGlnaHQgZ3JleQoyMTEgMjExIDIxMQkJTGlnaHRHcmV5CjIxMSAyMTEgMjExCQlsaWdodCBncmF5CjIxMSAyMTEgMjExCQlMaWdodEdyYXkKIDI1ICAyNSAxMTIJCW1pZG5pZ2h0IGJsdWUKIDI1ICAyNSAxMTIJCU1pZG5pZ2h0Qmx1ZQogIDAgICAwIDEyOAkJbmF2eQogIDAgICAwIDEyOAkJbmF2eSBibHVlCiAgMCAgIDAgMTI4CQlOYXZ5Qmx1ZQoxMDAgMTQ5IDIzNwkJY29ybmZsb3dlciBibHVlCjEwMCAxNDkgMjM3CQlDb3JuZmxvd2VyQmx1ZQogNzIgIDYxIDEzOQkJZGFyayBzbGF0ZSBibHVlCiA3MiAgNjEgMTM5CQlEYXJrU2xhdGVCbHVlCjEwNiAgOTAgMjA1CQlzbGF0ZSBibHVlCjEwNiAgOTAgMjA1CQlTbGF0ZUJsdWUKMTIzIDEwNCAyMzgJCW1lZGl1bSBzbGF0ZSBibHVlCjEyMyAxMDQgMjM4CQlNZWRpdW1TbGF0ZUJsdWUKMTMyIDExMiAyNTUJCWxpZ2h0IHNsYXRlIGJsdWUKMTMyIDExMiAyNTUJCUxpZ2h0U2xhdGVCbHVlCiAgMCAgIDAgMjA1CQltZWRpdW0gYmx1ZQogIDAgICAwIDIwNQkJTWVkaXVtQmx1ZQogNjUgMTA1IDIyNQkJcm95YWwgYmx1ZQogNjUgMTA1IDIyNQkJUm95YWxCbHVlCiAgMCAgIDAgMjU1CQlibHVlCiAzMCAxNDQgMjU1CQlkb2RnZXIgYmx1ZQogMzAgMTQ0IDI1NQkJRG9kZ2VyQmx1ZQogIDAgMTkxIDI1NQkJZGVlcCBza3kgYmx1ZQogIDAgMTkxIDI1NQkJRGVlcFNreUJsdWUKMTM1IDIwNiAyMzUJCXNreSBibHVlCjEzNSAyMDYgMjM1CQlTa3lCbHVlCjEzNSAyMDYgMjUwCQlsaWdodCBza3kgYmx1ZQoxMzUgMjA2IDI1MAkJTGlnaHRTa3lCbHVlCiA3MCAxMzAgMTgwCQlzdGVlbCBibHVlCiA3MCAxMzAgMTgwCQlTdGVlbEJsdWUKMTc2IDE5NiAyMjIJCWxpZ2h0IHN0ZWVsIGJsdWUKMTc2IDE5NiAyMjIJCUxpZ2h0U3RlZWxCbHVlCjE3MyAyMTYgMjMwCQlsaWdodCBibHVlCjE3MyAyMTYgMjMwCQlMaWdodEJsdWUKMTc2IDIyNCAyMzAJCXBvd2RlciBibHVlCjE3NiAyMjQgMjMwCQlQb3dkZXJCbHVlCjE3NSAyMzggMjM4CQlwYWxlIHR1cnF1b2lzZQoxNzUgMjM4IDIzOAkJUGFsZVR1cnF1b2lzZQogIDAgMjA2IDIwOQkJZGFyayB0dXJxdW9pc2UKICAwIDIwNiAyMDkJCURhcmtUdXJxdW9pc2UKIDcyIDIwOSAyMDQJCW1lZGl1bSB0dXJxdW9pc2UKIDcyIDIwOSAyMDQJCU1lZGl1bVR1cnF1b2lzZQogNjQgMjI0IDIwOAkJdHVycXVvaXNlCiAgMCAyNTUgMjU1CQljeWFuCiAgMCAyNTUgMjU1CQlhcXVhCjIyNCAyNTUgMjU1CQlsaWdodCBjeWFuCjIyNCAyNTUgMjU1CQlMaWdodEN5YW4KIDk1IDE1OCAxNjAJCWNhZGV0IGJsdWUKIDk1IDE1OCAxNjAJCUNhZGV0Qmx1ZQoxMDIgMjA1IDE3MAkJbWVkaXVtIGFxdWFtYXJpbmUKMTAyIDIwNSAxNzAJCU1lZGl1bUFxdWFtYXJpbmUKMTI3IDI1NSAyMTIJCWFxdWFtYXJpbmUKICAwIDEwMCAgIDAJCWRhcmsgZ3JlZW4KICAwIDEwMCAgIDAJCURhcmtHcmVlbgogODUgMTA3ICA0NwkJZGFyayBvbGl2ZSBncmVlbgogODUgMTA3ICA0NwkJRGFya09saXZlR3JlZW4KMTQzIDE4OCAxNDMJCWRhcmsgc2VhIGdyZWVuCjE0MyAxODggMTQzCQlEYXJrU2VhR3JlZW4KIDQ2IDEzOSAgODcJCXNlYSBncmVlbgogNDYgMTM5ICA4NwkJU2VhR3JlZW4KIDYwIDE3OSAxMTMJCW1lZGl1bSBzZWEgZ3JlZW4KIDYwIDE3OSAxMTMJCU1lZGl1bVNlYUdyZWVuCiAzMiAxNzggMTcwCQlsaWdodCBzZWEgZ3JlZW4KIDMyIDE3OCAxNzAJCUxpZ2h0U2VhR3JlZW4KMTUyIDI1MSAxNTIJCXBhbGUgZ3JlZW4KMTUyIDI1MSAxNTIJCVBhbGVHcmVlbgogIDAgMjU1IDEyNwkJc3ByaW5nIGdyZWVuCiAgMCAyNTUgMTI3CQlTcHJpbmdHcmVlbgoxMjQgMjUyICAgMAkJbGF3biBncmVlbgoxMjQgMjUyICAgMAkJTGF3bkdyZWVuCiAgMCAyNTUgICAwCQlncmVlbgogIDAgMjU1ICAgMAkJbGltZQogIDAgMjU1ICAgMAkJeDExIGdyZWVuCiAgMCAyNTUgICAwCQlYMTFHcmVlbgogIDAgMTI4ICAgMAkJd2ViIGdyZWVuCiAgMCAxMjggICAwCQlXZWJHcmVlbgoxMjcgMjU1ICAgMAkJY2hhcnRyZXVzZQogIDAgMjUwIDE1NAkJbWVkaXVtIHNwcmluZyBncmVlbgogIDAgMjUwIDE1NAkJTWVkaXVtU3ByaW5nR3JlZW4KMTczIDI1NSAgNDcJCWdyZWVuIHllbGxvdwoxNzMgMjU1ICA0NwkJR3JlZW5ZZWxsb3cKIDUwIDIwNSAgNTAJCWxpbWUgZ3JlZW4KIDUwIDIwNSAgNTAJCUxpbWVHcmVlbgoxNTQgMjA1ICA1MAkJeWVsbG93IGdyZWVuCjE1NCAyMDUgIDUwCQlZZWxsb3dHcmVlbgogMzQgMTM5ICAzNAkJZm9yZXN0IGdyZWVuCiAzNCAxMzkgIDM0CQlGb3Jlc3RHcmVlbgoxMDcgMTQyICAzNQkJb2xpdmUgZHJhYgoxMDcgMTQyICAzNQkJT2xpdmVEcmFiCjE4OSAxODMgMTA3CQlkYXJrIGtoYWtpCjE4OSAxODMgMTA3CQlEYXJrS2hha2kKMjQwIDIzMCAxNDAJCWtoYWtpCjIzOCAyMzIgMTcwCQlwYWxlIGdvbGRlbnJvZAoyMzggMjMyIDE3MAkJUGFsZUdvbGRlbnJvZAoyNTAgMjUwIDIxMAkJbGlnaHQgZ29sZGVucm9kIHllbGxvdwoyNTAgMjUwIDIxMAkJTGlnaHRHb2xkZW5yb2RZZWxsb3cKMjU1IDI1NSAyMjQJCWxpZ2h0IHllbGxvdwoyNTUgMjU1IDIyNAkJTGlnaHRZZWxsb3cKMjU1IDI1NSAgIDAJCXllbGxvdwoyNTUgMjE1ICAgMAkJZ29sZAoyMzggMjIxIDEzMAkJbGlnaHQgZ29sZGVucm9kCjIzOCAyMjEgMTMwCQlMaWdodEdvbGRlbnJvZAoyMTggMTY1ICAzMgkJZ29sZGVucm9kCjE4NCAxMzQgIDExCQlkYXJrIGdvbGRlbnJvZAoxODQgMTM0ICAxMQkJRGFya0dvbGRlbnJvZAoxODggMTQzIDE0MwkJcm9zeSBicm93bgoxODggMTQzIDE0MwkJUm9zeUJyb3duCjIwNSAgOTIgIDkyCQlpbmRpYW4gcmVkCjIwNSAgOTIgIDkyCQlJbmRpYW5SZWQKMTM5ICA2OSAgMTkJCXNhZGRsZSBicm93bgoxMzkgIDY5ICAxOQkJU2FkZGxlQnJvd24KMTYwICA4MiAgNDUJCXNpZW5uYQoyMDUgMTMzICA2MwkJcGVydQoyMjIgMTg0IDEzNQkJYnVybHl3b29kCjI0NSAyNDUgMjIwCQliZWlnZQoyNDUgMjIyIDE3OQkJd2hlYXQKMjQ0IDE2NCAgOTYJCXNhbmR5IGJyb3duCjI0NCAxNjQgIDk2CQlTYW5keUJyb3duCjIxMCAxODAgMTQwCQl0YW4KMjEwIDEwNSAgMzAJCWNob2NvbGF0ZQoxNzggIDM0ICAzNAkJZmlyZWJyaWNrCjE2NSAgNDIgIDQyCQlicm93bgoyMzMgMTUwIDEyMgkJZGFyayBzYWxtb24KMjMzIDE1MCAxMjIJCURhcmtTYWxtb24KMjUwIDEyOCAxMTQJCXNhbG1vbgoyNTUgMTYwIDEyMgkJbGlnaHQgc2FsbW9uCjI1NSAxNjAgMTIyCQlMaWdodFNhbG1vbgoyNTUgMTY1ICAgMAkJb3JhbmdlCjI1NSAxNDAgICAwCQlkYXJrIG9yYW5nZQoyNTUgMTQwICAgMAkJRGFya09yYW5nZQoyNTUgMTI3ICA4MAkJY29yYWwKMjQwIDEyOCAxMjgJCWxpZ2h0IGNvcmFsCjI0MCAxMjggMTI4CQlMaWdodENvcmFsCjI1NSAgOTkgIDcxCQl0b21hdG8KMjU1ICA2OSAgIDAJCW9yYW5nZSByZWQKMjU1ICA2OSAgIDAJCU9yYW5nZVJlZAoyNTUgICAwICAgMAkJcmVkCjI1NSAxMDUgMTgwCQlob3QgcGluawoyNTUgMTA1IDE4MAkJSG90UGluawoyNTUgIDIwIDE0NwkJZGVlcCBwaW5rCjI1NSAgMjAgMTQ3CQlEZWVwUGluawoyNTUgMTkyIDIwMwkJcGluawoyNTUgMTgyIDE5MwkJbGlnaHQgcGluawoyNTUgMTgyIDE5MwkJTGlnaHRQaW5rCjIxOSAxMTIgMTQ3CQlwYWxlIHZpb2xldCByZWQKMjE5IDExMiAxNDcJCVBhbGVWaW9sZXRSZWQKMTc2ICA0OCAgOTYJCW1hcm9vbgoxNzYgIDQ4ICA5NgkJeDExIG1hcm9vbgoxNzYgIDQ4ICA5NgkJWDExTWFyb29uCjEyOCAgIDAgICAwCQl3ZWIgbWFyb29uCjEyOCAgIDAgICAwCQlXZWJNYXJvb24KMTk5ICAyMSAxMzMJCW1lZGl1bSB2aW9sZXQgcmVkCjE5OSAgMjEgMTMzCQlNZWRpdW1WaW9sZXRSZWQKMjA4ICAzMiAxNDQJCXZpb2xldCByZWQKMjA4ICAzMiAxNDQJCVZpb2xldFJlZAoyNTUgICAwIDI1NQkJbWFnZW50YQoyNTUgICAwIDI1NQkJZnVjaHNpYQoyMzggMTMwIDIzOAkJdmlvbGV0CjIyMSAxNjAgMjIxCQlwbHVtCjIxOCAxMTIgMjE0CQlvcmNoaWQKMTg2ICA4NSAyMTEJCW1lZGl1bSBvcmNoaWQKMTg2ICA4NSAyMTEJCU1lZGl1bU9yY2hpZAoxNTMgIDUwIDIwNAkJZGFyayBvcmNoaWQKMTUzICA1MCAyMDQJCURhcmtPcmNoaWQKMTQ4ICAgMCAyMTEJCWRhcmsgdmlvbGV0CjE0OCAgIDAgMjExCQlEYXJrVmlvbGV0CjEzOCAgNDMgMjI2CQlibHVlIHZpb2xldAoxMzggIDQzIDIyNgkJQmx1ZVZpb2xldAoxNjAgIDMyIDI0MAkJcHVycGxlCjE2MCAgMzIgMjQwCQl4MTEgcHVycGxlCjE2MCAgMzIgMjQwCQlYMTFQdXJwbGUKMTI4ICAgMCAxMjgJCXdlYiBwdXJwbGUKMTI4ICAgMCAxMjgJCVdlYlB1cnBsZQoxNDcgMTEyIDIxOQkJbWVkaXVtIHB1cnBsZQoxNDcgMTEyIDIxOQkJTWVkaXVtUHVycGxlCjIxNiAxOTEgMjE2CQl0aGlzdGxlCjI1NSAyNTAgMjUwCQlzbm93MQoyMzggMjMzIDIzMwkJc25vdzIKMjA1IDIwMSAyMDEJCXNub3czCjEzOSAxMzcgMTM3CQlzbm93NAoyNTUgMjQ1IDIzOAkJc2Vhc2hlbGwxCjIzOCAyMjkgMjIyCQlzZWFzaGVsbDIKMjA1IDE5NyAxOTEJCXNlYXNoZWxsMwoxMzkgMTM0IDEzMAkJc2Vhc2hlbGw0CjI1NSAyMzkgMjE5CQlBbnRpcXVlV2hpdGUxCjIzOCAyMjMgMjA0CQlBbnRpcXVlV2hpdGUyCjIwNSAxOTIgMTc2CQlBbnRpcXVlV2hpdGUzCjEzOSAxMzEgMTIwCQlBbnRpcXVlV2hpdGU0CjI1NSAyMjggMTk2CQliaXNxdWUxCjIzOCAyMTMgMTgzCQliaXNxdWUyCjIwNSAxODMgMTU4CQliaXNxdWUzCjEzOSAxMjUgMTA3CQliaXNxdWU0CjI1NSAyMTggMTg1CQlQZWFjaFB1ZmYxCjIzOCAyMDMgMTczCQlQZWFjaFB1ZmYyCjIwNSAxNzUgMTQ5CQlQZWFjaFB1ZmYzCjEzOSAxMTkgMTAxCQlQZWFjaFB1ZmY0CjI1NSAyMjIgMTczCQlOYXZham9XaGl0ZTEKMjM4IDIwNyAxNjEJCU5hdmFqb1doaXRlMgoyMDUgMTc5IDEzOQkJTmF2YWpvV2hpdGUzCjEzOSAxMjEgIDk0CQlOYXZham9XaGl0ZTQKMjU1IDI1MCAyMDUJCUxlbW9uQ2hpZmZvbjEKMjM4IDIzMyAxOTEJCUxlbW9uQ2hpZmZvbjIKMjA1IDIwMSAxNjUJCUxlbW9uQ2hpZmZvbjMKMTM5IDEzNyAxMTIJCUxlbW9uQ2hpZmZvbjQKMjU1IDI0OCAyMjAJCWNvcm5zaWxrMQoyMzggMjMyIDIwNQkJY29ybnNpbGsyCjIwNSAyMDAgMTc3CQljb3Juc2lsazMKMTM5IDEzNiAxMjAJCWNvcm5zaWxrNAoyNTUgMjU1IDI0MAkJaXZvcnkxCjIzOCAyMzggMjI0CQlpdm9yeTIKMjA1IDIwNSAxOTMJCWl2b3J5MwoxMzkgMTM5IDEzMQkJaXZvcnk0CjI0MCAyNTUgMjQwCQlob25leWRldzEKMjI0IDIzOCAyMjQJCWhvbmV5ZGV3MgoxOTMgMjA1IDE5MwkJaG9uZXlkZXczCjEzMSAxMzkgMTMxCQlob25leWRldzQKMjU1IDI0MCAyNDUJCUxhdmVuZGVyQmx1c2gxCjIzOCAyMjQgMjI5CQlMYXZlbmRlckJsdXNoMgoyMDUgMTkzIDE5NwkJTGF2ZW5kZXJCbHVzaDMKMTM5IDEzMSAxMzQJCUxhdmVuZGVyQmx1c2g0CjI1NSAyMjggMjI1CQlNaXN0eVJvc2UxCjIzOCAyMTMgMjEwCQlNaXN0eVJvc2UyCjIwNSAxODMgMTgxCQlNaXN0eVJvc2UzCjEzOSAxMjUgMTIzCQlNaXN0eVJvc2U0CjI0MCAyNTUgMjU1CQlhenVyZTEKMjI0IDIzOCAyMzgJCWF6dXJlMgoxOTMgMjA1IDIwNQkJYXp1cmUzCjEzMSAxMzkgMTM5CQlhenVyZTQKMTMxIDExMSAyNTUJCVNsYXRlQmx1ZTEKMTIyIDEwMyAyMzgJCVNsYXRlQmx1ZTIKMTA1ICA4OSAyMDUJCVNsYXRlQmx1ZTMKIDcxICA2MCAxMzkJCVNsYXRlQmx1ZTQKIDcyIDExOCAyNTUJCVJveWFsQmx1ZTEKIDY3IDExMCAyMzgJCVJveWFsQmx1ZTIKIDU4ICA5NSAyMDUJCVJveWFsQmx1ZTMKIDM5ICA2NCAxMzkJCVJveWFsQmx1ZTQKICAwICAgMCAyNTUJCWJsdWUxCiAgMCAgIDAgMjM4CQlibHVlMgogIDAgICAwIDIwNQkJYmx1ZTMKICAwICAgMCAxMzkJCWJsdWU0CiAzMCAxNDQgMjU1CQlEb2RnZXJCbHVlMQogMjggMTM0IDIzOAkJRG9kZ2VyQmx1ZTIKIDI0IDExNiAyMDUJCURvZGdlckJsdWUzCiAxNiAgNzggMTM5CQlEb2RnZXJCbHVlNAogOTkgMTg0IDI1NQkJU3RlZWxCbHVlMQogOTIgMTcyIDIzOAkJU3RlZWxCbHVlMgogNzkgMTQ4IDIwNQkJU3RlZWxCbHVlMwogNTQgMTAwIDEzOQkJU3RlZWxCbHVlNAogIDAgMTkxIDI1NQkJRGVlcFNreUJsdWUxCiAgMCAxNzggMjM4CQlEZWVwU2t5Qmx1ZTIKICAwIDE1NCAyMDUJCURlZXBTa3lCbHVlMwogIDAgMTA0IDEzOQkJRGVlcFNreUJsdWU0CjEzNSAyMDYgMjU1CQlTa3lCbHVlMQoxMjYgMTkyIDIzOAkJU2t5Qmx1ZTIKMTA4IDE2NiAyMDUJCVNreUJsdWUzCiA3NCAxMTIgMTM5CQlTa3lCbHVlNAoxNzYgMjI2IDI1NQkJTGlnaHRTa3lCbHVlMQoxNjQgMjExIDIzOAkJTGlnaHRTa3lCbHVlMgoxNDEgMTgyIDIwNQkJTGlnaHRTa3lCbHVlMwogOTYgMTIzIDEzOQkJTGlnaHRTa3lCbHVlNAoxOTggMjI2IDI1NQkJU2xhdGVHcmF5MQoxODUgMjExIDIzOAkJU2xhdGVHcmF5MgoxNTkgMTgyIDIwNQkJU2xhdGVHcmF5MwoxMDggMTIzIDEzOQkJU2xhdGVHcmF5NAoyMDIgMjI1IDI1NQkJTGlnaHRTdGVlbEJsdWUxCjE4OCAyMTAgMjM4CQlMaWdodFN0ZWVsQmx1ZTIKMTYyIDE4MSAyMDUJCUxpZ2h0U3RlZWxCbHVlMwoxMTAgMTIzIDEzOQkJTGlnaHRTdGVlbEJsdWU0CjE5MSAyMzkgMjU1CQlMaWdodEJsdWUxCjE3OCAyMjMgMjM4CQlMaWdodEJsdWUyCjE1NCAxOTIgMjA1CQlMaWdodEJsdWUzCjEwNCAxMzEgMTM5CQlMaWdodEJsdWU0CjIyNCAyNTUgMjU1CQlMaWdodEN5YW4xCjIwOSAyMzggMjM4CQlMaWdodEN5YW4yCjE4MCAyMDUgMjA1CQlMaWdodEN5YW4zCjEyMiAxMzkgMTM5CQlMaWdodEN5YW40CjE4NyAyNTUgMjU1CQlQYWxlVHVycXVvaXNlMQoxNzQgMjM4IDIzOAkJUGFsZVR1cnF1b2lzZTIKMTUwIDIwNSAyMDUJCVBhbGVUdXJxdW9pc2UzCjEwMiAxMzkgMTM5CQlQYWxlVHVycXVvaXNlNAoxNTIgMjQ1IDI1NQkJQ2FkZXRCbHVlMQoxNDIgMjI5IDIzOAkJQ2FkZXRCbHVlMgoxMjIgMTk3IDIwNQkJQ2FkZXRCbHVlMwogODMgMTM0IDEzOQkJQ2FkZXRCbHVlNAogIDAgMjQ1IDI1NQkJdHVycXVvaXNlMQogIDAgMjI5IDIzOAkJdHVycXVvaXNlMgogIDAgMTk3IDIwNQkJdHVycXVvaXNlMwogIDAgMTM0IDEzOQkJdHVycXVvaXNlNAogIDAgMjU1IDI1NQkJY3lhbjEKICAwIDIzOCAyMzgJCWN5YW4yCiAgMCAyMDUgMjA1CQljeWFuMwogIDAgMTM5IDEzOQkJY3lhbjQKMTUxIDI1NSAyNTUJCURhcmtTbGF0ZUdyYXkxCjE0MSAyMzggMjM4CQlEYXJrU2xhdGVHcmF5MgoxMjEgMjA1IDIwNQkJRGFya1NsYXRlR3JheTMKIDgyIDEzOSAxMzkJCURhcmtTbGF0ZUdyYXk0CjEyNyAyNTUgMjEyCQlhcXVhbWFyaW5lMQoxMTggMjM4IDE5OAkJYXF1YW1hcmluZTIKMTAyIDIwNSAxNzAJCWFxdWFtYXJpbmUzCiA2OSAxMzkgMTE2CQlhcXVhbWFyaW5lNAoxOTMgMjU1IDE5MwkJRGFya1NlYUdyZWVuMQoxODAgMjM4IDE4MAkJRGFya1NlYUdyZWVuMgoxNTUgMjA1IDE1NQkJRGFya1NlYUdyZWVuMwoxMDUgMTM5IDEwNQkJRGFya1NlYUdyZWVuNAogODQgMjU1IDE1OQkJU2VhR3JlZW4xCiA3OCAyMzggMTQ4CQlTZWFHcmVlbjIKIDY3IDIwNSAxMjgJCVNlYUdyZWVuMwogNDYgMTM5ICA4NwkJU2VhR3JlZW40CjE1NCAyNTUgMTU0CQlQYWxlR3JlZW4xCjE0NCAyMzggMTQ0CQlQYWxlR3JlZW4yCjEyNCAyMDUgMTI0CQlQYWxlR3JlZW4zCiA4NCAxMzkgIDg0CQlQYWxlR3JlZW40CiAgMCAyNTUgMTI3CQlTcHJpbmdHcmVlbjEKICAwIDIzOCAxMTgJCVNwcmluZ0dyZWVuMgogIDAgMjA1IDEwMgkJU3ByaW5nR3JlZW4zCiAgMCAxMzkgIDY5CQlTcHJpbmdHcmVlbjQKICAwIDI1NSAgIDAJCWdyZWVuMQogIDAgMjM4ICAgMAkJZ3JlZW4yCiAgMCAyMDUgICAwCQlncmVlbjMKICAwIDEzOSAgIDAJCWdyZWVuNAoxMjcgMjU1ICAgMAkJY2hhcnRyZXVzZTEKMTE4IDIzOCAgIDAJCWNoYXJ0cmV1c2UyCjEwMiAyMDUgICAwCQljaGFydHJldXNlMwogNjkgMTM5ICAgMAkJY2hhcnRyZXVzZTQKMTkyIDI1NSAgNjIJCU9saXZlRHJhYjEKMTc5IDIzOCAgNTgJCU9saXZlRHJhYjIKMTU0IDIwNSAgNTAJCU9saXZlRHJhYjMKMTA1IDEzOSAgMzQJCU9saXZlRHJhYjQKMjAyIDI1NSAxMTIJCURhcmtPbGl2ZUdyZWVuMQoxODggMjM4IDEwNAkJRGFya09saXZlR3JlZW4yCjE2MiAyMDUgIDkwCQlEYXJrT2xpdmVHcmVlbjMKMTEwIDEzOSAgNjEJCURhcmtPbGl2ZUdyZWVuNAoyNTUgMjQ2IDE0MwkJa2hha2kxCjIzOCAyMzAgMTMzCQlraGFraTIKMjA1IDE5OCAxMTUJCWtoYWtpMwoxMzkgMTM0ICA3OAkJa2hha2k0CjI1NSAyMzYgMTM5CQlMaWdodEdvbGRlbnJvZDEKMjM4IDIyMCAxMzAJCUxpZ2h0R29sZGVucm9kMgoyMDUgMTkwIDExMgkJTGlnaHRHb2xkZW5yb2QzCjEzOSAxMjkgIDc2CQlMaWdodEdvbGRlbnJvZDQKMjU1IDI1NSAyMjQJCUxpZ2h0WWVsbG93MQoyMzggMjM4IDIwOQkJTGlnaHRZZWxsb3cyCjIwNSAyMDUgMTgwCQlMaWdodFllbGxvdzMKMTM5IDEzOSAxMjIJCUxpZ2h0WWVsbG93NAoyNTUgMjU1ICAgMAkJeWVsbG93MQoyMzggMjM4ICAgMAkJeWVsbG93MgoyMDUgMjA1ICAgMAkJeWVsbG93MwoxMzkgMTM5ICAgMAkJeWVsbG93NAoyNTUgMjE1ICAgMAkJZ29sZDEKMjM4IDIwMSAgIDAJCWdvbGQyCjIwNSAxNzMgICAwCQlnb2xkMwoxMzkgMTE3ICAgMAkJZ29sZDQKMjU1IDE5MyAgMzcJCWdvbGRlbnJvZDEKMjM4IDE4MCAgMzQJCWdvbGRlbnJvZDIKMjA1IDE1NSAgMjkJCWdvbGRlbnJvZDMKMTM5IDEwNSAgMjAJCWdvbGRlbnJvZDQKMjU1IDE4NSAgMTUJCURhcmtHb2xkZW5yb2QxCjIzOCAxNzMgIDE0CQlEYXJrR29sZGVucm9kMgoyMDUgMTQ5ICAxMgkJRGFya0dvbGRlbnJvZDMKMTM5IDEwMSAgIDgJCURhcmtHb2xkZW5yb2Q0CjI1NSAxOTMgMTkzCQlSb3N5QnJvd24xCjIzOCAxODAgMTgwCQlSb3N5QnJvd24yCjIwNSAxNTUgMTU1CQlSb3N5QnJvd24zCjEzOSAxMDUgMTA1CQlSb3N5QnJvd240CjI1NSAxMDYgMTA2CQlJbmRpYW5SZWQxCjIzOCAgOTkgIDk5CQlJbmRpYW5SZWQyCjIwNSAgODUgIDg1CQlJbmRpYW5SZWQzCjEzOSAgNTggIDU4CQlJbmRpYW5SZWQ0CjI1NSAxMzAgIDcxCQlzaWVubmExCjIzOCAxMjEgIDY2CQlzaWVubmEyCjIwNSAxMDQgIDU3CQlzaWVubmEzCjEzOSAgNzEgIDM4CQlzaWVubmE0CjI1NSAyMTEgMTU1CQlidXJseXdvb2QxCjIzOCAxOTcgMTQ1CQlidXJseXdvb2QyCjIwNSAxNzAgMTI1CQlidXJseXdvb2QzCjEzOSAxMTUgIDg1CQlidXJseXdvb2Q0CjI1NSAyMzEgMTg2CQl3aGVhdDEKMjM4IDIxNiAxNzQJCXdoZWF0MgoyMDUgMTg2IDE1MAkJd2hlYXQzCjEzOSAxMjYgMTAyCQl3aGVhdDQKMjU1IDE2NSAgNzkJCXRhbjEKMjM4IDE1NCAgNzMJCXRhbjIKMjA1IDEzMyAgNjMJCXRhbjMKMTM5ICA5MCAgNDMJCXRhbjQKMjU1IDEyNyAgMzYJCWNob2NvbGF0ZTEKMjM4IDExOCAgMzMJCWNob2NvbGF0ZTIKMjA1IDEwMiAgMjkJCWNob2NvbGF0ZTMKMTM5ICA2OSAgMTkJCWNob2NvbGF0ZTQKMjU1ICA0OCAgNDgJCWZpcmVicmljazEKMjM4ICA0NCAgNDQJCWZpcmVicmljazIKMjA1ICAzOCAgMzgJCWZpcmVicmljazMKMTM5ICAyNiAgMjYJCWZpcmVicmljazQKMjU1ICA2NCAgNjQJCWJyb3duMQoyMzggIDU5ICA1OQkJYnJvd24yCjIwNSAgNTEgIDUxCQlicm93bjMKMTM5ICAzNSAgMzUJCWJyb3duNAoyNTUgMTQwIDEwNQkJc2FsbW9uMQoyMzggMTMwICA5OAkJc2FsbW9uMgoyMDUgMTEyICA4NAkJc2FsbW9uMwoxMzkgIDc2ICA1NwkJc2FsbW9uNAoyNTUgMTYwIDEyMgkJTGlnaHRTYWxtb24xCjIzOCAxNDkgMTE0CQlMaWdodFNhbG1vbjIKMjA1IDEyOSAgOTgJCUxpZ2h0U2FsbW9uMwoxMzkgIDg3ICA2NgkJTGlnaHRTYWxtb240CjI1NSAxNjUgICAwCQlvcmFuZ2UxCjIzOCAxNTQgICAwCQlvcmFuZ2UyCjIwNSAxMzMgICAwCQlvcmFuZ2UzCjEzOSAgOTAgICAwCQlvcmFuZ2U0CjI1NSAxMjcgICAwCQlEYXJrT3JhbmdlMQoyMzggMTE4ICAgMAkJRGFya09yYW5nZTIKMjA1IDEwMiAgIDAJCURhcmtPcmFuZ2UzCjEzOSAgNjkgICAwCQlEYXJrT3JhbmdlNAoyNTUgMTE0ICA4NgkJY29yYWwxCjIzOCAxMDYgIDgwCQljb3JhbDIKMjA1ICA5MSAgNjkJCWNvcmFsMwoxMzkgIDYyICA0NwkJY29yYWw0CjI1NSAgOTkgIDcxCQl0b21hdG8xCjIzOCAgOTIgIDY2CQl0b21hdG8yCjIwNSAgNzkgIDU3CQl0b21hdG8zCjEzOSAgNTQgIDM4CQl0b21hdG80CjI1NSAgNjkgICAwCQlPcmFuZ2VSZWQxCjIzOCAgNjQgICAwCQlPcmFuZ2VSZWQyCjIwNSAgNTUgICAwCQlPcmFuZ2VSZWQzCjEzOSAgMzcgICAwCQlPcmFuZ2VSZWQ0CjI1NSAgIDAgICAwCQlyZWQxCjIzOCAgIDAgICAwCQlyZWQyCjIwNSAgIDAgICAwCQlyZWQzCjEzOSAgIDAgICAwCQlyZWQ0CjI1NSAgMjAgMTQ3CQlEZWVwUGluazEKMjM4ICAxOCAxMzcJCURlZXBQaW5rMgoyMDUgIDE2IDExOAkJRGVlcFBpbmszCjEzOSAgMTAgIDgwCQlEZWVwUGluazQKMjU1IDExMCAxODAJCUhvdFBpbmsxCjIzOCAxMDYgMTY3CQlIb3RQaW5rMgoyMDUgIDk2IDE0NAkJSG90UGluazMKMTM5ICA1OCAgOTgJCUhvdFBpbms0CjI1NSAxODEgMTk3CQlwaW5rMQoyMzggMTY5IDE4NAkJcGluazIKMjA1IDE0NSAxNTgJCXBpbmszCjEzOSAgOTkgMTA4CQlwaW5rNAoyNTUgMTc0IDE4NQkJTGlnaHRQaW5rMQoyMzggMTYyIDE3MwkJTGlnaHRQaW5rMgoyMDUgMTQwIDE0OQkJTGlnaHRQaW5rMwoxMzkgIDk1IDEwMQkJTGlnaHRQaW5rNAoyNTUgMTMwIDE3MQkJUGFsZVZpb2xldFJlZDEKMjM4IDEyMSAxNTkJCVBhbGVWaW9sZXRSZWQyCjIwNSAxMDQgMTM3CQlQYWxlVmlvbGV0UmVkMwoxMzkgIDcxICA5MwkJUGFsZVZpb2xldFJlZDQKMjU1ICA1MiAxNzkJCW1hcm9vbjEKMjM4ICA0OCAxNjcJCW1hcm9vbjIKMjA1ICA0MSAxNDQJCW1hcm9vbjMKMTM5ICAyOCAgOTgJCW1hcm9vbjQKMjU1ICA2MiAxNTAJCVZpb2xldFJlZDEKMjM4ICA1OCAxNDAJCVZpb2xldFJlZDIKMjA1ICA1MCAxMjAJCVZpb2xldFJlZDMKMTM5ICAzNCAgODIJCVZpb2xldFJlZDQKMjU1ICAgMCAyNTUJCW1hZ2VudGExCjIzOCAgIDAgMjM4CQltYWdlbnRhMgoyMDUgICAwIDIwNQkJbWFnZW50YTMKMTM5ICAgMCAxMzkJCW1hZ2VudGE0CjI1NSAxMzEgMjUwCQlvcmNoaWQxCjIzOCAxMjIgMjMzCQlvcmNoaWQyCjIwNSAxMDUgMjAxCQlvcmNoaWQzCjEzOSAgNzEgMTM3CQlvcmNoaWQ0CjI1NSAxODcgMjU1CQlwbHVtMQoyMzggMTc0IDIzOAkJcGx1bTIKMjA1IDE1MCAyMDUJCXBsdW0zCjEzOSAxMDIgMTM5CQlwbHVtNAoyMjQgMTAyIDI1NQkJTWVkaXVtT3JjaGlkMQoyMDkgIDk1IDIzOAkJTWVkaXVtT3JjaGlkMgoxODAgIDgyIDIwNQkJTWVkaXVtT3JjaGlkMwoxMjIgIDU1IDEzOQkJTWVkaXVtT3JjaGlkNAoxOTEgIDYyIDI1NQkJRGFya09yY2hpZDEKMTc4ICA1OCAyMzgJCURhcmtPcmNoaWQyCjE1NCAgNTAgMjA1CQlEYXJrT3JjaGlkMwoxMDQgIDM0IDEzOQkJRGFya09yY2hpZDQKMTU1ICA0OCAyNTUJCXB1cnBsZTEKMTQ1ICA0NCAyMzgJCXB1cnBsZTIKMTI1ICAzOCAyMDUJCXB1cnBsZTMKIDg1ICAyNiAxMzkJCXB1cnBsZTQKMTcxIDEzMCAyNTUJCU1lZGl1bVB1cnBsZTEKMTU5IDEyMSAyMzgJCU1lZGl1bVB1cnBsZTIKMTM3IDEwNCAyMDUJCU1lZGl1bVB1cnBsZTMKIDkzICA3MSAxMzkJCU1lZGl1bVB1cnBsZTQKMjU1IDIyNSAyNTUJCXRoaXN0bGUxCjIzOCAyMTAgMjM4CQl0aGlzdGxlMgoyMDUgMTgxIDIwNQkJdGhpc3RsZTMKMTM5IDEyMyAxMzkJCXRoaXN0bGU0CiAgMCAgIDAgICAwCQlncmF5MAogIDAgICAwICAgMAkJZ3JleTAKICAzICAgMyAgIDMJCWdyYXkxCiAgMyAgIDMgICAzCQlncmV5MQogIDUgICA1ICAgNQkJZ3JheTIKICA1ICAgNSAgIDUJCWdyZXkyCiAgOCAgIDggICA4CQlncmF5MwogIDggICA4ICAgOAkJZ3JleTMKIDEwICAxMCAgMTAJCWdyYXk0CiAxMCAgMTAgIDEwCQlncmV5NAogMTMgIDEzICAxMwkJZ3JheTUKIDEzICAxMyAgMTMJCWdyZXk1CiAxNSAgMTUgIDE1CQlncmF5NgogMTUgIDE1ICAxNQkJZ3JleTYKIDE4ICAxOCAgMTgJCWdyYXk3CiAxOCAgMTggIDE4CQlncmV5NwogMjAgIDIwICAyMAkJZ3JheTgKIDIwICAyMCAgMjAJCWdyZXk4CiAyMyAgMjMgIDIzCQlncmF5OQogMjMgIDIzICAyMwkJZ3JleTkKIDI2ICAyNiAgMjYJCWdyYXkxMAogMjYgIDI2ICAyNgkJZ3JleTEwCiAyOCAgMjggIDI4CQlncmF5MTEKIDI4ICAyOCAgMjgJCWdyZXkxMQogMzEgIDMxICAzMQkJZ3JheTEyCiAzMSAgMzEgIDMxCQlncmV5MTIKIDMzICAzMyAgMzMJCWdyYXkxMwogMzMgIDMzICAzMwkJZ3JleTEzCiAzNiAgMzYgIDM2CQlncmF5MTQKIDM2ICAzNiAgMzYJCWdyZXkxNAogMzggIDM4ICAzOAkJZ3JheTE1CiAzOCAgMzggIDM4CQlncmV5MTUKIDQxICA0MSAgNDEJCWdyYXkxNgogNDEgIDQxICA0MQkJZ3JleTE2CiA0MyAgNDMgIDQzCQlncmF5MTcKIDQzICA0MyAgNDMJCWdyZXkxNwogNDYgIDQ2ICA0NgkJZ3JheTE4CiA0NiAgNDYgIDQ2CQlncmV5MTgKIDQ4ICA0OCAgNDgJCWdyYXkxOQogNDggIDQ4ICA0OAkJZ3JleTE5CiA1MSAgNTEgIDUxCQlncmF5MjAKIDUxICA1MSAgNTEJCWdyZXkyMAogNTQgIDU0ICA1NAkJZ3JheTIxCiA1NCAgNTQgIDU0CQlncmV5MjEKIDU2ICA1NiAgNTYJCWdyYXkyMgogNTYgIDU2ICA1NgkJZ3JleTIyCiA1OSAgNTkgIDU5CQlncmF5MjMKIDU5ICA1OSAgNTkJCWdyZXkyMwogNjEgIDYxICA2MQkJZ3JheTI0CiA2MSAgNjEgIDYxCQlncmV5MjQKIDY0ICA2NCAgNjQJCWdyYXkyNQogNjQgIDY0ICA2NAkJZ3JleTI1CiA2NiAgNjYgIDY2CQlncmF5MjYKIDY2ICA2NiAgNjYJCWdyZXkyNgogNjkgIDY5ICA2OQkJZ3JheTI3CiA2OSAgNjkgIDY5CQlncmV5MjcKIDcxICA3MSAgNzEJCWdyYXkyOAogNzEgIDcxICA3MQkJZ3JleTI4CiA3NCAgNzQgIDc0CQlncmF5MjkKIDc0ICA3NCAgNzQJCWdyZXkyOQogNzcgIDc3ICA3NwkJZ3JheTMwCiA3NyAgNzcgIDc3CQlncmV5MzAKIDc5ICA3OSAgNzkJCWdyYXkzMQogNzkgIDc5ICA3OQkJZ3JleTMxCiA4MiAgODIgIDgyCQlncmF5MzIKIDgyICA4MiAgODIJCWdyZXkzMgogODQgIDg0ICA4NAkJZ3JheTMzCiA4NCAgODQgIDg0CQlncmV5MzMKIDg3ICA4NyAgODcJCWdyYXkzNAogODcgIDg3ICA4NwkJZ3JleTM0CiA4OSAgODkgIDg5CQlncmF5MzUKIDg5ICA4OSAgODkJCWdyZXkzNQogOTIgIDkyICA5MgkJZ3JheTM2CiA5MiAgOTIgIDkyCQlncmV5MzYKIDk0ICA5NCAgOTQJCWdyYXkzNwogOTQgIDk0ICA5NAkJZ3JleTM3CiA5NyAgOTcgIDk3CQlncmF5MzgKIDk3ICA5NyAgOTcJCWdyZXkzOAogOTkgIDk5ICA5OQkJZ3JheTM5CiA5OSAgOTkgIDk5CQlncmV5MzkKMTAyIDEwMiAxMDIJCWdyYXk0MAoxMDIgMTAyIDEwMgkJZ3JleTQwCjEwNSAxMDUgMTA1CQlncmF5NDEKMTA1IDEwNSAxMDUJCWdyZXk0MQoxMDcgMTA3IDEwNwkJZ3JheTQyCjEwNyAxMDcgMTA3CQlncmV5NDIKMTEwIDExMCAxMTAJCWdyYXk0MwoxMTAgMTEwIDExMAkJZ3JleTQzCjExMiAxMTIgMTEyCQlncmF5NDQKMTEyIDExMiAxMTIJCWdyZXk0NAoxMTUgMTE1IDExNQkJZ3JheTQ1CjExNSAxMTUgMTE1CQlncmV5NDUKMTE3IDExNyAxMTcJCWdyYXk0NgoxMTcgMTE3IDExNwkJZ3JleTQ2CjEyMCAxMjAgMTIwCQlncmF5NDcKMTIwIDEyMCAxMjAJCWdyZXk0NwoxMjIgMTIyIDEyMgkJZ3JheTQ4CjEyMiAxMjIgMTIyCQlncmV5NDgKMTI1IDEyNSAxMjUJCWdyYXk0OQoxMjUgMTI1IDEyNQkJZ3JleTQ5CjEyNyAxMjcgMTI3CQlncmF5NTAKMTI3IDEyNyAxMjcJCWdyZXk1MAoxMzAgMTMwIDEzMAkJZ3JheTUxCjEzMCAxMzAgMTMwCQlncmV5NTEKMTMzIDEzMyAxMzMJCWdyYXk1MgoxMzMgMTMzIDEzMwkJZ3JleTUyCjEzNSAxMzUgMTM1CQlncmF5NTMKMTM1IDEzNSAxMzUJCWdyZXk1MwoxMzggMTM4IDEzOAkJZ3JheTU0CjEzOCAxMzggMTM4CQlncmV5NTQKMTQwIDE0MCAxNDAJCWdyYXk1NQoxNDAgMTQwIDE0MAkJZ3JleTU1CjE0MyAxNDMgMTQzCQlncmF5NTYKMTQzIDE0MyAxNDMJCWdyZXk1NgoxNDUgMTQ1IDE0NQkJZ3JheTU3CjE0NSAxNDUgMTQ1CQlncmV5NTcKMTQ4IDE0OCAxNDgJCWdyYXk1OAoxNDggMTQ4IDE0OAkJZ3JleTU4CjE1MCAxNTAgMTUwCQlncmF5NTkKMTUwIDE1MCAxNTAJCWdyZXk1OQoxNTMgMTUzIDE1MwkJZ3JheTYwCjE1MyAxNTMgMTUzCQlncmV5NjAKMTU2IDE1NiAxNTYJCWdyYXk2MQoxNTYgMTU2IDE1NgkJZ3JleTYxCjE1OCAxNTggMTU4CQlncmF5NjIKMTU4IDE1OCAxNTgJCWdyZXk2MgoxNjEgMTYxIDE2MQkJZ3JheTYzCjE2MSAxNjEgMTYxCQlncmV5NjMKMTYzIDE2MyAxNjMJCWdyYXk2NAoxNjMgMTYzIDE2MwkJZ3JleTY0CjE2NiAxNjYgMTY2CQlncmF5NjUKMTY2IDE2NiAxNjYJCWdyZXk2NQoxNjggMTY4IDE2OAkJZ3JheTY2CjE2OCAxNjggMTY4CQlncmV5NjYKMTcxIDE3MSAxNzEJCWdyYXk2NwoxNzEgMTcxIDE3MQkJZ3JleTY3CjE3MyAxNzMgMTczCQlncmF5NjgKMTczIDE3MyAxNzMJCWdyZXk2OAoxNzYgMTc2IDE3NgkJZ3JheTY5CjE3NiAxNzYgMTc2CQlncmV5NjkKMTc5IDE3OSAxNzkJCWdyYXk3MAoxNzkgMTc5IDE3OQkJZ3JleTcwCjE4MSAxODEgMTgxCQlncmF5NzEKMTgxIDE4MSAxODEJCWdyZXk3MQoxODQgMTg0IDE4NAkJZ3JheTcyCjE4NCAxODQgMTg0CQlncmV5NzIKMTg2IDE4NiAxODYJCWdyYXk3MwoxODYgMTg2IDE4NgkJZ3JleTczCjE4OSAxODkgMTg5CQlncmF5NzQKMTg5IDE4OSAxODkJCWdyZXk3NAoxOTEgMTkxIDE5MQkJZ3JheTc1CjE5MSAxOTEgMTkxCQlncmV5NzUKMTk0IDE5NCAxOTQJCWdyYXk3NgoxOTQgMTk0IDE5NAkJZ3JleTc2CjE5NiAxOTYgMTk2CQlncmF5NzcKMTk2IDE5NiAxOTYJCWdyZXk3NwoxOTkgMTk5IDE5OQkJZ3JheTc4CjE5OSAxOTkgMTk5CQlncmV5NzgKMjAxIDIwMSAyMDEJCWdyYXk3OQoyMDEgMjAxIDIwMQkJZ3JleTc5CjIwNCAyMDQgMjA0CQlncmF5ODAKMjA0IDIwNCAyMDQJCWdyZXk4MAoyMDcgMjA3IDIwNwkJZ3JheTgxCjIwNyAyMDcgMjA3CQlncmV5ODEKMjA5IDIwOSAyMDkJCWdyYXk4MgoyMDkgMjA5IDIwOQkJZ3JleTgyCjIxMiAyMTIgMjEyCQlncmF5ODMKMjEyIDIxMiAyMTIJCWdyZXk4MwoyMTQgMjE0IDIxNAkJZ3JheTg0CjIxNCAyMTQgMjE0CQlncmV5ODQKMjE3IDIxNyAyMTcJCWdyYXk4NQoyMTcgMjE3IDIxNwkJZ3JleTg1CjIxOSAyMTkgMjE5CQlncmF5ODYKMjE5IDIxOSAyMTkJCWdyZXk4NgoyMjIgMjIyIDIyMgkJZ3JheTg3CjIyMiAyMjIgMjIyCQlncmV5ODcKMjI0IDIyNCAyMjQJCWdyYXk4OAoyMjQgMjI0IDIyNAkJZ3JleTg4CjIyNyAyMjcgMjI3CQlncmF5ODkKMjI3IDIyNyAyMjcJCWdyZXk4OQoyMjkgMjI5IDIyOQkJZ3JheTkwCjIyOSAyMjkgMjI5CQlncmV5OTAK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AK/X1wCv1/8Ar/8AAK//XwCv/4cAr/+vAK//1wCv//8A1wAAANcAXwDXAIcA1wCvANcA1wDXAP8A118AANdfXwDXX4cA11+vANdf1wDXX/8A14cAANeHXwDXh4cA14evANeH1wDXh/8A168AANevXwDXr4cA16+vANev1wDXr/8A19cAANfXXwDX14cA19evANfX1wDX1/8A1/8AANf/XwDX/4cA1/+vANf/1wDX//8A/wAAAP8AXwD/AIcA/wCvAP8A1wD/AP8A/18AAP9fXwD/X4cA/1+vAP9f1wD/X/8A/4cAAP+HXwD/h4cA/4evAP+H1wD/h/8A/68AAP+vXwD/r4cA/6+vAP+v1wD/r/8A/9cAAP/XXwD/14cA/9evAP/X1wD/1/8A//8AAP//XwD//4cA//+vAP//1wD///8ACAgIABISEgAcHBwAJiYmADAwMAA6OjoAREREAE5OTgBYWFgAYmJiAGxsbAB2dnYAgICAAIqKigCUlJQAnp6eAKioqACysrIAvLy8AMbGxgDQ0NAA2traAOTk5ADu7u4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAABAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAAQARAAEAAQABABIAEwAUABUAFgAXABgAAQABABkAGgABABsAHAAdAB4AHwABACAAAQAhACIAIwAkACUAJgAnACgAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACoAAQArAAEALAAtAC4ALwAwADEAMgAzADQANQA2ADAAMQAyADMANAA1ADYAMAAxADIAMwA0ADUANgAwADEAMgAzADQANQA2ADAAMQAyADMANAA1ADYAMAAxADIAMwA0ADUANgAwADcAOAA4ADgAOAA4ADgAOAA4AAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAKQApADkAAQABADoAOwABADwAPQA+AAEAAQABAAEAAQABAD8AAQABAEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQABAE4ATwBQAFEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAFIAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAFMAAQABAAEAAQABAAEAAQABAFQAVQABAFYAAQBXACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQBYACkAKQApACkAWQBaAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAFsAKQBcAF0AAQABAAEAAQABAAEAAQABAAEAXgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQBfAAEAYABhAGIAAQABAAEAAQABAAEAYwABAAEAAQABAAEAZABVAGUAAQBmAGcAAQABAGgAaQABAAEAAQABAAEAAQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAAQB1AHUAdQB2ACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApAHcAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAdwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAHgAeQA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAIAAQABAAEAAQABAAEAAgABAAEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQADAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEABAABAAQABAABAAQABAABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAFAAEABAAEAAQABAAEAAQAAQABAAQABAABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQAEAAQABAAEAAQABAAEAAQABAABAAQABAAEAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAFAAUAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAGAAQAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAYABgAEAAYABgABAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABwAGAAYABAAEAAQABAABAAEABgAGAAEAAQAGAAYABAABAAEAAQABAAEAAQABAAEAAQAHAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQAEAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAYABgAGAAQABAABAAEAAQABAAQABAABAAEABAAEAAQAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQAGAAYABgAEAAQABAAEAAQAAQAEAAQABgABAAYABgAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAABAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABwAEAAYABAAEAAQABAABAAEABgAGAAEAAQAGAAYABAABAAEAAQABAAEAAQABAAQABAAHAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAcABgAEAAYABgABAAEAAQAGAAYABgABAAYABgAGAAQAAQABAAEAAQABAAEAAQABAAEABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQAEAAQABAAGAAYABgAGAAEABAAEAAQAAQAEAAQABAAEAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAEAAcABgAHAAYABgABAAQABwAHAAEABwAHAAQABAABAAEAAQABAAEAAQABAAcABwABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAcABgAGAAQABAAEAAQAAQAGAAYABgABAAYABgAGAAQABQABAAEAAQABAAEAAQABAAEABwABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAGAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEABwAGAAYABAAEAAQAAQAEAAEABgAGAAYABgAGAAYABgAHAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQAGAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABAABAAQAAQABAAEAAQAGAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABgAEAAQABAAEAAQAAQAEAAQAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAGAAQABAAEAAQABAAEAAEABAAEAAYABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAEAAQAAQABAAEAAQAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAEAAQAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAHAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYABAAEAAQABAAEAAQABAAGAAYABgAGAAYABgAGAAYABAAGAAYABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAGAAYABgAGAAQABAAGAAYABgABAAEAAQABAAYABgAEAAYABgAGAAYABgAGAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAGAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAQABgAEAAQABAAEAAQABAAEAAEABAABAAQAAQABAAQABAAEAAQABAAEAAQABAAGAAYABgAGAAYABgAEAAQABAAEAAQABAAEAAQABAAEAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABwAEAAQABAAEAAQABwAEAAcABgAGAAYABgAEAAcABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABgAEAAQABAAEAAYABgAEAAQABwAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAGAAQABAAGAAYABgAEAAYABAAEAAQABwAHAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAYABgAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAYABAAEAAQABAAEAAQABAABAAEAAQABAAQAAQABAAEAAQABAAEABAABAAEABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAAAEAAwAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwADAAMAAwADAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA0ADQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA0ADQANAA0AAwADAAMADQADAAMADQABAAEAAQABAAMAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAMAAQABAAEAAQABAAEAAQABAAEAAQADAAEAAQABAAEAAQABAAEAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAMADQANAAEAAwADAAMAAwADAA8AAQAPAA8ADwAPAA8ADwAPAAMADwAPAAMADwABAA0ADQAPAA8AAwAPAA8ADwAPABAADwAPAAMADwADAAMADwAPAAMADwAPAA8AAwAPAA8ADwADAAMAEQARABEAEQARABEAEQARAAMAAwADAA8ADwAPAA8ADwADAA8AAwAPAA8ADwAPAA8ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAMAAwAPAA8AAwAPAAMAAwAPAAMADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAwAPAA8AAwANAA8ADwAPAA8ADwAPAAEAAQABAAEADgAOAA4ADgAOAA4ADwAPAAMADQADAAMAAwADAA8AAwAPAAMAAwAPAA8ADwADAA0ADwAPAA8ADwAPAAMADwAPAA0ADQAPAA8ADwAPAAMAAwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADQANAA8ADwAPAA8ADwANAA0ADwAPAAMADwAPAA8ADwAPAA0AAwAPAAMADwADAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAMADQAPAA8ADwAPAA8AAwADAA0ADQADAA0ADwADAAMAEAANAA8ADwANAA8ADwAPAA8AAwAPAA8ADQABAAEAAwADABIAEgAQABAADwADAA8ADwADAAEAAwABAAMAAQABAAEAAQABAAEAAwABAAEAAQADAAEAAQABAAEAAQABAA0AAQABAAEAAQABAAEAAQABAAEAAQADAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwABAAEAAwABAAEAAQABAA0AAQANAAEAAQABAAEADQANAA0AAQANAAEAAQABAAEAAQABAAEAAQABAAEAAQADAAMADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQANAA0AAQABAAEAAQABAAEAAQABAAEAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADQANAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA0AAQABAAEAAQANAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAQABAAEAAQAEwATAA0ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADQAOAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAQABAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA0ADgANAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAQAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABAAEAAYAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAGAAcAAQABAAEAAQABAAEAAQABAAEAAQABAAEACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAEAAQABAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABgAGAAQABAAEAAQABgAGAAQABAAGAAYABwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABgAGAAQABAAGAAYABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAQABAAEAAEAAQAEAAQAAQABAAEAAQABAAQABAABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABAAEAAYABgABAAEAAQABAAEABgAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABAAGAAYABAAGAAYAAQAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFAAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAUABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABQAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAFQAVABUAAQABAAEAAQABAAEAAQABAAEAAQABAAEACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAEAAQABAAEACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwALAAsACwABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAcAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAABAAQABAABAAEAAQABAAEABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAYAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABgAGAAYABAAEAAQABAAGAAYABAAEAAEAAQAFAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAUAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAGAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABAAGAAcAAQAFAAUAAQABAAEAAQABAAQABAAEAAQAAQAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAQABAAEAAYABgAEAAcABAAEAAEAAQABAAEAAQABAAQAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAYABgAGAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABgAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAEABwAGAAQABgAGAAYABgABAAEABgAGAAEAAQAGAAYABwABAAEAAQABAAEAAQABAAEAAQAHAAEAAQABAAEAAQABAAEAAQABAAEABgAGAAEAAQAEAAQABAAEAAQABAAEAAEAAQABAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAcABgAGAAQABAAEAAQABAAEAAEABwABAAEABwABAAcABwAHAAYAAQAGAAYABAAHAAQABQAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAQABAAEAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAYABgAEAAQABAAEAAQABAAGAAQABgAGAAcABgAEAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAYABgAEAAQABAAEAAEAAQAGAAYABgAGAAQABAAGAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAEAAQABAAEAAQABAAEAAQABgAGAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAYABAAGAAYABAAEAAQABAAEAAQABwAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAYABAABAAEABAAEAAQABAAGAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABgAGAAQABAAEAAQABAAEAAQABAAEAAYABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHAAYABgAGAAYABgABAAYABgABAAEABAAEAAcABAAFAAYABQAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABgAGAAYABAAEAAQABAABAAEABAAEAAYABgAGAAYABAABAAEAAQAGAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAYABQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQAEAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAYABgAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAYABAAEAAQABAAEAAQABAABAAQABAAEAAQABAAEAAYABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQAGAAQABAAEAAQABAAEAAQABgAEAAQABgAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAEAAQABAAQAAQAEAAQAAQAEAAQABAAEAAQABAAEAAUABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABgAGAAYAAQAEAAQAAQAGAAYABAAGAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAGAAYAAQABAAEAAQABAAEAAQABAAEABAAEAAUABgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAAYABAAEAAQABAAEAAEAAQABAAYABgAEAAcABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAYABgAGAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAoAAQABAAEACgAKAAoACgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAEABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ABAABAAEAAQABAAEAAQABAAEAAQABAAEAEwATAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgAOAAEADgAOAA4ADgAOAA4ADgABAA4ADgABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAOAA4ADgABAAEADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADgAOAA4ADgABAAEAAQABAAEAAQABAAEADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAcABwAEAAQABAABAAEAAQAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAEAAQAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAEAAQABAAEAAQABAAEAAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAABAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAQABAAEAAEABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAEAAQAEAAQABAAEAAQABAAEAAEABAAEAAEABAAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAEAAQABAAEAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEABAAEAAQABAAEAAQABAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAQABAAEAAQABAAEAAQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwARAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA8ADwAPAA8AAwADAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAMAAwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEQABAAEAEQARABEAEQARABEAEQARABEAEQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYADgARAA0ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAOAA4ADgAOAA4ADgAOAA4ADgAOAA0ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA0ADgAOABEAEQARABEAEQANABEAEQARAA4ADwAPAA8ADwAOAA4ADgAOAA4ADgAOAA4ADgAPAA8ADwAPAA8ADwAPABEAEQAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AEQARABEAEQARABEADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQARAA0ADQANABEAEQARABEAEQANABEAEQARABEAEQARAA0AEQARABEAEQADAA8ADwADAAMAAwADAAMAAwADAAMAAwARABEAEQARABEAEQARABEAEQADABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARABEAAwARABEAEQARABEAEQARABcAEQARABEAEQARABEAEQARABEAEQARABEAEQANAA8ADwADAAMADwADAAMAAwAPAA8AAwADABEAEQARABEAEQARABEADQARABEAEQARAA0ADQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEgAXABIAEQANABcAEQARABIAEAAQAAMAAwARABEAEQARABEAAwADAAMAAwADAAMAAwADAAMAAwADAAMADQARABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARAA8ADwADABEAAwAPAAMAEQARABEAGAAYABgAGAAYABEAEQARABEAEQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARAA0AEQARABEAEQARABEAEQARABEADQARABEAEQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAAMAEQADABIAFwARABEAEgASABIAEgAXABcAFwASABIAFwAXABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwAXABcAEgAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAEQARABEAFwANABEAEQARABcAFwAXABEAFwAXABcAEQARABEAEQARABEAEQAXABEAFwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEADQARABEAEQARABEAEQAXABEAEQARABEAEQANABEAEQANABEAEQARABEAEQARABEADQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQANABEAEQARABEADQARABEAEQARAA0ADQANABEAEQARAA0ADQANAA0AEQARABEAEQARABEAEQARABEADQARAA0ADQANABEAAwAPABEAEQARABEAEQARABEAEQARAA0AEQARABEAEQANABEAEQARABEADQANABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAAEAAQABAAEAAQABAAEAAQAPAA8ADwADAAMAEQARABEAEQAPAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA8ADwAPAA8ADwAPAA8AAwADAA8ADwADABAAEAADAAMAAwADABcADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAwAPAA8AAwADAAMAAwAPAA8AEAAPAA8ADwAPABcAFwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPABEAAwAPAA8AAwAPAA8ADwAPAA8ADwAPAA8AAwADAA8ADwAPAA8ADwAPAA8ADwAPAAMADwAPAA8ADwAPAAMAAwADAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAMAAwADAA8ADwAPAA8ADwAPAA8ADwADAAMAAwAPAA8AAwAPAAMADwAPAA8ADwADAA8ADwAPAA8ADwAPAAMADwAPAA8AAwAPAA8ADwAPAA8ADwADABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAA0AEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQAXABcAFwARABEAEQAXABcAFwAXABcAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEQARABEAEQARABEAEQANABEAEQARABEAEQANABEAEQARAA0AEQARAA0AEQARABEADQARABEAEQARABEAEQARABEAEQARABcAEQARABEAEQARABEAEQARABEADQARABEAEQARAA0AEQAXABcAFwARABEADQANABEADQARABEAEQAXABEAEQARABEAEQAPAA8ADwAPAA8AAwAXAAMAAwADABEAEQARAA8ADwARABEAEQAPAA8ADwAPABEAEQARABEAAwADAAMAAwADAAMADwAPAA8AAwAPABEAEQAPAA8ADwADAA8ADwADABEAEQARABEAEQARABEAEQARAA8ADwAPAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQAPAA8ADwAPABEADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwAPAA8ADwAPAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAPAA8ADwAPAA8ADwAPAA8AAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwABAAEAAQABAAEAAQABAAEAAQABAAEAAQAXABEAEQAXABEAEQARABEAEQARABEAEQAXABcAFwAXABcAFwAXABcAEQARABEAEQARABEAFwARABEAEQARABEAEQARABEAEQAXABcAFwAXABcAFwAXABcAFwAXABEAAQAXABcAFwARABEAEQARABEAEQARAAEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAFwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwARABcAFwARABcAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwAXABEAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AEQARABEAEQARABEAEQARABEAEQARABEAEQAPAA8ADwARABEAEQARABEAEQARABEAEQARAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQARABcAFwAXABEADwAPAA8ADwAPAA8ADwARABEAEQARABEAEQARABEAEQARABEAEQARABEAEQAPAA8AEQARABEAEQARABEAEQARABEAEQARAA8ADwAPAA8ADwAPABcAFwAXABcAFwAXABcAFwAXAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8AAQABAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQW0cGSUdBgQIDCBuAi1xLnIeEhYqMjYAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiAKMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAGUAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAcgBzAHQAdQB2AHcAeAB5AHoAewB8AH0AfgB/AIAAgQCCAIMAhACFAIYAhwCIAIkAigCLAIwAjQCOAI8AkACRAJIAkwCUAJUAlgCXAJgAmQCaAJsAnACdAJ4AnwCgAKEAogCjAKQApQCmAKcAqACpAKoAqwCsAK0ArgCvALAAsQCyALMAtAC1ALYAtwC4ALkAugC7ALwAvQC+AL8AwADBAMIAwwDEAMUAxgDHAMgAyQDKAMsAzADNAM4AzwDQANEA0gDTANQA1QDWANcA2ADZANoA2wDcAN0A3gDfAOAA4QDiAOMA5ADlAOYA5wDoAOkA6gDrAOwA7QDuAO8A8ADxAPIA8wD0APUA9gD3APgA+QD6APsA/AD9AP4A/wAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwDGJZIlCSQMJA0kCiSwALEAJCQLJBglECUMJRQlPCW6I7sjACW8I70jHCUkJTQlLCUCJWQiZSLAA2AiowC3AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwCcAJ0AngCfAKAAoQCiAKMApAClAKYApwCoAKkAqgCrAKwArQCuAK8AsACxALIAswC0ALUAtgC3ALgAuQC6ALsAvAC9AL4AvwDAAMEAwgDDAMQAxQDGAMcAyADJAMoAywDMAM0AzgDPANAA0QDSANMA1ADVANYA1wDYANkA2gDbANwA3QDeAN8A4ADhAOIA4wDkAOUA5gDnAOgA6QDqAOsA7ADtAO4A7wDwAPEA8gDzAPQA9QD2APcA+AD5APoA+wD8AP0A/gD/AAAAAAAAAAIAAAABAAAAAAAAAAMAAAABAAAAAAAAAAIAAAAAAAAAAAAAAAMAAAAAAAAAAQAAAAEAAAAAAAAAAQAAAAIAAAAAAAAAAQAAAAMAAAAAAAAAQgAAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBAAANCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgADAQMCAwMDBAMFAwYDBwEIAQkBCggLAQwBDQoAAwEDAgMDAwQDBQMGAwcBCAEJAQoICwEMAQ0KAAMBAwIDAwMEAwUDBgMHAQgBCQEKCAsBDAENCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgIEAgQEBAQEBAQGAQkECQQJBAoICwAMCQ0KAAICBAIEBAQEBAQEBgEJBAkECQQKCAsADAkNCgACAgQCBAQEBAQEBAYBCQQJBAkECggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBQUGAAUFBgEIBQgFCwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBQUGAAUFBgEIBQgFCwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBQUGAAUFBgEIBQgFCwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBQYABQUGAQgFCAULAAoICwAMCQ0KAAIABgAGBgAGAAUFBgELAAsACwAKCAsADAkNCgACAAYABgUFBgAFBQYBCAUIBQsACggLAAwJDQoAAgAGAAYFBAYABgAGAQgECwALAAoICwAMCQ0KAAIABgAGBQQGAAYABgEIBAsACwAKCAsADAkNCgACAAYABgUEBgAGAAYBCAQLAAsACggLAAwJDQoAAgAGAAYFBAYABgAGAQgECwALAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACBwAABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAINAAAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIDAAAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgwAAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAINAAAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACDQAABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIABgAGAAcABwAHAAAKAAoACgAKCAsADAkNCgACAAYABgAHAAcABwAACgAKAAoACggLAAwJDQoAAgAGAAYABwAHAAcAAAoACgAKAAoICwAMCQ0KAAIBAQIBAwEEAQUBBgEHAQgBCQEKAQsADAkNCgADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMHAAcABwAHAAcABwAHAAcABwAHAAcABwAMCQcAAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwwJAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAw0ADQANAA0ADQANAA0ADQANAA0ADQANAAwJDQAAAwADAAMAAwADAAMAAwADAAMAAwADAAMMCQADAAMAAwADAAMAAwADAAMAAwADAAMAAwADDAkAAwMAAwADAAMAAwADAAMAAwADAAMAAwADAAwJAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMCQAADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAkMAA0ADQANAA0ADQANAA0ADQANAA0ADQANAAwJDQANAA0ADQANAA0ADQANAA0ADQANAA0ADQAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAkNAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJDQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMCQ0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAABAAAAAAEBAQAAAAAAAAAAAQAAAAEAAAABAAAAAgAAAAEAAAAAAAAAAAAAAAABAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEJCQkJCQkJCQkJCQkJCQkJBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcICAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgoDAwMDAwMDAwMDAwMEAwMLBgYGBQgICAgICAgICAgIAAwYJDxgVAwMDDBIDAwMDAwMDAwMDAwMDAAMDAwMDAAM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AAAAAAABAAAACwAAAAAAAAAAAAAAAAAAAAAAAAABAAAADAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAQMFBwEDBQcBAwUHAQMFBwEDBQcBAwUHAAIEBgEDBQcBAwUHAQMFBwEDBQcDAwcHAwMHBwEDBQcAAAAAAAAAAAEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwACBAYBAwUHAQMFBwEDBQcBAwUHAwMHBwMDBwcBAwUHAAAAAAAAAAABAwUHAAIEBgACBAYBAwUHAAIEBgEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwMDBwcDAwcHAQMFBwAAAAAAAAAAAQMFBwEDBQcAAgQGAAIEBgACBAYAAgQGAAIEBgEDBQcBAwUHAQMFBwEDBQcDAwcHAwMHBwEDBQcAAAAAAAAAAAEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwACBAYBAwUHAQMFBwEDBQcBAwUHAwMHBwMDBwcBAwUHAAAAAAAAAAABAwUHAAIEBgEDBQcBAwUHAQMFBwEDBQcAAgQGAQMFBwEDBQcBAwUHAQMFBwMDBwcDAwcHAQMFBwAAAAAAAAAAAQMFBwEDBQcBAwUHAQMFBwEDBQcBAwUHAAIEBgEDBQcBAwUHAQMFBwEDBQcDAwcHAwMHBwEDBQcAAAAAAAAAAAACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAgIGBgICBgYAAgQGAAAAAAAAAAAAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgICBgYCAgYGAAIEBgAAAAAAAAAAAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYAAgQGAAIEBgACBAYCAgYGAgIGBgACBAYAAAAAAAAAAAEDBQcBAwUHAQMF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AAoAAAA8VxAACgAAACRXEAAKAAAADFcQAAoAAAD0VhAACgAAANxWEAAKAAAAxFYQAAoAAACsVhAACgAAACRWEAAKAAAADFYQAAoAAAD0VRAACgAAANxVEAAKAAAAxFUQAAoAAACROBAACgAAAKxVEAAKAAAATzgQAAoAAAAcZRAACgAAADRlEAAKAAAATGUQAAoAAABkZRAACgAAAJRVEAAKAAAAfFUQAAoAAADwVBAACgAAANhUEAAKAAAAqFQQAAoAAABkUxAACgAAAExTEAAKAAAANFMQAAoAAABAZhAACgAAAFhmEAAKAAAAcGYQAAoAAACIZhAACgAAABxTEAAKAAAAVFIQAAoAAAA8UhAACgAAACRSEAAKAAAADFIQAAoAAAD0URAACgAAANxREAAKAAAAxFEQAAoAAACsURAACgAAAERREAAKAAAALFEQAAoAAAAUURAACgAAAPxQEAAKAAAAmE4QAAoAAACAThAACgAAAGhOEAAKAAAAUE4QAAoAAABAXhAACgAAAG9MEAAKAAAAQEwQAAoAAAAUTBAACgAAAONLEAAKAAAAsksQAAoAAADRShAACgAAAGZKEAAKAAAAN0oQAAoAAAC8SRAACgAAABJJEAAKAAAA5kgQAAoAAACiSBAACgAAAMo7EAAKAAAAk0cQAAoAAAD5OxAACgAAALVGEAAKAAAAhkYQAAoAAADnRBAACgAAALhEEAAKAAAATTcQAAoAAAAjRBAACgAAAJhDEAAKAAAA6kIQAAoAAADoNhAACgAAAIhCEAAKAAAASkEQAAoAAAAyQRAACgAAAMZAEAAKAAAAl0AQAAoAAACbPxAACgAAAFM/EAAKAAAA6j4QAAoAAAD6NRAACgAAABZIEAAKAAAAPT4QAAoAAADjPRAACgAAAMs9EAAKAAAAYXoQAAoAAADJNRAACgAAAFpYEAALAAAAuFIQAAsAAACwNRAACwAAAEM2EAALAAAAsj0QAAsAAABIehAACwAAAM82EAALAAAAJD4QAAsAAAAEehAACwAAAHA+EAALAAAAljcQAAsAAACCPxAACwAAANFCEAALAAAACkQQAAsAAABsRBAACwAAAE9oEAALAAAANmgQAAsAAAAdaBAACwAAAARoEAALAAAAn0QQAAsAAADARRAACwAAAP5GEAALAAAAekcQAAsAAAD9RxAACwAA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AAIAAABeExAAAwAAAAAAAAACAAAAnRMQAAQAAAABAAEAAgAAAJITEAAEAAAABAABAAIAAACHExAABAAAAAUAAQACAAAAfBMQAAQAAAACAAEAAgAAAHETEAAEAAAAAwABAAIAAABsExAABAAAAAYAAQACAAAAZxMQAAQAAAAHAAEAAgAAAGITEAAEAAAACAABAAIAAACuExAABQAAAAkAAQACAAAAqBMQAAUAAAAMAAEAAgAAAKITEAAFAAAADQABAAIAAACXExAABQAAAAoAAQACAAAAjBMQAAUAAAALAAEAAgAAAIETEAAFAAAADgABAAIAAAB2ExAABQAAAA8AAQACAAAAHhIQAAMAAAAAAAAAAgAAAF0SEAAEAAAAAQABAAIAAABSEhAABAAAAAQAAQACAAAARxIQAAQAAAAFAAEAAgAAADwSEAAEAAAAAgABAAIAAAAxEhAABAAAAAMAAQACAAAALBIQAAQAAAAGAAEAAgAAACcSEAAEAAAABwABAAIAAAAiEhAABAAAAAgAAQACAAAAcxIQAAUAAAAJAAEAAgAAAGgSEAAFAAAADAABAAIAAABiEhAABQAAAA0AAQACAAAAVxIQAAUAAAAKAAEAAgAAAEwSEAAFAAAACwABAAIAAABBEhAABQAAAA4AAQACAAAANhIQAAUAAAAPAAEAAgAAABAREAADAAAAAAAAAAIAAABPERAABAAAAAEAAQACAAAARBEQAAQAAAAEAAEAAgAAADkREAAEAAAABQABAAIAAAAuERAABAAAAAIAAQACAAAAIxEQAAQAAAADAAEAAgAAAB4REAAEAAAABgABAAIAAAAZERAABAAAAAcAAQACAAAAFBEQAAQAAAAIAAEAAgAAAGAREAAFAAAACQABAAIAAABaERAABQAAAAwAAQACAAAAVBEQAAUAAAANAAEAAgAAAEkREAAFAAAACgABAAIAAAA+ERAABQAAAAsAAQACAAAAMxEQAAUAAAAOAAEAAgAAACgREAAFAAAADwABAAIAAAA0GhAAAwAAAAAAAAACAAAAcxoQAAQAAAABAAEAAgAAAGgaEAAEAAAABAABAAIAAABdGhAABAAAAAUAAQACAAAAUhoQAAQAAAACAAEAAgAAAEcaEAAEAAAAAwABAAIAAABCGhAABAAAAAYAAQACAAAAPRoQAAQAAAAHAAEAAgAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlcnJvcihzY3JlZW4pOiBmYWlsZWQgdG8gdXBkYXRlIGh5cGVybGluayBvbiByZXNpemUgZXJyPXdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBjaGFyc2V0IGludGVybWVkaWF0ZTogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBFU0MgYWN0aW9uOiBlcnJvcihzY3JlZW4pOiBmYWlsZWQgdG8gdXBkYXRlIHN0eWxlIG9uIGN1cnNvciBjaGFuZ2UgZXJyPWVycm9yKHNjcmVlbik6IGZhaWxlZCB0byB1cGRhdGUgaHlwZXJsaW5rIG9uIGN1cnNvciBjaGFuZ2UgZXJyPXdhcm5pbmc6IGRlbGV0ZUxpbmVzIG1hbnVhbFN0eWxlVXBkYXRlIGVycj13YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgaW5kZXggY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIG5leHQgbGluZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgdGFiIHNldCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgcmV2ZXJzZSBpbmRleCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgc2luZ2xlIHNoaWZ0IDIgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHNpbmdsZSBzaGlmdCAzIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBFU0MgY2FsbGJhY2s6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBmdWxsIHJlc2V0IGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBsb2NraW5nIHNoaWZ0IDEgcmlnaHQgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGxvY2tpbmcgc2hpZnQgMiByaWdodCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgbG9ja2luZyBzaGlmdCAzIHJpZ2h0IGNvbW1hbmQ6IHdhcm5pbmcodGVybWluYWwpOiBjdXJzb3IgY29weSBmYWlsZWQgZW50ZXJpbmcgYWx0IHNjcmVlbiBlcnI9d2FybmluZyh0ZXJtaW5hbCk6IHJlc3RvcmUgY3Vyc29yIG9uIHN3aXRjaCBzY3JlZW4gZmFpbGVkIHRvPSBlcnI9d2FybmluZyhzdHJlYW0pOiB1bmltcGxlbWVudGVkIHNldE1vZGU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBDMCBjaGFyYWN0ZXIsIGlnbm9yaW5nOiAweHdhcm5pbmcodGVybWluYWwpOiB6ZXJvLXdpZHRoIGNoYXJhY3RlciB3aXRoIG5vIHByaW9yIGNoYXJhY3RlciwgaWdub3Jpbmd3YXJuaW5nKHRlcm1pbmFsKTogZXJyb3IgcmVhbGxvY2F0aW5nIGZvciBtb3JlIGh5cGVybGluayBzcGFjZSwgaWdub3JpbmcgaHlwZXJsaW5rIGVycj13YXJuaW5nKHBhcnNlcik6IGludmFsaWQgaW50ZXJtZWRpYXRlcyBjb3VudHdhcm5pbmcocGFyc2VyKTogQ1NJIGNvbG9uIG9yIG1peGVkIHNlcGFyYXRvcnMgb25seSBhbGxvd2VkIGZvciAnbScgY29tbWFuZCwgZ290OiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIGRvd24gY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBCIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGN1cnNvciByaWdodCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEMgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIHVwIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgRSB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgRiB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBob3Jpem9udGFsIHRhYiBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEkgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgZXJhc2UgZGlzcGxheSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgZXJhc2UgbGluZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgSUwgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBMIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIERMIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgTSB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBkZWxldGUgY2hhcmFjdGVycyBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIFAgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgc2Nyb2xsIHVwIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgUyB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBzY3JvbGwgZG93biBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIFQgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIHRhYnVsYXRpb24gY29udHJvbDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBXIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGVyYXNlIGNoYXJhY3RlcnMgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBYIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIGhvcml6b250YWwgdGFiIGJhY2sgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBaIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIEhQUiBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIGEgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgcHJpbnQgcmVwZWF0IGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgYiB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBkZXZpY2UgYXR0cmlidXRlcyBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgVlBBIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgZCB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBWUFIgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBlIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHRhYiBjbGVhciBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IHVua25vd24gdGFiIGNsZWFyIG1vZGU6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgZyB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBzZXQgbW9kZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IHVuaW1wbGVtZW50ZWQgbW9kZTogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHNldE1vZGlmeUtleUZvcm1hdDogd2FybmluZyhzdHJlYW0pOiB1bmtub3duIENTSSBtIHdpdGggaW50ZXJtZWRpYXRlOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIG0gd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgZGV2aWNlIHN0YXR1cyByZXBvcnQgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiB1bmtub3duIENTSSBuIHdpdGggaW50ZXJtZWRpYXRlOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIG4gd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIHAgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgREVDUlFNIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBjdXJzb3Igc3R5bGUgdmFsdWU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBzZXQgY3Vyb3Igc3R5bGUgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIHNldCBwcm90ZWN0ZWQgbW9kZSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIHEgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgREVDU1RCTSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IHVuaW1wbGVtZW50ZWQgcmVzdG9yZSBtb2RlOiB3YXJuaW5nKHN0cmVhbSk6IHVua25vd24gQ1NJIHMgd2l0aCBpbnRlcm1lZGlhdGU6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgcyB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBERUNTTFJNIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBzYXZlIG1vZGU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBYVFNISUZURVNDQVBFIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgQ1NJIDE0IHQgd2l0aCBleHRyYSBwYXJhbWV0ZXJzOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIENTSSAxNiB0IHdpdGggZXh0cmEgcGFyYW1ldGVyczogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyBDU0kgMTggdCB3aXRoIGV4dHJhIHBhcmFtZXRlcnM6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgQ1NJIDIxIHQgd2l0aCBleHRyYSBwYXJhbWV0ZXJzOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIENTSSAyMi8yMyB0IHdpdGggZXh0cmEgcGFyYW1ldGVyczogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyBDU0kgdCB3aXRoIHVuaW1wbGVtZW50ZWQgcGFyYW1ldGVyOiBlcnJvcihzdHJlYW0pOiBpZ25vcmluZyBDU0kgdCB3aXRoIG5vIHBhcmFtZXRlcnM6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgdCB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBwdXNoS2l0dHlLZXlib2FyZCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgc2V0S2l0dHlLZXlib2FyZCBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIHU6IHdhcm5pbmcoc3RyZWFtKTogaW52YWxpZCBJQ0ggY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBAOiB3YXJuaW5nKHN0cmVhbSk6IHVuaW1wbGVtZW50ZWQgQ1NJIGNhbGxiYWNrOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEEgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgY3Vyc29yIGxlZnQgY29tbWFuZDogd2FybmluZyhzdHJlYW0pOiBpZ25vcmluZyB1bmltcGxlbWVudGVkIENTSSBEIHdpdGggaW50ZXJtZWRpYXRlczogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIEhQQSBjb21tYW5kOiB3YXJuaW5nKHN0cmVhbSk6IGlnbm9yaW5nIHVuaW1wbGVtZW50ZWQgQ1NJIEcgd2l0aCBpbnRlcm1lZGlhdGVzOiB3YXJuaW5nKHN0cmVhbSk6IGludmFsaWQgQ1VQIGNvbW1hbmQ6IHdhcm5pbmcoc3RyZWFtKTogaWdub3JpbmcgdW5pbXBsZW1lbnRlZCBDU0kgSCB3aXRoIGludGVybWVkaWF0ZXM6IHdhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBDU0kgYWN0aW9uOiB3YXJuaW5nKHN0cmVhbSk6IGNoYW5nZSB0aXRsZSByZXF1ZXN0OiBpbnZhbGlkIHV0Zi04LCBpZ25vcmluZyByZXF1ZXN0d2FybmluZyhzdHJlYW0pOiB1bmtub3duIGN1cnNvciBzaGFwZTogd2FybmluZyhzdHJlYW0pOiBpbnZhbGlkIE9TQywgc2hvdWxkIG5ldmVyIGhhcHBlbndhcm5pbmcoc3RyZWFtKTogdW5pbXBsZW1lbnRlZCBPU0MgY2FsbGJhY2s6IHdhcm5pbmcob3NjKTogT1NDIHNlcXVlbmNlIHRvbyBsb25nICg+ICksIGlnbm9yaW5nLiBzdGF0ZT13YXJuaW5nKG9zYyk6IE9TQyAxMCByZXF1aXJlcyBhbiBhbGxvY2F0b3IsIGJ1dCBub25lIHdhcyBwcm92aWRlZHdhcm5pbmcob3NjKTogT1NDIDEwNCByZXF1aXJlcyBhbiBhbGxvY2F0b3IsIGJ1dCBub25lIHdhcyBwcm92aWRlZHdhcm5pbmcob3NjKTogT1NDIDExIHJlcXVpcmVzIGFuIGFsbG9jYXRv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AFsJEAAOAAAANRQQAA4AAADpHRAACwAAAKgNEAANAAAADw8QAAsAAACzERAAEAAAAIoREAAYAAAAlRQQABQAAADYFBAAGAAAAP0WEAAVAAAADBYQABQAAADxFBAAHQAAAAEXEAARAAAAgNkRAILZEQCA2REAskgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAtEgSALZIEgC4SBIAskgSALpIEgC8SBIAvkgSAMBIEgC0SBIAwkgSAMRIEgCwSBIAsEgSALBIEgCwSBIAsEgSAMJIEgCySBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAsEgSALBIEgCwSBIAvEgSAL5IEgDASBIAtEgSALBIEgDGSBIAyEgSAMpIEgDMSBIAzkgSANBIEgDSSBIA1EgSALBIEgDWSBIA2EgSANpIEgCwSBIA3EgSAN5IEgDgSBIA4kgSAORIEgDmSBIA6EgSAOpIEgDsSBIA7kgSAPBIEgDySBIA9EgSALBIEgCwSBIAsEgSAMBIEgAPAAAA/wAAAP8PAAD//wAACAAAAAAAAAACAAAABAAAAA==",self.location),O=[];if(j.protocol==="file:"){let Z=j.pathname;Z.match(/^\/[A-Za-z]:\//)&&(Z=Z.slice(1)),O.push(Z)}O.push(j.href,"./ghostty-vt.wasm","/ghostty-vt.wasm");let G=null;for(let Z of O)try{return await HG.loadFromPath(Z)}catch(V){G=V instanceof Error?V:Error(String(V))}throw G||Error("Failed to load Ghostty WASM")}static async loadFromPath($){let j;if(typeof Bun<"u"&&typeof Bun.file=="function")try{let Z=Bun.file($);await Z.exists()&&(j=await Z.arrayBuffer())}catch{}if(!j)try{let Z=await(await Promise.resolve().then(() => (QR(),ER))).readFile($);j=Z.buffer.slice(Z.byteOffset,Z.byteOffset+Z.byteLength)}catch{}if(!j){let Z=await fetch($);if(!Z.ok)throw Error(`Failed to fetch WASM: ${Z.status} ${Z.statusText}`);if(j=await Z.arrayBuffer(),j.byteLength===0)throw Error(`WASM file is empty (0 bytes). Check path: ${$}`)}if(!j)throw Error(`Could not load WASM from path: ${$}`);let O=await WebAssembly.compile(j),G=await WebAssembly.instantiate(O,{env:{log:(Z,V)=>{let N=new Uint8Array(G.exports.memory.buffer,Z,V);console.log("[ghostty-vt]",new TextDecoder().decode(N))}}});return new HG(G)}}class cR{constructor($){this.encoder=0,this.exports=$;let j=this.exports.ghostty_wasm_alloc_opaque(),O=this.exports.ghostty_key_encoder_new(0,j);if(O!==0)throw Error(`Failed to create key encoder: ${O}`);let G=new DataView(this.exports.memory.buffer);this.encoder=G.getUint32(j,!0),this.exports.ghostty_wasm_free_opaque(j)}setOption($,j){let O=this.exports.ghostty_wasm_alloc_u8();new DataView(this.exports.memory.buffer).setUint8(O,typeof j=="boolean"?j?1:0:j),this.exports.ghostty_key_encoder_setopt(this.encoder,$,O),this.exports.ghostty_wasm_free_u8(O)}setKittyFlags($){this.setOption(CV.KITTY_KEYBOARD_FLAGS,$)}encode($){let j=this.exports.ghostty_wasm_alloc_opaque(),O=this.exports.ghostty_key_event_new(0,j);if(O!==0)throw Error(`Failed to create key event: ${O}`);let G=new DataView(this.exports.memory.buffer),Z=G.getUint32(j,!0);if(this.exports.ghostty_wasm_free_opaque(j),this.exports.ghostty_key_event_set_action(Z,$.action),this.exports.ghostty_key_event_set_key(Z,$.key),this.exports.ghostty_key_event_set_mods(Z,$.mods),$.utf8){let L=new TextEncoder().encode($.utf8),Y=this.exports.ghostty_wasm_alloc_u8_array(L.length);new Uint8Array(this.exports.memory.buffer).set(L,Y),this.exports.ghostty_key_event_set_utf8(Z,Y,L.length),this.exports.ghostty_wasm_free_u8_array(Y,L.length)}let V=32,N=this.exports.ghostty_wasm_alloc_u8_array(V),J=this.exports.ghostty_wasm_alloc_usize(),R=this.exports.ghostty_key_encoder_encode(this.encoder,Z,N,V,J);if(R!==0)throw this.exports.ghostty_wasm_free_u8_array(N,V),this.exports.ghostty_wasm_free_usize(J),this.exports.ghostty_key_event_free(Z),Error(`Failed to encode key: ${R}`);let U=G.getUint32(J,!0),H=new Uint8Array(this.exports.memory.buffer,N,U).slice();return this.exports.ghostty_wasm_free_u8_array(N,V),this.exports.ghostty_wasm_free_usize(J),this.exports.ghostty_key_event_free(Z),H}dispose(){this.encoder&&(this.exports.ghostty_key_encoder_free(this.encoder),this.encoder=0)}}var mR=class ${constructor(j,O,G=80,Z=24,V){var N;if(this.viewportBufferPtr=0,this.viewportBufferSize=0,this.cellPool=[],this.graphemeBuffer=null,this.graphemeBufferPtr=0,this.exports=j,this.memory=O,this._cols=G,this._rows=Z,V){let J=this.exports.ghostty_wasm_alloc_u8_array(CR);if(J===0)throw Error("Failed to allocate config (out of memory)");try{let R=new DataView(this.memory.buffer),U=J;R.setUint32(U,V.scrollbackLimit??1e4,!0),U+=4,R.setUint32(U,V.fgColor??0,!0),U+=4,R.setUint32(U,V.bgColor??0,!0),U+=4,R.setUint32(U,V.cursorColor??0,!0),U+=4;for(let H=0;H<16;H++)R.setUint32(U,((N=V.palette)==null?void 0:N[H])??0,!0),U+=4;this.handle=this.exports.ghostty_terminal_new_with_config(G,Z,J)}finally{this.exports.ghostty_wasm_free_u8_array(J,CR)}}else this.handle=this.exports.ghostty_terminal_new(G,Z);if(!this.handle)throw Error("Failed to create terminal");this.initCellPool()}get cols(){return this._cols}get rows(){return this._rows}write(j){let O=typeof j=="string"?new TextEncoder().encode(j):j,G=this.exports.ghostty_wasm_alloc_u8_array(O.length);new Uint8Array(this.memory.buffer).set(O,G),this.exports.ghostty_terminal_write(this.handle,G,O.length),this.exports.ghostty_wasm_free_u8_array(G,O.length)}resize(j,O){j===this._cols&&O===this._rows||(this._cols=j,this._rows=O,this.exports.ghostty_terminal_resize(this.handle,j,O),this.invalidateBuffers(),this.initCellPool())}free(){this.viewportBufferPtr&&(this.exports.ghostty_wasm_free_u8_array(this.viewportBufferPtr,this.viewportBufferSize),this.viewportBufferPtr=0),this.exports.ghostty_terminal_free(this.handle)}update(){return this.exports.ghostty_render_state_update(this.handle)}getCursor(){return this.update(),{x:this.exports.ghostty_render_state_get_cursor_x(this.handle),y:this.exports.ghostty_render_state_get_cursor_y(this.handle),viewportX:this.exports.ghostty_render_state_get_cursor_x(this.handle),viewportY:this.exports.ghostty_render_state_get_cursor_y(this.handle),visible:this.exports.ghostty_render_state_get_cursor_visible(this.handle),blinking:!1,style:"block"}}getColors(){let j=this.exports.ghostty_render_state_get_bg_color(this.handle),O=this.exports.ghostty_render_state_get_fg_color(this.handle);return{background:{r:j>>16&255,g:j>>8&255,b:j&255},foreground:{r:O>>16&255,g:O>>8&255,b:O&255},cursor:null}}isRowDirty(j){return this.exports.ghostty_render_state_is_row_dirty(this.handle,j)}markClean(){this.exports.ghostty_render_state_mark_clean(this.handle)}getViewport(){let j=this._cols*this._rows,O=j*$.CELL_SIZE;return(!this.viewportBufferPtr||this.viewportBufferSize=this._rows)return null;this.update();let O=this.getViewport(),G=j*this._cols;return O.slice(G,G+this._cols).map((Z)=>({...Z}))}isDirty(){return this.update()!==wV.NONE}needsFullRedraw(){return this.update()===wV.FULL}clearDirty(){this.markClean()}isAlternateScreen(){return!!this.exports.ghostty_terminal_is_alternate_screen(this.handle)}hasBracketedPaste(){return this.getMode(2004,!1)}hasFocusEvents(){return this.getMode(1004,!1)}hasMouseTracking(){return this.exports.ghostty_terminal_has_mouse_tracking(this.handle)!==0}getDimensions(){return{cols:this._cols,rows:this._rows}}getScrollbackLength(){return this.exports.ghostty_terminal_get_scrollback_length(this.handle)}getScrollbackLine(j){let O=this._cols*$.CELL_SIZE;(!this.viewportBufferPtr||this.viewportBufferSize(this.listeners.push($),{dispose:()=>{let j=this.listeners.indexOf($);j>=0&&this.listeners.splice(j,1)}})}fire($){for(let j of this.listeners)j($)}dispose(){this.listeners=[]}}class pR{constructor($){this.bufferChangeEmitter=new p2,this.terminal=$}get active(){let $=this.terminal.wasmTerm;return $?$.isAlternateScreen()?this.alternate:this.normal:this.normal}get normal(){return this._normalBuffer||(this._normalBuffer=new EV(this.terminal,"normal")),this._normalBuffer}get alternate(){return this._alternateBuffer||(this._alternateBuffer=new EV(this.terminal,"alternate")),this._alternateBuffer}get onBufferChange(){return this.bufferChangeEmitter.event}_fireBufferChange($){this.bufferChangeEmitter.fire($)}}class EV{constructor($,j){this.terminal=$,this.bufferType=j;let O={codepoint:0,fg_r:204,fg_g:204,fg_b:204,bg_r:0,bg_g:0,bg_b:0,flags:0,width:1,hyperlink_id:0,grapheme_len:0};this.nullCell=new Fq(O,0)}get type(){return this.bufferType}get cursorX(){let $=this.getWasmTerm();return $?$.getCursor().x:0}get cursorY(){let $=this.getWasmTerm();return $?$.getCursor().y:0}get viewportY(){return 0}get baseY(){return 0}get length(){let $=this.getWasmTerm();return $?this.bufferType==="alternate"?$.rows:$.getScrollbackLength()+$.rows:0}getLine($){let j=this.getWasmTerm();if(!j||$<0||$>=this.length)return;let O=j.getScrollbackLength(),G,Z,V;if(this.bufferType==="normal"&&$=this._length))return $>=this.cells.length?new Fq({codepoint:0,fg_r:204,fg_g:204,fg_b:204,bg_r:0,bg_g:0,bg_b:0,flags:0,width:1,hyperlink_id:0,grapheme_len:0},$):new Fq(this.cells[$],$)}translateToString($=!1,j=0,O=this._length){let G=Math.max(0,Math.min(j,this._length)),Z=Math.max(G,Math.min(O,this._length)),V="";for(let N=G;N1114111||$>=55296&&$<=57343?"�":String.fromCodePoint($)}getCode(){return this.cell.codepoint}getWidth(){return this.cell.width}getFgColorMode(){return-1}getBgColorMode(){return-1}getFgColor(){return this.cell.fg_r<<16|this.cell.fg_g<<8|this.cell.fg_b}getBgColor(){return this.cell.bg_r<<16|this.cell.bg_g<<8|this.cell.bg_b}isBold(){return this.cell.flags&O1.BOLD?1:0}isItalic(){return this.cell.flags&O1.ITALIC?1:0}isUnderline(){return this.cell.flags&O1.UNDERLINE?1:0}isStrikethrough(){return this.cell.flags&O1.STRIKETHROUGH?1:0}isBlink(){return this.cell.flags&O1.BLINK?1:0}isInverse(){return this.cell.flags&O1.INVERSE?1:0}isInvisible(){return this.cell.flags&O1.INVISIBLE?1:0}isFaint(){return this.cell.flags&O1.FAINT?1:0}getHyperlinkId(){return this.cell.hyperlink_id}getCodepoint(){return this.cell.codepoint}isDim(){return(this.cell.flags&O1.FAINT)!==0}}var HD={KeyA:n0.A,KeyB:n0.B,KeyC:n0.C,KeyD:n0.D,KeyE:n0.E,KeyF:n0.F,KeyG:n0.G,KeyH:n0.H,KeyI:n0.I,KeyJ:n0.J,KeyK:n0.K,KeyL:n0.L,KeyM:n0.M,KeyN:n0.N,KeyO:n0.O,KeyP:n0.P,KeyQ:n0.Q,KeyR:n0.R,KeyS:n0.S,KeyT:n0.T,KeyU:n0.U,KeyV:n0.V,KeyW:n0.W,KeyX:n0.X,KeyY:n0.Y,KeyZ:n0.Z,Digit1:n0.ONE,Digit2:n0.TWO,Digit3:n0.THREE,Digit4:n0.FOUR,Digit5:n0.FIVE,Digit6:n0.SIX,Digit7:n0.SEVEN,Digit8:n0.EIGHT,Digit9:n0.NINE,Digit0:n0.ZERO,Enter:n0.ENTER,Escape:n0.ESCAPE,Backspace:n0.BACKSPACE,Tab:n0.TAB,Space:n0.SPACE,Minus:n0.MINUS,Equal:n0.EQUAL,BracketLeft:n0.BRACKET_LEFT,BracketRight:n0.BRACKET_RIGHT,Backslash:n0.BACKSLASH,Semicolon:n0.SEMICOLON,Quote:n0.QUOTE,Backquote:n0.GRAVE,Comma:n0.COMMA,Period:n0.PERIOD,Slash:n0.SLASH,CapsLock:n0.CAPS_LOCK,F1:n0.F1,F2:n0.F2,F3:n0.F3,F4:n0.F4,F5:n0.F5,F6:n0.F6,F7:n0.F7,F8:n0.F8,F9:n0.F9,F10:n0.F10,F11:n0.F11,F12:n0.F12,PrintScreen:n0.PRINT_SCREEN,ScrollLock:n0.SCROLL_LOCK,Pause:n0.PAUSE,Insert:n0.INSERT,Home:n0.HOME,PageUp:n0.PAGE_UP,Delete:n0.DELETE,End:n0.END,PageDown:n0.PAGE_DOWN,ArrowRight:n0.RIGHT,ArrowLeft:n0.LEFT,ArrowDown:n0.DOWN,ArrowUp:n0.UP,NumLock:n0.NUM_LOCK,NumpadDivide:n0.KP_DIVIDE,NumpadMultiply:n0.KP_MULTIPLY,NumpadSubtract:n0.KP_MINUS,NumpadAdd:n0.KP_PLUS,NumpadEnter:n0.KP_ENTER,Numpad1:n0.KP_1,Numpad2:n0.KP_2,Numpad3:n0.KP_3,Numpad4:n0.KP_4,Numpad5:n0.KP_5,Numpad6:n0.KP_6,Numpad7:n0.KP_7,Numpad8:n0.KP_8,Numpad9:n0.KP_9,Numpad0:n0.KP_0,NumpadDecimal:n0.KP_PERIOD,IntlBackslash:n0.INTL_BACKSLASH,ContextMenu:n0.CONTEXT_MENU,F13:n0.F13,F14:n0.F14,F15:n0.F15,F16:n0.F16,F17:n0.F17,F18:n0.F18,F19:n0.F19,F20:n0.F20,F21:n0.F21,F22:n0.F22,F23:n0.F23,F24:n0.F24},gR=class ${constructor(j,O,G,Z,V,N,J,R,U,H){this.keydownListener=null,this.keypressListener=null,this.pasteListener=null,this.beforeInputListener=null,this.compositionStartListener=null,this.compositionUpdateListener=null,this.compositionEndListener=null,this.mousedownListener=null,this.mouseupListener=null,this.mousemoveListener=null,this.wheelListener=null,this.isComposing=!1,this.compositionJustEnded=!1,this.pendingKeyAfterComposition=null,this.isDisposed=!1,this.mouseButtonsPressed=0,this.lastKeyDownData=null,this.lastKeyDownTime=0,this.lastPasteData=null,this.lastPasteTime=0,this.lastPasteSource=null,this.lastCompositionData=null,this.lastCompositionTime=0,this.lastBeforeInputData=null,this.lastBeforeInputTime=0,this.encoder=j.createKeyEncoder(),this.container=O,this.inputElement=U,this.onDataCallback=G,this.onBellCallback=Z,this.onKeyCallback=V,this.customKeyEventHandler=N,this.getModeCallback=J,this.onCopyCallback=R,this.mouseConfig=H,this.attach()}setCustomKeyEventHandler(j){this.customKeyEventHandler=j}attach(){typeof this.container.hasAttribute=="function"&&typeof this.container.setAttribute=="function"&&(this.container.hasAttribute("tabindex")||this.container.setAttribute("tabindex","0"),this.container.style&&(this.container.style.outline="none")),this.keydownListener=this.handleKeyDown.bind(this),this.container.addEventListener("keydown",this.keydownListener),this.pasteListener=this.handlePaste.bind(this),this.container.addEventListener("paste",this.pasteListener),this.inputElement&&this.inputElement!==this.container&&this.inputElement.addEventListener("paste",this.pasteListener),this.inputElement&&(this.beforeInputListener=this.handleBeforeInput.bind(this),this.inputElement.addEventListener("beforeinput",this.beforeInputListener));let j=this.inputElement||this.container;this.compositionStartListener=this.handleCompositionStart.bind(this),j.addEventListener("compositionstart",this.compositionStartListener),this.compositionUpdateListener=this.handleCompositionUpdate.bind(this),j.addEventListener("compositionupdate",this.compositionUpdateListener),this.compositionEndListener=this.handleCompositionEnd.bind(this),j.addEventListener("compositionend",this.compositionEndListener),this.mousedownListener=this.handleMouseDown.bind(this),this.container.addEventListener("mousedown",this.mousedownListener),this.mouseupListener=this.handleMouseUp.bind(this),this.container.addEventListener("mouseup",this.mouseupListener),this.mousemoveListener=this.handleMouseMove.bind(this),this.container.addEventListener("mousemove",this.mousemoveListener),this.wheelListener=this.handleWheel.bind(this),this.container.addEventListener("wheel",this.wheelListener,{passive:!1})}mapKeyCode(j){return HD[j]??null}extractModifiers(j){let O=X4.NONE;return j.shiftKey&&(O|=X4.SHIFT),j.ctrlKey&&(O|=X4.CTRL),j.altKey&&(O|=X4.ALT),j.metaKey&&(O|=X4.SUPER),O}isPrintableCharacter(j){return j.ctrlKey&&!j.altKey||j.altKey&&!j.ctrlKey||j.metaKey?!1:j.key.length===1}handleKeyDown(j){if(this.isDisposed||j.isComposing||j.keyCode===229)return;if(this.isComposing){this.pendingKeyAfterComposition=j.key,j.preventDefault();return}if(this.compositionJustEnded){this.compositionJustEnded=!1;return}if(this.onKeyCallback&&this.onKeyCallback({key:j.key,domEvent:j}),this.customKeyEventHandler){let V=this.customKeyEventHandler(j);if(V===!0){j.preventDefault();return}if(V===!1)return}if((j.ctrlKey||j.metaKey)&&j.code==="KeyV")return;if(j.metaKey&&j.code==="KeyC"){this.onCopyCallback&&this.onCopyCallback()&&j.preventDefault();return}if(j.metaKey&&!j.ctrlKey)return;if(this.isPrintableCharacter(j)){j.preventDefault(),this.onDataCallback(j.key),this.recordKeyDownData(j.key);return}let O=this.mapKeyCode(j.code);if(O===null)return;let G=this.extractModifiers(j);if(G===X4.NONE||G===X4.SHIFT){let V=null;switch(O){case n0.ENTER:V="\r";break;case n0.TAB:G===X4.SHIFT?V="\x1B[Z":V="\t";break;case n0.BACKSPACE:V="";break;case n0.ESCAPE:V="\x1B";break;case n0.HOME:V="\x1B[H";break;case n0.END:V="\x1B[F";break;case n0.INSERT:V="\x1B[2~";break;case n0.DELETE:V="\x1B[3~";break;case n0.PAGE_UP:V="\x1B[5~";break;case n0.PAGE_DOWN:V="\x1B[6~";break;case n0.F1:V="\x1BOP";break;case n0.F2:V="\x1BOQ";break;case n0.F3:V="\x1BOR";break;case n0.F4:V="\x1BOS";break;case n0.F5:V="\x1B[15~";break;case n0.F6:V="\x1B[17~";break;case n0.F7:V="\x1B[18~";break;case n0.F8:V="\x1B[19~";break;case n0.F9:V="\x1B[20~";break;case n0.F10:V="\x1B[21~";break;case n0.F11:V="\x1B[23~";break;case n0.F12:V="\x1B[24~";break}if(V!==null){j.preventDefault(),this.onDataCallback(V),this.recordKeyDownData(V);return}}let Z=hR.PRESS;try{if(this.getModeCallback){let R=this.getModeCallback(1);this.encoder.setOption(CV.CURSOR_KEY_APPLICATION,R)}let V=j.key.length===1&&j.key.charCodeAt(0)<128?j.key.toLowerCase():void 0,N=this.encoder.encode({action:Z,key:O,mods:G,utf8:V}),J=new TextDecoder().decode(N);j.preventDefault(),j.stopPropagation(),J.length>0&&(this.onDataCallback(J),this.recordKeyDownData(J))}catch(V){console.warn("Failed to encode key:",j.code,V)}}handlePaste(j){if(this.isDisposed)return;j.preventDefault(),j.stopPropagation();let O=j.clipboardData;if(!O){console.warn("No clipboard data available");return}let G=O.getData("text/plain");if(!G){console.warn("No text in clipboard");return}this.shouldIgnorePasteEvent(G,"paste")||(this.emitPasteData(G),this.recordPasteData(G,"paste"))}handleBeforeInput(j){if(this.isDisposed||this.isComposing||j.isComposing)return;let O=j.inputType,G=j.data??"",Z=null;switch(O){case"insertText":case"insertReplacementText":Z=G.length>0?G.replace(/\n/g,"\r"):null;break;case"insertLineBreak":case"insertParagraph":Z="\r";break;case"deleteContentBackward":Z="";break;case"deleteContentForward":Z="\x1B[3~";break;case"insertFromPaste":if(!G)return;if(this.shouldIgnorePasteEvent(G,"beforeinput")){j.preventDefault(),j.stopPropagation();return}j.preventDefault(),j.stopPropagation(),this.emitPasteData(G),this.recordPasteData(G,"beforeinput");return;default:return}if(Z){if(this.shouldIgnoreBeforeInput(Z)){j.preventDefault(),j.stopPropagation();return}if(G&&this.shouldIgnoreBeforeInputFromComposition(G)){j.preventDefault(),j.stopPropagation();return}j.preventDefault(),j.stopPropagation(),this.onDataCallback(Z),G&&this.recordBeforeInputData(G)}}handleCompositionStart(j){this.isDisposed||(this.isComposing=!0)}handleCompositionUpdate(j){this.isDisposed}handleCompositionEnd(j){if(this.isDisposed)return;this.isComposing=!1;let O=j.data;if(O&&O.length>0){if(this.shouldIgnoreCompositionEnd(O)){this.cleanupCompositionTextNodes(),this.processPendingKeyAfterComposition();return}this.onDataCallback(O),this.recordCompositionData(O)}this.cleanupCompositionTextNodes(),this.processPendingKeyAfterComposition()}processPendingKeyAfterComposition(){if(this.pendingKeyAfterComposition){let j=this.pendingKeyAfterComposition;this.pendingKeyAfterComposition=null,this.onDataCallback(j)}}cleanupCompositionTextNodes(){if(this.container&&this.container.childNodes)for(let j=this.container.childNodes.length-1;j>=0;j--){let O=this.container.childNodes[j];O.nodeType===3&&this.container.removeChild(O)}}pixelToCell(j){if(!this.mouseConfig)return null;let O=this.mouseConfig.getCellDimensions(),G=this.mouseConfig.getCanvasOffset();if(O.width<=0||O.height<=0)return null;let Z=j.clientX-G.left,V=j.clientY-G.top,N=Math.floor(Z/O.width)+1,J=Math.floor(V/O.height)+1;return{col:Math.max(1,N),row:Math.max(1,J)}}getMouseModifiers(j){let O=0;return j.shiftKey&&(O|=4),j.metaKey&&(O|=8),j.ctrlKey&&(O|=16),O}encodeMouseSGR(j,O,G,Z,V){return`\x1B[<${j+V};${O};${G}${Z?"m":"M"}`}encodeMouseX10(j,O,G,Z){let V=j+Z+32,N=String.fromCharCode(Math.min(O+32,255)),J=String.fromCharCode(Math.min(G+32,255));return`\x1B[M${String.fromCharCode(V)}${N}${J}`}sendMouseEvent(j,O,G,Z,V){var N,J;let R=this.getMouseModifiers(V),U=((J=(N=this.mouseConfig)==null?void 0:N.hasSgrMouseMode)==null?void 0:J.call(N))??!0,H;if(U)H=this.encodeMouseSGR(j,O,G,Z,R);else{let L=Z?3:j;H=this.encodeMouseX10(L,O,G,R)}this.onDataCallback(H)}handleMouseDown(j){var O;if(this.isDisposed||!((O=this.mouseConfig)!=null&&O.hasMouseTracking()))return;let G=this.pixelToCell(j);if(!G)return;let Z=j.button;this.mouseButtonsPressed|=1<=O.length||!O.getCell($))){for(let G of this.linkCache.values())if(this.isPositionInLink($,j,G))return G;this.scannedRows.has(j)||await this.scanRow(j);for(let G of this.linkCache.values())if(this.isPositionInLink($,j,G))return G}}async scanRow($){this.scannedRows.add($);let j=[];for(let O of this.providers){let G=await new Promise((Z)=>{O.provideLinks($,Z)});G&&j.push(...G)}for(let O of j)this.cacheLink(O)}cacheLink($){let{start:j,end:O}=$.range,G=`r${j.y}:${j.x}-${O.x}`;this.linkCache.set(G,$)}isPositionInLink($,j,O){let{start:G,end:Z}=O.range;return jZ.y?!1:G.y===Z.y?$>=G.x&&$<=Z.x:j===G.y?$>=G.x:j===Z.y?$<=Z.x:!0}invalidateCache(){this.linkCache.clear(),this.scannedRows.clear()}invalidateRows($,j){for(let G=$;G<=j;G++)this.scannedRows.delete(G);let O=[];for(let[G,Z]of this.linkCache.entries()){let{start:V,end:N}=Z.range;(V.y>=$&&V.y<=j||N.y>=$&&N.y<=j||V.y<$&&N.y>j)&&O.push(G)}for(let G of O)this.linkCache.delete(G)}dispose(){var $;this.linkCache.clear(),this.scannedRows.clear();for(let j of this.providers)($=j.dispose)==null||$.call(j);this.providers=[]}}class dR{constructor($){this.terminal=$}provideLinks($,j){let O=[],G=new Set,Z=this.terminal.buffer.active.getLine($);if(!Z){j(void 0);return}for(let V=0;V{(Y.ctrlKey||Y.metaKey)&&window.open(U,"_blank","noopener,noreferrer")}})}}j(O.length>0?O:void 0)}findLinkRange($,j,O){let G=this.terminal.buffer.active,Z=j,V=O;for(;V>0;){let U=G.getLine(Z);if(!U)break;let H=U.getCell(V-1);if(!H||H.getHyperlinkId()!==$)break;V--}if(V===0&&Z>0){let U=Z-1;for(;U>=0;){let H=G.getLine(U);if(!H||H.length===0)break;let L=H.getCell(H.length-1);if(!L||L.getHyperlinkId()!==$)break;Z=U,V=0;for(let Y=H.length-1;Y>=0;Y--){let S=H.getCell(Y);if(!S||S.getHyperlinkId()!==$){V=Y+1;break}}if(V===0)U--;else break}}let N=j,J=O,R=G.getLine(N);if(R){for(;J8&&G.push({text:J,range:{start:{x:R,y:j},end:{x:U,y:j}},activate:(L)=>{(L.ctrlKey||L.metaKey)&&window.open(J,"_blank","noopener,noreferrer")}}),N=$.URL_REGEX.exec(V)}O(G.length>0?G:void 0)}lineToText(j){let O=[];for(let G=0;G{let G=O.trim();return G.startsWith('"')||G.startsWith("'")||!G.includes(" ")?G:`"${G}"`}).join(", ");return`${$}${this.fontSize}px ${j}`}measureFont(){let $=document.createElement("canvas").getContext("2d");$.font=this.buildFontString();let j=$.measureText("M"),O=Math.ceil(j.width),G=j.fontBoundingBoxAscent??j.actualBoundingBoxAscent??this.fontSize*0.8,Z=j.fontBoundingBoxDescent??j.actualBoundingBoxDescent??this.fontSize*0.2,V=Math.ceil(G+Z),N=Math.ceil(G);return{width:O,height:V,baseline:N}}remeasureFont(){this.metrics=this.measureFont()}rgbToCSS($,j,O){return`rgb(${$}, ${j}, ${O})`}resize($,j){let O=$*this.metrics.width,G=j*this.metrics.height;this.canvas.style.width=`${O}px`,this.canvas.style.height=`${G}px`,this.canvas.width=O*this.devicePixelRatio,this.canvas.height=G*this.devicePixelRatio,this.ctx.scale(this.devicePixelRatio,this.devicePixelRatio),this.ctx.textBaseline="alphabetic",this.ctx.textAlign="left",this.ctx.fillStyle=this.theme.background,this.ctx.fillRect(0,0,O,G)}render($,j=!1,O=0,G,Z=1){var V;let N=0,J=null;typeof O=="object"?J=O:N=O,this.currentBuffer=$;let R=$.getCursor(),U=$.getDimensions(),H=G?G.getScrollbackLength():0;(V=$.needsFullRedraw)!=null&&V.call($)&&(j=!0),(this.canvas.width!==U.cols*this.metrics.width*this.devicePixelRatio||this.canvas.height!==U.rows*this.metrics.height*this.devicePixelRatio)&&(this.resize(U.cols,U.rows),j=!0),N!==this.lastViewportY&&(j=!0,this.lastViewportY=N);let L=R.x!==this.lastCursorPosition.x||R.y!==this.lastCursorPosition.y;if(L||this.cursorBlink){if(!j&&!$.isRowDirty(R.y)){let z=$.getLine(R.y);z&&this.renderLine(z,R.y,U.cols)}if(L&&this.lastCursorPosition.y!==R.y&&!j&&!$.isRowDirty(this.lastCursorPosition.y)){let z=$.getLine(this.lastCursorPosition.y);z&&this.renderLine(z,this.lastCursorPosition.y,U.cols)}}let Y=J||this.selectionManager&&this.selectionManager.hasSelection(),S=new Set;if(J?this.currentSelectionCoords={startCol:J.start.x,startRow:J.start.y,endCol:J.end.x,endRow:J.end.y}:this.currentSelectionCoords=Y?this.selectionManager.getSelectionCoords():null,this.currentSelectionCoords){let z=this.currentSelectionCoords;for(let w=z.startRow;w<=z.endRow;w++)S.add(w)}if(this.selectionManager){let z=this.selectionManager.getDirtySelectionRows();if(z.size>0){for(let w of z)S.add(w);this.selectionManager.clearDirtySelectionRows()}}let X=new Set,D=this.hoveredHyperlinkId!==this.previousHoveredHyperlinkId,I=JSON.stringify(this.hoveredLinkRange)!==JSON.stringify(this.previousHoveredLinkRange);if(D){for(let z=0;z0)if(z0?!0:j||$.isRowDirty(z)||S.has(z)||X.has(z))&&(k.add(z),z>0&&k.add(z-1),z0)if(z0?z-Math.floor(N):z;w=$.getLine(T)}else w=$.getLine(z);w&&this.renderLine(w,z,U.cols)}if(N===0&&R.visible&&this.cursorVisible){let z=R.style??this.cursorStyle;this.renderCursor(R.x,R.y,z)}G&&Z>0&&this.renderScrollbar(N,H,U.rows,Z),this.lastCursorPosition={x:R.x,y:R.y},$.clearDirty()}renderLine($,j,O){let G=j*this.metrics.height,Z=O*this.metrics.width;this.ctx.clearRect(0,G,Z,this.metrics.height),this.ctx.fillStyle=this.theme.background,this.ctx.fillRect(0,G,Z,this.metrics.height);for(let V=0;V<$.length;V++){let N=$[V];N.width!==0&&this.renderCellBackground(N,V,j)}for(let V=0;V<$.length;V++){let N=$[V];N.width!==0&&this.renderCellText(N,V,j)}}renderCellBackground($,j,O){let G=j*this.metrics.width,Z=O*this.metrics.height,V=this.metrics.width*$.width,N=this.isInSelection(j,O),J=$.bg_r,R=$.bg_g,U=$.bg_b;$.flags&O1.INVERSE&&(J=$.fg_r,R=$.fg_g,U=$.fg_b),J===0&&R===0&&U===0||(this.ctx.fillStyle=this.rgbToCSS(J,R,U),this.ctx.fillRect(G,Z,V,this.metrics.height)),N&&this.theme.selectionBackground&&(this.ctx.globalAlpha=0.4,this.ctx.fillStyle=this.theme.selectionBackground,this.ctx.fillRect(G,Z,V,this.metrics.height),this.ctx.globalAlpha=1)}renderCellText($,j,O,G){var Z;let V=j*this.metrics.width,N=O*this.metrics.height,J=this.metrics.width*$.width;if($.flags&O1.INVISIBLE)return;let R=this.isInSelection(j,O),U="";$.flags&O1.ITALIC&&(U+="italic "),$.flags&O1.BOLD&&(U+="bold "),this.ctx.font=this.buildFontString(U);let{fg_r:H,fg_g:L,fg_b:Y}=$;if($.flags&O1.INVERSE&&(H=$.bg_r,L=$.bg_g,Y=$.bg_b),G)this.ctx.fillStyle=G;else if(R){let k=this.theme.selectionForeground;k&&k!=="undefined"?this.ctx.fillStyle=k:this.ctx.fillStyle=this.rgbToCSS(H,L,Y)}else this.ctx.fillStyle=this.rgbToCSS(H,L,Y);$.flags&O1.FAINT&&(this.ctx.globalAlpha=0.5);let S=V,X=N+this.metrics.baseline,D;$.grapheme_len>0&&((Z=this.currentBuffer)!=null&&Z.getGraphemeString)?D=this.currentBuffer.getGraphemeString(O,j):D=String.fromCodePoint($.codepoint||32);let I=$.codepoint||32;if(this.renderBlockChar(I,V,N,J)||this.renderPowerlineGlyph(I,V,N,J)||this.ctx.fillText(D,S,X),$.flags&O1.FAINT&&(this.ctx.globalAlpha=1),$.flags&O1.UNDERLINE){let k=N+this.metrics.baseline+2;this.ctx.strokeStyle=this.ctx.fillStyle,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(V,k),this.ctx.lineTo(V+J,k),this.ctx.stroke()}if($.flags&O1.STRIKETHROUGH){let k=N+this.metrics.height/2;this.ctx.strokeStyle=this.ctx.fillStyle,this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(V,k),this.ctx.lineTo(V+J,k),this.ctx.stroke()}if($.hyperlink_id>0&&$.hyperlink_id===this.hoveredHyperlinkId){let k=N+this.metrics.baseline+2;this.ctx.strokeStyle="#4A90E2",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(V,k),this.ctx.lineTo(V+J,k),this.ctx.stroke()}if(this.hoveredLinkRange){let k=this.hoveredLinkRange;if(O===k.startY&&j>=k.startX&&(Ok.startY&&Ok.startY||j>=k.startX)){let z=N+this.metrics.baseline+2;this.ctx.strokeStyle="#4A90E2",this.ctx.lineWidth=1,this.ctx.beginPath(),this.ctx.moveTo(V,z),this.ctx.lineTo(V+J,z),this.ctx.stroke()}}}renderBlockChar($,j,O,G){let Z=this.metrics.height;switch($){case 9600:return this.ctx.fillRect(j,O,G,Z/2),!0;case 9601:return this.ctx.fillRect(j,O+Z*7/8,G,Z/8),!0;case 9602:return this.ctx.fillRect(j,O+Z*3/4,G,Z/4),!0;case 9603:return this.ctx.fillRect(j,O+Z*5/8,G,Z*3/8),!0;case 9604:return this.ctx.fillRect(j,O+Z/2,G,Z/2),!0;case 9605:return this.ctx.fillRect(j,O+Z*3/8,G,Z*5/8),!0;case 9606:return this.ctx.fillRect(j,O+Z/4,G,Z*3/4),!0;case 9607:return this.ctx.fillRect(j,O+Z/8,G,Z*7/8),!0;case 9608:return this.ctx.fillRect(j,O,G,Z),!0;case 9609:return this.ctx.fillRect(j,O,G*7/8,Z),!0;case 9610:return this.ctx.fillRect(j,O,G*3/4,Z),!0;case 9611:return this.ctx.fillRect(j,O,G*5/8,Z),!0;case 9612:return this.ctx.fillRect(j,O,G/2,Z),!0;case 9613:return this.ctx.fillRect(j,O,G*3/8,Z),!0;case 9614:return this.ctx.fillRect(j,O,G/4,Z),!0;case 9615:return this.ctx.fillRect(j,O,G/8,Z),!0;case 9616:return this.ctx.fillRect(j+G/2,O,G/2,Z),!0;case 9620:return this.ctx.fillRect(j,O,G,Z/8),!0;case 9621:return this.ctx.fillRect(j+G*7/8,O,G/8,Z),!0;default:return!1}}renderPowerlineGlyph($,j,O,G){let Z=this.metrics.height,V=this.ctx;switch($){case 57520:return V.beginPath(),V.moveTo(j,O),V.lineTo(j+G,O+Z/2),V.lineTo(j,O+Z),V.closePath(),V.fill(),!0;case 57521:return V.beginPath(),V.moveTo(j,O),V.lineTo(j+G,O+Z/2),V.lineTo(j,O+Z),V.strokeStyle=V.fillStyle,V.lineWidth=1,V.stroke(),!0;case 57522:return V.beginPath(),V.moveTo(j+G,O),V.lineTo(j,O+Z/2),V.lineTo(j+G,O+Z),V.closePath(),V.fill(),!0;case 57523:return V.beginPath(),V.moveTo(j+G,O),V.lineTo(j,O+Z/2),V.lineTo(j+G,O+Z),V.strokeStyle=V.fillStyle,V.lineWidth=1,V.stroke(),!0;case 57524:return V.beginPath(),V.moveTo(j,O),V.ellipse(j,O+Z/2,G,Z/2,0,-Math.PI/2,Math.PI/2,!1),V.closePath(),V.fill(),!0;case 57525:return V.beginPath(),V.moveTo(j,O),V.ellipse(j,O+Z/2,G,Z/2,0,-Math.PI/2,Math.PI/2,!1),V.strokeStyle=V.fillStyle,V.lineWidth=1,V.stroke(),!0;case 57526:return V.beginPath(),V.moveTo(j+G,O),V.ellipse(j+G,O+Z/2,G,Z/2,0,-Math.PI/2,Math.PI/2,!0),V.closePath(),V.fill(),!0;case 57527:return V.beginPath(),V.moveTo(j+G,O),V.ellipse(j+G,O+Z/2,G,Z/2,0,-Math.PI/2,Math.PI/2,!0),V.strokeStyle=V.fillStyle,V.lineWidth=1,V.stroke(),!0;default:return!1}}renderCursor($,j,O){var G;let Z=$*this.metrics.width,V=j*this.metrics.height,N=O??this.cursorStyle;switch(this.ctx.fillStyle=this.theme.cursor,N){case"block":this.ctx.fillRect(Z,V,this.metrics.width,this.metrics.height);let J=(G=this.currentBuffer)==null?void 0:G.getLine(j);J!=null&&J[$]&&this.renderCellText(J[$],$,j,this.theme.cursorAccent);break;case"underline":let R=Math.max(2,Math.floor(this.metrics.height*0.15));this.ctx.fillRect(Z,V+this.metrics.height-R,this.metrics.width,R);break;case"bar":let U=Math.max(2,Math.floor(this.metrics.width*0.15));this.ctx.fillRect(Z,V,U,this.metrics.height);break}}startCursorBlink(){this.cursorBlinkInterval=window.setInterval(()=>{this.cursorVisible=!this.cursorVisible},530)}stopCursorBlink(){this.cursorBlinkInterval!==void 0&&(clearInterval(this.cursorBlinkInterval),this.cursorBlinkInterval=void 0),this.cursorVisible=!0}setTheme($){this.theme={...QV,...$},this.palette=[this.theme.black,this.theme.red,this.theme.green,this.theme.yellow,this.theme.blue,this.theme.magenta,this.theme.cyan,this.theme.white,this.theme.brightBlack,this.theme.brightRed,this.theme.brightGreen,this.theme.brightYellow,this.theme.brightBlue,this.theme.brightMagenta,this.theme.brightCyan,this.theme.brightWhite]}setFontSize($){this.fontSize=$,this.metrics=this.measureFont()}setFontFamily($){this.fontFamily=$,this.metrics=this.measureFont()}setCursorStyle($){this.cursorStyle=$}setCursorBlink($){$&&!this.cursorBlink?(this.cursorBlink=!0,this.startCursorBlink()):!$&&this.cursorBlink&&(this.cursorBlink=!1,this.stopCursorBlink())}renderScrollbar($,j,O,G=1){let Z=this.ctx,V=this.canvas.height/this.devicePixelRatio,N=this.canvas.width/this.devicePixelRatio,R=N-8-4,H=V-8;if(Z.clearRect(R-2,0,14,V),Z.fillStyle=this.theme.background,Z.fillRect(R-2,0,14,V),G<=0||j===0)return;let L=j+O,Y=Math.max(20,O/L*H),S=$/j,X=4+(H-Y)*(1-S);Z.fillStyle=`rgba(128, 128, 128, ${0.1*G})`,Z.fillRect(R,4,8,H);let D=$>0?0.5:0.3;Z.fillStyle=`rgba(128, 128, 128, ${D*G})`,Z.fillRect(R,X,8,Y)}getMetrics(){return{...this.metrics}}getCanvas(){return this.canvas}setSelectionManager($){this.selectionManager=$}isInSelection($,j){let O=this.currentSelectionCoords;if(!O)return!1;let{startCol:G,startRow:Z,endCol:V,endRow:N}=O;return Z===N?j===Z&&$>=G&&$<=V:j===Z?$>=G:j===N?$<=V:j>Z&&jZ||O===Z&&j>G)&&([j,G]=[G,j],[O,Z]=[Z,O]);let V=this.wasmTerm.getScrollbackLength(),N="";for(let J=O;J<=Z;J++){let R=null;if(J0)if(J=0?Y=Y.substring(0,U):Y="",N+=Y,J=Z.cols;)N-=Z.cols,V++;V=Math.min(V,Z.rows-1);let J=this.getViewportY();this.selectionStart={col:j,absoluteRow:J+O},this.selectionEnd={col:N,absoluteRow:J+V},this.requestRender(),this.selectionChangedEmitter.fire()}selectLines(j,O){let G=this.wasmTerm.getDimensions();j=Math.max(0,Math.min(j,G.rows-1)),O=Math.max(0,Math.min(O,G.rows-1)),j>O&&([j,O]=[O,j]);let Z=this.getViewportY();this.selectionStart={col:0,absoluteRow:Z+j},this.selectionEnd={col:G.cols-1,absoluteRow:Z+O},this.requestRender(),this.selectionChangedEmitter.fire()}getSelectionPosition(){let j=this.normalizeSelection();if(j)return{start:{x:j.startCol,y:j.startRow},end:{x:j.endCol,y:j.endRow}}}deselect(){this.clearSelection(),this.selectionChangedEmitter.fire()}focus(){let j=this.renderer.getCanvas();j.parentElement&&j.parentElement.focus()}getSelectionCoords(){return this.normalizeSelection()}getDirtySelectionRows(){return this.dirtySelectionRows}clearDirtySelectionRows(){this.dirtySelectionRows.clear()}get onSelectionChange(){return this.selectionChangedEmitter.event}dispose(){this.selectionChangedEmitter.dispose(),this.stopAutoScroll(),this.boundMouseUpHandler&&(document.removeEventListener("mouseup",this.boundMouseUpHandler),this.boundMouseUpHandler=null),this.boundDocumentMouseMoveHandler&&(document.removeEventListener("mousemove",this.boundDocumentMouseMoveHandler),this.boundDocumentMouseMoveHandler=null),this.boundContextMenuHandler&&(this.renderer.getCanvas().removeEventListener("contextmenu",this.boundContextMenuHandler),this.boundContextMenuHandler=null),this.boundClickHandler&&(document.removeEventListener("click",this.boundClickHandler),this.boundClickHandler=null)}hasSGRMouseMode(){let j=this.terminal.wasmTerm;return j?j.getMode(1006,!1):!1}shouldReportMotion(j){let O=this.terminal.wasmTerm;return O?!!(O.getMode(1003,!1)||O.getMode(1002,!1)&&j):!1}mapButton(j){return j>=0&&j<=2?j:null}encodeModifiers(j){let O=0;return j.shiftKey&&(O+=4),(j.altKey||j.metaKey)&&(O+=8),j.ctrlKey&&(O+=16),O}sendMouseEvent(j,O,G,Z,V=0,N=!1){var J;if(!this.hasSGRMouseMode())return;let R=j+1,U=O+1,H=G;N&&(H+=32),H+=V;let L=`\x1B[<${H};${R};${U}${Z?"m":"M"}`;(J=this.terminal.dataEmitter)==null||J.fire(L)}sendScrollEvent(j,O,G,Z=0){let V=G?64:65;this.sendMouseEvent(j,O,V,!1,Z,!1)}attachEventListeners(){let j=this.renderer.getCanvas();j.addEventListener("mousedown",(O)=>{j.parentElement&&j.parentElement.focus();let G=this.pixelToCell(O.offsetX,O.offsetY);if(this.terminal.hasMouseTracking()){let Z=this.mapButton(O.button);if(Z===null)return;this.mouseButtonsPressed.add(Z);let V=this.encodeModifiers(O);this.sendMouseEvent(G.col,G.row,Z,!1,V),O.preventDefault();return}if(O.button===0){this.hasSelection()&&this.clearSelection();let Z=this.viewportRowToAbsolute(G.row);this.selectionStart={col:G.col,absoluteRow:Z},this.selectionEnd={col:G.col,absoluteRow:Z},this.isSelecting=!0}}),j.addEventListener("mousemove",(O)=>{if(this.terminal.hasMouseTracking()){let G=this.mouseButtonsPressed.size>0;if(this.shouldReportMotion(G)){let Z=this.pixelToCell(O.offsetX,O.offsetY),V=this.encodeModifiers(O),N=G?[...this.mouseButtonsPressed][0]:3;this.sendMouseEvent(Z.col,Z.row,N,!1,V,!0);return}if(G)return}if(this.isSelecting){this.markCurrentSelectionDirty();let G=this.pixelToCell(O.offsetX,O.offsetY),Z=this.viewportRowToAbsolute(G.row);this.selectionEnd={col:G.col,absoluteRow:Z},this.requestRender(),this.updateAutoScroll(O.offsetY,j.clientHeight)}}),j.addEventListener("mouseleave",(O)=>{if(this.isSelecting){let G=j.getBoundingClientRect();O.clientYG.bottom&&this.startAutoScroll(1)}}),j.addEventListener("mouseenter",()=>{this.isSelecting&&this.stopAutoScroll()}),this.boundDocumentMouseMoveHandler=(O)=>{if(this.isSelecting){let G=j.getBoundingClientRect(),Z=Math.max(G.left,Math.min(O.clientX,G.right)),V=Math.max(G.top,Math.min(O.clientY,G.bottom)),N=Z-G.left,J=V-G.top;if((O.clientXG.right||O.clientYG.bottom)&&(O.clientYG.bottom?this.startAutoScroll(1):this.stopAutoScroll(),this.autoScrollDirection===0)){this.markCurrentSelectionDirty();let R=this.pixelToCell(N,J),U=this.viewportRowToAbsolute(R.row);this.selectionEnd={col:R.col,absoluteRow:U},this.requestRender()}}},document.addEventListener("mousemove",this.boundDocumentMouseMoveHandler),document.addEventListener("mousedown",(O)=>{this.mouseDownTarget=O.target}),this.boundMouseUpHandler=(O)=>{let G=this.mapButton(O.button);if(G!==null&&this.mouseButtonsPressed.has(G)&&this.terminal.hasMouseTracking()){let Z=j.getBoundingClientRect(),V=Math.max(0,Math.min(O.clientX-Z.left,Z.width)),N=Math.max(0,Math.min(O.clientY-Z.top,Z.height)),J=this.pixelToCell(V,N),R=this.encodeModifiers(O);this.sendMouseEvent(J.col,J.row,G,!0,R),this.mouseButtonsPressed.delete(G);return}if(G!==null&&this.mouseButtonsPressed.delete(G),this.isSelecting){if(this.isSelecting=!1,this.stopAutoScroll(),this.selectionStart&&this.selectionEnd&&this.selectionStart.col===this.selectionEnd.col&&this.selectionStart.absoluteRow===this.selectionEnd.absoluteRow){this.selectionStart=null,this.selectionEnd=null;return}if(this.hasSelection()){let Z=this.getSelection();Z&&(this.copyToClipboard(Z),this.selectionChangedEmitter.fire())}}},document.addEventListener("mouseup",this.boundMouseUpHandler),j.addEventListener("click",(O)=>{if(O.detail===2){let G=this.pixelToCell(O.offsetX,O.offsetY),Z=this.getWordAtCell(G.col,G.row);if(Z){let V=this.viewportRowToAbsolute(G.row);this.selectionStart={col:Z.startCol,absoluteRow:V},this.selectionEnd={col:Z.endCol,absoluteRow:V},this.requestRender();let N=this.getSelection();N&&(this.copyToClipboard(N),this.selectionChangedEmitter.fire())}}else if(O.detail>=3){let G=this.pixelToCell(O.offsetX,O.offsetY),Z=this.viewportRowToAbsolute(G.row),V=this.wasmTerm.getScrollbackLength(),N=null;if(Z=0;R--)if(N[R]&&N[R].codepoint!==0&&N[R].codepoint!==32){J=R;break}}if(J>=0){this.selectionStart={col:0,absoluteRow:Z},this.selectionEnd={col:J,absoluteRow:Z},this.requestRender();let R=this.getSelection();R&&(this.copyToClipboard(R),this.selectionChangedEmitter.fire())}}}),this.boundContextMenuHandler=(O)=>{if(this.terminal.hasMouseTracking()){O.preventDefault();return}if(this.renderer.getCanvas().getBoundingClientRect(),this.textarea.style.position="fixed",this.textarea.style.left=`${O.clientX}px`,this.textarea.style.top=`${O.clientY}px`,this.textarea.style.width="1px",this.textarea.style.height="1px",this.textarea.style.zIndex="1000",this.textarea.style.opacity="0",this.textarea.style.pointerEvents="auto",this.hasSelection()){let G=this.getSelection();this.textarea.value=G,this.textarea.select(),this.textarea.setSelectionRange(0,G.length)}else this.textarea.value="";this.textarea.focus(),setTimeout(()=>{let G=()=>{this.textarea.style.pointerEvents="none",this.textarea.style.zIndex="-10",this.textarea.style.width="0",this.textarea.style.height="0",this.textarea.style.left="0",this.textarea.style.top="0",this.textarea.value="",document.removeEventListener("click",G),document.removeEventListener("contextmenu",G),this.textarea.removeEventListener("blur",G)};document.addEventListener("click",G,{once:!0}),document.addEventListener("contextmenu",G,{once:!0}),this.textarea.addEventListener("blur",G,{once:!0})},10)},j.addEventListener("contextmenu",this.boundContextMenuHandler),this.boundClickHandler=(O)=>{if(this.isSelecting||this.mouseDownTarget&&j.contains(this.mouseDownTarget))return;let G=O.target;j.contains(G)||this.hasSelection()&&this.clearSelection()},document.addEventListener("click",this.boundClickHandler)}markCurrentSelectionDirty(){let j=this.normalizeSelection();if(j)for(let O=j.startRow;O<=j.endRow;O++)this.dirtySelectionRows.add(O)}updateAutoScroll(j,O){let G=$.AUTO_SCROLL_EDGE_SIZE;jO-G?this.startAutoScroll(1):this.stopAutoScroll()}startAutoScroll(j){this.autoScrollInterval!==null&&this.autoScrollDirection===j||(this.stopAutoScroll(),this.autoScrollDirection=j,this.autoScrollInterval=setInterval(()=>{if(!this.isSelecting){this.stopAutoScroll();return}let O=$.AUTO_SCROLL_SPEED*this.autoScrollDirection;if(this.terminal.scrollLines(O),this.selectionEnd){let G=this.wasmTerm.getDimensions();if(this.autoScrollDirection<0){let Z=this.viewportRowToAbsolute(0);Zthis.selectionEnd.absoluteRow&&(this.selectionEnd={col:G.cols-1,absoluteRow:Z})}}this.requestRender()},$.AUTO_SCROLL_INTERVAL))}stopAutoScroll(){this.autoScrollInterval!==null&&(clearInterval(this.autoScrollInterval),this.autoScrollInterval=null),this.autoScrollDirection=0}pixelToCell(j,O){let G=this.renderer.getMetrics(),Z=Math.floor(j/G.width),V=Math.floor(O/G.height);return{col:Math.max(0,Math.min(Z,this.terminal.cols-1)),row:Math.max(0,Math.min(V,this.terminal.rows-1))}}normalizeSelection(){if(!this.selectionStart||!this.selectionEnd)return null;let{col:j,absoluteRow:O}=this.selectionStart,{col:G,absoluteRow:Z}=this.selectionEnd;(O>Z||O===Z&&j>G)&&([j,G]=[G,j],[O,Z]=[Z,O]);let V=this.absoluteRowToViewport(O),N=this.absoluteRowToViewport(Z),J=this.wasmTerm.getDimensions(),R=J.rows-1;return N<0||V>R?null:(V<0&&(V=0,j=0),N>R&&(N=R,G=J.cols-1),{startCol:j,startRow:V,endCol:G,endRow:N})}getWordAtCell(j,O){let G=this.wasmTerm.getLine(O);if(!G)return null;let Z=(J)=>{if(!J||J.codepoint===0)return!1;let R=String.fromCodePoint(J.codepoint);return/[\w\-./~:@+]/.test(R)};if(!Z(G[j]))return null;let V=j;for(;V>0&&Z(G[V-1]);)V--;let N=j;for(;N{console.warn("ClipboardItem write failed, trying writeText:",Z),this.copyWithWriteText(j)});return}catch{}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(j).catch((O)=>{console.warn("Clipboard writeText failed, trying execCommand:",O),this.copyWithExecCommand(j)});return}this.copyWithExecCommand(j)}}copyWithWriteText(j){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(j).catch((O)=>{console.warn("Clipboard writeText failed, trying execCommand:",O),this.copyWithExecCommand(j)}):this.copyWithExecCommand(j)}copyWithExecCommand(j){let O=document.activeElement;try{let G=this.textarea;G.value=j,G.style.position="fixed",G.style.left="-9999px",G.style.top="0",G.style.width="1px",G.style.height="1px",G.style.opacity="0",G.focus(),G.select(),G.setSelectionRange(0,j.length);let Z=document.execCommand("copy");O&&O.focus(),Z||console.warn("execCommand copy failed")}catch(G){console.warn("execCommand copy threw:",G),O&&O.focus()}}requestRender(){}};yq.AUTO_SCROLL_EDGE_SIZE=30;yq.AUTO_SCROLL_SPEED=3;yq.AUTO_SCROLL_INTERVAL=50;var _D=yq;class oR{constructor($){this.terminal=$}getLine($){var j;let O=this.terminal.getSnapshotCells();return O&&$>=0&&$=0&&${if(!this.wasmTerm||this.scrollAnimationStartTime===void 0)return;let O=this.options.smoothScrollDuration??100,G=this.targetViewportY-this.viewportY;if(Math.abs(G)<0.01){this.viewportY=this.targetViewportY,this.scrollEmitter.fire(Math.floor(this.viewportY)),this.getScrollbackLength()>0&&this.showScrollbar(),this.scrollAnimationFrame=void 0,this.scrollAnimationStartTime=void 0,this.scrollAnimationStartY=void 0;return}let Z=1-(1/(O/1000*60))**2;this.viewportY+=G*Z;let V=Math.floor(this.viewportY);this.scrollEmitter.fire(V),this.getScrollbackLength()>0&&this.showScrollbar(),this.scrollAnimationFrame=requestAnimationFrame(this.animateScroll)},this.handleMouseMove=(O)=>{if(!(!this.canvas||!this.renderer||!this.wasmTerm)){if(this.isDraggingScrollbar){this.processScrollbarDrag(O);return}if(this.linkDetector){if(this.mouseMoveThrottleTimeout){this.pendingMouseMove=O;return}this.processMouseMove(O),this.mouseMoveThrottleTimeout=window.setTimeout(()=>{if(this.mouseMoveThrottleTimeout=void 0,this.pendingMouseMove){let G=this.pendingMouseMove;this.pendingMouseMove=void 0,this.processMouseMove(G)}},16)}}},this.handleMouseLeave=()=>{var O,G;this.renderer&&this.wasmTerm&&((this.renderer.hoveredHyperlinkId||0)>0&&this.renderer.setHoveredHyperlinkId(0),this.renderer.setHoveredLinkRange(null)),this.currentHoveredLink&&((G=(O=this.currentHoveredLink).hover)==null||G.call(O,!1),this.currentHoveredLink=void 0,this.element&&(this.element.style.cursor="text"))},this.handleClick=async(O)=>{if(!this.canvas||!this.renderer||!this.linkDetector||!this.wasmTerm)return;let G=this.canvas.getBoundingClientRect(),Z=Math.floor((O.clientX-G.left)/this.renderer.charWidth),V=Math.floor((O.clientY-G.top)/this.renderer.charHeight),N=this.wasmTerm.getScrollbackLength(),J,R=this.getViewportY(),U=Math.max(0,Math.floor(R));if(U>0)if(V{var G,Z,V,N;if(O.preventDefault(),O.stopPropagation(),this.customWheelEventHandler&&this.customWheelEventHandler(O))return;let J=((G=this.wasmTerm)==null?void 0:G.getMode(1006,!1))??!1;if(this.hasMouseTracking()&&J&&this.canvas&&this.renderer){let R=this.canvas.getBoundingClientRect(),U=O.clientX-R.left,H=O.clientY-R.top,L=this.renderer.getMetrics(),Y=Math.max(0,Math.min(Math.floor(U/L.width),this.cols-1)),S=Math.max(0,Math.min(Math.floor(H/L.height),this.rows-1)),X=0;O.shiftKey&&(X+=4),(O.altKey||O.metaKey)&&(X+=8),O.ctrlKey&&(X+=16);let D=Math.min(Math.abs(Math.round(O.deltaY/33)),5),I=(O.deltaY<0?64:65)+X;for(let k=0;k0?"down":"up",U=Math.min(Math.abs(Math.round(O.deltaY/33)),5);for(let H=0;H{if(!this.canvas||!this.renderer||!this.wasmTerm)return;let G=this.wasmTerm.getScrollbackLength();if(G===0)return;let Z=this.canvas.getBoundingClientRect(),V=O.clientX-Z.left,N=O.clientY-Z.top,J=Z.width,R=Z.height,U=8,H=J-U-4,L=4;if(V>=H&&V<=H+U){O.preventDefault(),O.stopPropagation(),O.stopImmediatePropagation();let Y=R-L*2,S=this.rows,X=G+S,D=Math.max(20,S/X*Y),I=this.viewportY/G,k=L+(Y-D)*(1-I);if(N>=k&&N<=k+D)this.isDraggingScrollbar=!0,this.scrollbarDragStart=N,this.scrollbarDragStartViewportY=this.viewportY,this.canvas&&(this.canvas.style.userSelect="none",this.canvas.style.webkitUserSelect="none");else{let z=1-(N-L)/Y,w=Math.round(z*G);this.scrollToLine(Math.max(0,Math.min(G,w)))}}},this.handleMouseUp=()=>{this.isDraggingScrollbar&&(this.isDraggingScrollbar=!1,this.scrollbarDragStart=null,this.canvas&&(this.canvas.style.userSelect="",this.canvas.style.webkitUserSelect=""),this.scrollbarVisible&&this.getScrollbackLength()>0&&this.showScrollbar())},this.ghostty=$.ghostty??TD(),this.linkClickHandler=$.onLinkClick;let j={cols:$.cols??80,rows:$.rows??24,cursorBlink:$.cursorBlink??!1,cursorStyle:$.cursorStyle??"block",theme:$.theme??{},scrollback:$.scrollback??1e4,fontSize:$.fontSize??15,fontFamily:$.fontFamily??"monospace",allowTransparency:$.allowTransparency??!1,convertEol:$.convertEol??!1,disableStdin:$.disableStdin??!1,smoothScrollDuration:$.smoothScrollDuration??100};this.options=new Proxy(j,{set:(O,G,Z)=>{let V=O[G];return O[G]=Z,this.isOpen&&this.handleOptionChange(G,Z,V),!0}}),this.cols=this.options.cols,this.rows=this.options.rows,this.buffer=new pR(this),this.snapshotBuffer=new oR(this)}handleOptionChange($,j,O){if(j!==O)switch($){case"disableStdin":break;case"cursorBlink":case"cursorStyle":this.renderer&&(this.renderer.setCursorStyle(this.options.cursorStyle),this.renderer.setCursorBlink(this.options.cursorBlink));break;case"theme":this.renderer&&(this.renderer.setTheme(this.options.theme),this.wasmTerm&&this.renderer.render(this.wasmTerm,!0,this.viewportY,this));break;case"fontSize":this.renderer&&(this.renderer.setFontSize(this.options.fontSize),this.handleFontChange());break;case"fontFamily":this.renderer&&(this.renderer.setFontFamily(this.options.fontFamily),this.handleFontChange());break;case"cols":case"rows":this.resize(this.options.cols,this.options.rows);break}}handleFontChange(){if(!this.renderer||!this.wasmTerm||!this.canvas)return;this.selectionManager&&this.selectionManager.clearSelection(),this.renderer.resize(this.cols,this.rows);let $=this.renderer.getMetrics();this.canvas.width=$.width*this.cols,this.canvas.height=$.height*this.rows,this.canvas.style.width=`${$.width*this.cols}px`,this.canvas.style.height=`${$.height*this.rows}px`,this.renderer.render(this.wasmTerm,!0,this.viewportY,this)}parseColorToHex($){if(!$)return 0;if($.startsWith("#")){let O=$.slice(1);O.length===3&&(O=O[0]+O[0]+O[1]+O[1]+O[2]+O[2]);let G=Number.parseInt(O,16);return Number.isNaN(G)?0:G}let j=$.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);if(j){let O=Number.parseInt(j[1],10),G=Number.parseInt(j[2],10),Z=Number.parseInt(j[3],10);return O<<16|G<<8|Z}return 0}buildWasmConfig(){let $=this.options.theme,j=this.options.scrollback;if(!$&&j===1e4)return;let O={...QV,...$},G=[this.parseColorToHex(O.black),this.parseColorToHex(O.red),this.parseColorToHex(O.green),this.parseColorToHex(O.yellow),this.parseColorToHex(O.blue),this.parseColorToHex(O.magenta),this.parseColorToHex(O.cyan),this.parseColorToHex(O.white),this.parseColorToHex(O.brightBlack),this.parseColorToHex(O.brightRed),this.parseColorToHex(O.brightGreen),this.parseColorToHex(O.brightYellow),this.parseColorToHex(O.brightBlue),this.parseColorToHex(O.brightMagenta),this.parseColorToHex(O.brightCyan),this.parseColorToHex(O.brightWhite)];return{scrollbackLimit:j,fgColor:this.parseColorToHex(O.foreground),bgColor:this.parseColorToHex(O.background),cursorColor:this.parseColorToHex(O.cursor),palette:G}}open($){if(this.isOpen)throw Error("Terminal is already open");if(this.isDisposed)throw Error("Terminal has been disposed");this.element=$,this.isOpen=!0;try{$.setAttribute("tabindex","-1"),$.setAttribute("role","textbox"),$.setAttribute("aria-label","Terminal input"),$.setAttribute("aria-multiline","true");let j=this.buildWasmConfig();this.wasmTerm=this.ghostty.createTerminal(this.cols,this.rows,j),this.canvas=document.createElement("canvas"),this.canvas.style.display="block",$.appendChild(this.canvas),this.textarea=document.createElement("textarea"),this.textarea.setAttribute("autocorrect","off"),this.textarea.setAttribute("autocapitalize","off"),this.textarea.setAttribute("spellcheck","false"),this.textarea.setAttribute("tabindex","0"),this.textarea.setAttribute("aria-label","Terminal input"),this.textarea.style.position="absolute",this.textarea.style.left="0",this.textarea.style.top="0",this.textarea.style.width="1px",this.textarea.style.height="1px",this.textarea.style.padding="0",this.textarea.style.border="none",this.textarea.style.margin="0",this.textarea.style.opacity="0",this.textarea.style.clipPath="inset(50%)",this.textarea.style.overflow="hidden",this.textarea.style.whiteSpace="nowrap",this.textarea.style.resize="none",$.appendChild(this.textarea),this.compositionPreview=document.createElement("div"),this.compositionPreview.style.position="absolute",this.compositionPreview.style.top="4px",this.compositionPreview.style.right="4px",this.compositionPreview.style.padding="2px 8px",this.compositionPreview.style.backgroundColor="rgba(0, 0, 0, 0.7)",this.compositionPreview.style.color="#ffcc00",this.compositionPreview.style.fontFamily="monospace",this.compositionPreview.style.fontSize="12px",this.compositionPreview.style.borderRadius="3px",this.compositionPreview.style.display="none",this.compositionPreview.style.zIndex="1000",$.appendChild(this.compositionPreview),this.textarea.addEventListener("compositionupdate",(J)=>{J.data&&(this.compositionPreview.textContent=`조합중: ${J.data}`,this.compositionPreview.style.display="block")}),this.textarea.addEventListener("compositionend",()=>{this.compositionPreview.style.display="none"});let O=this.textarea;this.canvas.addEventListener("mousedown",(J)=>{J.preventDefault(),O.focus()}),this.canvas.addEventListener("touchend",(J)=>{J.preventDefault(),O.focus()}),$.addEventListener("mousedown",(J)=>{J.target===$&&(J.preventDefault(),O.focus())}),$.addEventListener("focus",()=>{O.focus()}),this.renderer=new lR(this.canvas,{fontSize:this.options.fontSize,fontFamily:this.options.fontFamily,cursorStyle:this.options.cursorStyle,cursorBlink:this.options.cursorBlink,theme:this.options.theme}),this.renderer.resize(this.cols,this.rows);let G=this.canvas,Z=this.renderer,V=this.wasmTerm,N={hasMouseTracking:()=>(V==null?void 0:V.hasMouseTracking())??!1,hasSgrMouseMode:()=>(V==null?void 0:V.getMode(1006,!1))??!0,getCellDimensions:()=>({width:Z.charWidth,height:Z.charHeight}),getCanvasOffset:()=>{let J=G.getBoundingClientRect();return{left:J.left,top:J.top}}};this.inputHandler=new xD(this.ghostty,$,(J)=>{this.options.disableStdin||this.dataEmitter.fire(J)},()=>{this.bellEmitter.fire()},(J)=>{this.keyEmitter.fire(J)},this.customKeyEventHandler,(J)=>{var R;return((R=this.wasmTerm)==null?void 0:R.getMode(J,!1))??!1},()=>this.copySelection(),this.textarea,N),this.selectionManager=new _D(this,this.renderer,this.wasmTerm,this.textarea),this.renderer.setSelectionManager(this.selectionManager),this.selectionManager.onSelectionChange(()=>{this.selectionChangeEmitter.fire()}),this.linkDetector=new uR(this),this.linkDetector.registerProvider(new dR(this)),this.linkDetector.registerProvider(new LD(this)),$.addEventListener("mousedown",this.handleMouseDown,{capture:!0}),$.addEventListener("mousemove",this.handleMouseMove),$.addEventListener("mouseleave",this.handleMouseLeave),$.addEventListener("click",this.handleClick),document.addEventListener("mouseup",this.handleMouseUp),$.addEventListener("wheel",this.handleWheel,{passive:!1,capture:!0}),this.isOpen=!0,this.renderer.render(this.snapshotBuffer,!0,this.viewportY,this,this.scrollbarOpacity),this.startRenderLoop(),this.focus()}catch(j){throw this.isOpen=!1,this.cleanupComponents(),Error(`Failed to open terminal: ${j}`)}}write($,j){if(this.assertOpen(),this.options.convertEol&&typeof $=="string"&&($=$.replace(/\n/g,`\r +`)),this._isResizing){let O=$ instanceof Uint8Array?new Uint8Array($):$;this._writeQueue.push({data:O,callback:j});return}this.writeInternal($,j)}writeInternal($,j){var O;this.wasmTerm.write($),this.processTerminalResponses(),typeof $=="string"&&$.includes("\x07")?this.bellEmitter.fire():$ instanceof Uint8Array&&$.includes(7)&&this.bellEmitter.fire(),(O=this.linkDetector)==null||O.invalidateCache(),this.viewportY!==0&&this.scrollToBottom(),typeof $=="string"&&$.includes("\x1B]")&&this.checkForTitleChange($),j&&requestAnimationFrame(j)}writeln($,j){if(typeof $=="string")this.write($+`\r +`,j);else{let O=new Uint8Array($.length+2);O.set($),O[$.length]=13,O[$.length+1]=10,this.write(O,j)}}paste($){this.assertOpen(),!this.options.disableStdin&&(this.wasmTerm.hasBracketedPaste()?this.dataEmitter.fire("\x1B[200~"+$+"\x1B[201~"):this.dataEmitter.fire($))}input($,j=!1){this.assertOpen(),!this.options.disableStdin&&(j?this.dataEmitter.fire($):this.write($))}resize($,j){if(this.assertOpen(),$===this.cols&&j===this.rows)return;this._resizeFlushFrameId&&(cancelAnimationFrame(this._resizeFlushFrameId),this._resizeFlushFrameId=void 0),this._isResizing=!0;let O=this.animationFrameId!==void 0;this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=void 0);try{this.wasmTerm.resize($,j),this.cols=$,this.rows=j,this.renderer.resize($,j);let G=this.renderer.getMetrics();this.canvas.width=G.width*$,this.canvas.height=G.height*j,this.canvas.style.width=`${G.width*$}px`,this.canvas.style.height=`${G.height*j}px`,this.resizeEmitter.fire({cols:$,rows:j}),this.renderer.render(this.snapshotBuffer,!0,this.viewportY,this)}catch(G){console.error("[ghostty-web] Resize error:",G)}O&&this.startRenderLoop(),this._resizeFlushFrameId=requestAnimationFrame(()=>{this._resizeFlushFrameId=void 0,this._isResizing=!1,this.flushWriteQueue()})}flushWriteQueue(){if(this.isDisposed||!this.isOpen){this._writeQueue=[];return}let $=this._writeQueue;this._writeQueue=[];for(let{data:j,callback:O}of $)this.writeInternal(j,O)}clear(){this.assertOpen(),this.wasmTerm.write("\x1B[2J\x1B[H")}reset(){this.assertOpen(),this.wasmTerm&&this.wasmTerm.free();let $=this.buildWasmConfig();this.wasmTerm=this.ghostty.createTerminal(this.cols,this.rows,$),this.renderer.clear(),this.currentTitle=""}focus(){if(this.isOpen){let $=this.textarea||this.element;$&&($.focus(),setTimeout(()=>{$==null||$.focus()},0))}}blur(){this.isOpen&&this.element&&this.element.blur()}loadAddon($){$.activate(this),this.addons.push($)}getSelection(){var $;return(($=this.selectionManager)==null?void 0:$.getSelection())||""}hasSelection(){var $;return(($=this.selectionManager)==null?void 0:$.hasSelection())||!1}clearSelection(){var $;($=this.selectionManager)==null||$.clearSelection()}copySelection(){var $;return(($=this.selectionManager)==null?void 0:$.copySelection())||!1}selectAll(){var $;($=this.selectionManager)==null||$.selectAll()}select($,j,O){var G;(G=this.selectionManager)==null||G.select($,j,O)}selectLines($,j){var O;(O=this.selectionManager)==null||O.selectLines($,j)}getViewportY(){return this.viewportY}getSelectionPosition(){var $;return($=this.selectionManager)==null?void 0:$.getSelectionPosition()}attachCustomKeyEventHandler($){this.customKeyEventHandler=$,this.inputHandler&&this.inputHandler.setCustomKeyEventHandler($)}attachCustomWheelEventHandler($){this.customWheelEventHandler=$}loadFonts(){this.renderer&&(this.renderer.remeasureFont(),this.handleFontChange())}registerLinkProvider($){if(!this.linkDetector)throw Error("Terminal must be opened before registering link providers");this.linkDetector.registerProvider($)}scrollLines($){if(!this.wasmTerm)throw Error("Terminal not open");let j=this.getScrollbackLength(),O=Math.max(0,Math.min(j,this.viewportY-$));O!==this.viewportY&&(this.viewportY=O,this.scrollEmitter.fire(this.viewportY),j>0&&this.showScrollbar())}scrollPages($){this.scrollLines($*this.rows)}scrollToTop(){let $=this.getScrollbackLength();$>0&&this.viewportY!==$&&(this.viewportY=$,this.scrollEmitter.fire(this.viewportY),this.showScrollbar())}scrollToBottom(){this.viewportY!==0&&(this.viewportY=0,this.scrollEmitter.fire(this.viewportY),this.getScrollbackLength()>0&&this.showScrollbar())}scrollToLine($){let j=this.getScrollbackLength(),O=Math.max(0,Math.min(j,$));O!==this.viewportY&&(this.viewportY=O,this.scrollEmitter.fire(this.viewportY),j>0&&this.showScrollbar())}smoothScrollTo($){if(!this.wasmTerm)return;let j=this.getScrollbackLength(),O=Math.max(0,Math.min(j,$));if((this.options.smoothScrollDuration??100)===0){this.viewportY=O,this.targetViewportY=O,this.scrollEmitter.fire(Math.floor(this.viewportY)),j>0&&this.showScrollbar();return}this.targetViewportY=O,!this.scrollAnimationFrame&&(this.scrollAnimationStartTime=Date.now(),this.scrollAnimationStartY=this.viewportY,this.animateScroll())}dispose(){if(!this.isDisposed){this.isDisposed=!0,this.isOpen=!1,this.animationFrameId&&(cancelAnimationFrame(this.animationFrameId),this.animationFrameId=void 0),this.scrollAnimationFrame&&(cancelAnimationFrame(this.scrollAnimationFrame),this.scrollAnimationFrame=void 0),this._resizeFlushFrameId&&(cancelAnimationFrame(this._resizeFlushFrameId),this._resizeFlushFrameId=void 0),this._writeQueue=[],this._isResizing=!1,this.mouseMoveThrottleTimeout&&(clearTimeout(this.mouseMoveThrottleTimeout),this.mouseMoveThrottleTimeout=void 0),this.pendingMouseMove=void 0;for(let $ of this.addons)$.dispose();this.addons=[],this.cleanupComponents(),this.dataEmitter.dispose(),this.resizeEmitter.dispose(),this.bellEmitter.dispose(),this.selectionChangeEmitter.dispose(),this.keyEmitter.dispose(),this.titleChangeEmitter.dispose(),this.scrollEmitter.dispose(),this.renderEmitter.dispose(),this.cursorMoveEmitter.dispose()}}startRenderLoop(){let $=()=>{if(!this.isDisposed&&this.isOpen){try{this.renderer.render(this.snapshotBuffer,!1,this.viewportY,this,this.scrollbarOpacity);let j=this.wasmTerm.getCursor();j.y!==this.lastCursorY&&(this.lastCursorY=j.y,this.cursorMoveEmitter.fire())}catch(j){console.error("[ghostty-web] render loop error (recovering):",j)}this.animationFrameId=requestAnimationFrame($)}};$()}getScrollbackLine($){return this.wasmTerm?this.wasmTerm.getScrollbackLine($):null}getScrollbackLength(){return this.wasmTerm?this.wasmTerm.getScrollbackLength():0}cleanupComponents(){this.selectionManager&&(this.selectionManager.dispose(),this.selectionManager=void 0),this.inputHandler&&(this.inputHandler.dispose(),this.inputHandler=void 0),this.renderer&&(this.renderer.dispose(),this.renderer=void 0),this.canvas&&this.canvas.parentNode&&(this.canvas.parentNode.removeChild(this.canvas),this.canvas=void 0),this.textarea&&this.textarea.parentNode&&(this.textarea.parentNode.removeChild(this.textarea),this.textarea=void 0),this.compositionPreview&&this.compositionPreview.parentNode&&(this.compositionPreview.parentNode.removeChild(this.compositionPreview),this.compositionPreview=void 0),this.element&&(this.element.removeEventListener("wheel",this.handleWheel),this.element.removeEventListener("mousedown",this.handleMouseDown,{capture:!0}),this.element.removeEventListener("mousemove",this.handleMouseMove),this.element.removeEventListener("mouseleave",this.handleMouseLeave),this.element.removeEventListener("click",this.handleClick),this.element.removeAttribute("role"),this.element.removeAttribute("aria-label"),this.element.removeAttribute("aria-multiline")),this.isOpen&&typeof document<"u"&&document.removeEventListener("mouseup",this.handleMouseUp),this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.linkDetector&&(this.linkDetector.dispose(),this.linkDetector=void 0),this.wasmTerm&&(this.wasmTerm.free(),this.wasmTerm=void 0),this.ghostty=void 0,this.element=void 0,this.textarea=void 0}assertOpen(){if(this.isDisposed)throw Error("Terminal has been disposed");if(!this.isOpen)throw Error("Terminal must be opened before use. Call terminal.open(parent) first.")}processMouseMove($){if(!this.canvas||!this.renderer||!this.linkDetector||!this.wasmTerm)return;let j=this.canvas.getBoundingClientRect(),O=Math.floor(($.clientX-j.left)/this.renderer.charWidth),G=Math.floor(($.clientY-j.top)/this.renderer.charHeight),Z=0,V=null,N=this.getViewportY(),J=Math.max(0,Math.floor(N));if(J>0){let S=this.wasmTerm.getScrollbackLength();if(G=0&&O0)if(G{var X,D,I,k;if(S!==this.currentHoveredLink&&((D=(X=this.currentHoveredLink)==null?void 0:X.hover)==null||D.call(X,!1),this.currentHoveredLink=S,(I=S==null?void 0:S.hover)==null||I.call(S,!0),this.element&&(this.element.style.cursor=S?"pointer":"text"),this.renderer))if(S){let z=((k=this.wasmTerm)==null?void 0:k.getScrollbackLength())||0,w=this.getViewportY(),T=Math.max(0,Math.floor(w)),W=S.range.start.y-z+T,E=S.range.end.y-z+T;W=0?this.renderer.setHoveredLinkRange({startX:S.range.start.x,startY:Math.max(0,W),endX:S.range.end.x,endY:Math.min(this.rows-1,E)}):this.renderer.setHoveredLinkRange(null)}else this.renderer.setHoveredLinkRange(null)}).catch((S)=>{console.warn("Link detection error:",S)})}processScrollbarDrag($){if(!this.canvas||!this.renderer||!this.wasmTerm||this.scrollbarDragStart===null)return;let j=this.wasmTerm.getScrollbackLength();if(j===0)return;let O=this.canvas.getBoundingClientRect(),G=$.clientY-O.top-this.scrollbarDragStart,Z=O.height-8,V=this.rows,N=j+V,J=Math.max(20,V/N*Z),R=-G/(Z-J),U=Math.round(R*j),H=this.scrollbarDragStartViewportY+U;this.scrollToLine(Math.max(0,Math.min(j,H)))}showScrollbar(){this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.scrollbarVisible?this.scrollbarOpacity=1:(this.scrollbarVisible=!0,this.scrollbarOpacity=0,this.fadeInScrollbar()),this.isDraggingScrollbar||(this.scrollbarHideTimeout=window.setTimeout(()=>{this.hideScrollbar()},this.SCROLLBAR_HIDE_DELAY_MS))}hideScrollbar(){this.scrollbarHideTimeout&&(window.clearTimeout(this.scrollbarHideTimeout),this.scrollbarHideTimeout=void 0),this.scrollbarVisible&&this.fadeOutScrollbar()}fadeInScrollbar(){let $=Date.now(),j=()=>{let O=Date.now()-$,G=Math.min(O/this.SCROLLBAR_FADE_DURATION_MS,1);this.scrollbarOpacity=G,this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,this.scrollbarOpacity),G<1&&requestAnimationFrame(j)};j()}fadeOutScrollbar(){let $=Date.now(),j=this.scrollbarOpacity,O=()=>{let G=Date.now()-$,Z=Math.min(G/this.SCROLLBAR_FADE_DURATION_MS,1);this.scrollbarOpacity=j*(1-Z),this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,this.scrollbarOpacity),Z<1?requestAnimationFrame(O):(this.scrollbarVisible=!1,this.scrollbarOpacity=0,this.renderer&&this.wasmTerm&&this.renderer.render(this.wasmTerm,!1,this.viewportY,this,0))};O()}processTerminalResponses(){if(this.wasmTerm)for(;;){let $=this.wasmTerm.readResponse();if($===null)break;this.dataEmitter.fire($)}}checkForTitleChange($){let j=/\x1b\]([012]);([^\x07\x1b]*?)(?:\x07|\x1b\\)/g,O=null;for(;(O=j.exec($))!==null;){let G=O[1],Z=O[2];(G==="0"||G==="2")&&Z!==this.currentTitle&&(this.currentTitle=Z,this.titleChangeEmitter.fire(Z))}}getMode($,j=!1){return this.assertOpen(),this.wasmTerm.getMode($,j)}hasBracketedPaste(){return this.assertOpen(),this.wasmTerm.hasBracketedPaste()}hasFocusEvents(){return this.assertOpen(),this.wasmTerm.hasFocusEvents()}hasMouseTracking(){return this.assertOpen(),this.wasmTerm.hasMouseTracking()}setSnapshot($,j){let O=[];for(let G=0;G{this._isResizing=!1},50)}}}proposeDimensions(){var $;if(!(($=this._terminal)!=null&&$.element))return;let j=this._terminal.renderer;if(!j||typeof j.getMetrics!="function")return;let O=j.getMetrics();if(!O||O.width===0||O.height===0)return;let G=this._terminal.element;if(typeof G.clientWidth>"u")return;let Z=window.getComputedStyle(G),V=Number.parseInt(Z.getPropertyValue("padding-top"))||0,N=Number.parseInt(Z.getPropertyValue("padding-bottom"))||0,J=Number.parseInt(Z.getPropertyValue("padding-left"))||0,R=Number.parseInt(Z.getPropertyValue("padding-right"))||0,U=G.clientWidth,H=G.clientHeight;if(U===0||H===0)return;let L=U-J-R-PD,Y=H-V-N,S=Math.max(YD,Math.floor(L/O.width)),X=Math.max(SD,Math.floor(Y/O.height));return{cols:S,rows:X}}observeResize(){var $;($=this._terminal)!=null&&$.element&&(this._resizeObserver||(this._resizeObserver=new ResizeObserver((j)=>{this._isResizing||!j[0]||(this._resizeDebounceTimer&&clearTimeout(this._resizeDebounceTimer),this._resizeDebounceTimer=setTimeout(()=>{this.fit()},XD))}),this._resizeObserver.observe(this._terminal.element)))}}var BR=null;function TD(){if(!BR)throw Error(`ghostty-web not initialized. Call init() before creating Terminal instances. Example: import { init, Terminal } from "ghostty-web"; await init(); @@ -10,7 +10,8675 @@ Example: For tests, pass a Ghostty instance directly: import { Ghostty, Terminal } from "ghostty-web"; const ghostty = await Ghostty.load(); - const term = new Terminal({ ghostty });`);return e}var k=1000,W0=30000,k0=262144,p0=10,w0=8192,n="\uD83D\uDD14",o=null;async function D0(){if(!o){let j=y0();console.log("[webterm] Loading shared Ghostty WASM:",j),o=await M.load(j)}return o}var G0='ui-monospace, "SFMono-Regular", "FiraCode Nerd Font", "FiraMono Nerd Font", "Fira Code", "Roboto Mono", Menlo, Monaco, Consolas, "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace',D={tango:{background:"#000000",foreground:"#d3d7cf",cursor:"#d3d7cf",cursorAccent:"#000000",selectionBackground:"#d3d7cf",selectionForeground:"#000000",black:"#2e3436",red:"#cc0000",green:"#4e9a06",yellow:"#c4a000",blue:"#3465a4",magenta:"#75507b",cyan:"#06989a",white:"#d3d7cf",brightBlack:"#555753",brightRed:"#ef2929",brightGreen:"#8ae234",brightYellow:"#fce94f",brightBlue:"#729fcf",brightMagenta:"#ad7fa8",brightCyan:"#34e2e2",brightWhite:"#eeeeec"},xterm:{background:"#000000",foreground:"#e5e5e5",cursor:"#e5e5e5",cursorAccent:"#000000",selectionBackground:"#e5e5e5",selectionForeground:"#000000",black:"#000000",red:"#cd0000",green:"#00cd00",yellow:"#cdcd00",blue:"#0000cd",magenta:"#cd00cd",cyan:"#00cdcd",white:"#e5e5e5",brightBlack:"#4d4d4d",brightRed:"#ff0000",brightGreen:"#00ff00",brightYellow:"#ffff00",brightBlue:"#0000ff",brightMagenta:"#ff00ff",brightCyan:"#00ffff",brightWhite:"#ffffff"},monokai:{background:"#272822",foreground:"#fdfff1",cursor:"#fdfff1",cursorAccent:"#272822",selectionBackground:"#fdfff1",selectionForeground:"#272822",black:"#272822",red:"#f92672",green:"#a6e22e",yellow:"#e6db74",blue:"#fd971f",magenta:"#ae81ff",cyan:"#66d9ef",white:"#fdfff1",brightBlack:"#6e7066",brightRed:"#f92672",brightGreen:"#a6e22e",brightYellow:"#e6db74",brightBlue:"#fd971f",brightMagenta:"#ae81ff",brightCyan:"#66d9ef",brightWhite:"#fdfff1"},"monokai-pro":{background:"#2d2a2e",foreground:"#fcfcfa",cursor:"#fcfcfa",cursorAccent:"#2d2a2e",selectionBackground:"#fcfcfa",selectionForeground:"#2d2a2e",black:"#403e41",red:"#ff6188",green:"#a9dc76",yellow:"#ffd866",blue:"#fc9867",magenta:"#ab9df2",cyan:"#78dce8",white:"#fcfcfa",brightBlack:"#727072",brightRed:"#ff6188",brightGreen:"#a9dc76",brightYellow:"#ffd866",brightBlue:"#fc9867",brightMagenta:"#ab9df2",brightCyan:"#78dce8",brightWhite:"#fcfcfa"},ristretto:{background:"#2d2525",foreground:"#fff1f3",cursor:"#fff1f3",cursorAccent:"#2d2525",selectionBackground:"#fff1f3",selectionForeground:"#2d2525",black:"#2c2525",red:"#fd6883",green:"#adda78",yellow:"#f9cc6c",blue:"#f38d70",magenta:"#a8a9eb",cyan:"#85dacc",white:"#f9f8f5",brightBlack:"#655761",brightRed:"#fd6883",brightGreen:"#adda78",brightYellow:"#f9cc6c",brightBlue:"#f38d70",brightMagenta:"#a8a9eb",brightCyan:"#85dacc",brightWhite:"#f9f8f5"},dark:{background:"#1e1e1e",foreground:"#d4d4d4",cursor:"#aeafad",cursorAccent:"#1e1e1e",selectionBackground:"#d4d4d4",selectionForeground:"#1e1e1e",black:"#000000",red:"#cd3131",green:"#0dbc79",yellow:"#e5e510",blue:"#2472c8",magenta:"#bc3fbc",cyan:"#11a8cd",white:"#e5e5e5",brightBlack:"#666666",brightRed:"#f14c4c",brightGreen:"#23d18b",brightYellow:"#f5f543",brightBlue:"#3b8eea",brightMagenta:"#d670d6",brightCyan:"#29b8db",brightWhite:"#ffffff"},light:{background:"#ffffff",foreground:"#383a42",cursor:"#526eff",cursorAccent:"#ffffff",selectionBackground:"#383a42",selectionForeground:"#ffffff",black:"#000000",red:"#e45649",green:"#50a14f",yellow:"#c18401",blue:"#4078f2",magenta:"#a626a4",cyan:"#0184bc",white:"#a0a1a7",brightBlack:"#5c6370",brightRed:"#e06c75",brightGreen:"#98c379",brightYellow:"#d19a66",brightBlue:"#61afef",brightMagenta:"#c678dd",brightCyan:"#56b6c2",brightWhite:"#ffffff"},dracula:{background:"#282a36",foreground:"#f8f8f2",cursor:"#f8f8f2",cursorAccent:"#282a36",selectionBackground:"#f8f8f2",selectionForeground:"#282a36",black:"#21222c",red:"#ff5555",green:"#50fa7b",yellow:"#f1fa8c",blue:"#bd93f9",magenta:"#ff79c6",cyan:"#8be9fd",white:"#f8f8f2",brightBlack:"#6272a4",brightRed:"#ff6e6e",brightGreen:"#69ff94",brightYellow:"#ffffa5",brightBlue:"#d6acff",brightMagenta:"#ff92df",brightCyan:"#a4ffff",brightWhite:"#ffffff"},catppuccin:{background:"#1e1e2e",foreground:"#cdd6f4",cursor:"#f5e0dc",cursorAccent:"#1e1e2e",selectionBackground:"#cdd6f4",selectionForeground:"#1e1e2e",black:"#45475a",red:"#f38ba8",green:"#a6e3a1",yellow:"#f9e2af",blue:"#89b4fa",magenta:"#f5c2e7",cyan:"#94e2d5",white:"#bac2de",brightBlack:"#585b70",brightRed:"#f38ba8",brightGreen:"#a6e3a1",brightYellow:"#f9e2af",brightBlue:"#89b4fa",brightMagenta:"#f5c2e7",brightCyan:"#94e2d5",brightWhite:"#a6adc8"},nord:{background:"#2e3440",foreground:"#d8dee9",cursor:"#d8dee9",cursorAccent:"#2e3440",selectionBackground:"#d8dee9",selectionForeground:"#2e3440",black:"#3b4252",red:"#bf616a",green:"#a3be8c",yellow:"#ebcb8b",blue:"#81a1c1",magenta:"#b48ead",cyan:"#88c0d0",white:"#e5e9f0",brightBlack:"#4c566a",brightRed:"#bf616a",brightGreen:"#a3be8c",brightYellow:"#ebcb8b",brightBlue:"#81a1c1",brightMagenta:"#b48ead",brightCyan:"#8fbcbb",brightWhite:"#eceff4"},gruvbox:{background:"#282828",foreground:"#ebdbb2",cursor:"#ebdbb2",cursorAccent:"#282828",selectionBackground:"#ebdbb2",selectionForeground:"#282828",black:"#282828",red:"#cc241d",green:"#98971a",yellow:"#d79921",blue:"#458588",magenta:"#b16286",cyan:"#689d6a",white:"#a89984",brightBlack:"#928374",brightRed:"#fb4934",brightGreen:"#b8bb26",brightYellow:"#fabd2f",brightBlue:"#83a598",brightMagenta:"#d3869b",brightCyan:"#8ec07c",brightWhite:"#ebdbb2"},solarized:{background:"#002b36",foreground:"#839496",cursor:"#839496",cursorAccent:"#002b36",selectionBackground:"#839496",selectionForeground:"#002b36",black:"#073642",red:"#dc322f",green:"#859900",yellow:"#b58900",blue:"#268bd2",magenta:"#d33682",cyan:"#2aa198",white:"#eee8d5",brightBlack:"#586e75",brightRed:"#cb4b16",brightGreen:"#586e75",brightYellow:"#657b83",brightBlue:"#839496",brightMagenta:"#6c71c4",brightCyan:"#93a1a1",brightWhite:"#fdf6e3"},tokyo:{background:"#1a1b26",foreground:"#a9b1d6",cursor:"#c0caf5",cursorAccent:"#1a1b26",selectionBackground:"#a9b1d6",selectionForeground:"#1a1b26",black:"#15161e",red:"#f7768e",green:"#9ece6a",yellow:"#e0af68",blue:"#7aa2f7",magenta:"#bb9af7",cyan:"#7dcfff",white:"#a9b1d6",brightBlack:"#414868",brightRed:"#f7768e",brightGreen:"#9ece6a",brightYellow:"#e0af68",brightBlue:"#7aa2f7",brightMagenta:"#bb9af7",brightCyan:"#7dcfff",brightWhite:"#c0caf5"},miasma:{background:"#222222",foreground:"#c2c2b0",cursor:"#c2c2b0",cursorAccent:"#222222",selectionBackground:"#c2c2b0",selectionForeground:"#222222",black:"#000000",red:"#685742",green:"#5f875f",yellow:"#b36d43",blue:"#78824b",magenta:"#bb7744",cyan:"#c9a554",white:"#d7c483",brightBlack:"#666666",brightRed:"#685742",brightGreen:"#5f875f",brightYellow:"#b36d43",brightBlue:"#78824b",brightMagenta:"#bb7744",brightCyan:"#c9a554",brightWhite:"#d7c483"},github:{background:"#1c2128",foreground:"#adbac7",cursor:"#adbac7",cursorAccent:"#1c2128",selectionBackground:"#adbac7",selectionForeground:"#1c2128",black:"#545d68",red:"#f47067",green:"#57ab5a",yellow:"#c69026",blue:"#539bf5",magenta:"#b083f0",cyan:"#39c5cf",white:"#909dab",brightBlack:"#636e7b",brightRed:"#ff938a",brightGreen:"#6bc46d",brightYellow:"#daaa3f",brightBlue:"#6cb6ff",brightMagenta:"#dcbdfb",brightCyan:"#56d4dd",brightWhite:"#cdd9e5"},gotham:{background:"#0c1014",foreground:"#99d1ce",cursor:"#99d1ce",cursorAccent:"#0c1014",selectionBackground:"#99d1ce",selectionForeground:"#0c1014",black:"#0c1014",red:"#c23127",green:"#2aa889",yellow:"#edb443",blue:"#195466",magenta:"#4e5166",cyan:"#33859e",white:"#99d1ce",brightBlack:"#0c1014",brightRed:"#c23127",brightGreen:"#2aa889",brightYellow:"#edb443",brightBlue:"#195466",brightMagenta:"#4e5166",brightCyan:"#33859e",brightWhite:"#99d1ce"}};function c0(j){let $={};if(j.dataset.fontFamily){let V=j.dataset.fontFamily;if(V.startsWith("var(")){let Z=V.match(/var\(([^)]+)\)/);if(Z){let J=Z[1].trim(),X=getComputedStyle(document.documentElement).getPropertyValue(J).trim();if(X)V=X;else console.warn(`[webterm] CSS variable ${J} not found, using default font`),V=G0}}$.fontFamily=V}if(j.dataset.fontSize)$.fontSize=parseInt(j.dataset.fontSize,10);if(j.dataset.scrollback)$.scrollback=parseInt(j.dataset.scrollback,10);if(j.dataset.theme){let V=j.dataset.theme.toLowerCase();if(V in D)$.theme=D[V];else try{$.theme=JSON.parse(j.dataset.theme)}catch(Z){console.warn(`[webterm] Unknown theme "${j.dataset.theme}"`,Z)}}return $}function y0(){let j=document.querySelectorAll('script[src*="terminal.js"]');if(j.length>0){let $=j[0].src;return $.substring(0,$.lastIndexOf("/")+1)+"ghostty-vt.wasm"}return"/static/js/ghostty-vt.wasm"}function a(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||"ontouchstart"in window&&navigator.maxTouchPoints>0}var h0={"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+","[":"{","]":"}","\\":"|",";":":","'":'"',",":"<",".":">","/":"?"},m0={"2":"@","3":"[","4":"\\","5":"]","6":"^","7":"_","8":"?"},d0=["\x1BOP","\x1BOQ","\x1BOR","\x1BOS","\x1B[15~","\x1B[17~","\x1B[18~","\x1B[19~","\x1B[20~","\x1B[21~"],r0=["\x1B[23~","\x1B[24~","\x1B[25~","\x1B[26~","\x1B[28~","\x1B[29~","\x1B[31~","\x1B[32~","\x1B[33~","\x1B[34~"];function I0(j){if(j.length!==1)return j;if(j>="a"&&j<="z")return j.toUpperCase();return h0[j]??j}function R0(j){if(j.length!==1)return j;let $=m0[j]??j;if($==="?")return"";let V=$.toUpperCase().charCodeAt(0);if(V>=64&&V<=95)return String.fromCharCode(V-64);return j}function E(j,$){if(j.length!==1)return null;let V="1234567890".indexOf(j);if(V<0)return null;return $?r0[V]:d0[V]}function f(j){if(!j||j.startsWith("\x1B"))return j;return`\x1B${j}`}function s(j,$,V,Z,J){if(j.length!==1)return j;if(J){let X=E(j,$);if(X)return Z?f(X):X}if(V){let X=R0(j);if(X!==j)return Z?f(X):X}if($){let X=I0(j);return Z?f(X):X}return Z?f(j):j}class c{terminal;fitAddon;socket=null;socketGeneration=0;element;wsUrl;reconnectAttempts=0;maxReconnectAttempts=5;reconnectDelay=1000;heartbeatIntervalMs=15000;stallTimeoutMs=45000;heartbeatTimer;lastMessageAt=0;lastPongAt=0;messageQueue=[];pendingStdin="";pendingStdinTimer;lastValidSize=null;mobileInput=null;mobileKeybar=null;ctrlActive=!1;altActive=!1;shiftActive=!1;fnActive=!1;pendingCtrl=!1;pendingAlt=!1;pendingShift=!1;pendingFn=!1;fontFamily;fontSize;cleanupTimer;resizeObserver=null;mobileKeybarStyle=null;boundHandlers=[];isTabHidden=!1;hiddenBuffer=[];hiddenBufferBytes=0;baseTitle;bellActive=!1;routeKey;static sharedTextEncoder=new TextEncoder;constructor(j,$,V,Z,J,X,K,z){this.element=j,this.wsUrl=$,this.terminal=V,this.fitAddon=Z,this.fontFamily=J,this.fontSize=X,this.routeKey=K,this.baseTitle=z}addTrackedListener(j,$,V,Z){j.addEventListener($,V,Z),this.boundHandlers.push({target:j,type:$,handler:V,options:Z})}bellStorageKey(){if(!this.routeKey)return null;return`webterm:bell:${this.routeKey}`}bellSuppressUntil=0;setBellActive(){if(Date.now(){if(typeof this.terminal.loadFonts==="function")this.terminal.loadFonts();this.fit()}),this.setupResizeObserver(),this.addTrackedListener(window,"resize",()=>{this.fit()}),this.terminal.onData(($)=>{this.clearBellState(),this.sendStdin($)}),this.terminal.onBell(()=>{this.setBellActive()}),this.addTrackedListener(this.element,"mousedown",()=>{if(this.bellActive)this.clearBellState()}),this.terminal.onResize(($)=>{if(this.isValidSize($.cols,$.rows))this.lastValidSize={cols:$.cols,rows:$.rows},this.send(["resize",{width:$.cols,height:$.rows}])}),this.setupMobileKeyboard(),this.setupTouchSelection(),a())this.setupMobileKeybar();if(this.isTabHidden=document.hidden,this.startResourceCleanup(),this.connect(),document.hasFocus())this.clearBellState();let j=()=>{if(this.clearBellState(),a())this.focusMobileInput();else this.terminal.focus()};this.addTrackedListener(document,"visibilitychange",()=>{if(document.hidden)this.isTabHidden=!0,this.stopHeartbeatWatchdog();else this.isTabHidden=!1,this.refreshConnection(),j()}),this.addTrackedListener(window,"focus",()=>{j()}),this.addTrackedListener(window,"pageshow",()=>{j()})}setupMobileKeyboard(){let j=document.createElement("textarea");j.setAttribute("autocapitalize","off"),j.setAttribute("autocomplete","off"),j.setAttribute("autocorrect","off"),j.setAttribute("spellcheck","false"),j.setAttribute("inputmode","text"),j.setAttribute("enterkeyhint","send"),j.style.cssText=` + const term = new Terminal({ ghostty });`);return BR}var __dirname="/home/izackp/apps/webterm/node_modules/@moonshine-ai/moonshine-js/dist";var gJ=function($,j){return gJ=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(O,G){O.__proto__=G}||function(O,G){for(var Z in G)Object.prototype.hasOwnProperty.call(G,Z)&&(O[Z]=G[Z])},gJ($,j)};function uZ($,j){if(typeof j!="function"&&j!==null)throw TypeError("Class extends value "+String(j)+" is not a constructor or null");function O(){this.constructor=$}gJ($,j),$.prototype=j===null?Object.create(j):(O.prototype=j.prototype,new O)}var OV=function(){return OV=Object.assign||function($){for(var j,O=1,G=arguments.length;O0&&Z[Z.length-1])||H[0]!==6&&H[0]!==2)){V=0;continue}if(H[0]===3&&(!Z||H[1]>Z[0]&&H[1]()=>($&&(j=$($=0)),j),WG=($,j)=>{for(var O in j)uJ($,O,{get:j[O],enumerable:!0})},hZ=($)=>((j,O,G,Z)=>{if(O&&typeof O=="object"||typeof O=="function")for(let V of zD(O))!kD.call(j,V)&&V!==G&&uJ(j,V,{get:()=>O[V],enumerable:!(Z=yD(O,V))||Z.enumerable});return j})(uJ({},"__esModule",{value:!0}),$),gP=k5(()=>{qZ=new Map,t4=[],TG=($,j,O)=>{if(j&&typeof j.init=="function"&&typeof j.createInferenceSessionHandler=="function"){let G=qZ.get($);if(G===void 0)qZ.set($,{backend:j,priority:O});else{if(G.priority>O)return;if(G.priority===O&&G.backend!==j)throw Error(`cannot register backend "${$}" using priority ${O}`)}if(O>=0){let Z=t4.indexOf($);Z!==-1&&t4.splice(Z,1);for(let V=0;V{let j=qZ.get($);if(!j)return"backend not found.";if(j.initialized)return j.backend;if(j.aborted)return j.error;{let O=!!j.initPromise;try{return O||(j.initPromise=j.backend.init($)),await j.initPromise,j.initialized=!0,j.backend}catch(G){return O||(j.error=`${G}`,j.aborted=!0),j.error}finally{delete j.initPromise}}},KP=async($)=>{let j,O=$.executionProviders||[],G=O.map((R)=>typeof R=="string"?R:R.name),Z=G.length===0?t4:G,V=[],N=new Set;for(let R of Z){let U=await sR(R);typeof U=="string"?V.push({name:R,err:U}):(j||(j=U),j===U&&N.add(R))}if(!j)throw Error(`no available backend found. ERR: ${V.map((R)=>`[${R.name}] ${R.err}`).join(", ")}`);for(let{name:R,err:U}of V)G.includes(R)&&console.warn(`removing requested execution provider "${R}" from session options because it is not available: ${U}`);let J=O.filter((R)=>N.has(typeof R=="string"?R:R.name));return[j,new Proxy($,{get:(R,U)=>U==="executionProviders"?J:Reflect.get(R,U)})]}}),DD=k5(()=>{gP()}),WD=k5(()=>{bP="1.22.0"}),uP=k5(()=>{WD(),mV="warning",A2={wasm:{},webgl:{},webgpu:{},versions:{common:bP},set logLevel($){if($!==void 0){if(typeof $!="string"||["verbose","info","warning","error","fatal"].indexOf($)===-1)throw Error(`Unsupported logging level: ${$}`);mV=$}},get logLevel(){return mV}},Object.defineProperty(A2,"logLevel",{enumerable:!0})}),MD=k5(()=>{uP(),X9=A2}),KD=k5(()=>{fP=($,j)=>{let O=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);O.width=$.dims[3],O.height=$.dims[2];let G=O.getContext("2d");if(G!=null){let Z,V;j?.tensorLayout!==void 0&&j.tensorLayout==="NHWC"?(Z=$.dims[2],V=$.dims[3]):(Z=$.dims[3],V=$.dims[2]);let N,J,R=j?.format!==void 0?j.format:"RGB",U=j?.norm;U===void 0||U.mean===void 0?N=[255,255,255,255]:typeof U.mean=="number"?N=[U.mean,U.mean,U.mean,U.mean]:(N=[U.mean[0],U.mean[1],U.mean[2],0],U.mean[3]!==void 0&&(N[3]=U.mean[3])),U===void 0||U.bias===void 0?J=[0,0,0,0]:typeof U.bias=="number"?J=[U.bias,U.bias,U.bias,U.bias]:(J=[U.bias[0],U.bias[1],U.bias[2],0],U.bias[3]!==void 0&&(J[3]=U.bias[3]));let H=V*Z,L=0,Y=H,S=2*H,X=-1;R==="RGBA"?(L=0,Y=H,S=2*H,X=3*H):R==="RGB"?(L=0,Y=H,S=2*H):R==="RBG"&&(L=0,S=H,Y=2*H);for(let D=0;D{let O,G=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d");if(G==null)throw Error("Can not access image data");{let Z,V,N;j?.tensorLayout!==void 0&&j.tensorLayout==="NHWC"?(Z=$.dims[2],V=$.dims[1],N=$.dims[3]):(Z=$.dims[3],V=$.dims[2],N=$.dims[1]);let J,R,U=j!==void 0&&j.format!==void 0?j.format:"RGB",H=j?.norm;H===void 0||H.mean===void 0?J=[255,255,255,255]:typeof H.mean=="number"?J=[H.mean,H.mean,H.mean,H.mean]:(J=[H.mean[0],H.mean[1],H.mean[2],255],H.mean[3]!==void 0&&(J[3]=H.mean[3])),H===void 0||H.bias===void 0?R=[0,0,0,0]:typeof H.bias=="number"?R=[H.bias,H.bias,H.bias,H.bias]:(R=[H.bias[0],H.bias[1],H.bias[2],0],H.bias[3]!==void 0&&(R[3]=H.bias[3]));let L=V*Z;if(j!==void 0&&(j.format!==void 0&&N===4&&j.format!=="RGBA"||N===3&&j.format!=="RGB"&&j.format!=="BGR"))throw Error("Tensor format doesn't match input tensor dims");let Y=4,S=0,X=1,D=2,I=3,k=0,z=L,w=2*L,T=-1;U==="RGBA"?(k=0,z=L,w=2*L,T=3*L):U==="RGB"?(k=0,z=L,w=2*L):U==="RBG"&&(k=0,w=L,z=2*L),O=G.createImageData(Z,V);for(let W=0;W{Iv(),zq=($,j)=>{if($===void 0)throw Error("Image buffer must be defined");if(j.height===void 0||j.width===void 0)throw Error("Image height and width must be defined");if(j.tensorLayout==="NHWC")throw Error("NHWC Tensor layout is not supported yet");let O,G,{height:Z,width:V}=j,N=j.norm??{mean:255,bias:0};O=typeof N.mean=="number"?[N.mean,N.mean,N.mean,N.mean]:[N.mean[0],N.mean[1],N.mean[2],N.mean[3]??255],G=typeof N.bias=="number"?[N.bias,N.bias,N.bias,N.bias]:[N.bias[0],N.bias[1],N.bias[2],N.bias[3]??0];let J=j.format!==void 0?j.format:"RGBA",R=j.tensorFormat!==void 0&&j.tensorFormat!==void 0?j.tensorFormat:"RGB",U=Z*V,H=R==="RGBA"?new Float32Array(4*U):new Float32Array(3*U),L=4,Y=0,S=1,X=2,D=3,I=0,k=U,z=2*U,w=-1;J==="RGB"&&(L=3,Y=0,S=1,X=2,D=-1),R==="RGBA"?w=3*U:R==="RBG"?(I=0,z=U,k=2*U):R==="BGR"&&(z=0,k=U,I=2*U);for(let T=0;T{let O,G=typeof HTMLImageElement<"u"&&$ instanceof HTMLImageElement,Z=typeof ImageData<"u"&&$ instanceof ImageData,V=typeof ImageBitmap<"u"&&$ instanceof ImageBitmap,N=typeof $=="string",J=j??{},R=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw Error("Canvas is not supported")},U=(H)=>typeof HTMLCanvasElement<"u"&&H instanceof HTMLCanvasElement||H instanceof OffscreenCanvas?H.getContext("2d"):null;if(G){let H=R();H.width=$.width,H.height=$.height;let L=U(H);if(L==null)throw Error("Can not access image data");{let{height:Y,width:S}=$;if(j!==void 0&&j.resizedHeight!==void 0&&j.resizedWidth!==void 0&&(Y=j.resizedHeight,S=j.resizedWidth),j!==void 0){if(J=j,j.tensorFormat!==void 0)throw Error("Image input config format must be RGBA for HTMLImageElement");J.tensorFormat="RGBA",J.height=Y,J.width=S}else J.tensorFormat="RGBA",J.height=Y,J.width=S;L.drawImage($,0,0),O=L.getImageData(0,0,S,Y).data}}else{if(!Z){if(V){if(j===void 0)throw Error("Please provide image config with format for Imagebitmap");let H=R();H.width=$.width,H.height=$.height;let L=U(H);if(L!=null){let{height:Y,width:S}=$;return L.drawImage($,0,0,S,Y),O=L.getImageData(0,0,S,Y).data,J.height=Y,J.width=S,zq(O,J)}throw Error("Can not access image data")}if(N)return new Promise((H,L)=>{let Y=R(),S=U(Y);if(!$||!S)return L();let X=new Image;X.crossOrigin="Anonymous",X.src=$,X.onload=()=>{Y.width=X.width,Y.height=X.height,S.drawImage(X,0,0,Y.width,Y.height);let D=S.getImageData(0,0,Y.width,Y.height);J.height=Y.height,J.width=Y.width,H(zq(D.data,J))}});throw Error("Input data provided is not supported - aborted tensor creation")}{let H,L;if(j!==void 0&&j.resizedWidth!==void 0&&j.resizedHeight!==void 0?(H=j.resizedHeight,L=j.resizedWidth):(H=$.height,L=$.width),j!==void 0&&(J=j),J.format="RGBA",J.height=H,J.width=L,j!==void 0){let Y=R();Y.width=L,Y.height=H;let S=U(Y);if(S==null)throw Error("Can not access image data");S.putImageData($,0,0),O=S.getImageData(0,0,L,H).data}else O=$.data}}if(O!==void 0)return zq(O,J);throw Error("Input data provided is not supported - aborted tensor creation")},QP=($,j)=>{let{width:O,height:G,download:Z,dispose:V}=j;return new u2({location:"texture",type:"float32",texture:$,dims:[1,G,O,4],download:Z,dispose:V})},CP=($,j)=>{let{dataType:O,dims:G,download:Z,dispose:V}=j;return new u2({location:"gpu-buffer",type:O??"float32",gpuBuffer:$,dims:G,download:Z,dispose:V})},BP=($,j)=>{let{dataType:O,dims:G,download:Z,dispose:V}=j;return new u2({location:"ml-tensor",type:O??"float32",mlTensor:$,dims:G,download:Z,dispose:V})},hP=($,j,O)=>new u2({location:"cpu-pinned",type:$,data:j,dims:O??[j.length]})}),fD=k5(()=>{u8=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),KZ=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),pV=!1,cP=()=>{if(!pV){pV=!0;let $=typeof BigInt64Array<"u"&&BigInt64Array.from,j=typeof BigUint64Array<"u"&&BigUint64Array.from,O=globalThis.Float16Array,G=typeof O<"u"&&O.from;$&&(u8.set("int64",BigInt64Array),KZ.set(BigInt64Array,"int64")),j&&(u8.set("uint64",BigUint64Array),KZ.set(BigUint64Array,"uint64")),G?(u8.set("float16",O),KZ.set(O,"float16")):u8.set("float16",Uint16Array)}}}),wD=k5(()=>{Iv(),mP=($)=>{let j=1;for(let O=0;O<$.length;O++){let G=$[O];if(typeof G!="number"||!Number.isSafeInteger(G))throw TypeError(`dims[${O}] must be an integer, got: ${G}`);if(G<0)throw RangeError(`dims[${O}] must be a non-negative integer, got: ${G}`);j*=G}return j},pP=($,j)=>{switch($.location){case"cpu":return new u2($.type,$.data,j);case"cpu-pinned":return new u2({location:"cpu-pinned",data:$.data,type:$.type,dims:j});case"texture":return new u2({location:"texture",texture:$.texture,type:$.type,dims:j});case"gpu-buffer":return new u2({location:"gpu-buffer",gpuBuffer:$.gpuBuffer,type:$.type,dims:j});case"ml-tensor":return new u2({location:"ml-tensor",mlTensor:$.mlTensor,type:$.type,dims:j});default:throw Error(`tensorReshape: tensor location ${$.location} is not supported`)}}}),Iv=k5(()=>{KD(),bD(),fD(),wD(),u2=class{constructor($,j,O){let G,Z;if(cP(),typeof $=="object"&&"location"in $)switch(this.dataLocation=$.location,G=$.type,Z=$.dims,$.location){case"cpu-pinned":{let N=u8.get(G);if(!N)throw TypeError(`unsupported type "${G}" to create tensor from pinned buffer`);if(!($.data instanceof N))throw TypeError(`buffer should be of type ${N.name}`);this.cpuData=$.data;break}case"texture":if(G!=="float32")throw TypeError(`unsupported type "${G}" to create tensor from texture`);this.gpuTextureData=$.texture,this.downloader=$.download,this.disposer=$.dispose;break;case"gpu-buffer":if(G!=="float32"&&G!=="float16"&&G!=="int32"&&G!=="int64"&&G!=="uint32"&&G!=="uint8"&&G!=="bool"&&G!=="uint4"&&G!=="int4")throw TypeError(`unsupported type "${G}" to create tensor from gpu buffer`);this.gpuBufferData=$.gpuBuffer,this.downloader=$.download,this.disposer=$.dispose;break;case"ml-tensor":if(G!=="float32"&&G!=="float16"&&G!=="int32"&&G!=="int64"&&G!=="uint32"&&G!=="uint64"&&G!=="int8"&&G!=="uint8"&&G!=="bool"&&G!=="uint4"&&G!=="int4")throw TypeError(`unsupported type "${G}" to create tensor from MLTensor`);this.mlTensorData=$.mlTensor,this.downloader=$.download,this.disposer=$.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let N,J;if(typeof $=="string")if(G=$,J=O,$==="string"){if(!Array.isArray(j))throw TypeError("A string tensor's data must be a string array.");N=j}else{let R=u8.get($);if(R===void 0)throw TypeError(`Unsupported tensor type: ${$}.`);if(Array.isArray(j)){if($==="float16"&&R===Uint16Array||$==="uint4"||$==="int4")throw TypeError(`Creating a ${$} tensor from number array is not supported. Please use ${R.name} as data.`);N=$==="uint64"||$==="int64"?R.from(j,BigInt):R.from(j)}else if(j instanceof R)N=j;else if(j instanceof Uint8ClampedArray){if($!=="uint8")throw TypeError("A Uint8ClampedArray tensor's data must be type of uint8");N=Uint8Array.from(j)}else{if(!($==="float16"&&j instanceof Uint16Array&&R!==Uint16Array))throw TypeError(`A ${G} tensor's data must be type of ${R}`);N=new globalThis.Float16Array(j.buffer,j.byteOffset,j.length)}}else if(J=j,Array.isArray($)){if($.length===0)throw TypeError("Tensor type cannot be inferred from an empty array.");let R=typeof $[0];if(R==="string")G="string",N=$;else{if(R!=="boolean")throw TypeError(`Invalid element type of data array: ${R}.`);G="bool",N=Uint8Array.from($)}}else if($ instanceof Uint8ClampedArray)G="uint8",N=Uint8Array.from($);else{let R=KZ.get($.constructor);if(R===void 0)throw TypeError(`Unsupported type for tensor data: ${$.constructor}.`);G=R,N=$}if(J===void 0)J=[N.length];else if(!Array.isArray(J))throw TypeError("A tensor's dims must be a number array");Z=J,this.cpuData=N,this.dataLocation="cpu"}let V=mP(Z);if(this.cpuData&&V!==this.cpuData.length&&(G!=="uint4"&&G!=="int4"||Math.ceil(V/2)!==this.cpuData.length))throw Error(`Tensor's size(${V}) does not match data length(${this.cpuData.length}).`);this.type=G,this.dims=Z,this.size=V}static async fromImage($,j){return EP($,j)}static fromTexture($,j){return QP($,j)}static fromGpuBuffer($,j){return CP($,j)}static fromMLTensor($,j){return BP($,j)}static fromPinnedBuffer($,j,O){return hP($,j,O)}toDataURL($){return fP(this,$)}toImageData($){return wP(this,$)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData($){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":if(!this.downloader)throw Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let j=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=j,$&&this.disposer&&(this.disposer(),this.disposer=void 0),j}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw Error("The tensor is disposed.")}reshape($){if(this.ensureValid(),this.downloader||this.disposer)throw Error("Cannot reshape a tensor that owns GPU resource.");return pP(this,$)}}}),dP=k5(()=>{Iv(),q2=u2}),lP=k5(()=>{uP(),GV=($,j)=>{(typeof A2.trace>"u"?!A2.wasm.trace:!A2.trace)||console.timeStamp(`${$}::ORT::${j}`)},AV=($,j)=>{let O=Error().stack?.split(/\r\n|\r|\n/g)||[],G=!1;for(let Z=0;Z{(typeof A2.trace>"u"?!A2.wasm.trace:!A2.trace)||AV("BEGIN",$)},f3=($)=>{(typeof A2.trace>"u"?!A2.wasm.trace:!A2.trace)||AV("END",$)}}),ED=k5(()=>{gP(),dP(),lP(),AP=class ${constructor(j){this.handler=j}async run(j,O,G){G4();let Z={},V={};if(typeof j!="object"||j===null||j instanceof q2||Array.isArray(j))throw TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let N=!0;if(typeof O=="object"){if(O===null)throw TypeError("Unexpected argument[1]: cannot be null.");if(O instanceof q2)throw TypeError("'fetches' cannot be a Tensor");if(Array.isArray(O)){if(O.length===0)throw TypeError("'fetches' cannot be an empty array.");N=!1;for(let U of O){if(typeof U!="string")throw TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(U)===-1)throw RangeError(`'fetches' contains invalid output name: ${U}.`);Z[U]=null}if(typeof G=="object"&&G!==null)V=G;else if(typeof G<"u")throw TypeError("'options' must be an object.")}else{let U=!1,H=Object.getOwnPropertyNames(O);for(let L of this.outputNames)if(H.indexOf(L)!==-1){let Y=O[L];(Y===null||Y instanceof q2)&&(U=!0,N=!1,Z[L]=Y)}if(U){if(typeof G=="object"&&G!==null)V=G;else if(typeof G<"u")throw TypeError("'options' must be an object.")}else V=O}}else if(typeof O<"u")throw TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let U of this.inputNames)if(typeof j[U]>"u")throw Error(`input '${U}' is missing in 'feeds'.`);if(N)for(let U of this.outputNames)Z[U]=null;let J=await this.handler.run(j,Z,V),R={};for(let U in J)if(Object.hasOwnProperty.call(J,U)){let H=J[U];R[U]=H instanceof q2?H:new q2(H.type,H.data,H.dims)}return f3(),R}async release(){return this.handler.dispose()}static async create(j,O,G,Z){G4();let V,N={};if(typeof j=="string"){if(V=j,typeof O=="object"&&O!==null)N=O;else if(typeof O<"u")throw TypeError("'options' must be an object.")}else if(j instanceof Uint8Array){if(V=j,typeof O=="object"&&O!==null)N=O;else if(typeof O<"u")throw TypeError("'options' must be an object.")}else{if(!(j instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&j instanceof SharedArrayBuffer))throw TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");{let H=j,L=0,Y=j.byteLength;if(typeof O=="object"&&O!==null)N=O;else if(typeof O=="number"){if(L=O,!Number.isSafeInteger(L))throw RangeError("'byteOffset' must be an integer.");if(L<0||L>=H.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${H.byteLength}).`);if(Y=j.byteLength-L,typeof G=="number"){if(Y=G,!Number.isSafeInteger(Y))throw RangeError("'byteLength' must be an integer.");if(Y<=0||L+Y>H.byteLength)throw RangeError(`'byteLength' is out of range (0, ${H.byteLength-L}].`);if(typeof Z=="object"&&Z!==null)N=Z;else if(typeof Z<"u")throw TypeError("'options' must be an object.")}else if(typeof G<"u")throw TypeError("'byteLength' must be a number.")}else if(typeof O<"u")throw TypeError("'options' must be an object.");V=new Uint8Array(H,L,Y)}}let[J,R]=await KP(N),U=await J.createInferenceSessionHandler(V,R);return f3(),new $(U)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),QD=k5(()=>{ED(),ZV=AP}),CD=k5(()=>{}),BD=k5(()=>{}),hD=k5(()=>{}),cD=k5(()=>{});WG({},{InferenceSession:()=>ZV,TRACE:()=>GV,TRACE_FUNC_BEGIN:()=>G4,TRACE_FUNC_END:()=>f3,Tensor:()=>q2,env:()=>X9,registerBackend:()=>TG});var w3=k5(()=>{DD(),MD(),QD(),dP(),CD(),BD(),lP(),hD(),cD()}),Dv=k5(()=>{}),oP={};WG(oP,{default:()=>sP});var gV,iR,sP,mD=k5(()=>{qy(),j$(),Bv(),gV="ort-wasm-proxy-worker",(iR=globalThis.self?.name===gV)&&(self.onmessage=($)=>{let{type:j,in:O}=$.data;try{switch(j){case"init-wasm":Wv(O.wasm).then(()=>{lv(O).then(()=>{postMessage({type:j})},(G)=>{postMessage({type:j,err:G})})},(G)=>{postMessage({type:j,err:G})});break;case"init-ep":{let{epName:G,env:Z}=O;ov(Z,G).then(()=>{postMessage({type:j})},(V)=>{postMessage({type:j,err:V})});break}case"copy-from":{let{buffer:G}=O,Z=UV(G);postMessage({type:j,out:Z});break}case"create":{let{model:G,options:Z}=O;sv(G,Z).then((V)=>{postMessage({type:j,out:V})},(V)=>{postMessage({type:j,err:V})});break}case"release":iv(O),postMessage({type:j});break;case"run":{let{sessionId:G,inputIndices:Z,inputs:V,outputIndices:N,options:J}=O;av(G,Z,V,N,Array(N.length).fill(null),J).then((R)=>{R.some((U)=>U[3]!=="cpu")?postMessage({type:j,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:j,out:R},nv([...V,...R]))},(R)=>{postMessage({type:j,err:R})});break}case"end-profiling":rv(O),postMessage({type:j})}}catch(G){postMessage({type:j,err:G})}}),sP=iR?null:($)=>new Worker($??_2,{type:"module",name:gV})}),iP={};WG(iP,{default:()=>aP});var uV,dV,aP,aR,lV,dJ,rR,_2,rP,kq,nR,tR,oV,eR,sV,nP,iV,tP,aV,Iq,VZ,rV,$U,jU,OU,Wv,L9,M3,qV,V9,eP,GU,ZU,qU,NZ,VU,$X,d8,y4,l8,TV,VV,Mv,Kv,lJ,bv,NU,JU,vU,RU,fv,UU,d6,HU,zG,d0,NV,jX,OX,GX,wv,nV,oJ,tV,xU,eV,LU,$N,jN,ON,_U,ZX,JZ,YU,qX,GN,Dq,Wq,SU,PU,ZN,sJ,XU,VX,TU,$9,kG,Mq,G1,z1,$6,M9,iJ,FG,V7,v6,vZ,j5,n5,NX,Ev,FU,JX,yU,qN,zU,kU,IU,DU,P2,vX,RX,WU,MU,KU,bU,fU,wU,EU,QU,CU,BU,x3,UX,HX,xX,LX,_X,YX,SX,PX,XX,TX,L3,hU,JV,aJ,_3,cU,mU,pU,AU,gU,uU,dU,lU,oU,sU,Y3,FX,yX,zX,kX,IX,DX,WX,MX,KX,bX,VN,fX,wX,rJ,iU,Kq,aU,rU,nU,cZ,tU,EX,eU,$H,jH,QX,OH,GH,CX,ZH,r6,BX,hX,cX,mX,pX,AX,gX,uX,dX,qH,lX,oX,sX,iX,bZ,aX,tq,rX,nX,tX,eX,$T,jT,OT,GT,ZT,qT,VT,NT,JT,vT,RT,UT,NN,HT,nJ,tJ,xT,LT,_T,VH,NH,YT,JH,vH,ST,RH,UH,S3,PT,XT,TT,FT,yT,zT,kT,IT,DT,WT,HH,xH,LH,_H,MT,KT,a8,r8,n8,Qv,I1,bT,fT,CZ,Cv,YH,SH,eJ,JN,PH,$v,XH,vV,TH,wT,FH,vN,RZ,yH,RN,zH,ET,QT,CT,BT,kH,bq,IH,fq,jv,UN,DH,WH,Ov,hT,MH,KH,bH,HN,cT,fH,xN,wH,mT,EH,pT,AT,QH,CH,BH,gT,uT,LN,wq,_N,hH,cH,mH,YN,pH,dT,lT,AH,SN,gH,uH,oT,dH,sT,lH,oH,iT,aT,sH,rT,nT,iH,aH,tT,eT,rH,nH,$F,jF,tH,eH,OF,GF,j4,T4,Q8,C8,$x,jx,Ox,Gx,Zx,qx,Vx,ZF,qF,c1,Nx,VF,PN,Jx,fZ,NF,vx,Rx,Ux,Hx,Gv,JF,vF,xx,RV,RF,Lx,_x,XN,Yx,UF,TN,Sx,Px,HF,Xx,Tx,xF,Fx,LF,yx,zx,kx,_F,YF,Ix,Dx,Wx,Mx,Kx,bx,fx,wx,SF,UZ,FN,yN,zN,kN,Ex,Qx,IN,DN,PF,XF,WN,TF,FF,MN,yF,zF,kF,IF,Cx,Bx,DF,WF,hx,cx,MF,mx,KN,bN,px,KF,bF,Ax,gx,ux,fN,dx,lx,ox,sx,ix,ax,rx,nx,wN,tx,ex,$L,jL,OL,fF,wF,GL,ZL,EF,qL,HZ,VL,EN,NL,JL,QF,CF,vL,RL,BF,hF,QN,UL,HL,xL,cF,LL,_L,mF,pF,AF,pD=k5(()=>{uV=import.meta.url,dV=async function($={}){var j,O,G=$,Z=new Promise((_,y)=>{j=_,O=y}),V=typeof window=="object",N=typeof WorkerGlobalScope<"u",J=N&&self.name?.startsWith("em-pthread");G.mountExternalData=(_,y)=>{_.startsWith("./")&&(_=_.substring(2)),(G.Fb||(G.Fb=new Map)).set(_,y)},G.unmountExternalData=()=>{delete G.Fb};var R=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,qc:!0}).buffer.constructor;let U=(_)=>async(...y)=>{try{if(G.Gb)throw Error("Session already started");let f=G.Gb={ec:y[0],errors:[]},B=await _(...y);if(G.Gb!==f)throw Error("Session mismatch");G.Kb?.flush();let g=f.errors;if(0z0),0{if(_==="webgpu"){[G.Kb,G.Vb,G.Zb,G.Lb,G.Yb,G.kb,G.$b,G.bc,G.Wb,G.Xb,G.ac]=y;let f=G.Kb;G.jsepRegisterBuffer=(B,g,J0,z0)=>f.registerBuffer(B,g,J0,z0),G.jsepGetBuffer=(B)=>f.getBuffer(B),G.jsepCreateDownloader=(B,g,J0)=>f.createDownloader(B,g,J0),G.jsepOnCreateSession=(B)=>{f.onCreateSession(B)},G.jsepOnReleaseSession=(B)=>{f.onReleaseSession(B)},G.jsepOnRunStart=(B)=>f.onRunStart(B),G.cc=(B,g)=>{f.upload(B,g)}}else if(_==="webnn"){let f=y[0];[G.oc,G.Ob,G.webnnEnsureTensor,G.Pb,G.webnnDownloadTensor]=y.slice(1),G.webnnReleaseTensorId=G.Ob,G.webnnUploadTensor=G.Pb,G.webnnOnRunStart=(B)=>f.onRunStart(B),G.webnnOnRunEnd=f.onRunEnd.bind(f),G.webnnRegisterMLContext=(B,g)=>{f.registerMLContext(B,g)},G.webnnOnReleaseSession=(B)=>{f.onReleaseSession(B)},G.webnnCreateMLTensorDownloader=(B,g)=>f.createMLTensorDownloader(B,g),G.webnnRegisterMLTensor=(B,g,J0,z0)=>f.registerMLTensor(B,g,J0,z0),G.webnnCreateMLContext=(B)=>f.createMLContext(B),G.webnnRegisterMLConstant=(B,g,J0,z0,f0,A0)=>f.registerMLConstant(B,g,J0,z0,f0,G.Fb,A0),G.webnnRegisterGraphInput=f.registerGraphInput.bind(f),G.webnnIsGraphInput=f.isGraphInput.bind(f),G.webnnRegisterGraphOutput=f.registerGraphOutput.bind(f),G.webnnIsGraphOutput=f.isGraphOutput.bind(f),G.webnnCreateTemporaryTensor=f.createTemporaryTensor.bind(f),G.webnnIsGraphInputOutputTypeSupported=f.isGraphInputOutputTypeSupported.bind(f)}};let H=()=>{let _=(y,f,B)=>(...g)=>{let J0=N6,z0=f?.();g=y(...g);let f0=f?.();return z0!==f0&&(y=f0,B(z0),f=B=null),N6!=J0?new Promise((A0,Z5)=>{B6={resolve:A0,reject:Z5}}):g};(()=>{for(let y of["_OrtAppendExecutionProvider","_OrtCreateSession","_OrtRun","_OrtRunWithBinding","_OrtBindInput"])G[y]=_(G[y],()=>G[y],(f)=>G[y]=f)})(),U!==void 0&&(G._OrtRun=U(G._OrtRun),G._OrtRunWithBinding=U(G._OrtRunWithBinding)),H=void 0};G.asyncInit=()=>{H?.()};var L,Y,S=Object.assign({},G),X=(_,y)=>{throw y},D="";(V||N)&&(N?D=self.location.href:typeof document<"u"&&document.currentScript&&(D=document.currentScript.src),uV&&(D=uV),D=D.startsWith("blob:")?"":D.slice(0,D.replace(/[?#].*/,"").lastIndexOf("/")+1),N&&(Y=(_)=>{var y=new XMLHttpRequest;return y.open("GET",_,!1),y.responseType="arraybuffer",y.send(null),new Uint8Array(y.response)}),L=async(_)=>{if(s(_))return new Promise((f,B)=>{var g=new XMLHttpRequest;g.open("GET",_,!0),g.responseType="arraybuffer",g.onload=()=>{g.status==200||g.status==0&&g.response?f(g.response):B(g.status)},g.onerror=B,g.send(null)});var y=await fetch(_,{credentials:"same-origin"});if(y.ok)return y.arrayBuffer();throw Error(y.status+" : "+y.url)});var I=console.log.bind(console),k=console.error.bind(console),z=I,w=k;Object.assign(G,S),S=null;var T,W,E,Q,A,l,r,e,V0,v0,$0,i,G0,S0=G.wasmBinary,F0=!1,s=(_)=>_.startsWith("file://");function n(){return T.buffer!=Q.buffer&&P0(),Q}function R0(){return T.buffer!=Q.buffer&&P0(),A}function q0(){return T.buffer!=Q.buffer&&P0(),l}function p0(){return T.buffer!=Q.buffer&&P0(),r}function Z0(){return T.buffer!=Q.buffer&&P0(),e}function M0(){return T.buffer!=Q.buffer&&P0(),V0}function q5(){return T.buffer!=Q.buffer&&P0(),v0}function E0(){return T.buffer!=Q.buffer&&P0(),G0}if(J){let _=function(y){try{var f=y.data,B=f.Cb;if(B==="load"){let g=[];self.onmessage=(J0)=>g.push(J0),self.startWorker=()=>{postMessage({Cb:"loaded"});for(let J0 of g)_(J0);self.onmessage=_};for(let J0 of f.Sb)G[J0]&&!G[J0].proxy||(G[J0]=(...z0)=>{postMessage({Cb:"callHandler",Rb:J0,args:z0})},J0=="print"&&(z=G[J0]),J0=="printErr"&&(w=G[J0]));T=f.lc,P0(),e0(f.mc)}else if(B==="run"){S5(f.Bb),$2(f.Bb,0,0,1,0,0),N5(),b5(f.Bb),N0||(e1(),N0=!0);try{K6(f.hc,f.Ib)}catch(g){if(g!="unwind")throw g}}else f.target!=="setimmediate"&&(B==="checkMailbox"?N0&&P5():B&&(w(`worker: received unknown command ${B}`),w(f)))}catch(g){throw f2(),g}};var e0,N0=!1;w=function(...y){y=y.join(" "),console.error(y)},self.alert=function(...y){postMessage({Cb:"alert",text:y.join(" "),jc:Q9()})},self.onunhandledrejection=(y)=>{throw y.reason||y},self.onmessage=_}function P0(){var _=T.buffer;G.HEAP8=Q=new Int8Array(_),G.HEAP16=l=new Int16Array(_),G.HEAPU8=A=new Uint8Array(_),G.HEAPU16=r=new Uint16Array(_),G.HEAP32=e=new Int32Array(_),G.HEAPU32=V0=new Uint32Array(_),G.HEAPF32=v0=new Float32Array(_),G.HEAPF64=G0=new Float64Array(_),G.HEAP64=$0=new BigInt64Array(_),G.HEAPU64=i=new BigUint64Array(_)}function Q0(){J?startWorker(G):i5.Da()}J||(T=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),P0());var a0,r0=0,g0=null;function J5(){if(--r0==0&&g0){var _=g0;g0=null,_()}}function t0(_){throw w(_="Aborted("+_+")"),F0=!0,_=new WebAssembly.RuntimeError(_+". Build with -sASSERTIONS for more info."),O(_),_}function y5(){return{a:{L:T0,Aa:U5,b:w6,$:c6,A:a9,pa:I9,X:E5,Z:v5,qa:o6,na:b9,ga:H1,ma:x1,J:o9,Y:L1,V:_1,oa:z9,W:D9,va:Y1,E:A1,Q:q1,O:g1,D:d1,v:V1,r:W1,P:M1,z:h0,R:c0,ja:F5,T:S6,aa:O9,M:g6,F:k9,ia:b5,sa:w9,t:J1,Ca:P6,w:u0,o:V2,m:i2,c:L6,Ba:a2,n:o1,j:A9,u:h3,p:s1,f:c3,s:m3,l:p3,e:A3,k:g3,h:i1,g:u3,d:d3,da:t2,ea:l3,fa:e2,ba:N2,ca:K1,N:z2,xa:Z4,ua:h9,i:j3,C:t9,G:s3,ta:o3,x:i3,ra:a3,U:r3,q:$3,y:n3,K:k2,S:a1,za:e9,ya:O3,ka:v2,la:W2,_:t,B:M2,I:K2,ha:G3,H:w1,a:T,wa:V5}}}var R5={840156:(_,y,f,B,g)=>{if(G===void 0||!G.Fb)return 1;if((_=V6(Number(_>>>0))).startsWith("./")&&(_=_.substring(2)),!(_=G.Fb.get(_)))return 2;if(y=Number(y>>>0),f=Number(f>>>0),B=Number(B>>>0),y+f>_.byteLength)return 3;try{let J0=_.subarray(y,y+f);switch(g){case 0:R0().set(J0,B>>>0);break;case 1:G.nc?G.nc(B,J0):G.cc(B,J0);break;default:return 4}return 0}catch{return 4}},840980:(_,y,f)=>{G.Pb(_,R0().subarray(y>>>0,y+f>>>0))},841044:()=>G.oc(),841086:(_)=>{G.Ob(_)},841123:()=>{G.Wb()},841154:()=>{G.Xb()},841183:()=>{G.ac()},841208:(_)=>G.Vb(_),841241:(_)=>G.Zb(_),841273:(_,y,f)=>{G.Lb(Number(_),Number(y),Number(f),!0)},841336:(_,y,f)=>{G.Lb(Number(_),Number(y),Number(f))},841393:()=>typeof wasmOffsetConverter<"u",841450:(_)=>{G.kb("Abs",_,void 0)},841501:(_)=>{G.kb("Neg",_,void 0)},841552:(_)=>{G.kb("Floor",_,void 0)},841605:(_)=>{G.kb("Ceil",_,void 0)},841657:(_)=>{G.kb("Reciprocal",_,void 0)},841715:(_)=>{G.kb("Sqrt",_,void 0)},841767:(_)=>{G.kb("Exp",_,void 0)},841818:(_)=>{G.kb("Erf",_,void 0)},841869:(_)=>{G.kb("Sigmoid",_,void 0)},841924:(_,y,f)=>{G.kb("HardSigmoid",_,{alpha:y,beta:f})},842003:(_)=>{G.kb("Log",_,void 0)},842054:(_)=>{G.kb("Sin",_,void 0)},842105:(_)=>{G.kb("Cos",_,void 0)},842156:(_)=>{G.kb("Tan",_,void 0)},842207:(_)=>{G.kb("Asin",_,void 0)},842259:(_)=>{G.kb("Acos",_,void 0)},842311:(_)=>{G.kb("Atan",_,void 0)},842363:(_)=>{G.kb("Sinh",_,void 0)},842415:(_)=>{G.kb("Cosh",_,void 0)},842467:(_)=>{G.kb("Asinh",_,void 0)},842520:(_)=>{G.kb("Acosh",_,void 0)},842573:(_)=>{G.kb("Atanh",_,void 0)},842626:(_)=>{G.kb("Tanh",_,void 0)},842678:(_)=>{G.kb("Not",_,void 0)},842729:(_,y,f)=>{G.kb("Clip",_,{min:y,max:f})},842798:(_)=>{G.kb("Clip",_,void 0)},842850:(_,y)=>{G.kb("Elu",_,{alpha:y})},842908:(_)=>{G.kb("Gelu",_,void 0)},842960:(_)=>{G.kb("Relu",_,void 0)},843012:(_,y)=>{G.kb("LeakyRelu",_,{alpha:y})},843076:(_,y)=>{G.kb("ThresholdedRelu",_,{alpha:y})},843146:(_,y)=>{G.kb("Cast",_,{to:y})},843204:(_)=>{G.kb("Add",_,void 0)},843255:(_)=>{G.kb("Sub",_,void 0)},843306:(_)=>{G.kb("Mul",_,void 0)},843357:(_)=>{G.kb("Div",_,void 0)},843408:(_)=>{G.kb("Pow",_,void 0)},843459:(_)=>{G.kb("Equal",_,void 0)},843512:(_)=>{G.kb("Greater",_,void 0)},843567:(_)=>{G.kb("GreaterOrEqual",_,void 0)},843629:(_)=>{G.kb("Less",_,void 0)},843681:(_)=>{G.kb("LessOrEqual",_,void 0)},843740:(_,y,f,B,g)=>{G.kb("ReduceMean",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},843915:(_,y,f,B,g)=>{G.kb("ReduceMax",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},844089:(_,y,f,B,g)=>{G.kb("ReduceMin",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},844263:(_,y,f,B,g)=>{G.kb("ReduceProd",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},844438:(_,y,f,B,g)=>{G.kb("ReduceSum",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},844612:(_,y,f,B,g)=>{G.kb("ReduceL1",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},844785:(_,y,f,B,g)=>{G.kb("ReduceL2",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},844958:(_,y,f,B,g)=>{G.kb("ReduceLogSum",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},845135:(_,y,f,B,g)=>{G.kb("ReduceSumSquare",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},845315:(_,y,f,B,g)=>{G.kb("ReduceLogSumExp",_,{keepDims:!!y,noopWithEmptyAxes:!!f,axes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},845495:(_)=>{G.kb("Where",_,void 0)},845548:(_,y,f)=>{G.kb("Transpose",_,{perm:y?Array.from(Z0().subarray(Number(y)>>>0,Number(f)>>>0)):[]})},845672:(_,y,f,B)=>{G.kb("DepthToSpace",_,{blocksize:y,mode:V6(f),format:B?"NHWC":"NCHW"})},845805:(_,y,f,B)=>{G.kb("DepthToSpace",_,{blocksize:y,mode:V6(f),format:B?"NHWC":"NCHW"})},845938:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9,y1)=>{G.kb("ConvTranspose",_,{format:A0?"NHWC":"NCHW",autoPad:y,dilations:[f],group:B,kernelShape:[g],pads:[J0,z0],strides:[f0],wIsConst:()=>!!n()[Z5>>>0],outputPadding:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[],outputShape:J6?Array.from(Z0().subarray(Number(J6)>>>0,Number(q9)>>>0)):[],activation:V6(y1)})},846371:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.kb("ConvTranspose",_,{format:f0?"NHWC":"NCHW",autoPad:y,dilations:Array.from(Z0().subarray(Number(f)>>>0,2+(Number(f)>>>0)>>>0)),group:B,kernelShape:Array.from(Z0().subarray(Number(g)>>>0,2+(Number(g)>>>0)>>>0)),pads:Array.from(Z0().subarray(Number(J0)>>>0,4+(Number(J0)>>>0)>>>0)),strides:Array.from(Z0().subarray(Number(z0)>>>0,2+(Number(z0)>>>0)>>>0)),wIsConst:()=>!!n()[A0>>>0],outputPadding:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],outputShape:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[],activation:V6(q9)})},847032:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9,y1)=>{G.kb("ConvTranspose",_,{format:A0?"NHWC":"NCHW",autoPad:y,dilations:[f],group:B,kernelShape:[g],pads:[J0,z0],strides:[f0],wIsConst:()=>!!n()[Z5>>>0],outputPadding:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[],outputShape:J6?Array.from(Z0().subarray(Number(J6)>>>0,Number(q9)>>>0)):[],activation:V6(y1)})},847465:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.kb("ConvTranspose",_,{format:f0?"NHWC":"NCHW",autoPad:y,dilations:Array.from(Z0().subarray(Number(f)>>>0,2+(Number(f)>>>0)>>>0)),group:B,kernelShape:Array.from(Z0().subarray(Number(g)>>>0,2+(Number(g)>>>0)>>>0)),pads:Array.from(Z0().subarray(Number(J0)>>>0,4+(Number(J0)>>>0)>>>0)),strides:Array.from(Z0().subarray(Number(z0)>>>0,2+(Number(z0)>>>0)>>>0)),wIsConst:()=>!!n()[A0>>>0],outputPadding:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],outputShape:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[],activation:V6(q9)})},848126:(_,y)=>{G.kb("GlobalAveragePool",_,{format:y?"NHWC":"NCHW"})},848217:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.kb("AveragePool",_,{format:q9?"NHWC":"NCHW",auto_pad:y,ceil_mode:f,count_include_pad:B,storage_order:g,dilations:J0?Array.from(Z0().subarray(Number(J0)>>>0,Number(z0)>>>0)):[],kernel_shape:f0?Array.from(Z0().subarray(Number(f0)>>>0,Number(A0)>>>0)):[],pads:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],strides:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[]})},848696:(_,y)=>{G.kb("GlobalAveragePool",_,{format:y?"NHWC":"NCHW"})},848787:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.kb("AveragePool",_,{format:q9?"NHWC":"NCHW",auto_pad:y,ceil_mode:f,count_include_pad:B,storage_order:g,dilations:J0?Array.from(Z0().subarray(Number(J0)>>>0,Number(z0)>>>0)):[],kernel_shape:f0?Array.from(Z0().subarray(Number(f0)>>>0,Number(A0)>>>0)):[],pads:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],strides:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[]})},849266:(_,y)=>{G.kb("GlobalMaxPool",_,{format:y?"NHWC":"NCHW"})},849353:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.kb("MaxPool",_,{format:q9?"NHWC":"NCHW",auto_pad:y,ceil_mode:f,count_include_pad:B,storage_order:g,dilations:J0?Array.from(Z0().subarray(Number(J0)>>>0,Number(z0)>>>0)):[],kernel_shape:f0?Array.from(Z0().subarray(Number(f0)>>>0,Number(A0)>>>0)):[],pads:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],strides:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[]})},849828:(_,y)=>{G.kb("GlobalMaxPool",_,{format:y?"NHWC":"NCHW"})},849915:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.kb("MaxPool",_,{format:q9?"NHWC":"NCHW",auto_pad:y,ceil_mode:f,count_include_pad:B,storage_order:g,dilations:J0?Array.from(Z0().subarray(Number(J0)>>>0,Number(z0)>>>0)):[],kernel_shape:f0?Array.from(Z0().subarray(Number(f0)>>>0,Number(A0)>>>0)):[],pads:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],strides:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[]})},850390:(_,y,f,B,g)=>{G.kb("Gemm",_,{alpha:y,beta:f,transA:B,transB:g})},850494:(_)=>{G.kb("MatMul",_,void 0)},850548:(_,y,f,B)=>{G.kb("ArgMax",_,{keepDims:!!y,selectLastIndex:!!f,axis:B})},850656:(_,y,f,B)=>{G.kb("ArgMin",_,{keepDims:!!y,selectLastIndex:!!f,axis:B})},850764:(_,y)=>{G.kb("Softmax",_,{axis:y})},850827:(_,y)=>{G.kb("Concat",_,{axis:y})},850887:(_,y,f,B,g)=>{G.kb("Split",_,{axis:y,numOutputs:f,splitSizes:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},851043:(_)=>{G.kb("Expand",_,void 0)},851097:(_,y)=>{G.kb("Gather",_,{axis:Number(y)})},851168:(_,y)=>{G.kb("GatherElements",_,{axis:Number(y)})},851247:(_,y)=>{G.kb("GatherND",_,{batch_dims:Number(y)})},851326:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5)=>{G.kb("Resize",_,{antialias:y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[],coordinateTransformMode:V6(g),cubicCoeffA:J0,excludeOutside:z0,extrapolationValue:f0,keepAspectRatioPolicy:V6(A0),mode:V6(Z5),nearestMode:V6(M5)})},851688:(_,y,f,B,g,J0,z0)=>{G.kb("Slice",_,{starts:y?Array.from(Z0().subarray(Number(y)>>>0,Number(f)>>>0)):[],ends:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[],axes:J0?Array.from(Z0().subarray(Number(J0)>>>0,Number(z0)>>>0)):[]})},851952:(_)=>{G.kb("Tile",_,void 0)},852004:(_,y,f)=>{G.kb("InstanceNormalization",_,{epsilon:y,format:f?"NHWC":"NCHW"})},852118:(_,y,f)=>{G.kb("InstanceNormalization",_,{epsilon:y,format:f?"NHWC":"NCHW"})},852232:(_)=>{G.kb("Range",_,void 0)},852285:(_,y)=>{G.kb("Einsum",_,{equation:V6(y)})},852366:(_,y,f,B,g)=>{G.kb("Pad",_,{mode:y,value:f,pads:B?Array.from(Z0().subarray(Number(B)>>>0,Number(g)>>>0)):[]})},852509:(_,y,f,B,g,J0)=>{G.kb("BatchNormalization",_,{epsilon:y,momentum:f,spatial:!!g,trainingMode:!!B,format:J0?"NHWC":"NCHW"})},852678:(_,y,f,B,g,J0)=>{G.kb("BatchNormalization",_,{epsilon:y,momentum:f,spatial:!!g,trainingMode:!!B,format:J0?"NHWC":"NCHW"})},852847:(_,y,f)=>{G.kb("CumSum",_,{exclusive:Number(y),reverse:Number(f)})},852944:(_,y,f)=>{G.kb("DequantizeLinear",_,{axis:y,blockSize:f})},853034:(_,y,f,B,g)=>{G.kb("GridSample",_,{align_corners:y,mode:V6(f),padding_mode:V6(B),format:g?"NHWC":"NCHW"})},853204:(_,y,f,B,g)=>{G.kb("GridSample",_,{align_corners:y,mode:V6(f),padding_mode:V6(B),format:g?"NHWC":"NCHW"})},853374:(_,y)=>{G.kb("ScatterND",_,{reduction:V6(y)})},853459:(_,y,f,B,g,J0,z0,f0,A0)=>{G.kb("Attention",_,{numHeads:y,isUnidirectional:f,maskFilterValue:B,scale:g,doRotary:J0,qkvHiddenSizes:z0?Array.from(Z0().subarray(Number(f0)>>>0,Number(f0)+z0>>>0)):[],pastPresentShareBuffer:!!A0})},853731:(_)=>{G.kb("BiasAdd",_,void 0)},853786:(_)=>{G.kb("BiasSplitGelu",_,void 0)},853847:(_)=>{G.kb("FastGelu",_,void 0)},853903:(_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9,y1,D4)=>{G.kb("Conv",_,{format:p5?"NHWC":"NCHW",auto_pad:y,dilations:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[],group:g,kernel_shape:J0?Array.from(Z0().subarray(Number(J0)>>>0,Number(z0)>>>0)):[],pads:f0?Array.from(Z0().subarray(Number(f0)>>>0,Number(A0)>>>0)):[],strides:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],w_is_const:()=>!!n()[Number(J6)>>>0],activation:V6(q9),activation_params:y1?Array.from(q5().subarray(Number(y1)>>>0,Number(D4)>>>0)):[]})},854487:(_)=>{G.kb("Gelu",_,void 0)},854539:(_,y,f,B,g,J0,z0,f0,A0)=>{G.kb("GroupQueryAttention",_,{numHeads:y,kvNumHeads:f,scale:B,softcap:g,doRotary:J0,rotaryInterleaved:z0,smoothSoftmax:f0,localWindowSize:A0})},854756:(_,y,f,B)=>{G.kb("LayerNormalization",_,{axis:y,epsilon:f,simplified:!!B})},854867:(_,y,f,B)=>{G.kb("LayerNormalization",_,{axis:y,epsilon:f,simplified:!!B})},854978:(_,y,f,B,g,J0)=>{G.kb("MatMulNBits",_,{k:y,n:f,accuracyLevel:B,bits:g,blockSize:J0})},855105:(_,y,f,B,g,J0)=>{G.kb("MultiHeadAttention",_,{numHeads:y,isUnidirectional:f,maskFilterValue:B,scale:g,doRotary:J0})},855264:(_,y)=>{G.kb("QuickGelu",_,{alpha:y})},855328:(_,y,f,B,g)=>{G.kb("RotaryEmbedding",_,{interleaved:!!y,numHeads:f,rotaryEmbeddingDim:B,scale:g})},855467:(_,y,f)=>{G.kb("SkipLayerNormalization",_,{epsilon:y,simplified:!!f})},855569:(_,y,f)=>{G.kb("SkipLayerNormalization",_,{epsilon:y,simplified:!!f})},855671:(_,y,f,B)=>{G.kb("GatherBlockQuantized",_,{gatherAxis:y,quantizeAxis:f,blockSize:B})},855792:(_)=>{G.$b(_)},855826:(_,y)=>G.bc(Number(_),Number(y),G.Gb.ec,G.Gb.errors)};function U5(_,y,f){return U9(async()=>{await G.Yb(Number(_),Number(y),Number(f))})}function T0(){return typeof wasmOffsetConverter<"u"}class s0{name="ExitStatus";constructor(_){this.message=`Program terminated with exit(${_})`,this.status=_}}var D5=(_)=>{_.terminate(),_.onmessage=()=>{}},L5=[],d5=(_)=>{y0.length==0&&(Q5(),g5(y0[0]));var y=y0.pop();if(!y)return 6;O0.push(y),w0[_.Bb]=y,y.Bb=_.Bb;var f={Cb:"run",hc:_.fc,Ib:_.Ib,Bb:_.Bb};return y.postMessage(f,_.Nb),0},T5=0,$5=(_,y,...f)=>{for(var B=2*f.length,g=b6(),J0=Q1(8*B),z0=J0>>>3,f0=0;f0>>0]=A0)}return _=w2(_,0,B,J0,y),E1(g),_};function V5(_){if(J)return $5(0,1,_);if(E=_,!(0{if(E=_,J)throw U6(_),"unwind";V5(_)},y0=[],O0=[],I0=[],w0={},H5=(_)=>{var y=_.Bb;delete w0[y],y0.push(_),O0.splice(O0.indexOf(_),1),_.Bb=0,j2(y)};function N5(){I0.forEach((_)=>_())}var g5=(_)=>new Promise((y)=>{_.onmessage=(g)=>{var J0=(g=g.data).Cb;if(g.Hb&&g.Hb!=Q9()){var z0=w0[g.Hb];z0?z0.postMessage(g,g.Nb):w(`Internal error! Worker sent a message "${J0}" to target pthread ${g.Hb}, but that thread no longer exists!`)}else J0==="checkMailbox"?P5():J0==="spawnThread"?d5(g):J0==="cleanupThread"?H5(w0[g.ic]):J0==="loaded"?(_.loaded=!0,y(_)):J0==="alert"?alert(`Thread ${g.jc}: ${g.text}`):g.target==="setimmediate"?_.postMessage(g):J0==="callHandler"?G[g.Rb](...g.args):J0&&w(`worker sent an unknown command ${J0}`)},_.onerror=(g)=>{throw w(`worker sent an error! ${g.filename}:${g.lineno}: ${g.message}`),g};var f,B=[];for(f of[])G.propertyIsEnumerable(f)&&B.push(f);_.postMessage({Cb:"load",Sb:B,lc:T,mc:W})});function Q5(){var _=new Worker((()=>{let y=URL;return import.meta.url>"file:"&&import.meta.url<"file;"?new y("ort.bundle.min.mjs",import.meta.url):new URL(import.meta.url)})(),{type:"module",workerData:"em-pthread",name:"em-pthread"});y0.push(_)}var S5=(_)=>{P0();var y=M0()[_+52>>>2>>>0];_=M0()[_+56>>>2>>>0],O2(y,y-_),E1(y)},K6=(_,y)=>{T5=0,_=Q2(_,y),0>>=0);throw y>>>=0,f>>>=0,M0()[B.Jb+16>>>2>>>0]=0,M0()[B.Jb+4>>>2>>>0]=y,M0()[B.Jb+8>>>2>>>0]=f,_}function Z6(_,y,f,B){return J?$5(2,1,_,y,f,B):c6(_,y,f,B)}function c6(_,y,f,B){if(_>>>=0,f>>>=0,B>>>=0,R===void 0)return 6;var g=[];return J&&g.length===0?Z6(_,y>>>=0,f,B):(_={fc:f,Bb:_,Ib:B,Nb:g},J?(_.Cb="spawnThread",postMessage(_,g),0):d5(_))}var Y9=typeof TextDecoder<"u"?new TextDecoder:void 0,y9=(_,y=0,f=NaN)=>{var B=(y>>>=0)+f;for(f=y;_[f]&&!(f>=B);)++f;if(16(g=(240&g)==224?(15&g)<<12|J0<<6|z0:(7&g)<<18|J0<<12|z0<<6|63&_[y++])?B+=String.fromCharCode(g):(g-=65536,B+=String.fromCharCode(55296|g>>10,56320|1023&g))}}else B+=String.fromCharCode(g)}return B},V6=(_,y)=>(_>>>=0)?y9(R0(),_,y):"";function a9(_,y,f){return J?$5(3,1,_,y,f):0}function I9(_,y){if(J)return $5(4,1,_,y)}var z6=(_)=>{for(var y=0,f=0;f<_.length;++f){var B=_.charCodeAt(f);127>=B?y++:2047>=B?y+=2:55296<=B&&57343>=B?(y+=4,++f):y+=3}return y},_5=(_,y,f)=>{var B=R0();if(y>>>=0,0=z0&&(z0=65536+((1023&z0)<<10)|1023&_.charCodeAt(++J0)),127>=z0){if(y>=f)break;B[y++>>>0]=z0}else{if(2047>=z0){if(y+1>=f)break;B[y++>>>0]=192|z0>>6}else{if(65535>=z0){if(y+2>=f)break;B[y++>>>0]=224|z0>>12}else{if(y+3>=f)break;B[y++>>>0]=240|z0>>18,B[y++>>>0]=128|z0>>12&63}B[y++>>>0]=128|z0>>6&63}B[y++>>>0]=128|63&z0}}B[y>>>0]=0,_=y-g}else _=0;return _};function E5(_,y){if(J)return $5(5,1,_,y)}function v5(_,y,f){if(J)return $5(6,1,_,y,f)}function o6(_,y,f){return J?$5(7,1,_,y,f):0}function b9(_,y){if(J)return $5(8,1,_,y)}function H1(_,y,f){if(J)return $5(9,1,_,y,f)}function x1(_,y,f,B){if(J)return $5(10,1,_,y,f,B)}function o9(_,y,f,B){if(J)return $5(11,1,_,y,f,B)}function L1(_,y,f,B){if(J)return $5(12,1,_,y,f,B)}function _1(_){if(J)return $5(13,1,_)}function z9(_,y){if(J)return $5(14,1,_,y)}function D9(_,y,f){if(J)return $5(15,1,_,y,f)}var p9,J9,Y1=()=>t0(""),t6=(_)=>{for(var y="";R0()[_>>>0];)y+=p9[R0()[_++>>>0]];return y},f9={},r9={};function G9(_,y,f={}){return function(B,g,J0={}){var z0=g.name;if(!B)throw new J9(`type "${z0}" must have a positive integer typeid pointer`);if(r9.hasOwnProperty(B)){if(J0.Tb)return;throw new J9(`Cannot register type '${z0}' twice`)}r9[B]=g,f9.hasOwnProperty(B)&&(g=f9[B],delete f9[B],g.forEach((f0)=>f0()))}(_,y,f)}var S1=(_,y,f)=>{switch(y){case 1:return f?(B)=>n()[B>>>0]:(B)=>R0()[B>>>0];case 2:return f?(B)=>q0()[B>>>1>>>0]:(B)=>p0()[B>>>1>>>0];case 4:return f?(B)=>Z0()[B>>>2>>>0]:(B)=>M0()[B>>>2>>>0];case 8:return f?(B)=>$0[B>>>3]:(B)=>i[B>>>3];default:throw TypeError(`invalid integer width (${y}): ${_}`)}};function A1(_,y,f){f>>>=0,G9(_>>>=0,{name:y=t6(y>>>0),fromWireType:(B)=>B,toWireType:function(B,g){if(typeof g!="bigint"&&typeof g!="number")throw g=g===null?"null":(B=typeof g)=="object"||B==="array"||B==="function"?g.toString():""+g,TypeError(`Cannot convert "${g}" to ${this.name}`);return typeof g=="number"&&(g=BigInt(g)),g},Db:x9,readValueFromPointer:S1(y,f,y.indexOf("u")==-1),Eb:null})}var x9=8;function q1(_,y,f,B){G9(_>>>=0,{name:y=t6(y>>>0),fromWireType:function(g){return!!g},toWireType:function(g,J0){return J0?f:B},Db:x9,readValueFromPointer:function(g){return this.fromWireType(R0()[g>>>0])},Eb:null})}var n9=[],v9=[];function L6(_){9<(_>>>=0)&&--v9[_+1]==0&&(v9[_]=void 0,n9.push(_))}var m6=(_)=>{if(!_)throw new J9("Cannot use deleted val. handle = "+_);return v9[_]},p6=(_)=>{switch(_){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let y=n9.pop()||v9.length;return v9[y]=_,v9[y+1]=1,y}};function B0(_){return this.fromWireType(M0()[_>>>2>>>0])}var P1={name:"emscripten::val",fromWireType:(_)=>{var y=m6(_);return L6(_),y},toWireType:(_,y)=>p6(y),Db:x9,readValueFromPointer:B0,Eb:null};function g1(_){return G9(_>>>0,P1)}var u1=(_,y)=>{switch(y){case 4:return function(f){return this.fromWireType(q5()[f>>>2>>>0])};case 8:return function(f){return this.fromWireType(E0()[f>>>3>>>0])};default:throw TypeError(`invalid float width (${y}): ${_}`)}};function d1(_,y,f){f>>>=0,G9(_>>>=0,{name:y=t6(y>>>0),fromWireType:(B)=>B,toWireType:(B,g)=>g,Db:x9,readValueFromPointer:u1(y,f),Eb:null})}function V1(_,y,f,B,g){if(_>>>=0,f>>>=0,y=t6(y>>>0),g===-1&&(g=4294967295),g=(f0)=>f0,B===0){var J0=32-8*f;g=(f0)=>f0<>>J0}var z0=y.includes("unsigned")?function(f0,A0){return A0>>>0}:function(f0,A0){return A0};G9(_,{name:y,fromWireType:g,toWireType:z0,Db:x9,readValueFromPointer:S1(y,f,B!==0),Eb:null})}function W1(_,y,f){function B(J0){var z0=M0()[J0>>>2>>>0];return J0=M0()[J0+4>>>2>>>0],new g(n().buffer,J0,z0)}var g=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][y];G9(_>>>=0,{name:f=t6(f>>>0),fromWireType:B,Db:x9,readValueFromPointer:B},{Tb:!0})}function M1(_,y){G9(_>>>=0,{name:y=t6(y>>>0),fromWireType:function(f){for(var B,g=M0()[f>>>2>>>0],J0=f+4,z0=J0,f0=0;f0<=g;++f0){var A0=J0+f0;f0!=g&&R0()[A0>>>0]!=0||(z0=V6(z0,A0-z0),B===void 0?B=z0:(B+="\x00",B+=z0),z0=A0+1)}return c9(f),B},toWireType:function(f,B){B instanceof ArrayBuffer&&(B=new Uint8Array(B));var g=typeof B=="string";if(!(g||B instanceof Uint8Array||B instanceof Uint8ClampedArray||B instanceof Int8Array))throw new J9("Cannot pass non-string to std::string");var J0=g?z6(B):B.length,z0=v1(4+J0+1),f0=z0+4;if(M0()[z0>>>2>>>0]=J0,g)_5(B,f0,J0+1);else if(g)for(g=0;g>>0]=A0}else for(g=0;g>>0]=B[g];return f!==null&&f.push(c9,z0),z0},Db:x9,readValueFromPointer:B0,Eb(f){c9(f)}})}var R1=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,l1=(_,y)=>{for(var f=_>>1,B=f+y/2;!(f>=B)&&p0()[f>>>0];)++f;if(32<(f<<=1)-_&&R1)return R1.decode(R0().slice(_,f));for(f="",B=0;!(B>=y/2);++B){var g=q0()[_+2*B>>>1>>>0];if(g==0)break;f+=String.fromCharCode(g)}return f},N1=(_,y,f)=>{if(f??=2147483647,2>f)return 0;var B=y;f=(f-=2)<2*_.length?f/2:_.length;for(var g=0;g>>1>>>0]=J0,y+=2}return q0()[y>>>1>>>0]=0,y-B},p=(_)=>2*_.length,x0=(_,y)=>{for(var f=0,B="";!(f>=y/4);){var g=Z0()[_+4*f>>>2>>>0];if(g==0)break;++f,65536<=g?(g-=65536,B+=String.fromCharCode(55296|g>>10,56320|1023&g)):B+=String.fromCharCode(g)}return B},X0=(_,y,f)=>{if(y>>>=0,f??=2147483647,4>f)return 0;var B=y;f=B+f-4;for(var g=0;g<_.length;++g){var J0=_.charCodeAt(g);if(55296<=J0&&57343>=J0&&(J0=65536+((1023&J0)<<10)|1023&_.charCodeAt(++g)),Z0()[y>>>2>>>0]=J0,(y+=4)+4>f)break}return Z0()[y>>>2>>>0]=0,y-B},W0=(_)=>{for(var y=0,f=0;f<_.length;++f){var B=_.charCodeAt(f);55296<=B&&57343>=B&&++f,y+=4}return y};function h0(_,y,f){if(_>>>=0,y>>>=0,f=t6(f>>>=0),y===2)var B=l1,g=N1,J0=p,z0=(f0)=>p0()[f0>>>1>>>0];else y===4&&(B=x0,g=X0,J0=W0,z0=(f0)=>M0()[f0>>>2>>>0]);G9(_,{name:f,fromWireType:(f0)=>{for(var A0,Z5=M0()[f0>>>2>>>0],M5=f0+4,p5=0;p5<=Z5;++p5){var J6=f0+4+p5*y;p5!=Z5&&z0(J6)!=0||(M5=B(M5,J6-M5),A0===void 0?A0=M5:(A0+="\x00",A0+=M5),M5=J6+y)}return c9(f0),A0},toWireType:(f0,A0)=>{if(typeof A0!="string")throw new J9(`Cannot pass non-string to C++ string type ${f}`);var Z5=J0(A0),M5=v1(4+Z5+y);return M0()[M5>>>2>>>0]=Z5/y,g(A0,M5+4,Z5+y),f0!==null&&f0.push(c9,M5),M5},Db:x9,readValueFromPointer:B0,Eb(f0){c9(f0)}})}function c0(_,y){G9(_>>>=0,{Ub:!0,name:y=t6(y>>>0),Db:0,fromWireType:()=>{},toWireType:()=>{}})}function F5(_){$2(_>>>0,!N,1,!V,131072,!1),N5()}var W5=(_)=>{if(!F0)try{if(_(),!(0>>=0,typeof Atomics.kc=="function"&&(Atomics.kc(Z0(),_>>>2,_).value.then(P5),_+=128,Atomics.store(Z0(),_>>>2,1))}var P5=()=>{var _=Q9();_&&(b5(_),W5(U2))};function S6(_,y){(_>>>=0)==y>>>0?setTimeout(P5):J?postMessage({Hb:_,Cb:"checkMailbox"}):(_=w0[_])&&_.postMessage({Cb:"checkMailbox"})}var _6=[];function O9(_,y,f,B,g){for(y>>>=0,B/=2,_6.length=B,f=g>>>0>>>3,g=0;g>>0];return(y?R5[y]:b2[_])(..._6)}var g6=()=>{T5=0};function k9(_){_>>>=0,J?postMessage({Cb:"cleanupThread",ic:_}):H5(w0[_])}function w9(_){}var Z9=(_,y)=>{var f=r9[_];if(f===void 0)throw _=t1(_),f=t6(_),c9(_),new J9(`${y} has unknown type ${f}`);return f},s9=(_,y,f)=>{var B=[];return _=_.toWireType(B,f),B.length&&(M0()[y>>>2>>>0]=p6(B)),_};function J1(_,y,f){return y>>>=0,f>>>=0,_=m6(_>>>0),y=Z9(y,"emval::as"),s9(y,f,_)}function P6(_,y){return y>>>=0,_=m6(_>>>0),(y=Z9(y,"emval::as")).toWireType(null,_)}var Q6=(_)=>{try{_()}catch(y){t0(y)}},C6=0,N6=null,s6=0,C5=[],k6={},E9={},R9=0,B6=null,B5=[];function U9(_){return function(){if(!F0){if(C6===0){var y=!1,f=!1;((B)=>{_().then(B)})((B=0)=>{if(!F0&&(s6=B,y=!0,f)){C6=2,Q6(()=>B2(N6)),typeof MainLoop<"u"&&MainLoop.Qb&&MainLoop.resume(),B=!1;try{var g=(f0=Z0()[N6+8>>>2>>>0],f0=i5[E9[f0]],--T5,f0())}catch(A0){g=A0,B=!0}var J0=!1;if(!N6){var z0=B6;z0&&(B6=null,(B?z0.reject:z0.resolve)(g),J0=!0)}if(B&&!J0)throw g}var f0}),f=!0,y||(C6=1,N6=function(){var B=v1(65548),g=B+12;M0()[B>>>2>>>0]=g,M0()[B+4>>>2>>>0]=g+65536,g=C5[0];var J0=k6[g];return J0===void 0&&(J0=R9++,k6[g]=J0,E9[J0]=g),g=J0,Z0()[B+8>>>2>>>0]=g,B}(),typeof MainLoop<"u"&&MainLoop.Qb&&MainLoop.pause(),Q6(()=>H2(N6)))}else C6===2?(C6=0,Q6(b),c9(N6),N6=null,B5.forEach(W5)):t0(`invalid state: ${C6}`);return s6}}()}function u0(_){return _>>>=0,U9(async()=>{var y=await m6(_);return p6(y)})}var h5=[];function V2(_,y,f,B){return f>>>=0,B>>>=0,(_=h5[_>>>0])(null,y=m6(y>>>0),f,B)}var s2={},X1=(_)=>{var y=s2[_];return y===void 0?t6(_):y};function i2(_,y,f,B,g){return f>>>=0,B>>>=0,g>>>=0,(_=h5[_>>>0])(y=m6(y>>>0),y[f=X1(f)],B,g)}function a2(_,y){return y>>>=0,(_=m6(_>>>0))==m6(y)}var T2=()=>typeof globalThis=="object"?globalThis:Function("return this")();function o1(_){return(_>>>=0)==0?p6(T2()):(_=X1(_),p6(T2()[_]))}var B3=(_)=>{var y=h5.length;return h5.push(_),y},r2=(_,y)=>{for(var f=Array(_),B=0;B<_;++B)f[B]=Z9(M0()[y+4*B>>>2>>>0],"parameter "+B);return f},n2=(_,y)=>Object.defineProperty(y,"name",{value:_});function A9(_,y,f){var B=(y=r2(_,y>>>0)).shift();_--;var g=`return function (obj, func, destructorsRef, args) { +`,J0=0,z0=[];f===0&&z0.push("obj");for(var f0=["retType"],A0=[B],Z5=0;Z5<_;++Z5)z0.push("arg"+Z5),f0.push("argType"+Z5),A0.push(y[Z5]),g+=` var arg${Z5} = argType${Z5}.readValueFromPointer(args${J0?"+"+J0:""}); +`,J0+=y[Z5].Db;return g+=` var rv = ${f===1?"new func":"func.call"}(${z0.join(", ")}); +`,B.Ub||(f0.push("emval_returnValue"),A0.push(s9),g+=` return emval_returnValue(retType, destructorsRef, rv); +`),f0.push(g+`}; +`),_=function(M5){var p5=Function;if(!(p5 instanceof Function))throw TypeError(`new_ called with constructor type ${typeof p5} which is not a function`);var J6=n2(p5.name||"unknownFunctionName",function(){});return J6.prototype=p5.prototype,J6=new J6,(M5=p5.apply(J6,M5))instanceof Object?M5:J6}(f0)(...A0),f=`methodCaller<(${y.map((M5)=>M5.name).join(", ")}) => ${B.name}>`,B3(n2(f,_))}function h3(_){return _=X1(_>>>0),p6(G[_])}function s1(_,y){return y>>>=0,_=m6(_>>>0),y=m6(y),p6(_[y])}function c3(_){9<(_>>>=0)&&(v9[_+1]+=1)}function m3(){return p6([])}function p3(_){_=m6(_>>>0);for(var y=Array(_.length),f=0;f<_.length;f++)y[f]=_[f];return p6(y)}function A3(_){return p6(X1(_>>>0))}function g3(){return p6({})}function i1(_){for(var y=m6(_>>>=0);y.length;){var f=y.pop();y.pop()(f)}L6(_)}function u3(_,y,f){y>>>=0,f>>>=0,_=m6(_>>>0),y=m6(y),f=m6(f),_[y]=f}function d3(_,y){return y>>>=0,_=(_=Z9(_>>>0,"_emval_take_value")).readValueFromPointer(y),p6(_)}function t2(_,y){_=-9007199254740992>_||9007199254740992<_?NaN:Number(_),y>>>=0,_=new Date(1000*_),Z0()[y>>>2>>>0]=_.getUTCSeconds(),Z0()[y+4>>>2>>>0]=_.getUTCMinutes(),Z0()[y+8>>>2>>>0]=_.getUTCHours(),Z0()[y+12>>>2>>>0]=_.getUTCDate(),Z0()[y+16>>>2>>>0]=_.getUTCMonth(),Z0()[y+20>>>2>>>0]=_.getUTCFullYear()-1900,Z0()[y+24>>>2>>>0]=_.getUTCDay(),_=(_.getTime()-Date.UTC(_.getUTCFullYear(),0,1,0,0,0,0))/86400000|0,Z0()[y+28>>>2>>>0]=_}var F2=(_)=>_%4==0&&(_%100!=0||_%400==0),g9=[0,31,60,91,121,152,182,213,244,274,305,335],y2=[0,31,59,90,120,151,181,212,243,273,304,334];function l3(_,y){_=-9007199254740992>_||9007199254740992<_?NaN:Number(_),y>>>=0,_=new Date(1000*_),Z0()[y>>>2>>>0]=_.getSeconds(),Z0()[y+4>>>2>>>0]=_.getMinutes(),Z0()[y+8>>>2>>>0]=_.getHours(),Z0()[y+12>>>2>>>0]=_.getDate(),Z0()[y+16>>>2>>>0]=_.getMonth(),Z0()[y+20>>>2>>>0]=_.getFullYear()-1900,Z0()[y+24>>>2>>>0]=_.getDay();var f=(F2(_.getFullYear())?g9:y2)[_.getMonth()]+_.getDate()-1|0;Z0()[y+28>>>2>>>0]=f,Z0()[y+36>>>2>>>0]=-60*_.getTimezoneOffset(),f=new Date(_.getFullYear(),6,1).getTimezoneOffset();var B=new Date(_.getFullYear(),0,1).getTimezoneOffset();_=0|(f!=B&&_.getTimezoneOffset()==Math.min(B,f)),Z0()[y+32>>>2>>>0]=_}function e2(_){_>>>=0;var y=new Date(Z0()[_+20>>>2>>>0]+1900,Z0()[_+16>>>2>>>0],Z0()[_+12>>>2>>>0],Z0()[_+8>>>2>>>0],Z0()[_+4>>>2>>>0],Z0()[_>>>2>>>0],0),f=Z0()[_+32>>>2>>>0],B=y.getTimezoneOffset(),g=new Date(y.getFullYear(),6,1).getTimezoneOffset(),J0=new Date(y.getFullYear(),0,1).getTimezoneOffset(),z0=Math.min(J0,g);return 0>f?Z0()[_+32>>>2>>>0]=+(g!=J0&&z0==B):0>>2>>>0]=y.getDay(),f=(F2(y.getFullYear())?g9:y2)[y.getMonth()]+y.getDate()-1|0,Z0()[_+28>>>2>>>0]=f,Z0()[_>>>2>>>0]=y.getSeconds(),Z0()[_+4>>>2>>>0]=y.getMinutes(),Z0()[_+8>>>2>>>0]=y.getHours(),Z0()[_+12>>>2>>>0]=y.getDate(),Z0()[_+16>>>2>>>0]=y.getMonth(),Z0()[_+20>>>2>>>0]=y.getYear(),_=y.getTime(),BigInt(isNaN(_)?-1:_/1000)}function N2(_,y,f,B,g,J0,z0){return J?$5(16,1,_,y,f,B,g,J0,z0):-52}function K1(_,y,f,B,g,J0){if(J)return $5(17,1,_,y,f,B,g,J0)}var b1={},$3=()=>performance.timeOrigin+performance.now();function z2(_,y){if(J)return $5(18,1,_,y);if(b1[_]&&(clearTimeout(b1[_].id),delete b1[_]),!y)return 0;var f=setTimeout(()=>{delete b1[_],W5(()=>E2(_,performance.timeOrigin+performance.now()))},y);return b1[_]={id:f,rc:y},0}function Z4(_,y,f,B){_>>>=0,y>>>=0,f>>>=0,B>>>=0;var g=new Date().getFullYear(),J0=new Date(g,0,1).getTimezoneOffset();g=new Date(g,6,1).getTimezoneOffset();var z0=Math.max(J0,g);M0()[_>>>2>>>0]=60*z0,Z0()[y>>>2>>>0]=+(J0!=g),_=(y=(f0)=>{var A0=Math.abs(f0);return`UTC${0<=f0?"-":"+"}${String(Math.floor(A0/60)).padStart(2,"0")}${String(A0%60).padStart(2,"0")}`})(J0),y=y(g),gDate.now();function h9(_,y,f){return 0<=_&&3>=_?(_=_===0?Date.now():performance.timeOrigin+performance.now(),$0[f>>>0>>>3]=BigInt(Math.round(1e6*_)),0):28}var J2=[],f1=(_,y)=>{J2.length=0;for(var f;f=R0()[_++>>>0];){var B=f!=105;y+=(B&=f!=112)&&y%8?4:0,J2.push(f==112?M0()[y>>>2>>>0]:f==106?$0[y>>>3]:f==105?Z0()[y>>>2>>>0]:E0()[y>>>3>>>0]),y+=B?8:4}return J2};function j3(_,y,f){return _>>>=0,y=f1(y>>>0,f>>>0),R5[_](...y)}function t9(_,y,f){return _>>>=0,y=f1(y>>>0,f>>>0),R5[_](...y)}var s3=()=>{};function i3(_,y){return w(V6(_>>>0,y>>>0))}var a3=()=>{throw T5+=1,"unwind"};function r3(){return 4294901760}var n3=()=>navigator.hardwareConcurrency;function k2(){return t0("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function a1(_){_>>>=0;var y=R0().length;if(_<=y||4294901760<_)return!1;for(var f=1;4>=f;f*=2){var B=y*(1+0.2/f);B=Math.min(B,_+100663296);$:{B=(Math.min(4294901760,65536*Math.ceil(Math.max(_,B)/65536))-T.buffer.byteLength+65535)/65536|0;try{T.grow(B),P0();var g=1;break $}catch{}g=void 0}if(g)return!0}return!1}var U1=()=>(t0("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),T1={},F1=(_)=>{_.forEach((y)=>{U1()})};function e9(){var _=Error().stack.toString().split(` +`);return _[0]=="Error"&&_.shift(),F1(_),T1.Mb=U1(),T1.dc=_,T1.Mb}function O3(_,y,f){if(_>>>=0,y>>>=0,T1.Mb==_)var B=T1.dc;else(B=Error().stack.toString().split(` +`))[0]=="Error"&&B.shift(),F1(B);for(var g=3;B[g]&&U1()!=_;)++g;for(_=0;_>>2>>>0]=U1();return _}var r1,I2={},D2=()=>{if(!r1){var _,y={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for(_ in I2)I2[_]===void 0?delete y[_]:y[_]=I2[_];var f=[];for(_ in y)f.push(`${_}=${y[_]}`);r1=f}return r1};function v2(_,y){if(J)return $5(19,1,_,y);_>>>=0,y>>>=0;var f=0;return D2().forEach((B,g)=>{var J0=y+f;for(g=M0()[_+4*g>>>2>>>0]=J0,J0=0;J0>>0]=B.charCodeAt(J0);n()[g>>>0]=0,f+=B.length+1}),0}function W2(_,y){if(J)return $5(20,1,_,y);_>>>=0,y>>>=0;var f=D2();M0()[_>>>2>>>0]=f.length;var B=0;return f.forEach((g)=>B+=g.length+1),M0()[y>>>2>>>0]=B,0}function M2(_){return J?$5(21,1,_):52}function K2(_,y,f,B){return J?$5(22,1,_,y,f,B):52}function G3(_,y,f,B){return J?$5(23,1,_,y,f,B):70}var Z3=[null,[],[]];function w1(_,y,f,B){if(J)return $5(24,1,_,y,f,B);y>>>=0,f>>>=0,B>>>=0;for(var g=0,J0=0;J0>>2>>>0],f0=M0()[y+4>>>2>>>0];y+=8;for(var A0=0;A0>>0],M5=Z3[_];Z5===0||Z5===10?((_===1?z:w)(y9(M5)),M5.length=0):M5.push(Z5)}g+=f0}return M0()[B>>>2>>>0]=g,0}J||function(){for(var _=G.numThreads-1;_--;)Q5();L5.unshift(()=>{var y;r0++,y=()=>J5(),J?y():Promise.all(y0.map(g5)).then(y)})}();for(var n1=Array(256),o5=0;256>o5;++o5)n1[o5]=String.fromCharCode(o5);p9=n1,J9=G.BindingError=class extends Error{constructor(_){super(_),this.name="BindingError"}},G.InternalError=class extends Error{constructor(_){super(_),this.name="InternalError"}},v9.push(0,1,void 0,1,null,1,!0,1,!1,1),G.count_emval_handles=()=>v9.length/2-5-n9.length;var i5,b2=[V5,U6,Z6,a9,I9,E5,v5,o6,b9,H1,x1,o9,L1,_1,z9,D9,N2,K1,z2,v2,W2,M2,K2,G3,w1];(async function(){function _(B,g){return i5=B.exports,i5=function(){var A0=i5,Z5={};for(let[M5,p5]of Object.entries(A0))Z5[M5]=typeof p5=="function"?(...J6)=>{C5.push(M5);try{return p5(...J6)}finally{F0||(C5.pop(),N6&&C6===1&&C5.length===0&&(C6=0,T5+=1,Q6(C2),typeof Fibers<"u"&&Fibers.sc()))}}:p5;return Z5}(),J0=i5,z0=(A0)=>(Z5)=>A0(Z5)>>>0,f0=(A0)=>()=>A0()>>>0,(J0=Object.assign({},J0)).Ea=z0(J0.Ea),J0.gb=f0(J0.gb),J0.ib=z0(J0.ib),J0.ub=z0(J0.ub),J0.vb=f0(J0.vb),J0.__cxa_get_exception_ptr=z0(J0.__cxa_get_exception_ptr),i5=J0,I0.push(i5.jb),W=g,J5(),i5;var J0,z0,f0}r0++;var y=y5();if(G.instantiateWasm)return new Promise((B)=>{G.instantiateWasm(y,(g,J0)=>{_(g,J0),B(g.exports)})});if(J)return new Promise((B)=>{e0=(g)=>{var J0=new WebAssembly.Instance(g,y5());B(_(J0,g))}});a0??=G.locateFile?G.locateFile?G.locateFile("ort-wasm-simd-threaded.jsep.wasm",D):D+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href;try{var f=await async function(B){var g=a0;if(!S0&&typeof WebAssembly.instantiateStreaming=="function"&&!s(g))try{var J0=fetch(g,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(J0,B)}catch(z0){w(`wasm streaming compile failed: ${z0}`),w("falling back to ArrayBuffer instantiation")}return async function(z0,f0){try{var A0=await async function(Z5){if(!S0)try{var M5=await L(Z5);return new Uint8Array(M5)}catch{}if(Z5==a0&&S0)Z5=new Uint8Array(S0);else{if(!Y)throw"both async and sync fetching of the wasm failed";Z5=Y(Z5)}return Z5}(z0);return await WebAssembly.instantiate(A0,f0)}catch(Z5){w(`failed to asynchronously prepare wasm: ${Z5}`),t0(Z5)}}(g,B)}(y);return _(f.instance,f.module)}catch(B){return O(B),Promise.reject(B)}})();var t1=(_)=>(t1=i5.Ea)(_),e1=()=>(e1=i5.Fa)();G._OrtInit=(_,y)=>(G._OrtInit=i5.Ga)(_,y),G._OrtGetLastError=(_,y)=>(G._OrtGetLastError=i5.Ha)(_,y),G._OrtCreateSessionOptions=(_,y,f,B,g,J0,z0,f0,A0,Z5)=>(G._OrtCreateSessionOptions=i5.Ia)(_,y,f,B,g,J0,z0,f0,A0,Z5),G._OrtAppendExecutionProvider=(_,y,f,B,g)=>(G._OrtAppendExecutionProvider=i5.Ja)(_,y,f,B,g),G._OrtAddFreeDimensionOverride=(_,y,f)=>(G._OrtAddFreeDimensionOverride=i5.Ka)(_,y,f),G._OrtAddSessionConfigEntry=(_,y,f)=>(G._OrtAddSessionConfigEntry=i5.La)(_,y,f),G._OrtReleaseSessionOptions=(_)=>(G._OrtReleaseSessionOptions=i5.Ma)(_),G._OrtCreateSession=(_,y,f)=>(G._OrtCreateSession=i5.Na)(_,y,f),G._OrtReleaseSession=(_)=>(G._OrtReleaseSession=i5.Oa)(_),G._OrtGetInputOutputCount=(_,y,f)=>(G._OrtGetInputOutputCount=i5.Pa)(_,y,f),G._OrtGetInputOutputMetadata=(_,y,f,B)=>(G._OrtGetInputOutputMetadata=i5.Qa)(_,y,f,B),G._OrtFree=(_)=>(G._OrtFree=i5.Ra)(_),G._OrtCreateTensor=(_,y,f,B,g,J0)=>(G._OrtCreateTensor=i5.Sa)(_,y,f,B,g,J0),G._OrtGetTensorData=(_,y,f,B,g)=>(G._OrtGetTensorData=i5.Ta)(_,y,f,B,g),G._OrtReleaseTensor=(_)=>(G._OrtReleaseTensor=i5.Ua)(_),G._OrtCreateRunOptions=(_,y,f,B)=>(G._OrtCreateRunOptions=i5.Va)(_,y,f,B),G._OrtAddRunConfigEntry=(_,y,f)=>(G._OrtAddRunConfigEntry=i5.Wa)(_,y,f),G._OrtReleaseRunOptions=(_)=>(G._OrtReleaseRunOptions=i5.Xa)(_),G._OrtCreateBinding=(_)=>(G._OrtCreateBinding=i5.Ya)(_),G._OrtBindInput=(_,y,f)=>(G._OrtBindInput=i5.Za)(_,y,f),G._OrtBindOutput=(_,y,f,B)=>(G._OrtBindOutput=i5._a)(_,y,f,B),G._OrtClearBoundOutputs=(_)=>(G._OrtClearBoundOutputs=i5.$a)(_),G._OrtReleaseBinding=(_)=>(G._OrtReleaseBinding=i5.ab)(_),G._OrtRunWithBinding=(_,y,f,B,g)=>(G._OrtRunWithBinding=i5.bb)(_,y,f,B,g),G._OrtRun=(_,y,f,B,g,J0,z0,f0)=>(G._OrtRun=i5.cb)(_,y,f,B,g,J0,z0,f0),G._OrtEndProfiling=(_)=>(G._OrtEndProfiling=i5.db)(_),G._JsepOutput=(_,y,f)=>(G._JsepOutput=i5.eb)(_,y,f),G._JsepGetNodeName=(_)=>(G._JsepGetNodeName=i5.fb)(_);var Q9=()=>(Q9=i5.gb)(),c9=G._free=(_)=>(c9=G._free=i5.hb)(_),v1=G._malloc=(_)=>(v1=G._malloc=i5.ib)(_),$2=(_,y,f,B,g,J0)=>($2=i5.lb)(_,y,f,B,g,J0),f2=()=>(f2=i5.mb)(),w2=(_,y,f,B,g)=>(w2=i5.nb)(_,y,f,B,g),j2=(_)=>(j2=i5.ob)(_),R2=(_)=>(R2=i5.pb)(_),E2=(_,y)=>(E2=i5.qb)(_,y),U2=()=>(U2=i5.rb)(),O2=(_,y)=>(O2=i5.sb)(_,y),E1=(_)=>(E1=i5.tb)(_),Q1=(_)=>(Q1=i5.ub)(_),b6=()=>(b6=i5.vb)(),Q2=G.dynCall_ii=(_,y)=>(Q2=G.dynCall_ii=i5.wb)(_,y),H2=(_)=>(H2=i5.xb)(_),C2=()=>(C2=i5.yb)(),B2=(_)=>(B2=i5.zb)(_),b=()=>(b=i5.Ab)();return G.stackSave=()=>b6(),G.stackRestore=(_)=>E1(_),G.stackAlloc=(_)=>Q1(_),G.setValue=function(_,y,f="i8"){switch(f.endsWith("*")&&(f="*"),f){case"i1":case"i8":n()[_>>>0]=y;break;case"i16":q0()[_>>>1>>>0]=y;break;case"i32":Z0()[_>>>2>>>0]=y;break;case"i64":$0[_>>>3]=BigInt(y);break;case"float":q5()[_>>>2>>>0]=y;break;case"double":E0()[_>>>3>>>0]=y;break;case"*":M0()[_>>>2>>>0]=y;break;default:t0(`invalid type for setValue: ${f}`)}},G.getValue=function(_,y="i8"){switch(y.endsWith("*")&&(y="*"),y){case"i1":case"i8":return n()[_>>>0];case"i16":return q0()[_>>>1>>>0];case"i32":return Z0()[_>>>2>>>0];case"i64":return $0[_>>>3];case"float":return q5()[_>>>2>>>0];case"double":return E0()[_>>>3>>>0];case"*":return M0()[_>>>2>>>0];default:t0(`invalid type for getValue: ${y}`)}},G.UTF8ToString=V6,G.stringToUTF8=_5,G.lengthBytesUTF8=z6,function _(){if(0{Dv(),lV=typeof location>"u"?void 0:location.origin,dJ=import.meta.url>"file:"&&import.meta.url<"file;",rR=()=>{if(dJ)return new URL(new URL("ort.bundle.min.mjs",import.meta.url).href,lV).href;return import.meta.url},_2=rR(),rP=()=>{if(_2&&!_2.startsWith("blob:"))return _2.substring(0,_2.lastIndexOf("/")+1)},kq=($,j)=>{try{let O=j??_2;return(O?new URL($,O):new URL($)).origin===lV}catch{return!1}},nR=($,j)=>{let O=j??_2;try{return(O?new URL($,O):new URL($)).href}catch{return}},tR=($,j)=>`${j??"./"}${$}`,oV=async($)=>{let j=await(await fetch($,{credentials:"same-origin"})).blob();return URL.createObjectURL(j)},eR=async($)=>(await import($)).default,sV=(mD(),hZ(oP)).default,nP=async()=>{if(!_2)throw Error("Failed to load proxy worker: cannot determine the script source URL.");if(kq(_2))return[void 0,sV()];let $=await oV(_2);return[$,sV($)]},iV=(pD(),hZ(iP)).default,tP=async($,j,O)=>{if(!$&&!j&&iV&&_2&&kq(_2))return[void 0,iV];{let G="ort-wasm-simd-threaded.jsep.mjs",Z=$??nR(G,j),V=O&&Z&&!kq(Z,j),N=V?await oV(Z):Z??tR(G,j);return[V?N:void 0,await eR(N)]}}}),j$=k5(()=>{Bv(),Iq=!1,VZ=!1,rV=!1,$U=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},jU=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},OU=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},Wv=async($)=>{if(Iq)return Promise.resolve();if(VZ)throw Error("multiple calls to 'initializeWebAssembly()' detected.");if(rV)throw Error("previous call to 'initializeWebAssembly()' failed.");VZ=!0;let{initTimeout:j,numThreads:O}=$;if($.simd!==!1){if($.simd==="relaxed"){if(!OU())throw Error("Relaxed WebAssembly SIMD is not supported in the current environment.")}else if(!jU())throw Error("WebAssembly SIMD is not supported in the current environment.")}let G=$U();O>1&&!G&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+O+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),$.numThreads=O=1);let Z=$.wasmPaths,V=typeof Z=="string"?Z:void 0,N=Z?.mjs,J=N?.href??N,R=Z?.wasm,U=R?.href??R,H=$.wasmBinary,[L,Y]=await tP(J,V,O>1),S=!1,X=[];if(j>0&&X.push(new Promise((D)=>{setTimeout(()=>{S=!0,D()},j)})),X.push(new Promise((D,I)=>{let k={numThreads:O};if(H)k.wasmBinary=H;else if(U||V)k.locateFile=(z)=>U??V+z;else if(J&&J.indexOf("blob:")!==0)k.locateFile=(z)=>new URL(z,J).href;else if(L){let z=rP();z&&(k.locateFile=(w)=>z+w)}Y(k).then((z)=>{VZ=!1,Iq=!0,aV=z,D(),L&&URL.revokeObjectURL(L)},(z)=>{VZ=!1,rV=!0,I(z)})})),await Promise.race(X),S)throw Error(`WebAssembly backend initializing failed due to timeout: ${j}ms`)},L9=()=>{if(Iq&&aV)return aV;throw Error("WebAssembly is not initialized yet.")}}),hv=k5(()=>{j$(),M3=($,j)=>{let O=L9(),G=O.lengthBytesUTF8($)+1,Z=O._malloc(G);return O.stringToUTF8($,Z,G),j.push(Z),Z},qV=($,j,O,G)=>{if(typeof $=="object"&&$!==null){if(O.has($))throw Error("Circular reference in options");O.add($)}Object.entries($).forEach(([Z,V])=>{let N=j?j+Z:Z;if(typeof V=="object")qV(V,N+".",O,G);else if(typeof V=="string"||typeof V=="number")G(N,V.toString());else{if(typeof V!="boolean")throw Error("Can't handle extra config type: "+typeof V);G(N,V?"1":"0")}})},V9=($)=>{let j=L9(),O=j.stackSave();try{let G=j.PTR_SIZE,Z=j.stackAlloc(2*G);j._OrtGetLastError(Z,Z+G);let V=Number(j.getValue(Z,G===4?"i32":"i64")),N=j.getValue(Z+G,"*"),J=N?j.UTF8ToString(N):"";throw Error(`${$} ERROR_CODE: ${V}, ERROR_MESSAGE: ${J}`)}finally{j.stackRestore(O)}}}),AD=k5(()=>{j$(),hv(),eP=($)=>{let j=L9(),O=0,G=[],Z=$||{};try{if($?.logSeverityLevel===void 0)Z.logSeverityLevel=2;else if(typeof $.logSeverityLevel!="number"||!Number.isInteger($.logSeverityLevel)||$.logSeverityLevel<0||$.logSeverityLevel>4)throw Error(`log serverity level is not valid: ${$.logSeverityLevel}`);if($?.logVerbosityLevel===void 0)Z.logVerbosityLevel=0;else if(typeof $.logVerbosityLevel!="number"||!Number.isInteger($.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${$.logVerbosityLevel}`);$?.terminate===void 0&&(Z.terminate=!1);let V=0;return $?.tag!==void 0&&(V=M3($.tag,G)),O=j._OrtCreateRunOptions(Z.logSeverityLevel,Z.logVerbosityLevel,!!Z.terminate,V),O===0&&V9("Can't create run options."),$?.extra!==void 0&&qV($.extra,"",new WeakSet,(N,J)=>{let R=M3(N,G),U=M3(J,G);j._OrtAddRunConfigEntry(O,R,U)!==0&&V9(`Can't set a run config entry: ${N} - ${J}.`)}),[O,G]}catch(V){throw O!==0&&j._OrtReleaseRunOptions(O),G.forEach((N)=>j._free(N)),V}}}),gD=k5(()=>{j$(),hv(),GU=($)=>{switch($){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw Error(`unsupported graph optimization level: ${$}`)}},ZU=($)=>{switch($){case"sequential":return 0;case"parallel":return 1;default:throw Error(`unsupported execution mode: ${$}`)}},qU=($)=>{$.extra||($.extra={}),$.extra.session||($.extra.session={});let j=$.extra.session;j.use_ort_model_bytes_directly||(j.use_ort_model_bytes_directly="1"),$.executionProviders&&$.executionProviders.some((O)=>(typeof O=="string"?O:O.name)==="webgpu")&&($.enableMemPattern=!1)},NZ=($,j,O,G)=>{let Z=M3(j,G),V=M3(O,G);L9()._OrtAddSessionConfigEntry($,Z,V)!==0&&V9(`Can't set a session config entry: ${j} - ${O}.`)},VU=async($,j,O)=>{for(let G of j){let Z=typeof G=="string"?G:G.name,V=[];switch(Z){case"webnn":if(Z="WEBNN",typeof G!="string"){let H=G?.deviceType;H&&NZ($,"deviceType",H,O)}break;case"webgpu":if(Z="JS",typeof G!="string"){let H=G;if(H?.preferredLayout){if(H.preferredLayout!=="NCHW"&&H.preferredLayout!=="NHWC")throw Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${H.preferredLayout}`);NZ($,"preferredLayout",H.preferredLayout,O)}}break;case"wasm":case"cpu":continue;default:throw Error(`not supported execution provider: ${Z}`)}let N=M3(Z,O),J=V.length,R=0,U=0;if(J>0){R=L9()._malloc(J*L9().PTR_SIZE),O.push(R),U=L9()._malloc(J*L9().PTR_SIZE),O.push(U);for(let H=0;H{let j=L9(),O=0,G=[],Z=$||{};qU(Z);try{let V=GU(Z.graphOptimizationLevel??"all"),N=ZU(Z.executionMode??"sequential"),J=typeof Z.logId=="string"?M3(Z.logId,G):0,R=Z.logSeverityLevel??2;if(!Number.isInteger(R)||R<0||R>4)throw Error(`log serverity level is not valid: ${R}`);let U=Z.logVerbosityLevel??0;if(!Number.isInteger(U)||U<0||U>4)throw Error(`log verbosity level is not valid: ${U}`);let H=typeof Z.optimizedModelFilePath=="string"?M3(Z.optimizedModelFilePath,G):0;if(O=j._OrtCreateSessionOptions(V,!!Z.enableCpuMemArena,!!Z.enableMemPattern,N,!!Z.enableProfiling,0,J,R,U,H),O===0&&V9("Can't create session options."),Z.executionProviders&&await VU(O,Z.executionProviders,G),Z.enableGraphCapture!==void 0){if(typeof Z.enableGraphCapture!="boolean")throw Error(`enableGraphCapture must be a boolean value: ${Z.enableGraphCapture}`);NZ(O,"enableGraphCapture",Z.enableGraphCapture.toString(),G)}if(Z.freeDimensionOverrides)for(let[L,Y]of Object.entries(Z.freeDimensionOverrides)){if(typeof L!="string")throw Error(`free dimension override name must be a string: ${L}`);if(typeof Y!="number"||!Number.isInteger(Y)||Y<0)throw Error(`free dimension override value must be a non-negative integer: ${Y}`);let S=M3(L,G);j._OrtAddFreeDimensionOverride(O,S,Y)!==0&&V9(`Can't set a free dimension override: ${L} - ${Y}.`)}return Z.extra!==void 0&&qV(Z.extra,"",new WeakSet,(L,Y)=>{NZ(O,L,Y,G)}),[O,G]}catch(V){throw O!==0&&j._OrtReleaseSessionOptions(O)!==0&&V9("Can't release session options."),G.forEach((N)=>j._free(N)),V}}}),x6=k5(()=>{d8=($)=>{switch($){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw Error(`unsupported data type: ${$}`)}},y4=($)=>{switch($){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw Error(`unsupported data type: ${$}`)}},l8=($,j)=>{let O=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,0.5,0.5][$],G=typeof j=="number"?j:j.reduce((Z,V)=>Z*V,1);return O>0?Math.ceil(G*O):void 0},TV=($)=>{switch($){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":case"bool":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw Error(`unsupported type: ${$}`)}},VV=($)=>{switch($){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw Error(`unsupported logging level: ${$}`)}},Mv=($)=>$==="float32"||$==="float16"||$==="int32"||$==="int64"||$==="uint32"||$==="uint8"||$==="bool"||$==="uint4"||$==="int4",Kv=($)=>$==="float32"||$==="float16"||$==="int32"||$==="int64"||$==="uint32"||$==="uint64"||$==="int8"||$==="uint8"||$==="bool"||$==="uint4"||$==="int4",lJ=($)=>{switch($){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw Error(`unsupported data location: ${$}`)}}}),gF=k5(()=>{Dv(),bv=async($)=>{if(typeof $=="string"){let j=await fetch($);if(!j.ok)throw Error(`failed to load external data file: ${$}`);let O=j.headers.get("Content-Length"),G=O?parseInt(O,10):0;if(G<1073741824)return new Uint8Array(await j.arrayBuffer());{if(!j.body)throw Error(`failed to load external data file: ${$}, no response body.`);let Z,V=j.body.getReader();try{Z=new ArrayBuffer(G)}catch(J){if(!(J instanceof RangeError))throw J;{let R=Math.ceil(G/65536);Z=new WebAssembly.Memory({initial:R,maximum:R}).buffer}}let N=0;for(;;){let{done:J,value:R}=await V.read();if(J)break;let U=R.byteLength;new Uint8Array(Z,N,U).set(R),N+=U}return new Uint8Array(Z,0,G)}}return $ instanceof Blob?new Uint8Array(await $.arrayBuffer()):$ instanceof Uint8Array?$:new Uint8Array($)}}),k4=k5(()=>{x6(),NU=["V","I","W","E","F"],JU=($,j)=>{console.log(`[${NU[$]},${new Date().toISOString()}]${j}`)},fv=($,j)=>{vU=$,RU=j},UU=($,j)=>{let O=VV($);O>=VV(vU)&&JU(O,typeof j=="function"?j():j)},d6=(...$)=>{RU&&UU(...$)}}),I6=k5(()=>{HU=class{static calcMatMulShape($,j){return $[1]!==j[0]?void 0:[$[0],j[1]]}},zG=class{static calcShape($,j,O=!1){let G=$.length,Z=j.length;if(G===0)return j;if(Z===0)return $;let V=Math.max($.length,j.length),N=Array(V);if(O){if(G<2||Z<2)return;let J=HU.calcMatMulShape([$[G-2],$[G-1]],[j[Z-2],j[Z-1]]);if(J===void 0)return;[N[V-2],N[V-1]]=J}for(let J=O?3:1;J<=V;J++){let R=G-J<0?1:$[G-J],U=Z-J<0?1:j[Z-J];if(R!==U&&R>1&&U>1)return;let H=Math.max(R,U);if(R&&U)N[V-J]=Math.max(R,U);else{if(H>1)return;N[V-J]=0}}return N}static isValidBroadcast($,j){let O=$.length,G=j.length;if(O>G)return!1;for(let Z=1;Z<=O;Z++)if($[O-Z]!==1&&$[O-Z]!==j[G-Z])return!1;return!0}},d0=class ${static size(j){return $.getSizeFromDimensionRange(j,0,j.length)}static convertShape(j,O=4){let G=j.length;if(G===0)return[];let Z=Array(G),V=G-1;for(;V>=0;){if(j[V]%O===0){Z[V]=j[V]/O;break}if(O%j[V]!==0)throw Error("cannot convert shape");Z[V]=1,O/=j[V],V--}for(V--;V>=0;V--)Z[V]=j[V];return Z}static sizeFromDimension(j,O){if(O<0||O>j.length)throw Error(`invalid dimension of ${O} for sizeFromDimension as Tensor has ${j.length} dimensions.`);return $.getSizeFromDimensionRange(j,O,j.length)}static sizeToDimension(j,O){if(O<0||O>j.length)throw Error(`invalid dimension of ${O} for sizeToDimension as Tensor has ${j.length} dimensions.`);return $.getSizeFromDimensionRange(j,0,O)}static getSizeFromDimensionRange(j,O,G){let Z=1;for(let V=O;V=0;--Z)G[Z]=G[Z+1]*j[Z+1];return G}static normalizeAxis(j,O){if(j<-O&&j>=O)throw Error("unsupported axis for this operation.");return j<0?j+O:j}static normalizeAxes(j,O){return j.map((G)=>this.normalizeAxis(G,O??j.length))}static sortBasedOnPerm(j,O){return O?O.map((G)=>j[G]):j.slice().reverse()}static padShape(j,O){let G=j.length;return j.map((Z,V)=>Z+O[V]+O[V+G])}static areEqual(j,O){return j.length===O.length&&j.every((G,Z)=>G===O[Z])}},NV=class ${static adjustPoolAttributes(j,O,G,Z,V,N){if(!j&&G.length!==O.length-2)throw Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(j)for(let J=0;J=G.length?G.push(O[J+2]):G[J]=O[J+2];for(let J=0;J=G[J]||N[J+G.length]>=G[J])throw Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(j,O,G,Z,V,N,J){if(J){if(V.length!==2*(j.length-2))throw Error("length of pads should be twice the length of data dimensions");if(O.length!==j.length-2)throw Error("length of strides should be the length of data dimensions");if(Z.length!==j.length-2)throw Error("length of kernel shapes should be the length of data dimensions");for(let R=0;R{x6(),wv=($,j)=>new(TV(j))($)}),uD=k5(()=>{x6(),k4(),nV=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),oJ=($,j)=>{if(j==="int32")return $;let O=nV.get(j);if(!O)throw Error(`WebNN backend does not support data type: ${j}`);let G=O/8;if($.byteLength%G!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${G}.`);let Z=$.byteLength/G,V=new(TV(j))($.buffer,$.byteOffset,Z);switch(j){case"int64":case"uint64":{let N=new Int32Array(Z);for(let J=0;J2147483647n||R<-2147483648n)throw Error("Can not convert int64 data to int32 - value out of range.");N[J]=Number(R)}return new Uint8Array(N.buffer)}case"int8":case"uint8":case"uint32":{if(j==="uint32"&&V.some((J)=>J>2147483647))throw Error("Can not convert uint32 data to int32 - value out of range.");let N=Int32Array.from(V,Number);return new Uint8Array(N.buffer)}default:throw Error(`Unsupported data conversion from ${j} to 'int32'`)}},tV=($,j)=>{if(j==="int32")return $;if($.byteLength%4!=0)throw Error("Invalid Uint8Array length - must be a multiple of 4 (int32).");let O=$.byteLength/4,G=new Int32Array($.buffer,$.byteOffset,O);switch(j){case"int64":{let Z=BigInt64Array.from(G,BigInt);return new Uint8Array(Z.buffer)}case"uint64":{if(G.some((V)=>V<0))throw Error("Can not convert int32 data to uin64 - negative value found.");let Z=BigUint64Array.from(G,BigInt);return new Uint8Array(Z.buffer)}case"int8":{if(G.some((V)=>V<-128||V>127))throw Error("Can not convert int32 data to int8 - value out of range.");let Z=Int8Array.from(G,Number);return new Uint8Array(Z.buffer)}case"uint8":if(G.some((Z)=>Z<0||Z>255))throw Error("Can not convert int32 data to uint8 - value out of range.");return Uint8Array.from(G,Number);case"uint32":{if(G.some((V)=>V<0))throw Error("Can not convert int32 data to uint32 - negative value found.");let Z=Uint32Array.from(G,Number);return new Uint8Array(Z.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${j}`)}},xU=1,eV=()=>xU++,LU=new Map([["int8","int32"],["uint8","int32"],["uint32","int32"],["int64","int32"]]),$N=($,j)=>{let O=nV.get($);if(!O)throw Error(`WebNN backend does not support data type: ${$}`);return j.length>0?Math.ceil(j.reduce((G,Z)=>G*Z)*O/8):0},jN=class{constructor($){this.isDataConverted=!1;let{sessionId:j,context:O,tensor:G,dataType:Z,shape:V,fallbackDataType:N}=$;this.sessionId=j,this.mlContext=O,this.mlTensor=G,this.dataType=Z,this.tensorShape=V,this.fallbackDataType=N}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return $N(this.dataType,this.tensorShape)}destroy(){d6("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write($){this.mlContext.writeTensor(this.mlTensor,$)}async read($){if(this.fallbackDataType){let j=await this.mlContext.readTensor(this.mlTensor),O=tV(new Uint8Array(j),this.dataType);return $?void($ instanceof ArrayBuffer?new Uint8Array($):new Uint8Array($.buffer,$.byteOffset,$.byteLength)).set(O):O.buffer}return $?this.mlContext.readTensor(this.mlTensor,$):this.mlContext.readTensor(this.mlTensor)}canReuseTensor($,j,O){return this.mlContext===$&&this.dataType===j&&this.tensorShape.length===O.length&&this.tensorShape.every((G,Z)=>G===O[Z])}setIsDataConverted($){this.isDataConverted=$}},ON=class{constructor($,j){this.tensorManager=$,this.wrapper=j}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor($,j,O,G){let Z,V=this.tensorManager.getMLContext($);if(!V.opSupportLimits().input.dataTypes.includes(j)){if(Z=LU.get(j),!Z||!V.opSupportLimits().input.dataTypes.includes(Z))throw Error(`WebNN backend does not support data type: ${j}`);d6("verbose",()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${j} to ${Z}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(V,j,O))return this.wrapper.tensor;if(G){if(this.wrapper.byteLength!==$N(j,O))throw Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let N=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor($,j,O,N,!0,!0,Z),G&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload($){let j=$;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType!=="int32")throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`);j=oJ($,this.wrapper.type),this.wrapper.setIsDataConverted(!0)}if($.byteLength===this.wrapper.byteLength)return void this.wrapper.write(j);d6("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor()}this.activeUpload?this.activeUpload.set(j):this.activeUpload=new Uint8Array(j)}async download($){if(this.activeUpload){let j=this.wrapper?.isDataConverted?tV(this.activeUpload,this.wrapper?.type):this.activeUpload;return $?void($ instanceof ArrayBuffer?new Uint8Array($).set(j):new Uint8Array($.buffer,$.byteOffset,$.byteLength).set(j)):j.buffer}if(!this.wrapper)throw Error("Tensor has not been created.");return $?this.wrapper.read($):this.wrapper.read()}},_U=class{constructor($){this.backend=$,this.tensorTrackersById=new Map,this.freeTensors=[],this.externalTensors=new Set}getMLContext($){let j=this.backend.getMLContext($);if(!j)throw Error("MLContext not found for session.");return j}reserveTensorId(){let $=eV();return this.tensorTrackersById.set($,new ON(this)),$}releaseTensorId($){let j=this.tensorTrackersById.get($);j&&(this.tensorTrackersById.delete($),j.tensorWrapper&&this.releaseTensor(j.tensorWrapper))}async ensureTensor($,j,O,G,Z){d6("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${j}, dataType: ${O}, shape: ${G}, copyOld: ${Z}}`);let V=this.tensorTrackersById.get(j);if(!V)throw Error("Tensor not found.");return V.ensureTensor($,O,G,Z)}upload($,j){let O=this.tensorTrackersById.get($);if(!O)throw Error("Tensor not found.");O.upload(j)}async download($,j){d6("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${$}, dstBuffer: ${j?.byteLength}}`);let O=this.tensorTrackersById.get($);if(!O)throw Error("Tensor not found.");return O.download(j)}releaseTensorsForSession($){for(let j of this.freeTensors)j.sessionId===$&&j.destroy();this.freeTensors=this.freeTensors.filter((j)=>j.sessionId!==$)}registerTensor($,j,O,G){let Z=this.getMLContext($),V=eV(),N=new jN({sessionId:$,context:Z,tensor:j,dataType:O,shape:G});return this.tensorTrackersById.set(V,new ON(this,N)),this.externalTensors.add(N),V}async getCachedTensor($,j,O,G,Z,V,N){let J=this.getMLContext($);for(let[U,H]of this.freeTensors.entries())if(H.canReuseTensor(J,j,O)){d6("verbose",()=>`[WebNN] Reusing tensor {dataType: ${j}, ${N?`fallbackDataType: ${N},`:""} shape: ${O}`);let L=this.freeTensors.splice(U,1)[0];return L.sessionId=$,L}d6("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${j}, ${N?`fallbackDataType: ${N},`:""} shape: ${O}}`);let R=await J.createTensor({dataType:N??j,shape:O,dimensions:O,usage:G,writable:Z,readable:V});return new jN({sessionId:$,context:J,tensor:R,dataType:j,shape:O,fallbackDataType:N})}releaseTensor($){this.externalTensors.has($)&&this.externalTensors.delete($),this.freeTensors.push($)}},ZX=(...$)=>new _U(...$)}),dD=k5(()=>{x6(),j$(),uF(),uD(),k4(),JZ=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),YU=($,j)=>{if($===j)return!0;if($===void 0||j===void 0)return!1;let O=Object.keys($).sort(),G=Object.keys(j).sort();return O.length===G.length&&O.every((Z,V)=>Z===G[V]&&$[Z]===j[Z])},qX=class{constructor($){this.tensorManager=ZX(this),this.mlContextBySessionId=new Map,this.sessionIdsByMLContext=new Map,this.mlContextCache=[],this.sessionGraphInputs=new Map,this.sessionGraphOutputs=new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=new Map,fv($.logLevel,!!$.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error("No active session");return this.activeSessionId}onRunStart($){d6("verbose",()=>`[WebNN] onRunStart {sessionId: ${$}}`),this.activeSessionId=$}onRunEnd($){d6("verbose",()=>`[WebNN] onRunEnd {sessionId: ${$}}`);let j=this.temporarySessionTensorIds.get($);if(j){for(let O of j)d6("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${O}}`),this.tensorManager.releaseTensorId(O);this.temporarySessionTensorIds.delete($),this.activeSessionId=void 0}}async createMLContext($){if($ instanceof GPUDevice){let O=this.mlContextCache.findIndex((G)=>G.gpuDevice===$);if(O!==-1)return this.mlContextCache[O].mlContext;{let G=await navigator.ml.createContext($);return this.mlContextCache.push({gpuDevice:$,mlContext:G}),G}}if($===void 0){let O=this.mlContextCache.findIndex((G)=>G.options===void 0&&G.gpuDevice===void 0);if(O!==-1)return this.mlContextCache[O].mlContext;{let G=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:G}),G}}let j=this.mlContextCache.findIndex((O)=>YU(O.options,$));if(j!==-1)return this.mlContextCache[j].mlContext;{let O=await navigator.ml.createContext($);return this.mlContextCache.push({options:$,mlContext:O}),O}}registerMLContext($,j){this.mlContextBySessionId.set($,j);let O=this.sessionIdsByMLContext.get(j);O||(O=new Set,this.sessionIdsByMLContext.set(j,O)),O.add($),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set($,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set($,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession($){this.sessionGraphInputs.delete($),this.sessionGraphOutputs.delete($);let j=this.mlContextBySessionId.get($);if(!j)return;this.tensorManager.releaseTensorsForSession($),this.mlContextBySessionId.delete($);let O=this.sessionIdsByMLContext.get(j);if(O.delete($),O.size===0){this.sessionIdsByMLContext.delete(j);let G=this.mlContextCache.findIndex((Z)=>Z.mlContext===j);G!==-1&&this.mlContextCache.splice(G,1)}}getMLContext($){return this.mlContextBySessionId.get($)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId($){d6("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${$}}`),this.tensorManager.releaseTensorId($)}async ensureTensor($,j,O,G,Z){let V=JZ.get(O);if(!V)throw Error(`Unsupported ONNX data type: ${O}`);return this.tensorManager.ensureTensor($??this.currentSessionId,j,V,G,Z)}async createTemporaryTensor($,j,O){d6("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${j}, shape: ${O}}`);let G=JZ.get(j);if(!G)throw Error(`Unsupported ONNX data type: ${j}`);let Z=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor($,Z,G,O,!1);let V=this.temporarySessionTensorIds.get($);return V?V.push(Z):this.temporarySessionTensorIds.set($,[Z]),Z}uploadTensor($,j){if(!L9().shouldTransferToMLTensor)throw Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");d6("verbose",()=>`[WebNN] uploadTensor {tensorId: ${$}, data: ${j.byteLength}}`),this.tensorManager.upload($,j)}async downloadTensor($,j){return this.tensorManager.download($,j)}createMLTensorDownloader($,j){return async()=>{let O=await this.tensorManager.download($);return wv(O,j)}}registerMLTensor($,j,O,G){let Z=JZ.get(O);if(!Z)throw Error(`Unsupported ONNX data type: ${O}`);let V=this.tensorManager.registerTensor($,j,Z,G);return d6("verbose",()=>`[WebNN] registerMLTensor {tensor: ${j}, dataType: ${Z}, dimensions: ${G}} -> {tensorId: ${V}}`),V}registerMLConstant($,j,O,G,Z,V,N=!1){if(!V)throw Error("External mounted files are not available.");let J=$;$.startsWith("./")&&(J=$.substring(2));let R=V.get(J);if(!R)throw Error(`File with name ${J} not found in preloaded files.`);if(j+O>R.byteLength)throw Error("Out of bounds: data offset and length exceed the external file data size.");let U,H=R.slice(j,j+O).buffer;switch(Z.dataType){case"float32":U=new Float32Array(H);break;case"float16":U=typeof Float16Array<"u"&&Float16Array.from?new Float16Array(H):new Uint16Array(H);break;case"int32":U=new Int32Array(H);break;case"uint32":U=new Uint32Array(H);break;case"int64":if(N){let L=oJ(new Uint8Array(H),"int64");U=new Int32Array(L.buffer),Z.dataType="int32"}else U=new BigInt64Array(H);break;case"uint64":U=new BigUint64Array(H);break;case"int8":U=new Int8Array(H);break;case"int4":case"uint4":case"uint8":U=new Uint8Array(H);break;default:throw Error(`Unsupported data type: ${Z.dataType} in creating WebNN Constant from external data.`)}return d6("verbose",()=>`[WebNN] registerMLConstant {dataType: ${Z.dataType}, shape: ${Z.shape}}} ${N?"(Note: it was int64 data type and registered to int32 as workaround)":""}`),G.constant(Z,U)}registerGraphInput($){this.temporaryGraphInputs.push($)}registerGraphOutput($){this.temporaryGraphOutputs.push($)}isGraphInput($,j){let O=this.sessionGraphInputs.get($);return!!O&&O.includes(j)}isGraphOutput($,j){let O=this.sessionGraphOutputs.get($);return!!O&&O.includes(j)}isGraphInputOutputTypeSupported($,j,O=!0){let G=this.mlContextBySessionId.get($),Z=JZ.get(d8(j));return!(typeof Z>"u")&&(O?!!G?.opSupportLimits().input.dataTypes.includes(Z):!!G?.opSupportLimits().output.dataTypes.includes(Z))}flush(){}}}),cv=k5(()=>{}),lD=k5(()=>{k4(),cv(),GN=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),Dq=[],Wq=($)=>16*Math.ceil(Number($)/16),SU=($)=>{for(let j=0;jPU++,sJ=async($,j,O,G)=>{let Z=Wq(O),V=$.device.createBuffer({size:Z,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let N=$.getCommandEncoder();$.endComputePass(),N.copyBufferToBuffer(j,0,V,0,Z),$.flush(),await V.mapAsync(GPUMapMode.READ);let J=V.getMappedRange();if(G){let R=G();return R.set(new Uint8Array(J,0,O)),R}return new Uint8Array(J.slice(0,O))}finally{V.destroy()}},XU=class{constructor($){this.backend=$,this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[j]of GN)Dq.push(j),this.freeBuffers.set(j,[]),this.freeUniformBuffers.set(j,[]);this.sessionCount=0}upload($,j){let{buffer:O,byteOffset:G,byteLength:Z}=j,V=Wq(Z),N=this.storageCache.get($);if(!N)throw Error("gpu data for uploading does not exist");if(Number(N.originalSize)!==Z)throw Error(`inconsistent data size. gpu data size=${N.originalSize}, data size=${Z}`);let J=this.backend.device.createBuffer({mappedAtCreation:!0,size:V,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),R=J.getMappedRange();new Uint8Array(R).set(new Uint8Array(O,G,Z)),J.unmap();let U=this.backend.device.createCommandEncoder();U.copyBufferToBuffer(J,0,N.gpuData.buffer,0,V),this.backend.device.queue.submit([U.finish()]),J.destroy(),d6("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${$})`)}memcpy($,j){let O=this.storageCache.get($);if(!O)throw Error("source gpu data for memcpy does not exist");let G=this.storageCache.get(j);if(!G)throw Error("destination gpu data for memcpy does not exist");if(O.originalSize!==G.originalSize)throw Error("inconsistent source and destination gpu data size");let Z=Wq(O.originalSize),V=this.backend.getCommandEncoder();this.backend.endComputePass(),V.copyBufferToBuffer(O.gpuData.buffer,0,G.gpuData.buffer,0,Z)}registerExternalBuffer($,j,O){let G;if(O){if(G=O[0],$===O[1])return d6("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${j}) => id=${G}, buffer is the same, skip.`),G;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else G=ZN();return this.storageCache.set(G,{gpuData:{id:G,type:0,buffer:$},originalSize:j}),d6("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${j}) => id=${G}, registered.`),G}unregisterExternalBuffer($){$!==void 0&&(this.storageCache.delete($),d6("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${$}`))}create($,j=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let O,G=SU($),Z=(j&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,V=(j&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(Z||V){let J=(Z?this.freeBuffers:this.freeUniformBuffers).get(G);O=J&&J.length>0?J.pop():this.backend.device.createBuffer({size:G,usage:j})}else O=this.backend.device.createBuffer({size:G,usage:j});let N={id:ZN(),type:0,buffer:O};return this.storageCache.set(N.id,{gpuData:N,originalSize:Number($)}),d6("verbose",()=>`[WebGPU] GpuDataManager.create(size=${$}) => id=${N.id}`),N}get($){return this.storageCache.get($)?.gpuData}release($){let j=typeof $=="bigint"?Number($):$,O=this.storageCache.get(j);if(!O){if(this.storageCache.size===0)return 0;throw Error("releasing data does not exist")}return d6("verbose",()=>`[WebGPU] GpuDataManager.release(id=${j}), gpuDataId=${O.gpuData.id}`),this.storageCache.delete(j),this.buffersPending.push(O.gpuData.buffer),O.originalSize}async download($,j){let O=this.storageCache.get(Number($));if(!O)throw Error("data does not exist");await sJ(this.backend,O.gpuData.buffer,O.originalSize,j)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let $ of this.buffersPending){let j=GN.get($.size);if(($.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let O=this.freeBuffers.get($.size)||[];j===void 0||O.length>=j?$.destroy():O.push($)}else if(($.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let O=this.freeUniformBuffers.get($.size)||[];j===void 0||O.length>=j?$.destroy():O.push($)}else $.destroy()}this.buffersPending=[]}else{let $=this.capturedPendingBuffers.get(this.backend.currentSessionId);$||($=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,$));for(let j of this.buffersPending)$.push(j);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(($)=>{$.forEach((j)=>{j.destroy()})}),this.freeUniformBuffers.forEach(($)=>{$.forEach((j)=>{j.destroy()})}),this.storageCache.forEach(($)=>{$.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(($)=>{$.forEach((j)=>{j.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession($){let j=this.capturedPendingBuffers.get($);j&&(j.forEach((O)=>{O.destroy()}),this.capturedPendingBuffers.delete($)),this.sessionCount-=1,this.sessionCount===0&&(d6("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach((O)=>{O.gpuData.buffer.destroy()}),this.storageCache=new Map)}},VX=(...$)=>new XU(...$)}),C9=k5(()=>{TU=class{constructor($){Object.assign(this,$)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(($)=>`${this[$]}`).join(";")),this.key}},$9=($)=>new TU($)}),W6=k5(()=>{x6(),I6(),kG=64,Mq=($,j)=>{if(j===3)throw Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number($)){case 10:return j>1?`vec${j}`:"f16";case 1:return j>1?`vec${j}`:"f32";case 6:return j>1?`vec${j}`:"i32";case 12:return j>1?`vec${j}`:"u32";case 7:if(j>1)throw Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(j>1)throw Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(j!==4)throw Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw Error(`Unknown data type: ${$}`)}},G1=($,j=1)=>{let O=Mq($,j);return typeof O=="string"?O:O[0]},z1=($,j=1)=>{let O=Mq($,j);return typeof O=="string"?O:O[1]},$6=(...$)=>{let j=[];return $.forEach((O)=>{O.length!==0&&j.push({type:12,data:O},{type:12,data:d0.computeStrides(O)})}),j},M9=($)=>$%4==0?4:$%2==0?2:1,iJ=($="f32",j,O="0")=>j&&j!==1?`vec${j}<${$}>(${O})`:`${$}(${O})`,FG=($,j,O)=>$==="f32"?O:j===1?`f32(${O})`:`vec${j}(${O})`,V7=($,j)=>j===4?`(${$}.x + ${$}.y + ${$}.z + ${$}.w)`:j===2?`(${$}.x + ${$}.y)`:j===3?`(${$}.x + ${$}.y + ${$}.z)`:$,v6=($,j,O,G)=>$.startsWith("uniforms.")&&O>4?typeof j=="string"?G==="f16"?`${$}[(${j}) / 8][(${j}) % 8 / 4][(${j}) % 8 % 4]`:`${$}[(${j}) / 4][(${j}) % 4]`:G==="f16"?`${$}[${Math.floor(j/8)}][${Math.floor(j%8/4)}][${j%8%4}]`:`${$}[${Math.floor(j/4)}][${j%4}]`:O>1?`${$}[${j}]`:$,vZ=($,j,O,G,Z)=>{let V=typeof O=="number",N=V?O:O.length,J=[...Array(N).keys()],R=N<2?"u32":N<=4?`vec${N}`:`array`,U=Mq(j,Z),H=typeof U=="string"?U:U[1],L=typeof U=="string"?U:U[0],Y={indices:R,value:H,storage:L,tensor:j},S=(i)=>typeof i=="string"?i:`${i}u`,X={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},D=V?"uniforms.":"",I=`${D}${$}_shape`,k=`${D}${$}_strides`,z="";for(let i=0;i ${Y.indices} { + var indices: ${Y.indices}; + var current = offset; + ${z} + return indices; + }`,T=[];if(N>=2)for(let i=N-1;i>=0;i--)T.push(`${v6(k,i,N)} * (indices[${i}])`);let W=N<2?"":` + fn i2o_${$}(indices: ${Y.indices}) -> u32 { + return ${T.join("+")}; + }`,E=(...i)=>N===0?"0u":`${Y.indices}(${i.map(S).join(",")})`,Q=(i,G0)=>N<2?`${i}`:`${v6(i,G0,N)}`,A={},l=(i,G0)=>(()=>{if(Y.storage===Y.value)return`${$}[${i}]=${G0};`;if(Y.storage==="vec2"&&Y.value==="i32")return`${$}[${i}]=vec2(u32(${G0}), select(0u, 0xFFFFFFFFu, ${G0} < 0));`;if(Y.storage==="vec2"&&Y.value==="u32")return`${$}[${i}]=vec2(u32(${G0}), 0u);`;if(Y.storage==="u32"&&Y.value==="vec4")return`${$}[${i}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${G0}));`;throw Error(`not supported combination of storage type ${Y.storage} and value type ${Y.value} yet`)})(),r=(i)=>(()=>{if(Y.storage===Y.value)return`${$}[${i}]`;if(Y.storage==="vec2"&&Y.value==="i32")return`i32(${$}[${i}].x)`;if(Y.storage==="vec2"&&Y.value==="u32")return`u32(${$}[${i}].x)`;if(Y.storage==="u32"&&Y.value==="vec4")return`vec4(bool(${$}[${i}] & 0xFFu), bool(${$}[${i}] & 0xFF00u), bool(${$}[${i}] & 0xFF0000u), bool(${$}[${i}] & 0xFF000000u))`;throw Error(`not supported combination of storage type ${Y.storage} and value type ${Y.value} yet`)})(),e=N<2?"":` + fn get_${$}ByIndices(indices: ${Y.indices}) -> ${H} { + return ${r(`i2o_${$}(indices)`)}; + }`,V0=N<2?"":(()=>{let i=J.map((S0)=>`d${S0}: u32`).join(", "),G0=J.map((S0)=>`d${S0}`).join(", ");return` + fn get_${$}(${i}) -> ${H} { + return get_${$}ByIndices(${E(G0)}); + }`})(),v0=N<2?"":` + fn set_${$}ByIndices(indices: ${Y.indices}, value: ${H}) { + ${l(`i2o_${$}(indices)`,"value")} + }`,$0=N<2?"":(()=>{let i=J.map((S0)=>`d${S0}: u32`).join(", "),G0=J.map((S0)=>`d${S0}`).join(", ");return` + fn set_${$}(${i}, value: ${H}) { + set_${$}ByIndices(${E(G0)}, value); + }`})();return{impl:()=>{let i=[],G0=!1;return X.offsetToIndices&&(i.push(w),G0=!0),X.indicesToOffset&&(i.push(W),G0=!0),X.broadcastedIndicesToOffset&&(Object.values(A).forEach((S0)=>i.push(S0)),G0=!0),X.set&&(i.push($0),G0=!0),X.setByIndices&&(i.push(v0),G0=!0),X.get&&(i.push(V0),G0=!0),X.getByIndices&&(i.push(e),G0=!0),!V&&G0&&i.unshift(`const ${I} = ${Y.indices}(${O.join(",")});`,`const ${k} = ${Y.indices}(${d0.computeStrides(O).join(",")});`),i.join(` +`)},type:Y,offsetToIndices:(i)=>(X.offsetToIndices=!0,N<2?i:`o2i_${$}(${i})`),indicesToOffset:(i)=>(X.indicesToOffset=!0,N<2?i:`i2o_${$}(${i})`),broadcastedIndicesToOffset:(i,G0)=>{X.broadcastedIndicesToOffset=!0;let S0=`${G0.name}broadcastedIndicesTo${$}Offset`;if(S0 in A)return`${S0}(${i})`;let F0=[];for(let s=N-1;s>=0;s--){let n=G0.indicesGet("outputIndices",s+G0.rank-N);F0.push(`${Q(k,s)} * (${n} % ${Q(I,s)})`)}return A[S0]=`fn ${S0}(outputIndices: ${G0.type.indices}) -> u32 { + return ${F0.length>0?F0.join("+"):"0u"}; + }`,`${S0}(${i})`},indices:E,indicesGet:Q,indicesSet:(i,G0,S0)=>N<2?`${i}=${S0};`:`${v6(i,G0,N)}=${S0};`,set:(...i)=>{if(i.length!==N+1)throw Error(`indices length must be ${N}`);let G0=i[N];if(typeof G0!="string")throw Error("value must be string");let S0=i.slice(0,N).map(S).join(",");return N===0?l("0u",G0):N===1?l(S0[0],G0):(X.set=!0,X.setByIndices=!0,X.indicesToOffset=!0,`set_${$}(${S0}, ${G0})`)},setByOffset:l,setByIndices:(i,G0)=>N<2?l(i,G0):(X.setByIndices=!0,X.indicesToOffset=!0,`set_${$}ByIndices(${i}, ${G0});`),get:(...i)=>{if(i.length!==N)throw Error(`indices length must be ${N}`);let G0=i.map(S).join(",");return N===0?r("0u"):N===1?r(G0[0]):(X.get=!0,X.getByIndices=!0,X.indicesToOffset=!0,`get_${$}(${G0})`)},getByOffset:r,getByIndices:(i)=>N<2?r(i):(X.getByIndices=!0,X.indicesToOffset=!0,`get_${$}ByIndices(${i})`),usage:G,name:$,strides:k,shape:I,rank:N}},j5=($,j,O,G=1)=>vZ($,j,O,"input",G),n5=($,j,O,G=1)=>vZ($,j,O,"output",G),NX=($,j,O)=>vZ($,j,O,"atomicOutput",1),Ev=($,j,O,G=1)=>vZ($,j,O,"internal",G),FU=class{constructor($,j){this.normalizedDispatchGroup=$,this.limits=j,this.internalVariables=[],this.variables=[],this.uniforms=[],this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes($){return`if (global_idx >= ${typeof $=="number"?`${$}u`:$}) { return; }`}mainStart($=kG){let j=typeof $=="number"?$:$[0],O=typeof $=="number"?1:$[1],G=typeof $=="number"?1:$[2];if(j>this.limits.maxComputeWorkgroupSizeX||O>this.limits.maxComputeWorkgroupSizeY||G>this.limits.maxComputeWorkgroupSizeZ)throw Error(`workgroup size [${j}, ${O}, ${G}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(j*O*G>this.limits.maxComputeInvocationsPerWorkgroup)throw Error(`workgroup size [${j}, ${O}, ${G}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let Z=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1;return`@compute @workgroup_size(${j}, ${O}, ${G}) + fn main(${Z?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`}) { + ${Z?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${j*O*G}u + local_idx;`} + `}appendVariableUniforms($){$.rank!==0&&($.shape.startsWith("uniforms.")&&this.uniforms.push({name:$.shape.replace("uniforms.",""),type:"u32",length:$.rank}),$.strides.startsWith("uniforms.")&&this.uniforms.push({name:$.strides.replace("uniforms.",""),type:"u32",length:$.rank}))}declareVariable($,j){if($.usage==="internal")throw Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push($),this.appendVariableUniforms($);let O=$.usage==="input"?"read":"read_write",G=$.usage==="atomicOutput"?"atomic":$.type.storage;return`@group(0) @binding(${j}) var ${$.name}: array<${G}>;`}declareVariables(...$){return $.map((j)=>this.declareVariable(j,this.variableIndex++)).join(` +`)}registerInternalVariable($){if($.usage!=="internal")throw Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push($),this.appendVariableUniforms($)}registerInternalVariables(...$){return $.forEach((j)=>this.registerInternalVariable(j)),this}registerUniform($,j,O=1){return this.uniforms.push({name:$,type:j,length:O}),this}registerUniforms($){return this.uniforms=this.uniforms.concat($),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let $=[];for(let{name:j,type:O,length:G}of this.uniforms)if(G&&G>4)O==="f16"?$.push(`@align(16) ${j}:array, ${Math.ceil(G/8)}>`):$.push(`${j}:array, ${Math.ceil(G/4)}>`);else{let Z=G==null||G===1?O:`vec${G}<${O}>`;$.push(`${j}:${Z}`)}return` + struct Uniforms { ${$.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(($)=>$.impl()).join(` +`)+this.internalVariables.map(($)=>$.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let $=(j)=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(j)];return this.uniforms.map((j)=>[$(j.type),j.length??1])}},JX=($,j)=>new FU($,j)}),J7=k5(()=>{x6(),I6(),C9(),W6(),yU=($,j)=>{if(!$||$.length!==1)throw Error("Transpose requires 1 input.");if(j.length!==0&&j.length!==$[0].dims.length)throw Error(`perm size ${j.length} does not match input rank ${$[0].dims.length}`)},qN=($,j)=>j.length!==0?j:[...Array($).keys()].reverse(),zU=($,j)=>d0.sortBasedOnPerm($,qN($.length,j)),kU=($,j,O,G)=>{let Z=`fn perm(i: ${G.type.indices}) -> ${O.type.indices} { + var a: ${O.type.indices};`;for(let V=0;V{let O=[],G=[];for(let Z=0;Z<$.length;++Z)$[Z]!==1&&O.push($[Z]),$[j[Z]]!==1&&G.push(j[Z]);return{newShape:O,newPerm:G}},DU=($,j)=>{let O=0;for(let G=0;G<$.length;++G)if(j[$[G]]!==1){if($[G]{let O,G=$.dataType,Z=$.dims.length,V=qN(Z,j),N=zU($.dims,V),J=$.dims,R=N;if(Z<2||DU(V,$.dims))return O=(S)=>{let X=j5("input",G,J,4),D=n5("output",G,R,4);return` + ${S.registerUniform("output_size","u32").declareVariables(X,D)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let S=d0.size(N);return{outputs:[{dims:N,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(S/64/4)},programUniforms:[{type:12,data:Math.ceil(S/4)}]}},getShaderSource:O};let{newShape:U,newPerm:H}=IU($.dims,V),L=d0.areEqual(H,[2,3,1]),Y=d0.areEqual(H,[3,1,2]);if(U.length===2||L||Y){J=L?[U[0],U[1]*U[2]]:Y?[U[0]*U[1],U[2]]:U,R=[J[1],J[0]];let S=16;return O=(X)=>{let D=j5("a",G,J.length),I=n5("output",G,R.length);return` + ${X.registerUniform("output_size","u32").declareVariables(D,I)} + var tile : array, ${S}>; + ${X.mainStart([S,S,1])} + let stride = (uniforms.output_shape[1] - 1) / ${S} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${S}u + local_id.x; + let input_row = workgroup_id_x * ${S}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${D.getByIndices(`${D.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${S}u + local_id.x; + let output_row = workgroup_id_y * ${S}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${I.setByIndices(`${I.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let X=d0.size(N);return{outputs:[{dims:N,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(R[1]/S),y:Math.ceil(R[0]/S)},programUniforms:[{type:12,data:X},...$6(J,R)]}},getShaderSource:O}}return O=(S)=>{let X=j5("a",G,J.length),D=n5("output",G,R.length);return` + ${S.registerUniform("output_size","u32").declareVariables(X,D)} + + ${kU(V,Z,X,D)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${D.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${D.setByOffset("global_idx",X.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${j}`,inputDependencies:["rank"]},getRunData:()=>{let S=d0.size(N);return{outputs:[{dims:N,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(S/64)},programUniforms:[{type:12,data:S},...$6(J,R)]}},getShaderSource:O}},vX=($,j)=>{yU($.inputs,j.perm),$.compute(P2($.inputs[0],j.perm))},RX=($)=>$9({perm:$.perm})}),oD=k5(()=>{x6(),I6(),W6(),mv(),J7(),WU={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},MU={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},KU={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},bU={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},fU=($,j)=>{let O=[];for(let G=j-$;G{let O=[],G=$.length;for(let Z=0;Z$[Z])]},EU=($,j)=>{let O=$.length+j.length,G=[],Z=0;for(let V=0;V{for(let O=0;O<$.length;++O)if($[$.length-O-1]!==j-1-O)return!1;return!0},CU=($,j)=>{let O=[];if(!QU($,j)){for(let G=0;GO.push(G))}return O},BU=($,j,O,G,Z,V,N)=>{let J=O[0].dims,R=d0.size(V),U=d0.size(N),H=j5("_A",O[0].dataType,J),L=n5("output",Z,V),Y=64;R===1&&(Y=256);let S=` + var aBestValues : array; + `;return{name:$,shaderCache:{hint:`${j};${Y}`,inputDependencies:["type"]},getShaderSource:(X)=>` + ${X.registerUniform("reduceSize","u32").declareVariables(H,L)} + ${S} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${X.mainStart(Y)} + + let outputIndex = global_idx / ${Y}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${KU[G]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${Y}) { + let candidate = f32(${H.getByOffset("offset + k")}); + bestValue = ${WU[G]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${Y}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${MU[G]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${L.setByOffset("outputIndex",G==="mean"?`${L.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${L.type.storage}(${bU[G]})`)}; + } + }`,getRunData:()=>({outputs:[{dims:V,dataType:Z}],dispatchGroup:{x:R},programUniforms:[{type:12,data:U}]})}},x3=($,j,O,G)=>{let Z=$.inputs.length===1?O:aJ($.inputs,O),V=Z.axes;V.length===0&&!Z.noopWithEmptyAxes&&(V=$.inputs[0].dims.map((S,X)=>X));let N=d0.normalizeAxes(V,$.inputs[0].dims.length),J=N,R=$.inputs[0],U=CU(J,$.inputs[0].dims.length);U.length>0&&(R=$.compute(P2($.inputs[0],U),{inputs:[0],outputs:[-1]})[0],J=fU(J.length,R.dims.length));let[H,L]=wU(R.dims,J),Y=H;Z.keepDims&&(Y=EU(H,N)),$.compute(BU(j,Z.cacheKey,[R],G,$.inputs[0].dataType,Y,L),{inputs:[R]})},UX=($,j)=>{x3($,"ReduceMeanShared",j,"mean")},HX=($,j)=>{x3($,"ReduceL1Shared",j,"l1")},xX=($,j)=>{x3($,"ReduceL2Shared",j,"l2")},LX=($,j)=>{x3($,"ReduceLogSumExpShared",j,"logSumExp")},_X=($,j)=>{x3($,"ReduceMaxShared",j,"max")},YX=($,j)=>{x3($,"ReduceMinShared",j,"min")},SX=($,j)=>{x3($,"ReduceProdShared",j,"prod")},PX=($,j)=>{x3($,"ReduceSumShared",j,"sum")},XX=($,j)=>{x3($,"ReduceSumSquareShared",j,"sumSquare")},TX=($,j)=>{x3($,"ReduceLogSumShared",j,"logSum")}}),mv=k5(()=>{x6(),I6(),C9(),W6(),oD(),L3=($)=>{if(!$||$.length===0||$.length>2)throw Error("Reduce op requires 1 or 2 inputs.");if($.length===2&&$[1].dims.length!==1)throw Error("Invalid axes input dims.")},hU=($)=>["","",`var value = ${$.getByIndices("input_indices")};`,""],JV=($,j,O,G,Z,V,N=!1,J=!1)=>{let R=[],U=O[0].dims,H=U.length,L=d0.normalizeAxes(Z,H),Y=!J&&L.length===0;U.forEach((D,I)=>{Y||L.indexOf(I)>=0?N&&R.push(1):R.push(D)});let S=R.length,X=d0.size(R);return{name:$,shaderCache:j,getShaderSource:(D)=>{let I=[],k=j5("_A",O[0].dataType,H),z=n5("output",V,S),w=G(k,z,L),T=w[2];for(let W=0,E=0;W=0?(N&&E++,T=`for(var j${W}: u32 = 0; j${W} < ${U[W]}; j${W}++) { + ${w[2].includes("last_index")?`let last_index = j${W};`:""} + ${k.indicesSet("input_indices",W,`j${W}`)} + ${T} + }`):(I.push(`${k.indicesSet("input_indices",W,z.indicesGet("output_indices",E))};`),E++);return` + + ${D.registerUniform("output_size","u32").declareVariables(k,z)} + + ${D.mainStart()} + ${D.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${k.type.indices}; + let output_indices = ${z.offsetToIndices("global_idx")}; + + ${I.join(` +`)} + ${w[0]} // init ops for reduce max/min + ${w[1]} + ${T} + ${w[3]} + ${w.length===4?z.setByOffset("global_idx","value"):w.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:R,dataType:V}],dispatchGroup:{x:Math.ceil(X/64)},programUniforms:[{type:12,data:X},...$6(U,R)]})}},aJ=($,j)=>{let O=[];return $[1].dims[0]>0&&$[1].getBigInt64Array().forEach((G)=>O.push(Number(G))),$9({axes:O,keepDims:j.keepDims,noopWithEmptyAxes:j.noopWithEmptyAxes})},_3=($,j,O,G)=>{let Z=$.inputs,V=Z.length===1?O:aJ(Z,O);$.compute(JV(j,{hint:V.cacheKey,inputDependencies:["rank"]},[Z[0]],V.noopWithEmptyAxes&&V.axes.length===0?hU:G,V.axes,Z[0].dataType,V.keepDims,V.noopWithEmptyAxes),{inputs:[0]})},cU=($,j)=>{L3($.inputs),_3($,"ReduceLogSum",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += ${O.getByIndices("input_indices")};`,"value = log(value);"])},mU=($,j)=>{L3($.inputs),_3($,"ReduceL1",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += abs(${O.getByIndices("input_indices")});`,""])},pU=($,j)=>{L3($.inputs),_3($,"ReduceL2",j,(O,G)=>[`var t = ${G.type.value}(0); var value = ${G.type.value}(0);`,"",`t = ${O.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},AU=($,j)=>{L3($.inputs),_3($,"ReduceLogSumExp",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += exp(${O.getByIndices("input_indices")});`,"value = log(value);"])},gU=($,j)=>{L3($.inputs),_3($,"ReduceMax",j,(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(O.indicesSet("input_indices",N,0));return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")};`,`value = max(value, ${O.getByIndices("input_indices")});`,""]})},uU=($,j)=>{L3($.inputs),_3($,"ReduceMean",j,(O,G,Z)=>{let V=1;for(let N=0;N=0||Z.length===0)&&(V*=$.inputs[0].dims[N]);return["var sum = f32(0);","",`sum += f32(${O.getByIndices("input_indices")});`,`let value = ${G.type.value}(sum / ${V});`]})},dU=($,j)=>{L3($.inputs),_3($,"ReduceMin",j,(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(`input_indices[${N}] = 0;`);return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")};`,`value = min(value, ${O.getByIndices("input_indices")});`,""]})},lU=($,j)=>{L3($.inputs),_3($,"ReduceProd",j,(O,G)=>[`var value = ${G.type.storage}(1);`,"",`value *= ${O.getByIndices("input_indices")};`,""])},oU=($,j)=>{L3($.inputs),_3($,"ReduceSum",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += ${O.getByIndices("input_indices")};`,""])},sU=($,j)=>{L3($.inputs),_3($,"ReduceSumSquare",j,(O,G)=>[`var t = ${G.type.value}(0); var value = ${G.type.value}(0);`,"",`t = ${O.getByIndices("input_indices")}; value += t * t;`,""])},Y3=($,j,O)=>{if(j.length===0)return O;let G=1,Z=1;for(let V=0;V1024},FX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?uU($,j):UX($,j)},yX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?mU($,j):HX($,j)},zX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?pU($,j):xX($,j)},kX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?AU($,j):LX($,j)},IX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?gU($,j):_X($,j)},DX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?dU($,j):YX($,j)},WX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?lU($,j):SX($,j)},MX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?oU($,j):PX($,j)},KX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?sU($,j):XX($,j)},bX=($,j)=>{Y3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?cU($,j):TX($,j)}}),sD=k5(()=>{x6(),C9(),mv(),VN=($)=>{if(!$||$.length===0||$.length>2)throw Error("ArgMinMaxOp op requires 1 or 2 inputs.");if($[0].dataType!==1)throw Error("Invalid input type.")},fX=($,j)=>{VN($.inputs),$.compute(JV("ArgMin",{hint:j.cacheKey,inputDependencies:["rank"]},[$.inputs[0]],(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(`input_indices[${N}] = 0;`);return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${O.getByIndices("input_indices")} ${j.selectLastIndex>0?"<=":"<"} value) { + value = ${O.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",G.setByOffset("global_idx","best_index")]},[j.axis],7,j.keepDims),{inputs:[0]})},wX=($,j)=>{VN($.inputs),$.compute(JV("argMax",{hint:j.cacheKey,inputDependencies:["rank"]},[$.inputs[0]],(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(`input_indices[${N}] = 0;`);return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${O.getByIndices("input_indices")} ${j.selectLastIndex>0?">=":">"} value) { + value = ${O.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",G.setByOffset("global_idx","best_index")]},[j.axis],7,j.keepDims),{inputs:[0]})},rJ=($)=>$9($)}),pv=k5(()=>{x6(),I6(),cv(),W6(),iU=($,j)=>{let O=$[0],G=$[1],Z=$[2],V=$[3],N=$[4],J=$[5];if(N&&J)throw Error("Attention cannot have both past and attention_bias");if(O.dims.length!==3)throw Error('Input "input" must have 3 dimensions');let R=O.dims[0],U=O.dims[1],H=O.dims[2];if(Z.dims.length!==1)throw Error('Input "bias" is expected to have 1 dimensions');if(G.dims.length!==2)throw Error('Input "weights" is expected to have 2 dimensions');if(G.dims[0]!==H)throw Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(Z.dims[0]!==G.dims[1])throw Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let L=Z.dims[0]/3,Y=L,S=Y;if(j.qkvHiddenSizes.length>0){if(j.qkvHiddenSizes.length!==3)throw Error("qkv_hidden_sizes attribute should have 3 elements");for(let k of j.qkvHiddenSizes)if(k%j.numHeads!==0)throw Error("qkv_hidden_sizes should be divisible by num_heads");L=j.qkvHiddenSizes[0],Y=j.qkvHiddenSizes[1],S=j.qkvHiddenSizes[2]}let X=U;if(L!==Y)throw Error("qkv_hidden_sizes first element should be same as the second");if(Z.dims[0]!==L+Y+S)throw Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let D=0;if(N){if(Y!==S)throw Error('Input "past" expect k_hidden_size == v_hidden_size');if(N.dims.length!==5)throw Error('Input "past" must have 5 dimensions');if(N.dims[0]!==2)throw Error('Input "past" first dimension must be 2');if(N.dims[1]!==R)throw Error('Input "past" second dimension must be batch_size');if(N.dims[2]!==j.numHeads)throw Error('Input "past" third dimension must be num_heads');if(N.dims[4]!==Y/j.numHeads)throw Error('Input "past" fifth dimension must be k_hidden_size / num_heads');j.pastPresentShareBuffer||(D=N.dims[3])}let I=X+D;if(V)throw Error("Mask not supported");if(N)throw Error("past is not supported");if(J){if(J.dims.length!==4)throw Error('Input "attention_bias" must have 4 dimensions');if(J.dims[0]!==R||J.dims[1]!==j.numHeads||J.dims[2]!==U||J.dims[3]!==I)throw Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:R,sequenceLength:U,pastSequenceLength:D,kvSequenceLength:X,totalSequenceLength:I,maxSequenceLength:-1,inputHiddenSize:H,hiddenSize:L,vHiddenSize:S,headSize:Math.floor(L/j.numHeads),vHeadSize:Math.floor(S/j.numHeads),numHeads:j.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:j.maskFilterValue,maskType:0,scale:j.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},Kq=($,j,O)=>j&&$?` + let total_sequence_length_input = u32(${j.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${$?.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${O?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,aU=($,j,O,G,Z,V,N,J)=>{let R=M9(N?1:V),U=64,H=V/R;H{let k=n5("x",$.dataType,$.dims,R),z=[k],w=N?j5("seq_lens",N.dataType,N.dims):void 0;w&&z.push(w);let T=J?j5("total_sequence_length_input",J.dataType,J.dims):void 0;T&&z.push(T);let W=z1($.dataType);return` + var thread_max: array; + var thread_sum: array; + ${I.registerUniforms([{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}]).declareVariables(...z)} + ${I.mainStart([U,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${Kq(w,T,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${U}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${N?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${X}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${X}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(R){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw Error(`Unsupported components: ${R}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${U}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${X}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${X}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(R){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw Error(`Unsupported components: ${R}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${U}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${k.type.value}(${W}(1.0) / ${W}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${X}(x[offset + i]); + x[offset + i] = ${k.type.value}(exp(f32input - max_value) / sum); + } + } + ${N?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${k.type.value}(${W}(0)); + }`:""}; + }`},getRunData:()=>({outputs:[],dispatchGroup:{x:1,y:Z,z:j*O},programUniforms:Y})}},rU=($,j,O,G,Z,V,N,J,R)=>{let U=N+V.kvSequenceLength,H=[V.batchSize,V.numHeads,V.sequenceLength,U],L=$>1&&G,Y=V.kvNumHeads?V.kvNumHeads:V.numHeads,S=L?[V.batchSize,Y,U,V.headSize]:void 0,X=V.nReps?V.nReps:1,D=V.scale===0?1/Math.sqrt(V.headSize):V.scale,I=M9(V.headSize),k=V.headSize/I,z=12,w={x:Math.ceil(U/z),y:Math.ceil(V.sequenceLength/z),z:V.batchSize*V.numHeads},T=[{type:12,data:V.sequenceLength},{type:12,data:k},{type:12,data:U},{type:12,data:V.numHeads},{type:12,data:V.headSize},{type:1,data:D},{type:12,data:N},{type:12,data:V.kvSequenceLength},{type:12,data:X}],W=L&&G&&d0.size(G.dims)>0,E=["type","type"];W&&E.push("type"),Z&&E.push("type"),J&&E.push("type"),R&&E.push("type");let Q=[{dims:H,dataType:j.dataType,gpuDataType:0}];return L&&Q.push({dims:S,dataType:j.dataType,gpuDataType:0}),{name:"AttentionProbs",shaderCache:{hint:`${I};${Z!==void 0};${G!==void 0};${$}`,inputDependencies:E},getRunData:()=>({outputs:Q,dispatchGroup:w,programUniforms:T}),getShaderSource:(A)=>{let l=j5("q",j.dataType,j.dims,I),r=[l,j5("key",O.dataType,O.dims,I)];if(W){let G0=j5("past_key",G.dataType,G.dims,I);r.push(G0)}Z&&r.push(j5("attention_bias",Z.dataType,Z.dims));let e=J?j5("seq_lens",J.dataType,J.dims):void 0;e&&r.push(e);let V0=R?j5("total_sequence_length_input",R.dataType,R.dims):void 0;V0&&r.push(V0);let v0=n5("output",j.dataType,H),$0=[v0];L&&$0.push(n5("present_key",j.dataType,S,I));let i=z1(1,I);return` + const TILE_SIZE = 12u; + + var tileQ: array<${l.type.storage}, 144>; + var tileK: array<${l.type.storage}, 144>; + ${A.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}]).declareVariables(...r,...$0)} + ${A.mainStart([z,z,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${X===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${X===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${Kq(e,V0,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${W&&L?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${L?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${i}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${W&&L?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${L?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${i}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(I){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw Error(`Unsupported components: ${I}`)}})()}; + output[outputIdx] = ${v0.type.value} (sum * uniforms.alpha) + ${Z?"attention_bias[outputIdx]":"0.0"}; + } + }`}}},nU=($,j,O,G,Z,V,N=void 0,J=void 0)=>{let R=V+Z.kvSequenceLength,U=Z.nReps?Z.nReps:1,H=Z.vHiddenSize*U,L=$>1&&G,Y=Z.kvNumHeads?Z.kvNumHeads:Z.numHeads,S=L?[Z.batchSize,Y,R,Z.headSize]:void 0,X=[Z.batchSize,Z.sequenceLength,H],D=12,I={x:Math.ceil(Z.vHeadSize/D),y:Math.ceil(Z.sequenceLength/D),z:Z.batchSize*Z.numHeads},k=[{type:12,data:Z.sequenceLength},{type:12,data:R},{type:12,data:Z.vHeadSize},{type:12,data:Z.numHeads},{type:12,data:Z.headSize},{type:12,data:H},{type:12,data:V},{type:12,data:Z.kvSequenceLength},{type:12,data:U}],z=L&&G&&d0.size(G.dims)>0,w=["type","type"];z&&w.push("type"),N&&w.push("type"),J&&w.push("type");let T=[{dims:X,dataType:j.dataType,gpuDataType:0}];return L&&T.push({dims:S,dataType:j.dataType,gpuDataType:0}),{name:"AttentionScore",shaderCache:{hint:`${G!==void 0};${$}`,inputDependencies:w},getRunData:()=>({outputs:T,dispatchGroup:I,programUniforms:k}),getShaderSource:(W)=>{let E=j5("probs",j.dataType,j.dims),Q=[E,j5("v",O.dataType,O.dims)];z&&Q.push(j5("past_value",G.dataType,G.dims));let A=N?j5("seq_lens",N.dataType,N.dims):void 0;N&&Q.push(A);let l=J?j5("total_sequence_length_input",J.dataType,J.dims):void 0;J&&Q.push(l);let r=[n5("output",j.dataType,X)];return L&&r.push(n5("present_value",j.dataType,S)),` + const TILE_SIZE = 12u; + var tileQ: array<${E.type.value}, 144>; + var tileV: array<${E.type.value}, 144>; + ${W.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}]).declareVariables(...Q,...r)} + ${W.mainStart([D,D,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${U===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${U===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${Kq(A,l,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${z&&L?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${L?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${E.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${z&&L?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${L?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`}}},cZ=($,j,O,G,Z,V,N,J,R,U,H=void 0,L=void 0)=>{let Y=Math.min($.outputCount,1+(N?1:0)+(J?1:0)),S=Y>1?U.pastSequenceLength:0,X=S+U.kvSequenceLength,D=R&&d0.size(R.dims)>0?R:void 0,I=[j,O];Y>1&&N&&d0.size(N.dims)>0&&I.push(N),D&&I.push(D),H&&I.push(H),L&&I.push(L);let k=$.compute(rU(Y,j,O,N,D,U,S,H,L),{inputs:I,outputs:Y>1?[-1,1]:[-1]})[0];$.compute(aU(k,U.batchSize,U.numHeads,S,U.sequenceLength,X,H,L),{inputs:H&&L?[k,H,L]:[k],outputs:[]});let z=[k,G];Y>1&&J&&d0.size(J.dims)>0&&z.push(J),H&&z.push(H),L&&z.push(L),$.compute(nU(Y,k,G,J,U,S,H,L),{inputs:z,outputs:Y>1?[0,2]:[0]})},tU=($,j)=>{let O=[j.batchSize,j.numHeads,j.sequenceLength,j.headSize],G=j.sequenceLength,Z=j.inputHiddenSize,V=j.headSize,N=12,J={x:Math.ceil(j.headSize/N),y:Math.ceil(j.sequenceLength/N),z:j.batchSize*j.numHeads},R=[$.inputs[0],$.inputs[1],$.inputs[2]],U=[{type:12,data:G},{type:12,data:Z},{type:12,data:V},{type:12,data:j.numHeads},{type:12,data:j.headSize},{type:12,data:j.hiddenSize},{type:12,data:j.hiddenSize+j.hiddenSize+j.vHiddenSize}];return $.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:O,dataType:$.inputs[0].dataType,gpuDataType:0},{dims:O,dataType:$.inputs[0].dataType,gpuDataType:0},{dims:O,dataType:$.inputs[0].dataType,gpuDataType:0}],dispatchGroup:J,programUniforms:U}),getShaderSource:(H)=>{let L=n5("output_q",R[0].dataType,O),Y=n5("output_k",R[0].dataType,O),S=n5("output_v",R[0].dataType,O),X=j5("input",R[0].dataType,R[0].dims),D=j5("weight",R[1].dataType,R[1].dims),I=j5("bias",R[2].dataType,R[2].dims),k=X.type.storage;return` + const TILE_SIZE = 12u; + var tileInput: array<${k}, 144>; + var tileWeightQ: array<${k}, 144>; + var tileWeightK: array<${k}, 144>; + var tileWeightV: array<${k}, 144>; + ${H.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}]).declareVariables(X,D,I,L,Y,S)} + ${H.mainStart([N,N,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${k}(0); + var valueK = ${k}(0); + var valueV = ${k}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k{let O=iU($.inputs,j),[G,Z,V]=tU($,O);return cZ($,G,Z,V,$.inputs[4],void 0,void 0,void 0,$.inputs[5],O)}}),iD=k5(()=>{w3(),x6(),I6(),C9(),W6(),eU=($,j)=>{if(!$||$.length!==5)throw Error("BatchNormalization requires 5 inputs");let O=(G,Z,V)=>{let N=Z.length;if(N!==G.length)throw Error(`${V}: num dimensions != ${N}`);Z.forEach((J,R)=>{if(J!==G[R])throw Error(`${V}: dim[${R}] do not match`)})};if($[0].dims.length>1){let G=j.format==="NHWC"?j.spatial?$[0].dims.slice(-1):$[0].dims.slice(-1).concat($[0].dims.slice(1,$[0].dims.length-1)):$[0].dims.slice(1,j.spatial?2:void 0);O($[1].dims,G,"Invalid input scale"),O($[2].dims,G,"Invalid input B"),O($[3].dims,G,"Invalid input mean"),O($[4].dims,G,"Invalid input var")}else O($[1].dims,[1],"Invalid input scale"),O($[2].dims,[1],"Invalid input B"),O($[3].dims,[1],"Invalid input mean"),O($[4].dims,[1],"Invalid input var")},$H=($,j)=>{let{epsilon:O,spatial:G,format:Z}=j,V=$[0].dims,N=G?M9(V[V.length-1]):1,J=Z==="NHWC"&&V.length>1?N:1,R=d0.size(V)/N,U=G,H=U?V.length:V,L=j5("x",$[0].dataType,$[0].dims,N),Y=j5("scale",$[1].dataType,$[1].dims,J),S=j5("bias",$[2].dataType,$[2].dims,J),X=j5("inputMean",$[3].dataType,$[3].dims,J),D=j5("inputVar",$[4].dataType,$[4].dims,J),I=n5("y",$[0].dataType,H,N);return{name:"BatchNormalization",shaderCache:{hint:`${j.epsilon}_${j.format}_${G}_${N}`,inputDependencies:U?["rank","type","type","type","type"]:void 0},getShaderSource:(k)=>` + const epsilon = ${O}; + ${k.registerUniform("outputSize","u32").declareVariables(L,Y,S,X,D,I)} + ${k.mainStart()} + ${k.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${I.offsetToIndices(`global_idx * ${N}`)}; + ${(()=>{let z="";if(G)z=`let cOffset = ${V.length===1?"0u":Z==="NHWC"?`outputIndices[${V.length-1}] / ${N}`:"outputIndices[1]"};`;else if(Z==="NCHW")z=` + ${I.indicesSet("outputIndices","0","0")} + let cOffset = ${I.indicesToOffset("outputIndices")};`;else{z=`var cIndices = ${Y.type.indices}(0); + cIndices[0] = outputIndices[${V.length-1}];`;for(let w=1;w({outputs:[{dims:$[0].dims,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:U?[{type:12,data:R},...$6(V)]:[{type:12,data:R}]})}},jH=($)=>$9($),QX=($,j)=>{let{inputs:O,outputCount:G}=$,Z=jH({...j,outputCount:G});if(X9.webgpu.validateInputContent&&eU(O,Z),j.trainingMode)throw Error("BatchNormalization trainingMode is not supported yet.");$.compute($H(O,Z))}}),aD=k5(()=>{I6(),W6(),OH=($)=>{if($[0].dims.length!==3)throw Error("input should have 3 dimensions");if(![320,640,1280].includes($[0].dims[2]))throw Error("number of channels should be 320, 640 or 1280");if($[1].dims.length!==1)throw Error("bias is expected to have 1 dimensions");if($[0].dims[2]!==$[1].dims[0])throw Error("last dimension of input and bias are not the same")},GH=($)=>{let j=$[0].dims,O=$[0].dims[2],G=d0.size(j)/4,Z=$[0].dataType,V=j5("input",Z,j,4),N=j5("bias",Z,[O],4),J=j5("residual",Z,j,4),R=n5("output",Z,j,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:j,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(G/64)}}),getShaderSource:(U)=>` + const channels = ${O}u / 4; + ${U.declareVariables(V,N,J,R)} + + ${U.mainStart()} + ${U.guardAgainstOutOfBoundsWorkgroupSizes(G)} + let value = ${V.getByOffset("global_idx")} + + ${N.getByOffset("global_idx % channels")} + ${J.getByOffset("global_idx")}; + ${R.setByOffset("global_idx","value")} + }`}},CX=($)=>{OH($.inputs),$.compute(GH($.inputs))}}),Av=k5(()=>{x6(),I6(),C9(),W6(),ZH=($,j,O,G,Z,V,N)=>{let J=Math.ceil(j/4),R="";R=typeof Z=="string"?`${Z}(a)`:Z("a");let U=j5("inputData",O,[J],4),H=n5("outputData",G,[J],4),L=[{name:"vec_size",type:"u32"}];return N&&L.push(...N),` + ${$.registerUniforms(L).declareVariables(U,H)} + + ${V??""} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${U.getByOffset("global_idx")}; + ${H.setByOffset("global_idx",R)} + }`},r6=($,j,O,G,Z,V=$.dataType,N,J)=>{let R=[{type:12,data:Math.ceil(d0.size($.dims)/4)}];return N&&R.push(...N),{name:j,shaderCache:{hint:Z,inputDependencies:["type"]},getShaderSource:(U)=>ZH(U,d0.size($.dims),$.dataType,V,O,G,J),getRunData:(U)=>({outputs:[{dims:$.dims,dataType:V}],dispatchGroup:{x:Math.ceil(d0.size(U[0].dims)/64/4)},programUniforms:R})}},BX=($)=>{$.compute(r6($.inputs[0],"Abs","abs"))},hX=($)=>{$.compute(r6($.inputs[0],"Acos","acos"))},cX=($)=>{$.compute(r6($.inputs[0],"Acosh","acosh"))},mX=($)=>{$.compute(r6($.inputs[0],"Asin","asin"))},pX=($)=>{$.compute(r6($.inputs[0],"Asinh","asinh"))},AX=($)=>{$.compute(r6($.inputs[0],"Atan","atan"))},gX=($)=>{$.compute(r6($.inputs[0],"Atanh","atanh"))},uX=($)=>$9($),dX=($,j)=>{let O;switch(j.to){case 10:O="vec4";break;case 1:O="vec4";break;case 12:O="vec4";break;case 6:O="vec4";break;case 9:O="vec4";break;default:throw RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${j.to}`)}$.compute(r6($.inputs[0],"Cast",O,void 0,j.cacheKey,j.to))},qH=($)=>{let j,O,G=$.length>=2&&$[1].data!==0,Z=$.length>=3&&$[2].data!==0;switch($[0].dataType){case 1:j=G?$[1].getFloat32Array()[0]:-340282346638528860000000000000000000000,O=Z?$[2].getFloat32Array()[0]:340282346638528860000000000000000000000;break;case 10:j=G?$[1].getUint16Array()[0]:64511,O=Z?$[2].getUint16Array()[0]:31743;break;default:throw Error("Unsupport data type")}return $9({min:j,max:O})},lX=($,j)=>{let O=j||qH($.inputs),G=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"Clip",(Z)=>`clamp(${Z}, vec4<${G}>(uniforms.min), vec4<${G}>(uniforms.max))`,void 0,O.cacheKey,void 0,[{type:$.inputs[0].dataType,data:O.min},{type:$.inputs[0].dataType,data:O.max}],[{name:"min",type:G},{name:"max",type:G}]),{inputs:[0]})},oX=($)=>{$.compute(r6($.inputs[0],"Ceil","ceil"))},sX=($)=>{$.compute(r6($.inputs[0],"Cos","cos"))},iX=($)=>{$.compute(r6($.inputs[0],"Cosh","cosh"))},bZ=($)=>$9($),aX=($,j)=>{let O=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"Elu",(G)=>`elu_vf32(${G})`,` + const elu_alpha_ = ${O}(${j.alpha}); + + fn elu_f32(a: ${O}) -> ${O} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${O}>) -> vec4<${O}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,j.cacheKey))},tq=($="f32")=>` +const r0: ${$} = 0.3275911; +const r1: ${$} = 0.254829592; +const r2: ${$} = -0.284496736; +const r3: ${$} = 1.421413741; +const r4: ${$} = -1.453152027; +const r5: ${$} = 1.061405429; + +fn erf_vf32(v: vec4<${$}>) -> vec4<${$}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,rX=($)=>{let j=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"Erf",(O)=>`erf_vf32(${O})`,tq(j)))},nX=($)=>{$.compute(r6($.inputs[0],"Exp","exp"))},tX=($)=>{$.compute(r6($.inputs[0],"Floor","floor"))},eX=($)=>{let j=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"Gelu",(O)=>`0.5 * ${O} * (1.0 + erf_vf32(${O} * 0.7071067811865475))`,tq(j)))},$T=($,j)=>{let O=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"LeakyRelu",(G)=>`select(leaky_relu_alpha_ * ${G}, ${G}, ${G} >= vec4<${O}>(0.0))`,`const leaky_relu_alpha_ = ${O}(${j.alpha});`,j.cacheKey))},jT=($)=>{$.compute(r6($.inputs[0],"Not",(j)=>`!${j}`))},OT=($)=>{$.compute(r6($.inputs[0],"Neg",(j)=>`-${j}`))},GT=($)=>{$.compute(r6($.inputs[0],"Reciprocal",(j)=>`1.0/${j}`))},ZT=($)=>{let j=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"Relu",(O)=>`select(vec4<${j}>(0.0), ${O}, ${O} > vec4<${j}>(0.0))`))},qT=($)=>{$.compute(r6($.inputs[0],"Sigmoid",(j)=>`(1.0 / (1.0 + exp(-${j})))`))},VT=($)=>$9($),NT=($,j)=>{let O=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"HardSigmoid",(G)=>`max(vec4<${O}>(0.0), min(vec4<${O}>(1.0), ${j.alpha} * ${G} + vec4<${O}>(${j.beta})))`,void 0,j.cacheKey))},JT=($)=>{$.compute(r6($.inputs[0],"Sin","sin"))},vT=($)=>{$.compute(r6($.inputs[0],"Sinh","sinh"))},RT=($)=>{$.compute(r6($.inputs[0],"Sqrt","sqrt"))},UT=($)=>{$.compute(r6($.inputs[0],"Tan","tan"))},NN=($)=>`sign(${$}) * (1 - exp(-2 * abs(${$}))) / (1 + exp(-2 * abs(${$})))`,HT=($)=>{$.compute(r6($.inputs[0],"Tanh",NN))},nJ=($="f32")=>` +const fast_gelu_a: ${$} = 0.5; +const fast_gelu_b: ${$} = 0.7978845608028654; +const fast_gelu_c: ${$} = 0.035677408136300125; + +fn tanh_v(v: vec4<${$}>) -> vec4<${$}> { + return ${NN("v")}; +} +`,tJ=($)=>`(fast_gelu_a + fast_gelu_a * tanh_v(${$} * (fast_gelu_c * ${$} * ${$} + fast_gelu_b))) * ${$}`,xT=($)=>{let j=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"FastGelu",tJ,nJ(j),void 0,$.inputs[0].dataType))},LT=($,j)=>{let O=z1($.inputs[0].dataType);return $.compute(r6($.inputs[0],"ThresholdedRelu",(G)=>`select(vec4<${O}>(0.0), ${G}, ${G} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${O}>(${j.alpha});`,j.cacheKey)),0},_T=($)=>{$.compute(r6($.inputs[0],"Log","log"))},VH=($,j)=>` +const alpha = vec4<${$}>(${j}); +const one = ${$}(1.0); +const zero = ${$}(0.0); + +fn quick_gelu_impl(x: vec4<${$}>) -> vec4<${$}> { + let v = x *alpha; + var x1 : vec4<${$}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,NH=($)=>`quick_gelu_impl(${$})`,YT=($,j)=>{let O=z1($.inputs[0].dataType);$.compute(r6($.inputs[0],"QuickGelu",NH,VH(O,j.alpha),j.cacheKey,$.inputs[0].dataType))}}),rD=k5(()=>{I6(),W6(),Av(),JH=($)=>{if($[0].dims.length!==3)throw Error("input should have 3 dimensions");if(![2560,5120,10240].includes($[0].dims[2]))throw Error("hidden state should be 2560, 5120 or 10240");if($[1].dims.length!==1)throw Error("bias is expected to have 1 dimensions");if($[0].dims[2]!==$[1].dims[0])throw Error("last dimension of input and bias are not the same")},vH=($)=>{let j=$[0].dims.slice();j[2]=j[2]/2;let O=j5("input",$[0].dataType,$[0].dims,4),G=j5("bias",$[0].dataType,[$[0].dims[2]],4),Z=n5("output",$[0].dataType,j,4),V=d0.size(j)/4,N=G1($[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:j,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(V/64)}}),getShaderSource:(J)=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${$[0].dims[2]/4/2}u; + + ${J.declareVariables(O,G,Z)} + + ${tq(N)} + + ${J.mainStart()} + ${J.guardAgainstOutOfBoundsWorkgroupSizes(V)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${Z.setByOffset("global_idx","valueLeft * geluRight")} + }`}},ST=($)=>{JH($.inputs),$.compute(vH($.inputs))}}),nD=k5(()=>{x6(),I6(),W6(),RH=($,j,O,G,Z,V,N,J,R,U,H,L)=>{let Y,S;typeof J=="string"?Y=S=(z,w)=>`${J}((${z}),(${w}))`:typeof J=="function"?Y=S=J:(Y=J.scalar,S=J.vector);let X,D=n5("outputData",H,G.length,4),I=j5("aData",R,j.length,4),k=j5("bData",U,O.length,4);if(Z)if(V){let z=d0.size(j)===1,w=d0.size(O)===1,T=j.length>0&&j[j.length-1]%4==0,W=O.length>0&&O[O.length-1]%4==0;X=z||w?D.setByOffset("global_idx",S(z?`${I.type.value}(${I.getByOffset("0")}.x)`:I.getByOffset("global_idx"),w?`${k.type.value}(${k.getByOffset("0")}.x)`:k.getByOffset("global_idx"))):` + let outputIndices = ${D.offsetToIndices("global_idx * 4u")}; + let offsetA = ${I.broadcastedIndicesToOffset("outputIndices",D)}; + let offsetB = ${k.broadcastedIndicesToOffset("outputIndices",D)}; + ${D.setByOffset("global_idx",S(N||T?I.getByOffset("offsetA / 4u"):`${I.type.value}(${I.getByOffset("offsetA / 4u")}[offsetA % 4u])`,N||W?k.getByOffset("offsetB / 4u"):`${k.type.value}(${k.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else X=D.setByOffset("global_idx",S(I.getByOffset("global_idx"),k.getByOffset("global_idx")));else{if(!V)throw Error("no necessary to use scalar implementation for element-wise binary op implementation.");let z=(w,T,W="")=>{let E=`aData[indexA${T}][componentA${T}]`,Q=`bData[indexB${T}][componentB${T}]`;return` + let outputIndices${T} = ${D.offsetToIndices(`global_idx * 4u + ${T}u`)}; + let offsetA${T} = ${I.broadcastedIndicesToOffset(`outputIndices${T}`,D)}; + let offsetB${T} = ${k.broadcastedIndicesToOffset(`outputIndices${T}`,D)}; + let indexA${T} = offsetA${T} / 4u; + let indexB${T} = offsetB${T} / 4u; + let componentA${T} = offsetA${T} % 4u; + let componentB${T} = offsetB${T} % 4u; + ${w}[${T}] = ${W}(${Y(E,Q)}); + `};X=H===9?` + var data = vec4(0); + ${z("data",0,"u32")} + ${z("data",1,"u32")} + ${z("data",2,"u32")} + ${z("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:` + ${z("outputData[global_idx]",0)} + ${z("outputData[global_idx]",1)} + ${z("outputData[global_idx]",2)} + ${z("outputData[global_idx]",3)} + `}return` + ${$.registerUniform("vec_size","u32").declareVariables(I,k,D)} + + ${L??""} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${X} + }`},UH=($,j,O,G,Z,V,N=O.dataType)=>{let J=O.dims.map((D)=>Number(D)??1),R=G.dims.map((D)=>Number(D)??1),U=!d0.areEqual(J,R),H=J,L=d0.size(J),Y=!1,S=!1,X=[U];if(U){let D=zG.calcShape(J,R,!1);if(!D)throw Error("Can't perform binary op on the given tensors");H=D.slice(),L=d0.size(H);let I=d0.size(J)===1,k=d0.size(R)===1,z=J.length>0&&J[J.length-1]%4==0,w=R.length>0&&R[R.length-1]%4==0;X.push(I),X.push(k),X.push(z),X.push(w);let T=1;for(let W=1;WD.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:(D)=>RH(D,J,R,H,Y,U,S,Z,O.dataType,G.dataType,N,V),getRunData:()=>({outputs:[{dims:H,dataType:N}],dispatchGroup:{x:Math.ceil(L/64/4)},programUniforms:[{type:12,data:Math.ceil(d0.size(H)/4)},...$6(J,R,H)]})}},S3=($,j,O,G,Z,V)=>{$.compute(UH(j,Z??"",$.inputs[0],$.inputs[1],O,G,V))},PT=($)=>{S3($,"Add",(j,O)=>`${j}+${O}`)},XT=($)=>{S3($,"Div",(j,O)=>`${j}/${O}`)},TT=($)=>{S3($,"Equal",{scalar:(j,O)=>`u32(${j}==${O})`,vector:(j,O)=>`vec4(${j}==${O})`},void 0,void 0,9)},FT=($)=>{S3($,"Mul",(j,O)=>`${j}*${O}`)},yT=($)=>{let j=j5("input",$.inputs[0].dataType,$.inputs[0].dims).type.value;S3($,"Pow",{scalar:(O,G)=>`pow_custom(${O},${G})`,vector:(O,G)=>`pow_vector_custom(${O},${G})`},` + fn pow_custom(a : ${j}, b : ${j}) -> ${j} { + if (b == ${j}(0.0)) { + return ${j}(1.0); + } else if (a < ${j}(0.0) && f32(b) != floor(f32(b))) { + return ${j}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${j}(1.0), round(f32(abs(b) % ${j}(2.0))) != 1.0) * ${j}(${j==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${j}>, b : vec4<${j}>) -> vec4<${j}> { + // TODO: implement vectorized pow + return vec4<${j}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},zT=($)=>{S3($,"Sub",(j,O)=>`${j}-${O}`)},kT=($)=>{S3($,"Greater",{scalar:(j,O)=>`u32(${j}>${O})`,vector:(j,O)=>`vec4(${j}>${O})`},void 0,void 0,9)},IT=($)=>{S3($,"Less",{scalar:(j,O)=>`u32(${j}<${O})`,vector:(j,O)=>`vec4(${j}<${O})`},void 0,void 0,9)},DT=($)=>{S3($,"GreaterOrEqual",{scalar:(j,O)=>`u32(${j}>=${O})`,vector:(j,O)=>`vec4(${j}>=${O})`},void 0,void 0,9)},WT=($)=>{S3($,"LessOrEqual",{scalar:(j,O)=>`u32(${j}<=${O})`,vector:(j,O)=>`vec4(${j}<=${O})`},void 0,void 0,9)}}),tD=k5(()=>{x6(),I6(),C9(),W6(),HH=($,j)=>{if(!$||$.length<1)throw Error("too few inputs");let O=$[0],G=O.dataType,Z=O.dims.length;$.forEach((V,N)=>{if(N!==0){if(V.dataType!==G)throw Error("input tensors should be one type");if(V.dims.length!==Z)throw Error("input tensors should have the same shape");V.dims.forEach((J,R)=>{if(R!==j&&J!==O.dims[R])throw Error("non concat dimensions must match")})}})},xH=($,j)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${j}); + for (var i: u32 = 0u; i < ${$}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${$}u; + }`,LH=($,j)=>{let O=$.length,G=[];for(let Z=0;Z{let Z=d0.size(O),V=Array($.length),N=Array($.length),J=0,R=[],U=[],H=[{type:12,data:Z}];for(let X=0;X<$.length;++X)J+=$[X].dims[j],V[X]=J,U.push($[X].dims.length),N[X]=j5(`input${X}`,G,U[X]),R.push("rank"),H.push({type:12,data:V[X]});for(let X=0;X<$.length;++X)H.push(...$6($[X].dims));H.push(...$6(O));let L=n5("output",G,O.length),Y=L.indicesGet("indices",j),S=Array.from(Array(V.length).keys()).map((X)=>`uniforms.sizeInConcatAxis${X}`).join(",");return{name:"Concat",shaderCache:{hint:`${j}`,inputDependencies:R},getRunData:()=>({outputs:[{dims:O,dataType:G}],dispatchGroup:{x:Math.ceil(Z/64)},programUniforms:H}),getShaderSource:(X)=>` + + ${(()=>{X.registerUniform("outputSize","u32");for(let D=0;D<$.length;D++)X.registerUniform(`sizeInConcatAxis${D}`,"u32");return X.declareVariables(...N,L)})()} + + ${xH(V.length,S)} + + ${X.mainStart()} + ${X.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + var indices = ${L.offsetToIndices("global_idx")}; + + let inputIndex = calculateInputIndex(${Y}); + if (inputIndex != 0u) { + let sizeInConcatAxis = array(${S}); + ${Y} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${LH(N,L)} + }`}},MT=($,j)=>{let O=$.inputs,G=O[0].dims,Z=d0.normalizeAxis(j.axis,G.length);HH(O,Z);let V=G.slice();V[Z]=O.reduce((J,R)=>J+(R.dims.length>Z?R.dims[Z]:0),0);let N=O.filter((J)=>d0.size(J.dims)>0);$.compute(_H(N,Z,V,O[0].dataType),{inputs:N})},KT=($)=>$9({axis:$.axis})}),O$=k5(()=>{x6(),I6(),a8=($,j,O="f32")=>{switch($.activation){case"Relu":return`value = max(value, ${j}(0.0));`;case"Sigmoid":return`value = (${j}(1.0) / (${j}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${j}(${O}(uniforms.clip_min)), ${j}(${O}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${j}(0.0), min(${j}(1.0), ${O}(uniforms.alpha) * value + ${O}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${O}(uniforms.alpha) * value, value, value >= ${j}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw Error(`Unsupported activation ${$.activation}`)}},r8=($,j)=>{$.activation==="Clip"?j.push({type:1,data:$.clipMax},{type:1,data:$.clipMin}):$.activation==="HardSigmoid"?j.push({type:1,data:$.alpha},{type:1,data:$.beta}):$.activation==="LeakyRelu"&&j.push({type:1,data:$.alpha})},n8=($,j)=>{$.activation==="Clip"?j.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):$.activation==="HardSigmoid"?j.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):$.activation==="LeakyRelu"&&j.push({name:"alpha",type:"f32"})},Qv=($)=>{let j=$?.activation||"";if(j==="HardSigmoid"){let[O,G]=$?.activation_params||[0.2,0.5];return{activation:j,alpha:O,beta:G}}if(j==="Clip"){let[O,G]=$?.activation_params||[OX,GX];return{activation:j,clipMax:G,clipMin:O}}if(j==="LeakyRelu"){let[O]=$?.activation_params||[0.01];return{activation:j,alpha:O}}return{activation:j}}}),gv=k5(()=>{I1=($,j)=>{switch($){case 1:return j;case 2:return`vec2<${j}>`;case 3:return`vec3<${j}>`;case 4:return`vec4<${j}>`;default:throw Error(`${$}-component is not supported.`)}},bT=($)=>` + ${$?"value = value + getBiasByOutputCoords(coords);":""} + `}),eD=k5(()=>{fT=($)=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${$}.x), i32(${$}.y), i32(${$}.z), 1)); +} +`}),uv=k5(()=>{x6(),I6(),W6(),O$(),CZ=($,j,O,G,Z)=>{let V=G-O;return` + ${Array.from({length:O}).map((N,J)=>` + if (${v6(j.shape,J,j.rank)} != 1) { + ${j.indicesSet($,J,v6(Z,J+V,G))} + } else { + ${j.indicesSet($,J,0)} + }`).join("")} +`},Cv=($,j,O,G,Z=!1,V)=>{let N=$[0].dims,J=$[1].dims,R=N[N.length-2],U=J[J.length-1],H=N[N.length-1],L=M9(U),Y=M9(H),S=M9(R),X=d0.size(O)/L/S,D=$.length>2,I=G?G.slice(0,-2):O.slice(0,-2),k=[d0.size(I),R,U],z=[{type:12,data:X},{type:12,data:R},{type:12,data:U},{type:12,data:H}];return r8(j,z),z.push(...$6(I,N,J)),D&&z.push(...$6($[2].dims)),z.push(...$6(k)),{name:"MatMulNaive",shaderCache:{hint:`${j.activation};${L};${Y};${S};${Z}`,inputDependencies:D?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:V?V(O):O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(X/64)},programUniforms:z}),getShaderSource:(w)=>{let T=Ev("batch_dims",$[0].dataType,I.length),W=j5("a",$[0].dataType,N.length,Y),E=j5("b",$[1].dataType,J.length,L),Q=n5("output",$[0].dataType,k.length,L),A=G1(Q.type.tensor),l=a8(j,Q.type.value,A),r=[W,E],e="";if(D){let v0=Z?L:1;r.push(j5("bias",$[2].dataType,$[2].dims.length,v0)),e=Z?`value += bias[col / ${v0}];`:`value += ${Q.type.value}(bias[row + i]);`}let V0=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];return n8(j,V0),` + ${w.registerUniforms(V0).registerInternalVariables(T).declareVariables(...r,Q)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let col = (global_idx % (uniforms.N / ${L})) * ${L}; + var index1 = global_idx / (uniforms.N / ${L}); + let stride1 = uniforms.M / ${S}; + let row = (index1 % stride1) * ${S}; + let batch = index1 / stride1; + + ${O.length===2?"":`let batch_indices = ${T.offsetToIndices("batch")};`} + + var a_indices: ${W.type.indices}; + ${CZ("a_indices",W,W.rank-2,T.rank,"batch_indices")} + ${W.indicesSet("a_indices",W.rank-2,0)} + ${W.indicesSet("a_indices",W.rank-1,0)} + let a_offset = ${W.indicesToOffset("a_indices")}; + + var b_indices: ${E.type.indices}; + ${CZ("b_indices",E,E.rank-2,T.rank,"batch_indices")} + ${E.indicesSet("b_indices",E.rank-2,0)} + ${E.indicesSet("b_indices",E.rank-1,0)} + let b_offset = ${E.indicesToOffset("b_indices")}; + var values: array<${Q.type.value}, ${S}>; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${Y}) { + ${(()=>{let v0=`var a_data: ${W.type.value};`;for(let $0=0;$0{x6(),I6(),W6(),O$(),uv(),gv(),YH=($,j)=>$?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${j?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${j?", batchIndices":""}); + `,SH=($,j)=>$?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${j===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${j===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${j===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,eJ=($,j,O="f32",G,Z=!1,V=32,N=!1,J=32)=>{let R=j[1]*$[1],U=j[0]*$[0],H=Z?R:V,L=Z?V:R,Y=H/j[0],S=V/j[1];if((!Z||Y!==4||$[1]!==4)&&(Z||Y!==3&&Y!==4)||H%j[0]!==0||V%j[1]!==0||$[0]!==4)throw Error(`If transposeA ${Z} is true, innerElementSize ${Y} and workPerThread[1] ${$[1]} must be 4. + Otherwise, innerElementSize ${Y} must be 3 or 4. + tileAWidth ${H} must be divisible by workgroupSize[0]${j[0]}. tileInner ${V} must be divisible by workgroupSize[1] ${j[1]}. colPerThread ${$[0]} must be 4.`);return` +var mm_Asub: array, ${H/Y}>, ${L}>; +var mm_Bsub: array, ${U/$[0]}>, ${V}>; + +const rowPerThread = ${$[1]}; +const colPerThread = ${$[0]}; +const innerElementSize = ${Y}; +const tileInner = ${V}; + +@compute @workgroup_size(${j[0]}, ${j[1]}, ${j[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${N?"0":"i32(globalId.z)"}; + ${G?`let batchIndices = ${G.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${R}; + + let num_tiles = ${N?`${Math.ceil(J/V)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${N?`i32(globalId.z) * ${J}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${S}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${YH(Z,G)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${S}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${G?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${Y===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${SH(Z,Y)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},JN=($,j)=>$?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${j?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${j?", batchIndices":""}); + `,PH=($)=>$?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",$v=($,j,O="f32",G,Z=!1,V=32,N=!1,J=32,R=!1)=>{let U=$[1]*j[1],H=$[0]*j[0],L=Z?U:V,Y=Z?V:U;if(Y%j[1]!==0||L%j[0]!==0||V%j[1]!==0)throw Error(`tileAHight ${Y} must be divisible by workgroupSize[1]${j[1]}, tileAWidth ${L} must be divisible by workgroupSize[0]${j[0]}, tileInner ${V} must be divisible by workgroupSize[1]${j[1]}`);let S=Y/j[1],X=L/j[0],D=V/j[1],I=R?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${U}; + let globalColStart = i32(workgroupId.x) * ${H}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${Y}; inputRow = inputRow + ${j[1]}) { + for (var inputCol = localCol; inputCol < ${L}; inputCol = inputCol + ${j[0]}) { + ${JN(Z,G)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${V}; inputRow = inputRow + ${j[1]}) { + for (var inputCol = localCol; inputCol < ${H}; inputCol = inputCol + ${j[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${G?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${O}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${j[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${Z?`mm_Asub[k][localRow + innerRow * ${j[1]}];`:`mm_Asub[localRow + innerRow * ${j[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${j[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${j[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${U}; + +let tileRowA = i32(localId.y) * ${S}; +let tileColA = i32(localId.x) * ${X}; +let tileRowB = i32(localId.y) * ${D}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${S}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${X}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${JN(Z,G)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${D}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${G?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${O}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${PH(Z)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${Y}>; + var mm_Bsub : array, ${V}>; + const rowPerThread = ${$[1]}; + const colPerThread = ${$[0]}; + const tileInner = ${V}; + +@compute @workgroup_size(${j[0]}, ${j[1]}, ${j[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${N?"0":"i32(globalId.z)"}; + ${G?`let batchIndices = ${G.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${N?`${Math.ceil(J/V)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${N?`i32(globalId.z) * ${J}`:"0"}; + + var acc : array, rowPerThread>; + ${I} + } +`},XH=($,j,O,G,Z=!1)=>{let[V,N,J,R]=G,U=G1(G[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${V.type.indices}) -> ${I1($,U)} { + var value = ${I1($,U)}(0.0); + let col = colIn * ${$}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${N.type.indices}; + ${CZ("aIndices",N,N.rank-2,V.rank,"batchIndices")} + ${N.indicesSet("aIndices",N.rank-2,"u32(row)")} + ${N.indicesSet("aIndices",N.rank-1,"u32(colIn)")} + value = ${N.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${V.type.indices}) -> ${I1($,U)} { + var value = ${I1($,U)}(0.0); + let col = colIn * ${$}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${J.type.indices}; + ${CZ("bIndices",J,J.rank-2,V.rank,"batchIndices")} + ${J.indicesSet("bIndices",J.rank-2,"u32(row)")} + ${J.indicesSet("bIndices",J.rank-1,"u32(colIn)")} + value = ${J.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${I1($,U)}) { + let col = colIn * ${$}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${j?`value = value + ${Z?"bias[colIn]":`${I1($,U)}(bias[row])`};`:""} + ${O} + ${R.setByIndices("vec3(coords)","value")} + } + } + `},vV=($,j,O,G,Z=!1,V)=>{let N=$[0].dims,J=$[1].dims,R=N.slice(0,-2),U=J.slice(0,-2),H=G?G.slice(0,-2):O.slice(0,-2),L=d0.size(H),Y=N[N.length-2],S=N[N.length-1],X=J[J.length-1],D=S%4==0&&X%4==0,I=Y<=8?[4,1,1]:[4,4,1],k=[8,8,1],z=[Math.ceil(X/k[0]/I[0]),Math.ceil(Y/k[1]/I[1]),Math.ceil(L/k[2]/I[2])],w=D?4:1,T=[...R,Y,S/w],W=T.length,E=[...U,S,X/w],Q=E.length,A=[L,Y,X/w],l=[{type:6,data:Y},{type:6,data:X},{type:6,data:S}];r8(j,l),l.push(...$6(H,T,E));let r=["rank","rank"],e=$.length>2;return e&&(l.push(...$6($[2].dims)),r.push("rank")),l.push(...$6(A)),{name:"MatMul",shaderCache:{hint:`${I};${j.activation};${D};${Z}`,inputDependencies:r},getRunData:()=>({outputs:[{dims:V?V(O):O,dataType:$[0].dataType}],dispatchGroup:{x:z[0],y:z[1],z:z[2]},programUniforms:l}),getShaderSource:(V0)=>{let v0=H.length,$0=Ev("batchDims",$[0].dataType,v0,1),i=G1($[0].dataType),G0=j5("a",$[0].dataType,W,w),S0=j5("b",$[1].dataType,Q,w),F0=n5("result",$[0].dataType,A.length,w),s=[G0,S0];if(e){let Z0=Z?w:1;s.push(j5("bias",$[2].dataType,$[2].dims.length,Z0))}let n=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];n8(j,n);let R0=G1(F0.type.tensor),q0=a8(j,F0.type.value,R0),p0=XH(w,e,q0,[$0,G0,S0,F0],Z);return` + ${V0.registerUniforms(n).registerInternalVariables($0).declareVariables(...s,F0)} + ${p0} + ${D?eJ(I,k,i,$0):$v(I,k,i,$0)} + `}}}}),$W=k5(()=>{x6(),k4(),W6(),O$(),gv(),eD(),dv(),TH=($,j,O,G,Z=!1,V,N=4,J=4,R=4,U="f32")=>{let H=(A)=>{switch(A){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw Error(`innerElementSize ${A} is not supported.`)}},L=$?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,Y=$?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,S=$?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",X=$?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",D=$?"row":"col",I=$?"col":"row",k=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${$?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${D} / outWidth; + let outCol = ${D} % outWidth; + + let WRow = ${I} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${I} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${I} % inChannels; + var resData = ${I1(N,U)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${S} && xCol >= 0 && xCol < ${X}) { + ${L} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${((A)=>{switch(A){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${U}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw Error(`innerElementSize ${A} is not supported.`)}})(N)} + } + return resData;`,z=$?j&&G?` + let col = colIn * ${N}; + ${k}`:` + let col = colIn * ${N}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${k} + } + return ${I1(N,U)}(0.0);`:G&&O?` + let col = colIn * ${N}; + ${k}`:` + let col = colIn * ${N}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${k} + } + return ${I1(N,U)}(0.0);`,w=$?G&&O?H(J):` + let col = colIn * ${J}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${H(J)} + } + return ${I1(J,U)}(0.0);`:` + let col = colIn * ${J}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${H(J)} + } + return ${I1(J,U)}(0.0);`,T=I1(R,U),W=I1($?N:J,U),E=I1($?J:N,U),Q=a8(V,T,U);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${W} { + ${$?z:w} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${E} { + ${$?w:z} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${T}) { + let col = colIn * ${R}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${$?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${Y} + ${bT(Z)} + ${Q} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},wT=($,j,O,G,Z,V,N,J,R)=>{let U=j.format==="NHWC",H=U?$[0].dims[3]:$[0].dims[1],L=O[0],Y=U?O[2]:O[3],S=U?O[1]:O[2],X=U?O[3]:O[1],D=U&&(H%4==0||H%3==0)&&X%4==0,I=U?X:Y*S,k=U?Y*S:X,z=[8,8,1],w=G<=8?[4,1,1]:[4,4,1],T=[Math.ceil(I/z[0]/w[0]),Math.ceil(k/z[1]/w[1]),Math.ceil(L/z[2]/w[2])];d6("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${T}`);let W=D?U&&H%4!=0?3:4:1,E=z[1]*w[1],Q=z[0]*w[0],A=Math.max(z[0]*W,z[1]),l=G%E===0,r=Z%Q===0,e=V%A===0,V0=D?[W,4,4]:[1,1,1],v0=[{type:6,data:G},{type:6,data:Z},{type:6,data:V},{type:6,data:[j.pads[0],j.pads[1]]},{type:6,data:j.strides},{type:6,data:j.dilations}];r8(j,v0),v0.push(...$6($[0].dims,$[1].dims));let $0=["rank","rank"];return N&&(v0.push(...$6($[2].dims)),$0.push("rank")),v0.push(...$6(O)),{name:"Conv2DMatMul",shaderCache:{hint:`${j.cacheKey};${W};${D};${l};${r};${e};${E};${Q};${A}`,inputDependencies:$0},getRunData:()=>({outputs:[{dims:R?R(O):O,dataType:$[0].dataType}],dispatchGroup:{x:T[0],y:T[1],z:T[2]},programUniforms:v0}),getShaderSource:(i)=>{let G0=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];n8(j,G0);let S0=D?4:1,F0=G1($[0].dataType),s=` + fn setOutputAtIndex(flatIndex : i32, value : ${D?`vec4<${F0}>`:F0}) { + result[flatIndex] = ${D?`vec4<${F0}>`:F0}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${D?`vec4<${F0}>`:F0}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${D?"/ 4":""}, value); + }`,n=[j5("x",$[0].dataType,$[0].dims.length,W===3?1:W),j5("w",$[1].dataType,$[1].dims.length,S0)],R0=n5("result",$[0].dataType,O.length,S0);if(N){let q0=j5("bias",$[2].dataType,$[2].dims.length,S0);n.push(q0),s+=` + fn getBiasByOutputCoords(coords : vec4) -> ${D?`vec4<${F0}>`:F0} { + return bias[coords.${U?"w":"y"}${D?"/ 4":""}]; + }`}return` + ${fT("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${i.registerUniforms(G0).declareVariables(...n,R0)} + ${s} + ${TH(U,l,r,e,N,j,V0[0],V0[1],V0[2],F0)} + ${D?eJ(w,z,F0,void 0,!U,A):$v(w,z,F0,void 0,!U,A,!1,void 0,J)}`}}}}),jW=k5(()=>{x6(),k4(),I6(),W6(),O$(),gv(),FH=($)=>{let j=1;for(let O=0;O<$.length;O++)j*=$[O];return j},vN=($)=>typeof $=="number"?[$,$,$]:$,RZ=($,j)=>j<=1?$:$+($-1)*(j-1),yH=($,j,O,G=1)=>{let Z=RZ(j,G);return Math.floor(($[0]*(O-1)-O+Z)/2)},RN=($,j,O,G,Z)=>{Z==null&&(Z=yH($,j[0],G[0]));let V=[0,0,0,O];for(let N=0;N<3;N++)$[N]+2*Z>=j[N]&&(V[N]=Math.trunc(($[N]-j[N]+2*Z)/G[N]+1));return V},zH=($,j,O,G,Z,V,N,J,R,U)=>{let H,L,Y,S;if($==="VALID"&&($=0),typeof $=="number"){H={top:$,bottom:$,left:$,right:$,front:$,back:$};let X=RN([j,O,G,1],[J,R,U],1,[Z,V,N],$);L=X[0],Y=X[1],S=X[2]}else if(Array.isArray($)){if(!$.every((D,I,k)=>D===k[0]))throw Error(`Unsupported padding parameter: ${$}`);H={top:$[0],bottom:$[1],left:$[2],right:$[3],front:$[4],back:$[5]};let X=RN([j,O,G,1],[J,R,U],1,[Z,V,N],$[0]);L=X[0],Y=X[1],S=X[2]}else{if($!=="SAME_UPPER")throw Error(`Unknown padding parameter: ${$}`);{L=Math.ceil(j/Z),Y=Math.ceil(O/V),S=Math.ceil(G/N);let X=(L-1)*Z+J-j,D=(Y-1)*V+R-O,I=(S-1)*N+U-G,k=Math.floor(X/2),z=X-k,w=Math.floor(D/2),T=D-w,W=Math.floor(I/2);H={top:w,bottom:T,left:W,right:I-W,front:k,back:z}}}return{padInfo:H,outDepth:L,outHeight:Y,outWidth:S}},ET=($,j,O,G,Z,V=!1,N="channelsLast")=>{let J,R,U,H,L;if(N==="channelsLast")[J,R,U,H,L]=$;else{if(N!=="channelsFirst")throw Error(`Unknown dataFormat ${N}`);[J,L,R,U,H]=$}let[Y,,S,X,D]=j,[I,k,z]=vN(O),[w,T,W]=vN(G),E=RZ(S,w),Q=RZ(X,T),A=RZ(D,W),{padInfo:l,outDepth:r,outHeight:e,outWidth:V0}=zH(Z,R,U,H,I,k,z,E,Q,A),v0=V?Y*L:Y,$0=[0,0,0,0,0];return N==="channelsFirst"?$0=[J,v0,r,e,V0]:N==="channelsLast"&&($0=[J,r,e,V0,v0]),{batchSize:J,dataFormat:N,inDepth:R,inHeight:U,inWidth:H,inChannels:L,outDepth:r,outHeight:e,outWidth:V0,outChannels:v0,padInfo:l,strideDepth:I,strideHeight:k,strideWidth:z,filterDepth:S,filterHeight:X,filterWidth:D,effectiveFilterDepth:E,effectiveFilterHeight:Q,effectiveFilterWidth:A,dilationDepth:w,dilationHeight:T,dilationWidth:W,inShape:$,outShape:$0,filterShape:j}},QT=($,j,O,G,Z,V)=>{let N=V==="channelsLast";N?$[0].dims[3]:$[0].dims[1];let J={x:O.map((Y,S)=>S)},R=[Math.ceil(FH(J.x.map((Y)=>O[Y]))/64),1,1];d6("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${R}`);let U=[{type:12,data:d0.size(O)},{type:12,data:G},{type:12,data:Z},{type:12,data:j.strides},{type:12,data:j.dilations}];r8(j,U),U.push(...$6($[0].dims,$[1].dims));let H=["rank","rank"],L=$.length===3;return L&&(U.push(...$6($[2].dims)),H.push("rank")),U.push(...$6(O)),{name:"Conv3DNaive",shaderCache:{hint:`${j.cacheKey};${N};1;${L}`,inputDependencies:H},getRunData:()=>({outputs:[{dims:O,dataType:$[0].dataType}],dispatchGroup:{x:R[0],y:R[1],z:R[2]},programUniforms:U}),getShaderSource:(Y)=>{let S=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:G.length},{name:"pads",type:"u32",length:Z.length},{name:"strides",type:"u32",length:j.strides.length},{name:"dilations",type:"u32",length:j.dilations.length}];n8(j,S);let X=G1($[0].dataType),D=j5("x",$[0].dataType,$[0].dims.length,1),I=j5("W",$[1].dataType,$[1].dims.length,1),k=[D,I],z=n5("result",$[0].dataType,O.length,1),w="";if(L){let E=j5("bias",$[2].dataType,$[2].dims.length,1);k.push(E),w+=` + fn getBiasByOutputCoords(coords : array) -> ${X} { + return bias[${v6("coords",N?4:1,5)}]; + }`}let T=I1(1,X),W=a8(j,T,X);return` + ${w} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${D.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${I.getByIndices("aIndices")}; + } + ${Y.registerUniforms(S).declareVariables(...k,z)} + ${Y.mainStart()} + ${Y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${z.offsetToIndices("global_idx")}; + let batch = ${v6("coords",0,D.rank)}; + let d2 = ${v6("coords",N?D.rank-1:1,D.rank)}; + let xFRCCorner = vec3(${v6("coords",N?1:2,D.rank)}, + ${v6("coords",N?2:3,D.rank)}, + ${v6("coords",N?3:4,D.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${v6("uniforms.x_shape",N?1:2,D.rank)}; + let xShapeZ = ${v6("uniforms.x_shape",N?2:3,D.rank)}; + let xShapeW = ${v6("uniforms.x_shape",N?3:4,D.rank)}; + let xShapeU = ${v6("uniforms.x_shape",N?4:1,D.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${N?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${N?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${N?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${N?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${L?"value = value + getBiasByOutputCoords(coords)":""}; + ${W} + result[global_idx] = f32(value); + }`}}}}),OW=k5(()=>{x6(),I6(),W6(),O$(),CT=($,j,O,G)=>{let Z=$.length>2,V=Z?"value += b[output_channel];":"",N=$[0].dims,J=$[1].dims,R=j.format==="NHWC",U=R?O[3]:O[1],H=U/j.group,L=R&&H>=4?M9(U):1,Y=d0.size(O)/L,S=[{type:12,data:Y},{type:12,data:j.dilations},{type:12,data:[j.strides[0],j.strides[1]]},{type:12,data:[j.pads[0],j.pads[1]]},{type:12,data:H}];r8(j,S),S.push(...$6(N,[J[0],J[1],J[2],J[3]/L]));let X=Z?["rank","rank","rank"]:["rank","rank"];return S.push(...$6([O[0],O[1],O[2],O[3]/L])),{name:"GroupedConv",shaderCache:{hint:`${j.cacheKey}_${L}`,inputDependencies:X},getRunData:()=>({outputs:[{dims:G?G(O):O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(Y/64)},programUniforms:S}),getShaderSource:(D)=>{let I=n5("output",$[0].dataType,O.length,L),k=G1(I.type.tensor),z=a8(j,I.type.value,k),w=j5("x",$[0].dataType,N.length),T=j5("w",$[1].dataType,J.length,L),W=[w,T];Z&&W.push(j5("b",$[2].dataType,$[2].dims,L));let E=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:j.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];n8(j,E);let Q=R?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${w.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${T.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${w.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${T.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${D.registerUniforms(E).declareVariables(...W,I)} + + ${D.mainStart()} + ${D.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${I.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${R?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${R?1:2}], outputIndices[${R?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${L} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${R?2:1}]; + + var value: ${I.type.value} = ${I.type.value}(0); + ${Q} + ${V} + ${z} + ${I.setByOffset("global_idx","value")} + }`}}},BT=($,j,O,G)=>{let Z=$.length>2,V=M9(O[3]),N=M9(O[2]),J=d0.size(O)/V/N,R=[$[0].dims[0],$[0].dims[1],$[0].dims[2],$[0].dims[3]/V],U=[$[1].dims[0],$[1].dims[1],$[1].dims[2],$[1].dims[3]/V],H=[O[0],O[1],O[2],O[3]/V],L=[{type:12,data:J},{type:6,data:[j.strides[0],j.strides[1]]},{type:6,data:[j.pads[0],j.pads[1]]}];r8(j,L),L.push(...$6(R,U,H));let Y=(N-1)*j.strides[1]+U[1];return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${j.cacheKey};${V};${N};${Y};${U[0]};${U[1]}`,inputDependencies:Z?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:G?G(O):O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(J/64)},programUniforms:L}),getShaderSource:(S)=>{let X=n5("output",$[0].dataType,H.length,V),D=G1(X.type.tensor),I=a8(j,X.type.value,D),k=j5("x",$[0].dataType,R.length,V),z=j5("w",$[1].dataType,U.length,V),w=[k,z];Z&&w.push(j5("b",$[2].dataType,$[2].dims,V));let T=Z?"value += b[output_channel];":"",W=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return n8(j,W),` + ${S.registerUniforms(W).declareVariables(...w,X)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${N}u; + let col = (index1 % width1) * ${N}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${k.type.value}, ${Y}>; + var values: array<${X.type.value}, ${N}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${U[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${Y}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${k.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${k.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${U[1]}; w_width++) { + let w_val = ${z.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${N}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${N}u; i++) { + var value = values[i]; + ${T} + ${I} + ${X.set("batch","row","col + i","output_channel","value")}; + } + }`}}}}),GW=k5(()=>{I6(),$W(),jW(),dv(),OW(),O$(),uv(),J7(),kH=($,j,O,G,Z,V)=>{let N=$[0],J=$.slice(V?1:2,V?3:4),R=J.length,U=j[0],H=j.slice(2).map((Y,S)=>Y+(Y-1)*(O[S]-1)),L=J.map((Y,S)=>Y+G[S]+G[S+R]).map((Y,S)=>Math.floor((Y-H[S]+Z[S])/Z[S]));return L.splice(0,0,N),L.splice(V?3:1,0,U),L},bq=[2,3,1,0],IH=($,j)=>{if(!$||$.length!==2&&$.length!==3)throw Error("Conv requires 2 or 3 inputs");if($[0].dims.length>5)throw Error("greater than 5D is not supported");if($[0].dims.length!==$[1].dims.length)throw Error("filter does not have same dimension as input");if($[0].dims[j.format==="NHWC"?$[0].dims.length-1:1]!==$[1].dims[1]*j.group)throw Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if($.length===3&&($[2].dims.length!==1||$[1].dims[0]!==$[2].dims[0]))throw Error("invalid bias");let O=$[0].dims.length-2;if(j.dilations.length!==O)throw Error(`dilations should be ${O}D`);if(j.strides.length!==O)throw Error(`strides should be ${O}D`);if(j.pads.length!==2*O)throw Error(`pads should be ${2*O}D`);if(j.kernelShape.length!==0&&j.kernelShape.length!==$[1].dims.length-2)throw Error("invalid kernel shape")},fq=($,j)=>{let O=$.kernelShape.slice();O.length{let j=Qv($),O=$.format;return{autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][$.auto_pad],format:O,dilations:$.dilations,group:$.group,kernelShape:$.kernel_shape,pads:$.pads,strides:$.strides,wIsConst:$.w_is_const(),...j,cacheKey:`${$.format};${j.activation};`}},UN=($,j,O,G)=>{let Z=O.format==="NHWC",V=kH(j[0].dims,j[1].dims,O.dilations,O.pads,O.strides,Z);if(O.group!==1){let W=[j[0]];if(Z){let E=$.kernelCustomData.wT??$.compute(P2(j[1],bq),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=E),W.push(E)}else W.push(j[1]);return j.length===3&&W.push(j[2]),void(!$.adapterInfo.isArchitecture("ampere")&&Z&&j[1].dims[0]===O.group&&j[1].dims[1]===1&&O.dilations[0]===1&&O.dilations[1]===1?$.compute(BT(W,O,V,G),{inputs:W}):$.compute(CT(W,O,V,G),{inputs:W}))}let N=j.length===3,J=j[0].dims[Z?1:2],R=j[0].dims[Z?2:3],U=j[0].dims[Z?3:1],H=j[1].dims[2],L=j[1].dims[3],Y=V[Z?1:2],S=V[Z?2:3],X=V[Z?3:1],D=Z&&H===J&&L===R&&O.pads[0]===0&&O.pads[1]===0;if(D||H===1&&L===1&&O.dilations[0]===1&&O.dilations[1]===1&&O.strides[0]===1&&O.strides[1]===1&&O.pads[0]===0&&O.pads[1]===0){let W,E,Q,A=V[0],l=[];if(Z){let V0=$.kernelCustomData.wT??$.compute(P2(j[1],bq),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];if(O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=V0),D){let v0=J*R*U;W=j[0].reshape([1,A,v0]),E=V0.reshape([1,v0,X]),Q=[1,A,X]}else W=j[0].reshape([A,J*R,U]),E=V0.reshape([1,U,X]),Q=[A,Y*S,X];l.push(W),l.push(E)}else W=j[0].reshape([A,U,J*R]),E=j[1].reshape([1,X,U]),Q=[A,X,Y*S],l.push(E),l.push(W);N&&l.push(j[2]);let r=Q[2],e=l[0].dims[l[0].dims.length-1];return void(r<8&&e<8?$.compute(Cv(l,O,V,Q,Z,G),{inputs:l}):$.compute(vV(l,O,V,Q,Z,G),{inputs:l}))}let I=$.kernelCustomData.wT??$.compute(P2(j[1],bq),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=I);let k=[j[0],I];N&&k.push(j[2]);let z=Z?Y*S:X,w=Z?X:Y*S,T=H*L*U;$.compute(wT(k,O,V,z,w,T,N,!0,G),{inputs:k})},DH=($,j)=>{let O=j.format==="NHWC",G=[$.inputs[0].reshape(O?[$.inputs[0].dims[0],1,$.inputs[0].dims[1],$.inputs[0].dims[2]]:[$.inputs[0].dims[0],$.inputs[0].dims[1],1,$.inputs[0].dims[2]]),$.inputs[1].reshape([$.inputs[1].dims[0],$.inputs[1].dims[1],1,$.inputs[1].dims[2]])];$.inputs.length===3&&G.push($.inputs[2]);let Z=[0,j.pads[0],0,j.pads[1]],V=[1].concat(j.strides),N=[1].concat(j.dilations),J=[1].concat(j.kernelShape),R=fq({...j,pads:Z,strides:V,dilations:N,kernelShape:J},G);UN($,G,R,(U)=>O?[U[0],U[2],U[3]]:[U[0],U[1],U[3]])},WH=($,j,O)=>{let G=O.format==="NHWC"?"channelsLast":"channelsFirst",Z=fq(O,j),V=O.autoPad==="NOTSET"?O.pads:O.autoPad,N=ET(j[0].dims,j[1].dims,O.strides,O.dilations,V,!1,G);$.compute(QT(j,Z,N.outShape,[N.filterDepth,N.filterHeight,N.filterWidth],[N.padInfo.front,N.padInfo.top,N.padInfo.left],G))},Ov=($,j)=>{if(IH($.inputs,j),$.inputs[0].dims.length===3)DH($,j);else if($.inputs[0].dims.length===5)WH($,$.inputs,j);else{let O=fq(j,$.inputs);UN($,$.inputs,O)}}}),ZW=k5(()=>{x6(),k4(),I6(),W6(),hT=($,j,O)=>{let G=$.length>2,Z=j.outputShape,V=j.format==="NHWC",N=j.group,J=$[1].dims,R=J[2]/N,U=J[3],H=V?M9(R):1,L=V&&U===1&&R>=4,Y=L?4*Math.floor(R/4):Math.floor(R/H)*H,S=R-Y,X=V?M9(U):1,D=V?U===1?H:X:1,I=d0.size(Z)/X,k=[Math.ceil(I/64),1,1];d6("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${k}`);let z=["rank","rank"],w=[j.strides[0],j.strides[1]],T=[j.kernelShape[V?1:2],j.kernelShape[V?2:3]],W=[j.dilations[0],j.dilations[1]],E=[T[0]+(j.dilations[0]<=1?0:(j.kernelShape[V?1:2]-1)*(j.dilations[0]-1)),T[1]+(j.dilations[1]<=1?0:(j.kernelShape[V?2:3]-1)*(j.dilations[1]-1))],Q=[E[0]-1-Math.floor((j.pads[0]+j.pads[2])/2),E[1]-1-Math.floor((j.pads[1]+j.pads[3])/2)],A=[{type:12,data:I},{type:12,data:w},{type:12,data:T},{type:12,data:W},{type:12,data:E},{type:6,data:Q},{type:12,data:Y},{type:12,data:R},{type:12,data:U},...$6($[0].dims,$[1].dims)];return G&&(A.push(...$6($[2].dims)),z.push("rank")),A.push(...$6(Z)),{name:"ConvTranspose2D",shaderCache:{hint:`${j.cacheKey};${H}${D}${X}${L}${S}`,inputDependencies:z},getRunData:()=>({dispatchGroup:{x:k[0],y:k[1],z:k[2]},outputs:[{dims:O?O(Z):Z,dataType:$[0].dataType}],programUniforms:A}),getShaderSource:(l)=>{let r=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:w.length},{name:"filter_dims",type:"u32",length:T.length},{name:"dilations",type:"u32",length:T.length},{name:"effective_filter_dims",type:"u32",length:E.length},{name:"pads",type:"i32",length:Q.length},{name:"input_channels_per_group_int",type:"u32"},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],e=G1($[0].dataType),V0=V?1:2,v0=V?2:3,$0=V?3:1,i=j5("W",$[1].dataType,$[1].dims.length,D),G0=j5("Dy",$[0].dataType,$[0].dims.length,H),S0=[G0,i];G&&S0.push(j5("bias",$[2].dataType,[Z[$0]].length,X));let F0=n5("result",$[0].dataType,Z.length,X),s=` + let outputIndices = ${F0.offsetToIndices(`global_idx * ${X}`)}; + let batch = ${F0.indicesGet("outputIndices",0)}; + let d1 = ${F0.indicesGet("outputIndices",$0)}; + let r = ${F0.indicesGet("outputIndices",V0)}; + let c = ${F0.indicesGet("outputIndices",v0)}; + let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${F0.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${e}(dyRCorner) + ${e}(wR)) / ${e}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${e}(uniforms.Dy_shape[${V0}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${e}(dyCCorner) + ${e}(wC)) / ${e}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${e}(uniforms.Dy_shape[${v0}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + ${L?` + var x_offset = ${G0.indicesToOffset(`${G0.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${H}; + var w_offset = ${i.indicesToOffset(`${i.type.indices}(wRPerm, wCPerm, inputChannel, wOutChannel)`)} / ${D}; + `:""} + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group_int; d2 = d2 + ${L?4:H}) { + ${(()=>{let n="";if(L)H===4?n+=` + let xValue = ${G0.getByOffset("x_offset")}; + let wValue = ${i.getByOffset("w_offset")}; + dotProd = dotProd + dot(xValue, wValue); + x_offset += 1u; + w_offset += 1u;`:H===2?n+=` + dotProd = dotProd + dot(vec4<${e}>(${G0.getByOffset("x_offset")}, ${G0.getByOffset("x_offset + 1u")}), vec4<${e}>(${i.getByOffset("w_offset")}, ${i.getByOffset("w_offset + 1u")})); + x_offset += 2u; + w_offset += 2u;`:H===1&&(n+=` + dotProd = dotProd + dot(vec4<${e}>(${G0.getByOffset("x_offset")}, ${G0.getByOffset("x_offset + 1u")}, ${G0.getByOffset("x_offset + 2u")}, ${G0.getByOffset("x_offset + 3u")}), vec4<${e}>(${i.getByOffset("w_offset")}, ${i.getByOffset("w_offset + 1u")}, ${i.getByOffset("w_offset + 2u")}, ${i.getByOffset("w_offset + 3u")})); + x_offset += 4u; + w_offset += 4u;`);else if(n+=` + let xValue = ${V?G0.getByOffset(`${G0.indicesToOffset(`${G0.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${H}`):G0.get("batch","inputChannel","idyR","idyC")}; + `,H===1)n+=` + let w_offset = ${i.indicesToOffset(`${i.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${i.getByOffset(`w_offset / ${D}`)}; + dotProd = dotProd + xValue * wValue;`;else for(let R0=0;R0{if(S===0)return"";if(!L)throw Error(`packInputAs4 ${L} is not true.`);let n="";if(H===1){n+="dotProd = dotProd";for(let R0=0;R0{ZW(),O$(),J7(),MH=($,j,O,G,Z,V)=>($-1)*j+O+(G-1)*Z+1-V,KH=($,j,O,G,Z)=>{let V=Math.floor($/2);j==="SAME_UPPER"?(O[G]=V,O[Z]=$-V):j==="SAME_LOWER"&&(O[G]=$-V,O[Z]=V)},bH=($,j,O,G,Z,V,N,J,R,U)=>{let H=$.length-2,L=U.length===0;R.length{let O=$.kernelShape.slice();if($.kernelShape.length===0||$.kernelShape.reduce((L,Y)=>L*Y,1)===0){O.length=0;for(let L=2;LL+Y,0)===0){let L=j[0].dims.length-2;R=Array(L).fill(1)}let U=$.strides.slice();if(U.reduce((L,Y)=>L+Y,0)===0){let L=j[0].dims.length-2;U=Array(L).fill(1)}bH(J,O,R,$.autoPad,$.group,Z,U,G,N,V);let H=Object.assign({},$);return Object.assign(H,{kernelShape:O,pads:Z,outputPadding:N,outputShape:V,dilations:R,strides:U}),H},cT=($)=>{let j=Qv($),O=$.format,G=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof $.autoPad>"u"?0:$.autoPad],Z=$.dilations,V=$.group,N=$.kernelShape,J=$.pads,R=$.strides,U=$.wIsConst();return{autoPad:G,format:O,dilations:Z,group:V,kernelShape:N,outputPadding:$.outputPadding,outputShape:$.outputShape,pads:J,strides:R,wIsConst:U,...j,cacheKey:`${$.format};${j.activation};`}},fH=($,j)=>{if(!$||$.length!==2&&$.length!==3)throw Error("Conv requires 2 or 3 inputs");if($[0].dims.length!==4&&$[0].dims.length!==3)throw Error("currently only support 2-dimensional conv");if($[0].dims.length!==$[1].dims.length)throw Error("filter does not have same dimension as input");if($[0].dims[j.format==="NHWC"?$[0].dims.length-1:1]!==$[1].dims[0])throw Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let O=$[1].dims[1]*j.group;if($.length===3&&($[2].dims.length!==1||$[2].dims[0]!==O))throw Error("invalid bias");let G=$[0].dims.length-2;if(j.dilations.reduce((Z,V)=>Z+V,0)>0&&j.dilations.length!==G)throw Error(`dilations should be ${G}D`);if(j.strides.reduce((Z,V)=>Z+V,0)>0&&j.strides.length!==G)throw Error(`strides should be ${G}D`);if(j.pads.reduce((Z,V)=>Z+V,0)>0&&j.pads.length!==2*G)throw Error(`pads should be ${2*G}D`);if(j.outputPadding.length!==G&&j.outputPadding.length!==0)throw Error(`output_padding should be ${G}D`);if(j.kernelShape.reduce((Z,V)=>Z+V,0)>0&&j.kernelShape.length!==0&&j.kernelShape.length!==$[1].dims.length-2)throw Error("invalid kernel shape");if(j.outputShape.length!==0&&j.outputShape.length!==$[0].dims.length-2)throw Error("invalid output shape")},xN=($,j,O,G)=>{let Z=$.kernelCustomData.wT??$.compute(P2(j[1],[2,3,0,1]),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=Z);let V=[j[0],Z];j.length===3&&V.push(j[2]),$.compute(hT(V,O,G),{inputs:V})},wH=($,j)=>{let O=j.format==="NHWC",G=[$.inputs[0].reshape(O?[$.inputs[0].dims[0],1,$.inputs[0].dims[1],$.inputs[0].dims[2]]:[$.inputs[0].dims[0],$.inputs[0].dims[1],1,$.inputs[0].dims[2]]),$.inputs[1].reshape([$.inputs[1].dims[0],$.inputs[1].dims[1],1,$.inputs[1].dims[2]])];$.inputs.length===3&&G.push($.inputs[2]);let Z=j.kernelShape;(Z.length===0||Z[0]===0)&&(Z=[$.inputs[1].dims[2]]);let V=j.dilations;(V.length===0||V[0]===0)&&(V=[1]);let N=j.strides;(N.length===0||N[0]===0)&&(N=[1]);let J=j.pads;J.length===0&&(J=[0,0]),J=[0,J[0],0,J[1]],N=[1].concat(N),V=[1].concat(V),Z=[1].concat(Z);let R=j.outputPadding;R=[0].concat(R);let U=HN({...j,pads:J,strides:N,dilations:V,kernelShape:Z,outputPadding:R},G);xN($,G,U,(H)=>O?[H[0],H[2],H[3]]:[H[0],H[1],H[3]])},mT=($,j)=>{if(fH($.inputs,j),$.inputs[0].dims.length===3)wH($,j);else{let O=HN(j,$.inputs);xN($,$.inputs,O)}}}),VW=k5(()=>{x6(),I6(),C9(),W6(),EH=($,j,O,G)=>{let Z=d0.size(j),V=j.length,N=j5("input",$,V),J=n5("output",$,V),R=O.dataType===6?O.getInt32Array()[0]:Number(O.getBigInt64Array()[0]),U=d0.normalizeAxis(R,V);return{name:"CumSum",shaderCache:{hint:G.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:j,dataType:$}],dispatchGroup:{x:Math.ceil(Z/64)},programUniforms:[{type:12,data:Z},{type:12,data:U},...$6(j,j)]}),getShaderSource:(H)=>{let L=` i32(${N.indicesGet("inputIndices","uniforms.axis")}) `,Y=v6("uniforms.input_shape","uniforms.axis",V),S=G.reverse?L+(G.exclusive?" + 1":""):"0",X=G.reverse?Y:L+(G.exclusive?"":" + 1");return` + ${H.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(N,J)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${J.offsetToIndices("global_idx")}; + var sum = ${J.type.value}(0); + let first : i32 = ${S}; + let last : i32 = ${X}; + for (var i : i32 = first; i < last; i++) { + ${N.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${N.getByIndices("inputIndices")}; + } + ${J.setByOffset("global_idx","sum")}; + }`}}},pT=($,j)=>{let O=$.inputs[0].dims,G=$.inputs[0].dataType,Z=$.inputs[1];$.compute(EH(G,O,Z,j),{inputs:[0]})},AT=($)=>{let j=$.exclusive===1,O=$.reverse===1;return $9({exclusive:j,reverse:O})}}),NW=k5(()=>{x6(),I6(),C9(),W6(),QH=($)=>{if(!$||$.length!==1)throw Error("DepthToSpace requires 1 input.");if($[0].dims.length!==4)throw Error("DepthToSpace requires 4D input.")},CH=($,j,O,G)=>{let Z=[];Z.push(`fn perm(i: ${G.type.indices}) -> ${O.type.indices} { + var a: ${O.type.indices};`);for(let V=0;V{let O,G,Z,V,N,J,R=j.format==="NHWC",U=j.blocksize,H=j.mode==="DCR";R?([O,G,Z,V]=$.dims,N=H?[O,G,Z,U,U,V/U**2]:[O,G,Z,V/U**2,U,U],J=H?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([O,G,Z,V]=[$.dims[0],$.dims[2],$.dims[3],$.dims[1]],N=H?[O,U,U,V/U**2,G,Z]:[O,V/U**2,U,U,G,Z],J=H?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let L=$.reshape(N),Y=L.dims.length,S=$.dataType,X=j5("a",S,Y),D=n5("output",S,Y);return{name:"DepthToSpace",shaderCache:{hint:`${$.dims};${j.blocksize};${j.mode}`,inputDependencies:["rank"]},getRunData:(I)=>{let k=R?[O,G*U,Z*U,V/U**2]:[O,V/U**2,G*U,Z*U],z=d0.size(k),w=L.dims,T=d0.sortBasedOnPerm(w,J);return{outputs:[{dims:k,dataType:I[0].dataType}],dispatchGroup:{x:Math.ceil(z/64)},programUniforms:[{type:12,data:z},...$6(w,T)]}},getShaderSource:(I)=>` + ${I.registerUniform("output_size","u32").declareVariables(X,D)} + + ${CH(J,Y,X,D)} + + ${I.mainStart()} + ${I.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${D.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${D.setByOffset("global_idx",X.getByIndices("aIndices"))} + }`}},gT=($,j)=>{QH($.inputs),$.compute(BH($.inputs[0],j))},uT=($)=>$9({blocksize:$.blocksize,mode:$.mode,format:$.format})}),JW=k5(()=>{x6(),I6(),C9(),W6(),_N="^"+(wq="("+(LN="[a-zA-Z]|\\.\\.\\.")+")+")+"$",hH="^"+("("+wq+",)*"+wq)+"$",cH=class{constructor($=-1){this.symbolToIndices=new Map,this.inputIndex=$}addSymbol($,j){let O=this.symbolToIndices.get($);O===void 0?O=[j]:O.push(j),this.symbolToIndices.set($,O)}},mH=class{constructor($,j){this.equation=j,this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=[],this.outputDims=[];let[O,G]=j.includes("->")?j.split("->",2):[j,""];if(!O.match(RegExp(hH)))throw Error("Invalid LHS term");if(O.split(",").forEach((Z,V)=>{let N=$[V].dims.slice();if(!Z.match(RegExp(_N)))throw Error("Invalid LHS term");let J=this.processTerm(Z,!0,N,V);this.lhs.push(J)}),G==="")G+=[...this.symbolToInfo.entries()].filter(([Z,V])=>V.count===1||Z==="...").map(([Z])=>Z).join("");else if(!G.match(RegExp(wq)))throw Error("Invalid RHS");G.match(RegExp(LN,"g"))?.forEach((Z)=>{if(Z==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let V=this.symbolToInfo.get(Z);if(V===void 0)throw Error("Invalid RHS symbol");this.outputDims.push(V.dimValue)}}),this.rhs=this.processTerm(G,!1,this.outputDims)}addSymbol($,j,O){let G=this.symbolToInfo.get($);if(G!==void 0){if(G.dimValue!==j&&G.count!==1)throw Error("Dimension mismatch");G.count++,G.inputIndices.push(O)}else G={count:1,dimValue:j,inputIndices:[O]};this.symbolToInfo.set($,G)}processTerm($,j,O,G=-1){let Z=O.length,V=!1,N=[],J=0;if(!$.match(RegExp(_N))&&!j&&$!=="")throw Error("Invalid LHS term");let R=$.match(RegExp(LN,"g")),U=new cH(G);return R?.forEach((H,L)=>{if(H==="..."){if(V)throw Error("Only one ellipsis is allowed per input term");V=!0;let Y=Z-R.length+1;if(Y<0)throw Error("Ellipsis out of bounds");if(N=O.slice(J,J+Y),this.hasEllipsis){if(this.ellipsisDims.length!==N.length||this.ellipsisDims.toString()!==N.toString())throw Error("Ellipsis dimensions mismatch")}else{if(!j)throw Error("Ellipsis must be specified in the LHS");this.hasEllipsis=!0,this.ellipsisDims=N}for(let S=0;S$+"_max",pH=($,j,O,G)=>{let Z=$.map((R)=>R.length).map((R,U)=>j5(`input${U}`,j,R)),V=d0.size(G),N=n5("output",j,G.length),J=[...O.symbolToInfo.keys()].filter((R)=>!O.rhs.symbolToIndices.has(R));return{name:"Einsum",shaderCache:{hint:O.equation,inputDependencies:$.map(()=>"rank")},getRunData:()=>{let R=J.filter((H)=>O.symbolToInfo.has(H)).map((H)=>({type:12,data:O.symbolToInfo.get(H)?.dimValue||0}));R.push({type:12,data:V});let U=$.map((H,L)=>[...$6(H)]).reduce((H,L)=>H.concat(L),R);return U.push(...$6(G)),{outputs:[{dims:G,dataType:j}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:U}},getShaderSource:(R)=>{let U=[],H=[],L=[],Y=[],S=[],X=O.symbolToInfo.size===O.rhs.symbolToIndices.size;O.symbolToInfo.forEach((I,k)=>{if(O.rhs.symbolToIndices.has(k)){let z=O.rhs.symbolToIndices.get(k)?.[0];z!==void 0&&O.lhs.forEach((w,T)=>{if(I.inputIndices.includes(T)){let W=w.symbolToIndices.get(k);if(W===void 0)throw Error("Invalid symbol error");W.forEach((E)=>{U.push(`${Z[T].indicesSet(`input${T}Indices`,E,N.indicesGet("outputIndices",z))}`)})}})}else O.lhs.forEach((z,w)=>{if(I.inputIndices.includes(w)){let T=z.symbolToIndices.get(k);if(T===void 0)throw Error("Invalid symbol error");T.forEach((W)=>{H.push(`${Z[w].indicesSet(`input${w}Indices`,W,`${k}`)}`)}),S.push(`prod *= ${Z[w].getByIndices(`input${w}Indices`)};`)}}),L.push(`for(var ${k}: u32 = 0; ${k} < uniforms.${YN(k)}; ${k}++) {`),Y.push("}")});let D=X?[...U,`let sum = ${Z.map((I,k)=>I.getByIndices(`input${k}Indices`)).join(" * ")};`]:[...U,"var sum = 0.0;",...L,...H,"var prod = 1.0;",...S,"sum += prod;",...Y];return` + ${R.registerUniforms(J.map((I)=>({name:`${YN(I)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...Z,N)} + + ${R.mainStart()} + ${R.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${N.offsetToIndices("global_idx")}; + ${Z.map((I,k)=>`var input${k}Indices: ${Z[k].type.indices};`).join(` +`)} + ${D.join(` +`)}; + ${N.setByOffset("global_idx","sum")}; + }`}}},dT=($,j)=>{let O=new mH($.inputs,j.equation),G=O.outputDims,Z=$.inputs.map((V,N)=>V.dims);$.compute(pH(Z,$.inputs[0].dataType,O,G))},lT=($)=>{let j=$.equation.replace(/\s+/g,"");return $9({equation:j})}}),vW=k5(()=>{x6(),I6(),W6(),AH=($)=>{if(!$||$.length!==2)throw Error("Expand requires 2 input.");let j=$[0].dims,O=Array.from($[1].getBigInt64Array(),Number),G=O.length{let O=$.length-j.length,G=[];for(let Z=0;Z$.length>j.length?SN($,j):SN(j,$),uH=($)=>{let j=$[0].dims,O=Array.from($[1].getBigInt64Array(),Number),G=gH(j,O),Z=$[0].dataType,V=Z===9||d0.size(j)===1,N=Z===9||j.length>0&&j[j.length-1]%4==0?4:1,J=V||G.length>0&&G[G.length-1]%4==0?4:1,R=Math.ceil(d0.size(G)/J),U=[{type:12,data:R},...$6(j,G)];return{name:"Expand",shaderCache:{hint:`${G.length};${N}${J}`,inputDependencies:["rank"]},getShaderSource:(H)=>{let L,Y=j5("input",Z,j.length,N),S=n5("output",Z,G.length,J);if(Z===9){let X=(D,I,k="")=>` + let outputIndices${I} = ${S.offsetToIndices(`outputOffset + ${I}u`)}; + let offset${I} = ${Y.broadcastedIndicesToOffset(`outputIndices${I}`,S)}; + let index${I} = offset${I} / 4u; + let component${I} = offset${I} % 4u; + ${D}[${I}] = ${k}(${Y.getByOffset(`index${I}`)}[component${I}]); + `;L=` + let outputOffset = global_idx * ${J}; + var data = vec4(0); + ${X("data",0,"u32")} + ${X("data",1,"u32")} + ${X("data",2,"u32")} + ${X("data",3,"u32")} + ${S.setByOffset("global_idx","data")} + }`}else L=` + let outputIndices = ${S.offsetToIndices(`global_idx * ${J}`)}; + let inputOffset = ${Y.broadcastedIndicesToOffset("outputIndices",S)}; + let data = ${S.type.value}(${Y.getByOffset(`inputOffset / ${N}`)}); + ${S.setByOffset("global_idx","data")} + }`;return` + ${H.registerUniform("vec_size","u32").declareVariables(Y,S)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${L}`},getRunData:()=>({outputs:[{dims:G,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:U})}},oT=($)=>{AH($.inputs),$.compute(uH($.inputs),{inputs:[0]})}}),RW=k5(()=>{x6(),I6(),W6(),Av(),dH=($)=>{let j=$[0].dataType,O=d0.size($[0].dims),G=d0.size($[1].dims),Z=G%4==0;return{name:"FastGeluWithBias",shaderCache:{hint:`${Z}`,inputDependencies:["type","type"]},getShaderSource:(V)=>{let N=j5("x",j,[1],4),J=j5("bias",j,[1],4),R=n5("y",j,[1],4),U=(L)=>` + let bias${L}_offset: u32 = (global_idx * 4 + ${L}) % uniforms.bias_size; + let bias${L} = ${J.getByOffset(`bias${L}_offset / 4`)}[bias${L}_offset % 4];`,H=Z?` + let bias = ${J.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${U(0)}${U(1)}${U(2)}${U(3)} + let bias = ${N.type.value}(bias0, bias1, bias2, bias3);`;return`${V.registerUniforms([{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}]).declareVariables(N,J,R)} + + ${nJ(z1(j))} + + ${V.mainStart(kG)} + ${V.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${N.getByOffset("global_idx")}; + ${H} + let x_in = x + bias; + ${R.setByOffset("global_idx",tJ("x_in"))} + }`},getRunData:(V)=>({outputs:[{dims:V[0].dims,dataType:V[0].dataType}],programUniforms:[{type:12,data:Math.ceil(O/4)},{type:12,data:G}],dispatchGroup:{x:Math.ceil(O/kG/4)}})}},sT=($)=>{$.inputs.length<2||d0.size($.inputs[1].dims)===0?xT($):$.compute(dH($.inputs))}}),UW=k5(()=>{x6(),I6(),C9(),W6(),lH=($)=>{if(!$||$.length!==2)throw Error("Gather requires 2 inputs.")},oH=($,j)=>{let O=$[0].dims,G=$[1].dims,Z=O.length,V=d0.normalizeAxis(j.axis,Z),N=O.slice(0);N.splice(V,1,...G);let J=O[V],R=$[0].dataType===9?4:1,U=Math.ceil(d0.size(N)/R),H=[{type:12,data:U},{type:6,data:J},{type:12,data:V},...$6($[0].dims,$[1].dims,N)];return{name:"Gather",shaderCache:{hint:j.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:N,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(U/64)},programUniforms:H}),getShaderSource:(L)=>{let Y,S=j5("data",$[0].dataType,$[0].dims.length,R),X=j5("inputIndices",$[1].dataType,$[1].dims.length),D=n5("output",$[0].dataType,N.length,R),I=(k)=>{let z=G.length,w=`var indicesIndices${k} = ${X.type.indices}(0);`;for(let T=0;T1?`indicesIndices${k}[${T}]`:`indicesIndices${k}`} = ${N.length>1?`outputIndices${k}[uniforms.axis + ${T}]`:`outputIndices${k}`};`;w+=` + var idx${k} = ${X.getByIndices(`indicesIndices${k}`)}; + if (idx${k} < 0) { + idx${k} = idx${k} + uniforms.axisDimLimit; + } + var dataIndices${k} : ${S.type.indices}; + `;for(let T=0,W=0;T1?`dataIndices${k}[${T}]`:`dataIndices${k}`} = u32(idx${k});`,W+=z):(w+=`${Z>1?`dataIndices${k}[${T}]`:`dataIndices${k}`} = ${N.length>1?`outputIndices${k}[${W}]`:`outputIndices${k}`};`,W++);return w};if($[0].dataType===9){let k=(z,w,T="")=>` + let outputIndices${w} = ${D.offsetToIndices(`outputOffset + ${w}u`)}; + ${I(w)}; + let offset${w} = ${S.indicesToOffset(`dataIndices${w}`)}; + let index${w} = offset${w} / 4u; + let component${w} = offset${w} % 4u; + ${z}[${w}] = ${T}(${S.getByOffset(`index${w}`)}[component${w}]); + `;Y=` + let outputOffset = global_idx * ${R}; + var value = vec4(0); + ${k("value",0,"u32")} + ${k("value",1,"u32")} + ${k("value",2,"u32")} + ${k("value",3,"u32")} + ${D.setByOffset("global_idx","value")} + `}else Y=` + let outputIndices = ${D.offsetToIndices("global_idx")}; + ${I("")}; + let value = ${S.getByIndices("dataIndices")}; + ${D.setByOffset("global_idx","value")}; + `;return` + ${L.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(S,X,D)} + ${L.mainStart()} + ${L.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${Y} + }`}}},iT=($)=>$9({axis:$.axis}),aT=($,j)=>{let O=$.inputs;lH(O),$.compute(oH($.inputs,j))}}),HW=k5(()=>{x6(),I6(),W6(),sH=($,j,O,G,Z,V,N,J,R)=>{let U=[{type:12,data:V},{type:12,data:G},{type:12,data:Z},{type:12,data:O},{type:12,data:N},{type:12,data:J},{type:12,data:R}],H=[V];return U.push(...$6(j.dims,H)),$.compute({name:"computeSliceOffsets",shaderCache:{hint:`${Z.length}_${O.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:H,dataType:$.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:U}),getShaderSource:(L)=>{let Y=[j5("indices_data",j.dataType,j.dims.length),n5("input_slice_offsets_data",12,1,1)],S=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:Z.length},{name:"sizes_from_slice_dims_data",type:"u32",length:O.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${L.registerUniforms(S).declareVariables(...Y)} + ${L.mainStart()} + ${L.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${Z.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${O.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`}},{inputs:[j],outputs:[-1]})[0]},rT=($,j)=>{let O=$.inputs,G=O[0].dims,Z=O[0].dataType,V=O[1].dims,N=V[V.length-1],J=d0.sizeToDimension(V,V.length-1),R=d0.sizeFromDimension(G,j.batchDims+N),U=d0.sizeToDimension(G,j.batchDims),H=d0.sizeFromDimension(G,j.batchDims),L=J/U,Y=Array(N),S=R;for(let w=0;wG.length)throw Error("last dimension of indices must not be larger than rank of input tensor");let I=V.slice(0,-1).concat(G.slice(D)),k=d0.size(I),z=[{type:12,data:k},{type:12,data:R},...$6(O[0].dims,X.dims,I)];$.compute({name:"GatherND",shaderCache:{hint:j.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:I,dataType:Z}],dispatchGroup:{x:Math.ceil(k/64)},programUniforms:z}),getShaderSource:(w)=>{let T=j5("data",O[0].dataType,O[0].dims.length),W=j5("slice_offsets",12,X.dims.length),E=n5("output",O[0].dataType,I.length);return` + ${w.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(T,W,E)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`}},{inputs:[O[0],X]})},nT=($)=>({batchDims:$.batch_dims,cacheKey:""})}),xW=k5(()=>{x6(),I6(),C9(),W6(),iH=($,j)=>{if($.length<3||$.length>4)throw Error("GatherBlockQuantized requires 3 or 4 inputs.");let O=d0.normalizeAxis(j.quantizeAxis,$[0].dims.length),G=j.blockSize,Z=$[0],V=$[2],N=$.length===4?$[3]:void 0;if(V.dims.length!==Z.dims.length||!Z.dims.map((J,R)=>R===O?Math.ceil(J/G)===V.dims[R]:J===V.dims[R]).reduce((J,R)=>J&&R,!0))throw Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(N){if(N.dataType!==Z.dataType)throw Error("Zero point must have the same data type as the input tensor.");if(N.dims.length!==V.dims.length||!N.dims.map((J,R)=>J===V.dims[R]).reduce((J,R)=>J&&R,!0))throw Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},aH=($,j)=>{let O=$[0].dims,G=$[1].dims,Z=O.length,V=d0.normalizeAxis(j.gatherAxis,Z),N=d0.normalizeAxis(j.quantizeAxis,Z),J=O.slice(0);J.splice(V,1,...G);let R=d0.size(J),U=$[2].dataType,H=$[0].dataType===22,L=[{type:12,data:R},{type:12,data:N},{type:12,data:V},{type:12,data:j.blockSize},...$6(...$.map((Y,S)=>Y.dims),J)];return{name:"GatherBlockQuantized",shaderCache:{hint:`${j.cacheKey};${$.filter((Y,S)=>S!==1).map((Y)=>Y.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:$.length},(Y,S)=>"rank")},getRunData:()=>({outputs:[{dims:J,dataType:U}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:L}),getShaderSource:(Y)=>{let S=j5("data",$[0].dataType,$[0].dims.length),X=j5("inputIndices",$[1].dataType,$[1].dims.length),D=j5("scales",$[2].dataType,$[2].dims.length),I=$.length>3?j5("zeroPoint",$[3].dataType,$[3].dims.length):void 0,k=n5("output",U,J.length),z=[S,X,D];return I&&z.push(I),` + ${Y.registerUniforms([{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}]).declareVariables(...z,k)} + ${Y.mainStart()} + let output_indices = ${k.offsetToIndices("global_idx")}; + var indices_indices = ${X.type.indices}(0); + ${G.length>1?` + for (var i: u32 = 0; i < ${G.length}; i++) { + let index = ${k.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${X.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${k.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${S.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${k.indicesGet("output_indices","i")}; + ${S.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${X.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${O[V]}; + } + ${S.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${J.length}; i++) { + let index = ${k.indicesGet("output_indices",`i + ${G.length} - 1`)}; + ${S.indicesSet("data_indices","i","index")}; + } + let data_offset = ${S.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${S.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${H?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${D.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${D.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${D.getByIndices("scale_indices")}; + ${I?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${I.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${I.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${H?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${z1(U)}(quantized_data - zero_point) * scale; + ${k.setByOffset("global_idx","dequantized_data")}; + }`}}},tT=($,j)=>{let O=$.inputs;iH(O,j),$.compute(aH($.inputs,j))},eT=($)=>$9({blockSize:$.blockSize,gatherAxis:$.gatherAxis,quantizeAxis:$.quantizeAxis})}),LW=k5(()=>{x6(),I6(),C9(),W6(),rH=($)=>{if(!$||$.length!==2)throw Error("GatherElements requires 2 inputs.");if($[0].dims.length<1)throw Error("GatherElements requires that the data input be rank >= 1.");if($[0].dims.length!==$[1].dims.length)throw Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},nH=($,j)=>{let O=$[0].dims,G=$[0].dataType,Z=O.length,V=$[1].dims,N=$[1].dataType,J=d0.normalizeAxis(j.axis,Z),R=O[J],U=V.slice(0),H=d0.size(U),L=j5("input",G,Z),Y=j5("indicesInput",N,V.length),S=n5("output",G,U.length),X=[{type:12,data:H},{type:6,data:R},{type:12,data:J}];return X.push(...$6(O,V,U)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:U,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(H/64)},programUniforms:X}),getShaderSource:(D)=>` + ${D.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(L,Y,S)} + ${D.mainStart()} + ${D.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${S.offsetToIndices("global_idx")}; + + var idx = ${Y.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${L.type.indices}(outputIndices); + ${L.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${L.getByIndices("inputIndices")}; + + ${S.setByOffset("global_idx","value")}; + }`}},$F=($)=>$9({axis:$.axis}),jF=($,j)=>{let O=$.inputs;rH(O),$.compute(nH($.inputs,j))}}),_W=k5(()=>{x6(),I6(),W6(),tH=($)=>{if(!$)throw Error("Input is missing");if($.length<2||$.length>3)throw Error("Invaid input number.");if($.length===3&&$[2].dims.length>2)throw Error("Invalid input shape of C");if($[0].dataType!==$[1].dataType||$.length===3&&$[0].dataType!==$[2].dataType)throw Error("Input types are mismatched")},eH=($,j)=>{let O=$[0].dims.slice(),G=$[1].dims.slice(),[Z,V,N]=jX.getShapeOfGemmResult(O,j.transA,G,j.transB,$.length===3?$[2].dims:void 0),J=[Z,V];if(!J)throw Error("Can't use gemm on the given tensors");let R=16,U=Math.ceil(V/R),H=Math.ceil(Z/R),L=(d0.size(J),[{type:12,data:U},{type:12,data:Z},{type:12,data:V},{type:12,data:N},{type:1,data:j.alpha},{type:1,data:j.beta}]),Y=["type","type"];return $.length===3&&(L.push(...$6($[2].dims)),Y.push("rank")),L.push(...$6(J)),{name:"GemmShared",shaderCache:{hint:`${j.cacheKey}`,inputDependencies:Y},getRunData:()=>({outputs:[{dims:J,dataType:$[0].dataType}],dispatchGroup:{x:U*H},programUniforms:L}),getShaderSource:(S)=>{let X=j5("a",$[0].dataType,$[0].dims),D=j5("b",$[1].dataType,$[1].dims),I=null,k=[X,D];$.length===3&&(I=j5("c",$[2].dataType,$[2].dims.length),k.push(I));let z=n5("output",$[0].dataType,J.length);k.push(z);let w="",T="";j.transA&&j.transB?(T=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):j.transA&&!j.transB?(T=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!j.transA&&j.transB?(T=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!j.transA&&!j.transB&&(T=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let W=j.alpha===1?"":"value *= uniforms.alpha;";return` + ${S.registerUniforms([{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}]).declareVariables(...k)} + var tile_a: array, 16>; + var tile_b: array, 16>; + ${S.mainStart([R,R,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * 16; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * 16; + let num_tiles = (uniforms.K - 1) / 16 + 1; + var k_start = 0u; + var value = ${z.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${T} + k_start = k_start + 16; + workgroupBarrier(); + + for (var k: u32 = 0u; k < 16; k++) { + ${w} + } + workgroupBarrier(); + } + + ${W} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${I!=null?`let cOffset = ${I.broadcastedIndicesToOffset("vec2(m, n)",z)}; value += ${z.type.value}(uniforms.beta) * ${I.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`}}},OF=($)=>({transA:$.transA,transB:$.transB,alpha:$.alpha,beta:$.beta,cacheKey:`${$.transA};${$.transB};${$.alpha===1}`}),GF=($,j)=>{tH($.inputs),$.compute(eH($.inputs,j))}}),YW=k5(()=>{x6(),I6(),C9(),W6(),[j4,T4,Q8,C8]=[0,1,2,3],$x=($)=>{if($[0].dims.length!==4)throw Error("only 4-D tensor is supported.");if($[0].dims.length!==$[1].dims.length)throw Error("input dimensions must be equal to grid dimensions");if($[0].dims.length-2!==$[1].dims[$[1].dims.length-1])throw Error("last dimension of grid must be equal to "+($[0].dims.length-2));if($[0].dims[0]!==$[1].dims[0])throw Error("grid batch size must match input batch size")},jx=($)=>` + fn gs_bicubic_interpolate(p: mat4x4<${$}>, x: f32, y: f32) -> ${$} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${$}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,Ox=($)=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${$.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,Gx=($)=>` + ${$.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,Zx=($,j,O)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${j} { + var pixel = ${j}(0); + var indices = vec4(0); + indices[${j4}] = batch; + indices[${T4}] = channel;`+(()=>{switch(O.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${Q8}] = u32(r); + indices[${C8}] = u32(c); + } else { + return ${j}(0); + } + `;case"border":return` + indices[${Q8}] = u32(clamp(r, 0, H - 1)); + indices[${C8}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${Q8}] = gs_reflect(r, border[1], border[3]); + indices[${C8}] = gs_reflect(c, border[0], border[2]); + `;default:throw Error(`padding mode ${O.paddingMode} is not supported`)}})()+` + return ${$.getByIndices("indices")}; + } +`,qx=($,j,O)=>(()=>{switch(O.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${j4}], indices[${T4}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${j4}], indices[${T4}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${j4}], indices[${T4}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${j4}], indices[${T4}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${j4}], indices[${T4}], border); + + let dx2 = ${j}(f32(x2) - x); + let dx1 = ${j}(x - f32(x1)); + let dy2 = ${j}(f32(y2) - y); + let dy1 = ${j}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${j}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${j4}], indices[${T4}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw Error(`mode ${O.mode} is not supported`)}})()+`${$.setByOffset("global_idx","result")}`,Vx=($,j)=>{let O=j5("x",$[0].dataType,$[0].dims.length),G=[$[1].dims[0],$[1].dims[1],$[1].dims[2]],Z=j5("grid",$[1].dataType,G.length,2),V=[$[0].dims[0],$[0].dims[1],$[1].dims[1],$[1].dims[2]];j.format==="NHWC"&&(V=[$[0].dims[0],$[1].dims[1],$[1].dims[2],$[0].dims[3]],[j4,T4,Q8,C8]=[0,3,1,2]);let N=n5("output",$[0].dataType,V.length),J=O.type.value,R=[{type:12,data:d0.size(V)},...$6($[0].dims,G,V)];return{name:"GridSample",shaderCache:{hint:`${j.cacheKey}`,inputDependencies:["type","type"]},getRunData:(U)=>{let H=d0.size(V);return{outputs:[{dims:V,dataType:U[0].dataType}],dispatchGroup:{x:Math.ceil(H/64)},programUniforms:R}},getShaderSource:(U)=>` + ${U.registerUniform("output_size","u32").declareVariables(O,Z,N)} + + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } + + ${jx(J)} + ${Ox(j)} + ${Gx(j)} + ${Zx(O,J,j)} + + ${U.mainStart()} + ${U.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${Q8}]); + let W_in = i32(uniforms.x_shape[${C8}]); + + ${j.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${N.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${j4}], indices[${Q8}], indices[${C8}]); + let nxy = ${Z.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${qx(N,J,j)} + }`}},ZF=($,j)=>{$x($.inputs),$.compute(Vx($.inputs,j))},qF=($)=>$9({alignCorners:$.align_corners,mode:$.mode,paddingMode:$.padding_mode,format:$.format})}),dF=k5(()=>{x6(),I6(),C9(),cv(),pv(),W6(),J7(),c1=($,j)=>$.length>j&&$[j].dims.length>0?$[j]:void 0,Nx=($,j)=>{let O=$[0],G=c1($,1),Z=c1($,2),V=c1($,3),N=c1($,4),J=c1($,5),R=c1($,6),U=c1($,7);if(O.dims.length!==3&&O.dims.length!==5)throw Error("Input query is expected to have 3 or 5 dimensions");let H,L=O.dims[0],Y=O.dims[1],S=O.dims.length===3?O.dims[2]:j.numHeads*O.dims[4],X=Y,D=0,I=0,k=Math.floor(S/j.numHeads);if(R&&U&&d0.size(R.dims)&&d0.size(U.dims)){if(R.dims.length!==4)throw Error('Input "past_key" is expected to have 4 dimensions');if(R.dims[0]!==L||R.dims[1]!==j.numHeads||R.dims[3]!==k)throw Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(U.dims[0]!==L||U.dims[1]!==j.numHeads||U.dims[3]!==k)throw Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(R.dims[2]!==U.dims[2])throw Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(U.dims.length!==4)throw Error('Input "past_value" is expected to have 4 dimensions');D=R.dims[2],I=R.dims[2]}else if(R&&d0.size(R.dims)||U&&d0.size(U.dims))throw Error('Input "past_key" and "past_value" shall be both present or both absent');if(G&&d0.size(G.dims)>0){if(O.dims.length!==3)throw Error('Input "query" is expected to have 3 dimensions when key is given');if(G.dims.length<3||G.dims.length>5)throw Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(O.dims[0]!==G.dims[0])throw Error('Input "query" and "key" shall have same dim 0 (batch size)');if(G.dims.length===3){if(G.dims[2]!==O.dims[2])throw Error('Input "query" and "key" shall have same dim 2 (hidden_size)');H=2,X=G.dims[1]}else if(G.dims.length===5){if(G.dims[2]!==j.numHeads||G.dims[3]!==2||G.dims[4]!==k)throw Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(Z)throw Error('Expect "value" be none when "key" has packed kv format.');H=5,X=G.dims[1]}else{if(G.dims[1]!==j.numHeads||G.dims[3]!==k)throw Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');H=0,X=G.dims[2]}}else{if(O.dims.length!==5)throw Error('Input "query" is expected to have 5 dimensions when key is empty');if(O.dims[2]!==j.numHeads||O.dims[3]!==3)throw Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');H=3}if(V&&d0.size(V.dims)>0){if(V.dims.length!==1)throw Error('Input "bias" is expected to have 1 dimension');if(G&&G.dims.length===5&&G.dims[3]===2)throw Error("bias is not allowed for packed kv.")}let z=D+X,w=0;if(N&&d0.size(N.dims)>0){w=8;let E=N.dims;throw E.length===1?E[0]===L?w=1:E[0]===3*L+2&&(w=3):E.length===2&&E[0]===L&&E[1]===z&&(w=5),w===8?Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):Error("Mask not supported")}let T=!1,W=S;if(Z&&d0.size(Z.dims)>0){if(Z.dims.length!==3&&Z.dims.length!==4)throw Error('Input "value" is expected to have 3 or 4 dimensions');if(O.dims[0]!==Z.dims[0])throw Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(Z.dims.length===3){if(X!==Z.dims[1])throw Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');W=Z.dims[2]}else{if(X!==Z.dims[2])throw Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');W=Z.dims[1]*Z.dims[3],T=!0}}if(N&&d0.size(N.dims)>0)throw Error("Key padding mask is not supported");if(J&&d0.size(J.dims)>0){if(J.dims.length!==4)throw Error('Input "attention_bias" is expected to have 4 dimensions');if(J.dims[0]!==L||J.dims[1]!==j.numHeads||J.dims[2]!==Y||J.dims[3]!==z)throw Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:L,sequenceLength:Y,pastSequenceLength:D,kvSequenceLength:X,totalSequenceLength:z,maxSequenceLength:I,inputHiddenSize:0,hiddenSize:S,vHiddenSize:W,headSize:k,vHeadSize:Math.floor(W/j.numHeads),numHeads:j.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:j.maskFilterValue,maskType:w,scale:j.scale,broadcastResPosBias:!1,passPastInKv:T,qkvFormat:H}},VF=($)=>$9({...$}),PN=$9({perm:[0,2,1,3]}),Jx=($,j,O,G,Z,V,N)=>{let J=[G,Z,V],R=d0.size(J),U=[{type:12,data:R},{type:12,data:N},{type:12,data:V}];return $.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:J,dataType:j.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:U}),getShaderSource:(H)=>{let L=n5("qkv_with_bias",j.dataType,J),Y=j5("qkv",j.dataType,J),S=j5("bias",O.dataType,J);return` + ${H.registerUniforms([{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}]).declareVariables(Y,S,L)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`}},{inputs:[j,O],outputs:[-1]})[0]},fZ=($,j,O,G,Z,V,N,J)=>{let R=V;if(N&&d0.size(N.dims)>0){if(G===1)throw Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return R=Jx($,V,N,j,G,O*Z,J),R=R.reshape([j,G,O,Z]),O===1||G===1?R:$.compute(P2(R,PN.perm),{inputs:[R],outputs:[-1]})[0]}return V.dims.length===3&&(R=V.reshape([j,G,O,Z])),O===1||G===1?R:$.compute(P2(R,PN.perm),{inputs:[R],outputs:[-1]})[0]},NF=($,j)=>{let O=Nx($.inputs,j),G=$.inputs[0],Z=c1($.inputs,1),V=c1($.inputs,2),N=c1($.inputs,3),J=c1($.inputs,4),R=c1($.inputs,5),U=c1($.inputs,6),H=c1($.inputs,7);if(G.dims.length===5)throw Error("Packed QKV is not implemented");if(Z?.dims.length===5)throw Error("Packed KV is not implemented");let L=Z&&V&&Z.dims.length===4&&V.dims.length===4,Y=fZ($,O.batchSize,O.numHeads,O.sequenceLength,O.headSize,G,N,0);if(L)return cZ($,Y,Z,V,J,void 0,U,H,R,O);if(!Z||!V)throw Error("key and value must be provided");let S=fZ($,O.batchSize,O.numHeads,O.kvSequenceLength,O.headSize,Z,N,O.hiddenSize),X=fZ($,O.batchSize,O.numHeads,O.kvSequenceLength,O.vHeadSize,V,N,2*O.hiddenSize);cZ($,Y,S,X,J,void 0,U,H,R,O)}}),lF=k5(()=>{x6(),I6(),C9(),W6(),vx=($)=>{if(!$||$.length<1)throw Error("too few inputs")},Rx=($,j)=>{let O=[],G=j.numOutputs;return $[1].dims[0]>0&&($[1].getBigInt64Array().forEach((Z)=>O.push(Number(Z))),G=O.length),$9({numOutputs:G,axis:j.axis,splitSizes:O})},Ux=($)=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${$}u; i += 1u ) { + if (index < ${v6("uniforms.size_in_split_axis","i",$)}) { + return i; + } + } + return ${$}u; +}`,Hx=($)=>{let j=$.length,O=[];for(let G=0;G{let O=$[0].dims,G=d0.size(O),Z=$[0].dataType,V=d0.normalizeAxis(j.axis,O.length),N=Array(j.numOutputs),J=j5("input",Z,O.length),R=Array(j.numOutputs),U=[],H=[],L=0,Y=[{type:12,data:G}];for(let S=0;S` + ${S.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",R.length).declareVariables(J,...N)} + ${Ux(R.length)} + ${Hx(N)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${J.offsetToIndices("global_idx")}; + var index = ${J.indicesGet("indices",V)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${v6("uniforms.size_in_split_axis","output_number - 1u",R.length)}; + ${J.indicesSet("indices",V,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`,getRunData:()=>({outputs:U,dispatchGroup:{x:Math.ceil(G/64)},programUniforms:Y})}},JF=($,j)=>{vx($.inputs);let O=$.inputs.length===1?j:Rx($.inputs,j);$.compute(Gv($.inputs,O),{inputs:[0]})},vF=($)=>{let{axis:j,splitSizes:O}=$,G=$.numOutputs<0?O.length:$.numOutputs;if(G!==O.length)throw Error("numOutputs and splitSizes lengh must be equal");return $9({axis:j,numOutputs:G,splitSizes:O})}}),oF=k5(()=>{x6(),I6(),C9(),W6(),xx=($,j)=>{let[O,G,Z,V]=$,{numHeads:N,rotaryEmbeddingDim:J}=j;if(O.dims.length!==3&&O.dims.length!==4)throw Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${O.dims.length}`);if(!d0.areEqual(G.dims,[])&&!d0.areEqual(G.dims,[1])&&G.dims.length!==2)throw Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${G.dims.length}`);if(Z.dims.length!==2)throw Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${Z.dims.length}`);if(V.dims.length!==2)throw Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${V.dims.length}`);if(!d0.areEqual(Z.dims,V.dims))throw Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(J>0&&N===0)throw Error("num_heads must be provided if rotary_embedding_dim is specified");let R=O.dims[0],U=O.dims[O.dims.length-2],H=Z.dims[0],L=d0.sizeFromDimension(O.dims,1)/U,Y=J===0?2*Z.dims[1]:L/N;if(J>Y)throw Error("rotary_embedding_dim must be less than or equal to head_size");if(G.dims.length===2){if(R!==G.dims[0])throw Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${G.dims[0]}`);if(U!==G.dims[1])throw Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${G.dims[1]}`)}if(Y/2!==Z.dims[1]&&J/2!==Z.dims[1])throw Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${Z.dims[1]}`);if(U>H)throw Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},RV=($,j)=>{let{interleaved:O,numHeads:G,rotaryEmbeddingDim:Z,scale:V}=j,N=$[0].dims[0],J=d0.sizeFromDimension($[0].dims,1),R=$[0].dims[$[0].dims.length-2],U=J/R,H=$[2].dims[1],L=Z===0?2*H:U/G,Y=[N,R,U/L,L-H],S=d0.computeStrides(Y),X=[{type:1,data:V},{type:12,data:Y},{type:12,data:S},...$[0].dims.length===3?[{type:12,data:[J,U,L,1]}]:[],...$[0].dims.length===4?[{type:12,data:[J,L,R*L,1]}]:[],...$6($[0].dims,$[1].dims,$[2].dims,$[3].dims,$[0].dims)];return{name:"RotaryEmbedding",shaderCache:{hint:$9({interleaved:O}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:(D)=>{let I=j5("input",$[0].dataType,$[0].dims.length),k=j5("position_ids",$[1].dataType,$[1].dims.length),z=j5("cos_cache",$[2].dataType,$[2].dims.length),w=j5("sin_cache",$[3].dataType,$[3].dims.length),T=n5("output",$[0].dataType,$[0].dims.length);return D.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:Y.length},{name:"global_strides",type:"u32",length:S.length},{name:"input_output_strides",type:"u32",length:S.length}]),` + ${D.declareVariables(I,k,z,w,T)} + + ${D.mainStart(kG)} + let half_rotary_emb_dim = uniforms.${z.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${D.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${k.broadcastedIndicesToOffset("bsnh.xy",n5("",k.type.tensor,2))}; + let position_id = + u32(${k.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${O}); + let j = i + select(half_rotary_emb_dim, 1, ${O}); + let re = ${I.getByOffset("i")} * ${z.get("position_id","bsnh[3]")} - + ${I.getByOffset("j")} * ${w.get("position_id","bsnh[3]")}; + ${T.setByOffset("i","re")} + let im = ${I.getByOffset("i")} * ${w.get("position_id","bsnh[3]")} + + ${I.getByOffset("j")} * ${z.get("position_id","bsnh[3]")}; + ${T.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${T.setByOffset("k",I.getByOffset("k"))} + } + }`},getRunData:()=>({outputs:[{dims:$[0].dims,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(d0.size(Y)/kG)},programUniforms:X})}},RF=($,j)=>{xx($.inputs,j),$.compute(RV($.inputs,j))}}),SW=k5(()=>{C9(),x6(),pv(),dF(),lF(),J7(),oF(),W6(),Lx=($,j)=>{if(j.doRotary&&$.length<=7)throw Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let O=$[0],G=$[1],Z=$[2],V=$[3],N=$[4];if(j.doRotary!==0&&$.length<=7)throw Error("cos_cast and sin_cache are expected if do_rotary attribute is non-zero");if(j.localWindowSize!==-1)throw Error("Local attention is not supported");if(j.softcap!==0)throw Error("Softcap is not supported");if(j.rotaryInterleaved!==0)throw Error("Rotary interleaved is not supported");if(j.smoothSoftmax)throw Error("Smooth softmax is not supported");if(O.dims.length!==3&&O.dims.length!==5)throw Error("Input query is expected to have 3 or 5 dimensions");let J=O.dims[0],R=O.dims[1],U=O.dims.length===3?O.dims[2]:j.numHeads*O.dims[4],H=R,L=0,Y=!G||G.dims.length===0,S=Math.floor(Y?U/(j.numHeads+2*j.kvNumHeads):U/j.numHeads);Y&&(U=S*j.numHeads);let X=V&&V.dims.length!==0,D=N&&N.dims.length!==0;if(X&&V.dims.length===4&&V.dims[0]===J&&V.dims[1]!==j.kvNumHeads&&V.dims[2]===j.kvNumHeads&&V.dims[3]===S)throw Error("BSNH pastKey/pastValue is not supported");if(X&&D){if(V.dims.length!==4)throw Error('Input "past_key" is expected to have 4 dimensions');if(N.dims.length!==4)throw Error('Input "past_value" is expected to have 4 dimensions');L=V.dims[2]}else if(X||D)throw Error('Input "past_key" and "past_value" shall be both present or both absent');let I=1;if(G&&G.dims.length>0){if(O.dims.length!==3)throw Error('Input "query" is expected to have 3 dimensions when key is given');if(G.dims.length<3||G.dims.length>5)throw Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(O.dims[0]!==G.dims[0])throw Error('Input "query" and "key" shall have same dim 0 (batch size)');if(G.dims.length===3){if(O.dims[2]%G.dims[2]!==0)throw Error('Dimension 2 of "query" should be a multiple of "key"');H=G.dims[1]}else if(G.dims.length===5){if(G.dims[2]!==j.numHeads||G.dims[3]!==2||G.dims[4]!==S)throw Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(Z)throw Error('Expect "value" be none when "key" has packed kv format.');H=G.dims[1]}else{if(G.dims[1]!==j.numHeads||G.dims[3]!==S)throw Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');H=G.dims[2]}}else{if(O.dims.length!==3&&O.dims.length!==5)throw Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(O.dims.length===5&&(O.dims[2]!==j.numHeads||O.dims[3]!==3))throw Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');I=3}let k=!1,z=j.kvNumHeads?S*j.kvNumHeads:U;if(Z&&Z.dims.length>0){if(Z.dims.length!==3&&Z.dims.length!==4)throw Error('Input "value" is expected to have 3 or 4 dimensions');if(O.dims[0]!==Z.dims[0])throw Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(Z.dims.length===3){if(H!==Z.dims[1])throw Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');z=Z.dims[2]}else{if(H!==Z.dims[2])throw Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');z=Z.dims[1]*Z.dims[3],k=!0}}let w=$.length>4?$[5]:void 0;if(w&&w.dims.length!==1&&w.dims[0]!==J)throw Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:J,sequenceLength:R,pastSequenceLength:L,kvSequenceLength:H,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:U,vHiddenSize:z,headSize:S,vHeadSize:Math.floor(z/j.kvNumHeads),numHeads:j.numHeads,kvNumHeads:j.kvNumHeads,nReps:j.numHeads/j.kvNumHeads,pastPresentShareBuffer:!1,maskType:0,scale:j.scale,broadcastResPosBias:!1,passPastInKv:k,qkvFormat:I}},_x=$9({perm:[0,2,1,3]}),XN=($,j,O)=>{let G=j,Z=O.kvNumHeads;return j.dims.length===3&&O.kvSequenceLength!==0&&(G=j.reshape([O.batchSize,O.kvSequenceLength,Z,O.headSize]),G=$.compute(P2(G,_x.perm),{inputs:[G],outputs:[-1]})[0]),G},Yx=($,j,O,G)=>{let Z=[$*j],V=$*j,N=[{type:12,data:V},{type:12,data:j},{type:12,data:$}];return{name:"GeneratePositionIds",shaderCache:{hint:`${$};${j}`,inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:Z,dataType:7}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:N}),getShaderSource:(J)=>{let R=j5("seq_lens",O.dataType,O.dims),U=j5("total_seq_lens",G.dataType,G.dims),H=n5("pos_ids",7,Z);return` + ${J.registerUniforms([{name:"output_size",type:"u32"},{name:"sequence_length",type:"u32"},{name:"batch_size",type:"u32"}]).declareVariables(R,U,H)} + ${J.mainStart()} + ${J.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let total_sequence_length = u32(${U.getByOffset("0")}); + let is_subsequent_prompt = uniforms.sequence_length > 1 && uniforms.sequence_length != total_sequence_length; + let is_first_prompt = !is_subsequent_prompt && uniforms.sequence_length == total_sequence_length; + let batch_idx = global_idx / uniforms.sequence_length; + let sequence_idx = i32(global_idx % uniforms.sequence_length); + var pos_id: i32 = 0; + let seqlen = ${R.getByOffset("batch_idx")}; + let total_seqlen = seqlen + 1; + if (is_first_prompt) { + if (sequence_idx < total_seqlen) { + pos_id = sequence_idx; + } else { + pos_id = 1; + } + ${H.setByOffset("global_idx","pos_id")} + } else if (is_subsequent_prompt) { + let past_seqlen = total_seqlen - i32(uniforms.sequence_length); + if (past_seqlen + sequence_idx < total_seqlen) { + pos_id = past_seqlen + sequence_idx; + } else { + pos_id = 1; + } + ${H.setByOffset("global_idx","pos_id")} + } else if (global_idx < uniforms.batch_size) { + ${H.setByOffset("global_idx","seqlen")} + }; + } + `}}},UF=($,j)=>{let O=Lx($.inputs,j);if($.inputs[0].dims.length===5)throw Error("Packed QKV is not implemented");if($.inputs[1]?.dims.length===5)throw Error("Packed KV is not implemented");let G,Z,V=$.inputs[0],N=$.inputs[1]&&$.inputs[1].dims.length>0?$.inputs[1]:void 0,J=$.inputs[2]&&$.inputs[2].dims.length>0?$.inputs[2]:void 0,R=$.inputs[3]&&$.inputs[3].dims.length!==0?$.inputs[3]:void 0,U=$.inputs[4]&&$.inputs[4].dims.length!==0?$.inputs[4]:void 0,H=$.inputs.length>4?$.inputs[5]:void 0,L=$.inputs.length>5?$.inputs[6]:void 0,Y=O.kvNumHeads?O.kvNumHeads:O.numHeads,S=$9({axis:2,numOutputs:3,splitSizes:[O.numHeads*O.headSize,Y*O.headSize,Y*O.headSize]}),[X,D,I]=N||J?[V,N,J]:$.compute(Gv([V],S),{inputs:[V],outputs:[-1,-1,-1]});if(j.doRotary){let T=$.compute(Yx(O.batchSize,O.sequenceLength,H,L),{inputs:[H,L],outputs:[-1]})[0],W=$.inputs[7],E=$.inputs[8],Q=$9({interleaved:j.rotaryInterleaved!==0,numHeads:O.numHeads,rotaryEmbeddingDim:0,scale:j.scale}),A=[X,T,W,E],l=[-1];G=$.compute(RV(A,Q),{inputs:A,outputs:l})[0],A.splice(0,1,D);let r=$9({interleaved:j.rotaryInterleaved!==0,numHeads:O.kvNumHeads,rotaryEmbeddingDim:0,scale:j.scale});Z=$.compute(RV(A,r),{inputs:A,outputs:l})[0]}let k=fZ($,O.batchSize,O.numHeads,O.sequenceLength,O.headSize,j.doRotary?G:X,void 0,0),z=XN($,j.doRotary?Z:D,O),w=XN($,I,O);cZ($,k,z,w,void 0,void 0,R,U,void 0,O,H,L)}}),PW=k5(()=>{x6(),I6(),J7(),W6(),TN=($,j,O,G,Z,V,N,J)=>{let R=M9(V),U=R===1?"f32":`vec${R}f`,H=R===1?"vec2f":`mat2x${R}f`,L=Z*N,Y=64;L===1&&(Y=256);let S=[Z,N,V/R],X=[Z,N,2],D=[];return D.push(...$6(S,X)),$.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${R};${J};${Y}`,inputDependencies:["rank","type","type"]},getRunData:()=>({outputs:[{dims:X,dataType:1}],dispatchGroup:{x:L},programUniforms:D}),getShaderSource:(I)=>{let k=j5("x",j.dataType,3,R),z=[k,j5("scale",O.dataType,O.dims),j5("bias",G.dataType,G.dims),n5("output",1,3,2)];return` + var workgroup_shared : array<${H}, ${Y}>; + const workgroup_size = ${Y}u; + ${I.declareVariables(...z)} + ${I.mainStart(Y)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${U}(0); + var squared_sum = ${U}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${U}(${k.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${H}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${V7("workgroup_shared[0][0]",R)} / f32(hight * ${R}); + let squared_sum_final = ${V7("workgroup_shared[0][1]",R)} / f32(hight * ${R}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${J})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`}},{inputs:[j,O,G],outputs:[-1]})[0]},Sx=($,j,O)=>{let G=j[0].dims,Z=G,V=G[0],N=G[1],J=d0.sizeFromDimension(G,2),R=M9(J),U=d0.size(Z)/R,H=TN($,j[0],j[1],j[2],V,J,N,O.epsilon),L=[V,N,J/R],Y=[V,N];$.compute({name:"InstanceNormalization",shaderCache:{hint:`${R}`,inputDependencies:["type","none"]},getRunData:()=>({outputs:[{dims:Z,dataType:j[0].dataType}],dispatchGroup:{x:Math.ceil(U/64)},programUniforms:[{type:12,data:U},...$6(L,Y,L)]}),getShaderSource:(S)=>{let X=j5("x",j[0].dataType,L.length,R),D=j5("scale_shift",1,Y.length,2),I=n5("output",j[0].dataType,L.length,R),k=[X,D,I];return` + ${S.registerUniform("output_size","u32").declareVariables(...k)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${I.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${D.getByIndices("vec2(batch, channel)")}; + let value = ${X.getByOffset("global_idx")} * ${I.type.value}(scale_shift.x) + ${I.type.value}(scale_shift.y); + ${I.setByOffset("global_idx","value")}; + }`}},{inputs:[j[0],H]})},Px=($,j,O)=>{let G=j[0].dims,Z=G,V=G[0],N=G[G.length-1],J=d0.sizeFromDimension(G,1)/N,R=M9(N),U=d0.size(Z)/R,H=[{type:12,data:J},{type:12,data:Math.floor(N/R)}],L=!1,Y=[0,G.length-1];for(let D=0;DG[Y[I]])),X=TN($,S,j[1],j[2],V,J,N,O.epsilon);$.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${R}`,inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:Z,dataType:j[0].dataType}],dispatchGroup:{x:Math.ceil(U/64)},programUniforms:H}),getShaderSource:(D)=>{let I=G1(j[0].dataType),k=R===1?"vec2f":`mat${R}x2f`,z=(W)=>{let E=W===0?"x":"y",Q=R===1?"f32":`vec${R}f`;switch(R){case 1:return`${I}(${Q}(scale.${E}))`;case 2:return`vec2<${I}>(${Q}(scale[0].${E}, scale[1].${E}))`;case 4:return`vec4<${I}>(${Q}(scale[0].${E}, scale[1].${E}, scale[2].${E}, scale[3].${E}))`;default:throw Error(`Not supported compoents ${R}`)}},w=j5("input",j[0].dataType,j[0].dims,R),T=n5("output",j[0].dataType,Z,R);return` + @group(0) @binding(0) var input : array<${w.type.storage}>; + @group(0) @binding(1) var scale_input : array<${k}>; + @group(0) @binding(2) var output : array<${T.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${D.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${z(0)}, ${z(1)}); + }`}},{inputs:[j[0],X]})},HF=($,j)=>{j.format==="NHWC"?Px($,$.inputs,j):Sx($,$.inputs,j)}}),XW=k5(()=>{x6(),I6(),W6(),Xx=($)=>{if(!$||$.length<2)throw Error("layerNorm requires at least 2 inputs.")},Tx=($,j,O)=>{let G=j.simplified,Z=$[0].dims,V=$[1],N=!G&&$[2],J=Z,R=d0.normalizeAxis(j.axis,Z.length),U=d0.sizeToDimension(Z,R),H=d0.sizeFromDimension(Z,R),L=d0.size(V.dims),Y=N?d0.size(N.dims):0;if(L!==H||N&&Y!==H)throw Error(`Size of X.shape()[axis:] == ${H}. + Size of scale and bias (if provided) must match this. + Got scale size of ${L} and bias size of ${Y}`);let S=[];for(let T=0;T1,z=O>2,w=[{dims:J,dataType:$[0].dataType}];return k&&w.push({dims:S,dataType:1}),z&&w.push({dims:S,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${X};${O};${G}`,inputDependencies:D},getRunData:()=>({outputs:w,dispatchGroup:{x:Math.ceil(U/64)},programUniforms:I}),getShaderSource:(T)=>{let W=G1($[0].dataType),E=[j5("x",$[0].dataType,$[0].dims,X),j5("scale",V.dataType,V.dims,X)];return N&&E.push(j5("bias",N.dataType,N.dims,X)),E.push(n5("output",$[0].dataType,J,X)),k&&E.push(n5("mean_data_output",1,S)),z&&E.push(n5("inv_std_output",1,S)),` + ${T.registerUniforms([{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}]).declareVariables(...E)} + ${T.mainStart()} + ${T.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${iJ("f32",X)}; + var mean_square_vector = ${iJ("f32",X)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${FG(W,X,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${V7("mean_vector",X)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${V7("mean_square_vector",X)} / uniforms.norm_size ${G?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${FG(W,X,"x[j + offset]")}; + let f32scale = ${FG(W,X,"scale[j]")}; + output[j + offset] = ${E[0].type.value}((f32input ${G?"":"- mean"}) * inv_std_dev * f32scale + ${N?`+ ${FG(W,X,"bias[j]")}`:""} + ); + } + + ${k?"mean_data_output[global_idx] = mean":""}; + ${z?"inv_std_output[global_idx] = inv_std_dev":""}; + }`}}},xF=($,j)=>{Xx($.inputs),$.compute(Tx($.inputs,j,$.outputCount))}}),TW=k5(()=>{I6(),uv(),dv(),Fx=($)=>{if(!$||$.length!==2)throw Error("MatMul requires 2 inputs.");if($[0].dims[$[0].dims.length-1]!==$[1].dims[$[1].dims.length-2])throw Error("shared dimension does not match.")},LF=($)=>{Fx($.inputs);let j=zG.calcShape($.inputs[0].dims,$.inputs[1].dims,!0);if(!j)throw Error("Can't use matmul on the given tensors");let O=j[j.length-1],G=$.inputs[0].dims[$.inputs[0].dims.length-1];if(O<8&&G<8)$.compute(Cv($.inputs,{activation:""},j));else{let Z=j[j.length-2],V=d0.size($.inputs[0].dims.slice(0,-2)),N=d0.size($.inputs[1].dims.slice(0,-2));if(V!==1&&Z===1&&N===1){let J=[1,V,O],R=[$.inputs[0].reshape([1,V,G]),$.inputs[1].reshape([1,G,O])];$.compute(vV(R,{activation:""},j,J),{inputs:R})}else $.compute(vV($.inputs,{activation:""},j))}}}),FW=k5(()=>{x6(),I6(),C9(),W6(),yx=($,j)=>{if($.length<3||$.length>4)throw Error("MatMulNBits requires 3 or 4 inputs");let O=$[0],G=O.dims.length;if(O.dims[G-1]!==j.k)throw Error("The last dim of input shape does not match the k value");let Z=Math.floor((j.k+j.blockSize-1)/j.blockSize),V=j.blockSize/8*j.bits,N=$[1];if(!d0.areEqual(N.dims,[j.n,Z,V]))throw Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let J=$[2].dims;if(d0.size(J)!==j.n*Z)throw Error("scales input size error.");if($.length===4){let R=$[3].dims,U=j.bits>4?j.n*Z:j.n*Math.floor((Z+1)/2);if(d0.size(R)!==U)throw Error("zeroPoints input size error.")}},zx=($,j)=>{let O=$[0].dims,G=O.length,Z=O[G-2],V=j.k,N=j.n,J=O.slice(0,G-2),R=d0.size(J),U=$[1].dims[2]/4,H=$[0].dataType,L=M9(j.k),Y=M9(U),S=M9(N),X=J.concat([Z,N]),D=Z>1&&N/S%2==0?2:1,I=d0.size(X)/S/D,k=64,z=[],w=[R,Z,V/L],T=d0.convertShape($[1].dims).slice();T.splice(-1,1,U/Y),z.push(...$6(w)),z.push(...$6(T)),z.push(...$6($[2].dims)),$.length===4&&z.push(...$6(d0.convertShape($[3].dims)));let W=[R,Z,N/S];return z.push(...$6(W)),{name:"MatMulNBits",shaderCache:{hint:`${j.blockSize};${j.bits};${L};${Y};${S};${D};64`,inputDependencies:Array($.length).fill("rank")},getRunData:()=>({outputs:[{dims:X,dataType:H}],dispatchGroup:{x:I},programUniforms:z}),getShaderSource:(E)=>{let Q=w.length,A=j5("a",$[0].dataType,Q,L),l=j5("b",12,T.length,Y),r=j5("scales",$[2].dataType,$[2].dims.length),e=[A,l,r],V0=$.length===4?j5("zero_points",12,$[3].dims.length):void 0;V0&&e.push(V0);let v0=W.length,$0=n5("output",$[0].dataType,v0,S),i=G1($[0].dataType),G0=(()=>{switch(L){case 1:return`array<${i}, 8>`;case 2:return`mat4x2<${i}>`;case 4:return`mat2x4<${i}>`;default:throw Error(`${L}-component is not supported.`)}})();return` + var workgroup_shared: array<${$0.type.value}, ${D*k}>; + ${E.declareVariables(...e,$0)} + ${E.mainStart([k,1,1])} + let output_indices = ${$0.offsetToIndices(`(global_idx / 64) * ${D}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += 64) { + //process one block + var word_offset: u32 = block * ${j.blockSize/L}; + ${(()=>{let S0=` + var col_index = col * ${S}; + ${V0?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${i}(8);`} + `;for(let F0=0;F0> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${V0.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${F0} = ${i}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return S0})()} + for (var word: u32 = 0; word < ${U}; word += ${Y}) { + ${(()=>{let S0=`col_index = col * ${S};`;for(let F0=0;F0; + var b_value_upper: vec4; + var b_quantized_values: ${G0}; + var b_dequantized_values: ${G0};`,S0})()} + for (var i: u32 = 0; i < ${Y}; i++) { + ${(()=>{let S0=` + // reuse a data + var input_offset = ${A.indicesToOffset(`${A.type.indices}(batch, row, word_offset)`)}; + var a_data: ${G0}; + for (var j: u32 = 0; j < ${8/L}; j++) { + a_data[j] = ${A.getByOffset("input_offset")}; + input_offset++; + } + `;for(let F0=0;F0> 4) & b_mask); + b_quantized_values = ${G0}(${Array.from({length:4},(s,n)=>`${i}(b_value_lower[${n}]), ${i}(b_value_upper[${n}])`).join(", ")}); + b_dequantized_values = ${L===1?`${G0}(${Array.from({length:8},(s,n)=>`(b_quantized_values[${n}] - ${V0?`zero_point${F0}`:"zero_point"}) * scale${F0}`).join(", ")});`:`(b_quantized_values - ${G0}(${Array(8).fill(V0?`zero_point${F0}`:"zero_point").join(",")})) * scale${F0};`}; + workgroup_shared[local_id.x * ${D} + ${Math.floor(F0/S)}]${S>1?`[${F0%S}]`:""} += ${Array.from({length:8/L},(s,n)=>L===1?`a_data[${n}] * b_dequantized_values[${n}]`:`dot(a_data[${n}], b_dequantized_values[${n}])`).join(" + ")}; + `;return S0})()} + word_offset += ${8/L}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${D}) { + var output_value: ${$0.type.value} = ${$0.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < 64u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${D}; + } + ${$0.setByIndices(`${$0.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`}}},kx=($,j)=>{let O=$[0].dims,G=O.length,Z=O[G-2],V=j.k,N=j.n,J=O.slice(0,G-2),R=d0.size(J),U=$[1].dims[2]/4,H=$[0].dataType,L=M9(j.k),Y=M9(U),S=J.concat([Z,N]),X=N%8==0?8:N%4==0?4:1,D=128/X,I=D*Y*8,k=I/L,z=I/j.blockSize,w=d0.size(S)/X,T=[],W=[R,Z,V/L],E=d0.convertShape($[1].dims).slice();E.splice(-1,1,U/Y),T.push(...$6(W)),T.push(...$6(E)),T.push(...$6($[2].dims)),$.length===4&&T.push(...$6(d0.convertShape($[3].dims)));let Q=[R,Z,N];return T.push(...$6(Q)),{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${j.blockSize};${L};${Y};${D};${X}`,inputDependencies:Array($.length).fill("rank")},getRunData:()=>({outputs:[{dims:S,dataType:H}],dispatchGroup:{x:w},programUniforms:T}),getShaderSource:(A)=>{let l=W.length,r=j5("a",$[0].dataType,l,L),e=j5("b",12,E.length,Y),V0=j5("scales",$[2].dataType,$[2].dims.length),v0=[r,e,V0],$0=$.length===4?j5("zero_points",12,$[3].dims.length):void 0;$0&&v0.push($0);let i=Q.length,G0=n5("output",$[0].dataType,i),S0=G1($[0].dataType);return` + var sub_a: array<${r.type.value}, ${k}>; + var inter_results: array, ${X}>; + ${A.declareVariables(...v0,G0)} + ${A.mainStart([D,X,1])} + let output_indices = ${G0.offsetToIndices(`workgroup_index * ${X}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${z} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${k}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${k}; a_offset += 128) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${r.getByIndices(`${r.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${r.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${z} + local_id.x; + ${$0?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${$0.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${S0}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${S0}(8);`} + let scale = ${V0.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${e.getByIndices(`${e.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${j.blockSize/L}; + for (var i: u32 = 0; i < ${Y}; i++) { + ${(()=>{switch(L){case 1:return` + let a_data0 = vec4<${S0}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${S0}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${S0}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${S0}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw Error(`${L}-component is not supported.`)}})()} + let b_value = ${Y===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${S0}>(${Array.from({length:4},(F0,s)=>`${S0}(b_value_lower[${s}]), ${S0}(b_value_upper[${s}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${S0}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(F0,s)=>`dot(a_data${s}, b_dequantized_values[${s}])`).join(" + ")}; + word_offset += ${8/L}; + } + workgroupBarrier(); + } + + if (local_idx < ${X}) { + var output_value: ${G0.type.value} = ${G0.type.value}(0); + for (var b = 0u; b < ${D}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${G0.setByIndices(`${G0.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`}}},_F=($,j)=>{yx($.inputs,j),j.blockSize===32&&$.adapterInfo.isVendor("intel")&&$.adapterInfo.isArchitecture("gen-12lp")?$.compute(kx($.inputs,j)):$.compute(zx($.inputs,j))},YF=($)=>$9($)}),yW=k5(()=>{x6(),I6(),W6(),Ix=($)=>{if(!$||$.length<1)throw Error("Too few inputs");if($[0].dataType!==1&&$[0].dataType!==10)throw Error("Input type must be float or float16.");if($.length>=2){let j=2*$[0].dims.length===$[1].dims[0];if($.length===4&&(j=2*$[3].dims[0]===$[1].dims[0]),!j)throw Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},Dx=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${v6("uniforms.pads",Z,O)}; + if (k < 0) { + break; + } + if (k >= i32(${v6("uniforms.x_shape",Z,j)})) { + break; + } + offset += k * i32(${v6("uniforms.x_strides",Z,j)}); + `;return` + value = ${$.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + } + `},Wx=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${v6("uniforms.pads",Z,O)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${v6("uniforms.x_shape",Z,j)}) - 1); + k = k % _2n_1; + if(k >= i32(${v6("uniforms.x_shape",Z,j)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${v6("uniforms.x_strides",Z,j)}); + `;return` + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + `},Mx=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${v6("uniforms.pads",Z,O)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${v6("uniforms.x_shape",Z,j)})) { + k = i32(${v6("uniforms.x_shape",Z,j)}) - 1; + } + offset += k * i32(${v6("uniforms.x_strides",Z,j)}); + `;return` + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + `},Kx=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${v6("uniforms.pads",Z,O)}; + if (k < 0) { + k += i32(${v6("uniforms.x_shape",Z,j)}]); + } + if (k >= i32(${v6("uniforms.x_shape",Z,j)})) { + k -= i32(${v6("uniforms.x_shape",Z,j)}); + } + offset += k * i32(${v6("uniforms.x_strides",Z,j)}); + `;return` + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + `},bx=($,j,O)=>{switch(O.mode){case 0:return Dx($,j,O.pads.length);case 1:return Wx($,j,O.pads.length);case 2:return Mx($,j,O.pads.length);case 3:return Kx($,j,O.pads.length);default:throw Error("Invalid mode")}},fx=($,j)=>{let O=d0.padShape($[0].dims.slice(),j.pads),G=$[0].dims,Z=[{type:12,data:d0.size(O)},{type:6,data:j.pads}],V=$.length>=3&&$[2].data;return j.mode===0&&Z.push({type:V?$[2].dataType:1,data:j.value}),Z.push(...$6($[0].dims,O)),{name:"Pad",shaderCache:{hint:`${j.mode}${V}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(d0.size(O)/64)},programUniforms:Z}),getShaderSource:(N)=>{let J=n5("output",$[0].dataType,O.length),R=j5("x",$[0].dataType,G.length),U=R.type.value,H=bx(J,G.length,j),L=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:j.pads.length}];return j.mode===0&&L.push({name:"constant_value",type:V?U:"f32"}),` + ${N.registerUniforms(L).declareVariables(R,J)} + ${N.mainStart()} + ${N.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${J.offsetToIndices("global_idx")}; + + var value = ${U}(0); + ${H} + output[global_idx] = value; + }`}}},wx=($,j)=>{if($.length>1){let O=$[1].getBigInt64Array(),G=$.length>=3&&$[2].data?$[2].dataType===10?$[2].getUint16Array()[0]:$[2].getFloat32Array()[0]:0,Z=$[0].dims.length,V=new Int32Array(2*Z).fill(0);if($.length>=4){let J=$[3].getBigInt64Array();for(let R=0;RV[Number(R)]=Number(J));let N=[];return V.forEach((J)=>N.push(J)),{mode:j.mode,value:G,pads:N}}return j},SF=($,j)=>{Ix($.inputs);let O=wx($.inputs,j);$.compute(fx($.inputs,O),{inputs:[0]})}}),zW=k5(()=>{w3(),x6(),I6(),W6(),UZ=($)=>{if(X9.webgpu.validateInputContent&&(!$||$.length!==1))throw Error("Pool ops requires 1 input.")},FN=($,j,O)=>{let G=j.format==="NHWC",Z=$.dims.slice();G&&Z.splice(1,0,Z.pop());let V=Object.hasOwnProperty.call(j,"dilations"),N=j.kernelShape.slice(),J=j.strides.slice(),R=V?j.dilations.slice():[],U=j.pads.slice();NV.adjustPoolAttributes(O,Z,N,J,R,U);let H=NV.computePoolOutputShape(O,Z,J,R,N,U,j.autoPad),L=Object.assign({},j);V?Object.assign(L,{kernelShape:N,strides:J,pads:U,dilations:R,cacheKey:j.cacheKey}):Object.assign(L,{kernelShape:N,strides:J,pads:U,cacheKey:j.cacheKey});let Y=H.slice();return Y.push(Y.splice(1,1)[0]),[L,G?Y:H]},yN=($,j)=>{let O=j.format==="NHWC",G=[{type:12,data:d0.size($)},{type:12,data:d0.size(j.kernelShape)}],Z=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(j.kernelShape.length<=2){let V=j.kernelShape[j.kernelShape.length-1],N=j.strides[j.strides.length-1],J=j.pads[j.pads.length/2-1],R=j.pads[j.pads.length-1],U=!!(J+R);G.push({type:12,data:V},{type:12,data:N},{type:12,data:J},{type:12,data:R}),Z.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let H=!1;if(j.kernelShape.length===2){let L=j.kernelShape[j.kernelShape.length-2],Y=j.strides[j.strides.length-2],S=j.pads[j.pads.length/2-2],X=j.pads[j.pads.length-2];H=!!(S+X),G.push({type:12,data:L},{type:12,data:Y},{type:12,data:S},{type:12,data:X}),Z.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[G,Z,!0,U,H]}{if(O)throw Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let V=d0.computeStrides(j.kernelShape);return G.push({type:12,data:V},{type:12,data:j.pads},{type:12,data:j.strides}),Z.push({name:"kernelStrides",type:"u32",length:V.length},{name:"pads",type:"u32",length:j.pads.length},{name:"strides",type:"u32",length:j.strides.length}),[G,Z,!!j.pads.reduce((N,J)=>N+J),!1,!1]}},zN=($,j,O,G,Z,V,N,J,R,U,H,L)=>{let Y=Z.format==="NHWC",S=j.type.value,X=n5("output",j.type.tensor,G);if(Z.kernelShape.length<=2){let D="",I="",k="",z=O-(Y?2:1);if(D=H?` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${z}] = indices[${z}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${z}] < 0 || xIndices[${z}] + >= uniforms.x_shape[${z}]) { + pad++; + continue; + } + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + }`:` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${z}] = indices[${z}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + }`,Z.kernelShape.length===2){let w=O-(Y?3:2);I=L?` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${w}] = indices[${w}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${w}] < 0 || xIndices[${w}] >= uniforms.x_shape[${w}]) { + pad += i32(uniforms.kw); + continue; + } + `:` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${w}] = indices[${w}] * uniforms.sh - uniforms.phStart + j; + `,k=` + } + `}return` + ${$.registerUniforms(R).declareVariables(j,X)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${X.offsetToIndices("global_idx")}; + var xIndices = ${X.offsetToIndices("global_idx")}; + + var value = ${S}(${J}); + var pad = 0; + ${I} + ${D} + ${k} + ${N} + + output[global_idx] = value; + }`}{if(Y)throw Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let D=Z.kernelShape.length,I=Z.pads.length,k="";return k=U?` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + }`:` + } + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + `,` + ${$.registerUniforms(R).declareVariables(j,X)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${X.offsetToIndices("global_idx")}; + var xIndices = ${X.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${S}(${J}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${D-1}u; j++) { + offsets[j] = offset / ${v6("uniforms.kernelStrides","j",D)}; + offset -= offsets[j] * ${v6("uniforms.kernelStrides","j",D)}; + } + offsets[${D-1}] = offset; + + isPad = false; + for (var j = ${O-D}u; j < ${O}u; j++) { + xIndices[j] = indices[j] * ${v6("uniforms.strides",`j - ${O-D}u`,D)} + + offsets[j - ${O-D}u] - ${v6("uniforms.pads","j - 2u",I)}; + ${k} + } + ${N} + + output[global_idx] = value; + }`}},kN=($)=>`${$.format};${$.ceilMode};${$.autoPad};${$.kernelShape.length}`,Ex=($)=>`${kN($)};${$.countIncludePad}`,Qx=($)=>`${kN($)};${$.storageOrder};${$.dilations}`,IN=($)=>({format:$.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][$.auto_pad],ceilMode:$.ceil_mode,kernelShape:$.kernel_shape,strides:$.strides,pads:$.pads}),DN=($,j,O,G)=>{let[Z,V]=FN(j,G,O),N=j5("x",j.dataType,j.dims.length),J=N.type.value,R="";Z.countIncludePad?R+=`value /= ${J}(uniforms.kernelSize);`:R+=`value /= ${J}(i32(uniforms.kernelSize) - pad);`;let[U,H,L,Y,S]=yN(V,Z);return U.push(...$6(j.dims,V)),{name:$,shaderCache:{hint:`${G.cacheKey};${L};${Y};${S}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:V,dataType:j.dataType}],dispatchGroup:{x:Math.ceil(d0.size(V)/64)},programUniforms:U}),getShaderSource:(X)=>zN(X,N,j.dims.length,V.length,Z,"value += x_val;",R,0,H,L,Y,S)}},PF=($)=>{let j=$.count_include_pad!==0,O=IN($);if(O.ceilMode!==0)throw Error("using ceil() in shape computation is not yet supported for AveragePool");let G={countIncludePad:j,...O,cacheKey:""};return{...G,cacheKey:Ex(G)}},XF=($,j)=>{UZ($.inputs),$.compute(DN("AveragePool",$.inputs[0],!1,j))},WN={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},TF=($)=>{let j=$.format;return{format:j,...WN,cacheKey:j}},FF=($,j)=>{UZ($.inputs),$.compute(DN("GlobalAveragePool",$.inputs[0],!0,j))},MN=($,j,O,G)=>{let[Z,V]=FN(j,G,O),N=j5("x",j.dataType,j.dims.length),[J,R,U,H,L]=yN(V,Z);return J.push(...$6(j.dims,V)),{name:$,shaderCache:{hint:`${G.cacheKey};${U};${H};${L}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:V,dataType:j.dataType}],dispatchGroup:{x:Math.ceil(d0.size(V)/64)},programUniforms:J}),getShaderSource:(Y)=>zN(Y,N,j.dims.length,V.length,Z,` + value = max(x_val, value); + `,"",j.dataType===10?-65504:-1e5,R,U,H,L)}},yF=($,j)=>{UZ($.inputs),$.compute(MN("MaxPool",$.inputs[0],!1,j))},zF=($)=>{let{storage_order:j,dilations:O}=$,G=IN($);if(j!==0)throw Error("column major storage order is not yet supported for MaxPool");if(G.ceilMode!==0)throw Error("using ceil() in shape computation is not yet supported for MaxPool");let Z={storageOrder:j,dilations:O,...G,cacheKey:""};return{...Z,cacheKey:Qx(Z)}},kF=($)=>{let j=$.format;return{format:j,...WN,cacheKey:j}},IF=($,j)=>{UZ($.inputs),$.compute(MN("GlobalMaxPool",$.inputs[0],!0,j))}}),kW=k5(()=>{x6(),I6(),C9(),W6(),Cx=($,j)=>{if($.length<2||$.length>3)throw Error("DequantizeLinear requires 2 or 3 inputs.");if($.length===3&&$[1].dims===$[2].dims)throw Error("x-scale and x-zero-point must have the same shape.");if($.length===3&&$[0].dataType!==$[2].dataType)throw Error("x and x-zero-point must have the same data type.");if($[0].dataType===6&&$.length>2)throw Error("In the case of dequantizing int32 there is no zero point.");if($[1].dims.length!==0&&$[1].dims.length!==1&&$[1].dims.length!==$[0].dims.length)throw Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if($.length>2){if($[0].dataType!==$[2].dataType)throw Error("x and x-zero-point must have the same data type.");if($[1].dims.length!==$[2].dims.length)throw Error("scale and zero-point inputs must have the same rank.");if(!$[1].dims.map((O,G)=>O===$[2].dims[G]).reduce((O,G)=>O&&G,!0))throw Error("scale and zero-point inputs must have the same shape.")}if(j.blockSize>0){if($[1].dims.length===0||$[1].dims.length===1&&$[1].dims[0]===1)throw Error("blockSize must be set only for block quantization.");if(!$[1].dims.map((Z,V)=>V===j.axis||Z===$[0].dims[V]).reduce((Z,V)=>Z&&V,!0))throw Error("For block qunatization, scale input shape to match the input shape except for the axis");if($[1].dims.length!==$[0].dims.length)throw Error("For block qunatization the scale input rank must be the same as the x rank.");let O=$[0].dims[j.axis],G=$[1].dims[j.axis];if(j.blockSizeMath.ceil(O/(G-1)-1))throw Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},Bx=($,j)=>{let O=d0.normalizeAxis(j.axis,$[0].dims.length),G=$[0].dataType,Z=G===3,V=$[0].dims,N=$[1].dataType,J=d0.size(V),R=G===3||G===2,U=R?[Math.ceil(d0.size($[0].dims)/4)]:$[0].dims,H=$[1].dims,L=$.length>2?$[2]:void 0,Y=L?R?[Math.ceil(d0.size(L.dims)/4)]:L.dims:void 0,S=H.length===0||H.length===1&&H[0]===1,X=S===!1&&H.length===1,D=M9(J),I=S&&(!R||D===4),k=I?D:1,z=I&&!R?D:1,w=j5("input",R?12:G,U.length,z),T=j5("scale",N,H.length),W=L?j5("zero_point",R?12:G,Y.length):void 0,E=n5("output",N,V.length,k),Q=[w,T];W&&Q.push(W);let A=[U,H];L&&A.push(Y);let l=[{type:12,data:J/k},{type:12,data:O},{type:12,data:j.blockSize},...$6(...A,V)];return{name:"DequantizeLinear",shaderCache:{hint:j.cacheKey,inputDependencies:W?["rank","rank","rank"]:["rank","rank"]},getShaderSource:(r)=>` + ${r.registerUniforms([{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}]).declareVariables(...Q,E)} + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${E.offsetToIndices("global_idx")}; + + // Set input x + ${R?` + let input = ${w.getByOffset("global_idx / 4")}; + let x_vec = ${Z?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${k===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${w.getByOffset("global_idx")};`}; + + // Set scale input + ${S?`let scale_value= ${T.getByOffset("0")}`:X?` + let scale_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${T.getByOffset("scale_index")};`:` + var scale_indices: ${T.type.indices} = output_indices; + let index = ${T.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${T.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${T.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${W?S?R?` + let zero_point_input = ${W.getByOffset("0")}; + let zero_point_vec = ${Z?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${W.getByOffset("0")}`:X?R?` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${W.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${Z?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${W.getByOffset("zero_point_index")};`:R?` + let zero_point_offset = ${T.indicesToOffset("scale_indices")}; + let zero_point_input = ${W.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${Z?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${W.getByIndices("scale_indices")};`:`let zero_point_value = ${R?Z?"i32":"u32":w.type.value}(0);`}; + // Compute and write output + ${E.setByOffset("global_idx",`${E.type.value}(x_value - zero_point_value) * scale_value`)}; + }`,getRunData:()=>({outputs:[{dims:V,dataType:N}],dispatchGroup:{x:Math.ceil(J/k/64),y:1,z:1},programUniforms:l})}},DF=($,j)=>{Cx($.inputs,j),$.compute(Bx($.inputs,j))},WF=($)=>$9({axis:$.axis,blockSize:$.blockSize})}),IW=k5(()=>{w3(),x6(),W6(),hx=($,j,O)=>{if($===j||$j&&O>0)throw Error("Range these inputs' contents are invalid.")},cx=($,j,O,G)=>{let Z=Math.abs(Math.ceil((j-$)/O)),V=[Z],N=Z,J=[{type:12,data:N},{type:G,data:$},{type:G,data:O},...$6(V)];return{name:"Range",shaderCache:{hint:`${G}`},getShaderSource:(R)=>{let U=n5("output",G,V.length),H=U.type.value,L=[{name:"outputSize",type:"u32"},{name:"start",type:H},{name:"delta",type:H}];return` + ${R.registerUniforms(L).declareVariables(U)} + ${R.mainStart()} + ${R.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${H}(global_idx) * uniforms.delta; + }`},getRunData:()=>({outputs:[{dims:V,dataType:G}],dispatchGroup:{x:Math.ceil(N/64)},programUniforms:J})}},MF=($)=>{let j=0,O=0,G=0;$.inputs[0].dataType===6?(j=$.inputs[0].getInt32Array()[0],O=$.inputs[1].getInt32Array()[0],G=$.inputs[2].getInt32Array()[0]):$.inputs[0].dataType===1&&(j=$.inputs[0].getFloat32Array()[0],O=$.inputs[1].getFloat32Array()[0],G=$.inputs[2].getFloat32Array()[0]),X9.webgpu.validateInputContent&&hx(j,O,G),$.compute(cx(j,O,G,$.inputs[0].dataType),{inputs:[]})}}),DW=k5(()=>{x6(),I6(),C9(),W6(),mx=($,j,O,G)=>{if($!=="none"&&G!=="i32"&&G!=="u32"&&G!=="f32")throw Error(`Input ${G} is not supported with reduction ${$}.`);let Z=`{ + var oldValue = 0; + loop { + let newValueF32 =`,V=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${j}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch($){case"none":return`${j}=${O};`;case"add":return G==="i32"||G==="u32"?`atomicAdd(&${j}, bitcast<${G}>(${O}));`:` + ${Z}bitcast<${G}>(oldValue) + (${O})${V}`;case"max":return G==="i32"||G==="u32"?`atomicMax(&${j}, bitcast<${G}>(${O}));`:` + ${Z}max(bitcast(oldValue), (${O}))${V}`;case"min":return G==="i32"||G==="u32"?`atomicMin(&${j}, bitcast<${G}>(${O}));`:`${Z}min(bitcast<${G}>(oldValue), (${O}))${V}`;case"mul":return`${Z}(bitcast<${G}>(oldValue) * (${O}))${V}`;default:throw Error(`Reduction ${$} is not supported.`)}},KN=($,j)=>($===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[${j?"i - indices_start":"i"}]; + let dim_value = uniforms.output_shape[${j?"i - indices_start":"i"} + uniforms.last_index_dimension];`)+` + + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim));`,bN=($,j,O)=>`for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * ${O?"global_idx":"idx"} + i]; + ${mx($.reduction,"output[data_offset + i]","value",j)} + }`,px=($,j)=>{let O=$[0].dims,G=$[1].dims,Z=O,V=Math.ceil(d0.size(G)/1),N=G[G.length-1],J=d0.sizeFromDimension(O,N),R=d0.sizeFromDimension(G,0)/N,U=[{type:12,data:V},{type:12,data:N},{type:12,data:J},...$6($[1].dims,$[2].dims,Z)];return{name:"ScatterND",shaderCache:{hint:`${j.cacheKey}_${j.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:Z,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:U}),getShaderSource:(H)=>{let L=j5("indices",$[1].dataType,$[1].dims.length),Y=j5("updates",$[2].dataType,$[2].dims.length,1),S=j.reduction!=="none"&&j.reduction!==""?NX("output",$[0].dataType,Z.length):n5("output",$[0].dataType,Z.length,1);return` + ${H.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(L,Y,S)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${j.reduction==="none"}) { + for (var i = 0; i < ${R}; i = i + 1) { + for (var j = i + 1; j < ${R}; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + if (${j.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + // Process each index-update pair individually when duplicates exist + for (var idx = 0u; idx < ${R}u; idx++) { + var data_offset = 0u; + for (var i = 0u; i < uniforms.last_index_dimension; i++) { + var index = i32(indices[idx * uniforms.last_index_dimension + i].x); + ${KN(O.length,!1)} + } + ${bN(j,S.type.value,!1)} + } + return; + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + var indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${KN(O.length,!0)} + } + ${bN(j,S.type.value,!0)} + }`}}},KF=($)=>$9({reduction:$.reduction}),bF=($,j)=>{$.compute(px($.inputs,j),{inputs:[$.inputs[1],$.inputs[2]],outputs:[]})}}),WW=k5(()=>{x6(),I6(),C9(),W6(),Ax=($,j)=>{if($.every((O)=>O>0||(()=>{throw Error("Resize requires scales input values to be positive")})),$.length>0){if(j.mode==="linear"){if(!($.length===2||$.length===3||$.length===4&&$[0]===1&&$[1]===1||$.length===4&&$[0]===1&&$[3]===1||$.length===5&&$[0]===1&&$[1]===1))throw Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(j.mode==="cubic"&&!($.length===2||$.length===4&&$[0]===1&&$[1]===1||$.length===4&&$[0]===1&&$[3]===1))throw Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},gx=($,j,O)=>{j.every((Z)=>Z>=0&&Z{throw Error("Resize requires axes input values to be positive and less than rank")}));let G=Array(O).fill(1);return j.forEach((Z,V)=>G[Z]=$[V]),G},ux=($,j,O,G,Z,V)=>{let[N,J,R]=O>10?[1,2,3]:[-1,$.length>1?1:-1,-1],U=$[0].dims.length;if(N>0&&$.length>N&&$[N].dims.length>0)$[N].getFloat32Array().forEach((H)=>V.push(H));else if(j.coordinateTransformMode==="tf_crop_and_resize")throw Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(J>0&&$.length>J&&$[J].dims.length===1&&$[J].dims[0]>0){if($[J].getFloat32Array().forEach((H)=>G.push(H)),G.length!==0&&G.length!==U&&O>=18&&G.length!==j.axes.length)throw Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");Ax(G,j),j.axes.length>0&&gx(G,j.axes,U).forEach((H,L)=>G[L]=H)}if(R>0&&$.length>R&&$[R].dims.length===1&&$[R].dims[0]>0&&($[R].getBigInt64Array().forEach((H)=>Z.push(Number(H))),Z.length!==0&&Z.length!==U&&O>=18&&Z.length!==j.axes.length))throw Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(j.axes.length>0){if(G.length!==0&&G.length!==j.axes.length)throw Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(Z.length!==0&&Z.length!==j.axes.length)throw Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof G<"u"&&typeof Z<"u"&&G.length>0&&Z.length>U)throw Error("Resize requires only of scales or sizes to be specified")},fN=($,j,O,G)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${$}) * (${j}); + let whole = ${G}(big / (${O})); + let fract = ${G}(big % (${O})) / ${G}(${O}); + return whole + fract; +`,dx=($,j)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${j} { `+(()=>{switch($){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${j}(xResized) / ${j}(xScale); + } else { + ${fN("xResized","lengthOriginal","lengthResized",j)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${j}(xResized) + 0.5) / ${j}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${j}(xResized) + 0.5) / ${j}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${fN("xResized","lengthOriginal - 1","lengthResized - 1",j)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${j}(roiStart) * ${j}(lengthOriginal - 1) + + (${j}(xResized) * ${j}(roiEnd - roiStart) * ${j}(lengthOriginal - 1)) / + ${j}(lengthResized - 1); + } else { + return 0.5 * ${j}(roiStart + roiEnd) * ${j}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${j}xScale * ${j}(lengthResized); + const adjustment = ${j}(lengthResized) / outputWidth; + const center = ${j}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${j}(xResized) + 0.5) / ${j}(xScale)) - 0.5;`;case"half_pixel":return`return ((${j}(xResized) + 0.5) / ${j}(xScale)) - 0.5;`;default:throw Error(`Coordinate transform mode ${$} is not supported`)}})()+"}",lx=($,j,O)=>`fn getNearestPixelFromOriginal(xOriginal: ${O}, isDownSample: bool) -> ${O} {`+(()=>{switch($){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";default:if(j<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw Error(`Nearest mode ${$} is not supported`)}})()+"}",ox=($,j,O)=>{let G=Array(O).fill(0).concat(Array(O).fill(1)),Z=$.length===0?G:$.slice();return j.length>0?(j.forEach((V,N)=>{G[V]=Z[N],G[N+O]=Z[j.length+N]}),G):Z},sx=($,j,O,G)=>{let Z=[];if(O.length>0)if(G.length>0){if($.forEach((V)=>Z.push(V)),Math.max(...G)>$.length)throw Error("axes is out of bound");G.forEach((V,N)=>Z[V]=O[N])}else O.forEach((V)=>Z.push(V));else{if(j.length===0)throw Error("Resize requires either scales or sizes.");Z=$.map((V,N)=>Math.round(V*j[N]))}return Z},ix=($,j,O)=>{let G=(()=>{switch(O.keepAspectRatioPolicy){case"not_larger":return O.axes.length>0?Math.min(...O.axes.map((V)=>j[V]),Number.MAX_VALUE):Math.min(...j,Number.MAX_VALUE);case"not_smaller":return O.axes.length>0?Math.max(...O.axes.map((V)=>j[V]),Number.MIN_VALUE):Math.max(...j,Number.MIN_VALUE);default:throw Error(`Keep aspect ratio policy ${O.keepAspectRatioPolicy} is not supported`)}})();j.fill(1,0,j.length);let Z=$.slice();return O.axes.length>0?(O.axes.forEach((V)=>j[V]=G),O.axes.forEach((V)=>Z[V]=Math.round($[V]*j[V]))):(j.fill(G,0,j.length),Z.forEach((V,N)=>Z[N]=Math.round(V*j[N]))),Z},ax=($,j,O,G,Z)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${$.type.indices}) -> array<${$.type.value}, ${O.length}> { + var original_indices: array<${$.type.value}, ${O.length}>; + for (var i:u32 = 0; i < ${O.length}; i++) { + var output_index = ${$.indicesGet("output_indices","i")}; + var scale = ${v6("uniforms.scales","i",G)}; + var roi_low = ${v6("uniforms.roi","i",Z)}; + var roi_hi = ${v6("uniforms.roi",`i + ${j.length}`,Z)}; + if (scale == 1.0) { + original_indices[i] = ${$.type.value}(output_index); + } else { + var input_shape_i = ${v6("uniforms.input_shape","i",j.length)}; + var output_shape_i = ${v6("uniforms.output_shape","i",O.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,rx=($,j,O,G,Z,V,N)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${j.type.indices}) -> ${$.type.indices} { + var input_indices: ${$.type.indices}; + for (var i:u32 = 0; i < ${G.length}; i++) { + var output_index = ${j.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${v6("uniforms.scales","i",Z)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${v6("uniforms.roi","i",V)}; + var roi_hi = ${v6("uniforms.roi",`i + ${O.length}`,V)}; + var input_shape_i = ${v6("uniforms.input_shape","i",O.length)}; + var output_shape_i = ${v6("uniforms.output_shape","i",G.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${N} || (original_idx >= 0 && original_idx < ${j.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${j.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${$.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,nx=($,j)=>` + fn checkInputIndices(input_indices: ${$.type.indices}) -> bool { + for (var i:u32 = 0; i < ${j.length}; i++) { + var input_index = ${$.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${v6("uniforms.input_shape","i",j.length)}) { + return false; + } + } + return true; + }`,wN=($,j,O,G)=>$.rank>G?` + ${$.indicesSet("input_indices",j,"channel")}; + ${$.indicesSet("input_indices",O,"batch")}; +`:"",tx=($,j,O,G,Z)=>{let[V,N,J,R]=O.length===2?[-1,0,1,-1]:[0,2,3,1],U=$.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${U} { + var input_indices: ${$.type.indices}; + ${$.indicesSet("input_indices",N,`max(0, min(row, ${O[N]} - 1))`)}; + ${$.indicesSet("input_indices",J,`max(0, min(col, ${O[J]} - 1))`)}; + ${wN($,R,V,2)} + return ${$.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${j.type.indices}) -> ${U} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${U} = originalIndices[${N}]; + var col:${U} = originalIndices[${J}]; + ${G?`if (row < 0 || row > (${O[N]} - 1) || col < 0 || col > (${O[J]} - 1)) { + return ${Z}; + }`:""}; + row = max(0, min(row, ${O[N]} - 1)); + col = max(0, min(col, ${O[J]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${O.length>2?`u32(originalIndices[${R}])`:"0"}; + var batch: u32 = ${O.length>2?`u32(originalIndices[${V}])`:"0"}; + var x11: ${U} = getInputValue(batch, channel, row1, col1); + var x12: ${U} = getInputValue(batch, channel, row1, col2); + var x21: ${U} = getInputValue(batch, channel, row2, col1); + var x22: ${U} = getInputValue(batch, channel, row2, col2); + var dx1: ${U} = abs(row - ${U}(row1)); + var dx2: ${U} = abs(${U}(row2) - row); + var dy1: ${U} = abs(col - ${U}(col1)); + var dy2: ${U} = abs(${U}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},ex=($,j,O,G,Z,V,N,J,R,U)=>{let H=O.length===2,[L,Y]=H?[0,1]:[2,3],S=$.type.value,X=(D)=>{let I=D===L?"row":"col";return` + fn ${I}CubicInterpolation(input_indices: ${$.type.indices}, output_indices: ${j.type.indices}) -> ${S} { + var output_index = ${j.indicesGet("output_indices",D)}; + var originalIdx: ${S} = getOriginalCoordinateFromResizedCoordinate(output_index, ${Z[D]}, + ${G[D]}, ${O[D]}, ${V[D]}, ${V[D]} + ${O.length}); + var fractOriginalIdx: ${S} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${J} && (originalIdx < 0 || originalIdx > (${O[D]} - 1))) { + return ${R}; + } + var data: array<${S}, 4> = array<${S}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${I}: ${S} = originalIdx + ${S}(i); + if (${I} < 0 || ${I} >= ${O[D]}) { + ${U?`coefs[i + 1] = 0.0; + continue;`:J?`return ${R};`:`${I} = max(0, min(${I}, ${O[D]} - 1));`}; + } + var input_indices_copy: ${$.type.indices} = input_indices; + ${$.indicesSet("input_indices_copy",D,`u32(${I})`)}; + data[i + 1] = ${D===L?$.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${X(L)}; + ${X(Y)}; + fn getCubicInterpolationCoefs(s: ${S}) -> array<${S}, 4> { + var absS = abs(s); + var coeffs: array<${S}, 4> = array<${S}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${S} = 1.0 - absS; + var twoMinusAbsS: ${S} = 2.0 - absS; + var onePlusAbsS: ${S} = 1.0 + absS; + coeffs[0] = ((${N} * onePlusAbsS - 5 * ${N}) * onePlusAbsS + 8 * ${N}) * onePlusAbsS - 4 * ${N}; + coeffs[1] = ((${N} + 2) * absS - (${N} + 3)) * absS * absS + 1; + coeffs[2] = ((${N} + 2) * oneMinusAbsS - (${N} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${N} * twoMinusAbsS - 5 * ${N}) * twoMinusAbsS + 8 * ${N}) * twoMinusAbsS - 4 * ${N}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${S}, 4>, coefs: array<${S}, 4>) -> ${S} { + var coefsSum: ${S} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${j.type.indices}) -> ${S} { + var input_indices: ${$.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},$L=($,j,O,G,Z)=>{let[V,N,J,R,U]=O.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],H=$.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${H} { + var input_indices: ${$.type.indices}; + ${$.indicesSet("input_indices",N,`max(0, min(depth, ${O[N]} - 1))`)}; + ${$.indicesSet("input_indices",J,`max(0, min(height, ${O[J]} - 1))`)}; + ${$.indicesSet("input_indices",R,`max(0, min(width, ${O[R]} - 1))`)}; + ${wN($,U,V,3)} + return ${$.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${j.type.indices}) -> ${H} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${H} = originalIndices[${N}]; + var height:${H} = originalIndices[${J}]; + var width:${H} = originalIndices[${R}]; + ${G?`if (depth < 0 || depth > (${O[N]} - 1) || height < 0 || height > (${O[J]} - 1) || width < 0 || (width > ${O[R]} - 1)) { + return ${Z}; + }`:""}; + + depth = max(0, min(depth, ${O[N]} - 1)); + height = max(0, min(height, ${O[J]} - 1)); + width = max(0, min(width, ${O[R]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${O.length>3?`u32(originalIndices[${U}])`:"0"}; + var batch: u32 = ${O.length>3?`u32(originalIndices[${V}])`:"0"}; + + var x111: ${H} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${H} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${H} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${H} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${H} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${H} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${H} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${H} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${H} = abs(depth - ${H}(depth1)); + var dx2: ${H} = abs(${H}(depth2) - depth); + var dy1: ${H} = abs(height - ${H}(height1)); + var dy2: ${H} = abs(${H}(height2) - height); + var dz1: ${H} = abs(width - ${H}(width1)); + var dz2: ${H} = abs(${H}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},jL=($,j,O,G,Z,V)=>{let N=$.dims,J=ox(V,j.axes,N.length),R=sx(N,G,Z,j.axes),U=G.slice();G.length===0&&(U=N.map((k,z)=>k===0?1:R[z]/k),j.keepAspectRatioPolicy!=="stretch"&&(R=ix(N,U,j)));let H=n5("output",$.dataType,R.length),L=j5("input",$.dataType,N.length),Y=d0.size(R),S=N.length===R.length&&N.every((k,z)=>k===R[z]),X=j.coordinateTransformMode==="tf_crop_and_resize",D=j.extrapolationValue,I=L.type.value;return{name:"Resize",shaderCache:{hint:`${j.cacheKey}|${O}|${U.length>0?j.mode==="cubic"?U:U.length:""}|${Z.length>0?Z:""}|${J.length>0?J:""}|${S}|${j.mode==="nearest"?N.length:N}`,inputDependencies:["rank"]},getShaderSource:(k)=>` + ${S?"":` + ${dx(j.coordinateTransformMode,I)}; + ${(()=>{switch(j.mode){case"nearest":return` + ${nx(L,N)}; + ${lx(j.nearestMode,O,I)}; + ${rx(L,H,N,R,U.length,J.length,X)}; + `;case"linear":return` + ${ax(H,N,R,U.length,J.length)}; + ${(()=>{if(N.length===2||N.length===4)return`${tx(L,H,N,X,D)}`;if(N.length===3||N.length===5)return`${$L(L,H,N,X,D)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(N.length===2||N.length===4)return`${ex(L,H,N,R,U,J,j.cubicCoeffA,X,j.extrapolationValue,j.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${k.registerUniform("output_size","u32").registerUniform("scales","f32",U.length).registerUniform("roi","f32",J.length).declareVariables(L,H)} + ${k.mainStart()} + ${k.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${S?"output[global_idx] = input[global_idx];":` + let output_indices = ${H.offsetToIndices("global_idx")}; + var input_indices: ${L.type.indices}; + ${(()=>{switch(j.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${L.getByIndices("input_indices")}; + } else { + output[global_idx] = ${j.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${N.length===2||N.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${j.mode}`)}})()}; +`} + }`,getRunData:()=>({outputs:[{dims:R,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(Y/64)},programUniforms:[{type:12,data:Y},{type:1,data:U},{type:1,data:J},...$6(N,R)]})}},OL=($)=>{let j=$.customDataBuffer;return new Uint32Array(j,j.byteOffset,1)[0]},fF=($,j)=>{let O=[],G=[],Z=[],V=OL($);if(j.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");ux($.inputs,j,V,O,G,Z),$.compute(jL($.inputs[0],j,V,O,G,Z),{inputs:[0]})},wF=($)=>{let{antialias:j,axes:O,coordinateTransformMode:G,cubicCoeffA:Z}=$,V=$.excludeOutside!==0,N=$.extrapolationValue,J=$.keepAspectRatioPolicy,R=$.mode,U=$.nearestMode===""?"simple":$.nearestMode;return $9({antialias:j,axes:O,coordinateTransformMode:G,cubicCoeffA:Z,excludeOutside:V,extrapolationValue:N,keepAspectRatioPolicy:J,mode:R,nearestMode:U})}}),MW=k5(()=>{x6(),I6(),W6(),GL=($)=>{if(!$||$.length<3)throw Error("layerNorm requires at least 3 inputs.");let j=$[0],O=$[1],G=$[2];if(j.dataType!==O.dataType||j.dataType!==G.dataType)throw Error("All inputs must have the same data type");if(j.dims.length!==3&&j.dims.length!==2)throw Error("Input must be 2D or 3D");if(O.dims.length!==3&&O.dims.length!==2)throw Error("Skip must be 2D or 3D");let Z=j.dims[j.dims.length-1],V=j.dims[j.dims.length-2];if(O.dims[O.dims.length-1]!==Z)throw Error("Skip must have the same hidden size as input");if(O.dims[O.dims.length-2]!==V)throw Error("Skip must have the same sequence length as input");if(G.dims.length!==1)throw Error("Gamma must be 1D");if(G.dims[G.dims.length-1]!==Z)throw Error("Gamma must have the same hidden size as input");if($.length>3){let N=$[3];if(N.dims.length!==1)throw Error("Beta must be 1D");if(N.dims[N.dims.length-1]!==Z)throw Error("Beta must have the same hidden size as input")}if($.length>4){let N=$[4];if(N.dims.length!==1)throw Error("Bias must be 1D");if(N.dims[N.dims.length-1]!==Z)throw Error("Bias must have the same hidden size as input")}},ZL=($,j,O,G)=>{let Z=j.simplified,V=$[0].dims,N=d0.size(V),J=V,R=N,U=V.slice(-1)[0],H=G?V.slice(0,-1).concat(1):[],L=!Z&&$.length>3,Y=$.length>4,S=G&&O>1,X=G&&O>2,D=O>3,I=64,k=M9(U),z=[{type:12,data:R},{type:12,data:k},{type:12,data:U},{type:1,data:j.epsilon}],w=[{dims:J,dataType:$[0].dataType}];return O>1&&w.push({dims:H,dataType:1}),O>2&&w.push({dims:H,dataType:1}),O>3&&w.push({dims:V,dataType:$[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${k};${S};${X};${D}`,inputDependencies:$.map((T,W)=>"type")},getShaderSource:(T)=>{let W=[j5("x",$[0].dataType,$[0].dims,k),j5("skip",$[1].dataType,$[1].dims,k),j5("gamma",$[2].dataType,$[2].dims,k)];L&&W.push(j5("beta",$[3].dataType,$[3].dims,k)),Y&&W.push(j5("bias",$[4].dataType,$[4].dims,k)),W.push(n5("output",$[0].dataType,J,k)),S&&W.push(n5("mean_output",1,H)),X&&W.push(n5("inv_std_output",1,H)),D&&W.push(n5("input_skip_bias_sum",$[0].dataType,J,k));let E=G1($[0].dataType),Q=G1(1,k);return` + + ${T.registerUniforms([{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}]).declareVariables(...W)} + var sum_shared : array<${Q}, 64>; + var sum_squared_shared : array<${Q}, 64>; + + ${T.mainStart([I,1,1])} + let ix = local_id.x; + let iy = global_id.x / 64; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / 64; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == 63) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${Y?"bias[offset1d + i]":E+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${D?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${FG(E,k,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = 64; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${V7("sum",k)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${V7("square_sum",k)} / f32(uniforms.hidden_size) ${Z?"":"- mean * mean"} + uniforms.epsilon); + ${S?"mean_output[global_idx] = mean;":""} + ${X?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${Z?"":`- ${E}(mean)`}) * + ${E}(inv_std_dev) * gamma[offset1d + i] + ${L?"+ beta[offset1d + i]":""}; + } + }`},getRunData:()=>({outputs:w,dispatchGroup:{x:Math.ceil(R/U)},programUniforms:z})}},EF=($,j)=>{GL($.inputs);let O=[0];$.outputCount>1&&O.push(-3),$.outputCount>2&&O.push(-3),$.outputCount>3&&O.push(3),$.compute(ZL($.inputs,j,$.outputCount,!1),{outputs:O})}}),KW=k5(()=>{x6(),I6(),C9(),W6(),qL=($,j)=>{if(!$||$.length<1)throw Error("too few inputs");if(j.axes.length!==0){if(j.axes.length!==j.starts.length||j.axes.length!==j.ends.length)throw Error("axes, starts and ends must have the same length")}else if(j.starts.length!==j.ends.length)throw Error("starts and ends must have the same length");$.slice(1).forEach((O,G)=>{if($[G+1].dataType!==6&&$[G+1].dataType!==7)throw Error(`Input ${G} must be an array of int32 or int64`)})},HZ=($,j)=>{let O=[];if($.length>j)if($[j].dataType===7)$[j].getBigInt64Array().forEach((G)=>O.push(Number(G)));else{if($[j].dataType!==6)throw Error(`Input ${j} must be an array of int32 or int64`);$[j].getInt32Array().forEach((G)=>O.push(Number(G)))}return O},VL=($,j)=>{if($.length>1){let O=HZ($,1),G=HZ($,2),Z=HZ($,3);return Z.length===0&&(Z=[...Array($[0].dims.length).keys()]),$9({starts:O,ends:G,axes:Z})}return j},EN=($,j,O,G,Z)=>{let V=$;return $<0&&(V+=O[G[j]]),Z[j]<0?Math.max(0,Math.min(V,O[G[j]]-1)):Math.max(0,Math.min(V,O[G[j]]))},NL=($,j,O)=>`fn calculateInputIndices(output_indices: ${j.type.indices}) -> ${$.type.indices} { + var input_indices: ${$.type.indices}; + var carry = 0u; + for (var i = ${O.length}; i >= 0; i--) { + let input_shape_i = ${v6("uniforms.input_shape","i",O.length)}; + let steps_i = ${v6("uniforms.steps","i",O.length)}; + let signs_i = ${v6("uniforms.signs","i",O.length)}; + let starts_i = ${v6("uniforms.starts","i",O.length)}; + var output_index = ${j.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${$.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,JL=($,j)=>{let O=$[0].dims,G=d0.size(O),Z=j.axes.length>0?d0.normalizeAxes(j.axes,O.length):[...Array(O.length).keys()],V=HZ($,4);V.forEach((I)=>I!==0||(()=>{throw Error("step cannot be 0")})),V.length===0&&(V=Array(Z.length).fill(1));let N=j.starts.map((I,k)=>EN(I,k,O,Z,V)),J=j.ends.map((I,k)=>EN(I,k,O,Z,V));if(Z.length!==N.length||Z.length!==J.length)throw Error("start, ends and axes should have the same number of elements");if(Z.length!==O.length)for(let I=0;IMath.sign(I));V.forEach((I,k,z)=>{if(I<0){let w=(J[k]-N[k])/I,T=N[k],W=T+w*V[k];N[k]=W,J[k]=T,z[k]=-I}});let U=O.slice(0);Z.forEach((I,k)=>{U[I]=Math.ceil((J[I]-N[I])/V[I])});let H={dims:U,dataType:$[0].dataType},L=n5("output",$[0].dataType,U.length),Y=j5("input",$[0].dataType,$[0].dims.length),S=d0.size(U),X=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:N.length},{name:"signs",type:"i32",length:R.length},{name:"steps",type:"u32",length:V.length}],D=[{type:12,data:S},{type:12,data:N},{type:6,data:R},{type:12,data:V},...$6($[0].dims,U)];return{name:"Slice",shaderCache:{hint:`${R.length}_${N.length}_${V.length}`,inputDependencies:["rank"]},getShaderSource:(I)=>` + ${I.registerUniforms(X).declareVariables(Y,L)} + ${NL(Y,L,O)} + ${I.mainStart()} + ${I.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${L.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${L.setByOffset("global_idx",Y.getByIndices("input_indices"))} + }`,getRunData:()=>({outputs:[H],dispatchGroup:{x:Math.ceil(G/64)},programUniforms:D})}},QF=($,j)=>{qL($.inputs,j);let O=VL($.inputs,j);$.compute(JL($.inputs,O),{inputs:[0]})},CF=($)=>{let{starts:j,ends:O,axes:G}=$;return $9({starts:j,ends:O,axes:G})}}),bW=k5(()=>{x6(),I6(),C9(),J7(),W6(),vL=($)=>{if(!$||$.length!==1)throw Error("Softmax op requires 1 input.")},RL=($,j)=>{let O,G=$.inputs[0],Z=G.dims,V=d0.size(Z),N=Z.length,J=d0.normalizeAxis(j.axis,N),R=JE),U[J]=N-1,U[N-1]=J,O=$.compute(P2(G,U),{inputs:[G],outputs:[-1]})[0]):O=G;let H=O.dims,L=H[N-1],Y=V/L,S=M9(L),X=L/S,D=64;Y===1&&(D=256);let I=j5("x",O.dataType,O.dims,S),k=n5("result",O.dataType,O.dims,S),z=I.type.value,w=G1(O.dataType)==="f32"?`var threadMax = ${z}(-3.402823e+38f);`:`var threadMax = ${z}(-65504.0h);`,T=$.compute({name:"Softmax",shaderCache:{hint:`${S};${D}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:H,dataType:O.dataType}],dispatchGroup:{x:Y},programUniforms:[{type:6,data:X}]}),getShaderSource:(W)=>` + var rowMaxShared : ${z}; + var rowSumShared : ${z}; + var threadShared : array<${z}, ${D}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${z} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${z}) { + let index = row * row_stride + col; + result[index] = value; + } + ${W.registerUniform("packedCols","i32").declareVariables(I,k)} + ${W.mainStart(D)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${D}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${w} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${z}(${((E,Q)=>Q===4?`max(max(${E}.x, ${E}.y), max(${E}.z, ${E}.w))`:Q===2?`max(${E}.x, ${E}.y)`:Q===3?`max(max(${E}.x, ${E}.y), ${E}.z)`:E)("threadShared[0]",S)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${z}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${z}(${V7("threadShared[0]",S)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`},{inputs:[O],outputs:[R?-1:0]})[0];R&&$.compute(P2(T,U),{inputs:[T]})},BF=($,j)=>{vL($.inputs),RL($,j)},hF=($)=>$9({axis:$.axis})}),fW=k5(()=>{x6(),I6(),W6(),QN=($)=>Array.from($.getBigInt64Array(),Number),UL=($)=>{if(!$||$.length!==2)throw Error("Tile requires 2 inputs.");if($[0].dataType!==1&&$[0].dataType!==10&&$[0].dataType!==6&&$[0].dataType!==12)throw Error("Tile only support float, float16, int32, and uint32 data types");if($[1].dataType!==7)throw Error("Tile `repeats` input should be of int64 data type");if($[1].dims.length!==1)throw Error("Tile `repeats` input should be 1-D");if(QN($[1]).length!==$[0].dims.length)throw Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},HL=($,j)=>{let O=[];for(let G=0;G<$.length;++G)O.push($[G]*j[G]);return O},xL=($,j)=>{let O=$[0].dims,G=j??QN($[1]),Z=HL(O,G),V=d0.size(Z),N=$[0].dataType,J=j5("input",N,O.length),R=n5("output",N,Z.length);return{name:"Tile",shaderCache:{hint:`${G}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:Z,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:[{type:12,data:V},...$6($[0].dims,Z)]}),getShaderSource:(U)=>` + const inputShape = ${J.indices(...O)}; + ${U.registerUniform("output_size","u32").declareVariables(J,R)} + ${U.mainStart()} + ${U.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${R.offsetToIndices("global_idx")}; + var input_indices: ${J.type.indices}; + for (var i = 0; i < ${O.length}; i++) { + let input_dim_i = ${J.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${R.indicesGet("output_indices","i")} % input_dim_i; + + ${J.indicesSet("input_indices","i","input_dim_value")} + } + ${R.setByOffset("global_idx",J.getByIndices("input_indices"))} + }`}},cF=($)=>{UL($.inputs),$.compute(xL($.inputs),{inputs:[0]})}}),wW=k5(()=>{x6(),I6(),W6(),LL=($,j,O,G,Z)=>{let V,N=n5("output_data",Z,O.length,4),J=j5("a_data",j[1].dataType,j[1].dims.length,4),R=j5("b_data",j[2].dataType,j[2].dims.length,4),U=j5("c_data",j[0].dataType,j[0].dims.length,4),H=(L,Y,S)=>`select(${Y}, ${L}, ${S})`;if(G){let L=(Y,S,X="")=>{let D=`a_data[index_a${S}][component_a${S}]`,I=`b_data[index_b${S}][component_b${S}]`,k=`bool(c_data[index_c${S}] & (0xffu << (component_c${S} * 8)))`;return` + let output_indices${S} = ${N.offsetToIndices(`global_idx * 4u + ${S}u`)}; + let offset_a${S} = ${J.broadcastedIndicesToOffset(`output_indices${S}`,N)}; + let offset_b${S} = ${R.broadcastedIndicesToOffset(`output_indices${S}`,N)}; + let offset_c${S} = ${U.broadcastedIndicesToOffset(`output_indices${S}`,N)}; + let index_a${S} = offset_a${S} / 4u; + let index_b${S} = offset_b${S} / 4u; + let index_c${S} = offset_c${S} / 4u; + let component_a${S} = offset_a${S} % 4u; + let component_b${S} = offset_b${S} % 4u; + let component_c${S} = offset_c${S} % 4u; + ${Y}[${S}] = ${X}(${H(D,I,k)}); + `};V=Z===9?` + var data = vec4(0); + ${L("data",0,"u32")} + ${L("data",1,"u32")} + ${L("data",2,"u32")} + ${L("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:` + ${L("output_data[global_idx]",0)} + ${L("output_data[global_idx]",1)} + ${L("output_data[global_idx]",2)} + ${L("output_data[global_idx]",3)} + `}else V=N.setByOffset("global_idx",H(J.getByOffset("global_idx"),R.getByOffset("global_idx"),U.getByOffset("global_idx")));return` + ${$.registerUniform("vec_size","u32").declareVariables(U,J,R,N)} + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${V} + }`},_L=($)=>{let j=$[1].dims,O=$[2].dims,G=$[0].dims,Z=$[1].dataType,V=!(d0.areEqual(j,O)&&d0.areEqual(O,G)),N=j,J=d0.size(j);if(V){let U=zG.calcShape(zG.calcShape(j,O,!1),G,!1);if(!U)throw Error("Can't perform where op on the given tensors");N=U,J=d0.size(N)}let R=Math.ceil(J/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:(U)=>LL(U,$,N,V,Z),getRunData:()=>({outputs:[{dims:N,dataType:Z}],dispatchGroup:{x:Math.ceil(J/64/4)},programUniforms:[{type:12,data:R},...$6(G,j,O,N)]})}},mF=($)=>{$.compute(_L($.inputs))}}),EW=k5(()=>{sD(),pv(),iD(),aD(),rD(),nD(),tD(),GW(),qW(),VW(),NW(),JW(),vW(),RW(),UW(),HW(),xW(),LW(),_W(),YW(),SW(),PW(),XW(),TW(),FW(),dF(),yW(),zW(),kW(),IW(),DW(),mv(),WW(),oF(),MW(),KW(),bW(),lF(),fW(),J7(),Av(),wW(),pF=new Map([["Abs",[BX]],["Acos",[hX]],["Acosh",[cX]],["Add",[PT]],["ArgMax",[wX,rJ]],["ArgMin",[fX,rJ]],["Asin",[mX]],["Asinh",[pX]],["Atan",[AX]],["Atanh",[gX]],["Attention",[EX]],["AveragePool",[XF,PF]],["BatchNormalization",[QX]],["BiasAdd",[CX]],["BiasSplitGelu",[ST]],["Cast",[dX,uX]],["Ceil",[oX]],["Clip",[lX]],["Concat",[MT,KT]],["Conv",[Ov,jv]],["ConvTranspose",[mT,cT]],["Cos",[sX]],["Cosh",[iX]],["CumSum",[pT,AT]],["DepthToSpace",[gT,uT]],["DequantizeLinear",[DF,WF]],["Div",[XT]],["Einsum",[dT,lT]],["Elu",[aX,bZ]],["Equal",[TT]],["Erf",[rX]],["Exp",[nX]],["Expand",[oT]],["FastGelu",[sT]],["Floor",[tX]],["FusedConv",[Ov,jv]],["Gather",[aT,iT]],["GatherElements",[jF,$F]],["GatherBlockQuantized",[tT,eT]],["GatherND",[rT,nT]],["Gelu",[eX]],["Gemm",[GF,OF]],["GlobalAveragePool",[FF,TF]],["GlobalMaxPool",[IF,kF]],["Greater",[kT]],["GreaterOrEqual",[DT]],["GridSample",[ZF,qF]],["GroupQueryAttention",[UF]],["HardSigmoid",[NT,VT]],["InstanceNormalization",[HF]],["LayerNormalization",[xF]],["LeakyRelu",[$T,bZ]],["Less",[IT]],["LessOrEqual",[WT]],["Log",[_T]],["MatMul",[LF]],["MatMulNBits",[_F,YF]],["MaxPool",[yF,zF]],["Mul",[FT]],["MultiHeadAttention",[NF,VF]],["Neg",[OT]],["Not",[jT]],["Pad",[SF]],["Pow",[yT]],["QuickGelu",[YT,bZ]],["Range",[MF]],["Reciprocal",[GT]],["ReduceMin",[DX]],["ReduceMean",[FX]],["ReduceMax",[IX]],["ReduceSum",[MX]],["ReduceProd",[WX]],["ReduceL1",[yX]],["ReduceL2",[zX]],["ReduceLogSum",[bX]],["ReduceLogSumExp",[kX]],["ReduceSumSquare",[KX]],["Relu",[ZT]],["Resize",[fF,wF]],["RotaryEmbedding",[RF]],["ScatterND",[bF,KF]],["Sigmoid",[qT]],["Sin",[JT]],["Sinh",[vT]],["Slice",[QF,CF]],["SkipLayerNormalization",[EF]],["Split",[JF,vF]],["Sqrt",[RT]],["Softmax",[BF,hF]],["Sub",[zT]],["Tan",[UT]],["Tanh",[HT]],["ThresholdedRelu",[LT,bZ]],["Tile",[cF]],["Transpose",[vX,RX]],["Where",[mF]]])}),QW=k5(()=>{w3(),k4(),W6(),AF=class{constructor($){this.backend=$,this.repo=new Map,this.attributesBound=!1}getArtifact($){return this.repo.get($)}setArtifact($,j){this.repo.set($,j)}run($,j,O,G,Z){G4($.programInfo.name);let V=this.backend.device,N=this.backend.getComputePassEncoder();this.backend.writeTimestamp(2*this.backend.pendingDispatchNumber);let J=[];for(let U of j)J.push({binding:J.length,resource:{buffer:U.buffer}});for(let U of O)J.push({binding:J.length,resource:{buffer:U.buffer}});Z&&J.push({binding:J.length,resource:Z});let R=V.createBindGroup({layout:$.computePipeline.getBindGroupLayout(0),entries:J,label:$.programInfo.name});if(this.backend.sessionStatus==="capturing"){let U={kernelId:this.backend.currentKernelId,computePipeline:$.computePipeline,bindGroup:R,dispatchGroup:G};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(U)}N.setPipeline($.computePipeline),N.setBindGroup(0,R),N.dispatchWorkgroups(...G),this.backend.writeTimestamp(2*this.backend.pendingDispatchNumber+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),f3($.programInfo.name)}dispose(){}build($,j){G4($.name);let O=this.backend.device,G=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"}].forEach((U)=>{O.features.has(U.feature)&&G.push(`enable ${U.extension};`)});let Z=JX(j,this.backend.device.limits),V=$.getShaderSource(Z),N=`${G.join(` +`)} +${Z.additionalImplementations} +${V}`,J=O.createShaderModule({code:N,label:$.name});d6("verbose",()=>`[WebGPU] ${$.name} shader code: ${N}`);let R=O.createComputePipeline({compute:{module:J,entryPoint:"main"},layout:"auto",label:$.name});return f3($.name),{programInfo:$,computePipeline:R,uniformVariablesInfo:Z.variablesInfo}}normalizeDispatchGroupSize($){let j=typeof $=="number"?$:$.x,O=typeof $=="number"?1:$.y||1,G=typeof $=="number"?1:$.z||1,Z=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(j<=Z&&O<=Z&&G<=Z)return[j,O,G];let V=j*O*G,N=Math.ceil(Math.sqrt(V));if(N>Z){if(N=Math.ceil(Math.cbrt(V)),N>Z)throw Error("Total dispatch size exceeds WebGPU maximum.");return[N,N,N]}return[N,N,1]}}}),sF={};WG(sF,{WebGpuBackend:()=>iF});var YL,SL,PL,iF,CW=k5(()=>{w3(),x6(),k4(),uF(),lD(),EW(),QW(),YL=($,j)=>{if(j.length!==$.length)throw Error(`inputDependencies length ${j.length} is not equal to inputTensors length ${$.length}.`);let O=[];for(let G=0;G<$.length;++G){let Z=$[G].dataType;switch(j[G]){case"none":O.push("");break;case"type":O.push(`${Z}`);break;case"rank":{let V=$[G].dims.length;O.push(`${Z};${V}`);break}case"dims":{let V=$[G].dims.join(",");O.push(`${Z};${V}`);break}default:throw Error(`unsupported input dependency: ${j[G]}`)}}return O.join("|")},SL=($,j,O)=>{let G=$.name;return $.shaderCache?.hint&&(G+="["+$.shaderCache.hint+"]"),G+=":"+O+`:${YL(j,$.shaderCache?.inputDependencies??Array(j.length).fill("dims"))}`,G},PL=class{constructor($){$&&(this.architecture=$.architecture,this.vendor=$.vendor)}isArchitecture($){return this.architecture===$}isVendor($){return this.vendor===$}},iF=class{constructor(){this.currentSessionId=null,this.currentKernelId=null,this.commandEncoder=null,this.computePassEncoder=null,this.maxDispatchNumber=16,this.pendingDispatchNumber=0,this.pendingKernels=[],this.pendingQueries=new Map,this.sessionStatus="default",this.capturedCommandList=new Map,this.capturedPendingKernels=new Map,this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let $=this.kernelCustomData.get(this.currentKernelId);return $||($={},this.kernelCustomData.set(this.currentKernelId,$)),$}async initialize($,j){this.env=$;let O=[],G={requiredLimits:{maxComputeWorkgroupStorageSize:j.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:j.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:j.limits.maxStorageBufferBindingSize,maxBufferSize:j.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:j.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:j.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:j.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:j.limits.maxComputeWorkgroupSizeZ},requiredFeatures:O},Z=(V)=>j.features.has(V)&&O.push(V)&&!0;Z("chromium-experimental-timestamp-query-inside-passes")||Z("timestamp-query"),Z("shader-f16"),Z("subgroups"),this.device=await j.requestDevice(G),this.adapterInfo=new PL(j.info||await j.requestAdapterInfo()),this.gpuDataManager=VX(this),this.programManager=new AF(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,fv($.logLevel,!!$.debug),this.device.onuncapturederror=(V)=>{V.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${V.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:j,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let $=this.getCommandEncoder(),j={};this.queryType==="at-passes"&&(j.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:2*this.pendingDispatchNumber,endOfPassWriteIndex:2*this.pendingDispatchNumber+1}),this.computePassEncoder=$.beginComputePass(j)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;let $;G4(),this.endComputePass(),this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,2*this.pendingDispatchNumber,this.queryResolveBuffer,0),$=this.device.createBuffer({size:2*this.pendingDispatchNumber*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set($,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,$,0,2*this.pendingDispatchNumber*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&$.mapAsync(GPUMapMode.READ).then(()=>{let j=new BigUint64Array($.getMappedRange()),O=this.pendingQueries.get($);for(let G=0;G"u"&&(this.queryTimeBase=Y);let X=Number(Y-this.queryTimeBase),D=Number(S-this.queryTimeBase);if(!Number.isSafeInteger(X)||!Number.isSafeInteger(D))throw RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:H.map((I)=>({dims:I.dims,dataType:y4(I.dataType)})),outputsMetadata:L.map((I)=>({dims:I.dims,dataType:y4(I.dataType)})),kernelId:V,kernelType:J,kernelName:R,programName:U,startTime:X,endTime:D});else{let I="";H.forEach((z,w)=>{I+=`input[${w}]: [${z.dims}] | ${y4(z.dataType)}, `});let k="";L.forEach((z,w)=>{k+=`output[${w}]: [${z.dims}] | ${y4(z.dataType)}, `}),console.log(`[profiling] kernel "${V}|${J}|${R}|${U}" ${I}${k}execution time: ${D-X} ns`)}GV("GPU",`${U}::${Y}::${S}`)}$.unmap(),this.pendingQueries.delete($)}),f3()}run($,j,O,G,Z,V){G4($.name);let N=[];for(let z=0;zw):O;if(H.length!==J.length)throw Error(`Output size ${H.length} must be equal to ${J.length}.`);let L,Y=[],S=[];for(let z=0;z=V)throw Error(`Invalid output index: ${H[z]}`);if(H[z]===-3)continue;let w=H[z]===-1,T=H[z]===-2,W=w||T?Z(J[z].dataType,J[z].dims):G(H[z],J[z].dataType,J[z].dims);if(Y.push(W),W.data===0)continue;let E=this.gpuDataManager.get(W.data);if(!E)throw Error(`no GPU data for output: ${W.data}`);if(w&&this.temporaryData.push(E),T){let Q=this.kernelPersistentData.get(this.currentKernelId);Q||(Q=[],this.kernelPersistentData.set(this.currentKernelId,Q)),Q.push(E)}S.push(E)}if(N.length!==j.length||S.length!==Y.length){if(S.length===0)return f3($.name),Y;throw Error(`Program ${$.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}if(U){let z=0,w=[];U.forEach((Q)=>{let A=typeof Q.data=="number"?[Q.data]:Q.data;if(A.length===0)return;let l,r,e=Q.type===10?2:4;Q.type===10?(r=A.length>4?16:A.length>2?8:A.length*e,l=A.length>4?16:e*A.length):(r=A.length<=2?A.length*e:16,l=16),z=Math.ceil(z/r)*r,w.push(z);let V0=Q.type===10?8:4;z+=A.length>4?Math.ceil(A.length/V0)*l:A.length*e});let T=16;z=Math.ceil(z/T)*T;let W=new ArrayBuffer(z);U.forEach((Q,A)=>{let l=w[A],r=typeof Q.data=="number"?[Q.data]:Q.data;if(Q.type===6)new Int32Array(W,l,r.length).set(r);else if(Q.type===12)new Uint32Array(W,l,r.length).set(r);else if(Q.type===10)new Uint16Array(W,l,r.length).set(r);else{if(Q.type!==1)throw Error(`Unsupported uniform type: ${y4(Q.type)}`);new Float32Array(W,l,r.length).set(r)}});let E=this.gpuDataManager.create(z,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(E.buffer,0,W,0,z),this.gpuDataManager.release(E.id),L={offset:0,size:z,buffer:E.buffer}}let X=this.programManager.normalizeDispatchGroupSize(R),D=X[1]===1&&X[2]===1,I=SL($,j,D),k=this.programManager.getArtifact(I);if(k||(k=this.programManager.build($,X),this.programManager.setArtifact(I,k),d6("info",()=>`[artifact] key: ${I}, programName: ${$.name}`)),U&&k.uniformVariablesInfo){if(U.length!==k.uniformVariablesInfo.length)throw Error(`Uniform variables count mismatch: expect ${k.uniformVariablesInfo.length}, got ${U.length} in program "${k.programInfo.name}".`);for(let z=0;z`[ProgramManager] run "${$.name}" (key=${I}) with ${X[0]}x${X[1]}x${X[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let z={kernelId:this.currentKernelId,programName:k.programInfo.name,inputTensorViews:j,outputTensorViews:Y};this.pendingKernels.push(z),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(z)}return this.programManager.run(k,N,S,X,L),f3($.name),Y}upload($,j){this.gpuDataManager.upload($,j)}memcpy($,j){this.gpuDataManager.memcpy($,j)}async download($,j){await this.gpuDataManager.download($,j)}alloc($){return this.gpuDataManager.create($).id}free($){return this.gpuDataManager.release($)}createKernel($,j,O,G){let Z=pF.get($);if(!Z)throw Error(`kernel not implemented: ${$}`);let V={kernelType:$,kernelName:G,kernelEntry:Z[0],attributes:[Z[1],O]};this.kernels.set(j,V)}releaseKernel($){let j=this.kernelPersistentData.get($);if(j){for(let O of j)this.gpuDataManager.release(O.id);this.kernelPersistentData.delete($)}this.kernelCustomData.delete($),this.kernels.delete($)}computeKernel($,j,O){let G=this.kernels.get($);if(!G)throw Error(`kernel not created: ${$}`);let{kernelType:Z,kernelName:V,kernelEntry:N,attributes:J}=G;if(this.currentKernelId!==null)throw Error(`kernel "[${Z}] ${V}" is not allowed to be called recursively`);this.currentKernelId=$,J[0]&&(J[1]=J[0](J[1]),J[0]=void 0),d6("info",()=>`[WebGPU] Start to run kernel "[${Z}] ${V}"...`);let R=this.env.debug;this.temporaryData=[];try{return R&&this.device.pushErrorScope("validation"),N(j,J[1]),0}catch(U){return O.push(Promise.resolve(`[WebGPU] Kernel "[${Z}] ${V}" failed. ${U}`)),1}finally{R&&O.push(this.device.popErrorScope().then((U)=>U?`GPU validation error for kernel "[${Z}] ${V}": ${U.message}`:null));for(let U of this.temporaryData)this.gpuDataManager.release(U.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer($,j,O,G){let Z=this.sessionExternalDataMapping.get($);Z||(Z=new Map,this.sessionExternalDataMapping.set($,Z));let V=Z.get(j),N=this.gpuDataManager.registerExternalBuffer(O,G,V);return Z.set(j,[N,O]),N}unregisterBuffers($){let j=this.sessionExternalDataMapping.get($);j&&(j.forEach((O)=>this.gpuDataManager.unregisterExternalBuffer(O[0])),this.sessionExternalDataMapping.delete($))}getBuffer($){let j=this.gpuDataManager.get($);if(!j)throw Error(`no GPU data for buffer: ${$}`);return j.buffer}createDownloader($,j,O){return async()=>{let G=await sJ(this,$,j);return wv(G.buffer,O)}}writeTimestamp($){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,$)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:2*this.maxDispatchNumber}),this.queryResolveBuffer=this.device.createBuffer({size:2*this.maxDispatchNumber*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){d6("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){d6("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){d6("info","replay"),this.sessionStatus="replaying";let $=this.capturedCommandList.get(this.currentSessionId),j=this.capturedPendingKernels.get(this.currentSessionId),O=$.length;this.pendingKernels=[];for(let G=0;G=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession($){this.unregisterBuffers($),this.capturedCommandList.has($)&&this.capturedCommandList.delete($),this.capturedPendingKernels.has($)&&this.capturedPendingKernels.delete($),this.gpuDataManager.onReleaseSession($)}onRunStart($){this.currentSessionId=$,this.setQueryType()}}}),aF={};WG(aF,{init:()=>rF});var Eq,XL,rF,TL,lv,ov,e4,FL,CN,UV,sv,iv,BN,av,rv,nv,$7,P3,xG,xZ,LZ,Qq,hN,Cq,B8,h8,yL,nF,tF,eF,$y,jy,Oy,Gy,cN,zL,Zy,BW=k5(()=>{x6(),k4(),I6(),dD(),Eq=class ${constructor(j,O,G,Z){this.module=j,this.dataType=O,this.data=G,this.dims=Z}getFloat32Array(){if(this.dataType!==1)throw Error("Invalid data type");let j=d0.size(this.dims);return j===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,j)}getBigInt64Array(){if(this.dataType!==7)throw Error("Invalid data type");let j=d0.size(this.dims);return j===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,j)}getInt32Array(){if(this.dataType!==6)throw Error("Invalid data type");let j=d0.size(this.dims);return j===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,j)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw Error("Invalid data type");let j=d0.size(this.dims);return j===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,j)}reshape(j){if(d0.size(j)!==d0.size(this.dims))throw Error("Invalid new shape");return new $(this.module,this.dataType,this.data,j)}},XL=class{constructor($,j,O){this.module=$,this.backend=j,this.customDataOffset=0,this.customDataSize=0,this.adapterInfo=j.adapterInfo;let G=$.PTR_SIZE,Z=O/$.PTR_SIZE,V=G===4?"i32":"i64";this.opKernelContext=Number($.getValue(G*Z++,V));let N=Number($.getValue(G*Z++,V));this.outputCount=Number($.getValue(G*Z++,V)),this.customDataOffset=Number($.getValue(G*Z++,"*")),this.customDataSize=Number($.getValue(G*Z++,V));let J=[];for(let R=0;Rtypeof Z=="number"?this.inputs[Z]:Z)??this.inputs,G=j?.outputs??[];return this.backend.run($,O,G,(Z,V,N)=>new Eq(this.module,V,this.output(Z,N),N),(Z,V)=>{let N=l8(Z,V);if(!N)throw Error(`Unsupported data type: ${Z}`);let J=N>0?this.backend.gpuDataManager.create(N).id:0;return new Eq(this.module,Z,J,V)},this.outputCount)}output($,j){let O=this.module.stackSave();try{let G=this.module.PTR_SIZE,Z=G===4?"i32":"i64",V=this.module.stackAlloc((1+j.length)*G);this.module.setValue(V,j.length,Z);for(let N=0;N{let Z=j.jsepInit;if(!Z)throw Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if($==="webgpu"){let V=new(CW(),hZ(sF)).WebGpuBackend;await V.initialize(O,G),Z("webgpu",[V,(N)=>V.alloc(Number(N)),(N)=>V.free(N),(N,J,R,U=!1)=>{if(U)d6("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(N)}, dst=${Number(J)}, size=${Number(R)}`),V.memcpy(Number(N),Number(J));else{d6("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(N)}, gpuDataId=${Number(J)}, size=${Number(R)}`);let H=j.HEAPU8.subarray(Number(N>>>0),Number(N>>>0)+Number(R));V.upload(Number(J),H)}},async(N,J,R)=>{d6("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${N}, dataOffset=${J}, size=${R}`),await V.download(Number(N),()=>j.HEAPU8.subarray(Number(J)>>>0,Number(J+R)>>>0))},(N,J,R)=>V.createKernel(N,Number(J),R,j.UTF8ToString(j._JsepGetNodeName(Number(J)))),(N)=>V.releaseKernel(N),(N,J,R,U)=>{d6("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${R}, kernel=${N}, contextDataOffset=${J}`);let H=new XL(j,V,Number(J));return V.computeKernel(Number(N),H,U)},()=>V.captureBegin(),()=>V.captureEnd(),()=>V.replay()])}else{let V=new qX(O);Z("webnn",[V,()=>V.reserveTensorId(),(N)=>V.releaseTensorId(N),async(N,J,R,U,H)=>V.ensureTensor(N,J,R,U,H),(N,J)=>{V.uploadTensor(N,J)},async(N,J)=>V.downloadTensor(N,J)])}}}),qy=k5(()=>{AD(),gD(),x6(),j$(),hv(),gF(),TL=($,j)=>{L9()._OrtInit($,j)!==0&&V9("Can't initialize onnxruntime.")},lv=async($)=>{TL($.wasm.numThreads,VV($.logLevel))},ov=async($,j)=>{L9().asyncInit?.();{let O=(BW(),hZ(aF)).init;if(j==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw Error("WebGPU is not supported in current environment");let G=$.webgpu.adapter;if(G){if(typeof G.limits!="object"||typeof G.features!="object"||typeof G.requestDevice!="function")throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let Z=$.webgpu.powerPreference;if(Z!==void 0&&Z!=="low-power"&&Z!=="high-performance")throw Error(`Invalid powerPreference setting: "${Z}"`);let V=$.webgpu.forceFallbackAdapter;if(V!==void 0&&typeof V!="boolean")throw Error(`Invalid forceFallbackAdapter setting: "${V}"`);if(G=await navigator.gpu.requestAdapter({powerPreference:Z,forceFallbackAdapter:V}),!G)throw Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await O("webgpu",L9(),$,G)}if(j==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw Error("WebNN is not supported in current environment");await O("webnn",L9(),$)}}},e4=new Map,FL=($)=>{let j=L9(),O=j.stackSave();try{let G=j.PTR_SIZE,Z=j.stackAlloc(2*G);j._OrtGetInputOutputCount($,Z,Z+G)!==0&&V9("Can't get session input/output count.");let V=G===4?"i32":"i64";return[Number(j.getValue(Z,V)),Number(j.getValue(Z+G,V))]}finally{j.stackRestore(O)}},CN=($,j)=>{let O=L9(),G=O.stackSave(),Z=0;try{let V=O.PTR_SIZE,N=O.stackAlloc(2*V);O._OrtGetInputOutputMetadata($,j,N,N+V)!==0&&V9("Can't get session input/output metadata.");let J=Number(O.getValue(N,"*"));Z=Number(O.getValue(N+V,"*"));let R=O.HEAP32[Z/4];if(R===0)return[J,0];let U=O.HEAPU32[Z/4+1],H=[];for(let L=0;L{let j=L9(),O=j._malloc($.byteLength);if(O===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${$.byteLength}.`);return j.HEAPU8.set($,O),[O,$.byteLength]},sv=async($,j)=>{let O,G,Z=L9();Array.isArray($)?[O,G]=$:$.buffer===Z.HEAPU8.buffer?[O,G]=[$.byteOffset,$.byteLength]:[O,G]=UV($);let V=0,N=0,J=0,R=[],U=[],H=[];try{if([N,R]=await $X(j),j?.externalData&&Z.mountExternalData){let T=[];for(let W of j.externalData){let E=typeof W=="string"?W:W.path;T.push(bv(typeof W=="string"?W:W.data).then((Q)=>{Z.mountExternalData(E,Q)}))}await Promise.all(T)}for(let T of j?.executionProviders??[])if((typeof T=="string"?T:T.name)==="webnn"){if(Z.shouldTransferToMLTensor=!1,typeof T!="string"){let W=T,E=W?.context,Q=W?.gpuDevice,A=W?.deviceType,l=W?.powerPreference;Z.currentContext=E||(Q?await Z.webnnCreateMLContext(Q):await Z.webnnCreateMLContext({deviceType:A,powerPreference:l}))}else Z.currentContext=await Z.webnnCreateMLContext();break}V=await Z._OrtCreateSession(O,G,N),Z.webgpuOnCreateSession?.(V),V===0&&V9("Can't create a session."),Z.jsepOnCreateSession?.(),Z.currentContext&&(Z.webnnRegisterMLContext(V,Z.currentContext),Z.currentContext=void 0,Z.shouldTransferToMLTensor=!0);let[L,Y]=FL(V),S=!!j?.enableGraphCapture,X=[],D=[],I=[],k=[],z=[];for(let T=0;TT==="gpu-buffer"||T==="ml-tensor"||T==="ml-tensor-cpu-output")&&(J=Z._OrtCreateBinding(V),J===0&&V9("Can't create IO binding."),w={handle:J,outputPreferredLocations:z,outputPreferredLocationsEncoded:z.map((T)=>T==="ml-tensor-cpu-output"?"ml-tensor":T).map((T)=>lJ(T))}),e4.set(V,[V,U,H,w,S,!1]),[V,X,D,I,k]}catch(L){throw U.forEach((Y)=>Z._OrtFree(Y)),H.forEach((Y)=>Z._OrtFree(Y)),J!==0&&Z._OrtReleaseBinding(J)!==0&&V9("Can't release IO binding."),V!==0&&Z._OrtReleaseSession(V)!==0&&V9("Can't release session."),L}finally{Z._free(O),N!==0&&Z._OrtReleaseSessionOptions(N)!==0&&V9("Can't release session options."),R.forEach((L)=>Z._free(L)),Z.unmountExternalData?.()}},iv=($)=>{let j=L9(),O=e4.get($);if(!O)throw Error(`cannot release session. invalid session id: ${$}`);let[G,Z,V,N,J]=O;N&&(J&&j._OrtClearBoundOutputs(N.handle)!==0&&V9("Can't clear bound outputs."),j._OrtReleaseBinding(N.handle)!==0&&V9("Can't release IO binding.")),j.jsepOnReleaseSession?.($),j.webnnOnReleaseSession?.($),j.webgpuOnReleaseSession?.($),Z.forEach((R)=>j._OrtFree(R)),V.forEach((R)=>j._OrtFree(R)),j._OrtReleaseSession(G)!==0&&V9("Can't release session."),e4.delete($)},BN=async($,j,O,G,Z,V,N=!1)=>{if(!$)return void j.push(0);let J,R,U=L9(),H=U.PTR_SIZE,L=$[0],Y=$[1],S=$[3],X=S;if(L==="string"&&(S==="gpu-buffer"||S==="ml-tensor"))throw Error("String tensor is not supported on GPU.");if(N&&S!=="gpu-buffer")throw Error(`External buffer must be provided for input/output index ${V} when enableGraphCapture is true.`);if(S==="gpu-buffer"){let k=$[2].gpuBuffer;R=l8(d8(L),Y);{let z=U.jsepRegisterBuffer;if(!z)throw Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');J=z(G,V,k,R)}}else if(S==="ml-tensor"){let k=$[2].mlTensor;R=l8(d8(L),Y);let z=U.webnnRegisterMLTensor;if(!z)throw Error('Tensor location "ml-tensor" is not supported without using WebNN.');J=z(G,k,d8(L),Y)}else{let k=$[2];if(Array.isArray(k)){R=H*k.length,J=U._malloc(R),O.push(J);for(let z=0;zU.setValue(I+w*H,z,H===4?"i32":"i64"));let k=U._OrtCreateTensor(d8(L),J,R,I,Y.length,lJ(X));k===0&&V9(`Can't create tensor for input/output. session=${G}, index=${V}.`),j.push(k)}finally{U.stackRestore(D)}},av=async($,j,O,G,Z,V)=>{let N=L9(),J=N.PTR_SIZE,R=e4.get($);if(!R)throw Error(`cannot run inference. invalid session id: ${$}`);let U=R[0],H=R[1],L=R[2],Y=R[3],S=R[4],X=R[5],D=j.length,I=G.length,k=0,z=[],w=[],T=[],W=[],E=N.stackSave(),Q=N.stackAlloc(D*J),A=N.stackAlloc(D*J),l=N.stackAlloc(I*J),r=N.stackAlloc(I*J);try{[k,z]=eP(V);for(let $0=0;$0e0*N0,1);G0=y4(q0);let E0=Y?.outputPreferredLocations[G[$0]];if(G0==="string"){if(E0==="gpu-buffer"||E0==="ml-tensor")throw Error("String tensor is not supported on GPU.");let e0=[];for(let N0=0;N00){let e0=N.jsepGetBuffer;if(!e0)throw Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let N0=e0(n),P0=l8(q0,q5);if(P0===void 0||!Mv(G0))throw Error(`Unsupported data type: ${G0}`);s=!0,V0.push([G0,M0,{gpuBuffer:N0,download:N.jsepCreateDownloader(N0,P0,G0),dispose:()=>{N._OrtReleaseTensor(i)!==0&&V9("Can't release tensor.")}},"gpu-buffer"])}else if(E0==="ml-tensor"&&q5>0){let{webnnEnsureTensor:e0,webnnIsGraphInputOutputTypeSupported:N0}=N;if(!e0||!N0)throw Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(l8(q0,q5)===void 0||!Kv(G0))throw Error(`Unsupported data type: ${G0}`);if(!N0($,G0,!1))throw Error(`preferredLocation "ml-tensor" for ${G0} output is not supported by current WebNN Context.`);let P0=await e0($,n,q0,M0,!1);s=!0,V0.push([G0,M0,{mlTensor:P0,download:N.webnnCreateMLTensorDownloader(n,G0),dispose:()=>{N.webnnReleaseTensorId(n),N._OrtReleaseTensor(i)}},"ml-tensor"])}else if(E0==="ml-tensor-cpu-output"&&q5>0){let e0=N.webnnCreateMLTensorDownloader(n,G0)(),N0=V0.length;s=!0,v0.push((async()=>{let P0=[N0,await e0];return N.webnnReleaseTensorId(n),N._OrtReleaseTensor(i),P0})()),V0.push([G0,M0,[],"cpu"])}else{let e0=new(TV(G0))(q5);new Uint8Array(e0.buffer,e0.byteOffset,e0.byteLength).set(N.HEAPU8.subarray(n,n+e0.byteLength)),V0.push([G0,M0,e0,"cpu"])}}finally{N.stackRestore(S0),G0==="string"&&n&&N._free(n),s||N._OrtReleaseTensor(i)}}Y&&!S&&(N._OrtClearBoundOutputs(Y.handle)!==0&&V9("Can't clear bound outputs."),e4.set($,[U,H,L,Y,S,!1]));for(let[$0,i]of await Promise.all(v0))V0[$0][2]=i;return V0}finally{N.webnnOnRunEnd?.(U),N.stackRestore(E),w.forEach((e)=>N._OrtReleaseTensor(e)),T.forEach((e)=>N._OrtReleaseTensor(e)),W.forEach((e)=>N._free(e)),k!==0&&N._OrtReleaseRunOptions(k),z.forEach((e)=>N._free(e))}},rv=($)=>{let j=L9(),O=e4.get($);if(!O)throw Error("invalid session id");let G=O[0],Z=j._OrtEndProfiling(G);Z===0&&V9("Can't get an profile file name."),j._OrtFree(Z)},nv=($)=>{let j=[];for(let O of $){let G=O[2];!Array.isArray(G)&&"buffer"in G&&j.push(G.buffer)}return j}}),Vy=k5(()=>{w3(),qy(),j$(),Bv(),$7=()=>!!X9.wasm.proxy&&typeof document<"u",xG=!1,xZ=!1,LZ=!1,Cq=new Map,B8=($,j)=>{let O=Cq.get($);O?O.push(j):Cq.set($,[j])},h8=()=>{if(xG||!xZ||LZ||!P3)throw Error("worker not ready")},yL=($)=>{switch($.data.type){case"init-wasm":xG=!1,$.data.err?(LZ=!0,hN[1]($.data.err)):(xZ=!0,hN[0]()),Qq&&(URL.revokeObjectURL(Qq),Qq=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let j=Cq.get($.data.type);$.data.err?j.shift()[1]($.data.err):j.shift()[0]($.data.out);break}}},nF=async()=>{if(!xZ){if(xG)throw Error("multiple calls to 'initWasm()' detected.");if(LZ)throw Error("previous call to 'initWasm()' failed.");if(xG=!0,$7())return new Promise(($,j)=>{P3?.terminate(),nP().then(([O,G])=>{try{(P3=G).onerror=(V)=>j(V),P3.onmessage=yL,hN=[$,j];let Z={type:"init-wasm",in:X9};!Z.in.wasm.wasmPaths&&(O||dJ)&&(Z.in.wasm.wasmPaths={wasm:new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href}),P3.postMessage(Z),Qq=O}catch(Z){j(Z)}},j)});try{await Wv(X9.wasm),await lv(X9),xZ=!0}catch($){throw LZ=!0,$}finally{xG=!1}}},tF=async($)=>{if($7())return h8(),new Promise((j,O)=>{B8("init-ep",[j,O]);let G={type:"init-ep",in:{epName:$,env:X9}};P3.postMessage(G)});await ov(X9,$)},eF=async($)=>$7()?(h8(),new Promise((j,O)=>{B8("copy-from",[j,O]);let G={type:"copy-from",in:{buffer:$}};P3.postMessage(G,[$.buffer])})):UV($),$y=async($,j)=>{if($7()){if(j?.preferredOutputLocation)throw Error('session option "preferredOutputLocation" is not supported for proxy.');return h8(),new Promise((O,G)=>{B8("create",[O,G]);let Z={type:"create",in:{model:$,options:{...j}}},V=[];$ instanceof Uint8Array&&V.push($.buffer),P3.postMessage(Z,V)})}return sv($,j)},jy=async($)=>{if($7())return h8(),new Promise((j,O)=>{B8("release",[j,O]);let G={type:"release",in:$};P3.postMessage(G)});iv($)},Oy=async($,j,O,G,Z,V)=>{if($7()){if(O.some((N)=>N[3]!=="cpu"))throw Error("input tensor on GPU is not supported for proxy.");if(Z.some((N)=>N))throw Error("pre-allocated output tensor is not supported for proxy.");return h8(),new Promise((N,J)=>{B8("run",[N,J]);let R=O,U={type:"run",in:{sessionId:$,inputIndices:j,inputs:R,outputIndices:G,options:V}};P3.postMessage(U,nv(R))})}return av($,j,O,G,Z,V)},Gy=async($)=>{if($7())return h8(),new Promise((j,O)=>{B8("end-profiling",[j,O]);let G={type:"end-profiling",in:$};P3.postMessage(G)});rv($)}}),hW=k5(()=>{w3(),Vy(),x6(),Dv(),gF(),cN=($,j)=>{switch($.location){case"cpu":return[$.type,$.dims,$.data,"cpu"];case"gpu-buffer":return[$.type,$.dims,{gpuBuffer:$.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[$.type,$.dims,{mlTensor:$.mlTensor},"ml-tensor"];default:throw Error(`invalid data location: ${$.location} for ${j()}`)}},zL=($)=>{switch($[3]){case"cpu":return new q2($[0],$[2],$[1]);case"gpu-buffer":{let j=$[0];if(!Mv(j))throw Error(`not supported data type: ${j} for deserializing GPU tensor`);let{gpuBuffer:O,download:G,dispose:Z}=$[2];return q2.fromGpuBuffer(O,{dataType:j,dims:$[1],download:G,dispose:Z})}case"ml-tensor":{let j=$[0];if(!Kv(j))throw Error(`not supported data type: ${j} for deserializing MLTensor tensor`);let{mlTensor:O,download:G,dispose:Z}=$[2];return q2.fromMLTensor(O,{dataType:j,dims:$[1],download:G,dispose:Z})}default:throw Error(`invalid data location: ${$[3]}`)}},Zy=class{async fetchModelAndCopyToWasmMemory($){return eF(await bv($))}async loadModel($,j){let O;G4(),O=typeof $=="string"?await this.fetchModelAndCopyToWasmMemory($):$,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await $y(O,j),f3()}async dispose(){return jy(this.sessionId)}async run($,j,O){G4();let G=[],Z=[];Object.entries($).forEach((L)=>{let Y=L[0],S=L[1],X=this.inputNames.indexOf(Y);if(X===-1)throw Error(`invalid input '${Y}'`);G.push(S),Z.push(X)});let V=[],N=[];Object.entries(j).forEach((L)=>{let Y=L[0],S=L[1],X=this.outputNames.indexOf(Y);if(X===-1)throw Error(`invalid output '${Y}'`);V.push(S),N.push(X)});let J=G.map((L,Y)=>cN(L,()=>`input "${this.inputNames[Z[Y]]}"`)),R=V.map((L,Y)=>L?cN(L,()=>`output "${this.outputNames[N[Y]]}"`):null),U=await Oy(this.sessionId,Z,J,N,R,O),H={};for(let L=0;LJy,initializeFlags:()=>Zv,wasmBackend:()=>vy});var Zv,Jy,vy,cW=k5(()=>{w3(),Vy(),hW(),Zv=()=>{(typeof X9.wasm.initTimeout!="number"||X9.wasm.initTimeout<0)&&(X9.wasm.initTimeout=0);let $=X9.wasm.simd;if(typeof $!="boolean"&&$!==void 0&&$!=="fixed"&&$!=="relaxed"&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${$}". Reset it to \`false\` and ignore SIMD feature checking.`),X9.wasm.simd=!1),typeof X9.wasm.proxy!="boolean"&&(X9.wasm.proxy=!1),typeof X9.wasm.trace!="boolean"&&(X9.wasm.trace=!1),typeof X9.wasm.numThreads!="number"||!Number.isInteger(X9.wasm.numThreads)||X9.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)X9.wasm.numThreads=1;else{let j=typeof navigator>"u"?ID("node:os").cpus().length:navigator.hardwareConcurrency;X9.wasm.numThreads=Math.min(4,Math.ceil((j||1)/2))}},vy=new(Jy=class{async init($){Zv(),await nF(),await tF($)}async createInferenceSessionHandler($,j){let O=new Zy;return await O.loadModel($,j),O}})});w3(),w3(),w3();{let $=(cW(),hZ(Ny)).wasmBackend;TG("webgpu",$,5),TG("webnn",$,5),TG("cpu",$,10),TG("wasm",$,10)}Object.defineProperty(X9.versions,"web",{value:"1.22.0",enumerable:!0});var kL=function($){return atob($)},IL=($)=>`<0x${$.toString(16).toUpperCase().padStart(2,"0")}>`,mW=($)=>{let j=$.replace(/<0x|>/g,"");return parseInt(j,16)};class Ry{constructor($=(j,O)=>j>O){this._heap=[],this._comparator=$}size(){return this._heap.length}isEmpty(){return this.size()==0}peek(){return this._heap[0]}push(...$){return $.forEach((j)=>{this._heap.push(j),this._siftUp()}),this.size()}pop(){let $=this.peek(),j=this.size()-1;return j>0&&this._swap(0,j),this._heap.pop(),this._siftDown(),$}replace($){let j=this.peek();return this._heap[0]=$,this._siftDown(),j}_parent($){return($+1>>>1)-1}_left($){return 1+($<<1)}_right($){return $+1<<1}_greater($,j){return this._comparator(this._heap[$],this._heap[j])}_swap($,j){[this._heap[$],this._heap[j]]=[this._heap[j],this._heap[$]]}_siftUp(){let $=this.size()-1;for(;$>0&&this._greater($,this._parent($));)this._swap($,this._parent($)),$=this._parent($)}_siftDown(){let $=0;for(;this._left($){this.vocabByString.set(O,G)}),this.merges=this.decompressMerges(j||AW)}getMergeIdentifierString($,j){return this.vocabById[$]+" "+this.vocabById[j]}decompressMerges($){let j=kL($),O=new Uint8Array(j.length);for(let V=0;VO.charCodeAt(0));return new TextDecoder("utf-8").decode(j).split(` +`)}mapCharactersToTokenIds($,j,O){let G=[];j&&G.push(1),O&&($=" "+$);let Z=$.replaceAll(" ",this.vocabById[29871]),V=Array.from(Z);for(let N=0;N=0||(console.log("Encountered unknown character "+J+" (partial UTF-8 byte "+R[U]+" + hex + "+IL(R[U])+")"),G[G.length-1]=0)}}}return G}encode($,j=!0,O=!0,G=!1){let Z=null;if(G&&(Z=performance.now()),!this.vocabById||!this.vocabByString||!this.merges)return void console.log("Tokenizer not initialized properly!");if($.length===0)return[];let V=this.mapCharactersToTokenIds($,j,O),N=new Ry((L,Y)=>L.mergePrio{let Y=this.getMergeIdentifierString(L.tokenId,L.next.tokenId),S=this.merges.get(Y)+L.origPos/$.length;S&&(L.mergePrio=S,L.mergeToString=Y.replace(" ",""),N.push(L))},R={origPos:0,tokenId:V[0],prev:null,next:null},U=R;for(let L=1;L")){let U=mW(R);G.push(U)}else this.utf8Encoder.encode(R).forEach((U)=>G.push(U))}let Z=new Uint8Array(G),V=this.utf8Decoder.decode(Z).replaceAll(this.vocabById[29871]," ");return O&&V[0]===" "?V.slice(1):V}defaultTests($){function j(G,Z,V=!0,N=!0){let J=$.decode(G,V,N);if(J!==Z)throw Error(`Decode test failed. Expected ${Z}, actual was: ${J}`)}function O(G,Z){let V=$.encode(G,!0,!0,!0);if(J=Z,(N=V).length!==J.length||!N.every(function(R,U){return R===J[U]}))throw Error(`Test failed. LLaMA Tokenizer Encoder returned unexpected result: expected tokenize(${G}) === ${Z}, actual was: ${V}`);var N,J;if(G!==$.decode(V))throw Error(`Test failed. LLaMA Tokenizer Decoder returned unexpected result: expected decode(${V}) === ${G}, actual was: ${decode(V)}`)}return O("grabbed",[1,2646,1327,287]),O(" grabbed",[1,29871,2646,1327,287]),O(" grabbed",[1,9651,2646,1327,287]),O(` +`,[1,29871,13]),O(` +`,[1,259,13]),O("\ttabs\t\t\t\tout here",[1,29871,12,21175,12,12,12,12,449,1244]),O(`ax +#### +boo`,[1,4853,13,4136,13,833,29877]),O("镇",[1,29871,30411]),O("\uD83E\uDD99",[1,29871,243,162,169,156]),O("\uD83E\uDD99Ꙋ",[1,29871,243,162,169,156,237,156,141]),O("Ꙋ\uD83E\uDD99",[1,29871,237,156,141,243,162,169,156]),j([1,2646,1327,287],"grabbed",!0,!0),j([1,2646,1327,287]," grabbed",!1,!1),j([1,2646,1327,287]," grabbed",!0,!1),j([1,2646,1327,287]," grabbed",!1,!0),j([2646,1327,287],"grabbed",!0,!0),j([2646,1327,287]," grabbed",!1,!1),j([2646,1327,287]," grabbed",!0,!1),j([2646,1327,287],"grabbed",!1,!0),O('The llama (/ˈlɑːmə/; \uD83E\uDD99Spanish pronunciation: [ˈʎama]) (Lama glama) is a domesticated South American camelid, widely used as a meat and pack animal by Andean cultures since the Pre-Columbian era. Llamas are social animals and live with others as a herd. Their wool is soft and contains only a small amount of lanolin.[2] Llamas can learn simple tasks after a few repetitions. When using a pack, they can carry about 25 to 30% of their body weight for 8 to 13 km (5–8 miles).[3] The name llama (in the past also spelled "lama" or "glama") was adopted by European settlers from native Peruvians.[4] The ancestors of llamas are thought to have originated from the Great Plains of North America about 40 million years ago, and subsequently migrated to South America about three million years ago during the Great American Interchange. By the end of the last ice age (10,000–12,000 years ago), camelids were extinct in North America.[3] As of 2007, there were over seven million llamas and alpacas in South America and over 158,000 llamas and 100,000Ꙋ\uD83E\uDD99 alpacas, descended from progenitors imported late in the 20th century, in the United States and Canada.[5] In Aymara mythology, llamas are important beings. The Heavenly Llama is said to drink water from the ocean and urinates as it rains.[6] According to Aymara eschatology, llamas will return to the water springs and lagoons where they come from at the end of time.[6]',[1,450,11148,3304,20374,30176,29880,30426,30215,29885,30184,29914,29936,29871,243,162,169,156,15495,728,11504,11173,362,29901,518,30176,31743,3304,2314,313,29931,3304,3144,3304,29897,338,263,21849,630,4275,3082,3949,295,333,29892,17644,1304,408,263,27654,322,4870,13019,491,1126,29872,273,4185,1973,1951,278,4721,29899,1625,3774,713,3152,29889,365,5288,294,526,5264,15006,322,5735,411,4045,408,263,902,29881,29889,11275,281,1507,338,4964,322,3743,871,263,2319,5253,310,10906,22878,7226,29906,29962,365,5288,294,508,5110,2560,9595,1156,263,2846,21159,2187,29889,1932,773,263,4870,29892,896,508,8677,1048,29871,29906,29945,304,29871,29941,29900,29995,310,1009,3573,7688,363,29871,29947,304,29871,29896,29941,2383,313,29945,29994,29947,7800,467,29961,29941,29962,450,1024,11148,3304,313,262,278,4940,884,805,14356,376,29880,3304,29908,470,376,3820,3304,1159,471,16356,491,7824,3604,9306,515,7531,25493,1403,550,7226,29946,29962,450,19525,943,310,11829,294,526,2714,304,505,3978,630,515,278,7027,13494,1144,310,4644,6813,1048,29871,29946,29900,7284,2440,8020,29892,322,17602,9725,630,304,4275,6813,1048,2211,7284,2440,8020,2645,278,7027,3082,4124,3167,29889,2648,278,1095,310,278,1833,14890,5046,313,29896,29900,29892,29900,29900,29900,29994,29896,29906,29892,29900,29900,29900,2440,8020,511,3949,295,4841,892,1294,5562,297,4644,6813,7226,29941,29962,1094,310,29871,29906,29900,29900,29955,29892,727,892,975,9881,7284,11829,294,322,394,29886,562,294,297,4275,6813,322,975,29871,29896,29945,29947,29892,29900,29900,29900,11829,294,322,29871,29896,29900,29900,29892,29900,29900,29900,237,156,141,243,162,169,156,394,29886,562,294,29892,5153,2760,515,410,1885,17259,19673,5683,297,278,29871,29906,29900,386,6462,29892,297,278,3303,3900,322,7400,7226,29945,29962,512,319,962,2518,22082,3002,29892,11829,294,526,4100,367,886,29889,450,22977,368,365,29880,3304,338,1497,304,13748,4094,515,278,23474,322,5065,262,1078,408,372,1153,1144,7226,29953,29962,7579,304,319,962,2518,831,13496,3002,29892,11829,294,674,736,304,278,4094,7689,886,322,301,4425,787,988,896,2041,515,472,278,1095,310,931,7226,29953,29962]),console.log("LLaMA Tokenizer tests passed successfully."),!0}runTests($=this.defaultTests){$(this)}};typeof window<"u"&&(window.llamaTokenizer=Uy);var p1={FRAME_SIZE:512,STREAM_UPDATE_INTERVAL:16,STREAM_COMMIT_MIN_INTERVAL:64,STREAM_COMMIT_MAX_INTERVAL:128,STREAM_COMMIT_EMA_THRESHOLD:0.5,STREAM_COMMIT_EMA_PERIOD:5,VAD_COMMIT_INTERVAL:Math.ceil(195.3125),BASE_ASSET_PATH:{MOONSHINE:"https://download.moonshine.ai/",ONNX_RUNTIME:"https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/",SILERO_VAD:"https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.24/dist/"},VERBOSE_LOGGING:!1},h6=function(){function $(){}return $.info=function(j){console.info("[MoonshineJS] "+j)},$.log=function(j){p1.VERBOSE_LOGGING&&console.log("[MoonshineJS] "+j)},$.warn=function(j){console.warn("[MoonshineJS] "+j)},$.error=function(j){console.error("[MoonshineJS] "+j)},$}(),DL,gW=function(){function $(j,O){O===void 0&&(O="quantized"),this.decoderStartTokenID=1,this.eosTokenID=2,this.lastLatency=void 0,this.isModelLoading=!1,this.modelURL=p1.BASE_ASSET_PATH.MOONSHINE+j,this.precision=O,X9.wasm.wasmPaths=p1.BASE_ASSET_PATH.ONNX_RUNTIME,this.model={encoder:void 0,decoder:void 0},this.modelURL.includes("tiny")?this.shape={numLayers:6,numKVHeads:8,headDim:36}:this.modelURL.includes("base")&&(this.shape={numLayers:8,numKVHeads:8,headDim:52}),h6.log("New MoonshineModel with modelURL = ".concat(j))}return $.getSessionOption=function(){return{executionProviders:["wasm","cpu"]}},$.prototype.benchmark=function(){return l2(this,arguments,void 0,function(j){var O,G,Z,V;return j===void 0&&(j=10),S2(this,function(N){switch(N.label){case 0:O=[],G=new Float32Array(16000),Z=0,N.label=1;case 1:if(!(Z0])},Object.assign(H,V),[4,U.model.decoder.run(H)];case 1:return[4,(L=w.sent()).logits.getData()];case 2:return Y=w.sent(),T=Y,S=[].map.call(T,function(W,E){return[W,E]}).reduce(function(W,E){return E[0]>W[0]?E:W})[1],N.push(S),S==U.eosTokenID?[2,"break"]:(J=[[S]],z=Object.entries(L).filter(function(W){var E=W[0];return W[1],E.includes("present")}).map(function(W){return W[0],W[1]}),Object.keys(V).forEach(function(W,E){var Q=z[E];k>0&&!W.includes("decoder")||(V[W]=Q)}),[2])}var T})},U=this,X=0,I.label=2;case 2:return Xfetch($).then((j)=>j.arrayBuffer()),YZ}var bL,X3={},fL={};function mZ(){return bL||(bL=1,function($){Object.defineProperty($,"__esModule",{value:!0}),$.log=$.LOG_PREFIX=void 0,$.LOG_PREFIX="[VAD]";let j=["error","debug","warn"].reduce((O,G)=>(O[G]=function(Z){return(...V)=>{console[Z]($.LOG_PREFIX,...V)}}(G),O),{});$.log=j}(fL)),fL}var wL,EL,Bq={};function eq(){return wL||(wL=1,Object.defineProperty(Bq,"__esModule",{value:!0}),Bq.Message=void 0,function(j){j.AudioFrame="AUDIO_FRAME",j.SpeechStart="SPEECH_START",j.VADMisfire="VAD_MISFIRE",j.SpeechEnd="SPEECH_END",j.SpeechStop="SPEECH_STOP",j.SpeechRealStart="SPEECH_REAL_START",j.FrameProcessed="FRAME_PROCESSED"}($||(Bq.Message=$={}))),Bq;var $}function pN(){if(EL)return X3;EL=1,Object.defineProperty(X3,"__esModule",{value:!0}),X3.FrameProcessor=X3.validateOptions=X3.defaultV5FrameProcessorOptions=X3.defaultLegacyFrameProcessorOptions=void 0;let $=mZ(),j=eq(),O=[512,1024,1536];X3.defaultLegacyFrameProcessorOptions={positiveSpeechThreshold:0.5,negativeSpeechThreshold:0.35,preSpeechPadFrames:1,redemptionFrames:8,frameSamples:1536,minSpeechFrames:3,submitUserSpeechOnPause:!1},X3.defaultV5FrameProcessorOptions={positiveSpeechThreshold:0.5,negativeSpeechThreshold:0.35,preSpeechPadFrames:3,redemptionFrames:24,frameSamples:512,minSpeechFrames:9,submitUserSpeechOnPause:!1},X3.validateOptions=function(Z){O.includes(Z.frameSamples)||$.log.warn("You are using an unusual frame size"),(Z.positiveSpeechThreshold<0||Z.positiveSpeechThreshold>1)&&$.log.error("positiveSpeechThreshold should be a number between 0 and 1"),(Z.negativeSpeechThreshold<0||Z.negativeSpeechThreshold>Z.positiveSpeechThreshold)&&$.log.error("negativeSpeechThreshold should be between 0 and positiveSpeechThreshold"),Z.preSpeechPadFrames<0&&$.log.error("preSpeechPadFrames should be positive"),Z.redemptionFrames<0&&$.log.error("redemptionFrames should be positive")};let G=(Z)=>{let V=Z.reduce((J,R)=>(J.push(J.at(-1)+R.length),J),[0]),N=new Float32Array(V.at(-1));return Z.forEach((J,R)=>{let U=V[R];N.set(J,U)}),N};return X3.FrameProcessor=class{constructor(Z,V,N){this.modelProcessFunc=Z,this.modelResetFunc=V,this.options=N,this.speaking=!1,this.redemptionCounter=0,this.speechFrameCount=0,this.active=!1,this.speechRealStartFired=!1,this.reset=()=>{this.speaking=!1,this.speechRealStartFired=!1,this.audioBuffer=[],this.modelResetFunc(),this.redemptionCounter=0,this.speechFrameCount=0},this.pause=(J)=>{this.active=!1,this.options.submitUserSpeechOnPause?this.endSegment(J):this.reset()},this.resume=()=>{this.active=!0},this.endSegment=(J)=>{let R=this.audioBuffer;this.audioBuffer=[];let U=this.speaking;if(this.reset(),U)if(R.reduce((H,L)=>L.isSpeech?H+1:H,0)>=this.options.minSpeechFrames){let H=G(R.map((L)=>L.frame));J({msg:j.Message.SpeechEnd,audio:H})}else J({msg:j.Message.VADMisfire});return{}},this.process=async(J,R)=>{if(!this.active)return;let U=await this.modelProcessFunc(J),H=U.isSpeech>=this.options.positiveSpeechThreshold;if(R({probs:U,msg:j.Message.FrameProcessed,frame:J}),this.audioBuffer.push({frame:J,isSpeech:H}),H&&(this.speechFrameCount++,this.redemptionCounter=0),H&&!this.speaking&&(this.speaking=!0,R({msg:j.Message.SpeechStart})),this.speaking&&this.speechFrameCount===this.options.minSpeechFrames&&!this.speechRealStartFired&&(this.speechRealStartFired=!0,R({msg:j.Message.SpeechRealStart})),U.isSpeech=this.options.redemptionFrames){this.redemptionCounter=0,this.speechFrameCount=0,this.speaking=!1,this.speechRealStartFired=!1;let L=this.audioBuffer;if(this.audioBuffer=[],L.reduce((Y,S)=>S.isSpeech?Y+1:Y,0)>=this.options.minSpeechFrames){let Y=G(L.map((S)=>S.frame));R({msg:j.Message.SpeechEnd,audio:Y})}else R({msg:j.Message.VADMisfire})}if(!this.speaking){for(;this.audioBuffer.length>this.options.preSpeechPadFrames;)this.audioBuffer.shift();this.speechFrameCount=0}},this.audioBuffer=[],this.reset()}},X3}var j7={};function uW($){throw Error('Could not dynamically require "'+$+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var QL,CL={exports:{}};/*! + * ONNX Runtime Web v1.22.0 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */function BL(){return QL||(QL=1,$=CL,j=(()=>{var O,G,Z,V,N,J,R,U,H,L,Y,S,X,D,I,k,z,w,T,W,E,Q,A,l,r,e,V0,v0,$0,i,G0,S0=Object.defineProperty,F0=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,n=Object.prototype.hasOwnProperty,R0=uW,q0=(q,v)=>()=>(q&&(v=q(q=0)),v),p0=(q,v)=>{for(var x in v)S0(q,x,{get:v[x],enumerable:!0})},Z0=(q)=>((v,x,P,F)=>{if(x&&typeof x=="object"||typeof x=="function")for(let M of s(x))!n.call(v,M)&&M!==P&&S0(v,M,{get:()=>x[M],enumerable:!(F=F0(x,M))||F.enumerable});return v})(S0({},"__esModule",{value:!0}),q),M0=q0(()=>{O=new Map,G=[],Z=(q,v,x)=>{if(v&&typeof v.init=="function"&&typeof v.createInferenceSessionHandler=="function"){let P=O.get(q);if(P===void 0)O.set(q,{backend:v,priority:x});else{if(P.priority>x)return;if(P.priority===x&&P.backend!==v)throw Error(`cannot register backend "${q}" using priority ${x}`)}if(x>=0){let F=G.indexOf(q);F!==-1&&G.splice(F,1);for(let M=0;M{let v=O.get(q);if(!v)return"backend not found.";if(v.initialized)return v.backend;if(v.aborted)return v.error;{let x=!!v.initPromise;try{return x||(v.initPromise=v.backend.init(q)),await v.initPromise,v.initialized=!0,v.backend}catch(P){return x||(v.error=`${P}`,v.aborted=!0),v.error}finally{delete v.initPromise}}},N=async(q)=>{let v,x=q.executionProviders||[],P=x.map((h)=>typeof h=="string"?h:h.name),F=P.length===0?G:P,M=[],K=new Set;for(let h of F){let m=await V(h);typeof m=="string"?M.push({name:h,err:m}):(v||(v=m),v===m&&K.add(h))}if(!v)throw Error(`no available backend found. ERR: ${M.map((h)=>`[${h.name}] ${h.err}`).join(", ")}`);for(let{name:h,err:m}of M)P.includes(h)&&console.warn(`removing requested execution provider "${h}" from session options because it is not available: ${m}`);let C=x.filter((h)=>K.has(typeof h=="string"?h:h.name));return[v,new Proxy(q,{get:(h,m)=>m==="executionProviders"?C:Reflect.get(h,m)})]}}),q5=q0(()=>{M0()}),E0=q0(()=>{J="1.22.0"}),e0=q0(()=>{E0(),R="warning",U={wasm:{},webgl:{},webgpu:{},versions:{common:J},set logLevel(q){if(q!==void 0){if(typeof q!="string"||["verbose","info","warning","error","fatal"].indexOf(q)===-1)throw Error(`Unsupported logging level: ${q}`);R=q}},get logLevel(){return R}},Object.defineProperty(U,"logLevel",{enumerable:!0})}),N0=q0(()=>{e0(),H=U}),P0=q0(()=>{L=(q,v)=>{let x=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);x.width=q.dims[3],x.height=q.dims[2];let P=x.getContext("2d");if(P!=null){let F,M;v?.tensorLayout!==void 0&&v.tensorLayout==="NHWC"?(F=q.dims[2],M=q.dims[3]):(F=q.dims[3],M=q.dims[2]);let K,C,h=v?.format!==void 0?v.format:"RGB",m=v?.norm;m===void 0||m.mean===void 0?K=[255,255,255,255]:typeof m.mean=="number"?K=[m.mean,m.mean,m.mean,m.mean]:(K=[m.mean[0],m.mean[1],m.mean[2],0],m.mean[3]!==void 0&&(K[3]=m.mean[3])),m===void 0||m.bias===void 0?C=[0,0,0,0]:typeof m.bias=="number"?C=[m.bias,m.bias,m.bias,m.bias]:(C=[m.bias[0],m.bias[1],m.bias[2],0],m.bias[3]!==void 0&&(C[3]=m.bias[3]));let u=M*F,d=0,o=u,a=2*u,j0=-1;h==="RGBA"?(d=0,o=u,a=2*u,j0=3*u):h==="RGB"?(d=0,o=u,a=2*u):h==="RBG"&&(d=0,a=u,o=2*u);for(let U0=0;U0{let x,P=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d");if(P==null)throw Error("Can not access image data");{let F,M,K;v?.tensorLayout!==void 0&&v.tensorLayout==="NHWC"?(F=q.dims[2],M=q.dims[1],K=q.dims[3]):(F=q.dims[3],M=q.dims[2],K=q.dims[1]);let C,h,m=v!==void 0&&v.format!==void 0?v.format:"RGB",u=v?.norm;u===void 0||u.mean===void 0?C=[255,255,255,255]:typeof u.mean=="number"?C=[u.mean,u.mean,u.mean,u.mean]:(C=[u.mean[0],u.mean[1],u.mean[2],255],u.mean[3]!==void 0&&(C[3]=u.mean[3])),u===void 0||u.bias===void 0?h=[0,0,0,0]:typeof u.bias=="number"?h=[u.bias,u.bias,u.bias,u.bias]:(h=[u.bias[0],u.bias[1],u.bias[2],0],u.bias[3]!==void 0&&(h[3]=u.bias[3]));let d=M*F;if(v!==void 0&&(v.format!==void 0&&K===4&&v.format!=="RGBA"||K===3&&v.format!=="RGB"&&v.format!=="BGR"))throw Error("Tensor format doesn't match input tensor dims");let o=4,a=0,j0=1,U0=2,_0=3,H0=0,Y0=d,k0=2*d,D0=-1;m==="RGBA"?(H0=0,Y0=d,k0=2*d,D0=3*d):m==="RGB"?(H0=0,Y0=d,k0=2*d):m==="RBG"&&(H0=0,k0=d,Y0=2*d),x=P.createImageData(F,M);for(let b0=0;b0{g0(),S=(q,v)=>{if(q===void 0)throw Error("Image buffer must be defined");if(v.height===void 0||v.width===void 0)throw Error("Image height and width must be defined");if(v.tensorLayout==="NHWC")throw Error("NHWC Tensor layout is not supported yet");let x,P,{height:F,width:M}=v,K=v.norm??{mean:255,bias:0};x=typeof K.mean=="number"?[K.mean,K.mean,K.mean,K.mean]:[K.mean[0],K.mean[1],K.mean[2],K.mean[3]??255],P=typeof K.bias=="number"?[K.bias,K.bias,K.bias,K.bias]:[K.bias[0],K.bias[1],K.bias[2],K.bias[3]??0];let C=v.format!==void 0?v.format:"RGBA",h=v.tensorFormat!==void 0&&v.tensorFormat!==void 0?v.tensorFormat:"RGB",m=F*M,u=h==="RGBA"?new Float32Array(4*m):new Float32Array(3*m),d=4,o=0,a=1,j0=2,U0=3,_0=0,H0=m,Y0=2*m,k0=-1;C==="RGB"&&(d=3,o=0,a=1,j0=2,U0=-1),h==="RGBA"?k0=3*m:h==="RBG"?(_0=0,Y0=m,H0=2*m):h==="BGR"&&(Y0=0,H0=m,_0=2*m);for(let D0=0;D0{let x,P=typeof HTMLImageElement<"u"&&q instanceof HTMLImageElement,F=typeof ImageData<"u"&&q instanceof ImageData,M=typeof ImageBitmap<"u"&&q instanceof ImageBitmap,K=typeof q=="string",C=v??{},h=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw Error("Canvas is not supported")},m=(u)=>typeof HTMLCanvasElement<"u"&&u instanceof HTMLCanvasElement||u instanceof OffscreenCanvas?u.getContext("2d"):null;if(P){let u=h();u.width=q.width,u.height=q.height;let d=m(u);if(d==null)throw Error("Can not access image data");{let{height:o,width:a}=q;if(v!==void 0&&v.resizedHeight!==void 0&&v.resizedWidth!==void 0&&(o=v.resizedHeight,a=v.resizedWidth),v!==void 0){if(C=v,v.tensorFormat!==void 0)throw Error("Image input config format must be RGBA for HTMLImageElement");C.tensorFormat="RGBA",C.height=o,C.width=a}else C.tensorFormat="RGBA",C.height=o,C.width=a;d.drawImage(q,0,0),x=d.getImageData(0,0,a,o).data}}else{if(!F){if(M){if(v===void 0)throw Error("Please provide image config with format for Imagebitmap");let u=h();u.width=q.width,u.height=q.height;let d=m(u);if(d!=null){let{height:o,width:a}=q;return d.drawImage(q,0,0,a,o),x=d.getImageData(0,0,a,o).data,C.height=o,C.width=a,S(x,C)}throw Error("Can not access image data")}if(K)return new Promise((u,d)=>{let o=h(),a=m(o);if(!q||!a)return d();let j0=new Image;j0.crossOrigin="Anonymous",j0.src=q,j0.onload=()=>{o.width=j0.width,o.height=j0.height,a.drawImage(j0,0,0,o.width,o.height);let U0=a.getImageData(0,0,o.width,o.height);C.height=o.height,C.width=o.width,u(S(U0.data,C))}});throw Error("Input data provided is not supported - aborted tensor creation")}{let u,d;if(v!==void 0&&v.resizedWidth!==void 0&&v.resizedHeight!==void 0?(u=v.resizedHeight,d=v.resizedWidth):(u=q.height,d=q.width),v!==void 0&&(C=v),C.format="RGBA",C.height=u,C.width=d,v!==void 0){let o=h();o.width=d,o.height=u;let a=m(o);if(a==null)throw Error("Can not access image data");a.putImageData(q,0,0),x=a.getImageData(0,0,d,u).data}else x=q.data}}if(x!==void 0)return S(x,C);throw Error("Input data provided is not supported - aborted tensor creation")},D=(q,v)=>{let{width:x,height:P,download:F,dispose:M}=v;return new l({location:"texture",type:"float32",texture:q,dims:[1,P,x,4],download:F,dispose:M})},I=(q,v)=>{let{dataType:x,dims:P,download:F,dispose:M}=v;return new l({location:"gpu-buffer",type:x??"float32",gpuBuffer:q,dims:P,download:F,dispose:M})},k=(q,v)=>{let{dataType:x,dims:P,download:F,dispose:M}=v;return new l({location:"ml-tensor",type:x??"float32",mlTensor:q,dims:P,download:F,dispose:M})},z=(q,v,x)=>new l({location:"cpu-pinned",type:q,data:v,dims:x??[v.length]})}),a0=q0(()=>{w=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),T=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),W=!1,E=()=>{if(!W){W=!0;let q=typeof BigInt64Array<"u"&&BigInt64Array.from,v=typeof BigUint64Array<"u"&&BigUint64Array.from,x=globalThis.Float16Array,P=typeof x<"u"&&x.from;q&&(w.set("int64",BigInt64Array),T.set(BigInt64Array,"int64")),v&&(w.set("uint64",BigUint64Array),T.set(BigUint64Array,"uint64")),P?(w.set("float16",x),T.set(x,"float16")):w.set("float16",Uint16Array)}}}),r0=q0(()=>{g0(),Q=(q)=>{let v=1;for(let x=0;x{switch(q.location){case"cpu":return new l(q.type,q.data,v);case"cpu-pinned":return new l({location:"cpu-pinned",data:q.data,type:q.type,dims:v});case"texture":return new l({location:"texture",texture:q.texture,type:q.type,dims:v});case"gpu-buffer":return new l({location:"gpu-buffer",gpuBuffer:q.gpuBuffer,type:q.type,dims:v});case"ml-tensor":return new l({location:"ml-tensor",mlTensor:q.mlTensor,type:q.type,dims:v});default:throw Error(`tensorReshape: tensor location ${q.location} is not supported`)}}}),g0=q0(()=>{P0(),Q0(),a0(),r0(),l=class{constructor(q,v,x){let P,F;if(E(),typeof q=="object"&&"location"in q)switch(this.dataLocation=q.location,P=q.type,F=q.dims,q.location){case"cpu-pinned":{let K=w.get(P);if(!K)throw TypeError(`unsupported type "${P}" to create tensor from pinned buffer`);if(!(q.data instanceof K))throw TypeError(`buffer should be of type ${K.name}`);this.cpuData=q.data;break}case"texture":if(P!=="float32")throw TypeError(`unsupported type "${P}" to create tensor from texture`);this.gpuTextureData=q.texture,this.downloader=q.download,this.disposer=q.dispose;break;case"gpu-buffer":if(P!=="float32"&&P!=="float16"&&P!=="int32"&&P!=="int64"&&P!=="uint32"&&P!=="uint8"&&P!=="bool"&&P!=="uint4"&&P!=="int4")throw TypeError(`unsupported type "${P}" to create tensor from gpu buffer`);this.gpuBufferData=q.gpuBuffer,this.downloader=q.download,this.disposer=q.dispose;break;case"ml-tensor":if(P!=="float32"&&P!=="float16"&&P!=="int32"&&P!=="int64"&&P!=="uint32"&&P!=="uint64"&&P!=="int8"&&P!=="uint8"&&P!=="bool"&&P!=="uint4"&&P!=="int4")throw TypeError(`unsupported type "${P}" to create tensor from MLTensor`);this.mlTensorData=q.mlTensor,this.downloader=q.download,this.disposer=q.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let K,C;if(typeof q=="string")if(P=q,C=x,q==="string"){if(!Array.isArray(v))throw TypeError("A string tensor's data must be a string array.");K=v}else{let h=w.get(q);if(h===void 0)throw TypeError(`Unsupported tensor type: ${q}.`);if(Array.isArray(v)){if(q==="float16"&&h===Uint16Array||q==="uint4"||q==="int4")throw TypeError(`Creating a ${q} tensor from number array is not supported. Please use ${h.name} as data.`);K=q==="uint64"||q==="int64"?h.from(v,BigInt):h.from(v)}else if(v instanceof h)K=v;else if(v instanceof Uint8ClampedArray){if(q!=="uint8")throw TypeError("A Uint8ClampedArray tensor's data must be type of uint8");K=Uint8Array.from(v)}else{if(!(q==="float16"&&v instanceof Uint16Array&&h!==Uint16Array))throw TypeError(`A ${P} tensor's data must be type of ${h}`);K=new globalThis.Float16Array(v.buffer,v.byteOffset,v.length)}}else if(C=v,Array.isArray(q)){if(q.length===0)throw TypeError("Tensor type cannot be inferred from an empty array.");let h=typeof q[0];if(h==="string")P="string",K=q;else{if(h!=="boolean")throw TypeError(`Invalid element type of data array: ${h}.`);P="bool",K=Uint8Array.from(q)}}else if(q instanceof Uint8ClampedArray)P="uint8",K=Uint8Array.from(q);else{let h=T.get(q.constructor);if(h===void 0)throw TypeError(`Unsupported type for tensor data: ${q.constructor}.`);P=h,K=q}if(C===void 0)C=[K.length];else if(!Array.isArray(C))throw TypeError("A tensor's dims must be a number array");F=C,this.cpuData=K,this.dataLocation="cpu"}let M=Q(F);if(this.cpuData&&M!==this.cpuData.length&&(P!=="uint4"&&P!=="int4"||Math.ceil(M/2)!==this.cpuData.length))throw Error(`Tensor's size(${M}) does not match data length(${this.cpuData.length}).`);this.type=P,this.dims=F,this.size=M}static async fromImage(q,v){return X(q,v)}static fromTexture(q,v){return D(q,v)}static fromGpuBuffer(q,v){return I(q,v)}static fromMLTensor(q,v){return k(q,v)}static fromPinnedBuffer(q,v,x){return z(q,v,x)}toDataURL(q){return L(this,q)}toImageData(q){return Y(this,q)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData(q){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":if(!this.downloader)throw Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let v=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=v,q&&this.disposer&&(this.disposer(),this.disposer=void 0),v}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw Error("The tensor is disposed.")}reshape(q){if(this.ensureValid(),this.downloader||this.disposer)throw Error("Cannot reshape a tensor that owns GPU resource.");return A(this,q)}}}),J5=q0(()=>{g0(),r=l}),t0=q0(()=>{e0(),e=(q,v)=>{(typeof U.trace>"u"?!U.wasm.trace:!U.trace)||console.timeStamp(`${q}::ORT::${v}`)},V0=(q,v)=>{let x=Error().stack?.split(/\r\n|\r|\n/g)||[],P=!1;for(let F=0;F{(typeof U.trace>"u"?!U.wasm.trace:!U.trace)||V0("BEGIN",q)},$0=(q)=>{(typeof U.trace>"u"?!U.wasm.trace:!U.trace)||V0("END",q)}}),y5=q0(()=>{M0(),J5(),t0(),i=class q{constructor(v){this.handler=v}async run(v,x,P){v0();let F={},M={};if(typeof v!="object"||v===null||v instanceof r||Array.isArray(v))throw TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let K=!0;if(typeof x=="object"){if(x===null)throw TypeError("Unexpected argument[1]: cannot be null.");if(x instanceof r)throw TypeError("'fetches' cannot be a Tensor");if(Array.isArray(x)){if(x.length===0)throw TypeError("'fetches' cannot be an empty array.");K=!1;for(let m of x){if(typeof m!="string")throw TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(m)===-1)throw RangeError(`'fetches' contains invalid output name: ${m}.`);F[m]=null}if(typeof P=="object"&&P!==null)M=P;else if(typeof P<"u")throw TypeError("'options' must be an object.")}else{let m=!1,u=Object.getOwnPropertyNames(x);for(let d of this.outputNames)if(u.indexOf(d)!==-1){let o=x[d];(o===null||o instanceof r)&&(m=!0,K=!1,F[d]=o)}if(m){if(typeof P=="object"&&P!==null)M=P;else if(typeof P<"u")throw TypeError("'options' must be an object.")}else M=x}}else if(typeof x<"u")throw TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let m of this.inputNames)if(typeof v[m]>"u")throw Error(`input '${m}' is missing in 'feeds'.`);if(K)for(let m of this.outputNames)F[m]=null;let C=await this.handler.run(v,F,M),h={};for(let m in C)if(Object.hasOwnProperty.call(C,m)){let u=C[m];h[m]=u instanceof r?u:new r(u.type,u.data,u.dims)}return $0(),h}async release(){return this.handler.dispose()}static async create(v,x,P,F){v0();let M,K={};if(typeof v=="string"){if(M=v,typeof x=="object"&&x!==null)K=x;else if(typeof x<"u")throw TypeError("'options' must be an object.")}else if(v instanceof Uint8Array){if(M=v,typeof x=="object"&&x!==null)K=x;else if(typeof x<"u")throw TypeError("'options' must be an object.")}else{if(!(v instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&v instanceof SharedArrayBuffer))throw TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");{let u=v,d=0,o=v.byteLength;if(typeof x=="object"&&x!==null)K=x;else if(typeof x=="number"){if(d=x,!Number.isSafeInteger(d))throw RangeError("'byteOffset' must be an integer.");if(d<0||d>=u.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${u.byteLength}).`);if(o=v.byteLength-d,typeof P=="number"){if(o=P,!Number.isSafeInteger(o))throw RangeError("'byteLength' must be an integer.");if(o<=0||d+o>u.byteLength)throw RangeError(`'byteLength' is out of range (0, ${u.byteLength-d}].`);if(typeof F=="object"&&F!==null)K=F;else if(typeof F<"u")throw TypeError("'options' must be an object.")}else if(typeof P<"u")throw TypeError("'byteLength' must be a number.")}else if(typeof x<"u")throw TypeError("'options' must be an object.");M=new Uint8Array(u,d,o)}}let[C,h]=await N(K),m=await C.createInferenceSessionHandler(M,h);return $0(),new q(m)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),R5=q0(()=>{y5(),G0=i}),U5=q0(()=>{}),T0=q0(()=>{}),s0=q0(()=>{}),D5=q0(()=>{}),L5={};p0(L5,{InferenceSession:()=>G0,TRACE:()=>e,TRACE_FUNC_BEGIN:()=>v0,TRACE_FUNC_END:()=>$0,Tensor:()=>r,env:()=>H,registerBackend:()=>Z});var d5=q0(()=>{q5(),N0(),R5(),J5(),U5(),T0(),t0(),s0(),D5()}),T5=q0(()=>{}),$5={};p0($5,{default:()=>t});var V5,U6,t,y0,O0,I0,w0,H5,N5,g5,Q5,S5,K6,Y5,w6,Z6,c6,Y9,y9,V6,a9,I9,z6,_5,E5,v5,o6,b9,H1,x1,o9,L1,_1,z9,D9,p9,J9,Y1,t6,f9,r9,G9,S1,A1,x9,q1,n9,v9,L6,m6,p6,B0,P1,g1,u1,d1,V1,W1,M1,R1,l1,N1,p,x0,X0,W0,h0,c0,F5,W5,b5,P5,S6,_6,O9,g6,k9,w9,Z9,s9,J1,P6,Q6,C6,N6,s6,C5,k6,E9,R9,B6,B5,U9,u0,h5,V2,s2,X1,i2,a2,T2,o1,B3,r2,n2,A9,h3,s1,c3,m3,p3,A3,g3,i1,u3,d3,t2,F2,g9,y2,l3,e2,N2,K1,b1,$3,z2,Z4,o3,h9,J2,f1,j3,t9,s3,i3,a3,r3,n3,k2,a1,U1,T1,F1,e9,O3,r1,I2,D2,v2,W2,M2,K2,G3,Z3,w1,n1,o5,i5,b2,t1,e1,Q9,c9,v1,$2,f2,w2,j2,R2,E2,U2,O2,E1,Q1,b6,Q2,H2,C2,B2,b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9,y1,D4,q$,U7,V$,N$,H7,J$,v$,x7,R$,U$,L7,H$,_7,Y7,S7,P7,X7,x$,L$,T7,_$,Y$,F7,S$,P$,y7,X$,C1,z7,T$,F$,y$,z$,k7,k$,I$,I7,D$,W$,D7,M$,K$,W7,b$,q3,h2,V3,M7,u9,f$,w$,t3,K7,E$,Q$,b7,W4,C$,f7,B$,M4,w7,h$,c$,E7,q4,Q7,C7,m$,p$,A$,B7,g$,u$,V4,d$,K4,b4,h7,l$,c7,m7,o$,p7,s$,i$,N4,a$,r$,f4,A7,n$,g7,t$,e$,J4,u7,$j,jj,Oj,w4,E4,d7,Gj,l7,Zj,o7,s7,qj,Vj,Nj,Q4,Jj,vj,i7,Rj,Uj,a7,Hj,xj,C4,Lj,_j,Yj,r7,Sj,Pj,n7,Xj,Tj,Fj,yj,B4,zj,kj,Ij,G2,x2,N3,J3,Dj,Wj,t7,Mj,Kj,e7,bj,fj,wj,$1,$8,Ej,j8,O8,v4,Qj,G8,Cj,Bj,Z8,q8,hj,cj,mj,R4,pj,Aj,gj,V8,uj,dj,h4,lj,oj,N8,sj,ij,c2,aj,rj,nj,tj,J8,ej,$O,jO,OO,c4,GO,ZO,qO,U4,VO,NO,H4,v8,x4,R8,U8,JO,KG,H8,x8,vO,e3,L8,RO,UO,_8,HO,xO,LO,m4,bG,_O,YO,SO,PO,XO,Y8,TO,S8,p4,FO,yO,P8,zO,kO,A4,X8,IO,DO,WO,T8,g4,fG,MO,KO,u4,bO,fO,F8,wO,EO,y8,wG,EG,z8,d4,QO,L4,CO,_4,BO,hO,cO,l4,mO,pO,AO,o4,k8,gO,uO,dO,lO,oO,sO,iO,aO,rO,nO=q0(()=>{F6(),v3(),I8(),V5="ort-wasm-proxy-worker",(U6=globalThis.self?.name===V5)&&(self.onmessage=(q)=>{let{type:v,in:x}=q.data;try{switch(v){case"init-wasm":I9(x.wasm).then(()=>{OG(x).then(()=>{postMessage({type:v})},(P)=>{postMessage({type:v,err:P})})},(P)=>{postMessage({type:v,err:P})});break;case"init-ep":{let{epName:P,env:F}=x;GG(F,P).then(()=>{postMessage({type:v})},(M)=>{postMessage({type:v,err:M})});break}case"copy-from":{let{buffer:P}=x,F=E8(P);postMessage({type:v,out:F});break}case"create":{let{model:P,options:F}=x;qG(P,F).then((M)=>{postMessage({type:v,out:M})},(M)=>{postMessage({type:v,err:M})});break}case"release":VG(x),postMessage({type:v});break;case"run":{let{sessionId:P,inputIndices:F,inputs:M,outputIndices:K,options:C}=x;JG(P,F,M,K,Array(K.length).fill(null),C).then((h)=>{h.some((m)=>m[3]!=="cpu")?postMessage({type:v,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:v,out:h},RG([...M,...h]))},(h)=>{postMessage({type:v,err:h})});break}case"end-profiling":vG(x),postMessage({type:v})}}catch(P){postMessage({type:v,err:P})}}),t=U6?null:(q)=>new Worker(q??O0,{type:"classic",name:V5})}),I8=q0(()=>{T5(),y0=typeof location>"u"?void 0:location.origin,O0=typeof document<"u"?document.currentScript?.src:typeof self<"u"?self.location?.href:void 0,I0=()=>{if(O0&&!O0.startsWith("blob:"))return O0.substring(0,O0.lastIndexOf("/")+1)},w0=(q,v)=>{try{let x=v??O0;return(x?new URL(q,x):new URL(q)).origin===y0}catch{return!1}},H5=(q,v)=>{let x=v??O0;try{return(x?new URL(q,x):new URL(q)).href}catch{return}},N5=(q,v)=>`${v??"./"}${q}`,g5=async(q)=>{let v=await(await fetch(q,{credentials:"same-origin"})).blob();return URL.createObjectURL(v)},Q5=async(q)=>(await import(q)).default,S5=(nO(),Z0($5)).default,K6=async()=>{if(!O0)throw Error("Failed to load proxy worker: cannot determine the script source URL.");if(w0(O0))return[void 0,S5()];let q=await g5(O0);return[q,S5(q)]},Y5=async(q,v,x)=>{{let P="ort-wasm-simd-threaded.jsep.mjs",F=q??H5(P,v),M=x&&F&&!w0(F,v),K=M?await g5(F):F??N5(P,v);return[M?K:void 0,await Q5(K)]}}}),v3=q0(()=>{I8(),Z6=!1,c6=!1,Y9=!1,y9=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},V6=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},a9=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},I9=async(q)=>{if(Z6)return Promise.resolve();if(c6)throw Error("multiple calls to 'initializeWebAssembly()' detected.");if(Y9)throw Error("previous call to 'initializeWebAssembly()' failed.");c6=!0;let{initTimeout:v,numThreads:x}=q;if(q.simd!==!1){if(q.simd==="relaxed"){if(!a9())throw Error("Relaxed WebAssembly SIMD is not supported in the current environment.")}else if(!V6())throw Error("WebAssembly SIMD is not supported in the current environment.")}let P=y9();x>1&&!P&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+x+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),q.numThreads=x=1);let F=q.wasmPaths,M=typeof F=="string"?F:void 0,K=F?.mjs,C=K?.href??K,h=F?.wasm,m=h?.href??h,u=q.wasmBinary,[d,o]=await Y5(C,M,x>1),a=!1,j0=[];if(v>0&&j0.push(new Promise((U0)=>{setTimeout(()=>{a=!0,U0()},v)})),j0.push(new Promise((U0,_0)=>{let H0={numThreads:x};if(u)H0.wasmBinary=u;else if(m||M)H0.locateFile=(Y0)=>m??M+Y0;else if(C&&C.indexOf("blob:")!==0)H0.locateFile=(Y0)=>new URL(Y0,C).href;else if(d){let Y0=I0();Y0&&(H0.locateFile=(k0)=>Y0+k0)}o(H0).then((Y0)=>{c6=!1,Z6=!0,w6=Y0,U0(),d&&URL.revokeObjectURL(d)},(Y0)=>{c6=!1,Y9=!0,_0(Y0)})})),await Promise.race(j0),a)throw Error(`WebAssembly backend initializing failed due to timeout: ${v}ms`)},z6=()=>{if(Z6&&w6)return w6;throw Error("WebAssembly is not initialized yet.")}}),s4=q0(()=>{v3(),_5=(q,v)=>{let x=z6(),P=x.lengthBytesUTF8(q)+1,F=x._malloc(P);return x.stringToUTF8(q,F,P),v.push(F),F},E5=(q,v,x,P)=>{if(typeof q=="object"&&q!==null){if(x.has(q))throw Error("Circular reference in options");x.add(q)}Object.entries(q).forEach(([F,M])=>{let K=v?v+F:F;if(typeof M=="object")E5(M,K+".",x,P);else if(typeof M=="string"||typeof M=="number")P(K,M.toString());else{if(typeof M!="boolean")throw Error("Can't handle extra config type: "+typeof M);P(K,M?"1":"0")}})},v5=(q)=>{let v=z6(),x=v.stackSave();try{let P=v.PTR_SIZE,F=v.stackAlloc(2*P);v._OrtGetLastError(F,F+P);let M=Number(v.getValue(F,P===4?"i32":"i64")),K=v.getValue(F+P,"*"),C=K?v.UTF8ToString(K):"";throw Error(`${q} ERROR_CODE: ${M}, ERROR_MESSAGE: ${C}`)}finally{v.stackRestore(x)}}}),QG=q0(()=>{v3(),s4(),o6=(q)=>{let v=z6(),x=0,P=[],F=q||{};try{if(q?.logSeverityLevel===void 0)F.logSeverityLevel=2;else if(typeof q.logSeverityLevel!="number"||!Number.isInteger(q.logSeverityLevel)||q.logSeverityLevel<0||q.logSeverityLevel>4)throw Error(`log serverity level is not valid: ${q.logSeverityLevel}`);if(q?.logVerbosityLevel===void 0)F.logVerbosityLevel=0;else if(typeof q.logVerbosityLevel!="number"||!Number.isInteger(q.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${q.logVerbosityLevel}`);q?.terminate===void 0&&(F.terminate=!1);let M=0;return q?.tag!==void 0&&(M=_5(q.tag,P)),x=v._OrtCreateRunOptions(F.logSeverityLevel,F.logVerbosityLevel,!!F.terminate,M),x===0&&v5("Can't create run options."),q?.extra!==void 0&&E5(q.extra,"",new WeakSet,(K,C)=>{let h=_5(K,P),m=_5(C,P);v._OrtAddRunConfigEntry(x,h,m)!==0&&v5(`Can't set a run config entry: ${K} - ${C}.`)}),[x,P]}catch(M){throw x!==0&&v._OrtReleaseRunOptions(x),P.forEach((K)=>v._free(K)),M}}}),CG=q0(()=>{v3(),s4(),b9=(q)=>{switch(q){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw Error(`unsupported graph optimization level: ${q}`)}},H1=(q)=>{switch(q){case"sequential":return 0;case"parallel":return 1;default:throw Error(`unsupported execution mode: ${q}`)}},x1=(q)=>{q.extra||(q.extra={}),q.extra.session||(q.extra.session={});let v=q.extra.session;v.use_ort_model_bytes_directly||(v.use_ort_model_bytes_directly="1"),q.executionProviders&&q.executionProviders.some((x)=>(typeof x=="string"?x:x.name)==="webgpu")&&(q.enableMemPattern=!1)},o9=(q,v,x,P)=>{let F=_5(v,P),M=_5(x,P);z6()._OrtAddSessionConfigEntry(q,F,M)!==0&&v5(`Can't set a session config entry: ${v} - ${x}.`)},L1=async(q,v,x)=>{for(let P of v){let F=typeof P=="string"?P:P.name,M=[];switch(F){case"webnn":if(F="WEBNN",typeof P!="string"){let u=P?.deviceType;u&&o9(q,"deviceType",u,x)}break;case"webgpu":if(F="JS",typeof P!="string"){let u=P;if(u?.preferredLayout){if(u.preferredLayout!=="NCHW"&&u.preferredLayout!=="NHWC")throw Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${u.preferredLayout}`);o9(q,"preferredLayout",u.preferredLayout,x)}}break;case"wasm":case"cpu":continue;default:throw Error(`not supported execution provider: ${F}`)}let K=_5(F,x),C=M.length,h=0,m=0;if(C>0){h=z6()._malloc(C*z6().PTR_SIZE),x.push(h),m=z6()._malloc(C*z6().PTR_SIZE),x.push(m);for(let u=0;u{let v=z6(),x=0,P=[],F=q||{};x1(F);try{let M=b9(F.graphOptimizationLevel??"all"),K=H1(F.executionMode??"sequential"),C=typeof F.logId=="string"?_5(F.logId,P):0,h=F.logSeverityLevel??2;if(!Number.isInteger(h)||h<0||h>4)throw Error(`log serverity level is not valid: ${h}`);let m=F.logVerbosityLevel??0;if(!Number.isInteger(m)||m<0||m>4)throw Error(`log verbosity level is not valid: ${m}`);let u=typeof F.optimizedModelFilePath=="string"?_5(F.optimizedModelFilePath,P):0;if(x=v._OrtCreateSessionOptions(M,!!F.enableCpuMemArena,!!F.enableMemPattern,K,!!F.enableProfiling,0,C,h,m,u),x===0&&v5("Can't create session options."),F.executionProviders&&await L1(x,F.executionProviders,P),F.enableGraphCapture!==void 0){if(typeof F.enableGraphCapture!="boolean")throw Error(`enableGraphCapture must be a boolean value: ${F.enableGraphCapture}`);o9(x,"enableGraphCapture",F.enableGraphCapture.toString(),P)}if(F.freeDimensionOverrides)for(let[d,o]of Object.entries(F.freeDimensionOverrides)){if(typeof d!="string")throw Error(`free dimension override name must be a string: ${d}`);if(typeof o!="number"||!Number.isInteger(o)||o<0)throw Error(`free dimension override value must be a non-negative integer: ${o}`);let a=_5(d,P);v._OrtAddFreeDimensionOverride(x,a,o)!==0&&v5(`Can't set a free dimension override: ${d} - ${o}.`)}return F.extra!==void 0&&E5(F.extra,"",new WeakSet,(d,o)=>{o9(x,d,o,P)}),[x,P]}catch(M){throw x!==0&&v._OrtReleaseSessionOptions(x)!==0&&v5("Can't release session options."),P.forEach((K)=>v._free(K)),M}}}),q6=q0(()=>{z9=(q)=>{switch(q){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw Error(`unsupported data type: ${q}`)}},D9=(q)=>{switch(q){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw Error(`unsupported data type: ${q}`)}},p9=(q,v)=>{let x=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,0.5,0.5][q],P=typeof v=="number"?v:v.reduce((F,M)=>F*M,1);return x>0?Math.ceil(P*x):void 0},J9=(q)=>{switch(q){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":case"bool":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw Error(`unsupported type: ${q}`)}},Y1=(q)=>{switch(q){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw Error(`unsupported logging level: ${q}`)}},t6=(q)=>q==="float32"||q==="float16"||q==="int32"||q==="int64"||q==="uint32"||q==="uint8"||q==="bool"||q==="uint4"||q==="int4",f9=(q)=>q==="float32"||q==="float16"||q==="int32"||q==="int64"||q==="uint32"||q==="uint64"||q==="int8"||q==="uint8"||q==="bool"||q==="uint4"||q==="int4",r9=(q)=>{switch(q){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw Error(`unsupported data location: ${q}`)}}}),tO=q0(()=>{T5(),G9=async(q)=>{if(typeof q=="string"){let v=await fetch(q);if(!v.ok)throw Error(`failed to load external data file: ${q}`);let x=v.headers.get("Content-Length"),P=x?parseInt(x,10):0;if(P<1073741824)return new Uint8Array(await v.arrayBuffer());{if(!v.body)throw Error(`failed to load external data file: ${q}, no response body.`);let F,M=v.body.getReader();try{F=new ArrayBuffer(P)}catch(C){if(!(C instanceof RangeError))throw C;{let h=Math.ceil(P/65536);F=new WebAssembly.Memory({initial:h,maximum:h}).buffer}}let K=0;for(;;){let{done:C,value:h}=await M.read();if(C)break;let m=h.byteLength;new Uint8Array(F,K,m).set(h),K+=m}return new Uint8Array(F,0,P)}}return q instanceof Blob?new Uint8Array(await q.arrayBuffer()):q instanceof Uint8Array?q:new Uint8Array(q)}}),B1=q0(()=>{q6(),S1=["V","I","W","E","F"],A1=(q,v)=>{console.log(`[${S1[q]},${new Date().toISOString()}]${v}`)},n9=(q,v)=>{x9=q,q1=v},v9=(q,v)=>{let x=Y1(q);x>=Y1(x9)&&A1(x,typeof v=="function"?v():v)},L6=(...q)=>{q1&&v9(...q)}}),X6=q0(()=>{m6=class{static calcMatMulShape(q,v){return q[1]!==v[0]?void 0:[q[0],v[1]]}},p6=class{static calcShape(q,v,x=!1){let P=q.length,F=v.length;if(P===0)return v;if(F===0)return q;let M=Math.max(q.length,v.length),K=Array(M);if(x){if(P<2||F<2)return;let C=m6.calcMatMulShape([q[P-2],q[P-1]],[v[F-2],v[F-1]]);if(C===void 0)return;[K[M-2],K[M-1]]=C}for(let C=x?3:1;C<=M;C++){let h=P-C<0?1:q[P-C],m=F-C<0?1:v[F-C];if(h!==m&&h>1&&m>1)return;let u=Math.max(h,m);if(h&&m)K[M-C]=Math.max(h,m);else{if(u>1)return;K[M-C]=0}}return K}static isValidBroadcast(q,v){let x=q.length,P=v.length;if(x>P)return!1;for(let F=1;F<=x;F++)if(q[x-F]!==1&&q[x-F]!==v[P-F])return!1;return!0}},B0=class q{static size(v){return q.getSizeFromDimensionRange(v,0,v.length)}static convertShape(v,x=4){let P=v.length;if(P===0)return[];let F=Array(P),M=P-1;for(;M>=0;){if(v[M]%x===0){F[M]=v[M]/x;break}if(x%v[M]!==0)throw Error("cannot convert shape");F[M]=1,x/=v[M],M--}for(M--;M>=0;M--)F[M]=v[M];return F}static sizeFromDimension(v,x){if(x<0||x>v.length)throw Error(`invalid dimension of ${x} for sizeFromDimension as Tensor has ${v.length} dimensions.`);return q.getSizeFromDimensionRange(v,x,v.length)}static sizeToDimension(v,x){if(x<0||x>v.length)throw Error(`invalid dimension of ${x} for sizeToDimension as Tensor has ${v.length} dimensions.`);return q.getSizeFromDimensionRange(v,0,x)}static getSizeFromDimensionRange(v,x,P){let F=1;for(let M=x;M=0;--F)P[F]=P[F+1]*v[F+1];return P}static normalizeAxis(v,x){if(v<-x&&v>=x)throw Error("unsupported axis for this operation.");return v<0?v+x:v}static normalizeAxes(v,x){return v.map((P)=>this.normalizeAxis(P,x??v.length))}static sortBasedOnPerm(v,x){return x?x.map((P)=>v[P]):v.slice().reverse()}static padShape(v,x){let P=v.length;return v.map((F,M)=>F+x[M]+x[M+P])}static areEqual(v,x){return v.length===x.length&&v.every((P,F)=>P===x[F])}},P1=class q{static adjustPoolAttributes(v,x,P,F,M,K){if(!v&&P.length!==x.length-2)throw Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(v)for(let C=0;C=P.length?P.push(x[C+2]):P[C]=x[C+2];for(let C=0;C=P[C]||K[C+P.length]>=P[C])throw Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(v,x,P,F,M,K,C){if(C){if(M.length!==2*(v.length-2))throw Error("length of pads should be twice the length of data dimensions");if(x.length!==v.length-2)throw Error("length of strides should be the length of data dimensions");if(F.length!==v.length-2)throw Error("length of kernel shapes should be the length of data dimensions");for(let h=0;h{q6(),V1=(q,v)=>new(J9(v))(q)}),BG=q0(()=>{q6(),B1(),W1=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),M1=(q,v)=>{if(v==="int32")return q;let x=W1.get(v);if(!x)throw Error(`WebNN backend does not support data type: ${v}`);let P=x/8;if(q.byteLength%P!==0)throw Error(`Invalid Uint8Array length - must be a multiple of ${P}.`);let F=q.byteLength/P,M=new(J9(v))(q.buffer,q.byteOffset,F);switch(v){case"int64":case"uint64":{let K=new Int32Array(F);for(let C=0;C2147483647n||h<-2147483648n)throw Error("Can not convert int64 data to int32 - value out of range.");K[C]=Number(h)}return new Uint8Array(K.buffer)}case"int8":case"uint8":case"uint32":{if(v==="uint32"&&M.some((C)=>C>2147483647))throw Error("Can not convert uint32 data to int32 - value out of range.");let K=Int32Array.from(M,Number);return new Uint8Array(K.buffer)}default:throw Error(`Unsupported data conversion from ${v} to 'int32'`)}},R1=(q,v)=>{if(v==="int32")return q;if(q.byteLength%4!=0)throw Error("Invalid Uint8Array length - must be a multiple of 4 (int32).");let x=q.byteLength/4,P=new Int32Array(q.buffer,q.byteOffset,x);switch(v){case"int64":{let F=BigInt64Array.from(P,BigInt);return new Uint8Array(F.buffer)}case"uint64":{if(P.some((M)=>M<0))throw Error("Can not convert int32 data to uin64 - negative value found.");let F=BigUint64Array.from(P,BigInt);return new Uint8Array(F.buffer)}case"int8":{if(P.some((M)=>M<-128||M>127))throw Error("Can not convert int32 data to int8 - value out of range.");let F=Int8Array.from(P,Number);return new Uint8Array(F.buffer)}case"uint8":if(P.some((F)=>F<0||F>255))throw Error("Can not convert int32 data to uint8 - value out of range.");return Uint8Array.from(P,Number);case"uint32":{if(P.some((M)=>M<0))throw Error("Can not convert int32 data to uint32 - negative value found.");let F=Uint32Array.from(P,Number);return new Uint8Array(F.buffer)}default:throw Error(`Unsupported data conversion from 'int32' to ${v}`)}},l1=1,N1=()=>l1++,p=new Map([["int8","int32"],["uint8","int32"],["uint32","int32"],["int64","int32"]]),x0=(q,v)=>{let x=W1.get(q);if(!x)throw Error(`WebNN backend does not support data type: ${q}`);return v.length>0?Math.ceil(v.reduce((P,F)=>P*F)*x/8):0},X0=class{constructor(q){this.isDataConverted=!1;let{sessionId:v,context:x,tensor:P,dataType:F,shape:M,fallbackDataType:K}=q;this.sessionId=v,this.mlContext=x,this.mlTensor=P,this.dataType=F,this.tensorShape=M,this.fallbackDataType=K}get tensor(){return this.mlTensor}get type(){return this.dataType}get fallbackType(){return this.fallbackDataType}get shape(){return this.tensorShape}get byteLength(){return x0(this.dataType,this.tensorShape)}destroy(){L6("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write(q){this.mlContext.writeTensor(this.mlTensor,q)}async read(q){if(this.fallbackDataType){let v=await this.mlContext.readTensor(this.mlTensor),x=R1(new Uint8Array(v),this.dataType);return q?void(q instanceof ArrayBuffer?new Uint8Array(q):new Uint8Array(q.buffer,q.byteOffset,q.byteLength)).set(x):x.buffer}return q?this.mlContext.readTensor(this.mlTensor,q):this.mlContext.readTensor(this.mlTensor)}canReuseTensor(q,v,x){return this.mlContext===q&&this.dataType===v&&this.tensorShape.length===x.length&&this.tensorShape.every((P,F)=>P===x[F])}setIsDataConverted(q){this.isDataConverted=q}},W0=class{constructor(q,v){this.tensorManager=q,this.wrapper=v}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor(q,v,x,P){let F,M=this.tensorManager.getMLContext(q);if(!M.opSupportLimits().input.dataTypes.includes(v)){if(F=p.get(v),!F||!M.opSupportLimits().input.dataTypes.includes(F))throw Error(`WebNN backend does not support data type: ${v}`);L6("verbose",()=>`[WebNN] TensorIdTracker.ensureTensor: fallback dataType from ${v} to ${F}`)}if(this.wrapper){if(this.wrapper.canReuseTensor(M,v,x))return this.wrapper.tensor;if(P){if(this.wrapper.byteLength!==x0(v,x))throw Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let K=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor(q,v,x,K,!0,!0,F),P&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload(q){let v=q;if(this.wrapper){if(this.wrapper.fallbackType){if(this.wrapper.fallbackType!=="int32")throw Error(`Unsupported fallback data type: ${this.wrapper.fallbackType}`);v=M1(q,this.wrapper.type),this.wrapper.setIsDataConverted(!0)}if(q.byteLength===this.wrapper.byteLength)return void this.wrapper.write(v);L6("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor()}this.activeUpload?this.activeUpload.set(v):this.activeUpload=new Uint8Array(v)}async download(q){if(this.activeUpload){let v=this.wrapper?.isDataConverted?R1(this.activeUpload,this.wrapper?.type):this.activeUpload;return q?void(q instanceof ArrayBuffer?new Uint8Array(q).set(v):new Uint8Array(q.buffer,q.byteOffset,q.byteLength).set(v)):v.buffer}if(!this.wrapper)throw Error("Tensor has not been created.");return q?this.wrapper.read(q):this.wrapper.read()}},h0=class{constructor(q){this.backend=q,this.tensorTrackersById=new Map,this.freeTensors=[],this.externalTensors=new Set}getMLContext(q){let v=this.backend.getMLContext(q);if(!v)throw Error("MLContext not found for session.");return v}reserveTensorId(){let q=N1();return this.tensorTrackersById.set(q,new W0(this)),q}releaseTensorId(q){let v=this.tensorTrackersById.get(q);v&&(this.tensorTrackersById.delete(q),v.tensorWrapper&&this.releaseTensor(v.tensorWrapper))}async ensureTensor(q,v,x,P,F){L6("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${v}, dataType: ${x}, shape: ${P}, copyOld: ${F}}`);let M=this.tensorTrackersById.get(v);if(!M)throw Error("Tensor not found.");return M.ensureTensor(q,x,P,F)}upload(q,v){let x=this.tensorTrackersById.get(q);if(!x)throw Error("Tensor not found.");x.upload(v)}async download(q,v){L6("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${q}, dstBuffer: ${v?.byteLength}}`);let x=this.tensorTrackersById.get(q);if(!x)throw Error("Tensor not found.");return x.download(v)}releaseTensorsForSession(q){for(let v of this.freeTensors)v.sessionId===q&&v.destroy();this.freeTensors=this.freeTensors.filter((v)=>v.sessionId!==q)}registerTensor(q,v,x,P){let F=this.getMLContext(q),M=N1(),K=new X0({sessionId:q,context:F,tensor:v,dataType:x,shape:P});return this.tensorTrackersById.set(M,new W0(this,K)),this.externalTensors.add(K),M}async getCachedTensor(q,v,x,P,F,M,K){let C=this.getMLContext(q);for(let[m,u]of this.freeTensors.entries())if(u.canReuseTensor(C,v,x)){L6("verbose",()=>`[WebNN] Reusing tensor {dataType: ${v}, ${K?`fallbackDataType: ${K},`:""} shape: ${x}`);let d=this.freeTensors.splice(m,1)[0];return d.sessionId=q,d}L6("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${v}, ${K?`fallbackDataType: ${K},`:""} shape: ${x}}`);let h=await C.createTensor({dataType:K??v,shape:x,dimensions:x,usage:P,writable:F,readable:M});return new X0({sessionId:q,context:C,tensor:h,dataType:v,shape:x,fallbackDataType:K})}releaseTensor(q){this.externalTensors.has(q)&&this.externalTensors.delete(q),this.freeTensors.push(q)}},c0=(...q)=>new h0(...q)}),hG=q0(()=>{q6(),v3(),eO(),BG(),B1(),F5=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),W5=(q,v)=>{if(q===v)return!0;if(q===void 0||v===void 0)return!1;let x=Object.keys(q).sort(),P=Object.keys(v).sort();return x.length===P.length&&x.every((F,M)=>F===P[M]&&q[F]===v[F])},b5=class{constructor(q){this.tensorManager=c0(this),this.mlContextBySessionId=new Map,this.sessionIdsByMLContext=new Map,this.mlContextCache=[],this.sessionGraphInputs=new Map,this.sessionGraphOutputs=new Map,this.temporaryGraphInputs=[],this.temporaryGraphOutputs=[],this.temporarySessionTensorIds=new Map,n9(q.logLevel,!!q.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error("No active session");return this.activeSessionId}onRunStart(q){L6("verbose",()=>`[WebNN] onRunStart {sessionId: ${q}}`),this.activeSessionId=q}onRunEnd(q){L6("verbose",()=>`[WebNN] onRunEnd {sessionId: ${q}}`);let v=this.temporarySessionTensorIds.get(q);if(v){for(let x of v)L6("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${x}}`),this.tensorManager.releaseTensorId(x);this.temporarySessionTensorIds.delete(q),this.activeSessionId=void 0}}async createMLContext(q){if(q instanceof GPUDevice){let x=this.mlContextCache.findIndex((P)=>P.gpuDevice===q);if(x!==-1)return this.mlContextCache[x].mlContext;{let P=await navigator.ml.createContext(q);return this.mlContextCache.push({gpuDevice:q,mlContext:P}),P}}if(q===void 0){let x=this.mlContextCache.findIndex((P)=>P.options===void 0&&P.gpuDevice===void 0);if(x!==-1)return this.mlContextCache[x].mlContext;{let P=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:P}),P}}let v=this.mlContextCache.findIndex((x)=>W5(x.options,q));if(v!==-1)return this.mlContextCache[v].mlContext;{let x=await navigator.ml.createContext(q);return this.mlContextCache.push({options:q,mlContext:x}),x}}registerMLContext(q,v){this.mlContextBySessionId.set(q,v);let x=this.sessionIdsByMLContext.get(v);x||(x=new Set,this.sessionIdsByMLContext.set(v,x)),x.add(q),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set(q,this.temporaryGraphInputs),this.temporaryGraphInputs=[]),this.temporaryGraphOutputs.length>0&&(this.sessionGraphOutputs.set(q,this.temporaryGraphOutputs),this.temporaryGraphOutputs=[])}onReleaseSession(q){this.sessionGraphInputs.delete(q),this.sessionGraphOutputs.delete(q);let v=this.mlContextBySessionId.get(q);if(!v)return;this.tensorManager.releaseTensorsForSession(q),this.mlContextBySessionId.delete(q);let x=this.sessionIdsByMLContext.get(v);if(x.delete(q),x.size===0){this.sessionIdsByMLContext.delete(v);let P=this.mlContextCache.findIndex((F)=>F.mlContext===v);P!==-1&&this.mlContextCache.splice(P,1)}}getMLContext(q){return this.mlContextBySessionId.get(q)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId(q){L6("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${q}}`),this.tensorManager.releaseTensorId(q)}async ensureTensor(q,v,x,P,F){let M=F5.get(x);if(!M)throw Error(`Unsupported ONNX data type: ${x}`);return this.tensorManager.ensureTensor(q??this.currentSessionId,v,M,P,F)}async createTemporaryTensor(q,v,x){L6("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${v}, shape: ${x}}`);let P=F5.get(v);if(!P)throw Error(`Unsupported ONNX data type: ${v}`);let F=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor(q,F,P,x,!1);let M=this.temporarySessionTensorIds.get(q);return M?M.push(F):this.temporarySessionTensorIds.set(q,[F]),F}uploadTensor(q,v){if(!z6().shouldTransferToMLTensor)throw Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");L6("verbose",()=>`[WebNN] uploadTensor {tensorId: ${q}, data: ${v.byteLength}}`),this.tensorManager.upload(q,v)}async downloadTensor(q,v){return this.tensorManager.download(q,v)}createMLTensorDownloader(q,v){return async()=>{let x=await this.tensorManager.download(q);return V1(x,v)}}registerMLTensor(q,v,x,P){let F=F5.get(x);if(!F)throw Error(`Unsupported ONNX data type: ${x}`);let M=this.tensorManager.registerTensor(q,v,F,P);return L6("verbose",()=>`[WebNN] registerMLTensor {tensor: ${v}, dataType: ${F}, dimensions: ${P}} -> {tensorId: ${M}}`),M}registerMLConstant(q,v,x,P,F,M,K=!1){if(!M)throw Error("External mounted files are not available.");let C=q;q.startsWith("./")&&(C=q.substring(2));let h=M.get(C);if(!h)throw Error(`File with name ${C} not found in preloaded files.`);if(v+x>h.byteLength)throw Error("Out of bounds: data offset and length exceed the external file data size.");let m,u=h.slice(v,v+x).buffer;switch(F.dataType){case"float32":m=new Float32Array(u);break;case"float16":m=typeof Float16Array<"u"&&Float16Array.from?new Float16Array(u):new Uint16Array(u);break;case"int32":m=new Int32Array(u);break;case"uint32":m=new Uint32Array(u);break;case"int64":if(K){let d=M1(new Uint8Array(u),"int64");m=new Int32Array(d.buffer),F.dataType="int32"}else m=new BigInt64Array(u);break;case"uint64":m=new BigUint64Array(u);break;case"int8":m=new Int8Array(u);break;case"int4":case"uint4":case"uint8":m=new Uint8Array(u);break;default:throw Error(`Unsupported data type: ${F.dataType} in creating WebNN Constant from external data.`)}return L6("verbose",()=>`[WebNN] registerMLConstant {dataType: ${F.dataType}, shape: ${F.shape}}} ${K?"(Note: it was int64 data type and registered to int32 as workaround)":""}`),P.constant(F,m)}registerGraphInput(q){this.temporaryGraphInputs.push(q)}registerGraphOutput(q){this.temporaryGraphOutputs.push(q)}isGraphInput(q,v){let x=this.sessionGraphInputs.get(q);return!!x&&x.includes(v)}isGraphOutput(q,v){let x=this.sessionGraphOutputs.get(q);return!!x&&x.includes(v)}isGraphInputOutputTypeSupported(q,v,x=!0){let P=this.mlContextBySessionId.get(q),F=F5.get(z9(v));return!(typeof F>"u"||(x?!P?.opSupportLimits().input.dataTypes.includes(F):!P?.opSupportLimits().output.dataTypes.includes(F)))}flush(){}}}),D8=q0(()=>{}),W8=q0(()=>{B1(),D8(),P5=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),S6=[],_6=(q)=>16*Math.ceil(Number(q)/16),O9=(q)=>{for(let v=0;vg6++,w9=async(q,v,x,P)=>{let F=_6(x),M=q.device.createBuffer({size:F,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let K=q.getCommandEncoder();q.endComputePass(),K.copyBufferToBuffer(v,0,M,0,F),q.flush(),await M.mapAsync(GPUMapMode.READ);let C=M.getMappedRange();if(P){let h=P();return h.set(new Uint8Array(C,0,x)),h}return new Uint8Array(C.slice(0,x))}finally{M.destroy()}},Z9=class{constructor(q){this.backend=q,this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[v]of P5)S6.push(v),this.freeBuffers.set(v,[]),this.freeUniformBuffers.set(v,[]);this.sessionCount=0}upload(q,v){let{buffer:x,byteOffset:P,byteLength:F}=v,M=_6(F),K=this.storageCache.get(q);if(!K)throw Error("gpu data for uploading does not exist");if(Number(K.originalSize)!==F)throw Error(`inconsistent data size. gpu data size=${K.originalSize}, data size=${F}`);let C=this.backend.device.createBuffer({mappedAtCreation:!0,size:M,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),h=C.getMappedRange();new Uint8Array(h).set(new Uint8Array(x,P,F)),C.unmap();let m=this.backend.device.createCommandEncoder();m.copyBufferToBuffer(C,0,K.gpuData.buffer,0,M),this.backend.device.queue.submit([m.finish()]),C.destroy(),L6("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${q})`)}memcpy(q,v){let x=this.storageCache.get(q);if(!x)throw Error("source gpu data for memcpy does not exist");let P=this.storageCache.get(v);if(!P)throw Error("destination gpu data for memcpy does not exist");if(x.originalSize!==P.originalSize)throw Error("inconsistent source and destination gpu data size");let F=_6(x.originalSize),M=this.backend.getCommandEncoder();this.backend.endComputePass(),M.copyBufferToBuffer(x.gpuData.buffer,0,P.gpuData.buffer,0,F)}registerExternalBuffer(q,v,x){let P;if(x){if(P=x[0],q===x[1])return L6("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${v}) => id=${P}, buffer is the same, skip.`),P;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else P=k9();return this.storageCache.set(P,{gpuData:{id:P,type:0,buffer:q},originalSize:v}),L6("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${v}) => id=${P}, registered.`),P}unregisterExternalBuffer(q){q!==void 0&&(this.storageCache.delete(q),L6("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${q}`))}create(q,v=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let x,P=O9(q),F=(v&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,M=(v&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(F||M){let C=(F?this.freeBuffers:this.freeUniformBuffers).get(P);x=C&&C.length>0?C.pop():this.backend.device.createBuffer({size:P,usage:v})}else x=this.backend.device.createBuffer({size:P,usage:v});let K={id:k9(),type:0,buffer:x};return this.storageCache.set(K.id,{gpuData:K,originalSize:Number(q)}),L6("verbose",()=>`[WebGPU] GpuDataManager.create(size=${q}) => id=${K.id}`),K}get(q){return this.storageCache.get(q)?.gpuData}release(q){let v=typeof q=="bigint"?Number(q):q,x=this.storageCache.get(v);if(!x){if(this.storageCache.size===0)return 0;throw Error("releasing data does not exist")}return L6("verbose",()=>`[WebGPU] GpuDataManager.release(id=${v}), gpuDataId=${x.gpuData.id}`),this.storageCache.delete(v),this.buffersPending.push(x.gpuData.buffer),x.originalSize}async download(q,v){let x=this.storageCache.get(Number(q));if(!x)throw Error("data does not exist");await w9(this.backend,x.gpuData.buffer,x.originalSize,v)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let q of this.buffersPending){let v=P5.get(q.size);if((q.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let x=this.freeBuffers.get(q.size)||[];v===void 0||x.length>=v?q.destroy():x.push(q)}else if((q.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let x=this.freeUniformBuffers.get(q.size)||[];v===void 0||x.length>=v?q.destroy():x.push(q)}else q.destroy()}this.buffersPending=[]}else{let q=this.capturedPendingBuffers.get(this.backend.currentSessionId);q||(q=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,q));for(let v of this.buffersPending)q.push(v);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach((q)=>{q.forEach((v)=>{v.destroy()})}),this.freeUniformBuffers.forEach((q)=>{q.forEach((v)=>{v.destroy()})}),this.storageCache.forEach((q)=>{q.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach((q)=>{q.forEach((v)=>{v.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession(q){let v=this.capturedPendingBuffers.get(q);v&&(v.forEach((x)=>{x.destroy()}),this.capturedPendingBuffers.delete(q)),this.sessionCount-=1,this.sessionCount===0&&(L6("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach((x)=>{x.gpuData.buffer.destroy()}),this.storageCache=new Map)}},s9=(...q)=>new Z9(...q)}),S9=q0(()=>{J1=class{constructor(q){Object.assign(this,q)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map((q)=>`${this[q]}`).join(";")),this.key}},P6=(q)=>new J1(q)}),T6=q0(()=>{q6(),X6(),Q6=64,C6=(q,v)=>{if(v===3)throw Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number(q)){case 10:return v>1?`vec${v}`:"f16";case 1:return v>1?`vec${v}`:"f32";case 6:return v>1?`vec${v}`:"i32";case 12:return v>1?`vec${v}`:"u32";case 7:if(v>1)throw Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(v>1)throw Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(v!==4)throw Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw Error(`Unknown data type: ${q}`)}},N6=(q,v=1)=>{let x=C6(q,v);return typeof x=="string"?x:x[0]},s6=(q,v=1)=>{let x=C6(q,v);return typeof x=="string"?x:x[1]},C5=(...q)=>{let v=[];return q.forEach((x)=>{x.length!==0&&v.push({type:12,data:x},{type:12,data:B0.computeStrides(x)})}),v},k6=(q)=>q%4==0?4:q%2==0?2:1,E9=(q="f32",v,x="0")=>v&&v!==1?`vec${v}<${q}>(${x})`:`${q}(${x})`,R9=(q,v,x)=>q==="f32"?x:v===1?`f32(${x})`:`vec${v}(${x})`,B6=(q,v)=>v===4?`(${q}.x + ${q}.y + ${q}.z + ${q}.w)`:v===2?`(${q}.x + ${q}.y)`:v===3?`(${q}.x + ${q}.y + ${q}.z)`:q,B5=(q,v,x,P)=>q.startsWith("uniforms.")&&x>4?typeof v=="string"?P==="f16"?`${q}[(${v}) / 8][(${v}) % 8 / 4][(${v}) % 8 % 4]`:`${q}[(${v}) / 4][(${v}) % 4]`:P==="f16"?`${q}[${Math.floor(v/8)}][${Math.floor(v%8/4)}][${v%8%4}]`:`${q}[${Math.floor(v/4)}][${v%4}]`:x>1?`${q}[${v}]`:q,U9=(q,v,x,P,F)=>{let M=typeof x=="number",K=M?x:x.length,C=[...Array(K).keys()],h=K<2?"u32":K<=4?`vec${K}`:`array`,m=C6(v,F),u=typeof m=="string"?m:m[1],d=typeof m=="string"?m:m[0],o={indices:h,value:u,storage:d,tensor:v},a=(i0)=>typeof i0=="string"?i0:`${i0}u`,j0={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},U0=M?"uniforms.":"",_0=`${U0}${q}_shape`,H0=`${U0}${q}_strides`,Y0="";for(let i0=0;i0 ${o.indices} { + var indices: ${o.indices}; + var current = offset; + ${Y0} + return indices; + }`,D0=[];if(K>=2)for(let i0=K-1;i0>=0;i0--)D0.push(`${B5(H0,i0,K)} * (indices[${i0}])`);let b0=K<2?"":` + fn i2o_${q}(indices: ${o.indices}) -> u32 { + return ${D0.join("+")}; + }`,m0=(...i0)=>K===0?"0u":`${o.indices}(${i0.map(a).join(",")})`,x5=(i0,z5)=>K<2?`${i0}`:`${B5(i0,z5,K)}`,f5={},c5=(i0,z5)=>(()=>{if(o.storage===o.value)return`${q}[${i0}]=${z5};`;if(o.storage==="vec2"&&o.value==="i32")return`${q}[${i0}]=vec2(u32(${z5}), select(0u, 0xFFFFFFFFu, ${z5} < 0));`;if(o.storage==="vec2"&&o.value==="u32")return`${q}[${i0}]=vec2(u32(${z5}), 0u);`;if(o.storage==="u32"&&o.value==="vec4")return`${q}[${i0}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${z5}));`;throw Error(`not supported combination of storage type ${o.storage} and value type ${o.value} yet`)})(),l5=(i0)=>(()=>{if(o.storage===o.value)return`${q}[${i0}]`;if(o.storage==="vec2"&&o.value==="i32")return`i32(${q}[${i0}].x)`;if(o.storage==="vec2"&&o.value==="u32")return`u32(${q}[${i0}].x)`;if(o.storage==="u32"&&o.value==="vec4")return`vec4(bool(${q}[${i0}] & 0xFFu), bool(${q}[${i0}] & 0xFF00u), bool(${q}[${i0}] & 0xFF0000u), bool(${q}[${i0}] & 0xFF000000u))`;throw Error(`not supported combination of storage type ${o.storage} and value type ${o.value} yet`)})(),G6=K<2?"":` + fn get_${q}ByIndices(indices: ${o.indices}) -> ${u} { + return ${l5(`i2o_${q}(indices)`)}; + }`,y6=K<2?"":(()=>{let i0=C.map((s5)=>`d${s5}: u32`).join(", "),z5=C.map((s5)=>`d${s5}`).join(", ");return` + fn get_${q}(${i0}) -> ${u} { + return get_${q}ByIndices(${m0(z5)}); + }`})(),A6=K<2?"":` + fn set_${q}ByIndices(indices: ${o.indices}, value: ${u}) { + ${c5(`i2o_${q}(indices)`,"value")} + }`,w5=K<2?"":(()=>{let i0=C.map((s5)=>`d${s5}: u32`).join(", "),z5=C.map((s5)=>`d${s5}`).join(", ");return` + fn set_${q}(${i0}, value: ${u}) { + set_${q}ByIndices(${m0(z5)}, value); + }`})();return{impl:()=>{let i0=[],z5=!1;return j0.offsetToIndices&&(i0.push(k0),z5=!0),j0.indicesToOffset&&(i0.push(b0),z5=!0),j0.broadcastedIndicesToOffset&&(Object.values(f5).forEach((s5)=>i0.push(s5)),z5=!0),j0.set&&(i0.push(w5),z5=!0),j0.setByIndices&&(i0.push(A6),z5=!0),j0.get&&(i0.push(y6),z5=!0),j0.getByIndices&&(i0.push(G6),z5=!0),!M&&z5&&i0.unshift(`const ${_0} = ${o.indices}(${x.join(",")});`,`const ${H0} = ${o.indices}(${B0.computeStrides(x).join(",")});`),i0.join(` +`)},type:o,offsetToIndices:(i0)=>(j0.offsetToIndices=!0,K<2?i0:`o2i_${q}(${i0})`),indicesToOffset:(i0)=>(j0.indicesToOffset=!0,K<2?i0:`i2o_${q}(${i0})`),broadcastedIndicesToOffset:(i0,z5)=>{j0.broadcastedIndicesToOffset=!0;let s5=`${z5.name}broadcastedIndicesTo${q}Offset`;if(s5 in f5)return`${s5}(${i0})`;let r5=[];for(let P9=K-1;P9>=0;P9--){let f6=z5.indicesGet("outputIndices",P9+z5.rank-K);r5.push(`${x5(H0,P9)} * (${f6} % ${x5(_0,P9)})`)}return f5[s5]=`fn ${s5}(outputIndices: ${z5.type.indices}) -> u32 { + return ${r5.length>0?r5.join("+"):"0u"}; + }`,`${s5}(${i0})`},indices:m0,indicesGet:x5,indicesSet:(i0,z5,s5)=>K<2?`${i0}=${s5};`:`${B5(i0,z5,K)}=${s5};`,set:(...i0)=>{if(i0.length!==K+1)throw Error(`indices length must be ${K}`);let z5=i0[K];if(typeof z5!="string")throw Error("value must be string");let s5=i0.slice(0,K).map(a).join(",");return K===0?c5("0u",z5):K===1?c5(s5[0],z5):(j0.set=!0,j0.setByIndices=!0,j0.indicesToOffset=!0,`set_${q}(${s5}, ${z5})`)},setByOffset:c5,setByIndices:(i0,z5)=>K<2?c5(i0,z5):(j0.setByIndices=!0,j0.indicesToOffset=!0,`set_${q}ByIndices(${i0}, ${z5});`),get:(...i0)=>{if(i0.length!==K)throw Error(`indices length must be ${K}`);let z5=i0.map(a).join(",");return K===0?l5("0u"):K===1?l5(z5[0]):(j0.get=!0,j0.getByIndices=!0,j0.indicesToOffset=!0,`get_${q}(${z5})`)},getByOffset:l5,getByIndices:(i0)=>K<2?l5(i0):(j0.getByIndices=!0,j0.indicesToOffset=!0,`get_${q}ByIndices(${i0})`),usage:P,name:q,strides:H0,shape:_0,rank:K}},u0=(q,v,x,P=1)=>U9(q,v,x,"input",P),h5=(q,v,x,P=1)=>U9(q,v,x,"output",P),V2=(q,v,x)=>U9(q,v,x,"atomicOutput",1),s2=(q,v,x,P=1)=>U9(q,v,x,"internal",P),X1=class{constructor(q,v){this.normalizedDispatchGroup=q,this.limits=v,this.internalVariables=[],this.variables=[],this.uniforms=[],this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes(q){return`if (global_idx >= ${typeof q=="number"?`${q}u`:q}) { return; }`}mainStart(q=Q6){let v=typeof q=="number"?q:q[0],x=typeof q=="number"?1:q[1],P=typeof q=="number"?1:q[2];if(v>this.limits.maxComputeWorkgroupSizeX||x>this.limits.maxComputeWorkgroupSizeY||P>this.limits.maxComputeWorkgroupSizeZ)throw Error(`workgroup size [${v}, ${x}, ${P}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(v*x*P>this.limits.maxComputeInvocationsPerWorkgroup)throw Error(`workgroup size [${v}, ${x}, ${P}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let F=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1;return`@compute @workgroup_size(${v}, ${x}, ${P}) + fn main(${F?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`}) { + ${F?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${v*x*P}u + local_idx;`} + `}appendVariableUniforms(q){q.rank!==0&&(q.shape.startsWith("uniforms.")&&this.uniforms.push({name:q.shape.replace("uniforms.",""),type:"u32",length:q.rank}),q.strides.startsWith("uniforms.")&&this.uniforms.push({name:q.strides.replace("uniforms.",""),type:"u32",length:q.rank}))}declareVariable(q,v){if(q.usage==="internal")throw Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push(q),this.appendVariableUniforms(q);let x=q.usage==="input"?"read":"read_write",P=q.usage==="atomicOutput"?"atomic":q.type.storage;return`@group(0) @binding(${v}) var ${q.name}: array<${P}>;`}declareVariables(...q){return q.map((v)=>this.declareVariable(v,this.variableIndex++)).join(` +`)}registerInternalVariable(q){if(q.usage!=="internal")throw Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push(q),this.appendVariableUniforms(q)}registerInternalVariables(...q){return q.forEach((v)=>this.registerInternalVariable(v)),this}registerUniform(q,v,x=1){return this.uniforms.push({name:q,type:v,length:x}),this}registerUniforms(q){return this.uniforms=this.uniforms.concat(q),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let q=[];for(let{name:v,type:x,length:P}of this.uniforms)if(P&&P>4)x==="f16"?q.push(`@align(16) ${v}:array, ${Math.ceil(P/8)}>`):q.push(`${v}:array, ${Math.ceil(P/4)}>`);else{let F=P==null||P===1?x:`vec${P}<${x}>`;q.push(`${v}:${F}`)}return` + struct Uniforms { ${q.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map((q)=>q.impl()).join(` +`)+this.internalVariables.map((q)=>q.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let q=(v)=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(v)];return this.uniforms.map((v)=>[q(v.type),v.length??1])}},i2=(q,v)=>new X1(q,v)}),m2=q0(()=>{q6(),X6(),S9(),T6(),a2=(q,v)=>{if(!q||q.length!==1)throw Error("Transpose requires 1 input.");if(v.length!==0&&v.length!==q[0].dims.length)throw Error(`perm size ${v.length} does not match input rank ${q[0].dims.length}`)},T2=(q,v)=>v.length!==0?v:[...Array(q).keys()].reverse(),o1=(q,v)=>B0.sortBasedOnPerm(q,T2(q.length,v)),B3=(q,v,x,P)=>{let F=`fn perm(i: ${P.type.indices}) -> ${x.type.indices} { + var a: ${x.type.indices};`;for(let M=0;M{let x=[],P=[];for(let F=0;F{let x=0;for(let P=0;P{let x,P=q.dataType,F=q.dims.length,M=T2(F,v),K=o1(q.dims,M),C=q.dims,h=K;if(F<2||n2(M,q.dims))return x=(a)=>{let j0=u0("input",P,C,4),U0=h5("output",P,h,4);return` + ${a.registerUniform("output_size","u32").declareVariables(j0,U0)} + ${a.mainStart()} + ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let a=B0.size(K);return{outputs:[{dims:K,dataType:q.dataType}],dispatchGroup:{x:Math.ceil(a/64/4)},programUniforms:[{type:12,data:Math.ceil(a/4)}]}},getShaderSource:x};let{newShape:m,newPerm:u}=r2(q.dims,M),d=B0.areEqual(u,[2,3,1]),o=B0.areEqual(u,[3,1,2]);if(m.length===2||d||o){C=d?[m[0],m[1]*m[2]]:o?[m[0]*m[1],m[2]]:m,h=[C[1],C[0]];let a=16;return x=(j0)=>{let U0=u0("a",P,C.length),_0=h5("output",P,h.length);return` + ${j0.registerUniform("output_size","u32").declareVariables(U0,_0)} + var tile : array, ${a}>; + ${j0.mainStart([a,a,1])} + let stride = (uniforms.output_shape[1] - 1) / ${a} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${a}u + local_id.x; + let input_row = workgroup_id_x * ${a}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${U0.getByIndices(`${U0.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${a}u + local_id.x; + let output_row = workgroup_id_y * ${a}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${_0.setByIndices(`${_0.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let j0=B0.size(K);return{outputs:[{dims:K,dataType:q.dataType}],dispatchGroup:{x:Math.ceil(h[1]/a),y:Math.ceil(h[0]/a)},programUniforms:[{type:12,data:j0},...C5(C,h)]}},getShaderSource:x}}return x=(a)=>{let j0=u0("a",P,C.length),U0=h5("output",P,h.length);return` + ${a.registerUniform("output_size","u32").declareVariables(j0,U0)} + + ${B3(M,F,j0,U0)} + + ${a.mainStart()} + ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${U0.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${U0.setByOffset("global_idx",j0.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${v}`,inputDependencies:["rank"]},getRunData:()=>{let a=B0.size(K);return{outputs:[{dims:K,dataType:q.dataType}],dispatchGroup:{x:Math.ceil(a/64)},programUniforms:[{type:12,data:a},...C5(C,h)]}},getShaderSource:x}},h3=(q,v)=>{a2(q.inputs,v.perm),q.compute(A9(q.inputs[0],v.perm))},s1=(q)=>P6({perm:q.perm})}),cG=q0(()=>{q6(),X6(),T6(),M8(),m2(),c3={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},m3={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},p3={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},A3={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},g3=(q,v)=>{let x=[];for(let P=v-q;P{let x=[],P=q.length;for(let F=0;Fq[F])]},u3=(q,v)=>{let x=q.length+v.length,P=[],F=0;for(let M=0;M{for(let x=0;x{let x=[];if(!d3(q,v)){for(let P=0;Px.push(P))}return x},F2=(q,v,x,P,F,M,K)=>{let C=x[0].dims,h=B0.size(M),m=B0.size(K),u=u0("_A",x[0].dataType,C),d=h5("output",F,M),o=64;h===1&&(o=256);let a=` + var aBestValues : array; + `;return{name:q,shaderCache:{hint:`${v};${o}`,inputDependencies:["type"]},getShaderSource:(j0)=>` + ${j0.registerUniform("reduceSize","u32").declareVariables(u,d)} + ${a} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${j0.mainStart(o)} + + let outputIndex = global_idx / ${o}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${p3[P]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${o}) { + let candidate = f32(${u.getByOffset("offset + k")}); + bestValue = ${c3[P]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${o}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${m3[P]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${d.setByOffset("outputIndex",P==="mean"?`${d.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${d.type.storage}(${A3[P]})`)}; + } + }`,getRunData:()=>({outputs:[{dims:M,dataType:F}],dispatchGroup:{x:h},programUniforms:[{type:12,data:m}]})}},g9=(q,v,x,P)=>{let F=q.inputs.length===1?x:j3(q.inputs,x),M=F.axes;M.length===0&&!F.noopWithEmptyAxes&&(M=q.inputs[0].dims.map((a,j0)=>j0));let K=B0.normalizeAxes(M,q.inputs[0].dims.length),C=K,h=q.inputs[0],m=t2(C,q.inputs[0].dims.length);m.length>0&&(h=q.compute(A9(q.inputs[0],m),{inputs:[0],outputs:[-1]})[0],C=g3(C.length,h.dims.length));let[u,d]=i1(h.dims,C),o=u;F.keepDims&&(o=u3(u,K)),q.compute(F2(v,F.cacheKey,[h],P,q.inputs[0].dataType,o,d),{inputs:[h]})},y2=(q,v)=>{g9(q,"ReduceMeanShared",v,"mean")},l3=(q,v)=>{g9(q,"ReduceL1Shared",v,"l1")},e2=(q,v)=>{g9(q,"ReduceL2Shared",v,"l2")},N2=(q,v)=>{g9(q,"ReduceLogSumExpShared",v,"logSumExp")},K1=(q,v)=>{g9(q,"ReduceMaxShared",v,"max")},b1=(q,v)=>{g9(q,"ReduceMinShared",v,"min")},$3=(q,v)=>{g9(q,"ReduceProdShared",v,"prod")},z2=(q,v)=>{g9(q,"ReduceSumShared",v,"sum")},Z4=(q,v)=>{g9(q,"ReduceSumSquareShared",v,"sumSquare")},o3=(q,v)=>{g9(q,"ReduceLogSumShared",v,"logSum")}}),M8=q0(()=>{q6(),X6(),S9(),T6(),cG(),h9=(q)=>{if(!q||q.length===0||q.length>2)throw Error("Reduce op requires 1 or 2 inputs.");if(q.length===2&&q[1].dims.length!==1)throw Error("Invalid axes input dims.")},J2=(q)=>["","",`var value = ${q.getByIndices("input_indices")};`,""],f1=(q,v,x,P,F,M,K=!1,C=!1)=>{let h=[],m=x[0].dims,u=m.length,d=B0.normalizeAxes(F,u),o=!C&&d.length===0;m.forEach((U0,_0)=>{o||d.indexOf(_0)>=0?K&&h.push(1):h.push(U0)});let a=h.length,j0=B0.size(h);return{name:q,shaderCache:v,getShaderSource:(U0)=>{let _0=[],H0=u0("_A",x[0].dataType,u),Y0=h5("output",M,a),k0=P(H0,Y0,d),D0=k0[2];for(let b0=0,m0=0;b0=0?(K&&m0++,D0=`for(var j${b0}: u32 = 0; j${b0} < ${m[b0]}; j${b0}++) { + ${k0[2].includes("last_index")?`let last_index = j${b0};`:""} + ${H0.indicesSet("input_indices",b0,`j${b0}`)} + ${D0} + }`):(_0.push(`${H0.indicesSet("input_indices",b0,Y0.indicesGet("output_indices",m0))};`),m0++);return` + + ${U0.registerUniform("output_size","u32").declareVariables(H0,Y0)} + + ${U0.mainStart()} + ${U0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${H0.type.indices}; + let output_indices = ${Y0.offsetToIndices("global_idx")}; + + ${_0.join(` +`)} + ${k0[0]} // init ops for reduce max/min + ${k0[1]} + ${D0} + ${k0[3]} + ${k0.length===4?Y0.setByOffset("global_idx","value"):k0.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:h,dataType:M}],dispatchGroup:{x:Math.ceil(j0/64)},programUniforms:[{type:12,data:j0},...C5(m,h)]})}},j3=(q,v)=>{let x=[];return q[1].dims[0]>0&&q[1].getBigInt64Array().forEach((P)=>x.push(Number(P))),P6({axes:x,keepDims:v.keepDims,noopWithEmptyAxes:v.noopWithEmptyAxes})},t9=(q,v,x,P)=>{let F=q.inputs,M=F.length===1?x:j3(F,x);q.compute(f1(v,{hint:M.cacheKey,inputDependencies:["rank"]},[F[0]],M.noopWithEmptyAxes&&M.axes.length===0?J2:P,M.axes,F[0].dataType,M.keepDims,M.noopWithEmptyAxes),{inputs:[0]})},s3=(q,v)=>{h9(q.inputs),t9(q,"ReduceLogSum",v,(x,P)=>[`var value = ${P.type.storage}(0);`,"",`value += ${x.getByIndices("input_indices")};`,"value = log(value);"])},i3=(q,v)=>{h9(q.inputs),t9(q,"ReduceL1",v,(x,P)=>[`var value = ${P.type.storage}(0);`,"",`value += abs(${x.getByIndices("input_indices")});`,""])},a3=(q,v)=>{h9(q.inputs),t9(q,"ReduceL2",v,(x,P)=>[`var t = ${P.type.value}(0); var value = ${P.type.value}(0);`,"",`t = ${x.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},r3=(q,v)=>{h9(q.inputs),t9(q,"ReduceLogSumExp",v,(x,P)=>[`var value = ${P.type.storage}(0);`,"",`value += exp(${x.getByIndices("input_indices")});`,"value = log(value);"])},n3=(q,v)=>{h9(q.inputs),t9(q,"ReduceMax",v,(x,P,F)=>{let M=[];for(let K=0;K=0||F.length===0)&&M.push(x.indicesSet("input_indices",K,0));return[`${M.join(` +`)}`,`var value = ${x.getByIndices("input_indices")};`,`value = max(value, ${x.getByIndices("input_indices")});`,""]})},k2=(q,v)=>{h9(q.inputs),t9(q,"ReduceMean",v,(x,P,F)=>{let M=1;for(let K=0;K=0||F.length===0)&&(M*=q.inputs[0].dims[K]);return["var sum = f32(0);","",`sum += f32(${x.getByIndices("input_indices")});`,`let value = ${P.type.value}(sum / ${M});`]})},a1=(q,v)=>{h9(q.inputs),t9(q,"ReduceMin",v,(x,P,F)=>{let M=[];for(let K=0;K=0||F.length===0)&&M.push(`input_indices[${K}] = 0;`);return[`${M.join(` +`)}`,`var value = ${x.getByIndices("input_indices")};`,`value = min(value, ${x.getByIndices("input_indices")});`,""]})},U1=(q,v)=>{h9(q.inputs),t9(q,"ReduceProd",v,(x,P)=>[`var value = ${P.type.storage}(1);`,"",`value *= ${x.getByIndices("input_indices")};`,""])},T1=(q,v)=>{h9(q.inputs),t9(q,"ReduceSum",v,(x,P)=>[`var value = ${P.type.storage}(0);`,"",`value += ${x.getByIndices("input_indices")};`,""])},F1=(q,v)=>{h9(q.inputs),t9(q,"ReduceSumSquare",v,(x,P)=>[`var t = ${P.type.value}(0); var value = ${P.type.value}(0);`,"",`t = ${x.getByIndices("input_indices")}; value += t * t;`,""])},e9=(q,v,x)=>{if(v.length===0)return x;let P=1,F=1;for(let M=0;M1024},O3=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?k2(q,v):y2(q,v)},r1=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?i3(q,v):l3(q,v)},I2=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?a3(q,v):e2(q,v)},D2=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?r3(q,v):N2(q,v)},v2=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?n3(q,v):K1(q,v)},W2=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?a1(q,v):b1(q,v)},M2=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?U1(q,v):$3(q,v)},K2=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?T1(q,v):z2(q,v)},G3=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?F1(q,v):Z4(q,v)},Z3=(q,v)=>{e9(q.inputs[0].dims,v.axes,v.noopWithEmptyAxes)?s3(q,v):o3(q,v)}}),K8=q0(()=>{q6(),S9(),M8(),w1=(q)=>{if(!q||q.length===0||q.length>2)throw Error("ArgMinMaxOp op requires 1 or 2 inputs.");if(q[0].dataType!==1)throw Error("Invalid input type.")},n1=(q,v)=>{w1(q.inputs),q.compute(f1("ArgMin",{hint:v.cacheKey,inputDependencies:["rank"]},[q.inputs[0]],(x,P,F)=>{let M=[];for(let K=0;K=0||F.length===0)&&M.push(`input_indices[${K}] = 0;`);return[`${M.join(` +`)}`,`var value = ${x.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${x.getByIndices("input_indices")} ${v.selectLastIndex>0?"<=":"<"} value) { + value = ${x.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",P.setByOffset("global_idx","best_index")]},[v.axis],7,v.keepDims),{inputs:[0]})},o5=(q,v)=>{w1(q.inputs),q.compute(f1("argMax",{hint:v.cacheKey,inputDependencies:["rank"]},[q.inputs[0]],(x,P,F)=>{let M=[];for(let K=0;K=0||F.length===0)&&M.push(`input_indices[${K}] = 0;`);return[`${M.join(` +`)}`,`var value = ${x.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${x.getByIndices("input_indices")} ${v.selectLastIndex>0?">=":">"} value) { + value = ${x.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",P.setByOffset("global_idx","best_index")]},[v.axis],7,v.keepDims),{inputs:[0]})},i5=(q)=>P6(q)}),b8=q0(()=>{q6(),X6(),D8(),T6(),b2=(q,v)=>{let x=q[0],P=q[1],F=q[2],M=q[3],K=q[4],C=q[5];if(K&&C)throw Error("Attention cannot have both past and attention_bias");if(x.dims.length!==3)throw Error('Input "input" must have 3 dimensions');let h=x.dims[0],m=x.dims[1],u=x.dims[2];if(F.dims.length!==1)throw Error('Input "bias" is expected to have 1 dimensions');if(P.dims.length!==2)throw Error('Input "weights" is expected to have 2 dimensions');if(P.dims[0]!==u)throw Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(F.dims[0]!==P.dims[1])throw Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let d=F.dims[0]/3,o=d,a=o;if(v.qkvHiddenSizes.length>0){if(v.qkvHiddenSizes.length!==3)throw Error("qkv_hidden_sizes attribute should have 3 elements");for(let H0 of v.qkvHiddenSizes)if(H0%v.numHeads!==0)throw Error("qkv_hidden_sizes should be divisible by num_heads");d=v.qkvHiddenSizes[0],o=v.qkvHiddenSizes[1],a=v.qkvHiddenSizes[2]}let j0=m;if(d!==o)throw Error("qkv_hidden_sizes first element should be same as the second");if(F.dims[0]!==d+o+a)throw Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let U0=0;if(K){if(o!==a)throw Error('Input "past" expect k_hidden_size == v_hidden_size');if(K.dims.length!==5)throw Error('Input "past" must have 5 dimensions');if(K.dims[0]!==2)throw Error('Input "past" first dimension must be 2');if(K.dims[1]!==h)throw Error('Input "past" second dimension must be batch_size');if(K.dims[2]!==v.numHeads)throw Error('Input "past" third dimension must be num_heads');if(K.dims[4]!==o/v.numHeads)throw Error('Input "past" fifth dimension must be k_hidden_size / num_heads');v.pastPresentShareBuffer||(U0=K.dims[3])}let _0=j0+U0;if(M)throw Error("Mask not supported");if(K)throw Error("past is not supported");if(C){if(C.dims.length!==4)throw Error('Input "attention_bias" must have 4 dimensions');if(C.dims[0]!==h||C.dims[1]!==v.numHeads||C.dims[2]!==m||C.dims[3]!==_0)throw Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:h,sequenceLength:m,pastSequenceLength:U0,kvSequenceLength:j0,totalSequenceLength:_0,maxSequenceLength:-1,inputHiddenSize:u,hiddenSize:d,vHiddenSize:a,headSize:Math.floor(d/v.numHeads),vHeadSize:Math.floor(a/v.numHeads),numHeads:v.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:v.maskFilterValue,maskType:0,scale:v.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},t1=(q,v,x)=>v&&q?` + let total_sequence_length_input = u32(${v.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${q?.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${x?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,e1=(q,v,x,P,F,M,K,C)=>{let h=k6(K?1:M),m=64,u=M/h;u{let H0=h5("x",q.dataType,q.dims,h),Y0=[H0],k0=K?u0("seq_lens",K.dataType,K.dims):void 0;k0&&Y0.push(k0);let D0=C?u0("total_sequence_length_input",C.dataType,C.dims):void 0;D0&&Y0.push(D0);let b0=s6(q.dataType);return` + var thread_max: array; + var thread_sum: array; + ${_0.registerUniforms([{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}]).declareVariables(...Y0)} + ${_0.mainStart([m,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${t1(k0,D0,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${m}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${K?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${j0}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${j0}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(h){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw Error(`Unsupported components: ${h}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${m}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${j0}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${j0}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(h){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw Error(`Unsupported components: ${h}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${m}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${H0.type.value}(${b0}(1.0) / ${b0}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${j0}(x[offset + i]); + x[offset + i] = ${H0.type.value}(exp(f32input - max_value) / sum); + } + } + ${K?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${H0.type.value}(${b0}(0)); + }`:""}; + }`},getRunData:()=>({outputs:[],dispatchGroup:{x:1,y:F,z:v*x},programUniforms:o})}},Q9=(q,v,x,P,F,M,K,C,h)=>{let m=K+M.kvSequenceLength,u=[M.batchSize,M.numHeads,M.sequenceLength,m],d=q>1&&P,o=M.kvNumHeads?M.kvNumHeads:M.numHeads,a=d?[M.batchSize,o,m,M.headSize]:void 0,j0=M.nReps?M.nReps:1,U0=M.scale===0?1/Math.sqrt(M.headSize):M.scale,_0=k6(M.headSize),H0=M.headSize/_0,Y0=12,k0={x:Math.ceil(m/Y0),y:Math.ceil(M.sequenceLength/Y0),z:M.batchSize*M.numHeads},D0=[{type:12,data:M.sequenceLength},{type:12,data:H0},{type:12,data:m},{type:12,data:M.numHeads},{type:12,data:M.headSize},{type:1,data:U0},{type:12,data:K},{type:12,data:M.kvSequenceLength},{type:12,data:j0}],b0=d&&P&&B0.size(P.dims)>0,m0=["type","type"];b0&&m0.push("type"),F&&m0.push("type"),C&&m0.push("type"),h&&m0.push("type");let x5=[{dims:u,dataType:v.dataType,gpuDataType:0}];return d&&x5.push({dims:a,dataType:v.dataType,gpuDataType:0}),{name:"AttentionProbs",shaderCache:{hint:`${_0};${F!==void 0};${P!==void 0};${q}`,inputDependencies:m0},getRunData:()=>({outputs:x5,dispatchGroup:k0,programUniforms:D0}),getShaderSource:(f5)=>{let c5=u0("q",v.dataType,v.dims,_0),l5=[c5,u0("key",x.dataType,x.dims,_0)];if(b0){let z5=u0("past_key",P.dataType,P.dims,_0);l5.push(z5)}F&&l5.push(u0("attention_bias",F.dataType,F.dims));let G6=C?u0("seq_lens",C.dataType,C.dims):void 0;G6&&l5.push(G6);let y6=h?u0("total_sequence_length_input",h.dataType,h.dims):void 0;y6&&l5.push(y6);let A6=h5("output",v.dataType,u),w5=[A6];d&&w5.push(h5("present_key",v.dataType,a,_0));let i0=s6(1,_0);return` + const TILE_SIZE = 12u; + + var tileQ: array<${c5.type.storage}, 144>; + var tileK: array<${c5.type.storage}, 144>; + ${f5.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}]).declareVariables(...l5,...w5)} + ${f5.mainStart([Y0,Y0,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${j0===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${j0===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${t1(G6,y6,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${b0&&d?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${d?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${i0}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${b0&&d?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${d?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${i0}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(_0){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw Error(`Unsupported components: ${_0}`)}})()}; + output[outputIdx] = ${A6.type.value} (sum * uniforms.alpha) + ${F?"attention_bias[outputIdx]":"0.0"}; + } + }`}}},c9=(q,v,x,P,F,M,K=void 0,C=void 0)=>{let h=M+F.kvSequenceLength,m=F.nReps?F.nReps:1,u=F.vHiddenSize*m,d=q>1&&P,o=F.kvNumHeads?F.kvNumHeads:F.numHeads,a=d?[F.batchSize,o,h,F.headSize]:void 0,j0=[F.batchSize,F.sequenceLength,u],U0=12,_0={x:Math.ceil(F.vHeadSize/U0),y:Math.ceil(F.sequenceLength/U0),z:F.batchSize*F.numHeads},H0=[{type:12,data:F.sequenceLength},{type:12,data:h},{type:12,data:F.vHeadSize},{type:12,data:F.numHeads},{type:12,data:F.headSize},{type:12,data:u},{type:12,data:M},{type:12,data:F.kvSequenceLength},{type:12,data:m}],Y0=d&&P&&B0.size(P.dims)>0,k0=["type","type"];Y0&&k0.push("type"),K&&k0.push("type"),C&&k0.push("type");let D0=[{dims:j0,dataType:v.dataType,gpuDataType:0}];return d&&D0.push({dims:a,dataType:v.dataType,gpuDataType:0}),{name:"AttentionScore",shaderCache:{hint:`${P!==void 0};${q}`,inputDependencies:k0},getRunData:()=>({outputs:D0,dispatchGroup:_0,programUniforms:H0}),getShaderSource:(b0)=>{let m0=u0("probs",v.dataType,v.dims),x5=[m0,u0("v",x.dataType,x.dims)];Y0&&x5.push(u0("past_value",P.dataType,P.dims));let f5=K?u0("seq_lens",K.dataType,K.dims):void 0;K&&x5.push(f5);let c5=C?u0("total_sequence_length_input",C.dataType,C.dims):void 0;C&&x5.push(c5);let l5=[h5("output",v.dataType,j0)];return d&&l5.push(h5("present_value",v.dataType,a)),` + const TILE_SIZE = 12u; + var tileQ: array<${m0.type.value}, 144>; + var tileV: array<${m0.type.value}, 144>; + ${b0.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}]).declareVariables(...x5,...l5)} + ${b0.mainStart([U0,U0,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${m===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${m===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${t1(f5,c5,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${Y0&&d?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${d?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${m0.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${Y0&&d?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${d?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`}}},v1=(q,v,x,P,F,M,K,C,h,m,u=void 0,d=void 0)=>{let o=Math.min(q.outputCount,1+(K?1:0)+(C?1:0)),a=o>1?m.pastSequenceLength:0,j0=a+m.kvSequenceLength,U0=h&&B0.size(h.dims)>0?h:void 0,_0=[v,x];o>1&&K&&B0.size(K.dims)>0&&_0.push(K),U0&&_0.push(U0),u&&_0.push(u),d&&_0.push(d);let H0=q.compute(Q9(o,v,x,K,U0,m,a,u,d),{inputs:_0,outputs:o>1?[-1,1]:[-1]})[0];q.compute(e1(H0,m.batchSize,m.numHeads,a,m.sequenceLength,j0,u,d),{inputs:u&&d?[H0,u,d]:[H0],outputs:[]});let Y0=[H0,P];o>1&&C&&B0.size(C.dims)>0&&Y0.push(C),u&&Y0.push(u),d&&Y0.push(d),q.compute(c9(o,H0,P,C,m,a,u,d),{inputs:Y0,outputs:o>1?[0,2]:[0]})},$2=(q,v)=>{let x=[v.batchSize,v.numHeads,v.sequenceLength,v.headSize],P=v.sequenceLength,F=v.inputHiddenSize,M=v.headSize,K=12,C={x:Math.ceil(v.headSize/K),y:Math.ceil(v.sequenceLength/K),z:v.batchSize*v.numHeads},h=[q.inputs[0],q.inputs[1],q.inputs[2]],m=[{type:12,data:P},{type:12,data:F},{type:12,data:M},{type:12,data:v.numHeads},{type:12,data:v.headSize},{type:12,data:v.hiddenSize},{type:12,data:v.hiddenSize+v.hiddenSize+v.vHiddenSize}];return q.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:x,dataType:q.inputs[0].dataType,gpuDataType:0},{dims:x,dataType:q.inputs[0].dataType,gpuDataType:0},{dims:x,dataType:q.inputs[0].dataType,gpuDataType:0}],dispatchGroup:C,programUniforms:m}),getShaderSource:(u)=>{let d=h5("output_q",h[0].dataType,x),o=h5("output_k",h[0].dataType,x),a=h5("output_v",h[0].dataType,x),j0=u0("input",h[0].dataType,h[0].dims),U0=u0("weight",h[1].dataType,h[1].dims),_0=u0("bias",h[2].dataType,h[2].dims),H0=j0.type.storage;return` + const TILE_SIZE = 12u; + var tileInput: array<${H0}, 144>; + var tileWeightQ: array<${H0}, 144>; + var tileWeightK: array<${H0}, 144>; + var tileWeightV: array<${H0}, 144>; + ${u.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}]).declareVariables(j0,U0,_0,d,o,a)} + ${u.mainStart([K,K,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${H0}(0); + var valueK = ${H0}(0); + var valueV = ${H0}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k{let x=b2(q.inputs,v),[P,F,M]=$2(q,x);return v1(q,P,F,M,q.inputs[4],void 0,void 0,void 0,q.inputs[5],x)}}),mG=q0(()=>{d5(),q6(),X6(),S9(),T6(),w2=(q,v)=>{if(!q||q.length!==5)throw Error("BatchNormalization requires 5 inputs");let x=(P,F,M)=>{let K=F.length;if(K!==P.length)throw Error(`${M}: num dimensions != ${K}`);F.forEach((C,h)=>{if(C!==P[h])throw Error(`${M}: dim[${h}] do not match`)})};if(q[0].dims.length>1){let P=v.format==="NHWC"?v.spatial?q[0].dims.slice(-1):q[0].dims.slice(-1).concat(q[0].dims.slice(1,q[0].dims.length-1)):q[0].dims.slice(1,v.spatial?2:void 0);x(q[1].dims,P,"Invalid input scale"),x(q[2].dims,P,"Invalid input B"),x(q[3].dims,P,"Invalid input mean"),x(q[4].dims,P,"Invalid input var")}else x(q[1].dims,[1],"Invalid input scale"),x(q[2].dims,[1],"Invalid input B"),x(q[3].dims,[1],"Invalid input mean"),x(q[4].dims,[1],"Invalid input var")},j2=(q,v)=>{let{epsilon:x,spatial:P,format:F}=v,M=q[0].dims,K=P?k6(M[M.length-1]):1,C=F==="NHWC"&&M.length>1?K:1,h=B0.size(M)/K,m=P,u=m?M.length:M,d=u0("x",q[0].dataType,q[0].dims,K),o=u0("scale",q[1].dataType,q[1].dims,C),a=u0("bias",q[2].dataType,q[2].dims,C),j0=u0("inputMean",q[3].dataType,q[3].dims,C),U0=u0("inputVar",q[4].dataType,q[4].dims,C),_0=h5("y",q[0].dataType,u,K);return{name:"BatchNormalization",shaderCache:{hint:`${v.epsilon}_${v.format}_${P}_${K}`,inputDependencies:m?["rank","type","type","type","type"]:void 0},getShaderSource:(H0)=>` + const epsilon = ${x}; + ${H0.registerUniform("outputSize","u32").declareVariables(d,o,a,j0,U0,_0)} + ${H0.mainStart()} + ${H0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${_0.offsetToIndices(`global_idx * ${K}`)}; + ${(()=>{let Y0="";if(P)Y0=`let cOffset = ${M.length===1?"0u":F==="NHWC"?`outputIndices[${M.length-1}] / ${K}`:"outputIndices[1]"};`;else if(F==="NCHW")Y0=` + ${_0.indicesSet("outputIndices","0","0")} + let cOffset = ${_0.indicesToOffset("outputIndices")};`;else{Y0=`var cIndices = ${o.type.indices}(0); + cIndices[0] = outputIndices[${M.length-1}];`;for(let k0=1;k0({outputs:[{dims:q[0].dims,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:m?[{type:12,data:h},...C5(M)]:[{type:12,data:h}]})}},R2=(q)=>P6(q),E2=(q,v)=>{let{inputs:x,outputCount:P}=q,F=R2({...v,outputCount:P});if(H.webgpu.validateInputContent&&w2(x,F),v.trainingMode)throw Error("BatchNormalization trainingMode is not supported yet.");q.compute(j2(x,F))}}),pG=q0(()=>{X6(),T6(),U2=(q)=>{if(q[0].dims.length!==3)throw Error("input should have 3 dimensions");if(![320,640,1280].includes(q[0].dims[2]))throw Error("number of channels should be 320, 640 or 1280");if(q[1].dims.length!==1)throw Error("bias is expected to have 1 dimensions");if(q[0].dims[2]!==q[1].dims[0])throw Error("last dimension of input and bias are not the same")},O2=(q)=>{let v=q[0].dims,x=q[0].dims[2],P=B0.size(v)/4,F=q[0].dataType,M=u0("input",F,v,4),K=u0("bias",F,[x],4),C=u0("residual",F,v,4),h=h5("output",F,v,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:v,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(P/64)}}),getShaderSource:(m)=>` + const channels = ${x}u / 4; + ${m.declareVariables(M,K,C,h)} + + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes(P)} + let value = ${M.getByOffset("global_idx")} + + ${K.getByOffset("global_idx % channels")} + ${C.getByOffset("global_idx")}; + ${h.setByOffset("global_idx","value")} + }`}},E1=(q)=>{U2(q.inputs),q.compute(O2(q.inputs))}}),u6=q0(()=>{q6(),X6(),S9(),T6(),Q1=(q,v,x,P,F,M,K)=>{let C=Math.ceil(v/4),h="";h=typeof F=="string"?`${F}(a)`:F("a");let m=u0("inputData",x,[C],4),u=h5("outputData",P,[C],4),d=[{name:"vec_size",type:"u32"}];return K&&d.push(...K),` + ${q.registerUniforms(d).declareVariables(m,u)} + + ${M??""} + + ${q.mainStart()} + ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${m.getByOffset("global_idx")}; + ${u.setByOffset("global_idx",h)} + }`},b6=(q,v,x,P,F,M=q.dataType,K,C)=>{let h=[{type:12,data:Math.ceil(B0.size(q.dims)/4)}];return K&&h.push(...K),{name:v,shaderCache:{hint:F,inputDependencies:["type"]},getShaderSource:(m)=>Q1(m,B0.size(q.dims),q.dataType,M,x,P,C),getRunData:(m)=>({outputs:[{dims:q.dims,dataType:M}],dispatchGroup:{x:Math.ceil(B0.size(m[0].dims)/64/4)},programUniforms:h})}},Q2=(q)=>{q.compute(b6(q.inputs[0],"Abs","abs"))},H2=(q)=>{q.compute(b6(q.inputs[0],"Acos","acos"))},C2=(q)=>{q.compute(b6(q.inputs[0],"Acosh","acosh"))},B2=(q)=>{q.compute(b6(q.inputs[0],"Asin","asin"))},b=(q)=>{q.compute(b6(q.inputs[0],"Asinh","asinh"))},_=(q)=>{q.compute(b6(q.inputs[0],"Atan","atan"))},y=(q)=>{q.compute(b6(q.inputs[0],"Atanh","atanh"))},f=(q)=>P6(q),B=(q,v)=>{let x;switch(v.to){case 10:x="vec4";break;case 1:x="vec4";break;case 12:x="vec4";break;case 6:x="vec4";break;case 9:x="vec4";break;default:throw RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${v.to}`)}q.compute(b6(q.inputs[0],"Cast",x,void 0,v.cacheKey,v.to))},g=(q)=>{let v,x,P=q.length>=2&&q[1].data!==0,F=q.length>=3&&q[2].data!==0;switch(q[0].dataType){case 1:v=P?q[1].getFloat32Array()[0]:-340282346638528860000000000000000000000,x=F?q[2].getFloat32Array()[0]:340282346638528860000000000000000000000;break;case 10:v=P?q[1].getUint16Array()[0]:64511,x=F?q[2].getUint16Array()[0]:31743;break;default:throw Error("Unsupport data type")}return P6({min:v,max:x})},J0=(q,v)=>{let x=v||g(q.inputs),P=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"Clip",(F)=>`clamp(${F}, vec4<${P}>(uniforms.min), vec4<${P}>(uniforms.max))`,void 0,x.cacheKey,void 0,[{type:q.inputs[0].dataType,data:x.min},{type:q.inputs[0].dataType,data:x.max}],[{name:"min",type:P},{name:"max",type:P}]),{inputs:[0]})},z0=(q)=>{q.compute(b6(q.inputs[0],"Ceil","ceil"))},f0=(q)=>{q.compute(b6(q.inputs[0],"Cos","cos"))},A0=(q)=>{q.compute(b6(q.inputs[0],"Cosh","cosh"))},Z5=(q)=>P6(q),M5=(q,v)=>{let x=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"Elu",(P)=>`elu_vf32(${P})`,` + const elu_alpha_ = ${x}(${v.alpha}); + + fn elu_f32(a: ${x}) -> ${x} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${x}>) -> vec4<${x}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,v.cacheKey))},p5=(q="f32")=>` +const r0: ${q} = 0.3275911; +const r1: ${q} = 0.254829592; +const r2: ${q} = -0.284496736; +const r3: ${q} = 1.421413741; +const r4: ${q} = -1.453152027; +const r5: ${q} = 1.061405429; + +fn erf_vf32(v: vec4<${q}>) -> vec4<${q}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,J6=(q)=>{let v=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"Erf",(x)=>`erf_vf32(${x})`,p5(v)))},q9=(q)=>{q.compute(b6(q.inputs[0],"Exp","exp"))},y1=(q)=>{q.compute(b6(q.inputs[0],"Floor","floor"))},D4=(q)=>{let v=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"Gelu",(x)=>`0.5 * ${x} * (1.0 + erf_vf32(${x} * 0.7071067811865475))`,p5(v)))},q$=(q,v)=>{let x=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"LeakyRelu",(P)=>`select(leaky_relu_alpha_ * ${P}, ${P}, ${P} >= vec4<${x}>(0.0))`,`const leaky_relu_alpha_ = ${x}(${v.alpha});`,v.cacheKey))},U7=(q)=>{q.compute(b6(q.inputs[0],"Not",(v)=>`!${v}`))},V$=(q)=>{q.compute(b6(q.inputs[0],"Neg",(v)=>`-${v}`))},N$=(q)=>{q.compute(b6(q.inputs[0],"Reciprocal",(v)=>`1.0/${v}`))},H7=(q)=>{let v=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"Relu",(x)=>`select(vec4<${v}>(0.0), ${x}, ${x} > vec4<${v}>(0.0))`))},J$=(q)=>{q.compute(b6(q.inputs[0],"Sigmoid",(v)=>`(1.0 / (1.0 + exp(-${v})))`))},v$=(q)=>P6(q),x7=(q,v)=>{let x=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"HardSigmoid",(P)=>`max(vec4<${x}>(0.0), min(vec4<${x}>(1.0), ${v.alpha} * ${P} + vec4<${x}>(${v.beta})))`,void 0,v.cacheKey))},R$=(q)=>{q.compute(b6(q.inputs[0],"Sin","sin"))},U$=(q)=>{q.compute(b6(q.inputs[0],"Sinh","sinh"))},L7=(q)=>{q.compute(b6(q.inputs[0],"Sqrt","sqrt"))},H$=(q)=>{q.compute(b6(q.inputs[0],"Tan","tan"))},_7=(q)=>`sign(${q}) * (1 - exp(-2 * abs(${q}))) / (1 + exp(-2 * abs(${q})))`,Y7=(q)=>{q.compute(b6(q.inputs[0],"Tanh",_7))},S7=(q="f32")=>` +const fast_gelu_a: ${q} = 0.5; +const fast_gelu_b: ${q} = 0.7978845608028654; +const fast_gelu_c: ${q} = 0.035677408136300125; + +fn tanh_v(v: vec4<${q}>) -> vec4<${q}> { + return ${_7("v")}; +} +`,P7=(q)=>`(fast_gelu_a + fast_gelu_a * tanh_v(${q} * (fast_gelu_c * ${q} * ${q} + fast_gelu_b))) * ${q}`,X7=(q)=>{let v=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"FastGelu",P7,S7(v),void 0,q.inputs[0].dataType))},x$=(q,v)=>{let x=s6(q.inputs[0].dataType);return q.compute(b6(q.inputs[0],"ThresholdedRelu",(P)=>`select(vec4<${x}>(0.0), ${P}, ${P} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${x}>(${v.alpha});`,v.cacheKey)),0},L$=(q)=>{q.compute(b6(q.inputs[0],"Log","log"))},T7=(q,v)=>` +const alpha = vec4<${q}>(${v}); +const one = ${q}(1.0); +const zero = ${q}(0.0); + +fn quick_gelu_impl(x: vec4<${q}>) -> vec4<${q}> { + let v = x *alpha; + var x1 : vec4<${q}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,_$=(q)=>`quick_gelu_impl(${q})`,Y$=(q,v)=>{let x=s6(q.inputs[0].dataType);q.compute(b6(q.inputs[0],"QuickGelu",_$,T7(x,v.alpha),v.cacheKey,q.inputs[0].dataType))}}),kV=q0(()=>{X6(),T6(),u6(),F7=(q)=>{if(q[0].dims.length!==3)throw Error("input should have 3 dimensions");if(![2560,5120,10240].includes(q[0].dims[2]))throw Error("hidden state should be 2560, 5120 or 10240");if(q[1].dims.length!==1)throw Error("bias is expected to have 1 dimensions");if(q[0].dims[2]!==q[1].dims[0])throw Error("last dimension of input and bias are not the same")},S$=(q)=>{let v=q[0].dims.slice();v[2]=v[2]/2;let x=u0("input",q[0].dataType,q[0].dims,4),P=u0("bias",q[0].dataType,[q[0].dims[2]],4),F=h5("output",q[0].dataType,v,4),M=B0.size(v)/4,K=N6(q[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:v,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(M/64)}}),getShaderSource:(C)=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${q[0].dims[2]/4/2}u; + + ${C.declareVariables(x,P,F)} + + ${p5(K)} + + ${C.mainStart()} + ${C.guardAgainstOutOfBoundsWorkgroupSizes(M)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${F.setByOffset("global_idx","valueLeft * geluRight")} + }`}},P$=(q)=>{F7(q.inputs),q.compute(S$(q.inputs))}}),IV=q0(()=>{q6(),X6(),T6(),y7=(q,v,x,P,F,M,K,C,h,m,u,d)=>{let o,a;typeof C=="string"?o=a=(Y0,k0)=>`${C}((${Y0}),(${k0}))`:typeof C=="function"?o=a=C:(o=C.scalar,a=C.vector);let j0,U0=h5("outputData",u,P.length,4),_0=u0("aData",h,v.length,4),H0=u0("bData",m,x.length,4);if(F)if(M){let Y0=B0.size(v)===1,k0=B0.size(x)===1,D0=v.length>0&&v[v.length-1]%4==0,b0=x.length>0&&x[x.length-1]%4==0;j0=Y0||k0?U0.setByOffset("global_idx",a(Y0?`${_0.type.value}(${_0.getByOffset("0")}.x)`:_0.getByOffset("global_idx"),k0?`${H0.type.value}(${H0.getByOffset("0")}.x)`:H0.getByOffset("global_idx"))):` + let outputIndices = ${U0.offsetToIndices("global_idx * 4u")}; + let offsetA = ${_0.broadcastedIndicesToOffset("outputIndices",U0)}; + let offsetB = ${H0.broadcastedIndicesToOffset("outputIndices",U0)}; + ${U0.setByOffset("global_idx",a(K||D0?_0.getByOffset("offsetA / 4u"):`${_0.type.value}(${_0.getByOffset("offsetA / 4u")}[offsetA % 4u])`,K||b0?H0.getByOffset("offsetB / 4u"):`${H0.type.value}(${H0.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else j0=U0.setByOffset("global_idx",a(_0.getByOffset("global_idx"),H0.getByOffset("global_idx")));else{if(!M)throw Error("no necessary to use scalar implementation for element-wise binary op implementation.");let Y0=(k0,D0,b0="")=>{let m0=`aData[indexA${D0}][componentA${D0}]`,x5=`bData[indexB${D0}][componentB${D0}]`;return` + let outputIndices${D0} = ${U0.offsetToIndices(`global_idx * 4u + ${D0}u`)}; + let offsetA${D0} = ${_0.broadcastedIndicesToOffset(`outputIndices${D0}`,U0)}; + let offsetB${D0} = ${H0.broadcastedIndicesToOffset(`outputIndices${D0}`,U0)}; + let indexA${D0} = offsetA${D0} / 4u; + let indexB${D0} = offsetB${D0} / 4u; + let componentA${D0} = offsetA${D0} % 4u; + let componentB${D0} = offsetB${D0} % 4u; + ${k0}[${D0}] = ${b0}(${o(m0,x5)}); + `};j0=u===9?` + var data = vec4(0); + ${Y0("data",0,"u32")} + ${Y0("data",1,"u32")} + ${Y0("data",2,"u32")} + ${Y0("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:` + ${Y0("outputData[global_idx]",0)} + ${Y0("outputData[global_idx]",1)} + ${Y0("outputData[global_idx]",2)} + ${Y0("outputData[global_idx]",3)} + `}return` + ${q.registerUniform("vec_size","u32").declareVariables(_0,H0,U0)} + + ${d??""} + + ${q.mainStart()} + ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${j0} + }`},X$=(q,v,x,P,F,M,K=x.dataType)=>{let C=x.dims.map((U0)=>Number(U0)??1),h=P.dims.map((U0)=>Number(U0)??1),m=!B0.areEqual(C,h),u=C,d=B0.size(C),o=!1,a=!1,j0=[m];if(m){let U0=p6.calcShape(C,h,!1);if(!U0)throw Error("Can't perform binary op on the given tensors");u=U0.slice(),d=B0.size(u);let _0=B0.size(C)===1,H0=B0.size(h)===1,Y0=C.length>0&&C[C.length-1]%4==0,k0=h.length>0&&h[h.length-1]%4==0;j0.push(_0),j0.push(H0),j0.push(Y0),j0.push(k0);let D0=1;for(let b0=1;b0U0.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:(U0)=>y7(U0,C,h,u,o,m,a,F,x.dataType,P.dataType,K,M),getRunData:()=>({outputs:[{dims:u,dataType:K}],dispatchGroup:{x:Math.ceil(d/64/4)},programUniforms:[{type:12,data:Math.ceil(B0.size(u)/4)},...C5(C,h,u)]})}},C1=(q,v,x,P,F,M)=>{q.compute(X$(v,F??"",q.inputs[0],q.inputs[1],x,P,M))},z7=(q)=>{C1(q,"Add",(v,x)=>`${v}+${x}`)},T$=(q)=>{C1(q,"Div",(v,x)=>`${v}/${x}`)},F$=(q)=>{C1(q,"Equal",{scalar:(v,x)=>`u32(${v}==${x})`,vector:(v,x)=>`vec4(${v}==${x})`},void 0,void 0,9)},y$=(q)=>{C1(q,"Mul",(v,x)=>`${v}*${x}`)},z$=(q)=>{let v=u0("input",q.inputs[0].dataType,q.inputs[0].dims).type.value;C1(q,"Pow",{scalar:(x,P)=>`pow_custom(${x},${P})`,vector:(x,P)=>`pow_vector_custom(${x},${P})`},` + fn pow_custom(a : ${v}, b : ${v}) -> ${v} { + if (b == ${v}(0.0)) { + return ${v}(1.0); + } else if (a < ${v}(0.0) && f32(b) != floor(f32(b))) { + return ${v}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${v}(1.0), round(f32(abs(b) % ${v}(2.0))) != 1.0) * ${v}(${v==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${v}>, b : vec4<${v}>) -> vec4<${v}> { + // TODO: implement vectorized pow + return vec4<${v}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},k7=(q)=>{C1(q,"Sub",(v,x)=>`${v}-${x}`)},k$=(q)=>{C1(q,"Greater",{scalar:(v,x)=>`u32(${v}>${x})`,vector:(v,x)=>`vec4(${v}>${x})`},void 0,void 0,9)},I$=(q)=>{C1(q,"Less",{scalar:(v,x)=>`u32(${v}<${x})`,vector:(v,x)=>`vec4(${v}<${x})`},void 0,void 0,9)},I7=(q)=>{C1(q,"GreaterOrEqual",{scalar:(v,x)=>`u32(${v}>=${x})`,vector:(v,x)=>`vec4(${v}>=${x})`},void 0,void 0,9)},D$=(q)=>{C1(q,"LessOrEqual",{scalar:(v,x)=>`u32(${v}<=${x})`,vector:(v,x)=>`vec4(${v}<=${x})`},void 0,void 0,9)}}),DV=q0(()=>{q6(),X6(),S9(),T6(),W$=(q,v)=>{if(!q||q.length<1)throw Error("too few inputs");let x=q[0],P=x.dataType,F=x.dims.length;q.forEach((M,K)=>{if(K!==0){if(M.dataType!==P)throw Error("input tensors should be one type");if(M.dims.length!==F)throw Error("input tensors should have the same shape");M.dims.forEach((C,h)=>{if(h!==v&&C!==x.dims[h])throw Error("non concat dimensions must match")})}})},D7=(q,v)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${v}); + for (var i: u32 = 0u; i < ${q}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${q}u; + }`,M$=(q,v)=>{let x=q.length,P=[];for(let F=0;F{let F=B0.size(x),M=Array(q.length),K=Array(q.length),C=0,h=[],m=[],u=[{type:12,data:F}];for(let j0=0;j0`uniforms.sizeInConcatAxis${j0}`).join(",");return{name:"Concat",shaderCache:{hint:`${v}`,inputDependencies:h},getRunData:()=>({outputs:[{dims:x,dataType:P}],dispatchGroup:{x:Math.ceil(F/64)},programUniforms:u}),getShaderSource:(j0)=>` + + ${(()=>{j0.registerUniform("outputSize","u32");for(let U0=0;U0(${a}); + ${o} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${M$(K,d)} + }`}},W7=(q,v)=>{let x=q.inputs,P=x[0].dims,F=B0.normalizeAxis(v.axis,P.length);W$(x,F);let M=P.slice();M[F]=x.reduce((C,h)=>C+(h.dims.length>F?h.dims[F]:0),0);let K=x.filter((C)=>B0.size(C.dims)>0);q.compute(K$(K,F,M,x[0].dataType),{inputs:K})},b$=(q)=>P6({axis:q.axis})}),Y4=q0(()=>{q6(),X6(),q3=(q,v,x="f32")=>{switch(q.activation){case"Relu":return`value = max(value, ${v}(0.0));`;case"Sigmoid":return`value = (${v}(1.0) / (${v}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${v}(${x}(uniforms.clip_min)), ${v}(${x}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${v}(0.0), min(${v}(1.0), ${x}(uniforms.alpha) * value + ${x}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${x}(uniforms.alpha) * value, value, value >= ${v}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw Error(`Unsupported activation ${q.activation}`)}},h2=(q,v)=>{q.activation==="Clip"?v.push({type:1,data:q.clipMax},{type:1,data:q.clipMin}):q.activation==="HardSigmoid"?v.push({type:1,data:q.alpha},{type:1,data:q.beta}):q.activation==="LeakyRelu"&&v.push({type:1,data:q.alpha})},V3=(q,v)=>{q.activation==="Clip"?v.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):q.activation==="HardSigmoid"?v.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):q.activation==="LeakyRelu"&&v.push({name:"alpha",type:"f32"})},M7=(q)=>{let v=q?.activation||"";if(v==="HardSigmoid"){let[x,P]=q?.activation_params||[0.2,0.5];return{activation:v,alpha:x,beta:P}}if(v==="Clip"){let[x,P]=q?.activation_params||[u1,d1];return{activation:v,clipMax:P,clipMin:x}}if(v==="LeakyRelu"){let[x]=q?.activation_params||[0.01];return{activation:v,alpha:x}}return{activation:v}}}),f8=q0(()=>{u9=(q,v)=>{switch(q){case 1:return v;case 2:return`vec2<${v}>`;case 3:return`vec3<${v}>`;case 4:return`vec4<${v}>`;default:throw Error(`${q}-component is not supported.`)}},f$=(q)=>` + ${q?"value = value + getBiasByOutputCoords(coords);":""} + `}),lZ=q0(()=>{w$=(q)=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${q}.x), i32(${q}.y), i32(${q}.z), 1)); +} +`}),$G=q0(()=>{q6(),X6(),T6(),Y4(),t3=(q,v,x,P,F)=>{let M=P-x;return` + ${Array.from({length:x}).map((K,C)=>` + if (${B5(v.shape,C,v.rank)} != 1) { + ${v.indicesSet(q,C,B5(F,C+M,P))} + } else { + ${v.indicesSet(q,C,0)} + }`).join("")} +`},K7=(q,v,x,P,F=!1,M)=>{let K=q[0].dims,C=q[1].dims,h=K[K.length-2],m=C[C.length-1],u=K[K.length-1],d=k6(m),o=k6(u),a=k6(h),j0=B0.size(x)/d/a,U0=q.length>2,_0=P?P.slice(0,-2):x.slice(0,-2),H0=[B0.size(_0),h,m],Y0=[{type:12,data:j0},{type:12,data:h},{type:12,data:m},{type:12,data:u}];return h2(v,Y0),Y0.push(...C5(_0,K,C)),U0&&Y0.push(...C5(q[2].dims)),Y0.push(...C5(H0)),{name:"MatMulNaive",shaderCache:{hint:`${v.activation};${d};${o};${a};${F}`,inputDependencies:U0?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:M?M(x):x,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(j0/64)},programUniforms:Y0}),getShaderSource:(k0)=>{let D0=s2("batch_dims",q[0].dataType,_0.length),b0=u0("a",q[0].dataType,K.length,o),m0=u0("b",q[1].dataType,C.length,d),x5=h5("output",q[0].dataType,H0.length,d),f5=N6(x5.type.tensor),c5=q3(v,x5.type.value,f5),l5=[b0,m0],G6="";if(U0){let A6=F?d:1;l5.push(u0("bias",q[2].dataType,q[2].dims.length,A6)),G6=F?`value += bias[col / ${A6}];`:`value += ${x5.type.value}(bias[row + i]);`}let y6=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];return V3(v,y6),` + ${k0.registerUniforms(y6).registerInternalVariables(D0).declareVariables(...l5,x5)} + ${k0.mainStart()} + ${k0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let col = (global_idx % (uniforms.N / ${d})) * ${d}; + var index1 = global_idx / (uniforms.N / ${d}); + let stride1 = uniforms.M / ${a}; + let row = (index1 % stride1) * ${a}; + let batch = index1 / stride1; + + ${x.length===2?"":`let batch_indices = ${D0.offsetToIndices("batch")};`} + + var a_indices: ${b0.type.indices}; + ${t3("a_indices",b0,b0.rank-2,D0.rank,"batch_indices")} + ${b0.indicesSet("a_indices",b0.rank-2,0)} + ${b0.indicesSet("a_indices",b0.rank-1,0)} + let a_offset = ${b0.indicesToOffset("a_indices")}; + + var b_indices: ${m0.type.indices}; + ${t3("b_indices",m0,m0.rank-2,D0.rank,"batch_indices")} + ${m0.indicesSet("b_indices",m0.rank-2,0)} + ${m0.indicesSet("b_indices",m0.rank-1,0)} + let b_offset = ${m0.indicesToOffset("b_indices")}; + var values: array<${x5.type.value}, ${a}>; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${o}) { + ${(()=>{let A6=`var a_data: ${b0.type.value};`;for(let w5=0;w5{q6(),X6(),T6(),Y4(),$G(),f8(),E$=(q,v)=>q?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${v?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${v?", batchIndices":""}); + `,Q$=(q,v)=>q?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${v===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${v===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${v===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,b7=(q,v,x="f32",P,F=!1,M=32,K=!1,C=32)=>{let h=v[1]*q[1],m=v[0]*q[0],u=F?h:M,d=F?M:h,o=u/v[0],a=M/v[1];if((!F||o!==4||q[1]!==4)&&(F||o!==3&&o!==4)||u%v[0]!==0||M%v[1]!==0||q[0]!==4)throw Error(`If transposeA ${F} is true, innerElementSize ${o} and workPerThread[1] ${q[1]} must be 4. + Otherwise, innerElementSize ${o} must be 3 or 4. + tileAWidth ${u} must be divisible by workgroupSize[0]${v[0]}. tileInner ${M} must be divisible by workgroupSize[1] ${v[1]}. colPerThread ${q[0]} must be 4.`);return` +var mm_Asub: array, ${u/o}>, ${d}>; +var mm_Bsub: array, ${m/q[0]}>, ${M}>; + +const rowPerThread = ${q[1]}; +const colPerThread = ${q[0]}; +const innerElementSize = ${o}; +const tileInner = ${M}; + +@compute @workgroup_size(${v[0]}, ${v[1]}, ${v[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${K?"0":"i32(globalId.z)"}; + ${P?`let batchIndices = ${P.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${h}; + + let num_tiles = ${K?`${Math.ceil(C/M)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${K?`i32(globalId.z) * ${C}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${a}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${E$(F,P)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${a}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${P?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${o===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${Q$(F,o)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},W4=(q,v)=>q?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${v?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${v?", batchIndices":""}); + `,C$=(q)=>q?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",f7=(q,v,x="f32",P,F=!1,M=32,K=!1,C=32,h=!1)=>{let m=q[1]*v[1],u=q[0]*v[0],d=F?m:M,o=F?M:m;if(o%v[1]!==0||d%v[0]!==0||M%v[1]!==0)throw Error(`tileAHight ${o} must be divisible by workgroupSize[1]${v[1]}, tileAWidth ${d} must be divisible by workgroupSize[0]${v[0]}, tileInner ${M} must be divisible by workgroupSize[1]${v[1]}`);let a=o/v[1],j0=d/v[0],U0=M/v[1],_0=h?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${m}; + let globalColStart = i32(workgroupId.x) * ${u}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${o}; inputRow = inputRow + ${v[1]}) { + for (var inputCol = localCol; inputCol < ${d}; inputCol = inputCol + ${v[0]}) { + ${W4(F,P)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${M}; inputRow = inputRow + ${v[1]}) { + for (var inputCol = localCol; inputCol < ${u}; inputCol = inputCol + ${v[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${P?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${x}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${v[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${F?`mm_Asub[k][localRow + innerRow * ${v[1]}];`:`mm_Asub[localRow + innerRow * ${v[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${v[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${v[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${m}; + +let tileRowA = i32(localId.y) * ${a}; +let tileColA = i32(localId.x) * ${j0}; +let tileRowB = i32(localId.y) * ${U0}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${a}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${j0}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${W4(F,P)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${U0}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${P?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${x}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${C$(F)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${o}>; + var mm_Bsub : array, ${M}>; + const rowPerThread = ${q[1]}; + const colPerThread = ${q[0]}; + const tileInner = ${M}; + +@compute @workgroup_size(${v[0]}, ${v[1]}, ${v[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${K?"0":"i32(globalId.z)"}; + ${P?`let batchIndices = ${P.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${K?`${Math.ceil(C/M)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${K?`i32(globalId.z) * ${C}`:"0"}; + + var acc : array, rowPerThread>; + ${_0} + } +`},B$=(q,v,x,P,F=!1)=>{let[M,K,C,h]=P,m=N6(P[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${M.type.indices}) -> ${u9(q,m)} { + var value = ${u9(q,m)}(0.0); + let col = colIn * ${q}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${K.type.indices}; + ${t3("aIndices",K,K.rank-2,M.rank,"batchIndices")} + ${K.indicesSet("aIndices",K.rank-2,"u32(row)")} + ${K.indicesSet("aIndices",K.rank-1,"u32(colIn)")} + value = ${K.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${M.type.indices}) -> ${u9(q,m)} { + var value = ${u9(q,m)}(0.0); + let col = colIn * ${q}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${C.type.indices}; + ${t3("bIndices",C,C.rank-2,M.rank,"batchIndices")} + ${C.indicesSet("bIndices",C.rank-2,"u32(row)")} + ${C.indicesSet("bIndices",C.rank-1,"u32(colIn)")} + value = ${C.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${u9(q,m)}) { + let col = colIn * ${q}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${v?`value = value + ${F?"bias[colIn]":`${u9(q,m)}(bias[row])`};`:""} + ${x} + ${h.setByIndices("vec3(coords)","value")} + } + } + `},M4=(q,v,x,P,F=!1,M)=>{let K=q[0].dims,C=q[1].dims,h=K.slice(0,-2),m=C.slice(0,-2),u=P?P.slice(0,-2):x.slice(0,-2),d=B0.size(u),o=K[K.length-2],a=K[K.length-1],j0=C[C.length-1],U0=a%4==0&&j0%4==0,_0=o<=8?[4,1,1]:[4,4,1],H0=[8,8,1],Y0=[Math.ceil(j0/H0[0]/_0[0]),Math.ceil(o/H0[1]/_0[1]),Math.ceil(d/H0[2]/_0[2])],k0=U0?4:1,D0=[...h,o,a/k0],b0=D0.length,m0=[...m,a,j0/k0],x5=m0.length,f5=[d,o,j0/k0],c5=[{type:6,data:o},{type:6,data:j0},{type:6,data:a}];h2(v,c5),c5.push(...C5(u,D0,m0));let l5=["rank","rank"],G6=q.length>2;return G6&&(c5.push(...C5(q[2].dims)),l5.push("rank")),c5.push(...C5(f5)),{name:"MatMul",shaderCache:{hint:`${_0};${v.activation};${U0};${F}`,inputDependencies:l5},getRunData:()=>({outputs:[{dims:M?M(x):x,dataType:q[0].dataType}],dispatchGroup:{x:Y0[0],y:Y0[1],z:Y0[2]},programUniforms:c5}),getShaderSource:(y6)=>{let A6=u.length,w5=s2("batchDims",q[0].dataType,A6,1),i0=N6(q[0].dataType),z5=u0("a",q[0].dataType,b0,k0),s5=u0("b",q[1].dataType,x5,k0),r5=h5("result",q[0].dataType,f5.length,k0),P9=[z5,s5];if(G6){let fV=F?k0:1;P9.push(u0("bias",q[2].dataType,q[2].dims.length,fV))}let f6=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];V3(v,f6);let j1=N6(r5.type.tensor),a4=q3(v,r5.type.value,j1),Tq=B$(k0,G6,a4,[w5,z5,s5,r5],F);return` + ${y6.registerUniforms(f6).registerInternalVariables(w5).declareVariables(...P9,r5)} + ${Tq} + ${U0?b7(_0,H0,i0,w5):f7(_0,H0,i0,w5)} + `}}}}),oZ=q0(()=>{q6(),B1(),T6(),Y4(),f8(),lZ(),jG(),w7=(q,v,x,P,F=!1,M,K=4,C=4,h=4,m="f32")=>{let u=(f5)=>{switch(f5){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw Error(`innerElementSize ${f5} is not supported.`)}},d=q?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,o=q?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,a=q?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",j0=q?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",U0=q?"row":"col",_0=q?"col":"row",H0=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${q?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${U0} / outWidth; + let outCol = ${U0} % outWidth; + + let WRow = ${_0} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${_0} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${_0} % inChannels; + var resData = ${u9(K,m)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${a} && xCol >= 0 && xCol < ${j0}) { + ${d} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${((f5)=>{switch(f5){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${m}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw Error(`innerElementSize ${f5} is not supported.`)}})(K)} + } + return resData;`,Y0=q?v&&P?` + let col = colIn * ${K}; + ${H0}`:` + let col = colIn * ${K}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${H0} + } + return ${u9(K,m)}(0.0);`:P&&x?` + let col = colIn * ${K}; + ${H0}`:` + let col = colIn * ${K}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${H0} + } + return ${u9(K,m)}(0.0);`,k0=q?P&&x?u(C):` + let col = colIn * ${C}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${u(C)} + } + return ${u9(C,m)}(0.0);`:` + let col = colIn * ${C}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${u(C)} + } + return ${u9(C,m)}(0.0);`,D0=u9(h,m),b0=u9(q?K:C,m),m0=u9(q?C:K,m),x5=q3(M,D0,m);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${b0} { + ${q?Y0:k0} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${m0} { + ${q?k0:Y0} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${D0}) { + let col = colIn * ${h}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${q?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${o} + ${f$(F)} + ${x5} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},h$=(q,v,x,P,F,M,K,C,h)=>{let m=v.format==="NHWC",u=m?q[0].dims[3]:q[0].dims[1],d=x[0],o=m?x[2]:x[3],a=m?x[1]:x[2],j0=m?x[3]:x[1],U0=m&&(u%4==0||u%3==0)&&j0%4==0,_0=m?j0:o*a,H0=m?o*a:j0,Y0=[8,8,1],k0=P<=8?[4,1,1]:[4,4,1],D0=[Math.ceil(_0/Y0[0]/k0[0]),Math.ceil(H0/Y0[1]/k0[1]),Math.ceil(d/Y0[2]/k0[2])];L6("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${D0}`);let b0=U0?m&&u%4!=0?3:4:1,m0=Y0[1]*k0[1],x5=Y0[0]*k0[0],f5=Math.max(Y0[0]*b0,Y0[1]),c5=P%m0===0,l5=F%x5===0,G6=M%f5===0,y6=U0?[b0,4,4]:[1,1,1],A6=[{type:6,data:P},{type:6,data:F},{type:6,data:M},{type:6,data:[v.pads[0],v.pads[1]]},{type:6,data:v.strides},{type:6,data:v.dilations}];h2(v,A6),A6.push(...C5(q[0].dims,q[1].dims));let w5=["rank","rank"];return K&&(A6.push(...C5(q[2].dims)),w5.push("rank")),A6.push(...C5(x)),{name:"Conv2DMatMul",shaderCache:{hint:`${v.cacheKey};${b0};${U0};${c5};${l5};${G6};${m0};${x5};${f5}`,inputDependencies:w5},getRunData:()=>({outputs:[{dims:h?h(x):x,dataType:q[0].dataType}],dispatchGroup:{x:D0[0],y:D0[1],z:D0[2]},programUniforms:A6}),getShaderSource:(i0)=>{let z5=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];V3(v,z5);let s5=U0?4:1,r5=N6(q[0].dataType),P9=` + fn setOutputAtIndex(flatIndex : i32, value : ${U0?`vec4<${r5}>`:r5}) { + result[flatIndex] = ${U0?`vec4<${r5}>`:r5}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${U0?`vec4<${r5}>`:r5}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${U0?"/ 4":""}, value); + }`,f6=[u0("x",q[0].dataType,q[0].dims.length,b0===3?1:b0),u0("w",q[1].dataType,q[1].dims.length,s5)],j1=h5("result",q[0].dataType,x.length,s5);if(K){let a4=u0("bias",q[2].dataType,q[2].dims.length,s5);f6.push(a4),P9+=` + fn getBiasByOutputCoords(coords : vec4) -> ${U0?`vec4<${r5}>`:r5} { + return bias[coords.${m?"w":"y"}${U0?"/ 4":""}]; + }`}return` + ${w$("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${i0.registerUniforms(z5).declareVariables(...f6,j1)} + ${P9} + ${w7(m,c5,l5,G6,K,v,y6[0],y6[1],y6[2],r5)} + ${U0?b7(k0,Y0,r5,void 0,!m,f5):f7(k0,Y0,r5,void 0,!m,f5,!1,void 0,C)}`}}}}),AG=q0(()=>{q6(),B1(),X6(),T6(),Y4(),f8(),c$=(q)=>{let v=1;for(let x=0;xtypeof q=="number"?[q,q,q]:q,q4=(q,v)=>v<=1?q:q+(q-1)*(v-1),Q7=(q,v,x,P=1)=>{let F=q4(v,P);return Math.floor((q[0]*(x-1)-x+F)/2)},C7=(q,v,x,P,F)=>{F==null&&(F=Q7(q,v[0],P[0]));let M=[0,0,0,x];for(let K=0;K<3;K++)q[K]+2*F>=v[K]&&(M[K]=Math.trunc((q[K]-v[K]+2*F)/P[K]+1));return M},m$=(q,v,x,P,F,M,K,C,h,m)=>{let u,d,o,a;if(q==="VALID"&&(q=0),typeof q=="number"){u={top:q,bottom:q,left:q,right:q,front:q,back:q};let j0=C7([v,x,P,1],[C,h,m],1,[F,M,K],q);d=j0[0],o=j0[1],a=j0[2]}else if(Array.isArray(q)){if(!q.every((U0,_0,H0)=>U0===H0[0]))throw Error(`Unsupported padding parameter: ${q}`);u={top:q[0],bottom:q[1],left:q[2],right:q[3],front:q[4],back:q[5]};let j0=C7([v,x,P,1],[C,h,m],1,[F,M,K],q[0]);d=j0[0],o=j0[1],a=j0[2]}else{if(q!=="SAME_UPPER")throw Error(`Unknown padding parameter: ${q}`);{d=Math.ceil(v/F),o=Math.ceil(x/M),a=Math.ceil(P/K);let j0=(d-1)*F+C-v,U0=(o-1)*M+h-x,_0=(a-1)*K+m-P,H0=Math.floor(j0/2),Y0=j0-H0,k0=Math.floor(U0/2),D0=U0-k0,b0=Math.floor(_0/2);u={top:k0,bottom:D0,left:b0,right:_0-b0,front:H0,back:Y0}}}return{padInfo:u,outDepth:d,outHeight:o,outWidth:a}},p$=(q,v,x,P,F,M=!1,K="channelsLast")=>{let C,h,m,u,d;if(K==="channelsLast")[C,h,m,u,d]=q;else{if(K!=="channelsFirst")throw Error(`Unknown dataFormat ${K}`);[C,d,h,m,u]=q}let[o,,a,j0,U0]=v,[_0,H0,Y0]=E7(x),[k0,D0,b0]=E7(P),m0=q4(a,k0),x5=q4(j0,D0),f5=q4(U0,b0),{padInfo:c5,outDepth:l5,outHeight:G6,outWidth:y6}=m$(F,h,m,u,_0,H0,Y0,m0,x5,f5),A6=M?o*d:o,w5=[0,0,0,0,0];return K==="channelsFirst"?w5=[C,A6,l5,G6,y6]:K==="channelsLast"&&(w5=[C,l5,G6,y6,A6]),{batchSize:C,dataFormat:K,inDepth:h,inHeight:m,inWidth:u,inChannels:d,outDepth:l5,outHeight:G6,outWidth:y6,outChannels:A6,padInfo:c5,strideDepth:_0,strideHeight:H0,strideWidth:Y0,filterDepth:a,filterHeight:j0,filterWidth:U0,effectiveFilterDepth:m0,effectiveFilterHeight:x5,effectiveFilterWidth:f5,dilationDepth:k0,dilationHeight:D0,dilationWidth:b0,inShape:q,outShape:w5,filterShape:v}},A$=(q,v,x,P,F,M)=>{let K=M==="channelsLast";K?q[0].dims[3]:q[0].dims[1];let C={x:x.map((o,a)=>a)},h=[Math.ceil(c$(C.x.map((o)=>x[o]))/64),1,1];L6("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${h}`);let m=[{type:12,data:B0.size(x)},{type:12,data:P},{type:12,data:F},{type:12,data:v.strides},{type:12,data:v.dilations}];h2(v,m),m.push(...C5(q[0].dims,q[1].dims));let u=["rank","rank"],d=q.length===3;return d&&(m.push(...C5(q[2].dims)),u.push("rank")),m.push(...C5(x)),{name:"Conv3DNaive",shaderCache:{hint:`${v.cacheKey};${K};1;${d}`,inputDependencies:u},getRunData:()=>({outputs:[{dims:x,dataType:q[0].dataType}],dispatchGroup:{x:h[0],y:h[1],z:h[2]},programUniforms:m}),getShaderSource:(o)=>{let a=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:P.length},{name:"pads",type:"u32",length:F.length},{name:"strides",type:"u32",length:v.strides.length},{name:"dilations",type:"u32",length:v.dilations.length}];V3(v,a);let j0=N6(q[0].dataType),U0=u0("x",q[0].dataType,q[0].dims.length,1),_0=u0("W",q[1].dataType,q[1].dims.length,1),H0=[U0,_0],Y0=h5("result",q[0].dataType,x.length,1),k0="";if(d){let m0=u0("bias",q[2].dataType,q[2].dims.length,1);H0.push(m0),k0+=` + fn getBiasByOutputCoords(coords : array) -> ${j0} { + return bias[${B5("coords",K?4:1,5)}]; + }`}let D0=u9(1,j0),b0=q3(v,D0,j0);return` + ${k0} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${U0.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${_0.getByIndices("aIndices")}; + } + ${o.registerUniforms(a).declareVariables(...H0,Y0)} + ${o.mainStart()} + ${o.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${Y0.offsetToIndices("global_idx")}; + let batch = ${B5("coords",0,U0.rank)}; + let d2 = ${B5("coords",K?U0.rank-1:1,U0.rank)}; + let xFRCCorner = vec3(${B5("coords",K?1:2,U0.rank)}, + ${B5("coords",K?2:3,U0.rank)}, + ${B5("coords",K?3:4,U0.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${B5("uniforms.x_shape",K?1:2,U0.rank)}; + let xShapeZ = ${B5("uniforms.x_shape",K?2:3,U0.rank)}; + let xShapeW = ${B5("uniforms.x_shape",K?3:4,U0.rank)}; + let xShapeU = ${B5("uniforms.x_shape",K?4:1,U0.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${K?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${K?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${K?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${K?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${d?"value = value + getBiasByOutputCoords(coords)":""}; + ${b0} + result[global_idx] = f32(value); + }`}}}}),gG=q0(()=>{q6(),X6(),T6(),Y4(),B7=(q,v,x,P)=>{let F=q.length>2,M=F?"value += b[output_channel];":"",K=q[0].dims,C=q[1].dims,h=v.format==="NHWC",m=h?x[3]:x[1],u=m/v.group,d=h&&u>=4?k6(m):1,o=B0.size(x)/d,a=[{type:12,data:o},{type:12,data:v.dilations},{type:12,data:[v.strides[0],v.strides[1]]},{type:12,data:[v.pads[0],v.pads[1]]},{type:12,data:u}];h2(v,a),a.push(...C5(K,[C[0],C[1],C[2],C[3]/d]));let j0=F?["rank","rank","rank"]:["rank","rank"];return a.push(...C5([x[0],x[1],x[2],x[3]/d])),{name:"GroupedConv",shaderCache:{hint:`${v.cacheKey}_${d}`,inputDependencies:j0},getRunData:()=>({outputs:[{dims:P?P(x):x,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:a}),getShaderSource:(U0)=>{let _0=h5("output",q[0].dataType,x.length,d),H0=N6(_0.type.tensor),Y0=q3(v,_0.type.value,H0),k0=u0("x",q[0].dataType,K.length),D0=u0("w",q[1].dataType,C.length,d),b0=[k0,D0];F&&b0.push(u0("b",q[2].dataType,q[2].dims,d));let m0=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:v.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];V3(v,m0);let x5=h?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${k0.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${D0.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${k0.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${D0.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${U0.registerUniforms(m0).declareVariables(...b0,_0)} + + ${U0.mainStart()} + ${U0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${_0.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${h?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${h?1:2}], outputIndices[${h?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${d} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${h?2:1}]; + + var value: ${_0.type.value} = ${_0.type.value}(0); + ${x5} + ${M} + ${Y0} + ${_0.setByOffset("global_idx","value")} + }`}}},g$=(q,v,x,P)=>{let F=q.length>2,M=k6(x[3]),K=k6(x[2]),C=B0.size(x)/M/K,h=[q[0].dims[0],q[0].dims[1],q[0].dims[2],q[0].dims[3]/M],m=[q[1].dims[0],q[1].dims[1],q[1].dims[2],q[1].dims[3]/M],u=[x[0],x[1],x[2],x[3]/M],d=[{type:12,data:C},{type:6,data:[v.strides[0],v.strides[1]]},{type:6,data:[v.pads[0],v.pads[1]]}];h2(v,d),d.push(...C5(h,m,u));let o=(K-1)*v.strides[1]+m[1];return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${v.cacheKey};${M};${K};${o};${m[0]};${m[1]}`,inputDependencies:F?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:P?P(x):x,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(C/64)},programUniforms:d}),getShaderSource:(a)=>{let j0=h5("output",q[0].dataType,u.length,M),U0=N6(j0.type.tensor),_0=q3(v,j0.type.value,U0),H0=u0("x",q[0].dataType,h.length,M),Y0=u0("w",q[1].dataType,m.length,M),k0=[H0,Y0];F&&k0.push(u0("b",q[2].dataType,q[2].dims,M));let D0=F?"value += b[output_channel];":"",b0=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return V3(v,b0),` + ${a.registerUniforms(b0).declareVariables(...k0,j0)} + ${a.mainStart()} + ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${K}u; + let col = (index1 % width1) * ${K}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${H0.type.value}, ${o}>; + var values: array<${j0.type.value}, ${K}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${m[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${o}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${H0.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${H0.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${m[1]}; w_width++) { + let w_val = ${Y0.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${K}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${K}u; i++) { + var value = values[i]; + ${D0} + ${_0} + ${j0.set("batch","row","col + i","output_channel","value")}; + } + }`}}}}),WV=q0(()=>{X6(),oZ(),AG(),jG(),gG(),Y4(),$G(),m2(),u$=(q,v,x,P,F,M)=>{let K=q[0],C=q.slice(M?1:2,M?3:4),h=C.length,m=v[0],u=v.slice(2).map((o,a)=>o+(o-1)*(x[a]-1)),d=C.map((o,a)=>o+P[a]+P[a+h]).map((o,a)=>Math.floor((o-u[a]+F[a])/F[a]));return d.splice(0,0,K),d.splice(M?3:1,0,m),d},V4=[2,3,1,0],d$=(q,v)=>{if(!q||q.length!==2&&q.length!==3)throw Error("Conv requires 2 or 3 inputs");if(q[0].dims.length>5)throw Error("greater than 5D is not supported");if(q[0].dims.length!==q[1].dims.length)throw Error("filter does not have same dimension as input");if(q[0].dims[v.format==="NHWC"?q[0].dims.length-1:1]!==q[1].dims[1]*v.group)throw Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if(q.length===3&&(q[2].dims.length!==1||q[1].dims[0]!==q[2].dims[0]))throw Error("invalid bias");let x=q[0].dims.length-2;if(v.dilations.length!==x)throw Error(`dilations should be ${x}D`);if(v.strides.length!==x)throw Error(`strides should be ${x}D`);if(v.pads.length!==2*x)throw Error(`pads should be ${2*x}D`);if(v.kernelShape.length!==0&&v.kernelShape.length!==q[1].dims.length-2)throw Error("invalid kernel shape")},K4=(q,v)=>{let x=q.kernelShape.slice();x.length{let v=M7(q),x=q.format;return{autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][q.auto_pad],format:x,dilations:q.dilations,group:q.group,kernelShape:q.kernel_shape,pads:q.pads,strides:q.strides,wIsConst:q.w_is_const(),...v,cacheKey:`${q.format};${v.activation};`}},h7=(q,v,x,P)=>{let F=x.format==="NHWC",M=u$(v[0].dims,v[1].dims,x.dilations,x.pads,x.strides,F);if(x.group!==1){let b0=[v[0]];if(F){let m0=q.kernelCustomData.wT??q.compute(A9(v[1],V4),{inputs:[1],outputs:[x.wIsConst?-2:-1]})[0];x.wIsConst&&!q.kernelCustomData.wT&&(q.kernelCustomData.wT=m0),b0.push(m0)}else b0.push(v[1]);return v.length===3&&b0.push(v[2]),void(!q.adapterInfo.isArchitecture("ampere")&&F&&v[1].dims[0]===x.group&&v[1].dims[1]===1&&x.dilations[0]===1&&x.dilations[1]===1?q.compute(g$(b0,x,M,P),{inputs:b0}):q.compute(B7(b0,x,M,P),{inputs:b0}))}let K=v.length===3,C=v[0].dims[F?1:2],h=v[0].dims[F?2:3],m=v[0].dims[F?3:1],u=v[1].dims[2],d=v[1].dims[3],o=M[F?1:2],a=M[F?2:3],j0=M[F?3:1],U0=F&&u===C&&d===h&&x.pads[0]===0&&x.pads[1]===0;if(U0||u===1&&d===1&&x.dilations[0]===1&&x.dilations[1]===1&&x.strides[0]===1&&x.strides[1]===1&&x.pads[0]===0&&x.pads[1]===0){let b0,m0,x5,f5=M[0],c5=[];if(F){let y6=q.kernelCustomData.wT??q.compute(A9(v[1],V4),{inputs:[1],outputs:[x.wIsConst?-2:-1]})[0];if(x.wIsConst&&!q.kernelCustomData.wT&&(q.kernelCustomData.wT=y6),U0){let A6=C*h*m;b0=v[0].reshape([1,f5,A6]),m0=y6.reshape([1,A6,j0]),x5=[1,f5,j0]}else b0=v[0].reshape([f5,C*h,m]),m0=y6.reshape([1,m,j0]),x5=[f5,o*a,j0];c5.push(b0),c5.push(m0)}else b0=v[0].reshape([f5,m,C*h]),m0=v[1].reshape([1,j0,m]),x5=[f5,j0,o*a],c5.push(m0),c5.push(b0);K&&c5.push(v[2]);let l5=x5[2],G6=c5[0].dims[c5[0].dims.length-1];return void(l5<8&&G6<8?q.compute(K7(c5,x,M,x5,F,P),{inputs:c5}):q.compute(M4(c5,x,M,x5,F,P),{inputs:c5}))}let _0=q.kernelCustomData.wT??q.compute(A9(v[1],V4),{inputs:[1],outputs:[x.wIsConst?-2:-1]})[0];x.wIsConst&&!q.kernelCustomData.wT&&(q.kernelCustomData.wT=_0);let H0=[v[0],_0];K&&H0.push(v[2]);let Y0=F?o*a:j0,k0=F?j0:o*a,D0=u*d*m;q.compute(h$(H0,x,M,Y0,k0,D0,K,!0,P),{inputs:H0})},l$=(q,v)=>{let x=v.format==="NHWC",P=[q.inputs[0].reshape(x?[q.inputs[0].dims[0],1,q.inputs[0].dims[1],q.inputs[0].dims[2]]:[q.inputs[0].dims[0],q.inputs[0].dims[1],1,q.inputs[0].dims[2]]),q.inputs[1].reshape([q.inputs[1].dims[0],q.inputs[1].dims[1],1,q.inputs[1].dims[2]])];q.inputs.length===3&&P.push(q.inputs[2]);let F=[0,v.pads[0],0,v.pads[1]],M=[1].concat(v.strides),K=[1].concat(v.dilations),C=[1].concat(v.kernelShape),h=K4({...v,pads:F,strides:M,dilations:K,kernelShape:C},P);h7(q,P,h,(m)=>x?[m[0],m[2],m[3]]:[m[0],m[1],m[3]])},c7=(q,v,x)=>{let P=x.format==="NHWC"?"channelsLast":"channelsFirst",F=K4(x,v),M=x.autoPad==="NOTSET"?x.pads:x.autoPad,K=p$(v[0].dims,v[1].dims,x.strides,x.dilations,M,!1,P);q.compute(A$(v,F,K.outShape,[K.filterDepth,K.filterHeight,K.filterWidth],[K.padInfo.front,K.padInfo.top,K.padInfo.left],P))},m7=(q,v)=>{if(d$(q.inputs,v),q.inputs[0].dims.length===3)l$(q,v);else if(q.inputs[0].dims.length===5)c7(q,q.inputs,v);else{let x=K4(v,q.inputs);h7(q,q.inputs,x)}}}),sZ=q0(()=>{q6(),B1(),X6(),T6(),o$=(q,v,x)=>{let P=q.length>2,F=v.outputShape,M=v.format==="NHWC",K=v.group,C=q[1].dims,h=C[2]/K,m=C[3],u=M?k6(h):1,d=M&&m===1&&h>=4,o=d?4*Math.floor(h/4):Math.floor(h/u)*u,a=h-o,j0=M?k6(m):1,U0=M?m===1?u:j0:1,_0=B0.size(F)/j0,H0=[Math.ceil(_0/64),1,1];L6("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${H0}`);let Y0=["rank","rank"],k0=[v.strides[0],v.strides[1]],D0=[v.kernelShape[M?1:2],v.kernelShape[M?2:3]],b0=[v.dilations[0],v.dilations[1]],m0=[D0[0]+(v.dilations[0]<=1?0:(v.kernelShape[M?1:2]-1)*(v.dilations[0]-1)),D0[1]+(v.dilations[1]<=1?0:(v.kernelShape[M?2:3]-1)*(v.dilations[1]-1))],x5=[m0[0]-1-Math.floor((v.pads[0]+v.pads[2])/2),m0[1]-1-Math.floor((v.pads[1]+v.pads[3])/2)],f5=[{type:12,data:_0},{type:12,data:k0},{type:12,data:D0},{type:12,data:b0},{type:12,data:m0},{type:6,data:x5},{type:12,data:o},{type:12,data:h},{type:12,data:m},...C5(q[0].dims,q[1].dims)];return P&&(f5.push(...C5(q[2].dims)),Y0.push("rank")),f5.push(...C5(F)),{name:"ConvTranspose2D",shaderCache:{hint:`${v.cacheKey};${u}${U0}${j0}${d}${a}`,inputDependencies:Y0},getRunData:()=>({dispatchGroup:{x:H0[0],y:H0[1],z:H0[2]},outputs:[{dims:x?x(F):F,dataType:q[0].dataType}],programUniforms:f5}),getShaderSource:(c5)=>{let l5=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:k0.length},{name:"filter_dims",type:"u32",length:D0.length},{name:"dilations",type:"u32",length:D0.length},{name:"effective_filter_dims",type:"u32",length:m0.length},{name:"pads",type:"i32",length:x5.length},{name:"input_channels_per_group_int",type:"u32"},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],G6=N6(q[0].dataType),y6=M?1:2,A6=M?2:3,w5=M?3:1,i0=u0("W",q[1].dataType,q[1].dims.length,U0),z5=u0("Dy",q[0].dataType,q[0].dims.length,u),s5=[z5,i0];P&&s5.push(u0("bias",q[2].dataType,[F[w5]].length,j0));let r5=h5("result",q[0].dataType,F.length,j0),P9=` + let outputIndices = ${r5.offsetToIndices(`global_idx * ${j0}`)}; + let batch = ${r5.indicesGet("outputIndices",0)}; + let d1 = ${r5.indicesGet("outputIndices",w5)}; + let r = ${r5.indicesGet("outputIndices",y6)}; + let c = ${r5.indicesGet("outputIndices",A6)}; + let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${r5.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${G6}(dyRCorner) + ${G6}(wR)) / ${G6}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${G6}(uniforms.Dy_shape[${y6}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${G6}(dyCCorner) + ${G6}(wC)) / ${G6}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${G6}(uniforms.Dy_shape[${A6}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + ${d?` + var x_offset = ${z5.indicesToOffset(`${z5.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${u}; + var w_offset = ${i0.indicesToOffset(`${i0.type.indices}(wRPerm, wCPerm, inputChannel, wOutChannel)`)} / ${U0}; + `:""} + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group_int; d2 = d2 + ${d?4:u}) { + ${(()=>{let f6="";if(d)u===4?f6+=` + let xValue = ${z5.getByOffset("x_offset")}; + let wValue = ${i0.getByOffset("w_offset")}; + dotProd = dotProd + dot(xValue, wValue); + x_offset += 1u; + w_offset += 1u;`:u===2?f6+=` + dotProd = dotProd + dot(vec4<${G6}>(${z5.getByOffset("x_offset")}, ${z5.getByOffset("x_offset + 1u")}), vec4<${G6}>(${i0.getByOffset("w_offset")}, ${i0.getByOffset("w_offset + 1u")})); + x_offset += 2u; + w_offset += 2u;`:u===1&&(f6+=` + dotProd = dotProd + dot(vec4<${G6}>(${z5.getByOffset("x_offset")}, ${z5.getByOffset("x_offset + 1u")}, ${z5.getByOffset("x_offset + 2u")}, ${z5.getByOffset("x_offset + 3u")}), vec4<${G6}>(${i0.getByOffset("w_offset")}, ${i0.getByOffset("w_offset + 1u")}, ${i0.getByOffset("w_offset + 2u")}, ${i0.getByOffset("w_offset + 3u")})); + x_offset += 4u; + w_offset += 4u;`);else if(f6+=` + let xValue = ${M?z5.getByOffset(`${z5.indicesToOffset(`${z5.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${u}`):z5.get("batch","inputChannel","idyR","idyC")}; + `,u===1)f6+=` + let w_offset = ${i0.indicesToOffset(`${i0.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${i0.getByOffset(`w_offset / ${U0}`)}; + dotProd = dotProd + xValue * wValue;`;else for(let j1=0;j1{if(a===0)return"";if(!d)throw Error(`packInputAs4 ${d} is not true.`);let f6="";if(u===1){f6+="dotProd = dotProd";for(let j1=0;j1{sZ(),Y4(),m2(),p7=(q,v,x,P,F,M)=>(q-1)*v+x+(P-1)*F+1-M,s$=(q,v,x,P,F)=>{let M=Math.floor(q/2);v==="SAME_UPPER"?(x[P]=M,x[F]=q-M):v==="SAME_LOWER"&&(x[P]=q-M,x[F]=M)},i$=(q,v,x,P,F,M,K,C,h,m)=>{let u=q.length-2,d=m.length===0;h.length{let x=q.kernelShape.slice();if(q.kernelShape.length===0||q.kernelShape.reduce((d,o)=>d*o,1)===0){x.length=0;for(let d=2;dd+o,0)===0){let d=v[0].dims.length-2;h=Array(d).fill(1)}let m=q.strides.slice();if(m.reduce((d,o)=>d+o,0)===0){let d=v[0].dims.length-2;m=Array(d).fill(1)}i$(C,x,h,q.autoPad,q.group,F,m,P,K,M);let u=Object.assign({},q);return Object.assign(u,{kernelShape:x,pads:F,outputPadding:K,outputShape:M,dilations:h,strides:m}),u},a$=(q)=>{let v=M7(q),x=q.format,P=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof q.autoPad>"u"?0:q.autoPad],F=q.dilations,M=q.group,K=q.kernelShape,C=q.pads,h=q.strides,m=q.wIsConst();return{autoPad:P,format:x,dilations:F,group:M,kernelShape:K,outputPadding:q.outputPadding,outputShape:q.outputShape,pads:C,strides:h,wIsConst:m,...v,cacheKey:`${q.format};${v.activation};`}},r$=(q,v)=>{if(!q||q.length!==2&&q.length!==3)throw Error("Conv requires 2 or 3 inputs");if(q[0].dims.length!==4&&q[0].dims.length!==3)throw Error("currently only support 2-dimensional conv");if(q[0].dims.length!==q[1].dims.length)throw Error("filter does not have same dimension as input");if(q[0].dims[v.format==="NHWC"?q[0].dims.length-1:1]!==q[1].dims[0])throw Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let x=q[1].dims[1]*v.group;if(q.length===3&&(q[2].dims.length!==1||q[2].dims[0]!==x))throw Error("invalid bias");let P=q[0].dims.length-2;if(v.dilations.reduce((F,M)=>F+M,0)>0&&v.dilations.length!==P)throw Error(`dilations should be ${P}D`);if(v.strides.reduce((F,M)=>F+M,0)>0&&v.strides.length!==P)throw Error(`strides should be ${P}D`);if(v.pads.reduce((F,M)=>F+M,0)>0&&v.pads.length!==2*P)throw Error(`pads should be ${2*P}D`);if(v.outputPadding.length!==P&&v.outputPadding.length!==0)throw Error(`output_padding should be ${P}D`);if(v.kernelShape.reduce((F,M)=>F+M,0)>0&&v.kernelShape.length!==0&&v.kernelShape.length!==q[1].dims.length-2)throw Error("invalid kernel shape");if(v.outputShape.length!==0&&v.outputShape.length!==q[0].dims.length-2)throw Error("invalid output shape")},f4=(q,v,x,P)=>{let F=q.kernelCustomData.wT??q.compute(A9(v[1],[2,3,0,1]),{inputs:[1],outputs:[x.wIsConst?-2:-1]})[0];x.wIsConst&&!q.kernelCustomData.wT&&(q.kernelCustomData.wT=F);let M=[v[0],F];v.length===3&&M.push(v[2]),q.compute(o$(M,x,P),{inputs:M})},A7=(q,v)=>{let x=v.format==="NHWC",P=[q.inputs[0].reshape(x?[q.inputs[0].dims[0],1,q.inputs[0].dims[1],q.inputs[0].dims[2]]:[q.inputs[0].dims[0],q.inputs[0].dims[1],1,q.inputs[0].dims[2]]),q.inputs[1].reshape([q.inputs[1].dims[0],q.inputs[1].dims[1],1,q.inputs[1].dims[2]])];q.inputs.length===3&&P.push(q.inputs[2]);let F=v.kernelShape;(F.length===0||F[0]===0)&&(F=[q.inputs[1].dims[2]]);let M=v.dilations;(M.length===0||M[0]===0)&&(M=[1]);let K=v.strides;(K.length===0||K[0]===0)&&(K=[1]);let C=v.pads;C.length===0&&(C=[0,0]),C=[0,C[0],0,C[1]],K=[1].concat(K),M=[1].concat(M),F=[1].concat(F);let h=v.outputPadding;h=[0].concat(h);let m=N4({...v,pads:C,strides:K,dilations:M,kernelShape:F,outputPadding:h},P);f4(q,P,m,(u)=>x?[u[0],u[2],u[3]]:[u[0],u[1],u[3]])},n$=(q,v)=>{if(r$(q.inputs,v),q.inputs[0].dims.length===3)A7(q,v);else{let x=N4(v,q.inputs);f4(q,q.inputs,x)}}}),uG=q0(()=>{q6(),X6(),S9(),T6(),g7=(q,v,x,P)=>{let F=B0.size(v),M=v.length,K=u0("input",q,M),C=h5("output",q,M),h=x.dataType===6?x.getInt32Array()[0]:Number(x.getBigInt64Array()[0]),m=B0.normalizeAxis(h,M);return{name:"CumSum",shaderCache:{hint:P.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:v,dataType:q}],dispatchGroup:{x:Math.ceil(F/64)},programUniforms:[{type:12,data:F},{type:12,data:m},...C5(v,v)]}),getShaderSource:(u)=>{let d=` i32(${K.indicesGet("inputIndices","uniforms.axis")}) `,o=B5("uniforms.input_shape","uniforms.axis",M),a=P.reverse?d+(P.exclusive?" + 1":""):"0",j0=P.reverse?o:d+(P.exclusive?"":" + 1");return` + ${u.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(K,C)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${C.offsetToIndices("global_idx")}; + var sum = ${C.type.value}(0); + let first : i32 = ${a}; + let last : i32 = ${j0}; + for (var i : i32 = first; i < last; i++) { + ${K.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${K.getByIndices("inputIndices")}; + } + ${C.setByOffset("global_idx","sum")}; + }`}}},t$=(q,v)=>{let x=q.inputs[0].dims,P=q.inputs[0].dataType,F=q.inputs[1];q.compute(g7(P,x,F,v),{inputs:[0]})},e$=(q)=>{let v=q.exclusive===1,x=q.reverse===1;return P6({exclusive:v,reverse:x})}}),aZ=q0(()=>{q6(),X6(),S9(),T6(),J4=(q)=>{if(!q||q.length!==1)throw Error("DepthToSpace requires 1 input.");if(q[0].dims.length!==4)throw Error("DepthToSpace requires 4D input.")},u7=(q,v,x,P)=>{let F=[];F.push(`fn perm(i: ${P.type.indices}) -> ${x.type.indices} { + var a: ${x.type.indices};`);for(let M=0;M{let x,P,F,M,K,C,h=v.format==="NHWC",m=v.blocksize,u=v.mode==="DCR";h?([x,P,F,M]=q.dims,K=u?[x,P,F,m,m,M/m**2]:[x,P,F,M/m**2,m,m],C=u?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([x,P,F,M]=[q.dims[0],q.dims[2],q.dims[3],q.dims[1]],K=u?[x,m,m,M/m**2,P,F]:[x,M/m**2,m,m,P,F],C=u?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let d=q.reshape(K),o=d.dims.length,a=q.dataType,j0=u0("a",a,o),U0=h5("output",a,o);return{name:"DepthToSpace",shaderCache:{hint:`${q.dims};${v.blocksize};${v.mode}`,inputDependencies:["rank"]},getRunData:(_0)=>{let H0=h?[x,P*m,F*m,M/m**2]:[x,M/m**2,P*m,F*m],Y0=B0.size(H0),k0=d.dims,D0=B0.sortBasedOnPerm(k0,C);return{outputs:[{dims:H0,dataType:_0[0].dataType}],dispatchGroup:{x:Math.ceil(Y0/64)},programUniforms:[{type:12,data:Y0},...C5(k0,D0)]}},getShaderSource:(_0)=>` + ${_0.registerUniform("output_size","u32").declareVariables(j0,U0)} + + ${u7(C,o,j0,U0)} + + ${_0.mainStart()} + ${_0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${U0.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${U0.setByOffset("global_idx",j0.getByIndices("aIndices"))} + }`}},jj=(q,v)=>{J4(q.inputs),q.compute($j(q.inputs[0],v))},Oj=(q)=>P6({blocksize:q.blocksize,mode:q.mode,format:q.format})}),rZ=q0(()=>{q6(),X6(),S9(),T6(),d7="^"+(E4="("+(w4="[a-zA-Z]|\\.\\.\\.")+")+")+"$",Gj="^("+E4+",)*"+E4+"$",l7=class{constructor(q=-1){this.symbolToIndices=new Map,this.inputIndex=q}addSymbol(q,v){let x=this.symbolToIndices.get(q);x===void 0?x=[v]:x.push(v),this.symbolToIndices.set(q,x)}},Zj=class{constructor(q,v){this.equation=v,this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=[],this.outputDims=[];let[x,P]=v.includes("->")?v.split("->",2):[v,""];if(!x.match(RegExp(Gj)))throw Error("Invalid LHS term");if(x.split(",").forEach((F,M)=>{let K=q[M].dims.slice();if(!F.match(RegExp(d7)))throw Error("Invalid LHS term");let C=this.processTerm(F,!0,K,M);this.lhs.push(C)}),P==="")P+=[...this.symbolToInfo.entries()].filter(([F,M])=>M.count===1||F==="...").map(([F])=>F).join("");else if(!P.match(RegExp(E4)))throw Error("Invalid RHS");P.match(RegExp(w4,"g"))?.forEach((F)=>{if(F==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let M=this.symbolToInfo.get(F);if(M===void 0)throw Error("Invalid RHS symbol");this.outputDims.push(M.dimValue)}}),this.rhs=this.processTerm(P,!1,this.outputDims)}addSymbol(q,v,x){let P=this.symbolToInfo.get(q);if(P!==void 0){if(P.dimValue!==v&&P.count!==1)throw Error("Dimension mismatch");P.count++,P.inputIndices.push(x)}else P={count:1,dimValue:v,inputIndices:[x]};this.symbolToInfo.set(q,P)}processTerm(q,v,x,P=-1){let F=x.length,M=!1,K=[],C=0;if(!q.match(RegExp(d7))&&!v&&q!=="")throw Error("Invalid LHS term");let h=q.match(RegExp(w4,"g")),m=new l7(P);return h?.forEach((u,d)=>{if(u==="..."){if(M)throw Error("Only one ellipsis is allowed per input term");M=!0;let o=F-h.length+1;if(o<0)throw Error("Ellipsis out of bounds");if(K=x.slice(C,C+o),this.hasEllipsis){if(this.ellipsisDims.length!==K.length||this.ellipsisDims.toString()!==K.toString())throw Error("Ellipsis dimensions mismatch")}else{if(!v)throw Error("Ellipsis must be specified in the LHS");this.hasEllipsis=!0,this.ellipsisDims=K}for(let a=0;aq+"_max",s7=(q,v,x,P)=>{let F=q.map((h)=>h.length).map((h,m)=>u0(`input${m}`,v,h)),M=B0.size(P),K=h5("output",v,P.length),C=[...x.symbolToInfo.keys()].filter((h)=>!x.rhs.symbolToIndices.has(h));return{name:"Einsum",shaderCache:{hint:x.equation,inputDependencies:q.map(()=>"rank")},getRunData:()=>{let h=C.filter((u)=>x.symbolToInfo.has(u)).map((u)=>({type:12,data:x.symbolToInfo.get(u)?.dimValue||0}));h.push({type:12,data:M});let m=q.map((u,d)=>[...C5(u)]).reduce((u,d)=>u.concat(d),h);return m.push(...C5(P)),{outputs:[{dims:P,dataType:v}],dispatchGroup:{x:Math.ceil(M/64)},programUniforms:m}},getShaderSource:(h)=>{let m=[],u=[],d=[],o=[],a=[],j0=x.symbolToInfo.size===x.rhs.symbolToIndices.size;x.symbolToInfo.forEach((_0,H0)=>{if(x.rhs.symbolToIndices.has(H0)){let Y0=x.rhs.symbolToIndices.get(H0)?.[0];Y0!==void 0&&x.lhs.forEach((k0,D0)=>{if(_0.inputIndices.includes(D0)){let b0=k0.symbolToIndices.get(H0);if(b0===void 0)throw Error("Invalid symbol error");b0.forEach((m0)=>{m.push(`${F[D0].indicesSet(`input${D0}Indices`,m0,K.indicesGet("outputIndices",Y0))}`)})}})}else x.lhs.forEach((Y0,k0)=>{if(_0.inputIndices.includes(k0)){let D0=Y0.symbolToIndices.get(H0);if(D0===void 0)throw Error("Invalid symbol error");D0.forEach((b0)=>{u.push(`${F[k0].indicesSet(`input${k0}Indices`,b0,`${H0}`)}`)}),a.push(`prod *= ${F[k0].getByIndices(`input${k0}Indices`)};`)}}),d.push(`for(var ${H0}: u32 = 0; ${H0} < uniforms.${o7(H0)}; ${H0}++) {`),o.push("}")});let U0=j0?[...m,`let sum = ${F.map((_0,H0)=>_0.getByIndices(`input${H0}Indices`)).join(" * ")};`]:[...m,"var sum = 0.0;",...d,...u,"var prod = 1.0;",...a,"sum += prod;",...o];return` + ${h.registerUniforms(C.map((_0)=>({name:`${o7(_0)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...F,K)} + + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${K.offsetToIndices("global_idx")}; + ${F.map((_0,H0)=>`var input${H0}Indices: ${F[H0].type.indices};`).join(` +`)} + ${U0.join(` +`)}; + ${K.setByOffset("global_idx","sum")}; + }`}}},qj=(q,v)=>{let x=new Zj(q.inputs,v.equation),P=x.outputDims,F=q.inputs.map((M,K)=>M.dims);q.compute(s7(F,q.inputs[0].dataType,x,P))},Vj=(q)=>{let v=q.equation.replace(/\s+/g,"");return P6({equation:v})}}),MV=q0(()=>{q6(),X6(),T6(),Nj=(q)=>{if(!q||q.length!==2)throw Error("Expand requires 2 input.");let v=q[0].dims,x=Array.from(q[1].getBigInt64Array(),Number),P=x.length{let x=q.length-v.length,P=[];for(let F=0;Fq.length>v.length?Q4(q,v):Q4(v,q),vj=(q)=>{let v=q[0].dims,x=Array.from(q[1].getBigInt64Array(),Number),P=Jj(v,x),F=q[0].dataType,M=F===9||B0.size(v)===1,K=F===9||v.length>0&&v[v.length-1]%4==0?4:1,C=M||P.length>0&&P[P.length-1]%4==0?4:1,h=Math.ceil(B0.size(P)/C),m=[{type:12,data:h},...C5(v,P)];return{name:"Expand",shaderCache:{hint:`${P.length};${K}${C}`,inputDependencies:["rank"]},getShaderSource:(u)=>{let d,o=u0("input",F,v.length,K),a=h5("output",F,P.length,C);if(F===9){let j0=(U0,_0,H0="")=>` + let outputIndices${_0} = ${a.offsetToIndices(`outputOffset + ${_0}u`)}; + let offset${_0} = ${o.broadcastedIndicesToOffset(`outputIndices${_0}`,a)}; + let index${_0} = offset${_0} / 4u; + let component${_0} = offset${_0} % 4u; + ${U0}[${_0}] = ${H0}(${o.getByOffset(`index${_0}`)}[component${_0}]); + `;d=` + let outputOffset = global_idx * ${C}; + var data = vec4(0); + ${j0("data",0,"u32")} + ${j0("data",1,"u32")} + ${j0("data",2,"u32")} + ${j0("data",3,"u32")} + ${a.setByOffset("global_idx","data")} + }`}else d=` + let outputIndices = ${a.offsetToIndices(`global_idx * ${C}`)}; + let inputOffset = ${o.broadcastedIndicesToOffset("outputIndices",a)}; + let data = ${a.type.value}(${o.getByOffset(`inputOffset / ${K}`)}); + ${a.setByOffset("global_idx","data")} + }`;return` + ${u.registerUniform("vec_size","u32").declareVariables(o,a)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${d}`},getRunData:()=>({outputs:[{dims:P,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:m})}},i7=(q)=>{Nj(q.inputs),q.compute(vj(q.inputs),{inputs:[0]})}}),nZ=q0(()=>{q6(),X6(),T6(),u6(),Rj=(q)=>{let v=q[0].dataType,x=B0.size(q[0].dims),P=B0.size(q[1].dims),F=P%4==0;return{name:"FastGeluWithBias",shaderCache:{hint:`${F}`,inputDependencies:["type","type"]},getShaderSource:(M)=>{let K=u0("x",v,[1],4),C=u0("bias",v,[1],4),h=h5("y",v,[1],4),m=(d)=>` + let bias${d}_offset: u32 = (global_idx * 4 + ${d}) % uniforms.bias_size; + let bias${d} = ${C.getByOffset(`bias${d}_offset / 4`)}[bias${d}_offset % 4];`,u=F?` + let bias = ${C.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${m(0)}${m(1)}${m(2)}${m(3)} + let bias = ${K.type.value}(bias0, bias1, bias2, bias3);`;return`${M.registerUniforms([{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}]).declareVariables(K,C,h)} + + ${S7(s6(v))} + + ${M.mainStart(Q6)} + ${M.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${K.getByOffset("global_idx")}; + ${u} + let x_in = x + bias; + ${h.setByOffset("global_idx",P7("x_in"))} + }`},getRunData:(M)=>({outputs:[{dims:M[0].dims,dataType:M[0].dataType}],programUniforms:[{type:12,data:Math.ceil(x/4)},{type:12,data:P}],dispatchGroup:{x:Math.ceil(x/Q6/4)}})}},Uj=(q)=>{q.inputs.length<2||B0.size(q.inputs[1].dims)===0?X7(q):q.compute(Rj(q.inputs))}}),tZ=q0(()=>{q6(),X6(),S9(),T6(),a7=(q)=>{if(!q||q.length!==2)throw Error("Gather requires 2 inputs.")},Hj=(q,v)=>{let x=q[0].dims,P=q[1].dims,F=x.length,M=B0.normalizeAxis(v.axis,F),K=x.slice(0);K.splice(M,1,...P);let C=x[M],h=q[0].dataType===9?4:1,m=Math.ceil(B0.size(K)/h),u=[{type:12,data:m},{type:6,data:C},{type:12,data:M},...C5(q[0].dims,q[1].dims,K)];return{name:"Gather",shaderCache:{hint:v.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:K,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:u}),getShaderSource:(d)=>{let o,a=u0("data",q[0].dataType,q[0].dims.length,h),j0=u0("inputIndices",q[1].dataType,q[1].dims.length),U0=h5("output",q[0].dataType,K.length,h),_0=(H0)=>{let Y0=P.length,k0=`var indicesIndices${H0} = ${j0.type.indices}(0);`;for(let D0=0;D01?`indicesIndices${H0}[${D0}]`:`indicesIndices${H0}`} = ${K.length>1?`outputIndices${H0}[uniforms.axis + ${D0}]`:`outputIndices${H0}`};`;k0+=` + var idx${H0} = ${j0.getByIndices(`indicesIndices${H0}`)}; + if (idx${H0} < 0) { + idx${H0} = idx${H0} + uniforms.axisDimLimit; + } + var dataIndices${H0} : ${a.type.indices}; + `;for(let D0=0,b0=0;D01?`dataIndices${H0}[${D0}]`:`dataIndices${H0}`} = u32(idx${H0});`,b0+=Y0):(k0+=`${F>1?`dataIndices${H0}[${D0}]`:`dataIndices${H0}`} = ${K.length>1?`outputIndices${H0}[${b0}]`:`outputIndices${H0}`};`,b0++);return k0};if(q[0].dataType===9){let H0=(Y0,k0,D0="")=>` + let outputIndices${k0} = ${U0.offsetToIndices(`outputOffset + ${k0}u`)}; + ${_0(k0)}; + let offset${k0} = ${a.indicesToOffset(`dataIndices${k0}`)}; + let index${k0} = offset${k0} / 4u; + let component${k0} = offset${k0} % 4u; + ${Y0}[${k0}] = ${D0}(${a.getByOffset(`index${k0}`)}[component${k0}]); + `;o=` + let outputOffset = global_idx * ${h}; + var value = vec4(0); + ${H0("value",0,"u32")} + ${H0("value",1,"u32")} + ${H0("value",2,"u32")} + ${H0("value",3,"u32")} + ${U0.setByOffset("global_idx","value")} + `}else o=` + let outputIndices = ${U0.offsetToIndices("global_idx")}; + ${_0("")}; + let value = ${a.getByIndices("dataIndices")}; + ${U0.setByOffset("global_idx","value")}; + `;return` + ${d.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(a,j0,U0)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${o} + }`}}},xj=(q)=>P6({axis:q.axis}),C4=(q,v)=>{let x=q.inputs;a7(x),q.compute(Hj(q.inputs,v))}}),eZ=q0(()=>{q6(),X6(),T6(),Lj=(q,v,x,P,F,M,K,C,h)=>{let m=[{type:12,data:M},{type:12,data:P},{type:12,data:F},{type:12,data:x},{type:12,data:K},{type:12,data:C},{type:12,data:h}],u=[M];return m.push(...C5(v.dims,u)),q.compute({name:"computeSliceOffsets",shaderCache:{hint:`${F.length}_${x.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:u,dataType:q.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(M/64)},programUniforms:m}),getShaderSource:(d)=>{let o=[u0("indices_data",v.dataType,v.dims.length),h5("input_slice_offsets_data",12,1,1)],a=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:F.length},{name:"sizes_from_slice_dims_data",type:"u32",length:x.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${d.registerUniforms(a).declareVariables(...o)} + ${d.mainStart()} + ${d.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${F.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${x.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`}},{inputs:[v],outputs:[-1]})[0]},_j=(q,v)=>{let x=q.inputs,P=x[0].dims,F=x[0].dataType,M=x[1].dims,K=M[M.length-1],C=B0.sizeToDimension(M,M.length-1),h=B0.sizeFromDimension(P,v.batchDims+K),m=B0.sizeToDimension(P,v.batchDims),u=B0.sizeFromDimension(P,v.batchDims),d=C/m,o=Array(K),a=h;for(let k0=0;k0P.length)throw Error("last dimension of indices must not be larger than rank of input tensor");let _0=M.slice(0,-1).concat(P.slice(U0)),H0=B0.size(_0),Y0=[{type:12,data:H0},{type:12,data:h},...C5(x[0].dims,j0.dims,_0)];q.compute({name:"GatherND",shaderCache:{hint:v.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:_0,dataType:F}],dispatchGroup:{x:Math.ceil(H0/64)},programUniforms:Y0}),getShaderSource:(k0)=>{let D0=u0("data",x[0].dataType,x[0].dims.length),b0=u0("slice_offsets",12,j0.dims.length),m0=h5("output",x[0].dataType,_0.length);return` + ${k0.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(D0,b0,m0)} + ${k0.mainStart()} + ${k0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`}},{inputs:[x[0],j0]})},Yj=(q)=>({batchDims:q.batch_dims,cacheKey:""})}),i4=q0(()=>{q6(),X6(),S9(),T6(),r7=(q,v)=>{if(q.length<3||q.length>4)throw Error("GatherBlockQuantized requires 3 or 4 inputs.");let x=B0.normalizeAxis(v.quantizeAxis,q[0].dims.length),P=v.blockSize,F=q[0],M=q[2],K=q.length===4?q[3]:void 0;if(M.dims.length!==F.dims.length||!F.dims.map((C,h)=>h===x?Math.ceil(C/P)===M.dims[h]:C===M.dims[h]).reduce((C,h)=>C&&h,!0))throw Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(K){if(K.dataType!==F.dataType)throw Error("Zero point must have the same data type as the input tensor.");if(K.dims.length!==M.dims.length||!K.dims.map((C,h)=>C===M.dims[h]).reduce((C,h)=>C&&h,!0))throw Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},Sj=(q,v)=>{let x=q[0].dims,P=q[1].dims,F=x.length,M=B0.normalizeAxis(v.gatherAxis,F),K=B0.normalizeAxis(v.quantizeAxis,F),C=x.slice(0);C.splice(M,1,...P);let h=B0.size(C),m=q[2].dataType,u=q[0].dataType===22,d=[{type:12,data:h},{type:12,data:K},{type:12,data:M},{type:12,data:v.blockSize},...C5(...q.map((o,a)=>o.dims),C)];return{name:"GatherBlockQuantized",shaderCache:{hint:`${v.cacheKey};${q.filter((o,a)=>a!==1).map((o)=>o.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:q.length},(o,a)=>"rank")},getRunData:()=>({outputs:[{dims:C,dataType:m}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:d}),getShaderSource:(o)=>{let a=u0("data",q[0].dataType,q[0].dims.length),j0=u0("inputIndices",q[1].dataType,q[1].dims.length),U0=u0("scales",q[2].dataType,q[2].dims.length),_0=q.length>3?u0("zeroPoint",q[3].dataType,q[3].dims.length):void 0,H0=h5("output",m,C.length),Y0=[a,j0,U0];return _0&&Y0.push(_0),` + ${o.registerUniforms([{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}]).declareVariables(...Y0,H0)} + ${o.mainStart()} + let output_indices = ${H0.offsetToIndices("global_idx")}; + var indices_indices = ${j0.type.indices}(0); + ${P.length>1?` + for (var i: u32 = 0; i < ${P.length}; i++) { + let index = ${H0.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${j0.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${H0.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${a.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${H0.indicesGet("output_indices","i")}; + ${a.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${j0.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${x[M]}; + } + ${a.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${C.length}; i++) { + let index = ${H0.indicesGet("output_indices",`i + ${P.length} - 1`)}; + ${a.indicesSet("data_indices","i","index")}; + } + let data_offset = ${a.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${a.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${u?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${U0.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${U0.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${U0.getByIndices("scale_indices")}; + ${_0?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${_0.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${_0.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${u?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${s6(m)}(quantized_data - zero_point) * scale; + ${H0.setByOffset("global_idx","dequantized_data")}; + }`}}},Pj=(q,v)=>{let x=q.inputs;r7(x,v),q.compute(Sj(q.inputs,v))},n7=(q)=>P6({blockSize:q.blockSize,gatherAxis:q.gatherAxis,quantizeAxis:q.quantizeAxis})}),$q=q0(()=>{q6(),X6(),S9(),T6(),Xj=(q)=>{if(!q||q.length!==2)throw Error("GatherElements requires 2 inputs.");if(q[0].dims.length<1)throw Error("GatherElements requires that the data input be rank >= 1.");if(q[0].dims.length!==q[1].dims.length)throw Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},Tj=(q,v)=>{let x=q[0].dims,P=q[0].dataType,F=x.length,M=q[1].dims,K=q[1].dataType,C=B0.normalizeAxis(v.axis,F),h=x[C],m=M.slice(0),u=B0.size(m),d=u0("input",P,F),o=u0("indicesInput",K,M.length),a=h5("output",P,m.length),j0=[{type:12,data:u},{type:6,data:h},{type:12,data:C}];return j0.push(...C5(x,M,m)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:m,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:j0}),getShaderSource:(U0)=>` + ${U0.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(d,o,a)} + ${U0.mainStart()} + ${U0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${a.offsetToIndices("global_idx")}; + + var idx = ${o.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${d.type.indices}(outputIndices); + ${d.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${d.getByIndices("inputIndices")}; + + ${a.setByOffset("global_idx","value")}; + }`}},Fj=(q)=>P6({axis:q.axis}),yj=(q,v)=>{let x=q.inputs;Xj(x),q.compute(Tj(q.inputs,v))}}),jq=q0(()=>{q6(),X6(),T6(),B4=(q)=>{if(!q)throw Error("Input is missing");if(q.length<2||q.length>3)throw Error("Invaid input number.");if(q.length===3&&q[2].dims.length>2)throw Error("Invalid input shape of C");if(q[0].dataType!==q[1].dataType||q.length===3&&q[0].dataType!==q[2].dataType)throw Error("Input types are mismatched")},zj=(q,v)=>{let x=q[0].dims.slice(),P=q[1].dims.slice(),[F,M,K]=g1.getShapeOfGemmResult(x,v.transA,P,v.transB,q.length===3?q[2].dims:void 0),C=[F,M];if(!C)throw Error("Can't use gemm on the given tensors");let h=16,m=Math.ceil(M/h),u=Math.ceil(F/h),d=(B0.size(C),[{type:12,data:m},{type:12,data:F},{type:12,data:M},{type:12,data:K},{type:1,data:v.alpha},{type:1,data:v.beta}]),o=["type","type"];return q.length===3&&(d.push(...C5(q[2].dims)),o.push("rank")),d.push(...C5(C)),{name:"GemmShared",shaderCache:{hint:`${v.cacheKey}`,inputDependencies:o},getRunData:()=>({outputs:[{dims:C,dataType:q[0].dataType}],dispatchGroup:{x:m*u},programUniforms:d}),getShaderSource:(a)=>{let j0=u0("a",q[0].dataType,q[0].dims),U0=u0("b",q[1].dataType,q[1].dims),_0=null,H0=[j0,U0];q.length===3&&(_0=u0("c",q[2].dataType,q[2].dims.length),H0.push(_0));let Y0=h5("output",q[0].dataType,C.length);H0.push(Y0);let k0="",D0="";v.transA&&v.transB?(D0=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${j0.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${U0.type.value}(0); + } + `,k0="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):v.transA&&!v.transB?(D0=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${j0.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${U0.type.value}(0); + } + `,k0="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!v.transA&&v.transB?(D0=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${j0.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${U0.type.value}(0); + } + `,k0="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!v.transA&&!v.transB&&(D0=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${j0.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${U0.type.value}(0); + } + `,k0="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let b0=v.alpha===1?"":"value *= uniforms.alpha;";return` + ${a.registerUniforms([{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}]).declareVariables(...H0)} + var tile_a: array, 16>; + var tile_b: array, 16>; + ${a.mainStart([h,h,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * 16; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * 16; + let num_tiles = (uniforms.K - 1) / 16 + 1; + var k_start = 0u; + var value = ${Y0.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${D0} + k_start = k_start + 16; + workgroupBarrier(); + + for (var k: u32 = 0u; k < 16; k++) { + ${k0} + } + workgroupBarrier(); + } + + ${b0} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${_0!=null?`let cOffset = ${_0.broadcastedIndicesToOffset("vec2(m, n)",Y0)}; value += ${Y0.type.value}(uniforms.beta) * ${_0.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`}}},kj=(q)=>({transA:q.transA,transB:q.transB,alpha:q.alpha,beta:q.beta,cacheKey:`${q.transA};${q.transB};${q.alpha===1}`}),Ij=(q,v)=>{B4(q.inputs),q.compute(zj(q.inputs,v))}}),Oq=q0(()=>{q6(),X6(),S9(),T6(),[G2,x2,N3,J3]=[0,1,2,3],Dj=(q)=>{if(q[0].dims.length!==4)throw Error("only 4-D tensor is supported.");if(q[0].dims.length!==q[1].dims.length)throw Error("input dimensions must be equal to grid dimensions");if(q[0].dims.length-2!==q[1].dims[q[1].dims.length-1])throw Error("last dimension of grid must be equal to "+(q[0].dims.length-2));if(q[0].dims[0]!==q[1].dims[0])throw Error("grid batch size must match input batch size")},Wj=(q)=>` + fn gs_bicubic_interpolate(p: mat4x4<${q}>, x: f32, y: f32) -> ${q} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${q}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,t7=(q)=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${q.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,Mj=(q)=>` + ${q.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,Kj=(q,v,x)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${v} { + var pixel = ${v}(0); + var indices = vec4(0); + indices[${G2}] = batch; + indices[${x2}] = channel;`+(()=>{switch(x.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${N3}] = u32(r); + indices[${J3}] = u32(c); + } else { + return ${v}(0); + } + `;case"border":return` + indices[${N3}] = u32(clamp(r, 0, H - 1)); + indices[${J3}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${N3}] = gs_reflect(r, border[1], border[3]); + indices[${J3}] = gs_reflect(c, border[0], border[2]); + `;default:throw Error(`padding mode ${x.paddingMode} is not supported`)}})()+` + return ${q.getByIndices("indices")}; + } +`,e7=(q,v,x)=>(()=>{switch(x.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${G2}], indices[${x2}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${G2}], indices[${x2}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${G2}], indices[${x2}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${G2}], indices[${x2}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${G2}], indices[${x2}], border); + + let dx2 = ${v}(f32(x2) - x); + let dx1 = ${v}(x - f32(x1)); + let dy2 = ${v}(f32(y2) - y); + let dy1 = ${v}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${v}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${G2}], indices[${x2}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw Error(`mode ${x.mode} is not supported`)}})()+`${q.setByOffset("global_idx","result")}`,bj=(q,v)=>{let x=u0("x",q[0].dataType,q[0].dims.length),P=[q[1].dims[0],q[1].dims[1],q[1].dims[2]],F=u0("grid",q[1].dataType,P.length,2),M=[q[0].dims[0],q[0].dims[1],q[1].dims[1],q[1].dims[2]];v.format==="NHWC"&&(M=[q[0].dims[0],q[1].dims[1],q[1].dims[2],q[0].dims[3]],[G2,x2,N3,J3]=[0,3,1,2]);let K=h5("output",q[0].dataType,M.length),C=x.type.value,h=[{type:12,data:B0.size(M)},...C5(q[0].dims,P,M)];return{name:"GridSample",shaderCache:{hint:`${v.cacheKey}`,inputDependencies:["type","type"]},getRunData:(m)=>{let u=B0.size(M);return{outputs:[{dims:M,dataType:m[0].dataType}],dispatchGroup:{x:Math.ceil(u/64)},programUniforms:h}},getShaderSource:(m)=>` + ${m.registerUniform("output_size","u32").declareVariables(x,F,K)} + + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } + + ${Wj(C)} + ${t7(v)} + ${Mj(v)} + ${Kj(x,C,v)} + + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${N3}]); + let W_in = i32(uniforms.x_shape[${J3}]); + + ${v.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${K.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${G2}], indices[${N3}], indices[${J3}]); + let nxy = ${F.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${e7(K,C,v)} + }`}},fj=(q,v)=>{Dj(q.inputs),q.compute(bj(q.inputs,v))},wj=(q)=>P6({alignCorners:q.align_corners,mode:q.mode,paddingMode:q.padding_mode,format:q.format})}),dG=q0(()=>{q6(),X6(),S9(),D8(),b8(),T6(),m2(),$1=(q,v)=>q.length>v&&q[v].dims.length>0?q[v]:void 0,$8=(q,v)=>{let x=q[0],P=$1(q,1),F=$1(q,2),M=$1(q,3),K=$1(q,4),C=$1(q,5),h=$1(q,6),m=$1(q,7);if(x.dims.length!==3&&x.dims.length!==5)throw Error("Input query is expected to have 3 or 5 dimensions");let u,d=x.dims[0],o=x.dims[1],a=x.dims.length===3?x.dims[2]:v.numHeads*x.dims[4],j0=o,U0=0,_0=0,H0=Math.floor(a/v.numHeads);if(h&&m&&B0.size(h.dims)&&B0.size(m.dims)){if(h.dims.length!==4)throw Error('Input "past_key" is expected to have 4 dimensions');if(h.dims[0]!==d||h.dims[1]!==v.numHeads||h.dims[3]!==H0)throw Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(m.dims[0]!==d||m.dims[1]!==v.numHeads||m.dims[3]!==H0)throw Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(h.dims[2]!==m.dims[2])throw Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(m.dims.length!==4)throw Error('Input "past_value" is expected to have 4 dimensions');U0=h.dims[2],_0=h.dims[2]}else if(h&&B0.size(h.dims)||m&&B0.size(m.dims))throw Error('Input "past_key" and "past_value" shall be both present or both absent');if(P&&B0.size(P.dims)>0){if(x.dims.length!==3)throw Error('Input "query" is expected to have 3 dimensions when key is given');if(P.dims.length<3||P.dims.length>5)throw Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(x.dims[0]!==P.dims[0])throw Error('Input "query" and "key" shall have same dim 0 (batch size)');if(P.dims.length===3){if(P.dims[2]!==x.dims[2])throw Error('Input "query" and "key" shall have same dim 2 (hidden_size)');u=2,j0=P.dims[1]}else if(P.dims.length===5){if(P.dims[2]!==v.numHeads||P.dims[3]!==2||P.dims[4]!==H0)throw Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(F)throw Error('Expect "value" be none when "key" has packed kv format.');u=5,j0=P.dims[1]}else{if(P.dims[1]!==v.numHeads||P.dims[3]!==H0)throw Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');u=0,j0=P.dims[2]}}else{if(x.dims.length!==5)throw Error('Input "query" is expected to have 5 dimensions when key is empty');if(x.dims[2]!==v.numHeads||x.dims[3]!==3)throw Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');u=3}if(M&&B0.size(M.dims)>0){if(M.dims.length!==1)throw Error('Input "bias" is expected to have 1 dimension');if(P&&P.dims.length===5&&P.dims[3]===2)throw Error("bias is not allowed for packed kv.")}let Y0=U0+j0,k0=0;if(K&&B0.size(K.dims)>0){k0=8;let m0=K.dims;throw m0.length===1?m0[0]===d?k0=1:m0[0]===3*d+2&&(k0=3):m0.length===2&&m0[0]===d&&m0[1]===Y0&&(k0=5),k0===8?Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):Error("Mask not supported")}let D0=!1,b0=a;if(F&&B0.size(F.dims)>0){if(F.dims.length!==3&&F.dims.length!==4)throw Error('Input "value" is expected to have 3 or 4 dimensions');if(x.dims[0]!==F.dims[0])throw Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(F.dims.length===3){if(j0!==F.dims[1])throw Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');b0=F.dims[2]}else{if(j0!==F.dims[2])throw Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');b0=F.dims[1]*F.dims[3],D0=!0}}if(K&&B0.size(K.dims)>0)throw Error("Key padding mask is not supported");if(C&&B0.size(C.dims)>0){if(C.dims.length!==4)throw Error('Input "attention_bias" is expected to have 4 dimensions');if(C.dims[0]!==d||C.dims[1]!==v.numHeads||C.dims[2]!==o||C.dims[3]!==Y0)throw Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:d,sequenceLength:o,pastSequenceLength:U0,kvSequenceLength:j0,totalSequenceLength:Y0,maxSequenceLength:_0,inputHiddenSize:0,hiddenSize:a,vHiddenSize:b0,headSize:H0,vHeadSize:Math.floor(b0/v.numHeads),numHeads:v.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:v.maskFilterValue,maskType:k0,scale:v.scale,broadcastResPosBias:!1,passPastInKv:D0,qkvFormat:u}},Ej=(q)=>P6({...q}),j8=P6({perm:[0,2,1,3]}),O8=(q,v,x,P,F,M,K)=>{let C=[P,F,M],h=B0.size(C),m=[{type:12,data:h},{type:12,data:K},{type:12,data:M}];return q.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:C,dataType:v.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(h/64)},programUniforms:m}),getShaderSource:(u)=>{let d=h5("qkv_with_bias",v.dataType,C),o=u0("qkv",v.dataType,C),a=u0("bias",x.dataType,C);return` + ${u.registerUniforms([{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}]).declareVariables(o,a,d)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`}},{inputs:[v,x],outputs:[-1]})[0]},v4=(q,v,x,P,F,M,K,C)=>{let h=M;if(K&&B0.size(K.dims)>0){if(P===1)throw Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return h=O8(q,M,K,v,P,x*F,C),h=h.reshape([v,P,x,F]),x===1||P===1?h:q.compute(A9(h,j8.perm),{inputs:[h],outputs:[-1]})[0]}return M.dims.length===3&&(h=M.reshape([v,P,x,F])),x===1||P===1?h:q.compute(A9(h,j8.perm),{inputs:[h],outputs:[-1]})[0]},Qj=(q,v)=>{let x=$8(q.inputs,v),P=q.inputs[0],F=$1(q.inputs,1),M=$1(q.inputs,2),K=$1(q.inputs,3),C=$1(q.inputs,4),h=$1(q.inputs,5),m=$1(q.inputs,6),u=$1(q.inputs,7);if(P.dims.length===5)throw Error("Packed QKV is not implemented");if(F?.dims.length===5)throw Error("Packed KV is not implemented");let d=F&&M&&F.dims.length===4&&M.dims.length===4,o=v4(q,x.batchSize,x.numHeads,x.sequenceLength,x.headSize,P,K,0);if(d)return v1(q,o,F,M,C,void 0,m,u,h,x);if(!F||!M)throw Error("key and value must be provided");let a=v4(q,x.batchSize,x.numHeads,x.kvSequenceLength,x.headSize,F,K,x.hiddenSize),j0=v4(q,x.batchSize,x.numHeads,x.kvSequenceLength,x.vHeadSize,M,K,2*x.hiddenSize);v1(q,o,a,j0,C,void 0,m,u,h,x)}}),lG=q0(()=>{q6(),X6(),S9(),T6(),G8=(q)=>{if(!q||q.length<1)throw Error("too few inputs")},Cj=(q,v)=>{let x=[],P=v.numOutputs;return q[1].dims[0]>0&&(q[1].getBigInt64Array().forEach((F)=>x.push(Number(F))),P=x.length),P6({numOutputs:P,axis:v.axis,splitSizes:x})},Bj=(q)=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${q}u; i += 1u ) { + if (index < ${B5("uniforms.size_in_split_axis","i",q)}) { + return i; + } + } + return ${q}u; +}`,Z8=(q)=>{let v=q.length,x=[];for(let P=0;P{let x=q[0].dims,P=B0.size(x),F=q[0].dataType,M=B0.normalizeAxis(v.axis,x.length),K=Array(v.numOutputs),C=u0("input",F,x.length),h=Array(v.numOutputs),m=[],u=[],d=0,o=[{type:12,data:P}];for(let a=0;a` + ${a.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",h.length).declareVariables(C,...K)} + ${Bj(h.length)} + ${Z8(K)} + + ${a.mainStart()} + ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${C.offsetToIndices("global_idx")}; + var index = ${C.indicesGet("indices",M)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${B5("uniforms.size_in_split_axis","output_number - 1u",h.length)}; + ${C.indicesSet("indices",M,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`,getRunData:()=>({outputs:m,dispatchGroup:{x:Math.ceil(P/64)},programUniforms:o})}},hj=(q,v)=>{G8(q.inputs);let x=q.inputs.length===1?v:Cj(q.inputs,v);q.compute(q8(q.inputs,x),{inputs:[0]})},cj=(q)=>{let{axis:v,splitSizes:x}=q,P=q.numOutputs<0?x.length:q.numOutputs;if(P!==x.length)throw Error("numOutputs and splitSizes lengh must be equal");return P6({axis:v,numOutputs:P,splitSizes:x})}}),oG=q0(()=>{q6(),X6(),S9(),T6(),mj=(q,v)=>{let[x,P,F,M]=q,{numHeads:K,rotaryEmbeddingDim:C}=v;if(x.dims.length!==3&&x.dims.length!==4)throw Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${x.dims.length}`);if(!B0.areEqual(P.dims,[])&&!B0.areEqual(P.dims,[1])&&P.dims.length!==2)throw Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${P.dims.length}`);if(F.dims.length!==2)throw Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${F.dims.length}`);if(M.dims.length!==2)throw Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${M.dims.length}`);if(!B0.areEqual(F.dims,M.dims))throw Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(C>0&&K===0)throw Error("num_heads must be provided if rotary_embedding_dim is specified");let h=x.dims[0],m=x.dims[x.dims.length-2],u=F.dims[0],d=B0.sizeFromDimension(x.dims,1)/m,o=C===0?2*F.dims[1]:d/K;if(C>o)throw Error("rotary_embedding_dim must be less than or equal to head_size");if(P.dims.length===2){if(h!==P.dims[0])throw Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${P.dims[0]}`);if(m!==P.dims[1])throw Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${P.dims[1]}`)}if(o/2!==F.dims[1]&&C/2!==F.dims[1])throw Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${F.dims[1]}`);if(m>u)throw Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},R4=(q,v)=>{let{interleaved:x,numHeads:P,rotaryEmbeddingDim:F,scale:M}=v,K=q[0].dims[0],C=B0.sizeFromDimension(q[0].dims,1),h=q[0].dims[q[0].dims.length-2],m=C/h,u=q[2].dims[1],d=F===0?2*u:m/P,o=[K,h,m/d,d-u],a=B0.computeStrides(o),j0=[{type:1,data:M},{type:12,data:o},{type:12,data:a},...q[0].dims.length===3?[{type:12,data:[C,m,d,1]}]:[],...q[0].dims.length===4?[{type:12,data:[C,d,h*d,1]}]:[],...C5(q[0].dims,q[1].dims,q[2].dims,q[3].dims,q[0].dims)];return{name:"RotaryEmbedding",shaderCache:{hint:P6({interleaved:x}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:(U0)=>{let _0=u0("input",q[0].dataType,q[0].dims.length),H0=u0("position_ids",q[1].dataType,q[1].dims.length),Y0=u0("cos_cache",q[2].dataType,q[2].dims.length),k0=u0("sin_cache",q[3].dataType,q[3].dims.length),D0=h5("output",q[0].dataType,q[0].dims.length);return U0.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:o.length},{name:"global_strides",type:"u32",length:a.length},{name:"input_output_strides",type:"u32",length:a.length}]),` + ${U0.declareVariables(_0,H0,Y0,k0,D0)} + + ${U0.mainStart(Q6)} + let half_rotary_emb_dim = uniforms.${Y0.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${U0.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${H0.broadcastedIndicesToOffset("bsnh.xy",h5("",H0.type.tensor,2))}; + let position_id = + u32(${H0.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${x}); + let j = i + select(half_rotary_emb_dim, 1, ${x}); + let re = ${_0.getByOffset("i")} * ${Y0.get("position_id","bsnh[3]")} - + ${_0.getByOffset("j")} * ${k0.get("position_id","bsnh[3]")}; + ${D0.setByOffset("i","re")} + let im = ${_0.getByOffset("i")} * ${k0.get("position_id","bsnh[3]")} + + ${_0.getByOffset("j")} * ${Y0.get("position_id","bsnh[3]")}; + ${D0.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${D0.setByOffset("k",_0.getByOffset("k"))} + } + }`},getRunData:()=>({outputs:[{dims:q[0].dims,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(B0.size(o)/Q6)},programUniforms:j0})}},pj=(q,v)=>{mj(q.inputs,v),q.compute(R4(q.inputs,v))}}),Gq=q0(()=>{S9(),q6(),b8(),dG(),lG(),m2(),oG(),T6(),Aj=(q,v)=>{if(v.doRotary&&q.length<=7)throw Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let x=q[0],P=q[1],F=q[2],M=q[3],K=q[4];if(v.doRotary!==0&&q.length<=7)throw Error("cos_cast and sin_cache are expected if do_rotary attribute is non-zero");if(v.localWindowSize!==-1)throw Error("Local attention is not supported");if(v.softcap!==0)throw Error("Softcap is not supported");if(v.rotaryInterleaved!==0)throw Error("Rotary interleaved is not supported");if(v.smoothSoftmax)throw Error("Smooth softmax is not supported");if(x.dims.length!==3&&x.dims.length!==5)throw Error("Input query is expected to have 3 or 5 dimensions");let C=x.dims[0],h=x.dims[1],m=x.dims.length===3?x.dims[2]:v.numHeads*x.dims[4],u=h,d=0,o=!P||P.dims.length===0,a=Math.floor(o?m/(v.numHeads+2*v.kvNumHeads):m/v.numHeads);o&&(m=a*v.numHeads);let j0=M&&M.dims.length!==0,U0=K&&K.dims.length!==0;if(j0&&M.dims.length===4&&M.dims[0]===C&&M.dims[1]!==v.kvNumHeads&&M.dims[2]===v.kvNumHeads&&M.dims[3]===a)throw Error("BSNH pastKey/pastValue is not supported");if(j0&&U0){if(M.dims.length!==4)throw Error('Input "past_key" is expected to have 4 dimensions');if(K.dims.length!==4)throw Error('Input "past_value" is expected to have 4 dimensions');d=M.dims[2]}else if(j0||U0)throw Error('Input "past_key" and "past_value" shall be both present or both absent');let _0=1;if(P&&P.dims.length>0){if(x.dims.length!==3)throw Error('Input "query" is expected to have 3 dimensions when key is given');if(P.dims.length<3||P.dims.length>5)throw Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(x.dims[0]!==P.dims[0])throw Error('Input "query" and "key" shall have same dim 0 (batch size)');if(P.dims.length===3){if(x.dims[2]%P.dims[2]!==0)throw Error('Dimension 2 of "query" should be a multiple of "key"');u=P.dims[1]}else if(P.dims.length===5){if(P.dims[2]!==v.numHeads||P.dims[3]!==2||P.dims[4]!==a)throw Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(F)throw Error('Expect "value" be none when "key" has packed kv format.');u=P.dims[1]}else{if(P.dims[1]!==v.numHeads||P.dims[3]!==a)throw Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');u=P.dims[2]}}else{if(x.dims.length!==3&&x.dims.length!==5)throw Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(x.dims.length===5&&(x.dims[2]!==v.numHeads||x.dims[3]!==3))throw Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');_0=3}let H0=!1,Y0=v.kvNumHeads?a*v.kvNumHeads:m;if(F&&F.dims.length>0){if(F.dims.length!==3&&F.dims.length!==4)throw Error('Input "value" is expected to have 3 or 4 dimensions');if(x.dims[0]!==F.dims[0])throw Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(F.dims.length===3){if(u!==F.dims[1])throw Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');Y0=F.dims[2]}else{if(u!==F.dims[2])throw Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');Y0=F.dims[1]*F.dims[3],H0=!0}}let k0=q.length>4?q[5]:void 0;if(k0&&k0.dims.length!==1&&k0.dims[0]!==C)throw Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:C,sequenceLength:h,pastSequenceLength:d,kvSequenceLength:u,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:m,vHiddenSize:Y0,headSize:a,vHeadSize:Math.floor(Y0/v.kvNumHeads),numHeads:v.numHeads,kvNumHeads:v.kvNumHeads,nReps:v.numHeads/v.kvNumHeads,pastPresentShareBuffer:!1,maskType:0,scale:v.scale,broadcastResPosBias:!1,passPastInKv:H0,qkvFormat:_0}},gj=P6({perm:[0,2,1,3]}),V8=(q,v,x)=>{let P=v,F=x.kvNumHeads;return v.dims.length===3&&x.kvSequenceLength!==0&&(P=v.reshape([x.batchSize,x.kvSequenceLength,F,x.headSize]),P=q.compute(A9(P,gj.perm),{inputs:[P],outputs:[-1]})[0]),P},uj=(q,v,x,P)=>{let F=[q*v],M=q*v,K=[{type:12,data:M},{type:12,data:v},{type:12,data:q}];return{name:"GeneratePositionIds",shaderCache:{hint:`${q};${v}`,inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:F,dataType:7}],dispatchGroup:{x:Math.ceil(M/64)},programUniforms:K}),getShaderSource:(C)=>{let h=u0("seq_lens",x.dataType,x.dims),m=u0("total_seq_lens",P.dataType,P.dims),u=h5("pos_ids",7,F);return` + ${C.registerUniforms([{name:"output_size",type:"u32"},{name:"sequence_length",type:"u32"},{name:"batch_size",type:"u32"}]).declareVariables(h,m,u)} + ${C.mainStart()} + ${C.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let total_sequence_length = u32(${m.getByOffset("0")}); + let is_subsequent_prompt = uniforms.sequence_length > 1 && uniforms.sequence_length != total_sequence_length; + let is_first_prompt = !is_subsequent_prompt && uniforms.sequence_length == total_sequence_length; + let batch_idx = global_idx / uniforms.sequence_length; + let sequence_idx = i32(global_idx % uniforms.sequence_length); + var pos_id: i32 = 0; + let seqlen = ${h.getByOffset("batch_idx")}; + let total_seqlen = seqlen + 1; + if (is_first_prompt) { + if (sequence_idx < total_seqlen) { + pos_id = sequence_idx; + } else { + pos_id = 1; + } + ${u.setByOffset("global_idx","pos_id")} + } else if (is_subsequent_prompt) { + let past_seqlen = total_seqlen - i32(uniforms.sequence_length); + if (past_seqlen + sequence_idx < total_seqlen) { + pos_id = past_seqlen + sequence_idx; + } else { + pos_id = 1; + } + ${u.setByOffset("global_idx","pos_id")} + } else if (global_idx < uniforms.batch_size) { + ${u.setByOffset("global_idx","seqlen")} + }; + } + `}}},dj=(q,v)=>{let x=Aj(q.inputs,v);if(q.inputs[0].dims.length===5)throw Error("Packed QKV is not implemented");if(q.inputs[1]?.dims.length===5)throw Error("Packed KV is not implemented");let P,F,M=q.inputs[0],K=q.inputs[1]&&q.inputs[1].dims.length>0?q.inputs[1]:void 0,C=q.inputs[2]&&q.inputs[2].dims.length>0?q.inputs[2]:void 0,h=q.inputs[3]&&q.inputs[3].dims.length!==0?q.inputs[3]:void 0,m=q.inputs[4]&&q.inputs[4].dims.length!==0?q.inputs[4]:void 0,u=q.inputs.length>4?q.inputs[5]:void 0,d=q.inputs.length>5?q.inputs[6]:void 0,o=x.kvNumHeads?x.kvNumHeads:x.numHeads,a=P6({axis:2,numOutputs:3,splitSizes:[x.numHeads*x.headSize,o*x.headSize,o*x.headSize]}),[j0,U0,_0]=K||C?[M,K,C]:q.compute(q8([M],a),{inputs:[M],outputs:[-1,-1,-1]});if(v.doRotary){let D0=q.compute(uj(x.batchSize,x.sequenceLength,u,d),{inputs:[u,d],outputs:[-1]})[0],b0=q.inputs[7],m0=q.inputs[8],x5=P6({interleaved:v.rotaryInterleaved!==0,numHeads:x.numHeads,rotaryEmbeddingDim:0,scale:v.scale}),f5=[j0,D0,b0,m0],c5=[-1];P=q.compute(R4(f5,x5),{inputs:f5,outputs:c5})[0],f5.splice(0,1,U0);let l5=P6({interleaved:v.rotaryInterleaved!==0,numHeads:x.kvNumHeads,rotaryEmbeddingDim:0,scale:v.scale});F=q.compute(R4(f5,l5),{inputs:f5,outputs:c5})[0]}let H0=v4(q,x.batchSize,x.numHeads,x.sequenceLength,x.headSize,v.doRotary?P:j0,void 0,0),Y0=V8(q,v.doRotary?F:U0,x),k0=V8(q,_0,x);v1(q,H0,Y0,k0,void 0,void 0,h,m,void 0,x,u,d)}}),Zq=q0(()=>{q6(),X6(),m2(),T6(),h4=(q,v,x,P,F,M,K,C)=>{let h=k6(M),m=h===1?"f32":`vec${h}f`,u=h===1?"vec2f":`mat2x${h}f`,d=F*K,o=64;d===1&&(o=256);let a=[F,K,M/h],j0=[F,K,2],U0=[];return U0.push(...C5(a,j0)),q.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${h};${C};${o}`,inputDependencies:["rank","type","type"]},getRunData:()=>({outputs:[{dims:j0,dataType:1}],dispatchGroup:{x:d},programUniforms:U0}),getShaderSource:(_0)=>{let H0=u0("x",v.dataType,3,h),Y0=[H0,u0("scale",x.dataType,x.dims),u0("bias",P.dataType,P.dims),h5("output",1,3,2)];return` + var workgroup_shared : array<${u}, ${o}>; + const workgroup_size = ${o}u; + ${_0.declareVariables(...Y0)} + ${_0.mainStart(o)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${m}(0); + var squared_sum = ${m}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${m}(${H0.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${u}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${B6("workgroup_shared[0][0]",h)} / f32(hight * ${h}); + let squared_sum_final = ${B6("workgroup_shared[0][1]",h)} / f32(hight * ${h}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${C})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`}},{inputs:[v,x,P],outputs:[-1]})[0]},lj=(q,v,x)=>{let P=v[0].dims,F=P,M=P[0],K=P[1],C=B0.sizeFromDimension(P,2),h=k6(C),m=B0.size(F)/h,u=h4(q,v[0],v[1],v[2],M,C,K,x.epsilon),d=[M,K,C/h],o=[M,K];q.compute({name:"InstanceNormalization",shaderCache:{hint:`${h}`,inputDependencies:["type","none"]},getRunData:()=>({outputs:[{dims:F,dataType:v[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:[{type:12,data:m},...C5(d,o,d)]}),getShaderSource:(a)=>{let j0=u0("x",v[0].dataType,d.length,h),U0=u0("scale_shift",1,o.length,2),_0=h5("output",v[0].dataType,d.length,h),H0=[j0,U0,_0];return` + ${a.registerUniform("output_size","u32").declareVariables(...H0)} + ${a.mainStart()} + ${a.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${_0.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${U0.getByIndices("vec2(batch, channel)")}; + let value = ${j0.getByOffset("global_idx")} * ${_0.type.value}(scale_shift.x) + ${_0.type.value}(scale_shift.y); + ${_0.setByOffset("global_idx","value")}; + }`}},{inputs:[v[0],u]})},oj=(q,v,x)=>{let P=v[0].dims,F=P,M=P[0],K=P[P.length-1],C=B0.sizeFromDimension(P,1)/K,h=k6(K),m=B0.size(F)/h,u=[{type:12,data:C},{type:12,data:Math.floor(K/h)}],d=!1,o=[0,P.length-1];for(let U0=0;U0P[o[_0]])),j0=h4(q,a,v[1],v[2],M,C,K,x.epsilon);q.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${h}`,inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:F,dataType:v[0].dataType}],dispatchGroup:{x:Math.ceil(m/64)},programUniforms:u}),getShaderSource:(U0)=>{let _0=N6(v[0].dataType),H0=h===1?"vec2f":`mat${h}x2f`,Y0=(b0)=>{let m0=b0===0?"x":"y",x5=h===1?"f32":`vec${h}f`;switch(h){case 1:return`${_0}(${x5}(scale.${m0}))`;case 2:return`vec2<${_0}>(${x5}(scale[0].${m0}, scale[1].${m0}))`;case 4:return`vec4<${_0}>(${x5}(scale[0].${m0}, scale[1].${m0}, scale[2].${m0}, scale[3].${m0}))`;default:throw Error(`Not supported compoents ${h}`)}},k0=u0("input",v[0].dataType,v[0].dims,h),D0=h5("output",v[0].dataType,F,h);return` + @group(0) @binding(0) var input : array<${k0.type.storage}>; + @group(0) @binding(1) var scale_input : array<${H0}>; + @group(0) @binding(2) var output : array<${D0.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${U0.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${Y0(0)}, ${Y0(1)}); + }`}},{inputs:[v[0],j0]})},N8=(q,v)=>{v.format==="NHWC"?oj(q,q.inputs,v):lj(q,q.inputs,v)}}),KV=q0(()=>{q6(),X6(),T6(),sj=(q)=>{if(!q||q.length<2)throw Error("layerNorm requires at least 2 inputs.")},ij=(q,v,x)=>{let P=v.simplified,F=q[0].dims,M=q[1],K=!P&&q[2],C=F,h=B0.normalizeAxis(v.axis,F.length),m=B0.sizeToDimension(F,h),u=B0.sizeFromDimension(F,h),d=B0.size(M.dims),o=K?B0.size(K.dims):0;if(d!==u||K&&o!==u)throw Error(`Size of X.shape()[axis:] == ${u}. + Size of scale and bias (if provided) must match this. + Got scale size of ${d} and bias size of ${o}`);let a=[];for(let D0=0;D01,Y0=x>2,k0=[{dims:C,dataType:q[0].dataType}];return H0&&k0.push({dims:a,dataType:1}),Y0&&k0.push({dims:a,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${j0};${x};${P}`,inputDependencies:U0},getRunData:()=>({outputs:k0,dispatchGroup:{x:Math.ceil(m/64)},programUniforms:_0}),getShaderSource:(D0)=>{let b0=N6(q[0].dataType),m0=[u0("x",q[0].dataType,q[0].dims,j0),u0("scale",M.dataType,M.dims,j0)];return K&&m0.push(u0("bias",K.dataType,K.dims,j0)),m0.push(h5("output",q[0].dataType,C,j0)),H0&&m0.push(h5("mean_data_output",1,a)),Y0&&m0.push(h5("inv_std_output",1,a)),` + ${D0.registerUniforms([{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}]).declareVariables(...m0)} + ${D0.mainStart()} + ${D0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${E9("f32",j0)}; + var mean_square_vector = ${E9("f32",j0)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${R9(b0,j0,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${B6("mean_vector",j0)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${B6("mean_square_vector",j0)} / uniforms.norm_size ${P?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${R9(b0,j0,"x[j + offset]")}; + let f32scale = ${R9(b0,j0,"scale[j]")}; + output[j + offset] = ${m0[0].type.value}((f32input ${P?"":"- mean"}) * inv_std_dev * f32scale + ${K?`+ ${R9(b0,j0,"bias[j]")}`:""} + ); + } + + ${H0?"mean_data_output[global_idx] = mean":""}; + ${Y0?"inv_std_output[global_idx] = inv_std_dev":""}; + }`}}},c2=(q,v)=>{sj(q.inputs),q.compute(ij(q.inputs,v,q.outputCount))}}),qq=q0(()=>{X6(),$G(),jG(),aj=(q)=>{if(!q||q.length!==2)throw Error("MatMul requires 2 inputs.");if(q[0].dims[q[0].dims.length-1]!==q[1].dims[q[1].dims.length-2])throw Error("shared dimension does not match.")},rj=(q)=>{aj(q.inputs);let v=p6.calcShape(q.inputs[0].dims,q.inputs[1].dims,!0);if(!v)throw Error("Can't use matmul on the given tensors");let x=v[v.length-1],P=q.inputs[0].dims[q.inputs[0].dims.length-1];if(x<8&&P<8)q.compute(K7(q.inputs,{activation:""},v));else{let F=v[v.length-2],M=B0.size(q.inputs[0].dims.slice(0,-2)),K=B0.size(q.inputs[1].dims.slice(0,-2));if(M!==1&&F===1&&K===1){let C=[1,M,x],h=[q.inputs[0].reshape([1,M,P]),q.inputs[1].reshape([1,P,x])];q.compute(M4(h,{activation:""},v,C),{inputs:h})}else q.compute(M4(q.inputs,{activation:""},v))}}}),Vq=q0(()=>{q6(),X6(),S9(),T6(),nj=(q,v)=>{if(q.length<3||q.length>4)throw Error("MatMulNBits requires 3 or 4 inputs");let x=q[0],P=x.dims.length;if(x.dims[P-1]!==v.k)throw Error("The last dim of input shape does not match the k value");let F=Math.floor((v.k+v.blockSize-1)/v.blockSize),M=v.blockSize/8*v.bits,K=q[1];if(!B0.areEqual(K.dims,[v.n,F,M]))throw Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let C=q[2].dims;if(B0.size(C)!==v.n*F)throw Error("scales input size error.");if(q.length===4){let h=q[3].dims,m=v.bits>4?v.n*F:v.n*Math.floor((F+1)/2);if(B0.size(h)!==m)throw Error("zeroPoints input size error.")}},tj=(q,v)=>{let x=q[0].dims,P=x.length,F=x[P-2],M=v.k,K=v.n,C=x.slice(0,P-2),h=B0.size(C),m=q[1].dims[2]/4,u=q[0].dataType,d=k6(v.k),o=k6(m),a=k6(K),j0=C.concat([F,K]),U0=F>1&&K/a%2==0?2:1,_0=B0.size(j0)/a/U0,H0=64,Y0=[],k0=[h,F,M/d],D0=B0.convertShape(q[1].dims).slice();D0.splice(-1,1,m/o),Y0.push(...C5(k0)),Y0.push(...C5(D0)),Y0.push(...C5(q[2].dims)),q.length===4&&Y0.push(...C5(B0.convertShape(q[3].dims)));let b0=[h,F,K/a];return Y0.push(...C5(b0)),{name:"MatMulNBits",shaderCache:{hint:`${v.blockSize};${v.bits};${d};${o};${a};${U0};64`,inputDependencies:Array(q.length).fill("rank")},getRunData:()=>({outputs:[{dims:j0,dataType:u}],dispatchGroup:{x:_0},programUniforms:Y0}),getShaderSource:(m0)=>{let x5=k0.length,f5=u0("a",q[0].dataType,x5,d),c5=u0("b",12,D0.length,o),l5=u0("scales",q[2].dataType,q[2].dims.length),G6=[f5,c5,l5],y6=q.length===4?u0("zero_points",12,q[3].dims.length):void 0;y6&&G6.push(y6);let A6=b0.length,w5=h5("output",q[0].dataType,A6,a),i0=N6(q[0].dataType),z5=(()=>{switch(d){case 1:return`array<${i0}, 8>`;case 2:return`mat4x2<${i0}>`;case 4:return`mat2x4<${i0}>`;default:throw Error(`${d}-component is not supported.`)}})();return` + var workgroup_shared: array<${w5.type.value}, ${U0*H0}>; + ${m0.declareVariables(...G6,w5)} + ${m0.mainStart([H0,1,1])} + let output_indices = ${w5.offsetToIndices(`(global_idx / 64) * ${U0}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += 64) { + //process one block + var word_offset: u32 = block * ${v.blockSize/d}; + ${(()=>{let s5=` + var col_index = col * ${a}; + ${y6?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${i0}(8);`} + `;for(let r5=0;r5> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${y6.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${r5} = ${i0}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return s5})()} + for (var word: u32 = 0; word < ${m}; word += ${o}) { + ${(()=>{let s5=`col_index = col * ${a};`;for(let r5=0;r5; + var b_value_upper: vec4; + var b_quantized_values: ${z5}; + var b_dequantized_values: ${z5};`,s5})()} + for (var i: u32 = 0; i < ${o}; i++) { + ${(()=>{let s5=` + // reuse a data + var input_offset = ${f5.indicesToOffset(`${f5.type.indices}(batch, row, word_offset)`)}; + var a_data: ${z5}; + for (var j: u32 = 0; j < ${8/d}; j++) { + a_data[j] = ${f5.getByOffset("input_offset")}; + input_offset++; + } + `;for(let r5=0;r5> 4) & b_mask); + b_quantized_values = ${z5}(${Array.from({length:4},(P9,f6)=>`${i0}(b_value_lower[${f6}]), ${i0}(b_value_upper[${f6}])`).join(", ")}); + b_dequantized_values = ${d===1?`${z5}(${Array.from({length:8},(P9,f6)=>`(b_quantized_values[${f6}] - ${y6?`zero_point${r5}`:"zero_point"}) * scale${r5}`).join(", ")});`:`(b_quantized_values - ${z5}(${Array(8).fill(y6?`zero_point${r5}`:"zero_point").join(",")})) * scale${r5};`}; + workgroup_shared[local_id.x * ${U0} + ${Math.floor(r5/a)}]${a>1?`[${r5%a}]`:""} += ${Array.from({length:8/d},(P9,f6)=>d===1?`a_data[${f6}] * b_dequantized_values[${f6}]`:`dot(a_data[${f6}], b_dequantized_values[${f6}])`).join(" + ")}; + `;return s5})()} + word_offset += ${8/d}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${U0}) { + var output_value: ${w5.type.value} = ${w5.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < 64u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${U0}; + } + ${w5.setByIndices(`${w5.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`}}},J8=(q,v)=>{let x=q[0].dims,P=x.length,F=x[P-2],M=v.k,K=v.n,C=x.slice(0,P-2),h=B0.size(C),m=q[1].dims[2]/4,u=q[0].dataType,d=k6(v.k),o=k6(m),a=C.concat([F,K]),j0=K%8==0?8:K%4==0?4:1,U0=128/j0,_0=U0*o*8,H0=_0/d,Y0=_0/v.blockSize,k0=B0.size(a)/j0,D0=[],b0=[h,F,M/d],m0=B0.convertShape(q[1].dims).slice();m0.splice(-1,1,m/o),D0.push(...C5(b0)),D0.push(...C5(m0)),D0.push(...C5(q[2].dims)),q.length===4&&D0.push(...C5(B0.convertShape(q[3].dims)));let x5=[h,F,K];return D0.push(...C5(x5)),{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${v.blockSize};${d};${o};${U0};${j0}`,inputDependencies:Array(q.length).fill("rank")},getRunData:()=>({outputs:[{dims:a,dataType:u}],dispatchGroup:{x:k0},programUniforms:D0}),getShaderSource:(f5)=>{let c5=b0.length,l5=u0("a",q[0].dataType,c5,d),G6=u0("b",12,m0.length,o),y6=u0("scales",q[2].dataType,q[2].dims.length),A6=[l5,G6,y6],w5=q.length===4?u0("zero_points",12,q[3].dims.length):void 0;w5&&A6.push(w5);let i0=x5.length,z5=h5("output",q[0].dataType,i0),s5=N6(q[0].dataType);return` + var sub_a: array<${l5.type.value}, ${H0}>; + var inter_results: array, ${j0}>; + ${f5.declareVariables(...A6,z5)} + ${f5.mainStart([U0,j0,1])} + let output_indices = ${z5.offsetToIndices(`workgroup_index * ${j0}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${Y0} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${H0}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${H0}; a_offset += 128) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${l5.getByIndices(`${l5.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${l5.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${Y0} + local_id.x; + ${w5?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${w5.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${s5}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${s5}(8);`} + let scale = ${y6.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${G6.getByIndices(`${G6.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${v.blockSize/d}; + for (var i: u32 = 0; i < ${o}; i++) { + ${(()=>{switch(d){case 1:return` + let a_data0 = vec4<${s5}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${s5}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${s5}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${s5}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw Error(`${d}-component is not supported.`)}})()} + let b_value = ${o===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${s5}>(${Array.from({length:4},(r5,P9)=>`${s5}(b_value_lower[${P9}]), ${s5}(b_value_upper[${P9}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${s5}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(r5,P9)=>`dot(a_data${P9}, b_dequantized_values[${P9}])`).join(" + ")}; + word_offset += ${8/d}; + } + workgroupBarrier(); + } + + if (local_idx < ${j0}) { + var output_value: ${z5.type.value} = ${z5.type.value}(0); + for (var b = 0u; b < ${U0}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${z5.setByIndices(`${z5.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`}}},ej=(q,v)=>{nj(q.inputs,v),v.blockSize===32&&q.adapterInfo.isVendor("intel")&&q.adapterInfo.isArchitecture("gen-12lp")?q.compute(J8(q.inputs,v)):q.compute(tj(q.inputs,v))},$O=(q)=>P6(q)}),Nq=q0(()=>{q6(),X6(),T6(),jO=(q)=>{if(!q||q.length<1)throw Error("Too few inputs");if(q[0].dataType!==1&&q[0].dataType!==10)throw Error("Input type must be float or float16.");if(q.length>=2){let v=2*q[0].dims.length===q[1].dims[0];if(q.length===4&&(v=2*q[3].dims[0]===q[1].dims[0]),!v)throw Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},OO=(q,v,x)=>{let P="";for(let F=v-1;F>=0;--F)P+=` + k = i32(${q.indicesGet("indices",F)}) - ${B5("uniforms.pads",F,x)}; + if (k < 0) { + break; + } + if (k >= i32(${B5("uniforms.x_shape",F,v)})) { + break; + } + offset += k * i32(${B5("uniforms.x_strides",F,v)}); + `;return` + value = ${q.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${P} + value = x[offset]; + } + `},c4=(q,v,x)=>{let P="";for(let F=v-1;F>=0;--F)P+=` + k = i32(${q.indicesGet("indices",F)}) - ${B5("uniforms.pads",F,x)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${B5("uniforms.x_shape",F,v)}) - 1); + k = k % _2n_1; + if(k >= i32(${B5("uniforms.x_shape",F,v)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${B5("uniforms.x_strides",F,v)}); + `;return` + var offset = 0; + var k = 0; + ${P} + value = x[offset]; + `},GO=(q,v,x)=>{let P="";for(let F=v-1;F>=0;--F)P+=` + k = i32(${q.indicesGet("indices",F)}) - ${B5("uniforms.pads",F,x)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${B5("uniforms.x_shape",F,v)})) { + k = i32(${B5("uniforms.x_shape",F,v)}) - 1; + } + offset += k * i32(${B5("uniforms.x_strides",F,v)}); + `;return` + var offset = 0; + var k = 0; + ${P} + value = x[offset]; + `},ZO=(q,v,x)=>{let P="";for(let F=v-1;F>=0;--F)P+=` + k = i32(${q.indicesGet("indices",F)}) - ${B5("uniforms.pads",F,x)}; + if (k < 0) { + k += i32(${B5("uniforms.x_shape",F,v)}]); + } + if (k >= i32(${B5("uniforms.x_shape",F,v)})) { + k -= i32(${B5("uniforms.x_shape",F,v)}); + } + offset += k * i32(${B5("uniforms.x_strides",F,v)}); + `;return` + var offset = 0; + var k = 0; + ${P} + value = x[offset]; + `},qO=(q,v,x)=>{switch(x.mode){case 0:return OO(q,v,x.pads.length);case 1:return c4(q,v,x.pads.length);case 2:return GO(q,v,x.pads.length);case 3:return ZO(q,v,x.pads.length);default:throw Error("Invalid mode")}},U4=(q,v)=>{let x=B0.padShape(q[0].dims.slice(),v.pads),P=q[0].dims,F=[{type:12,data:B0.size(x)},{type:6,data:v.pads}],M=q.length>=3&&q[2].data;return v.mode===0&&F.push({type:M?q[2].dataType:1,data:v.value}),F.push(...C5(q[0].dims,x)),{name:"Pad",shaderCache:{hint:`${v.mode}${M}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:x,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(B0.size(x)/64)},programUniforms:F}),getShaderSource:(K)=>{let C=h5("output",q[0].dataType,x.length),h=u0("x",q[0].dataType,P.length),m=h.type.value,u=qO(C,P.length,v),d=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:v.pads.length}];return v.mode===0&&d.push({name:"constant_value",type:M?m:"f32"}),` + ${K.registerUniforms(d).declareVariables(h,C)} + ${K.mainStart()} + ${K.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${C.offsetToIndices("global_idx")}; + + var value = ${m}(0); + ${u} + output[global_idx] = value; + }`}}},VO=(q,v)=>{if(q.length>1){let x=q[1].getBigInt64Array(),P=q.length>=3&&q[2].data?q[2].dataType===10?q[2].getUint16Array()[0]:q[2].getFloat32Array()[0]:0,F=q[0].dims.length,M=new Int32Array(2*F).fill(0);if(q.length>=4){let C=q[3].getBigInt64Array();for(let h=0;hM[Number(h)]=Number(C));let K=[];return M.forEach((C)=>K.push(C)),{mode:v.mode,value:P,pads:K}}return v},NO=(q,v)=>{jO(q.inputs);let x=VO(q.inputs,v);q.compute(U4(q.inputs,x),{inputs:[0]})}}),Jq=q0(()=>{d5(),q6(),X6(),T6(),H4=(q)=>{if(H.webgpu.validateInputContent&&(!q||q.length!==1))throw Error("Pool ops requires 1 input.")},v8=(q,v,x)=>{let P=v.format==="NHWC",F=q.dims.slice();P&&F.splice(1,0,F.pop());let M=Object.hasOwnProperty.call(v,"dilations"),K=v.kernelShape.slice(),C=v.strides.slice(),h=M?v.dilations.slice():[],m=v.pads.slice();P1.adjustPoolAttributes(x,F,K,C,h,m);let u=P1.computePoolOutputShape(x,F,C,h,K,m,v.autoPad),d=Object.assign({},v);M?Object.assign(d,{kernelShape:K,strides:C,pads:m,dilations:h,cacheKey:v.cacheKey}):Object.assign(d,{kernelShape:K,strides:C,pads:m,cacheKey:v.cacheKey});let o=u.slice();return o.push(o.splice(1,1)[0]),[d,P?o:u]},x4=(q,v)=>{let x=v.format==="NHWC",P=[{type:12,data:B0.size(q)},{type:12,data:B0.size(v.kernelShape)}],F=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(v.kernelShape.length<=2){let M=v.kernelShape[v.kernelShape.length-1],K=v.strides[v.strides.length-1],C=v.pads[v.pads.length/2-1],h=v.pads[v.pads.length-1],m=!!(C+h);P.push({type:12,data:M},{type:12,data:K},{type:12,data:C},{type:12,data:h}),F.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let u=!1;if(v.kernelShape.length===2){let d=v.kernelShape[v.kernelShape.length-2],o=v.strides[v.strides.length-2],a=v.pads[v.pads.length/2-2],j0=v.pads[v.pads.length-2];u=!!(a+j0),P.push({type:12,data:d},{type:12,data:o},{type:12,data:a},{type:12,data:j0}),F.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[P,F,!0,m,u]}{if(x)throw Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let M=B0.computeStrides(v.kernelShape);return P.push({type:12,data:M},{type:12,data:v.pads},{type:12,data:v.strides}),F.push({name:"kernelStrides",type:"u32",length:M.length},{name:"pads",type:"u32",length:v.pads.length},{name:"strides",type:"u32",length:v.strides.length}),[P,F,!!v.pads.reduce((K,C)=>K+C),!1,!1]}},R8=(q,v,x,P,F,M,K,C,h,m,u,d)=>{let o=F.format==="NHWC",a=v.type.value,j0=h5("output",v.type.tensor,P);if(F.kernelShape.length<=2){let U0="",_0="",H0="",Y0=x-(o?2:1);if(U0=u?` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${Y0}] = indices[${Y0}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${Y0}] < 0 || xIndices[${Y0}] + >= uniforms.x_shape[${Y0}]) { + pad++; + continue; + } + let x_val = x[${v.indicesToOffset("xIndices")}]; + ${M} + }`:` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${Y0}] = indices[${Y0}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${v.indicesToOffset("xIndices")}]; + ${M} + }`,F.kernelShape.length===2){let k0=x-(o?3:2);_0=d?` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${k0}] = indices[${k0}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${k0}] < 0 || xIndices[${k0}] >= uniforms.x_shape[${k0}]) { + pad += i32(uniforms.kw); + continue; + } + `:` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${k0}] = indices[${k0}] * uniforms.sh - uniforms.phStart + j; + `,H0=` + } + `}return` + ${q.registerUniforms(h).declareVariables(v,j0)} + + ${q.mainStart()} + ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${j0.offsetToIndices("global_idx")}; + var xIndices = ${j0.offsetToIndices("global_idx")}; + + var value = ${a}(${C}); + var pad = 0; + ${_0} + ${U0} + ${H0} + ${K} + + output[global_idx] = value; + }`}{if(o)throw Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let U0=F.kernelShape.length,_0=F.pads.length,H0="";return H0=m?` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${v.indicesToOffset("xIndices")}]; + ${M} + }`:` + } + let x_val = x[${v.indicesToOffset("xIndices")}]; + ${M} + `,` + ${q.registerUniforms(h).declareVariables(v,j0)} + + ${q.mainStart()} + ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${j0.offsetToIndices("global_idx")}; + var xIndices = ${j0.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${a}(${C}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${U0-1}u; j++) { + offsets[j] = offset / ${B5("uniforms.kernelStrides","j",U0)}; + offset -= offsets[j] * ${B5("uniforms.kernelStrides","j",U0)}; + } + offsets[${U0-1}] = offset; + + isPad = false; + for (var j = ${x-U0}u; j < ${x}u; j++) { + xIndices[j] = indices[j] * ${B5("uniforms.strides",`j - ${x-U0}u`,U0)} + + offsets[j - ${x-U0}u] - ${B5("uniforms.pads","j - 2u",_0)}; + ${H0} + } + ${K} + + output[global_idx] = value; + }`}},U8=(q)=>`${q.format};${q.ceilMode};${q.autoPad};${q.kernelShape.length}`,JO=(q)=>`${U8(q)};${q.countIncludePad}`,KG=(q)=>`${U8(q)};${q.storageOrder};${q.dilations}`,H8=(q)=>({format:q.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][q.auto_pad],ceilMode:q.ceil_mode,kernelShape:q.kernel_shape,strides:q.strides,pads:q.pads}),x8=(q,v,x,P)=>{let[F,M]=v8(v,P,x),K=u0("x",v.dataType,v.dims.length),C=K.type.value,h="";F.countIncludePad?h+=`value /= ${C}(uniforms.kernelSize);`:h+=`value /= ${C}(i32(uniforms.kernelSize) - pad);`;let[m,u,d,o,a]=x4(M,F);return m.push(...C5(v.dims,M)),{name:q,shaderCache:{hint:`${P.cacheKey};${d};${o};${a}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:M,dataType:v.dataType}],dispatchGroup:{x:Math.ceil(B0.size(M)/64)},programUniforms:m}),getShaderSource:(j0)=>R8(j0,K,v.dims.length,M.length,F,"value += x_val;",h,0,u,d,o,a)}},vO=(q)=>{let v=q.count_include_pad!==0,x=H8(q);if(x.ceilMode!==0)throw Error("using ceil() in shape computation is not yet supported for AveragePool");let P={countIncludePad:v,...x,cacheKey:""};return{...P,cacheKey:JO(P)}},e3=(q,v)=>{H4(q.inputs),q.compute(x8("AveragePool",q.inputs[0],!1,v))},L8={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},RO=(q)=>{let v=q.format;return{format:v,...L8,cacheKey:v}},UO=(q,v)=>{H4(q.inputs),q.compute(x8("GlobalAveragePool",q.inputs[0],!0,v))},_8=(q,v,x,P)=>{let[F,M]=v8(v,P,x),K=u0("x",v.dataType,v.dims.length),[C,h,m,u,d]=x4(M,F);return C.push(...C5(v.dims,M)),{name:q,shaderCache:{hint:`${P.cacheKey};${m};${u};${d}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:M,dataType:v.dataType}],dispatchGroup:{x:Math.ceil(B0.size(M)/64)},programUniforms:C}),getShaderSource:(o)=>R8(o,K,v.dims.length,M.length,F,` + value = max(x_val, value); + `,"",v.dataType===10?-65504:-1e5,h,m,u,d)}},HO=(q,v)=>{H4(q.inputs),q.compute(_8("MaxPool",q.inputs[0],!1,v))},xO=(q)=>{let{storage_order:v,dilations:x}=q,P=H8(q);if(v!==0)throw Error("column major storage order is not yet supported for MaxPool");if(P.ceilMode!==0)throw Error("using ceil() in shape computation is not yet supported for MaxPool");let F={storageOrder:v,dilations:x,...P,cacheKey:""};return{...F,cacheKey:KG(F)}},LO=(q)=>{let v=q.format;return{format:v,...L8,cacheKey:v}},m4=(q,v)=>{H4(q.inputs),q.compute(_8("GlobalMaxPool",q.inputs[0],!0,v))}}),vq=q0(()=>{q6(),X6(),S9(),T6(),bG=(q,v)=>{if(q.length<2||q.length>3)throw Error("DequantizeLinear requires 2 or 3 inputs.");if(q.length===3&&q[1].dims===q[2].dims)throw Error("x-scale and x-zero-point must have the same shape.");if(q.length===3&&q[0].dataType!==q[2].dataType)throw Error("x and x-zero-point must have the same data type.");if(q[0].dataType===6&&q.length>2)throw Error("In the case of dequantizing int32 there is no zero point.");if(q[1].dims.length!==0&&q[1].dims.length!==1&&q[1].dims.length!==q[0].dims.length)throw Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if(q.length>2){if(q[0].dataType!==q[2].dataType)throw Error("x and x-zero-point must have the same data type.");if(q[1].dims.length!==q[2].dims.length)throw Error("scale and zero-point inputs must have the same rank.");if(!q[1].dims.map((x,P)=>x===q[2].dims[P]).reduce((x,P)=>x&&P,!0))throw Error("scale and zero-point inputs must have the same shape.")}if(v.blockSize>0){if(q[1].dims.length===0||q[1].dims.length===1&&q[1].dims[0]===1)throw Error("blockSize must be set only for block quantization.");if(!q[1].dims.map((F,M)=>M===v.axis||F===q[0].dims[M]).reduce((F,M)=>F&&M,!0))throw Error("For block qunatization, scale input shape to match the input shape except for the axis");if(q[1].dims.length!==q[0].dims.length)throw Error("For block qunatization the scale input rank must be the same as the x rank.");let x=q[0].dims[v.axis],P=q[1].dims[v.axis];if(v.blockSizeMath.ceil(x/(P-1)-1))throw Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},_O=(q,v)=>{let x=B0.normalizeAxis(v.axis,q[0].dims.length),P=q[0].dataType,F=P===3,M=q[0].dims,K=q[1].dataType,C=B0.size(M),h=P===3||P===2,m=h?[Math.ceil(B0.size(q[0].dims)/4)]:q[0].dims,u=q[1].dims,d=q.length>2?q[2]:void 0,o=d?h?[Math.ceil(B0.size(d.dims)/4)]:d.dims:void 0,a=u.length===0||u.length===1&&u[0]===1,j0=a===!1&&u.length===1,U0=k6(C),_0=a&&(!h||U0===4),H0=_0?U0:1,Y0=_0&&!h?U0:1,k0=u0("input",h?12:P,m.length,Y0),D0=u0("scale",K,u.length),b0=d?u0("zero_point",h?12:P,o.length):void 0,m0=h5("output",K,M.length,H0),x5=[k0,D0];b0&&x5.push(b0);let f5=[m,u];d&&f5.push(o);let c5=[{type:12,data:C/H0},{type:12,data:x},{type:12,data:v.blockSize},...C5(...f5,M)];return{name:"DequantizeLinear",shaderCache:{hint:v.cacheKey,inputDependencies:b0?["rank","rank","rank"]:["rank","rank"]},getShaderSource:(l5)=>` + ${l5.registerUniforms([{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}]).declareVariables(...x5,m0)} + ${l5.mainStart()} + ${l5.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${m0.offsetToIndices("global_idx")}; + + // Set input x + ${h?` + let input = ${k0.getByOffset("global_idx / 4")}; + let x_vec = ${F?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${H0===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${k0.getByOffset("global_idx")};`}; + + // Set scale input + ${a?`let scale_value= ${D0.getByOffset("0")}`:j0?` + let scale_index = ${m0.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${D0.getByOffset("scale_index")};`:` + var scale_indices: ${D0.type.indices} = output_indices; + let index = ${D0.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${D0.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${D0.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${b0?a?h?` + let zero_point_input = ${b0.getByOffset("0")}; + let zero_point_vec = ${F?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${b0.getByOffset("0")}`:j0?h?` + let zero_point_index = ${m0.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${b0.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${F?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${m0.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${b0.getByOffset("zero_point_index")};`:h?` + let zero_point_offset = ${D0.indicesToOffset("scale_indices")}; + let zero_point_input = ${b0.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${F?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${b0.getByIndices("scale_indices")};`:`let zero_point_value = ${h?F?"i32":"u32":k0.type.value}(0);`}; + // Compute and write output + ${m0.setByOffset("global_idx",`${m0.type.value}(x_value - zero_point_value) * scale_value`)}; + }`,getRunData:()=>({outputs:[{dims:M,dataType:K}],dispatchGroup:{x:Math.ceil(C/H0/64),y:1,z:1},programUniforms:c5})}},YO=(q,v)=>{bG(q.inputs,v),q.compute(_O(q.inputs,v))},SO=(q)=>P6({axis:q.axis,blockSize:q.blockSize})}),Rq=q0(()=>{d5(),q6(),T6(),PO=(q,v,x)=>{if(q===v||qv&&x>0)throw Error("Range these inputs' contents are invalid.")},XO=(q,v,x,P)=>{let F=Math.abs(Math.ceil((v-q)/x)),M=[F],K=F,C=[{type:12,data:K},{type:P,data:q},{type:P,data:x},...C5(M)];return{name:"Range",shaderCache:{hint:`${P}`},getShaderSource:(h)=>{let m=h5("output",P,M.length),u=m.type.value,d=[{name:"outputSize",type:"u32"},{name:"start",type:u},{name:"delta",type:u}];return` + ${h.registerUniforms(d).declareVariables(m)} + ${h.mainStart()} + ${h.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${u}(global_idx) * uniforms.delta; + }`},getRunData:()=>({outputs:[{dims:M,dataType:P}],dispatchGroup:{x:Math.ceil(K/64)},programUniforms:C})}},Y8=(q)=>{let v=0,x=0,P=0;q.inputs[0].dataType===6?(v=q.inputs[0].getInt32Array()[0],x=q.inputs[1].getInt32Array()[0],P=q.inputs[2].getInt32Array()[0]):q.inputs[0].dataType===1&&(v=q.inputs[0].getFloat32Array()[0],x=q.inputs[1].getFloat32Array()[0],P=q.inputs[2].getFloat32Array()[0]),H.webgpu.validateInputContent&&PO(v,x,P),q.compute(XO(v,x,P,q.inputs[0].dataType),{inputs:[]})}}),bV=q0(()=>{q6(),X6(),S9(),T6(),TO=(q,v,x,P)=>{if(q!=="none"&&P!=="i32"&&P!=="u32"&&P!=="f32")throw Error(`Input ${P} is not supported with reduction ${q}.`);let F=`{ + var oldValue = 0; + loop { + let newValueF32 =`,M=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${v}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch(q){case"none":return`${v}=${x};`;case"add":return P==="i32"||P==="u32"?`atomicAdd(&${v}, bitcast<${P}>(${x}));`:` + ${F}bitcast<${P}>(oldValue) + (${x})${M}`;case"max":return P==="i32"||P==="u32"?`atomicMax(&${v}, bitcast<${P}>(${x}));`:` + ${F}max(bitcast(oldValue), (${x}))${M}`;case"min":return P==="i32"||P==="u32"?`atomicMin(&${v}, bitcast<${P}>(${x}));`:`${F}min(bitcast<${P}>(oldValue), (${x}))${M}`;case"mul":return`${F}(bitcast<${P}>(oldValue) * (${x}))${M}`;default:throw Error(`Reduction ${q} is not supported.`)}},S8=(q,v)=>(q===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[${v?"i - indices_start":"i"}]; + let dim_value = uniforms.output_shape[${v?"i - indices_start":"i"} + uniforms.last_index_dimension];`)+` + + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim));`,p4=(q,v,x)=>`for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * ${x?"global_idx":"idx"} + i]; + ${TO(q.reduction,"output[data_offset + i]","value",v)} + }`,FO=(q,v)=>{let x=q[0].dims,P=q[1].dims,F=x,M=Math.ceil(B0.size(P)/1),K=P[P.length-1],C=B0.sizeFromDimension(x,K),h=B0.sizeFromDimension(P,0)/K,m=[{type:12,data:M},{type:12,data:K},{type:12,data:C},...C5(q[1].dims,q[2].dims,F)];return{name:"ScatterND",shaderCache:{hint:`${v.cacheKey}_${v.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:F,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(M/64)},programUniforms:m}),getShaderSource:(u)=>{let d=u0("indices",q[1].dataType,q[1].dims.length),o=u0("updates",q[2].dataType,q[2].dims.length,1),a=v.reduction!=="none"&&v.reduction!==""?V2("output",q[0].dataType,F.length):h5("output",q[0].dataType,F.length,1);return` + ${u.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(d,o,a)} + ${u.mainStart()} + ${u.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${v.reduction==="none"}) { + for (var i = 0; i < ${h}; i = i + 1) { + for (var j = i + 1; j < ${h}; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + if (${v.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + // Process each index-update pair individually when duplicates exist + for (var idx = 0u; idx < ${h}u; idx++) { + var data_offset = 0u; + for (var i = 0u; i < uniforms.last_index_dimension; i++) { + var index = i32(indices[idx * uniforms.last_index_dimension + i].x); + ${S8(x.length,!1)} + } + ${p4(v,a.type.value,!1)} + } + return; + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + var indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${S8(x.length,!0)} + } + ${p4(v,a.type.value,!0)} + }`}}},yO=(q)=>P6({reduction:q.reduction}),P8=(q,v)=>{q.compute(FO(q.inputs,v),{inputs:[q.inputs[1],q.inputs[2]],outputs:[]})}}),Uq=q0(()=>{q6(),X6(),S9(),T6(),zO=(q,v)=>{if(q.every((x)=>x>0||(()=>{throw Error("Resize requires scales input values to be positive")})),q.length>0){if(v.mode==="linear"){if(!(q.length===2||q.length===3||q.length===4&&q[0]===1&&q[1]===1||q.length===4&&q[0]===1&&q[3]===1||q.length===5&&q[0]===1&&q[1]===1))throw Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(v.mode==="cubic"&&!(q.length===2||q.length===4&&q[0]===1&&q[1]===1||q.length===4&&q[0]===1&&q[3]===1))throw Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},kO=(q,v,x)=>{v.every((F)=>F>=0&&F{throw Error("Resize requires axes input values to be positive and less than rank")}));let P=Array(x).fill(1);return v.forEach((F,M)=>P[F]=q[M]),P},A4=(q,v,x,P,F,M)=>{let[K,C,h]=x>10?[1,2,3]:[-1,q.length>1?1:-1,-1],m=q[0].dims.length;if(K>0&&q.length>K&&q[K].dims.length>0)q[K].getFloat32Array().forEach((u)=>M.push(u));else if(v.coordinateTransformMode==="tf_crop_and_resize")throw Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(C>0&&q.length>C&&q[C].dims.length===1&&q[C].dims[0]>0){if(q[C].getFloat32Array().forEach((u)=>P.push(u)),P.length!==0&&P.length!==m&&x>=18&&P.length!==v.axes.length)throw Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");zO(P,v),v.axes.length>0&&kO(P,v.axes,m).forEach((u,d)=>P[d]=u)}if(h>0&&q.length>h&&q[h].dims.length===1&&q[h].dims[0]>0&&(q[h].getBigInt64Array().forEach((u)=>F.push(Number(u))),F.length!==0&&F.length!==m&&x>=18&&F.length!==v.axes.length))throw Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(v.axes.length>0){if(P.length!==0&&P.length!==v.axes.length)throw Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(F.length!==0&&F.length!==v.axes.length)throw Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof P<"u"&&typeof F<"u"&&P.length>0&&F.length>m)throw Error("Resize requires only of scales or sizes to be specified")},X8=(q,v,x,P)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${q}) * (${v}); + let whole = ${P}(big / (${x})); + let fract = ${P}(big % (${x})) / ${P}(${x}); + return whole + fract; +`,IO=(q,v)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${v} { `+(()=>{switch(q){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${v}(xResized) / ${v}(xScale); + } else { + ${X8("xResized","lengthOriginal","lengthResized",v)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${v}(xResized) + 0.5) / ${v}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${v}(xResized) + 0.5) / ${v}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${X8("xResized","lengthOriginal - 1","lengthResized - 1",v)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${v}(roiStart) * ${v}(lengthOriginal - 1) + + (${v}(xResized) * ${v}(roiEnd - roiStart) * ${v}(lengthOriginal - 1)) / + ${v}(lengthResized - 1); + } else { + return 0.5 * ${v}(roiStart + roiEnd) * ${v}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${v}xScale * ${v}(lengthResized); + const adjustment = ${v}(lengthResized) / outputWidth; + const center = ${v}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${v}(xResized) + 0.5) / ${v}(xScale)) - 0.5;`;case"half_pixel":return`return ((${v}(xResized) + 0.5) / ${v}(xScale)) - 0.5;`;default:throw Error(`Coordinate transform mode ${q} is not supported`)}})()+"}",DO=(q,v,x)=>`fn getNearestPixelFromOriginal(xOriginal: ${x}, isDownSample: bool) -> ${x} {`+(()=>{switch(q){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";default:if(v<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw Error(`Nearest mode ${q} is not supported`)}})()+"}",WO=(q,v,x)=>{let P=Array(x).fill(0).concat(Array(x).fill(1)),F=q.length===0?P:q.slice();return v.length>0?(v.forEach((M,K)=>{P[M]=F[K],P[K+x]=F[v.length+K]}),P):F},T8=(q,v,x,P)=>{let F=[];if(x.length>0)if(P.length>0){if(q.forEach((M)=>F.push(M)),Math.max(...P)>q.length)throw Error("axes is out of bound");P.forEach((M,K)=>F[M]=x[K])}else x.forEach((M)=>F.push(M));else{if(v.length===0)throw Error("Resize requires either scales or sizes.");F=q.map((M,K)=>Math.round(M*v[K]))}return F},g4=(q,v,x)=>{let P=(()=>{switch(x.keepAspectRatioPolicy){case"not_larger":return x.axes.length>0?Math.min(...x.axes.map((M)=>v[M]),Number.MAX_VALUE):Math.min(...v,Number.MAX_VALUE);case"not_smaller":return x.axes.length>0?Math.max(...x.axes.map((M)=>v[M]),Number.MIN_VALUE):Math.max(...v,Number.MIN_VALUE);default:throw Error(`Keep aspect ratio policy ${x.keepAspectRatioPolicy} is not supported`)}})();v.fill(1,0,v.length);let F=q.slice();return x.axes.length>0?(x.axes.forEach((M)=>v[M]=P),x.axes.forEach((M)=>F[M]=Math.round(q[M]*v[M]))):(v.fill(P,0,v.length),F.forEach((M,K)=>F[K]=Math.round(M*v[K]))),F},fG=(q,v,x,P,F)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${q.type.indices}) -> array<${q.type.value}, ${x.length}> { + var original_indices: array<${q.type.value}, ${x.length}>; + for (var i:u32 = 0; i < ${x.length}; i++) { + var output_index = ${q.indicesGet("output_indices","i")}; + var scale = ${B5("uniforms.scales","i",P)}; + var roi_low = ${B5("uniforms.roi","i",F)}; + var roi_hi = ${B5("uniforms.roi",`i + ${v.length}`,F)}; + if (scale == 1.0) { + original_indices[i] = ${q.type.value}(output_index); + } else { + var input_shape_i = ${B5("uniforms.input_shape","i",v.length)}; + var output_shape_i = ${B5("uniforms.output_shape","i",x.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,MO=(q,v,x,P,F,M,K)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${v.type.indices}) -> ${q.type.indices} { + var input_indices: ${q.type.indices}; + for (var i:u32 = 0; i < ${P.length}; i++) { + var output_index = ${v.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${B5("uniforms.scales","i",F)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${B5("uniforms.roi","i",M)}; + var roi_hi = ${B5("uniforms.roi",`i + ${x.length}`,M)}; + var input_shape_i = ${B5("uniforms.input_shape","i",x.length)}; + var output_shape_i = ${B5("uniforms.output_shape","i",P.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${K} || (original_idx >= 0 && original_idx < ${v.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${v.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${q.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,KO=(q,v)=>` + fn checkInputIndices(input_indices: ${q.type.indices}) -> bool { + for (var i:u32 = 0; i < ${v.length}; i++) { + var input_index = ${q.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${B5("uniforms.input_shape","i",v.length)}) { + return false; + } + } + return true; + }`,u4=(q,v,x,P)=>q.rank>P?` + ${q.indicesSet("input_indices",v,"channel")}; + ${q.indicesSet("input_indices",x,"batch")}; +`:"",bO=(q,v,x,P,F)=>{let[M,K,C,h]=x.length===2?[-1,0,1,-1]:[0,2,3,1],m=q.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${m} { + var input_indices: ${q.type.indices}; + ${q.indicesSet("input_indices",K,`max(0, min(row, ${x[K]} - 1))`)}; + ${q.indicesSet("input_indices",C,`max(0, min(col, ${x[C]} - 1))`)}; + ${u4(q,h,M,2)} + return ${q.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${v.type.indices}) -> ${m} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${m} = originalIndices[${K}]; + var col:${m} = originalIndices[${C}]; + ${P?`if (row < 0 || row > (${x[K]} - 1) || col < 0 || col > (${x[C]} - 1)) { + return ${F}; + }`:""}; + row = max(0, min(row, ${x[K]} - 1)); + col = max(0, min(col, ${x[C]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${x.length>2?`u32(originalIndices[${h}])`:"0"}; + var batch: u32 = ${x.length>2?`u32(originalIndices[${M}])`:"0"}; + var x11: ${m} = getInputValue(batch, channel, row1, col1); + var x12: ${m} = getInputValue(batch, channel, row1, col2); + var x21: ${m} = getInputValue(batch, channel, row2, col1); + var x22: ${m} = getInputValue(batch, channel, row2, col2); + var dx1: ${m} = abs(row - ${m}(row1)); + var dx2: ${m} = abs(${m}(row2) - row); + var dy1: ${m} = abs(col - ${m}(col1)); + var dy2: ${m} = abs(${m}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},fO=(q,v,x,P,F,M,K,C,h,m)=>{let u=x.length===2,[d,o]=u?[0,1]:[2,3],a=q.type.value,j0=(U0)=>{let _0=U0===d?"row":"col";return` + fn ${_0}CubicInterpolation(input_indices: ${q.type.indices}, output_indices: ${v.type.indices}) -> ${a} { + var output_index = ${v.indicesGet("output_indices",U0)}; + var originalIdx: ${a} = getOriginalCoordinateFromResizedCoordinate(output_index, ${F[U0]}, + ${P[U0]}, ${x[U0]}, ${M[U0]}, ${M[U0]} + ${x.length}); + var fractOriginalIdx: ${a} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${C} && (originalIdx < 0 || originalIdx > (${x[U0]} - 1))) { + return ${h}; + } + var data: array<${a}, 4> = array<${a}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${_0}: ${a} = originalIdx + ${a}(i); + if (${_0} < 0 || ${_0} >= ${x[U0]}) { + ${m?`coefs[i + 1] = 0.0; + continue;`:C?`return ${h};`:`${_0} = max(0, min(${_0}, ${x[U0]} - 1));`}; + } + var input_indices_copy: ${q.type.indices} = input_indices; + ${q.indicesSet("input_indices_copy",U0,`u32(${_0})`)}; + data[i + 1] = ${U0===d?q.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${j0(d)}; + ${j0(o)}; + fn getCubicInterpolationCoefs(s: ${a}) -> array<${a}, 4> { + var absS = abs(s); + var coeffs: array<${a}, 4> = array<${a}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${a} = 1.0 - absS; + var twoMinusAbsS: ${a} = 2.0 - absS; + var onePlusAbsS: ${a} = 1.0 + absS; + coeffs[0] = ((${K} * onePlusAbsS - 5 * ${K}) * onePlusAbsS + 8 * ${K}) * onePlusAbsS - 4 * ${K}; + coeffs[1] = ((${K} + 2) * absS - (${K} + 3)) * absS * absS + 1; + coeffs[2] = ((${K} + 2) * oneMinusAbsS - (${K} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${K} * twoMinusAbsS - 5 * ${K}) * twoMinusAbsS + 8 * ${K}) * twoMinusAbsS - 4 * ${K}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${a}, 4>, coefs: array<${a}, 4>) -> ${a} { + var coefsSum: ${a} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${v.type.indices}) -> ${a} { + var input_indices: ${q.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},F8=(q,v,x,P,F)=>{let[M,K,C,h,m]=x.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],u=q.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${u} { + var input_indices: ${q.type.indices}; + ${q.indicesSet("input_indices",K,`max(0, min(depth, ${x[K]} - 1))`)}; + ${q.indicesSet("input_indices",C,`max(0, min(height, ${x[C]} - 1))`)}; + ${q.indicesSet("input_indices",h,`max(0, min(width, ${x[h]} - 1))`)}; + ${u4(q,m,M,3)} + return ${q.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${v.type.indices}) -> ${u} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${u} = originalIndices[${K}]; + var height:${u} = originalIndices[${C}]; + var width:${u} = originalIndices[${h}]; + ${P?`if (depth < 0 || depth > (${x[K]} - 1) || height < 0 || height > (${x[C]} - 1) || width < 0 || (width > ${x[h]} - 1)) { + return ${F}; + }`:""}; + + depth = max(0, min(depth, ${x[K]} - 1)); + height = max(0, min(height, ${x[C]} - 1)); + width = max(0, min(width, ${x[h]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${x.length>3?`u32(originalIndices[${m}])`:"0"}; + var batch: u32 = ${x.length>3?`u32(originalIndices[${M}])`:"0"}; + + var x111: ${u} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${u} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${u} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${u} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${u} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${u} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${u} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${u} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${u} = abs(depth - ${u}(depth1)); + var dx2: ${u} = abs(${u}(depth2) - depth); + var dy1: ${u} = abs(height - ${u}(height1)); + var dy2: ${u} = abs(${u}(height2) - height); + var dz1: ${u} = abs(width - ${u}(width1)); + var dz2: ${u} = abs(${u}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},wO=(q,v,x,P,F,M)=>{let K=q.dims,C=WO(M,v.axes,K.length),h=T8(K,P,F,v.axes),m=P.slice();P.length===0&&(m=K.map((H0,Y0)=>H0===0?1:h[Y0]/H0),v.keepAspectRatioPolicy!=="stretch"&&(h=g4(K,m,v)));let u=h5("output",q.dataType,h.length),d=u0("input",q.dataType,K.length),o=B0.size(h),a=K.length===h.length&&K.every((H0,Y0)=>H0===h[Y0]),j0=v.coordinateTransformMode==="tf_crop_and_resize",U0=v.extrapolationValue,_0=d.type.value;return{name:"Resize",shaderCache:{hint:`${v.cacheKey}|${x}|${m.length>0?v.mode==="cubic"?m:m.length:""}|${F.length>0?F:""}|${C.length>0?C:""}|${a}|${v.mode==="nearest"?K.length:K}`,inputDependencies:["rank"]},getShaderSource:(H0)=>` + ${a?"":` + ${IO(v.coordinateTransformMode,_0)}; + ${(()=>{switch(v.mode){case"nearest":return` + ${KO(d,K)}; + ${DO(v.nearestMode,x,_0)}; + ${MO(d,u,K,h,m.length,C.length,j0)}; + `;case"linear":return` + ${fG(u,K,h,m.length,C.length)}; + ${(()=>{if(K.length===2||K.length===4)return`${bO(d,u,K,j0,U0)}`;if(K.length===3||K.length===5)return`${F8(d,u,K,j0,U0)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(K.length===2||K.length===4)return`${fO(d,u,K,h,m,C,v.cubicCoeffA,j0,v.extrapolationValue,v.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${H0.registerUniform("output_size","u32").registerUniform("scales","f32",m.length).registerUniform("roi","f32",C.length).declareVariables(d,u)} + ${H0.mainStart()} + ${H0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${a?"output[global_idx] = input[global_idx];":` + let output_indices = ${u.offsetToIndices("global_idx")}; + var input_indices: ${d.type.indices}; + ${(()=>{switch(v.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${d.getByIndices("input_indices")}; + } else { + output[global_idx] = ${v.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${K.length===2||K.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${v.mode}`)}})()}; +`} + }`,getRunData:()=>({outputs:[{dims:h,dataType:q.dataType}],dispatchGroup:{x:Math.ceil(o/64)},programUniforms:[{type:12,data:o},{type:1,data:m},{type:1,data:C},...C5(K,h)]})}},EO=(q)=>{let v=q.customDataBuffer;return new Uint32Array(v,v.byteOffset,1)[0]},y8=(q,v)=>{let x=[],P=[],F=[],M=EO(q);if(v.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");A4(q.inputs,v,M,x,P,F),q.compute(wO(q.inputs[0],v,M,x,P,F),{inputs:[0]})},wG=(q)=>{let{antialias:v,axes:x,coordinateTransformMode:P,cubicCoeffA:F}=q,M=q.excludeOutside!==0,K=q.extrapolationValue,C=q.keepAspectRatioPolicy,h=q.mode,m=q.nearestMode===""?"simple":q.nearestMode;return P6({antialias:v,axes:x,coordinateTransformMode:P,cubicCoeffA:F,excludeOutside:M,extrapolationValue:K,keepAspectRatioPolicy:C,mode:h,nearestMode:m})}}),Hq=q0(()=>{q6(),X6(),T6(),EG=(q)=>{if(!q||q.length<3)throw Error("layerNorm requires at least 3 inputs.");let v=q[0],x=q[1],P=q[2];if(v.dataType!==x.dataType||v.dataType!==P.dataType)throw Error("All inputs must have the same data type");if(v.dims.length!==3&&v.dims.length!==2)throw Error("Input must be 2D or 3D");if(x.dims.length!==3&&x.dims.length!==2)throw Error("Skip must be 2D or 3D");let F=v.dims[v.dims.length-1],M=v.dims[v.dims.length-2];if(x.dims[x.dims.length-1]!==F)throw Error("Skip must have the same hidden size as input");if(x.dims[x.dims.length-2]!==M)throw Error("Skip must have the same sequence length as input");if(P.dims.length!==1)throw Error("Gamma must be 1D");if(P.dims[P.dims.length-1]!==F)throw Error("Gamma must have the same hidden size as input");if(q.length>3){let K=q[3];if(K.dims.length!==1)throw Error("Beta must be 1D");if(K.dims[K.dims.length-1]!==F)throw Error("Beta must have the same hidden size as input")}if(q.length>4){let K=q[4];if(K.dims.length!==1)throw Error("Bias must be 1D");if(K.dims[K.dims.length-1]!==F)throw Error("Bias must have the same hidden size as input")}},z8=(q,v,x,P)=>{let F=v.simplified,M=q[0].dims,K=B0.size(M),C=M,h=K,m=M.slice(-1)[0],u=P?M.slice(0,-1).concat(1):[],d=!F&&q.length>3,o=q.length>4,a=P&&x>1,j0=P&&x>2,U0=x>3,_0=64,H0=k6(m),Y0=[{type:12,data:h},{type:12,data:H0},{type:12,data:m},{type:1,data:v.epsilon}],k0=[{dims:C,dataType:q[0].dataType}];return x>1&&k0.push({dims:u,dataType:1}),x>2&&k0.push({dims:u,dataType:1}),x>3&&k0.push({dims:M,dataType:q[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${H0};${a};${j0};${U0}`,inputDependencies:q.map((D0,b0)=>"type")},getShaderSource:(D0)=>{let b0=[u0("x",q[0].dataType,q[0].dims,H0),u0("skip",q[1].dataType,q[1].dims,H0),u0("gamma",q[2].dataType,q[2].dims,H0)];d&&b0.push(u0("beta",q[3].dataType,q[3].dims,H0)),o&&b0.push(u0("bias",q[4].dataType,q[4].dims,H0)),b0.push(h5("output",q[0].dataType,C,H0)),a&&b0.push(h5("mean_output",1,u)),j0&&b0.push(h5("inv_std_output",1,u)),U0&&b0.push(h5("input_skip_bias_sum",q[0].dataType,C,H0));let m0=N6(q[0].dataType),x5=N6(1,H0);return` + + ${D0.registerUniforms([{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}]).declareVariables(...b0)} + var sum_shared : array<${x5}, 64>; + var sum_squared_shared : array<${x5}, 64>; + + ${D0.mainStart([_0,1,1])} + let ix = local_id.x; + let iy = global_id.x / 64; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / 64; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == 63) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${o?"bias[offset1d + i]":m0+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${U0?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${R9(m0,H0,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = 64; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${B6("sum",H0)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${B6("square_sum",H0)} / f32(uniforms.hidden_size) ${F?"":"- mean * mean"} + uniforms.epsilon); + ${a?"mean_output[global_idx] = mean;":""} + ${j0?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${F?"":`- ${m0}(mean)`}) * + ${m0}(inv_std_dev) * gamma[offset1d + i] + ${d?"+ beta[offset1d + i]":""}; + } + }`},getRunData:()=>({outputs:k0,dispatchGroup:{x:Math.ceil(h/m)},programUniforms:Y0})}},d4=(q,v)=>{EG(q.inputs);let x=[0];q.outputCount>1&&x.push(-3),q.outputCount>2&&x.push(-3),q.outputCount>3&&x.push(3),q.compute(z8(q.inputs,v,q.outputCount,!1),{outputs:x})}}),xq=q0(()=>{q6(),X6(),S9(),T6(),QO=(q,v)=>{if(!q||q.length<1)throw Error("too few inputs");if(v.axes.length!==0){if(v.axes.length!==v.starts.length||v.axes.length!==v.ends.length)throw Error("axes, starts and ends must have the same length")}else if(v.starts.length!==v.ends.length)throw Error("starts and ends must have the same length");q.slice(1).forEach((x,P)=>{if(q[P+1].dataType!==6&&q[P+1].dataType!==7)throw Error(`Input ${P} must be an array of int32 or int64`)})},L4=(q,v)=>{let x=[];if(q.length>v)if(q[v].dataType===7)q[v].getBigInt64Array().forEach((P)=>x.push(Number(P)));else{if(q[v].dataType!==6)throw Error(`Input ${v} must be an array of int32 or int64`);q[v].getInt32Array().forEach((P)=>x.push(Number(P)))}return x},CO=(q,v)=>{if(q.length>1){let x=L4(q,1),P=L4(q,2),F=L4(q,3);return F.length===0&&(F=[...Array(q[0].dims.length).keys()]),P6({starts:x,ends:P,axes:F})}return v},_4=(q,v,x,P,F)=>{let M=q;return q<0&&(M+=x[P[v]]),F[v]<0?Math.max(0,Math.min(M,x[P[v]]-1)):Math.max(0,Math.min(M,x[P[v]]))},BO=(q,v,x)=>`fn calculateInputIndices(output_indices: ${v.type.indices}) -> ${q.type.indices} { + var input_indices: ${q.type.indices}; + var carry = 0u; + for (var i = ${x.length}; i >= 0; i--) { + let input_shape_i = ${B5("uniforms.input_shape","i",x.length)}; + let steps_i = ${B5("uniforms.steps","i",x.length)}; + let signs_i = ${B5("uniforms.signs","i",x.length)}; + let starts_i = ${B5("uniforms.starts","i",x.length)}; + var output_index = ${v.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${q.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,hO=(q,v)=>{let x=q[0].dims,P=B0.size(x),F=v.axes.length>0?B0.normalizeAxes(v.axes,x.length):[...Array(x.length).keys()],M=L4(q,4);M.forEach((_0)=>_0!==0||(()=>{throw Error("step cannot be 0")})),M.length===0&&(M=Array(F.length).fill(1));let K=v.starts.map((_0,H0)=>_4(_0,H0,x,F,M)),C=v.ends.map((_0,H0)=>_4(_0,H0,x,F,M));if(F.length!==K.length||F.length!==C.length)throw Error("start, ends and axes should have the same number of elements");if(F.length!==x.length)for(let _0=0;_0Math.sign(_0));M.forEach((_0,H0,Y0)=>{if(_0<0){let k0=(C[H0]-K[H0])/_0,D0=K[H0],b0=D0+k0*M[H0];K[H0]=b0,C[H0]=D0,Y0[H0]=-_0}});let m=x.slice(0);F.forEach((_0,H0)=>{m[_0]=Math.ceil((C[_0]-K[_0])/M[_0])});let u={dims:m,dataType:q[0].dataType},d=h5("output",q[0].dataType,m.length),o=u0("input",q[0].dataType,q[0].dims.length),a=B0.size(m),j0=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:K.length},{name:"signs",type:"i32",length:h.length},{name:"steps",type:"u32",length:M.length}],U0=[{type:12,data:a},{type:12,data:K},{type:6,data:h},{type:12,data:M},...C5(q[0].dims,m)];return{name:"Slice",shaderCache:{hint:`${h.length}_${K.length}_${M.length}`,inputDependencies:["rank"]},getShaderSource:(_0)=>` + ${_0.registerUniforms(j0).declareVariables(o,d)} + ${BO(o,d,x)} + ${_0.mainStart()} + ${_0.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${d.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${d.setByOffset("global_idx",o.getByIndices("input_indices"))} + }`,getRunData:()=>({outputs:[u],dispatchGroup:{x:Math.ceil(P/64)},programUniforms:U0})}},cO=(q,v)=>{QO(q.inputs,v);let x=CO(q.inputs,v);q.compute(hO(q.inputs,x),{inputs:[0]})},l4=(q)=>{let{starts:v,ends:x,axes:P}=q;return P6({starts:v,ends:x,axes:P})}}),Lq=q0(()=>{q6(),X6(),S9(),m2(),T6(),mO=(q)=>{if(!q||q.length!==1)throw Error("Softmax op requires 1 input.")},pO=(q,v)=>{let x,P=q.inputs[0],F=P.dims,M=B0.size(F),K=F.length,C=B0.normalizeAxis(v.axis,K),h=Cm0),m[C]=K-1,m[K-1]=C,x=q.compute(A9(P,m),{inputs:[P],outputs:[-1]})[0]):x=P;let u=x.dims,d=u[K-1],o=M/d,a=k6(d),j0=d/a,U0=64;o===1&&(U0=256);let _0=u0("x",x.dataType,x.dims,a),H0=h5("result",x.dataType,x.dims,a),Y0=_0.type.value,k0=N6(x.dataType)==="f32"?`var threadMax = ${Y0}(-3.402823e+38f);`:`var threadMax = ${Y0}(-65504.0h);`,D0=q.compute({name:"Softmax",shaderCache:{hint:`${a};${U0}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:u,dataType:x.dataType}],dispatchGroup:{x:o},programUniforms:[{type:6,data:j0}]}),getShaderSource:(b0)=>` + var rowMaxShared : ${Y0}; + var rowSumShared : ${Y0}; + var threadShared : array<${Y0}, ${U0}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${Y0} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${Y0}) { + let index = row * row_stride + col; + result[index] = value; + } + ${b0.registerUniform("packedCols","i32").declareVariables(_0,H0)} + ${b0.mainStart(U0)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${U0}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${k0} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${Y0}(${((m0,x5)=>x5===4?`max(max(${m0}.x, ${m0}.y), max(${m0}.z, ${m0}.w))`:x5===2?`max(${m0}.x, ${m0}.y)`:x5===3?`max(max(${m0}.x, ${m0}.y), ${m0}.z)`:m0)("threadShared[0]",a)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${Y0}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${Y0}(${B6("threadShared[0]",a)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`},{inputs:[x],outputs:[h?-1:0]})[0];h&&q.compute(A9(D0,m),{inputs:[D0]})},AO=(q,v)=>{mO(q.inputs),pO(q,v)},o4=(q)=>P6({axis:q.axis})}),_q=q0(()=>{q6(),X6(),T6(),k8=(q)=>Array.from(q.getBigInt64Array(),Number),gO=(q)=>{if(!q||q.length!==2)throw Error("Tile requires 2 inputs.");if(q[0].dataType!==1&&q[0].dataType!==10&&q[0].dataType!==6&&q[0].dataType!==12)throw Error("Tile only support float, float16, int32, and uint32 data types");if(q[1].dataType!==7)throw Error("Tile `repeats` input should be of int64 data type");if(q[1].dims.length!==1)throw Error("Tile `repeats` input should be 1-D");if(k8(q[1]).length!==q[0].dims.length)throw Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},uO=(q,v)=>{let x=[];for(let P=0;P{let x=q[0].dims,P=v??k8(q[1]),F=uO(x,P),M=B0.size(F),K=q[0].dataType,C=u0("input",K,x.length),h=h5("output",K,F.length);return{name:"Tile",shaderCache:{hint:`${P}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:F,dataType:q[0].dataType}],dispatchGroup:{x:Math.ceil(M/64)},programUniforms:[{type:12,data:M},...C5(q[0].dims,F)]}),getShaderSource:(m)=>` + const inputShape = ${C.indices(...x)}; + ${m.registerUniform("output_size","u32").declareVariables(C,h)} + ${m.mainStart()} + ${m.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${h.offsetToIndices("global_idx")}; + var input_indices: ${C.type.indices}; + for (var i = 0; i < ${x.length}; i++) { + let input_dim_i = ${C.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${h.indicesGet("output_indices","i")} % input_dim_i; + + ${C.indicesSet("input_indices","i","input_dim_value")} + } + ${h.setByOffset("global_idx",C.getByIndices("input_indices"))} + }`}},lO=(q)=>{gO(q.inputs),q.compute(dO(q.inputs),{inputs:[0]})}}),Yq=q0(()=>{q6(),X6(),T6(),oO=(q,v,x,P,F)=>{let M,K=h5("output_data",F,x.length,4),C=u0("a_data",v[1].dataType,v[1].dims.length,4),h=u0("b_data",v[2].dataType,v[2].dims.length,4),m=u0("c_data",v[0].dataType,v[0].dims.length,4),u=(d,o,a)=>`select(${o}, ${d}, ${a})`;if(P){let d=(o,a,j0="")=>{let U0=`a_data[index_a${a}][component_a${a}]`,_0=`b_data[index_b${a}][component_b${a}]`,H0=`bool(c_data[index_c${a}] & (0xffu << (component_c${a} * 8)))`;return` + let output_indices${a} = ${K.offsetToIndices(`global_idx * 4u + ${a}u`)}; + let offset_a${a} = ${C.broadcastedIndicesToOffset(`output_indices${a}`,K)}; + let offset_b${a} = ${h.broadcastedIndicesToOffset(`output_indices${a}`,K)}; + let offset_c${a} = ${m.broadcastedIndicesToOffset(`output_indices${a}`,K)}; + let index_a${a} = offset_a${a} / 4u; + let index_b${a} = offset_b${a} / 4u; + let index_c${a} = offset_c${a} / 4u; + let component_a${a} = offset_a${a} % 4u; + let component_b${a} = offset_b${a} % 4u; + let component_c${a} = offset_c${a} % 4u; + ${o}[${a}] = ${j0}(${u(U0,_0,H0)}); + `};M=F===9?` + var data = vec4(0); + ${d("data",0,"u32")} + ${d("data",1,"u32")} + ${d("data",2,"u32")} + ${d("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:` + ${d("output_data[global_idx]",0)} + ${d("output_data[global_idx]",1)} + ${d("output_data[global_idx]",2)} + ${d("output_data[global_idx]",3)} + `}else M=K.setByOffset("global_idx",u(C.getByOffset("global_idx"),h.getByOffset("global_idx"),m.getByOffset("global_idx")));return` + ${q.registerUniform("vec_size","u32").declareVariables(m,C,h,K)} + ${q.mainStart()} + ${q.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${M} + }`},sO=(q)=>{let v=q[1].dims,x=q[2].dims,P=q[0].dims,F=q[1].dataType,M=!(B0.areEqual(v,x)&&B0.areEqual(x,P)),K=v,C=B0.size(v);if(M){let m=p6.calcShape(p6.calcShape(v,x,!1),P,!1);if(!m)throw Error("Can't perform where op on the given tensors");K=m,C=B0.size(K)}let h=Math.ceil(C/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:(m)=>oO(m,q,K,M,F),getRunData:()=>({outputs:[{dims:K,dataType:F}],dispatchGroup:{x:Math.ceil(C/64/4)},programUniforms:[{type:12,data:h},...C5(P,v,x,K)]})}},iO=(q)=>{q.compute(sO(q.inputs))}}),Sq=q0(()=>{K8(),b8(),mG(),pG(),kV(),IV(),DV(),WV(),iZ(),uG(),aZ(),rZ(),MV(),nZ(),tZ(),eZ(),i4(),$q(),jq(),Oq(),Gq(),Zq(),KV(),qq(),Vq(),dG(),Nq(),Jq(),vq(),Rq(),bV(),M8(),Uq(),oG(),Hq(),xq(),Lq(),lG(),_q(),m2(),u6(),Yq(),aO=new Map([["Abs",[Q2]],["Acos",[H2]],["Acosh",[C2]],["Add",[z7]],["ArgMax",[o5,i5]],["ArgMin",[n1,i5]],["Asin",[B2]],["Asinh",[b]],["Atan",[_]],["Atanh",[y]],["Attention",[f2]],["AveragePool",[e3,vO]],["BatchNormalization",[E2]],["BiasAdd",[E1]],["BiasSplitGelu",[P$]],["Cast",[B,f]],["Ceil",[z0]],["Clip",[J0]],["Concat",[W7,b$]],["Conv",[m7,b4]],["ConvTranspose",[n$,a$]],["Cos",[f0]],["Cosh",[A0]],["CumSum",[t$,e$]],["DepthToSpace",[jj,Oj]],["DequantizeLinear",[YO,SO]],["Div",[T$]],["Einsum",[qj,Vj]],["Elu",[M5,Z5]],["Equal",[F$]],["Erf",[J6]],["Exp",[q9]],["Expand",[i7]],["FastGelu",[Uj]],["Floor",[y1]],["FusedConv",[m7,b4]],["Gather",[C4,xj]],["GatherElements",[yj,Fj]],["GatherBlockQuantized",[Pj,n7]],["GatherND",[_j,Yj]],["Gelu",[D4]],["Gemm",[Ij,kj]],["GlobalAveragePool",[UO,RO]],["GlobalMaxPool",[m4,LO]],["Greater",[k$]],["GreaterOrEqual",[I7]],["GridSample",[fj,wj]],["GroupQueryAttention",[dj]],["HardSigmoid",[x7,v$]],["InstanceNormalization",[N8]],["LayerNormalization",[c2]],["LeakyRelu",[q$,Z5]],["Less",[I$]],["LessOrEqual",[D$]],["Log",[L$]],["MatMul",[rj]],["MatMulNBits",[ej,$O]],["MaxPool",[HO,xO]],["Mul",[y$]],["MultiHeadAttention",[Qj,Ej]],["Neg",[V$]],["Not",[U7]],["Pad",[NO]],["Pow",[z$]],["QuickGelu",[Y$,Z5]],["Range",[Y8]],["Reciprocal",[N$]],["ReduceMin",[W2]],["ReduceMean",[O3]],["ReduceMax",[v2]],["ReduceSum",[K2]],["ReduceProd",[M2]],["ReduceL1",[r1]],["ReduceL2",[I2]],["ReduceLogSum",[Z3]],["ReduceLogSumExp",[D2]],["ReduceSumSquare",[G3]],["Relu",[H7]],["Resize",[y8,wG]],["RotaryEmbedding",[pj]],["ScatterND",[P8,yO]],["Sigmoid",[J$]],["Sin",[R$]],["Sinh",[U$]],["Slice",[cO,l4]],["SkipLayerNormalization",[d4]],["Split",[hj,cj]],["Sqrt",[L7]],["Softmax",[AO,o4]],["Sub",[k7]],["Tan",[H$]],["Tanh",[Y7]],["ThresholdedRelu",[x$,Z5]],["Tile",[lO]],["Transpose",[h3,s1]],["Where",[iO]]])}),Pq=q0(()=>{d5(),B1(),T6(),rO=class{constructor(q){this.backend=q,this.repo=new Map,this.attributesBound=!1}getArtifact(q){return this.repo.get(q)}setArtifact(q,v){this.repo.set(q,v)}run(q,v,x,P,F){v0(q.programInfo.name);let M=this.backend.device,K=this.backend.getComputePassEncoder();this.backend.writeTimestamp(2*this.backend.pendingDispatchNumber);let C=[];for(let m of v)C.push({binding:C.length,resource:{buffer:m.buffer}});for(let m of x)C.push({binding:C.length,resource:{buffer:m.buffer}});F&&C.push({binding:C.length,resource:F});let h=M.createBindGroup({layout:q.computePipeline.getBindGroupLayout(0),entries:C,label:q.programInfo.name});if(this.backend.sessionStatus==="capturing"){let m={kernelId:this.backend.currentKernelId,computePipeline:q.computePipeline,bindGroup:h,dispatchGroup:P};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(m)}K.setPipeline(q.computePipeline),K.setBindGroup(0,h),K.dispatchWorkgroups(...P),this.backend.writeTimestamp(2*this.backend.pendingDispatchNumber+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),$0(q.programInfo.name)}dispose(){}build(q,v){v0(q.name);let x=this.backend.device,P=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"}].forEach((m)=>{x.features.has(m.feature)&&P.push(`enable ${m.extension};`)});let F=i2(v,this.backend.device.limits),M=q.getShaderSource(F),K=`${P.join(` +`)} +${F.additionalImplementations} +${M}`,C=x.createShaderModule({code:K,label:q.name});L6("verbose",()=>`[WebGPU] ${q.name} shader code: ${K}`);let h=x.createComputePipeline({compute:{module:C,entryPoint:"main"},layout:"auto",label:q.name});return $0(q.name),{programInfo:q,computePipeline:h,uniformVariablesInfo:F.variablesInfo}}normalizeDispatchGroupSize(q){let v=typeof q=="number"?q:q.x,x=typeof q=="number"?1:q.y||1,P=typeof q=="number"?1:q.z||1,F=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(v<=F&&x<=F&&P<=F)return[v,x,P];let M=v*x*P,K=Math.ceil(Math.sqrt(M));if(K>F){if(K=Math.ceil(Math.cbrt(M)),K>F)throw Error("Total dispatch size exceeds WebGPU maximum.");return[K,K,K]}return[K,K,1]}}}),sG={};p0(sG,{WebGpuBackend:()=>nG});var iG,aG,rG,nG,Xq=q0(()=>{d5(),q6(),B1(),eO(),W8(),Sq(),Pq(),iG=(q,v)=>{if(v.length!==q.length)throw Error(`inputDependencies length ${v.length} is not equal to inputTensors length ${q.length}.`);let x=[];for(let P=0;P{let P=q.name;return q.shaderCache?.hint&&(P+="["+q.shaderCache.hint+"]"),P+=":"+x+`:${iG(v,q.shaderCache?.inputDependencies??Array(v.length).fill("dims"))}`,P},rG=class{constructor(q){q&&(this.architecture=q.architecture,this.vendor=q.vendor)}isArchitecture(q){return this.architecture===q}isVendor(q){return this.vendor===q}},nG=class{constructor(){this.currentSessionId=null,this.currentKernelId=null,this.commandEncoder=null,this.computePassEncoder=null,this.maxDispatchNumber=16,this.pendingDispatchNumber=0,this.pendingKernels=[],this.pendingQueries=new Map,this.sessionStatus="default",this.capturedCommandList=new Map,this.capturedPendingKernels=new Map,this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let q=this.kernelCustomData.get(this.currentKernelId);return q||(q={},this.kernelCustomData.set(this.currentKernelId,q)),q}async initialize(q,v){this.env=q;let x=[],P={requiredLimits:{maxComputeWorkgroupStorageSize:v.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:v.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:v.limits.maxStorageBufferBindingSize,maxBufferSize:v.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:v.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:v.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:v.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:v.limits.maxComputeWorkgroupSizeZ},requiredFeatures:x},F=(M)=>v.features.has(M)&&x.push(M)&&!0;F("chromium-experimental-timestamp-query-inside-passes")||F("timestamp-query"),F("shader-f16"),F("subgroups"),this.device=await v.requestDevice(P),this.adapterInfo=new rG(v.info||await v.requestAdapterInfo()),this.gpuDataManager=s9(this),this.programManager=new rO(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,n9(q.logLevel,!!q.debug),this.device.onuncapturederror=(M)=>{M.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${M.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:v,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let q=this.getCommandEncoder(),v={};this.queryType==="at-passes"&&(v.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:2*this.pendingDispatchNumber,endOfPassWriteIndex:2*this.pendingDispatchNumber+1}),this.computePassEncoder=q.beginComputePass(v)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;let q;v0(),this.endComputePass(),this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,2*this.pendingDispatchNumber,this.queryResolveBuffer,0),q=this.device.createBuffer({size:2*this.pendingDispatchNumber*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set(q,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,q,0,2*this.pendingDispatchNumber*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&q.mapAsync(GPUMapMode.READ).then(()=>{let v=new BigUint64Array(q.getMappedRange()),x=this.pendingQueries.get(q);for(let P=0;P"u"&&(this.queryTimeBase=o);let j0=Number(o-this.queryTimeBase),U0=Number(a-this.queryTimeBase);if(!Number.isSafeInteger(j0)||!Number.isSafeInteger(U0))throw RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:u.map((_0)=>({dims:_0.dims,dataType:D9(_0.dataType)})),outputsMetadata:d.map((_0)=>({dims:_0.dims,dataType:D9(_0.dataType)})),kernelId:M,kernelType:C,kernelName:h,programName:m,startTime:j0,endTime:U0});else{let _0="";u.forEach((Y0,k0)=>{_0+=`input[${k0}]: [${Y0.dims}] | ${D9(Y0.dataType)}, `});let H0="";d.forEach((Y0,k0)=>{H0+=`output[${k0}]: [${Y0.dims}] | ${D9(Y0.dataType)}, `}),console.log(`[profiling] kernel "${M}|${C}|${h}|${m}" ${_0}${H0}execution time: ${U0-j0} ns`)}e("GPU",`${m}::${o}::${a}`)}q.unmap(),this.pendingQueries.delete(q)}),$0()}run(q,v,x,P,F,M){v0(q.name);let K=[];for(let Y0=0;Y0k0):x;if(u.length!==C.length)throw Error(`Output size ${u.length} must be equal to ${C.length}.`);let d,o=[],a=[];for(let Y0=0;Y0=M)throw Error(`Invalid output index: ${u[Y0]}`);if(u[Y0]===-3)continue;let k0=u[Y0]===-1,D0=u[Y0]===-2,b0=k0||D0?F(C[Y0].dataType,C[Y0].dims):P(u[Y0],C[Y0].dataType,C[Y0].dims);if(o.push(b0),b0.data===0)continue;let m0=this.gpuDataManager.get(b0.data);if(!m0)throw Error(`no GPU data for output: ${b0.data}`);if(k0&&this.temporaryData.push(m0),D0){let x5=this.kernelPersistentData.get(this.currentKernelId);x5||(x5=[],this.kernelPersistentData.set(this.currentKernelId,x5)),x5.push(m0)}a.push(m0)}if(K.length!==v.length||a.length!==o.length){if(a.length===0)return $0(q.name),o;throw Error(`Program ${q.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}if(m){let Y0=0,k0=[];m.forEach((x5)=>{let f5=typeof x5.data=="number"?[x5.data]:x5.data;if(f5.length===0)return;let c5,l5,G6=x5.type===10?2:4;x5.type===10?(l5=f5.length>4?16:f5.length>2?8:f5.length*G6,c5=f5.length>4?16:G6*f5.length):(l5=f5.length<=2?f5.length*G6:16,c5=16),Y0=Math.ceil(Y0/l5)*l5,k0.push(Y0);let y6=x5.type===10?8:4;Y0+=f5.length>4?Math.ceil(f5.length/y6)*c5:f5.length*G6});let D0=16;Y0=Math.ceil(Y0/D0)*D0;let b0=new ArrayBuffer(Y0);m.forEach((x5,f5)=>{let c5=k0[f5],l5=typeof x5.data=="number"?[x5.data]:x5.data;if(x5.type===6)new Int32Array(b0,c5,l5.length).set(l5);else if(x5.type===12)new Uint32Array(b0,c5,l5.length).set(l5);else if(x5.type===10)new Uint16Array(b0,c5,l5.length).set(l5);else{if(x5.type!==1)throw Error(`Unsupported uniform type: ${D9(x5.type)}`);new Float32Array(b0,c5,l5.length).set(l5)}});let m0=this.gpuDataManager.create(Y0,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(m0.buffer,0,b0,0,Y0),this.gpuDataManager.release(m0.id),d={offset:0,size:Y0,buffer:m0.buffer}}let j0=this.programManager.normalizeDispatchGroupSize(h),U0=j0[1]===1&&j0[2]===1,_0=aG(q,v,U0),H0=this.programManager.getArtifact(_0);if(H0||(H0=this.programManager.build(q,j0),this.programManager.setArtifact(_0,H0),L6("info",()=>`[artifact] key: ${_0}, programName: ${q.name}`)),m&&H0.uniformVariablesInfo){if(m.length!==H0.uniformVariablesInfo.length)throw Error(`Uniform variables count mismatch: expect ${H0.uniformVariablesInfo.length}, got ${m.length} in program "${H0.programInfo.name}".`);for(let Y0=0;Y0`[ProgramManager] run "${q.name}" (key=${_0}) with ${j0[0]}x${j0[1]}x${j0[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let Y0={kernelId:this.currentKernelId,programName:H0.programInfo.name,inputTensorViews:v,outputTensorViews:o};this.pendingKernels.push(Y0),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(Y0)}return this.programManager.run(H0,K,a,j0,d),$0(q.name),o}upload(q,v){this.gpuDataManager.upload(q,v)}memcpy(q,v){this.gpuDataManager.memcpy(q,v)}async download(q,v){await this.gpuDataManager.download(q,v)}alloc(q){return this.gpuDataManager.create(q).id}free(q){return this.gpuDataManager.release(q)}createKernel(q,v,x,P){let F=aO.get(q);if(!F)throw Error(`kernel not implemented: ${q}`);let M={kernelType:q,kernelName:P,kernelEntry:F[0],attributes:[F[1],x]};this.kernels.set(v,M)}releaseKernel(q){let v=this.kernelPersistentData.get(q);if(v){for(let x of v)this.gpuDataManager.release(x.id);this.kernelPersistentData.delete(q)}this.kernelCustomData.delete(q),this.kernels.delete(q)}computeKernel(q,v,x){let P=this.kernels.get(q);if(!P)throw Error(`kernel not created: ${q}`);let{kernelType:F,kernelName:M,kernelEntry:K,attributes:C}=P;if(this.currentKernelId!==null)throw Error(`kernel "[${F}] ${M}" is not allowed to be called recursively`);this.currentKernelId=q,C[0]&&(C[1]=C[0](C[1]),C[0]=void 0),L6("info",()=>`[WebGPU] Start to run kernel "[${F}] ${M}"...`);let h=this.env.debug;this.temporaryData=[];try{return h&&this.device.pushErrorScope("validation"),K(v,C[1]),0}catch(m){return x.push(Promise.resolve(`[WebGPU] Kernel "[${F}] ${M}" failed. ${m}`)),1}finally{h&&x.push(this.device.popErrorScope().then((m)=>m?`GPU validation error for kernel "[${F}] ${M}": ${m.message}`:null));for(let m of this.temporaryData)this.gpuDataManager.release(m.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer(q,v,x,P){let F=this.sessionExternalDataMapping.get(q);F||(F=new Map,this.sessionExternalDataMapping.set(q,F));let M=F.get(v),K=this.gpuDataManager.registerExternalBuffer(x,P,M);return F.set(v,[K,x]),K}unregisterBuffers(q){let v=this.sessionExternalDataMapping.get(q);v&&(v.forEach((x)=>this.gpuDataManager.unregisterExternalBuffer(x[0])),this.sessionExternalDataMapping.delete(q))}getBuffer(q){let v=this.gpuDataManager.get(q);if(!v)throw Error(`no GPU data for buffer: ${q}`);return v.buffer}createDownloader(q,v,x){return async()=>{let P=await w9(this,q,v);return V1(P.buffer,x)}}writeTimestamp(q){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,q)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:2*this.maxDispatchNumber}),this.queryResolveBuffer=this.device.createBuffer({size:2*this.maxDispatchNumber*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){L6("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){L6("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){L6("info","replay"),this.sessionStatus="replaying";let q=this.capturedCommandList.get(this.currentSessionId),v=this.capturedPendingKernels.get(this.currentSessionId),x=q.length;this.pendingKernels=[];for(let P=0;P=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession(q){this.unregisterBuffers(q),this.capturedCommandList.has(q)&&this.capturedCommandList.delete(q),this.capturedPendingKernels.has(q)&&this.capturedPendingKernels.delete(q),this.gpuDataManager.onReleaseSession(q)}onRunStart(q){this.currentSessionId=q,this.setQueryType()}}}),tG={};p0(tG,{init:()=>$Z});var w8,eG,$Z,jZ,OG,GG,R3,OZ,ZG,E8,qG,VG,NG,JG,vG,RG,U3,Z2,H6,S4,F9,W9,d9,L2,$4,H3,UG,c,L0,K0,C0,o0,G5,X5,K5,u5,a5,m5=q0(()=>{q6(),B1(),X6(),hG(),w8=class q{constructor(v,x,P,F){this.module=v,this.dataType=x,this.data=P,this.dims=F}getFloat32Array(){if(this.dataType!==1)throw Error("Invalid data type");let v=B0.size(this.dims);return v===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,v)}getBigInt64Array(){if(this.dataType!==7)throw Error("Invalid data type");let v=B0.size(this.dims);return v===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,v)}getInt32Array(){if(this.dataType!==6)throw Error("Invalid data type");let v=B0.size(this.dims);return v===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,v)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw Error("Invalid data type");let v=B0.size(this.dims);return v===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,v)}reshape(v){if(B0.size(v)!==B0.size(this.dims))throw Error("Invalid new shape");return new q(this.module,this.dataType,this.data,v)}},eG=class{constructor(q,v,x){this.module=q,this.backend=v,this.customDataOffset=0,this.customDataSize=0,this.adapterInfo=v.adapterInfo;let P=q.PTR_SIZE,F=x/q.PTR_SIZE,M=P===4?"i32":"i64";this.opKernelContext=Number(q.getValue(P*F++,M));let K=Number(q.getValue(P*F++,M));this.outputCount=Number(q.getValue(P*F++,M)),this.customDataOffset=Number(q.getValue(P*F++,"*")),this.customDataSize=Number(q.getValue(P*F++,M));let C=[];for(let h=0;htypeof F=="number"?this.inputs[F]:F)??this.inputs,P=v?.outputs??[];return this.backend.run(q,x,P,(F,M,K)=>new w8(this.module,M,this.output(F,K),K),(F,M)=>{let K=p9(F,M);if(!K)throw Error(`Unsupported data type: ${F}`);let C=K>0?this.backend.gpuDataManager.create(K).id:0;return new w8(this.module,F,C,M)},this.outputCount)}output(q,v){let x=this.module.stackSave();try{let P=this.module.PTR_SIZE,F=P===4?"i32":"i64",M=this.module.stackAlloc((1+v.length)*P);this.module.setValue(M,v.length,F);for(let K=0;K{let F=v.jsepInit;if(!F)throw Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if(q==="webgpu"){let M=new(Xq(),Z0(sG)).WebGpuBackend;await M.initialize(x,P),F("webgpu",[M,(K)=>M.alloc(Number(K)),(K)=>M.free(K),(K,C,h,m=!1)=>{if(m)L6("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(K)}, dst=${Number(C)}, size=${Number(h)}`),M.memcpy(Number(K),Number(C));else{L6("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(K)}, gpuDataId=${Number(C)}, size=${Number(h)}`);let u=v.HEAPU8.subarray(Number(K>>>0),Number(K>>>0)+Number(h));M.upload(Number(C),u)}},async(K,C,h)=>{L6("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${K}, dataOffset=${C}, size=${h}`),await M.download(Number(K),()=>v.HEAPU8.subarray(Number(C)>>>0,Number(C+h)>>>0))},(K,C,h)=>M.createKernel(K,Number(C),h,v.UTF8ToString(v._JsepGetNodeName(Number(C)))),(K)=>M.releaseKernel(K),(K,C,h,m)=>{L6("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${h}, kernel=${K}, contextDataOffset=${C}`);let u=new eG(v,M,Number(C));return M.computeKernel(Number(K),u,m)},()=>M.captureBegin(),()=>M.captureEnd(),()=>M.replay()])}else{let M=new b5(x);F("webnn",[M,()=>M.reserveTensorId(),(K)=>M.releaseTensorId(K),async(K,C,h,m,u)=>M.ensureTensor(K,C,h,m,u),(K,C)=>{M.uploadTensor(K,C)},async(K,C)=>M.downloadTensor(K,C)])}}}),F6=q0(()=>{QG(),CG(),q6(),v3(),s4(),tO(),jZ=(q,v)=>{z6()._OrtInit(q,v)!==0&&v5("Can't initialize onnxruntime.")},OG=async(q)=>{jZ(q.wasm.numThreads,Y1(q.logLevel))},GG=async(q,v)=>{z6().asyncInit?.();{let x=(m5(),Z0(tG)).init;if(v==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw Error("WebGPU is not supported in current environment");let P=q.webgpu.adapter;if(P){if(typeof P.limits!="object"||typeof P.features!="object"||typeof P.requestDevice!="function")throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let F=q.webgpu.powerPreference;if(F!==void 0&&F!=="low-power"&&F!=="high-performance")throw Error(`Invalid powerPreference setting: "${F}"`);let M=q.webgpu.forceFallbackAdapter;if(M!==void 0&&typeof M!="boolean")throw Error(`Invalid forceFallbackAdapter setting: "${M}"`);if(P=await navigator.gpu.requestAdapter({powerPreference:F,forceFallbackAdapter:M}),!P)throw Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await x("webgpu",z6(),q,P)}if(v==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw Error("WebNN is not supported in current environment");await x("webnn",z6(),q)}}},R3=new Map,OZ=(q)=>{let v=z6(),x=v.stackSave();try{let P=v.PTR_SIZE,F=v.stackAlloc(2*P);v._OrtGetInputOutputCount(q,F,F+P)!==0&&v5("Can't get session input/output count.");let M=P===4?"i32":"i64";return[Number(v.getValue(F,M)),Number(v.getValue(F+P,M))]}finally{v.stackRestore(x)}},ZG=(q,v)=>{let x=z6(),P=x.stackSave(),F=0;try{let M=x.PTR_SIZE,K=x.stackAlloc(2*M);x._OrtGetInputOutputMetadata(q,v,K,K+M)!==0&&v5("Can't get session input/output metadata.");let C=Number(x.getValue(K,"*"));F=Number(x.getValue(K+M,"*"));let h=x.HEAP32[F/4];if(h===0)return[C,0];let m=x.HEAPU32[F/4+1],u=[];for(let d=0;d{let v=z6(),x=v._malloc(q.byteLength);if(x===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${q.byteLength}.`);return v.HEAPU8.set(q,x),[x,q.byteLength]},qG=async(q,v)=>{let x,P,F=z6();Array.isArray(q)?[x,P]=q:q.buffer===F.HEAPU8.buffer?[x,P]=[q.byteOffset,q.byteLength]:[x,P]=E8(q);let M=0,K=0,C=0,h=[],m=[],u=[];try{if([K,h]=await _1(v),v?.externalData&&F.mountExternalData){let D0=[];for(let b0 of v.externalData){let m0=typeof b0=="string"?b0:b0.path;D0.push(G9(typeof b0=="string"?b0:b0.data).then((x5)=>{F.mountExternalData(m0,x5)}))}await Promise.all(D0)}for(let D0 of v?.executionProviders??[])if((typeof D0=="string"?D0:D0.name)==="webnn"){if(F.shouldTransferToMLTensor=!1,typeof D0!="string"){let b0=D0,m0=b0?.context,x5=b0?.gpuDevice,f5=b0?.deviceType,c5=b0?.powerPreference;F.currentContext=m0||(x5?await F.webnnCreateMLContext(x5):await F.webnnCreateMLContext({deviceType:f5,powerPreference:c5}))}else F.currentContext=await F.webnnCreateMLContext();break}M=await F._OrtCreateSession(x,P,K),F.webgpuOnCreateSession?.(M),M===0&&v5("Can't create a session."),F.jsepOnCreateSession?.(),F.currentContext&&(F.webnnRegisterMLContext(M,F.currentContext),F.currentContext=void 0,F.shouldTransferToMLTensor=!0);let[d,o]=OZ(M),a=!!v?.enableGraphCapture,j0=[],U0=[],_0=[],H0=[],Y0=[];for(let D0=0;D0D0==="gpu-buffer"||D0==="ml-tensor"||D0==="ml-tensor-cpu-output")&&(C=F._OrtCreateBinding(M),C===0&&v5("Can't create IO binding."),k0={handle:C,outputPreferredLocations:Y0,outputPreferredLocationsEncoded:Y0.map((D0)=>D0==="ml-tensor-cpu-output"?"ml-tensor":D0).map((D0)=>r9(D0))}),R3.set(M,[M,m,u,k0,a,!1]),[M,j0,U0,_0,H0]}catch(d){throw m.forEach((o)=>F._OrtFree(o)),u.forEach((o)=>F._OrtFree(o)),C!==0&&F._OrtReleaseBinding(C)!==0&&v5("Can't release IO binding."),M!==0&&F._OrtReleaseSession(M)!==0&&v5("Can't release session."),d}finally{F._free(x),K!==0&&F._OrtReleaseSessionOptions(K)!==0&&v5("Can't release session options."),h.forEach((d)=>F._free(d)),F.unmountExternalData?.()}},VG=(q)=>{let v=z6(),x=R3.get(q);if(!x)throw Error(`cannot release session. invalid session id: ${q}`);let[P,F,M,K,C]=x;K&&(C&&v._OrtClearBoundOutputs(K.handle)!==0&&v5("Can't clear bound outputs."),v._OrtReleaseBinding(K.handle)!==0&&v5("Can't release IO binding.")),v.jsepOnReleaseSession?.(q),v.webnnOnReleaseSession?.(q),v.webgpuOnReleaseSession?.(q),F.forEach((h)=>v._OrtFree(h)),M.forEach((h)=>v._OrtFree(h)),v._OrtReleaseSession(P)!==0&&v5("Can't release session."),R3.delete(q)},NG=async(q,v,x,P,F,M,K=!1)=>{if(!q)return void v.push(0);let C,h,m=z6(),u=m.PTR_SIZE,d=q[0],o=q[1],a=q[3],j0=a;if(d==="string"&&(a==="gpu-buffer"||a==="ml-tensor"))throw Error("String tensor is not supported on GPU.");if(K&&a!=="gpu-buffer")throw Error(`External buffer must be provided for input/output index ${M} when enableGraphCapture is true.`);if(a==="gpu-buffer"){let H0=q[2].gpuBuffer;h=p9(z9(d),o);{let Y0=m.jsepRegisterBuffer;if(!Y0)throw Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');C=Y0(P,M,H0,h)}}else if(a==="ml-tensor"){let H0=q[2].mlTensor;h=p9(z9(d),o);let Y0=m.webnnRegisterMLTensor;if(!Y0)throw Error('Tensor location "ml-tensor" is not supported without using WebNN.');C=Y0(P,H0,z9(d),o)}else{let H0=q[2];if(Array.isArray(H0)){h=u*H0.length,C=m._malloc(h),x.push(C);for(let Y0=0;Y0m.setValue(_0+k0*u,Y0,u===4?"i32":"i64"));let H0=m._OrtCreateTensor(z9(d),C,h,_0,o.length,r9(j0));H0===0&&v5(`Can't create tensor for input/output. session=${P}, index=${M}.`),v.push(H0)}finally{m.stackRestore(U0)}},JG=async(q,v,x,P,F,M)=>{let K=z6(),C=K.PTR_SIZE,h=R3.get(q);if(!h)throw Error(`cannot run inference. invalid session id: ${q}`);let m=h[0],u=h[1],d=h[2],o=h[3],a=h[4],j0=h[5],U0=v.length,_0=P.length,H0=0,Y0=[],k0=[],D0=[],b0=[],m0=K.stackSave(),x5=K.stackAlloc(U0*C),f5=K.stackAlloc(U0*C),c5=K.stackAlloc(_0*C),l5=K.stackAlloc(_0*C);try{[H0,Y0]=o6(M);for(let w5=0;w5m9*h1,1);z5=D9(a4);let GZ=o?.outputPreferredLocations[P[w5]];if(z5==="string"){if(GZ==="gpu-buffer"||GZ==="ml-tensor")throw Error("String tensor is not supported on GPU.");let m9=[];for(let h1=0;h10){let m9=K.jsepGetBuffer;if(!m9)throw Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let h1=m9(f6),P4=p9(a4,n4);if(P4===void 0||!t6(z5))throw Error(`Unsupported data type: ${z5}`);P9=!0,y6.push([z5,r4,{gpuBuffer:h1,download:K.jsepCreateDownloader(h1,P4,z5),dispose:()=>{K._OrtReleaseTensor(i0)!==0&&v5("Can't release tensor.")}},"gpu-buffer"])}else if(GZ==="ml-tensor"&&n4>0){let{webnnEnsureTensor:m9,webnnIsGraphInputOutputTypeSupported:h1}=K;if(!m9||!h1)throw Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(p9(a4,n4)===void 0||!f9(z5))throw Error(`Unsupported data type: ${z5}`);if(!h1(q,z5,!1))throw Error(`preferredLocation "ml-tensor" for ${z5} output is not supported by current WebNN Context.`);let P4=await m9(q,f6,a4,r4,!1);P9=!0,y6.push([z5,r4,{mlTensor:P4,download:K.webnnCreateMLTensorDownloader(f6,z5),dispose:()=>{K.webnnReleaseTensorId(f6),K._OrtReleaseTensor(i0)}},"ml-tensor"])}else if(GZ==="ml-tensor-cpu-output"&&n4>0){let m9=K.webnnCreateMLTensorDownloader(f6,z5)(),h1=y6.length;P9=!0,A6.push((async()=>{let P4=[h1,await m9];return K.webnnReleaseTensorId(f6),K._OrtReleaseTensor(i0),P4})()),y6.push([z5,r4,[],"cpu"])}else{let m9=new(J9(z5))(n4);new Uint8Array(m9.buffer,m9.byteOffset,m9.byteLength).set(K.HEAPU8.subarray(f6,f6+m9.byteLength)),y6.push([z5,r4,m9,"cpu"])}}finally{K.stackRestore(s5),z5==="string"&&f6&&K._free(f6),P9||K._OrtReleaseTensor(i0)}}o&&!a&&(K._OrtClearBoundOutputs(o.handle)!==0&&v5("Can't clear bound outputs."),R3.set(q,[m,u,d,o,a,!1]));for(let[w5,i0]of await Promise.all(A6))y6[w5][2]=i0;return y6}finally{K.webnnOnRunEnd?.(m),K.stackRestore(m0),k0.forEach((G6)=>K._OrtReleaseTensor(G6)),D0.forEach((G6)=>K._OrtReleaseTensor(G6)),b0.forEach((G6)=>K._free(G6)),H0!==0&&K._OrtReleaseRunOptions(H0),Y0.forEach((G6)=>K._free(G6))}},vG=(q)=>{let v=z6(),x=R3.get(q);if(!x)throw Error("invalid session id");let P=x[0],F=v._OrtEndProfiling(P);F===0&&v5("Can't get an profile file name."),v._OrtFree(F)},RG=(q)=>{let v=[];for(let x of q){let P=x[2];!Array.isArray(P)&&"buffer"in P&&v.push(P.buffer)}return v}}),A5=q0(()=>{d5(),F6(),v3(),I8(),U3=()=>!!H.wasm.proxy&&typeof document<"u",H6=!1,S4=!1,F9=!1,L2=new Map,$4=(q,v)=>{let x=L2.get(q);x?x.push(v):L2.set(q,[v])},H3=()=>{if(H6||!S4||F9||!Z2)throw Error("worker not ready")},UG=(q)=>{switch(q.data.type){case"init-wasm":H6=!1,q.data.err?(F9=!0,d9[1](q.data.err)):(S4=!0,d9[0]()),W9&&(URL.revokeObjectURL(W9),W9=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let v=L2.get(q.data.type);q.data.err?v.shift()[1](q.data.err):v.shift()[0](q.data.out);break}}},c=async()=>{if(!S4){if(H6)throw Error("multiple calls to 'initWasm()' detected.");if(F9)throw Error("previous call to 'initWasm()' failed.");if(H6=!0,U3())return new Promise((q,v)=>{Z2?.terminate(),K6().then(([x,P])=>{try{(Z2=P).onerror=(M)=>v(M),Z2.onmessage=UG,d9=[q,v];let F={type:"init-wasm",in:H};if(!F.in.wasm.wasmPaths&&x){let M=I0();M&&(F.in.wasm.wasmPaths=M)}Z2.postMessage(F),W9=x}catch(F){v(F)}},v)});try{await I9(H.wasm),await OG(H),S4=!0}catch(q){throw F9=!0,q}finally{H6=!1}}},L0=async(q)=>{if(U3())return H3(),new Promise((v,x)=>{$4("init-ep",[v,x]);let P={type:"init-ep",in:{epName:q,env:H}};Z2.postMessage(P)});await GG(H,q)},K0=async(q)=>U3()?(H3(),new Promise((v,x)=>{$4("copy-from",[v,x]);let P={type:"copy-from",in:{buffer:q}};Z2.postMessage(P,[q.buffer])})):E8(q),C0=async(q,v)=>{if(U3()){if(v?.preferredOutputLocation)throw Error('session option "preferredOutputLocation" is not supported for proxy.');return H3(),new Promise((x,P)=>{$4("create",[x,P]);let F={type:"create",in:{model:q,options:{...v}}},M=[];q instanceof Uint8Array&&M.push(q.buffer),Z2.postMessage(F,M)})}return qG(q,v)},o0=async(q)=>{if(U3())return H3(),new Promise((v,x)=>{$4("release",[v,x]);let P={type:"release",in:q};Z2.postMessage(P)});VG(q)},G5=async(q,v,x,P,F,M)=>{if(U3()){if(x.some((K)=>K[3]!=="cpu"))throw Error("input tensor on GPU is not supported for proxy.");if(F.some((K)=>K))throw Error("pre-allocated output tensor is not supported for proxy.");return H3(),new Promise((K,C)=>{$4("run",[K,C]);let h=x,m={type:"run",in:{sessionId:q,inputIndices:v,inputs:h,outputIndices:P,options:M}};Z2.postMessage(m,RG(h))})}return JG(q,v,x,P,F,M)},X5=async(q)=>{if(U3())return H3(),new Promise((v,x)=>{$4("end-profiling",[v,x]);let P={type:"end-profiling",in:q};Z2.postMessage(P)});vG(q)}}),i6=q0(()=>{d5(),A5(),q6(),T5(),tO(),K5=(q,v)=>{switch(q.location){case"cpu":return[q.type,q.dims,q.data,"cpu"];case"gpu-buffer":return[q.type,q.dims,{gpuBuffer:q.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[q.type,q.dims,{mlTensor:q.mlTensor},"ml-tensor"];default:throw Error(`invalid data location: ${q.location} for ${v()}`)}},u5=(q)=>{switch(q[3]){case"cpu":return new r(q[0],q[2],q[1]);case"gpu-buffer":{let v=q[0];if(!t6(v))throw Error(`not supported data type: ${v} for deserializing GPU tensor`);let{gpuBuffer:x,download:P,dispose:F}=q[2];return r.fromGpuBuffer(x,{dataType:v,dims:q[1],download:P,dispose:F})}case"ml-tensor":{let v=q[0];if(!f9(v))throw Error(`not supported data type: ${v} for deserializing MLTensor tensor`);let{mlTensor:x,download:P,dispose:F}=q[2];return r.fromMLTensor(x,{dataType:v,dims:q[1],download:P,dispose:F})}default:throw Error(`invalid data location: ${q[3]}`)}},a5=class{async fetchModelAndCopyToWasmMemory(q){return K0(await G9(q))}async loadModel(q,v){let x;v0(),x=typeof q=="string"?await this.fetchModelAndCopyToWasmMemory(q):q,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await C0(x,v),$0()}async dispose(){return o0(this.sessionId)}async run(q,v,x){v0();let P=[],F=[];Object.entries(q).forEach((d)=>{let o=d[0],a=d[1],j0=this.inputNames.indexOf(o);if(j0===-1)throw Error(`invalid input '${o}'`);P.push(a),F.push(j0)});let M=[],K=[];Object.entries(v).forEach((d)=>{let o=d[0],a=d[1],j0=this.outputNames.indexOf(o);if(j0===-1)throw Error(`invalid output '${o}'`);M.push(a),K.push(j0)});let C=P.map((d,o)=>K5(d,()=>`input "${this.inputNames[F[o]]}"`)),h=M.map((d,o)=>d?K5(d,()=>`output "${this.outputNames[K[o]]}"`):null),m=await G5(this.sessionId,F,C,K,h,x),u={};for(let d=0;dE6,initializeFlags:()=>e5,wasmBackend:()=>a6});var e5,E6,a6,H9=q0(()=>{d5(),A5(),i6(),e5=()=>{(typeof H.wasm.initTimeout!="number"||H.wasm.initTimeout<0)&&(H.wasm.initTimeout=0);let q=H.wasm.simd;if(typeof q!="boolean"&&q!==void 0&&q!=="fixed"&&q!=="relaxed"&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${q}". Reset it to \`false\` and ignore SIMD feature checking.`),H.wasm.simd=!1),typeof H.wasm.proxy!="boolean"&&(H.wasm.proxy=!1),typeof H.wasm.trace!="boolean"&&(H.wasm.trace=!1),typeof H.wasm.numThreads!="number"||!Number.isInteger(H.wasm.numThreads)||H.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)H.wasm.numThreads=1;else{let v=typeof navigator>"u"?R0("node:os").cpus().length:navigator.hardwareConcurrency;H.wasm.numThreads=Math.min(4,Math.ceil((v||1)/2))}},a6=new(E6=class{async init(q){e5(),await c(),await L0(q)}async createInferenceSessionHandler(q,v){let x=new a5;return await x.loadModel(q,v),x}})}),l9={};p0(l9,{InferenceSession:()=>G0,TRACE:()=>e,TRACE_FUNC_BEGIN:()=>v0,TRACE_FUNC_END:()=>$0,Tensor:()=>r,default:()=>i9,env:()=>H,registerBackend:()=>Z}),d5(),d5(),d5();var i9=L5;{let q=(H9(),Z0(O6)).wasmBackend;Z("webgpu",q,5),Z("webnn",q,5),Z("cpu",q,10),Z("wasm",q,10)}return Object.defineProperty(H.versions,"web",{value:"1.22.0",enumerable:!0}),Z0(l9)})(),$.exports=j),CL.exports;var $,j}var hL,LG={},cL={},mL,SZ={},pL,AL,PZ={};function gL(){return AL||(AL=1,function($){var j=LG&&LG.__createBinding||(Object.create?function(V,N,J,R){R===void 0&&(R=J);var U=Object.getOwnPropertyDescriptor(N,J);U&&!("get"in U?!N.__esModule:U.writable||U.configurable)||(U={enumerable:!0,get:function(){return N[J]}}),Object.defineProperty(V,R,U)}:function(V,N,J,R){R===void 0&&(R=J),V[R]=N[J]}),O=LG&&LG.__exportStar||function(V,N){for(var J in V)J==="default"||Object.prototype.hasOwnProperty.call(N,J)||j(N,V,J)};Object.defineProperty($,"__esModule",{value:!0}),$.SileroV5=$.SileroLegacy=void 0,O((hL||(hL=1,Object.defineProperty(cL,"__esModule",{value:!0})),cL),$);var G=function(){if(mL)return SZ;var V;mL=1,Object.defineProperty(SZ,"__esModule",{value:!0}),SZ.SileroLegacy=void 0;let N=mZ();class J{constructor(R,U,H,L,Y){this.ortInstance=R,this._session=U,this._h=H,this._c=L,this._sr=Y,this.reset_state=()=>{let S=Array(128).fill(0);this._h=new this.ortInstance.Tensor("float32",S,[2,1,64]),this._c=new this.ortInstance.Tensor("float32",S,[2,1,64])},this.process=async(S)=>{let X={input:new this.ortInstance.Tensor("float32",S,[1,S.length]),h:this._h,c:this._c,sr:this._sr},D=await this._session.run(X);this._h=D.hn,this._c=D.cn;let[I]=D.output?.data;return{notSpeech:1-I,isSpeech:I}}}}return SZ.SileroLegacy=J,V=J,J.new=async(R,U)=>{N.log.debug("initializing vad");let H=await U(),L=await R.InferenceSession.create(H),Y=new R.Tensor("int64",[16000n]),S=Array(128).fill(0),X=new R.Tensor("float32",S,[2,1,64]),D=new R.Tensor("float32",S,[2,1,64]);return N.log.debug("vad is initialized"),new V(R,L,X,D,Y)},SZ}();Object.defineProperty($,"SileroLegacy",{enumerable:!0,get:function(){return G.SileroLegacy}});var Z=function(){if(pL)return PZ;var V;pL=1,Object.defineProperty(PZ,"__esModule",{value:!0}),PZ.SileroV5=void 0;let N=mZ();function J(U){let H=Array(256).fill(0);return new U.Tensor("float32",H,[2,1,128])}class R{constructor(U,H,L,Y){this._session=U,this._state=H,this._sr=L,this.ortInstance=Y,this.reset_state=()=>{this._state=J(this.ortInstance)},this.process=async(S)=>{let X={input:new this.ortInstance.Tensor("float32",S,[1,S.length]),state:this._state,sr:this._sr},D=await this._session.run(X);this._state=D.stateN;let[I]=D.output?.data;return{notSpeech:1-I,isSpeech:I}}}}return PZ.SileroV5=R,V=R,R.new=async(U,H)=>{N.log.debug("Loading VAD...");let L=await H(),Y=await U.InferenceSession.create(L),S=new U.Tensor("int64",[16000n]),X=J(U);return N.log.debug("...finished loading VAD"),new V(Y,X,S,U)},PZ}();Object.defineProperty($,"SileroV5",{enumerable:!0,get:function(){return Z.SileroV5}})}(LG)),LG}var uL,dL,XZ={};function lL(){if(uL)return XZ;uL=1,Object.defineProperty(XZ,"__esModule",{value:!0}),XZ.Resampler=void 0;let $=mZ();return XZ.Resampler=class{constructor(j){this.options=j,this.process=(O)=>{let G=[];for(let Z of O)for(this.inputBuffer.push(Z);this.hasEnoughDataForFrame();){let V=this.generateOutputFrame();G.push(V)}return G},j.nativeSampleRate<16000&&$.log.error("nativeSampleRate is too low. Should have 16000 = targetSampleRate <= nativeSampleRate"),this.inputBuffer=[]}async*stream(j){for(let O of j)for(this.inputBuffer.push(O);this.hasEnoughDataForFrame();)yield this.generateOutputFrame()}hasEnoughDataForFrame(){return this.inputBuffer.length*this.options.targetSampleRate/this.options.nativeSampleRate>=this.options.targetFrameSize}generateOutputFrame(){let j=new Float32Array(this.options.targetFrameSize),O=0,G=0;for(;O{G.addEventListener("loadend",(R)=>{let U=G.result;O.decodeAudioData(U,(H)=>{Z=H,O.startRendering().then((L)=>{console.log("Rendering completed successfully"),J()}).catch((L)=>{console.error(`Rendering failed: ${L}`)})},(H)=>{console.log(`Error with decoding audio data: ${H}`)})}),G.readAsArrayBuffer(j)}),Z===null)throw Error("some shit");let V=Z,N=new Float32Array(V.length);for(let J=0;JT.modelFetcher(T.modelURL),E=await k.SileroLegacy.new(Y,W),Q=new D.FrameProcessor(E.process,E.reset_state,{frameSamples:T.frameSamples,positiveSpeechThreshold:T.positiveSpeechThreshold,negativeSpeechThreshold:T.negativeSpeechThreshold,redemptionFrames:T.redemptionFrames,preSpeechPadFrames:T.preSpeechPadFrames,minSpeechFrames:T.minSpeechFrames,submitUserSpeechOnPause:T.submitUserSpeechOnPause});return Q.resume(),new this(W,Y,T,Q)}constructor(w,T,W,E){this.modelFetcher=w,this.ort=T,this.options=W,this.frameProcessor=E}async*run(w,T){let W={nativeSampleRate:T,targetSampleRate:16000,targetFrameSize:this.options.frameSamples},E=new z.Resampler(W),Q=0,A=0,l=0,r=[];for await(let v0 of E.stream(w)){await this.frameProcessor.process(v0,($0)=>{r.push($0)});for(let $0 of r)switch($0.msg){case I.Message.SpeechStart:Q=l*this.options.frameSamples/16;break;case I.Message.SpeechEnd:A=(l+1)*this.options.frameSamples/16,yield{audio:$0.audio,start:Q,end:A}}l++}let{msg:e,audio:V0}=this.frameProcessor.endSegment((v0)=>{r.push(v0)});for(let v0 of r)v0.msg===I.Message.SpeechEnd&&(yield{audio:v0.audio,start:Q,end:l*this.options.frameSamples/16})}}}(j7)),j7);Object.defineProperty($,"NonRealTimeVAD",{enumerable:!0,get:function(){return V.NonRealTimeVAD}});let N=dW();$.utils={audioFileToArray:N.audioFileToArray,minFramesForTargetMS:N.minFramesForTargetMS,arrayBufferToBase64:N.arrayBufferToBase64,encodeWAV:N.encodeWAV};var J=(sL||(sL=1,function(R){var U=O7&&O7.__createBinding||(Object.create?function(W,E,Q,A){A===void 0&&(A=Q);var l=Object.getOwnPropertyDescriptor(E,Q);l&&!("get"in l?!E.__esModule:l.writable||l.configurable)||(l={enumerable:!0,get:function(){return E[Q]}}),Object.defineProperty(W,A,l)}:function(W,E,Q,A){A===void 0&&(A=Q),W[A]=E[Q]}),H=O7&&O7.__setModuleDefault||(Object.create?function(W,E){Object.defineProperty(W,"default",{enumerable:!0,value:E})}:function(W,E){W.default=E}),L=O7&&O7.__importStar||function(W){if(W&&W.__esModule)return W;var E={};if(W!=null)for(var Q in W)Q!=="default"&&Object.prototype.hasOwnProperty.call(W,Q)&&U(E,W,Q);return H(E,W),E};Object.defineProperty(R,"__esModule",{value:!0}),R.AudioNodeVAD=R.MicVAD=R.getDefaultRealTimeVADOptions=R.ort=R.DEFAULT_MODEL=void 0;let Y=L(BL()),S=mN(),X=pN(),D=mZ(),I=eq(),k=gL(),z=lL();R.DEFAULT_MODEL="legacy",R.ort=Y,R.getDefaultRealTimeVADOptions=(W)=>({...W==="v5"?X.defaultV5FrameProcessorOptions:X.defaultLegacyFrameProcessorOptions,onFrameProcessed:(E,Q)=>{},onVADMisfire:()=>{D.log.debug("VAD misfire")},onSpeechStart:()=>{D.log.debug("Detected speech start")},onSpeechEnd:()=>{D.log.debug("Detected speech end")},onSpeechRealStart:()=>{D.log.debug("Detected real speech start")},baseAssetPath:"https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@latest/dist/",onnxWASMBasePath:"https://cdn.jsdelivr.net/npm/onnxruntime-web@1.14.0/dist/",stream:void 0,ortConfig:void 0,model:W,workletOptions:{}});class w{static async new(W={}){let E={...(0,R.getDefaultRealTimeVADOptions)(W.model??R.DEFAULT_MODEL),...W},Q;(0,X.validateOptions)(E),Q=E.stream===void 0?await navigator.mediaDevices.getUserMedia({audio:{...E.additionalAudioConstraints,channelCount:1,echoCancellation:!0,autoGainControl:!0,noiseSuppression:!0}}):E.stream;let A=new AudioContext,l=new MediaStreamAudioSourceNode(A,{mediaStream:Q}),r=await T.new(A,E);return r.receive(l),new w(E,A,Q,r,l)}constructor(W,E,Q,A,l,r=!1){this.options=W,this.audioContext=E,this.stream=Q,this.audioNodeVAD=A,this.sourceNode=l,this.listening=r,this.pause=()=>{this.audioNodeVAD.pause(),this.listening=!1},this.start=()=>{this.audioNodeVAD.start(),this.listening=!0},this.destroy=()=>{this.listening&&this.pause(),this.options.stream===void 0&&this.stream.getTracks().forEach((e)=>e.stop()),this.sourceNode.disconnect(),this.audioNodeVAD.destroy(),this.audioContext.close()},this.setOptions=(e)=>{this.audioNodeVAD.setFrameProcessorOptions(e)}}}R.MicVAD=w;class T{static async new(W,E={}){let Q={...(0,R.getDefaultRealTimeVADOptions)(E.model??R.DEFAULT_MODEL),...E};(0,X.validateOptions)(Q),R.ort.env.wasm.wasmPaths=Q.onnxWASMBasePath,Q.ortConfig!==void 0&&Q.ortConfig(R.ort);let A=Q.model==="v5"?"silero_vad_v5.onnx":"silero_vad_legacy.onnx",l=Q.baseAssetPath+A,r=Q.model==="v5"?k.SileroV5.new:k.SileroLegacy.new,e;try{e=await r(R.ort,()=>(0,S.defaultModelFetcher)(l))}catch($0){throw console.error(`Encountered an error while loading model file ${l}`),$0}let V0=new X.FrameProcessor(e.process,e.reset_state,{frameSamples:Q.frameSamples,positiveSpeechThreshold:Q.positiveSpeechThreshold,negativeSpeechThreshold:Q.negativeSpeechThreshold,redemptionFrames:Q.redemptionFrames,preSpeechPadFrames:Q.preSpeechPadFrames,minSpeechFrames:Q.minSpeechFrames,submitUserSpeechOnPause:Q.submitUserSpeechOnPause}),v0=new T(W,Q,V0);return await v0.setupAudioNode(),v0}constructor(W,E,Q){this.ctx=W,this.options=E,this.bufferIndex=0,this.pause=()=>{this.frameProcessor.pause(this.handleFrameProcessorEvent)},this.start=()=>{this.frameProcessor.resume()},this.receive=(A)=>{A.connect(this.audioNode)},this.processFrame=async(A)=>{await this.frameProcessor.process(A,this.handleFrameProcessorEvent)},this.handleFrameProcessorEvent=(A)=>{switch(A.msg){case I.Message.FrameProcessed:this.options.onFrameProcessed(A.probs,A.frame);break;case I.Message.SpeechStart:this.options.onSpeechStart();break;case I.Message.SpeechRealStart:this.options.onSpeechRealStart();break;case I.Message.VADMisfire:this.options.onVADMisfire();break;case I.Message.SpeechEnd:this.options.onSpeechEnd(A.audio)}},this.destroy=()=>{this.audioNode instanceof AudioWorkletNode&&this.audioNode.port.postMessage({message:I.Message.SpeechStop}),this.audioNode.disconnect(),this.gainNode?.disconnect()},this.setFrameProcessorOptions=(A)=>{this.frameProcessor.options={...this.frameProcessor.options,...A}},this.frameProcessor=Q}async setupAudioNode(){if("audioWorklet"in this.ctx&&typeof AudioWorkletNode=="function")try{let E=this.options.baseAssetPath+"vad.worklet.bundle.min.js";await this.ctx.audioWorklet.addModule(E);let Q=this.options.workletOptions??{};return Q.processorOptions={...Q.processorOptions??{},frameSamples:this.options.frameSamples},this.audioNode=new AudioWorkletNode(this.ctx,"vad-helper-worklet",Q),void(this.audioNode.port.onmessage=async(A)=>{if(A.data?.message===I.Message.AudioFrame){let l=A.data.data;l instanceof ArrayBuffer||(l=new ArrayBuffer(A.data.data.byteLength),new Uint8Array(l).set(new Uint8Array(A.data.data)));let r=new Float32Array(l);await this.processFrame(r)}})}catch(E){console.log("AudioWorklet setup failed, falling back to ScriptProcessor",E)}this.resampler=new z.Resampler({nativeSampleRate:this.ctx.sampleRate,targetSampleRate:16000,targetFrameSize:this.options.frameSamples??480}),this.audioNode=this.ctx.createScriptProcessor(4096,1,1),this.gainNode=this.ctx.createGain(),this.gainNode.gain.value=0;let W=!1;this.audioNode.onaudioprocess=async(E)=>{if(!W){W=!0;try{let Q=E.inputBuffer.getChannelData(0);if(E.outputBuffer.getChannelData(0).fill(0),this.resampler){let A=this.resampler.process(Q);for(let l of A)await this.processFrame(l)}}catch(Q){console.error("Error processing audio:",Q)}finally{W=!1}}},this.audioNode.connect(this.gainNode),this.gainNode.connect(this.ctx.destination)}}R.AudioNodeVAD=T}(O7)),O7);Object.defineProperty($,"AudioNodeVAD",{enumerable:!0,get:function(){return J.AudioNodeVAD}}),Object.defineProperty($,"DEFAULT_MODEL",{enumerable:!0,get:function(){return J.DEFAULT_MODEL}}),Object.defineProperty($,"MicVAD",{enumerable:!0,get:function(){return J.MicVAD}}),Object.defineProperty($,"getDefaultRealTimeVADOptions",{enumerable:!0,get:function(){return J.getDefaultRealTimeVADOptions}})}(WL)),WL),oW={onPermissionsRequested:function(){h6.log("Transcriber.onPermissionsRequested()")},onError:function($){h6.error("Transcriber.onError("+$+")")},onModelLoadStarted:function(){h6.log("Transcriber.onModelLoadStarted()")},onModelLoaded:function(){h6.log("Transcriber.onModelLoaded()")},onTranscribeStarted:function(){h6.log("Transcriber.onTranscribeStarted()")},onTranscribeStopped:function(){h6.log("Transcriber.onTranscribeStopped()")},onTranscriptionUpdated:function($){h6.log("Transcriber.onTranscriptionUpdated("+$+")")},onTranscriptionCommitted:function($,j){h6.log("Transcriber.onTranscriptionCommitted("+$+")")},onFrame:function($,j,O){h6.log("Transcriber.onFrame()")},onSpeechStart:function(){h6.log("Transcriber.onSpeechStart()")},onSpeechEnd:function(){h6.log("Transcriber.onSpeechEnd()")}},sW=function(){function $(j){this.useVAD=j,this.flush()}return $.prototype.flush=function(){this.buffer=new Float32Array(this.maxCommitInterval()*p1.FRAME_SIZE),this.speechEMA=this.ema(p1.STREAM_COMMIT_EMA_PERIOD),this.frameEMA=0,this.frameCount=0},$.prototype.set=function(j,O){O===void 0&&(O=void 0),this.buffer.set(j,this.frameCount*p1.FRAME_SIZE),O&&this.updateEMA(O),this.frameCount+=1},$.prototype.updateEMA=function(j){this.frameEMA=this.speechEMA(j.isSpeech)},$.prototype.subarray=function(){return this.buffer.subarray(0,this.frameCount*p1.FRAME_SIZE)},$.prototype.copy=function(){return this.buffer.slice(0,this.frameCount*p1.FRAME_SIZE)},$.prototype.hasFrames=function(){return this.frameCount>0},$.prototype.shouldSet=function(){return this.frameCount<=this.maxCommitInterval()},$.prototype.shouldUpdate=function(){return this.frameCount=this.minCommitInterval()&&this.frameCount=this.minCommitInterval()},$.prototype.ema=function(j){var O=2/(j+1),G=null;return function(Z){return G=G===null?Z:Z*O+G*(1-O)}},$.prototype.minCommitInterval=function(){return p1.STREAM_COMMIT_MIN_INTERVAL},$.prototype.maxCommitInterval=function(){return this.useVAD?p1.VAD_COMMIT_INTERVAL:p1.STREAM_COMMIT_MAX_INTERVAL},$}(),Hy=function(){function $(j,O,G,Z){O===void 0&&(O={}),G===void 0&&(G=!0),Z===void 0&&(Z="quantized"),this.isActive=!1,this.callbacks=OV(OV({},oW),O),$.models.has(j)||$.models.set(j,new gW(j,Z)),this.sttModel=$.models.get(j),this.useVAD=G,this.audioContext=new AudioContext}return $.prototype.load=function(){return l2(this,void 0,void 0,function(){var j,O,G,Z,V=this;return S2(this,function(N){switch(N.label){case 0:this.callbacks.onModelLoadStarted(),N.label=1;case 1:return N.trys.push([1,3,,4]),[4,this.sttModel.loadModel()];case 2:return N.sent(),[3,4];case 3:throw j=N.sent(),this.callbacks.onError(qv.PlatformUnsupported),j;case 4:return this.speechBuffer=new sW(this.useVAD),O=!1,G=function(J,R){var U,H;if(V.speechBuffer.updateEMA(J),V.callbacks.onFrame(J,R,V.speechBuffer.frameEMA),O){if(V.speechBuffer.shouldSet()&&V.speechBuffer.set(R),V.speechBuffer.hasFrames())if(V.useVAD||!V.speechBuffer.shouldUpdate()||V.speechBuffer.shouldCommit()){if(V.speechBuffer.shouldCommit()){var L=V.speechBuffer.copy();(H=V.sttModel)===null||H===void 0||H.generate(L).then(function(Y){Y&&V.callbacks.onTranscriptionCommitted(Y,V.getAudioBuffer(L))}).catch(function(Y){h6.error("Generation misfire: "+Y)})}}else(U=V.sttModel)===null||U===void 0||U.generate(V.speechBuffer.subarray()).then(function(Y){V.callbacks.onTranscriptionUpdated(Y)}).catch(function(Y){h6.error("Generation misfire: "+Y)});V.speechBuffer.shouldCommit()&&V.speechBuffer.flush()}},Z=this,[4,lW.AudioNodeVAD.new(this.audioContext,{onFrameProcessed:G,onVADMisfire:function(){h6.log("Transcriber.onVADMisfire()")},onSpeechStart:function(){h6.log("Transcriber.onSpeechStart()"),V.callbacks.onSpeechStart(),O=!0},onSpeechEnd:function(J){var R;h6.log("Transcriber.onSpeechEnd()"),V.callbacks.onSpeechEnd();var U=V.speechBuffer.copy();(R=V.sttModel)===null||R===void 0||R.generate(U).then(function(H){H&&V.callbacks.onTranscriptionCommitted(H,V.getAudioBuffer(U))}),V.speechBuffer.flush(),O=!1},model:"v5",baseAssetPath:p1.BASE_ASSET_PATH.SILERO_VAD,onnxWASMBasePath:p1.BASE_ASSET_PATH.ONNX_RUNTIME})];case 5:return Z.vadModel=N.sent(),this.attachStream(this.mediaStream),this.callbacks.onModelLoaded(),[2]}})})},$.prototype.attachStream=function(j){if(j)if(this.vadModel){var O=new MediaStreamAudioSourceNode(this.audioContext,{mediaStream:j});this.vadModel.receive(O),h6.log("Transcriber.attachStream(): VAD set to receive source node from stream.")}else this.mediaStream=j},$.prototype.detachStream=function(){},$.prototype.getAudioBuffer=function(j){var O=this.audioContext.createBuffer(1,j.length,16000);return O.getChannelData(0).set(j),O},$.prototype.start=function(){return l2(this,void 0,void 0,function(){var j=this;return S2(this,function(O){switch(O.label){case 0:return this.isActive?[3,3]:(this.isActive=!0,(this.sttModel.isLoaded()||this.sttModel.isLoading())&&this.vadModel!==void 0?[3,2]:[4,this.load()]);case 1:O.sent(),O.label=2;case 2:this.callbacks.onTranscribeStarted(),this.vadModel.start(),this.audioContext.resume(),setTimeout(function(){j.audioContext.state==="suspended"&&h6.warn("AudioContext is suspended, this usually happens on Chrome when you start trying to access an audio source (like a microphone or video) before the user has interacted with the page. Chrome blocks access until there has been a user gesture, so you'll need to rework your code to call start() after an interaction.")},1000),O.label=3;case 3:return[2]}})})},$.prototype.stop=function(){this.isActive=!1,this.callbacks.onTranscribeStopped(),this.vadModel&&this.vadModel.pause()},$.models=new Map,$}(),iW=function($){function j(O,G,Z,V,N){Z===void 0&&(Z={}),V===void 0&&(V=!0),N===void 0&&(N="quantized");var J=$.call(this,G,Z,V,N)||this;return J.isAttached=!1,J.mediaElement=O,J.mediaElement.addEventListener("play",function(){J.start()}),J.mediaElement.addEventListener("pause",function(){J.stop()}),J}return uZ(j,$),j.prototype.start=function(){return l2(this,void 0,void 0,function(){var O,G,Z;return S2(this,function(V){return this.isAttached||(O=this.audioContext.createMediaElementSource(this.mediaElement),G=this.audioContext.createMediaStreamDestination(),Z=G.stream,O.connect(this.audioContext.destination),O.connect(G),$.prototype.attachStream.call(this,Z),this.isAttached=!0),$.prototype.start.call(this),[2]})})},j}(Hy),hK=function($){function j(O,G,Z,V,N,J,R,U){Z===void 0&&(Z=!1),V===void 0&&(V={}),N===void 0&&(N={}),J===void 0&&(J={}),R===void 0&&(R={}),U===void 0&&(U="quantized");var H=$.call(this,O,G,{},Z,U)||this,L=O.clientHeight,Y=O.clientWidth,S=Math.min(Y,L),X=0.05*S,D=0.15*S,I={display:"inline-block",position:"relative",width:"".concat(Y,"px"),height:"".concat(L,"px")},k={position:"absolute",bottom:"".concat(L/3-3*X,"px"),color:"#ffffff",fontSize:"".concat(X,"px"),fontFamily:"sans-serif",zIndex:"2",height:"".concat(3*X,"px"),width:"".concat(Y-2*D,"px"),textAlign:"center",marginLeft:"".concat(D,"px"),marginRight:"".concat(D,"px"),lineHeight:"".concat(1.5*X,"px")};function z(r){return r.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()})}function w(r,e){for(var V0 in r)if(Object.prototype.hasOwnProperty.call(r,V0)){var v0=z(V0);e.setProperty(v0,r[V0])}}var T=document.createElement("div");w(I,T.style),w(V,T.style);var W=document.createElement("div");w(k,W.style),w(N,W.style);var E=document.createElement("span");w({backgroundColor:"rgba(0, 0, 0, 0.6)"},E.style),w(J,E.style),W.appendChild(E);var Q=document.createElement("span");w({color:"#aaaaaa",backgroundColor:"rgba(0, 0, 0, 0.6)"},Q.style),w(R,Q.style),W.appendChild(Q),O.parentElement.insertBefore(T,O),T.appendChild(W),T.appendChild(O);var A="";function l(r,e,V0,v0){v0===void 0&&(v0=!1),A.length+r.length>=e*V0&&(A=""),v0?(A="".concat(A," ").concat(r),E.textContent=A,Q.textContent=""):Q.textContent=" ".concat(r)}return H.callbacks.onTranscriptionUpdated=function(r){r&&!Z&&l(r,60,2)},H.callbacks.onTranscriptionCommitted=function(r){l(r,60,2,!0)},H}return uZ(j,$),j}(iW),tv=function($){function j(O,G,Z,V){return G===void 0&&(G={}),Z===void 0&&(Z=!0),V===void 0&&(V="quantized"),$.call(this,O,G,Z,V)||this}return uZ(j,$),j.prototype.start=function(){return l2(this,void 0,void 0,function(){var O;return S2(this,function(G){switch(G.label){case 0:return[4,navigator.permissions.query({name:"microphone"})];case 1:return G.sent().state!="denied"?[3,2]:(this.callbacks.onError(qv.PermissionDenied),[3,5]);case 2:return G.trys.push([2,4,,5]),this.callbacks.onPermissionsRequested(),[4,navigator.mediaDevices.getUserMedia({audio:{channelCount:1,echoCancellation:!0,autoGainControl:!0,noiseSuppression:!0,sampleRate:16000}})];case 3:return O=G.sent(),$.prototype.attachStream.call(this,O),$.prototype.start.call(this),[3,5];case 4:return G.sent(),this.callbacks.onError(qv.PermissionDenied),$.prototype.stop.call(this),[3,5];case 5:return[2]}})})},j}(Hy),aW=function($,j){var O,G,Z;this.type=$,this.results=j.results,this.resultIndex=j.resultIndex,this.bubbles=(O=j.bubbles)!==null&&O!==void 0&&O,this.cancelable=(G=j.cancelable)!==null&&G!==void 0&&G,this.composed=(Z=j.composed)!==null&&Z!==void 0&&Z},rW=function(){function $(j,O){this._alternatives=j,this.isFinal=O;for(var G=0;G{let j=$V.get($);if(!j)return"backend not found.";if(j.initialized)return j.backend;if(j.aborted)return j.error;{let O=!!j.initPromise;try{return O||(j.initPromise=j.backend.init($)),await j.initPromise,j.initialized=!0,j.backend}catch(G){return O||(j.error=`${G}`,j.aborted=!0),j.error}finally{delete j.initPromise}}},aL="warning",E3={wasm:{},webgl:{},webgpu:{},versions:{common:"1.22.0-dev.20250409-89f8206ba4"},set logLevel($){if($!==void 0){if(typeof $!="string"||["verbose","info","warning","error","fatal"].indexOf($)===-1)throw Error(`Unsupported logging level: ${$}`);aL=$}},get logLevel(){return aL}};Object.defineProperty(E3,"logLevel",{enumerable:!0});var eW=E3,AN=($,j)=>{if($===void 0)throw Error("Image buffer must be defined");if(j.height===void 0||j.width===void 0)throw Error("Image height and width must be defined");if(j.tensorLayout==="NHWC")throw Error("NHWC Tensor layout is not supported yet");let{height:O,width:G}=j,Z=j.norm??{mean:255,bias:0},V,N;V=typeof Z.mean=="number"?[Z.mean,Z.mean,Z.mean,Z.mean]:[Z.mean[0],Z.mean[1],Z.mean[2],Z.mean[3]??255],N=typeof Z.bias=="number"?[Z.bias,Z.bias,Z.bias,Z.bias]:[Z.bias[0],Z.bias[1],Z.bias[2],Z.bias[3]??0];let J=j.format!==void 0?j.format:"RGBA",R=j.tensorFormat!==void 0&&j.tensorFormat!==void 0?j.tensorFormat:"RGB",U=O*G,H=R==="RGBA"?new Float32Array(4*U):new Float32Array(3*U),L=4,Y=0,S=1,X=2,D=3,I=0,k=U,z=2*U,w=-1;J==="RGB"&&(L=3,Y=0,S=1,X=2,D=-1),R==="RGBA"?w=3*U:R==="RBG"?(I=0,z=U,k=2*U):R==="BGR"&&(z=0,k=U,I=2*U);for(let T=0;T{if(!rL){rL=!0;let N=typeof BigInt64Array<"u"&&BigInt64Array.from,J=typeof BigUint64Array<"u"&&BigUint64Array.from,R=globalThis.Float16Array,U=R!==void 0&&R.from;N&&(_G.set("int64",BigInt64Array),hq.set(BigInt64Array,"int64")),J&&(_G.set("uint64",BigUint64Array),hq.set(BigUint64Array,"uint64")),U?(_G.set("float16",R),hq.set(R,"float16")):_G.set("float16",Uint16Array)}})(),typeof $=="object"&&"location"in $)switch(this.dataLocation=$.location,G=$.type,Z=$.dims,$.location){case"cpu-pinned":{let N=_G.get(G);if(!N)throw TypeError(`unsupported type "${G}" to create tensor from pinned buffer`);if(!($.data instanceof N))throw TypeError(`buffer should be of type ${N.name}`);this.cpuData=$.data;break}case"texture":if(G!=="float32")throw TypeError(`unsupported type "${G}" to create tensor from texture`);this.gpuTextureData=$.texture,this.downloader=$.download,this.disposer=$.dispose;break;case"gpu-buffer":if(G!=="float32"&&G!=="float16"&&G!=="int32"&&G!=="int64"&&G!=="uint32"&&G!=="uint8"&&G!=="bool"&&G!=="uint4"&&G!=="int4")throw TypeError(`unsupported type "${G}" to create tensor from gpu buffer`);this.gpuBufferData=$.gpuBuffer,this.downloader=$.download,this.disposer=$.dispose;break;case"ml-tensor":if(G!=="float32"&&G!=="float16"&&G!=="int32"&&G!=="int64"&&G!=="uint32"&&G!=="uint64"&&G!=="int8"&&G!=="uint8"&&G!=="bool"&&G!=="uint4"&&G!=="int4")throw TypeError(`unsupported type "${G}" to create tensor from MLTensor`);this.mlTensorData=$.mlTensor,this.downloader=$.download,this.disposer=$.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let N,J;if(typeof $=="string")if(G=$,J=O,$==="string"){if(!Array.isArray(j))throw TypeError("A string tensor's data must be a string array.");N=j}else{let R=_G.get($);if(R===void 0)throw TypeError(`Unsupported tensor type: ${$}.`);if(Array.isArray(j)){if($==="float16"&&R===Uint16Array||$==="uint4"||$==="int4")throw TypeError(`Creating a ${$} tensor from number array is not supported. Please use ${R.name} as data.`);N=$==="uint64"||$==="int64"?R.from(j,BigInt):R.from(j)}else if(j instanceof R)N=j;else if(j instanceof Uint8ClampedArray){if($!=="uint8")throw TypeError("A Uint8ClampedArray tensor's data must be type of uint8");N=Uint8Array.from(j)}else{if(!($==="float16"&&j instanceof Uint16Array&&R!==Uint16Array))throw TypeError(`A ${G} tensor's data must be type of ${R}`);N=new globalThis.Float16Array(j.buffer,j.byteOffset,j.length)}}else if(J=j,Array.isArray($)){if($.length===0)throw TypeError("Tensor type cannot be inferred from an empty array.");let R=typeof $[0];if(R==="string")G="string",N=$;else{if(R!=="boolean")throw TypeError(`Invalid element type of data array: ${R}.`);G="bool",N=Uint8Array.from($)}}else if($ instanceof Uint8ClampedArray)G="uint8",N=Uint8Array.from($);else{let R=hq.get($.constructor);if(R===void 0)throw TypeError(`Unsupported type for tensor data: ${$.constructor}.`);G=R,N=$}if(J===void 0)J=[N.length];else if(!Array.isArray(J))throw TypeError("A tensor's dims must be a number array");Z=J,this.cpuData=N,this.dataLocation="cpu"}let V=((N)=>{let J=1;for(let R=0;R{let Z=typeof HTMLImageElement<"u"&&O instanceof HTMLImageElement,V=typeof ImageData<"u"&&O instanceof ImageData,N=typeof ImageBitmap<"u"&&O instanceof ImageBitmap,J=typeof O=="string",R,U=G??{},H=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw Error("Canvas is not supported")},L=(Y)=>typeof HTMLCanvasElement<"u"&&Y instanceof HTMLCanvasElement||Y instanceof OffscreenCanvas?Y.getContext("2d"):null;if(Z){let Y=H();Y.width=O.width,Y.height=O.height;let S=L(Y);if(S==null)throw Error("Can not access image data");{let{height:X,width:D}=O;if(G!==void 0&&G.resizedHeight!==void 0&&G.resizedWidth!==void 0&&(X=G.resizedHeight,D=G.resizedWidth),G!==void 0){if(U=G,G.tensorFormat!==void 0)throw Error("Image input config format must be RGBA for HTMLImageElement");U.tensorFormat="RGBA",U.height=X,U.width=D}else U.tensorFormat="RGBA",U.height=X,U.width=D;S.drawImage(O,0,0),R=S.getImageData(0,0,D,X).data}}else{if(!V){if(N){if(G===void 0)throw Error("Please provide image config with format for Imagebitmap");let Y=H();Y.width=O.width,Y.height=O.height;let S=L(Y);if(S!=null){let{height:X,width:D}=O;return S.drawImage(O,0,0,D,X),R=S.getImageData(0,0,D,X).data,U.height=X,U.width=D,AN(R,U)}throw Error("Can not access image data")}if(J)return new Promise((Y,S)=>{let X=H(),D=L(X);if(!O||!D)return S();let I=new Image;I.crossOrigin="Anonymous",I.src=O,I.onload=()=>{X.width=I.width,X.height=I.height,D.drawImage(I,0,0,X.width,X.height);let k=D.getImageData(0,0,X.width,X.height);U.height=X.height,U.width=X.width,Y(AN(k.data,U))}});throw Error("Input data provided is not supported - aborted tensor creation")}{let Y,S;if(G!==void 0&&G.resizedWidth!==void 0&&G.resizedHeight!==void 0?(Y=G.resizedHeight,S=G.resizedWidth):(Y=O.height,S=O.width),G!==void 0&&(U=G),U.format="RGBA",U.height=Y,U.width=S,G!==void 0){let X=H();X.width=S,X.height=Y;let D=L(X);if(D==null)throw Error("Can not access image data");D.putImageData(O,0,0),R=D.getImageData(0,0,S,Y).data}else R=O.data}}if(R!==void 0)return AN(R,U);throw Error("Input data provided is not supported - aborted tensor creation")})($,j)}static fromTexture($,j){return((O,G)=>{let{width:Z,height:V,download:N,dispose:J}=G;return new W3({location:"texture",type:"float32",texture:O,dims:[1,V,Z,4],download:N,dispose:J})})($,j)}static fromGpuBuffer($,j){return((O,G)=>{let{dataType:Z,dims:V,download:N,dispose:J}=G;return new W3({location:"gpu-buffer",type:Z??"float32",gpuBuffer:O,dims:V,download:N,dispose:J})})($,j)}static fromMLTensor($,j){return((O,G)=>{let{dataType:Z,dims:V,download:N,dispose:J}=G;return new W3({location:"ml-tensor",type:Z??"float32",mlTensor:O,dims:V,download:N,dispose:J})})($,j)}static fromPinnedBuffer($,j,O){return((G,Z,V)=>new W3({location:"cpu-pinned",type:G,data:Z,dims:V??[Z.length]}))($,j,O)}toDataURL($){return((j,O)=>{let G=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);G.width=j.dims[3],G.height=j.dims[2];let Z=G.getContext("2d");if(Z!=null){let V,N;O?.tensorLayout!==void 0&&O.tensorLayout==="NHWC"?(V=j.dims[2],N=j.dims[3]):(V=j.dims[3],N=j.dims[2]);let J=O?.format!==void 0?O.format:"RGB",R=O?.norm,U,H;R===void 0||R.mean===void 0?U=[255,255,255,255]:typeof R.mean=="number"?U=[R.mean,R.mean,R.mean,R.mean]:(U=[R.mean[0],R.mean[1],R.mean[2],0],R.mean[3]!==void 0&&(U[3]=R.mean[3])),R===void 0||R.bias===void 0?H=[0,0,0,0]:typeof R.bias=="number"?H=[R.bias,R.bias,R.bias,R.bias]:(H=[R.bias[0],R.bias[1],R.bias[2],0],R.bias[3]!==void 0&&(H[3]=R.bias[3]));let L=N*V,Y=0,S=L,X=2*L,D=-1;J==="RGBA"?(Y=0,S=L,X=2*L,D=3*L):J==="RGB"?(Y=0,S=L,X=2*L):J==="RBG"&&(Y=0,X=L,S=2*L);for(let I=0;I{let G=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d"),Z;if(G==null)throw Error("Can not access image data");{let V,N,J;O?.tensorLayout!==void 0&&O.tensorLayout==="NHWC"?(V=j.dims[2],N=j.dims[1],J=j.dims[3]):(V=j.dims[3],N=j.dims[2],J=j.dims[1]);let R=O!==void 0&&O.format!==void 0?O.format:"RGB",U=O?.norm,H,L;U===void 0||U.mean===void 0?H=[255,255,255,255]:typeof U.mean=="number"?H=[U.mean,U.mean,U.mean,U.mean]:(H=[U.mean[0],U.mean[1],U.mean[2],255],U.mean[3]!==void 0&&(H[3]=U.mean[3])),U===void 0||U.bias===void 0?L=[0,0,0,0]:typeof U.bias=="number"?L=[U.bias,U.bias,U.bias,U.bias]:(L=[U.bias[0],U.bias[1],U.bias[2],0],U.bias[3]!==void 0&&(L[3]=U.bias[3]));let Y=N*V;if(O!==void 0&&(O.format!==void 0&&J===4&&O.format!=="RGBA"||J===3&&O.format!=="RGB"&&O.format!=="BGR"))throw Error("Tensor format doesn't match input tensor dims");let S=4,X=0,D=1,I=2,k=3,z=0,w=Y,T=2*Y,W=-1;R==="RGBA"?(z=0,w=Y,T=2*Y,W=3*Y):R==="RGB"?(z=0,w=Y,T=2*Y):R==="RBG"&&(z=0,T=Y,w=2*Y),Z=G.createImageData(V,N);for(let E=0;E{switch(j.location){case"cpu":return new W3(j.type,j.data,O);case"cpu-pinned":return new W3({location:"cpu-pinned",data:j.data,type:j.type,dims:O});case"texture":return new W3({location:"texture",texture:j.texture,type:j.type,dims:O});case"gpu-buffer":return new W3({location:"gpu-buffer",gpuBuffer:j.gpuBuffer,type:j.type,dims:O});case"ml-tensor":return new W3({location:"ml-tensor",mlTensor:j.mlTensor,type:j.type,dims:O});default:throw Error(`tensorReshape: tensor location ${j.location} is not supported`)}})(this,$)}},PG=W3,xy=($,j)=>{(E3.trace===void 0?E3.wasm.trace:E3.trace)&&console.timeStamp(`${$}::ORT::${j}`)},Ly=($,j)=>{let O=Error().stack?.split(/\r\n|\r|\n/g)||[],G=!1;for(let Z=0;Z{(E3.trace===void 0?E3.wasm.trace:E3.trace)&&Ly("BEGIN",$)},Nv=($)=>{(E3.trace===void 0?E3.wasm.trace:E3.trace)&&Ly("END",$)},$M=class ${constructor(j){this.handler=j}async run(j,O,G){Vv();let Z={},V={};if(typeof j!="object"||j===null||j instanceof PG||Array.isArray(j))throw TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let N=!0;if(typeof O=="object"){if(O===null)throw TypeError("Unexpected argument[1]: cannot be null.");if(O instanceof PG)throw TypeError("'fetches' cannot be a Tensor");if(Array.isArray(O)){if(O.length===0)throw TypeError("'fetches' cannot be an empty array.");N=!1;for(let U of O){if(typeof U!="string")throw TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(U)===-1)throw RangeError(`'fetches' contains invalid output name: ${U}.`);Z[U]=null}if(typeof G=="object"&&G!==null)V=G;else if(G!==void 0)throw TypeError("'options' must be an object.")}else{let U=!1,H=Object.getOwnPropertyNames(O);for(let L of this.outputNames)if(H.indexOf(L)!==-1){let Y=O[L];(Y===null||Y instanceof PG)&&(U=!0,N=!1,Z[L]=Y)}if(U){if(typeof G=="object"&&G!==null)V=G;else if(G!==void 0)throw TypeError("'options' must be an object.")}else V=O}}else if(O!==void 0)throw TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let U of this.inputNames)if(j[U]===void 0)throw Error(`input '${U}' is missing in 'feeds'.`);if(N)for(let U of this.outputNames)Z[U]=null;let J=await this.handler.run(j,Z,V),R={};for(let U in J)if(Object.hasOwnProperty.call(J,U)){let H=J[U];R[U]=H instanceof PG?H:new PG(H.type,H.data,H.dims)}return Nv(),R}async release(){return this.handler.dispose()}static async create(j,O,G,Z){let V;Vv();let N={};if(typeof j=="string"){if(V=j,typeof O=="object"&&O!==null)N=O;else if(O!==void 0)throw TypeError("'options' must be an object.")}else if(j instanceof Uint8Array){if(V=j,typeof O=="object"&&O!==null)N=O;else if(O!==void 0)throw TypeError("'options' must be an object.")}else{if(!(j instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&j instanceof SharedArrayBuffer))throw TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");{let H=j,L=0,Y=j.byteLength;if(typeof O=="object"&&O!==null)N=O;else if(typeof O=="number"){if(L=O,!Number.isSafeInteger(L))throw RangeError("'byteOffset' must be an integer.");if(L<0||L>=H.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${H.byteLength}).`);if(Y=j.byteLength-L,typeof G=="number"){if(Y=G,!Number.isSafeInteger(Y))throw RangeError("'byteLength' must be an integer.");if(Y<=0||L+Y>H.byteLength)throw RangeError(`'byteLength' is out of range (0, ${H.byteLength-L}].`);if(typeof Z=="object"&&Z!==null)N=Z;else if(Z!==void 0)throw TypeError("'options' must be an object.")}else if(G!==void 0)throw TypeError("'byteLength' must be a number.")}else if(O!==void 0)throw TypeError("'options' must be an object.");V=new Uint8Array(H,L,Y)}}let[J,R]=await(async(H)=>{let L=H.executionProviders||[],Y=L.map((z)=>typeof z=="string"?z:z.name),S=Y.length===0?g8:Y,X,D=[],I=new Set;for(let z of S){let w=await tW(z);typeof w=="string"?D.push({name:z,err:w}):(X||(X=w),X===w&&I.add(z))}if(!X)throw Error(`no available backend found. ERR: ${D.map((z)=>`[${z.name}] ${z.err}`).join(", ")}`);for(let{name:z,err:w}of D)Y.includes(z)&&console.warn(`removing requested execution provider "${z}" from session options because it is not available: ${w}`);let k=L.filter((z)=>I.has(typeof z=="string"?z:z.name));return[X,new Proxy(H,{get:(z,w)=>w==="executionProviders"?k:Reflect.get(z,w)})]})(N),U=await J.createInferenceSessionHandler(V,R);return Nv(),new $(U)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}},TZ,G7,i8,nL,_y,Yy,gN,g2,T9,Sy,Py,cq,Xy,Ty,Fy,yy,zy,o8,wZ,uN,ky,Iy,Dy,d2,b3,pZ,dN,C3,o2,Wy,ev,jM=Object.freeze({__proto__:null,InferenceSession:$M,TRACE:xy,TRACE_FUNC_BEGIN:Vv,TRACE_FUNC_END:Nv,Tensor:PG,env:eW,registerBackend:($,j,O)=>{if(j&&typeof j.init=="function"&&typeof j.createInferenceSessionHandler=="function"){let G=$V.get($);if(G===void 0)$V.set($,{backend:j,priority:O});else{if(G.priority>O)return;if(G.priority===O&&G.backend!==j)throw Error(`cannot register backend "${$}" using priority ${O}`)}if(O>=0){let Z=g8.indexOf($);Z!==-1&&g8.splice(Z,1);for(let V=0;VZZ)(function($){return ZZ.apply(this,arguments)}),I5=($,j)=>()=>($&&(j=$($=0)),j),MG=($,j)=>{for(var O in j)Jv($,O,{get:j[O],enumerable:!0})},AZ=($)=>((j,O,G,Z)=>{if(O&&typeof O=="object"||typeof O=="function")for(let V of GM(O))!ZM.call(j,V)&&V!==G&&Jv(j,V,{get:()=>O[V],enumerable:!(Z=OM(O,V))||Z.enumerable});return j})(Jv({},"__esModule",{value:!0}),$),My=I5(()=>{TZ=new Map,G7=[],i8=($,j,O)=>{if(j&&typeof j.init=="function"&&typeof j.createInferenceSessionHandler=="function"){let G=TZ.get($);if(G===void 0)TZ.set($,{backend:j,priority:O});else{if(G.priority>O)return;if(G.priority===O&&G.backend!==j)throw Error(`cannot register backend "${$}" using priority ${O}`)}if(O>=0){let Z=G7.indexOf($);Z!==-1&&G7.splice(Z,1);for(let V=0;V{let j=TZ.get($);if(!j)return"backend not found.";if(j.initialized)return j.backend;if(j.aborted)return j.error;{let O=!!j.initPromise;try{return O||(j.initPromise=j.backend.init($)),await j.initPromise,j.initialized=!0,j.backend}catch(G){return O||(j.error=`${G}`,j.aborted=!0),j.error}finally{delete j.initPromise}}},_y=async($)=>{let j,O=$.executionProviders||[],G=O.map((R)=>typeof R=="string"?R:R.name),Z=G.length===0?G7:G,V=[],N=new Set;for(let R of Z){let U=await nL(R);typeof U=="string"?V.push({name:R,err:U}):(j||(j=U),j===U&&N.add(R))}if(!j)throw Error(`no available backend found. ERR: ${V.map((R)=>`[${R.name}] ${R.err}`).join(", ")}`);for(let{name:R,err:U}of V)G.includes(R)&&console.warn(`removing requested execution provider "${R}" from session options because it is not available: ${U}`);let J=O.filter((R)=>N.has(typeof R=="string"?R:R.name));return[j,new Proxy($,{get:(R,U)=>U==="executionProviders"?J:Reflect.get(R,U)})]}}),VM=I5(()=>{My()}),NM=I5(()=>{Yy="1.22.0-dev.20250409-89f8206ba4"}),Ky=I5(()=>{NM(),gN="warning",g2={wasm:{},webgl:{},webgpu:{},versions:{common:Yy},set logLevel($){if($!==void 0){if(typeof $!="string"||["verbose","info","warning","error","fatal"].indexOf($)===-1)throw Error(`Unsupported logging level: ${$}`);gN=$}},get logLevel(){return gN}},Object.defineProperty(g2,"logLevel",{enumerable:!0})}),JM=I5(()=>{Ky(),T9=g2}),vM=I5(()=>{Sy=($,j)=>{let O=typeof document<"u"?document.createElement("canvas"):new OffscreenCanvas(1,1);O.width=$.dims[3],O.height=$.dims[2];let G=O.getContext("2d");if(G!=null){let Z,V;j?.tensorLayout!==void 0&&j.tensorLayout==="NHWC"?(Z=$.dims[2],V=$.dims[3]):(Z=$.dims[3],V=$.dims[2]);let N,J,R=j?.format!==void 0?j.format:"RGB",U=j?.norm;U===void 0||U.mean===void 0?N=[255,255,255,255]:typeof U.mean=="number"?N=[U.mean,U.mean,U.mean,U.mean]:(N=[U.mean[0],U.mean[1],U.mean[2],0],U.mean[3]!==void 0&&(N[3]=U.mean[3])),U===void 0||U.bias===void 0?J=[0,0,0,0]:typeof U.bias=="number"?J=[U.bias,U.bias,U.bias,U.bias]:(J=[U.bias[0],U.bias[1],U.bias[2],0],U.bias[3]!==void 0&&(J[3]=U.bias[3]));let H=V*Z,L=0,Y=H,S=2*H,X=-1;R==="RGBA"?(L=0,Y=H,S=2*H,X=3*H):R==="RGB"?(L=0,Y=H,S=2*H):R==="RBG"&&(L=0,S=H,Y=2*H);for(let D=0;D{let O,G=typeof document<"u"?document.createElement("canvas").getContext("2d"):new OffscreenCanvas(1,1).getContext("2d");if(G==null)throw Error("Can not access image data");{let Z,V,N;j?.tensorLayout!==void 0&&j.tensorLayout==="NHWC"?(Z=$.dims[2],V=$.dims[1],N=$.dims[3]):(Z=$.dims[3],V=$.dims[2],N=$.dims[1]);let J,R,U=j!==void 0&&j.format!==void 0?j.format:"RGB",H=j?.norm;H===void 0||H.mean===void 0?J=[255,255,255,255]:typeof H.mean=="number"?J=[H.mean,H.mean,H.mean,H.mean]:(J=[H.mean[0],H.mean[1],H.mean[2],255],H.mean[3]!==void 0&&(J[3]=H.mean[3])),H===void 0||H.bias===void 0?R=[0,0,0,0]:typeof H.bias=="number"?R=[H.bias,H.bias,H.bias,H.bias]:(R=[H.bias[0],H.bias[1],H.bias[2],0],H.bias[3]!==void 0&&(R[3]=H.bias[3]));let L=V*Z;if(j!==void 0&&(j.format!==void 0&&N===4&&j.format!=="RGBA"||N===3&&j.format!=="RGB"&&j.format!=="BGR"))throw Error("Tensor format doesn't match input tensor dims");let Y=4,S=0,X=1,D=2,I=3,k=0,z=L,w=2*L,T=-1;U==="RGBA"?(k=0,z=L,w=2*L,T=3*L):U==="RGB"?(k=0,z=L,w=2*L):U==="RBG"&&(k=0,w=L,z=2*L),O=G.createImageData(Z,V);for(let W=0;W{$R(),cq=($,j)=>{if($===void 0)throw Error("Image buffer must be defined");if(j.height===void 0||j.width===void 0)throw Error("Image height and width must be defined");if(j.tensorLayout==="NHWC")throw Error("NHWC Tensor layout is not supported yet");let O,G,{height:Z,width:V}=j,N=j.norm??{mean:255,bias:0};O=typeof N.mean=="number"?[N.mean,N.mean,N.mean,N.mean]:[N.mean[0],N.mean[1],N.mean[2],N.mean[3]??255],G=typeof N.bias=="number"?[N.bias,N.bias,N.bias,N.bias]:[N.bias[0],N.bias[1],N.bias[2],N.bias[3]??0];let J=j.format!==void 0?j.format:"RGBA",R=j.tensorFormat!==void 0&&j.tensorFormat!==void 0?j.tensorFormat:"RGB",U=Z*V,H=R==="RGBA"?new Float32Array(4*U):new Float32Array(3*U),L=4,Y=0,S=1,X=2,D=3,I=0,k=U,z=2*U,w=-1;J==="RGB"&&(L=3,Y=0,S=1,X=2,D=-1),R==="RGBA"?w=3*U:R==="RBG"?(I=0,z=U,k=2*U):R==="BGR"&&(z=0,k=U,I=2*U);for(let T=0;T{let O,G=typeof HTMLImageElement<"u"&&$ instanceof HTMLImageElement,Z=typeof ImageData<"u"&&$ instanceof ImageData,V=typeof ImageBitmap<"u"&&$ instanceof ImageBitmap,N=typeof $=="string",J=j??{},R=()=>{if(typeof document<"u")return document.createElement("canvas");if(typeof OffscreenCanvas<"u")return new OffscreenCanvas(1,1);throw Error("Canvas is not supported")},U=(H)=>typeof HTMLCanvasElement<"u"&&H instanceof HTMLCanvasElement||H instanceof OffscreenCanvas?H.getContext("2d"):null;if(G){let H=R();H.width=$.width,H.height=$.height;let L=U(H);if(L==null)throw Error("Can not access image data");{let{height:Y,width:S}=$;if(j!==void 0&&j.resizedHeight!==void 0&&j.resizedWidth!==void 0&&(Y=j.resizedHeight,S=j.resizedWidth),j!==void 0){if(J=j,j.tensorFormat!==void 0)throw Error("Image input config format must be RGBA for HTMLImageElement");J.tensorFormat="RGBA",J.height=Y,J.width=S}else J.tensorFormat="RGBA",J.height=Y,J.width=S;L.drawImage($,0,0),O=L.getImageData(0,0,S,Y).data}}else{if(!Z){if(V){if(j===void 0)throw Error("Please provide image config with format for Imagebitmap");let H=R();H.width=$.width,H.height=$.height;let L=U(H);if(L!=null){let{height:Y,width:S}=$;return L.drawImage($,0,0,S,Y),O=L.getImageData(0,0,S,Y).data,J.height=Y,J.width=S,cq(O,J)}throw Error("Can not access image data")}if(N)return new Promise((H,L)=>{let Y=R(),S=U(Y);if(!$||!S)return L();let X=new Image;X.crossOrigin="Anonymous",X.src=$,X.onload=()=>{Y.width=X.width,Y.height=X.height,S.drawImage(X,0,0,Y.width,Y.height);let D=S.getImageData(0,0,Y.width,Y.height);J.height=Y.height,J.width=Y.width,H(cq(D.data,J))}});throw Error("Input data provided is not supported - aborted tensor creation")}{let H,L;if(j!==void 0&&j.resizedWidth!==void 0&&j.resizedHeight!==void 0?(H=j.resizedHeight,L=j.resizedWidth):(H=$.height,L=$.width),j!==void 0&&(J=j),J.format="RGBA",J.height=H,J.width=L,j!==void 0){let Y=R();Y.width=L,Y.height=H;let S=U(Y);if(S==null)throw Error("Can not access image data");S.putImageData($,0,0),O=S.getImageData(0,0,L,H).data}else O=$.data}}if(O!==void 0)return cq(O,J);throw Error("Input data provided is not supported - aborted tensor creation")},Ty=($,j)=>{let{width:O,height:G,download:Z,dispose:V}=j;return new d2({location:"texture",type:"float32",texture:$,dims:[1,G,O,4],download:Z,dispose:V})},Fy=($,j)=>{let{dataType:O,dims:G,download:Z,dispose:V}=j;return new d2({location:"gpu-buffer",type:O??"float32",gpuBuffer:$,dims:G,download:Z,dispose:V})},yy=($,j)=>{let{dataType:O,dims:G,download:Z,dispose:V}=j;return new d2({location:"ml-tensor",type:O??"float32",mlTensor:$,dims:G,download:Z,dispose:V})},zy=($,j,O)=>new d2({location:"cpu-pinned",type:$,data:j,dims:O??[j.length]})}),UM=I5(()=>{o8=new Map([["float32",Float32Array],["uint8",Uint8Array],["int8",Int8Array],["uint16",Uint16Array],["int16",Int16Array],["int32",Int32Array],["bool",Uint8Array],["float64",Float64Array],["uint32",Uint32Array],["int4",Uint8Array],["uint4",Uint8Array]]),wZ=new Map([[Float32Array,"float32"],[Uint8Array,"uint8"],[Int8Array,"int8"],[Uint16Array,"uint16"],[Int16Array,"int16"],[Int32Array,"int32"],[Float64Array,"float64"],[Uint32Array,"uint32"]]),uN=!1,ky=()=>{if(!uN){uN=!0;let $=typeof BigInt64Array<"u"&&BigInt64Array.from,j=typeof BigUint64Array<"u"&&BigUint64Array.from,O=globalThis.Float16Array,G=typeof O<"u"&&O.from;$&&(o8.set("int64",BigInt64Array),wZ.set(BigInt64Array,"int64")),j&&(o8.set("uint64",BigUint64Array),wZ.set(BigUint64Array,"uint64")),G?(o8.set("float16",O),wZ.set(O,"float16")):o8.set("float16",Uint16Array)}}}),HM=I5(()=>{$R(),Iy=($)=>{let j=1;for(let O=0;O<$.length;O++){let G=$[O];if(typeof G!="number"||!Number.isSafeInteger(G))throw TypeError(`dims[${O}] must be an integer, got: ${G}`);if(G<0)throw RangeError(`dims[${O}] must be a non-negative integer, got: ${G}`);j*=G}return j},Dy=($,j)=>{switch($.location){case"cpu":return new d2($.type,$.data,j);case"cpu-pinned":return new d2({location:"cpu-pinned",data:$.data,type:$.type,dims:j});case"texture":return new d2({location:"texture",texture:$.texture,type:$.type,dims:j});case"gpu-buffer":return new d2({location:"gpu-buffer",gpuBuffer:$.gpuBuffer,type:$.type,dims:j});case"ml-tensor":return new d2({location:"ml-tensor",mlTensor:$.mlTensor,type:$.type,dims:j});default:throw Error(`tensorReshape: tensor location ${$.location} is not supported`)}}}),$R=I5(()=>{vM(),RM(),UM(),HM(),d2=class{constructor($,j,O){let G,Z;if(ky(),typeof $=="object"&&"location"in $)switch(this.dataLocation=$.location,G=$.type,Z=$.dims,$.location){case"cpu-pinned":{let N=o8.get(G);if(!N)throw TypeError(`unsupported type "${G}" to create tensor from pinned buffer`);if(!($.data instanceof N))throw TypeError(`buffer should be of type ${N.name}`);this.cpuData=$.data;break}case"texture":if(G!=="float32")throw TypeError(`unsupported type "${G}" to create tensor from texture`);this.gpuTextureData=$.texture,this.downloader=$.download,this.disposer=$.dispose;break;case"gpu-buffer":if(G!=="float32"&&G!=="float16"&&G!=="int32"&&G!=="int64"&&G!=="uint32"&&G!=="uint8"&&G!=="bool"&&G!=="uint4"&&G!=="int4")throw TypeError(`unsupported type "${G}" to create tensor from gpu buffer`);this.gpuBufferData=$.gpuBuffer,this.downloader=$.download,this.disposer=$.dispose;break;case"ml-tensor":if(G!=="float32"&&G!=="float16"&&G!=="int32"&&G!=="int64"&&G!=="uint32"&&G!=="uint64"&&G!=="int8"&&G!=="uint8"&&G!=="bool"&&G!=="uint4"&&G!=="int4")throw TypeError(`unsupported type "${G}" to create tensor from MLTensor`);this.mlTensorData=$.mlTensor,this.downloader=$.download,this.disposer=$.dispose;break;default:throw Error(`Tensor constructor: unsupported location '${this.dataLocation}'`)}else{let N,J;if(typeof $=="string")if(G=$,J=O,$==="string"){if(!Array.isArray(j))throw TypeError("A string tensor's data must be a string array.");N=j}else{let R=o8.get($);if(R===void 0)throw TypeError(`Unsupported tensor type: ${$}.`);if(Array.isArray(j)){if($==="float16"&&R===Uint16Array||$==="uint4"||$==="int4")throw TypeError(`Creating a ${$} tensor from number array is not supported. Please use ${R.name} as data.`);N=$==="uint64"||$==="int64"?R.from(j,BigInt):R.from(j)}else if(j instanceof R)N=j;else if(j instanceof Uint8ClampedArray){if($!=="uint8")throw TypeError("A Uint8ClampedArray tensor's data must be type of uint8");N=Uint8Array.from(j)}else{if(!($==="float16"&&j instanceof Uint16Array&&R!==Uint16Array))throw TypeError(`A ${G} tensor's data must be type of ${R}`);N=new globalThis.Float16Array(j.buffer,j.byteOffset,j.length)}}else if(J=j,Array.isArray($)){if($.length===0)throw TypeError("Tensor type cannot be inferred from an empty array.");let R=typeof $[0];if(R==="string")G="string",N=$;else{if(R!=="boolean")throw TypeError(`Invalid element type of data array: ${R}.`);G="bool",N=Uint8Array.from($)}}else if($ instanceof Uint8ClampedArray)G="uint8",N=Uint8Array.from($);else{let R=wZ.get($.constructor);if(R===void 0)throw TypeError(`Unsupported type for tensor data: ${$.constructor}.`);G=R,N=$}if(J===void 0)J=[N.length];else if(!Array.isArray(J))throw TypeError("A tensor's dims must be a number array");Z=J,this.cpuData=N,this.dataLocation="cpu"}let V=Iy(Z);if(this.cpuData&&V!==this.cpuData.length&&(G!=="uint4"&&G!=="int4"||Math.ceil(V/2)!==this.cpuData.length))throw Error(`Tensor's size(${V}) does not match data length(${this.cpuData.length}).`);this.type=G,this.dims=Z,this.size=V}static async fromImage($,j){return Xy($,j)}static fromTexture($,j){return Ty($,j)}static fromGpuBuffer($,j){return Fy($,j)}static fromMLTensor($,j){return yy($,j)}static fromPinnedBuffer($,j,O){return zy($,j,O)}toDataURL($){return Sy(this,$)}toImageData($){return Py(this,$)}get data(){if(this.ensureValid(),!this.cpuData)throw Error("The data is not on CPU. Use `getData()` to download GPU data to CPU, or use `texture` or `gpuBuffer` property to access the GPU data directly.");return this.cpuData}get location(){return this.dataLocation}get texture(){if(this.ensureValid(),!this.gpuTextureData)throw Error("The data is not stored as a WebGL texture.");return this.gpuTextureData}get gpuBuffer(){if(this.ensureValid(),!this.gpuBufferData)throw Error("The data is not stored as a WebGPU buffer.");return this.gpuBufferData}get mlTensor(){if(this.ensureValid(),!this.mlTensorData)throw Error("The data is not stored as a WebNN MLTensor.");return this.mlTensorData}async getData($){switch(this.ensureValid(),this.dataLocation){case"cpu":case"cpu-pinned":return this.data;case"texture":case"gpu-buffer":case"ml-tensor":if(!this.downloader)throw Error("The current tensor is not created with a specified data downloader.");if(this.isDownloading)throw Error("The current tensor is being downloaded.");try{this.isDownloading=!0;let j=await this.downloader();return this.downloader=void 0,this.dataLocation="cpu",this.cpuData=j,$&&this.disposer&&(this.disposer(),this.disposer=void 0),j}finally{this.isDownloading=!1}default:throw Error(`cannot get data from location: ${this.dataLocation}`)}}dispose(){if(this.isDownloading)throw Error("The current tensor is being downloaded.");this.disposer&&(this.disposer(),this.disposer=void 0),this.cpuData=void 0,this.gpuTextureData=void 0,this.gpuBufferData=void 0,this.mlTensorData=void 0,this.downloader=void 0,this.isDownloading=void 0,this.dataLocation="none"}ensureValid(){if(this.dataLocation==="none")throw Error("The tensor is disposed.")}reshape($){if(this.ensureValid(),this.downloader||this.disposer)throw Error("Cannot reshape a tensor that owns GPU resource.");return Dy(this,$)}}}),by=I5(()=>{$R(),b3=d2}),fy=I5(()=>{Ky(),pZ=($,j)=>{(typeof g2.trace>"u"?!g2.wasm.trace:!g2.trace)||console.timeStamp(`${$}::ORT::${j}`)},dN=($,j)=>{let O=Error().stack?.split(/\r\n|\r|\n/g)||[],G=!1;for(let Z=0;Z{(typeof g2.trace>"u"?!g2.wasm.trace:!g2.trace)||dN("BEGIN",$)},o2=($)=>{(typeof g2.trace>"u"?!g2.wasm.trace:!g2.trace)||dN("END",$)}}),xM=I5(()=>{My(),by(),fy(),Wy=class ${constructor(j){this.handler=j}async run(j,O,G){C3();let Z={},V={};if(typeof j!="object"||j===null||j instanceof b3||Array.isArray(j))throw TypeError("'feeds' must be an object that use input names as keys and OnnxValue as corresponding values.");let N=!0;if(typeof O=="object"){if(O===null)throw TypeError("Unexpected argument[1]: cannot be null.");if(O instanceof b3)throw TypeError("'fetches' cannot be a Tensor");if(Array.isArray(O)){if(O.length===0)throw TypeError("'fetches' cannot be an empty array.");N=!1;for(let U of O){if(typeof U!="string")throw TypeError("'fetches' must be a string array or an object.");if(this.outputNames.indexOf(U)===-1)throw RangeError(`'fetches' contains invalid output name: ${U}.`);Z[U]=null}if(typeof G=="object"&&G!==null)V=G;else if(typeof G<"u")throw TypeError("'options' must be an object.")}else{let U=!1,H=Object.getOwnPropertyNames(O);for(let L of this.outputNames)if(H.indexOf(L)!==-1){let Y=O[L];(Y===null||Y instanceof b3)&&(U=!0,N=!1,Z[L]=Y)}if(U){if(typeof G=="object"&&G!==null)V=G;else if(typeof G<"u")throw TypeError("'options' must be an object.")}else V=O}}else if(typeof O<"u")throw TypeError("Unexpected argument[1]: must be 'fetches' or 'options'.");for(let U of this.inputNames)if(typeof j[U]>"u")throw Error(`input '${U}' is missing in 'feeds'.`);if(N)for(let U of this.outputNames)Z[U]=null;let J=await this.handler.run(j,Z,V),R={};for(let U in J)if(Object.hasOwnProperty.call(J,U)){let H=J[U];R[U]=H instanceof b3?H:new b3(H.type,H.data,H.dims)}return o2(),R}async release(){return this.handler.dispose()}static async create(j,O,G,Z){C3();let V,N={};if(typeof j=="string"){if(V=j,typeof O=="object"&&O!==null)N=O;else if(typeof O<"u")throw TypeError("'options' must be an object.")}else if(j instanceof Uint8Array){if(V=j,typeof O=="object"&&O!==null)N=O;else if(typeof O<"u")throw TypeError("'options' must be an object.")}else{if(!(j instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&j instanceof SharedArrayBuffer))throw TypeError("Unexpected argument[0]: must be 'path' or 'buffer'.");{let H=j,L=0,Y=j.byteLength;if(typeof O=="object"&&O!==null)N=O;else if(typeof O=="number"){if(L=O,!Number.isSafeInteger(L))throw RangeError("'byteOffset' must be an integer.");if(L<0||L>=H.byteLength)throw RangeError(`'byteOffset' is out of range [0, ${H.byteLength}).`);if(Y=j.byteLength-L,typeof G=="number"){if(Y=G,!Number.isSafeInteger(Y))throw RangeError("'byteLength' must be an integer.");if(Y<=0||L+Y>H.byteLength)throw RangeError(`'byteLength' is out of range (0, ${H.byteLength-L}].`);if(typeof Z=="object"&&Z!==null)N=Z;else if(typeof Z<"u")throw TypeError("'options' must be an object.")}else if(typeof G<"u")throw TypeError("'byteLength' must be a number.")}else if(typeof O<"u")throw TypeError("'options' must be an object.");V=new Uint8Array(H,L,Y)}}let[J,R]=await _y(N),U=await J.createInferenceSessionHandler(V,R);return o2(),new $(U)}startProfiling(){this.handler.startProfiling()}endProfiling(){this.handler.endProfiling()}get inputNames(){return this.handler.inputNames}get outputNames(){return this.handler.outputNames}get inputMetadata(){return this.handler.inputMetadata}get outputMetadata(){return this.handler.outputMetadata}}}),LM=I5(()=>{xM(),ev=Wy}),_M=I5(()=>{}),YM=I5(()=>{}),SM=I5(()=>{}),PM=I5(()=>{}),wy={};/*! + * ONNX Runtime Web v1.22.0-dev.20250409-89f8206ba4 + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. + */MG(wy,{InferenceSession:()=>ev,TRACE:()=>pZ,TRACE_FUNC_BEGIN:()=>C3,TRACE_FUNC_END:()=>o2,Tensor:()=>b3,env:()=>T9,registerBackend:()=>i8});var Q3=I5(()=>{VM(),JM(),LM(),by(),_M(),YM(),fy(),SM(),PM()}),jR=I5(()=>{}),Ey={};MG(Ey,{default:()=>Qy});var lN,tL,Qy,XM=I5(()=>{oI(),G$(),HR(),lN="ort-wasm-proxy-worker",(tL=globalThis.self?.name===lN)&&(self.onmessage=($)=>{let{type:j,in:O}=$.data;try{switch(j){case"init-wasm":OR(O.wasm).then(()=>{FR(O).then(()=>{postMessage({type:j})},(G)=>{postMessage({type:j,err:G})})},(G)=>{postMessage({type:j,err:G})});break;case"init-ep":{let{epName:G,env:Z}=O;yR(Z,G).then(()=>{postMessage({type:j})},(V)=>{postMessage({type:j,err:V})});break}case"copy-from":{let{buffer:G}=O,Z=PV(G);postMessage({type:j,out:Z});break}case"create":{let{model:G,options:Z}=O;zR(G,Z).then((V)=>{postMessage({type:j,out:V})},(V)=>{postMessage({type:j,err:V})});break}case"release":kR(O),postMessage({type:j});break;case"run":{let{sessionId:G,inputIndices:Z,inputs:V,outputIndices:N,options:J}=O;IR(G,Z,V,N,Array(N.length).fill(null),J).then((R)=>{R.some((U)=>U[3]!=="cpu")?postMessage({type:j,err:"Proxy does not support non-cpu tensor location."}):postMessage({type:j,out:R},WR([...V,...R]))},(R)=>{postMessage({type:j,err:R})});break}case"end-profiling":DR(O),postMessage({type:j})}}catch(G){postMessage({type:j,err:G})}}),Qy=tL?null:($)=>new Worker($??Y2,{type:"module",name:lN})}),Cy={};MG(Cy,{default:()=>By});var oN,sN,By,eL,iN,vv,$_,Y2,hy,mq,j_,O_,aN,G_,rN,cy,nN,my,tN,pq,FZ,eN,Z_,q_,V_,OR,_9,K3,HV,N9,py,N_,J_,v_,yZ,R_,Ay,XG,z4,s8,GR,xV,ZR,qR,Rv,VR,U_,H_,x_,L_,NR,__,l6,Y_,IG,l0,LV,gy,uy,dy,JR,Uv,$J,S_,jJ,P_,OJ,GJ,ZJ,X_,ly,Aq,T_,oy,qJ,gq,uq,F_,y_,VJ,Hv,z_,sy,k_,j9,DG,dq,Z1,k1,j6,K9,xv,yG,N7,R6,zZ,O5,t5,iy,vR,I_,ay,D_,NJ,W_,M_,K_,b_,X2,ry,ny,f_,w_,E_,Q_,C_,B_,h_,c_,m_,p_,F3,ty,ey,$z,jz,Oz,Gz,Zz,qz,Vz,Nz,y3,A_,_V,Lv,z3,g_,u_,d_,l_,o_,s_,i_,a_,r_,n_,k3,Jz,vz,Rz,Uz,Hz,xz,Lz,_z,Yz,Sz,JJ,Pz,Xz,_v,t_,lq,e_,$Y,jY,gZ,OY,Tz,GY,ZY,qY,Fz,VY,NY,yz,JY,n6,zz,kz,Iz,Dz,Wz,Mz,Kz,bz,fz,vY,wz,Ez,Qz,Cz,EZ,Bz,jV,hz,cz,mz,pz,Az,gz,uz,dz,lz,oz,sz,iz,az,rz,nz,tz,vJ,ez,Yv,Sv,$k,jk,Ok,RY,UY,Gk,HY,xY,Zk,LY,_Y,I3,qk,Vk,Nk,Jk,vk,Rk,Uk,Hk,xk,Lk,YY,SY,PY,XY,_k,Yk,t8,e8,$$,RR,D1,Sk,Pk,BZ,UR,TY,FY,Pv,RJ,yY,Xv,zY,YV,kY,Xk,IY,UJ,kZ,DY,HJ,WY,Tk,Fk,yk,zk,MY,oq,KY,sq,Tv,xJ,bY,fY,Fv,kk,wY,EY,QY,LJ,Ik,CY,_J,BY,Dk,hY,Wk,Mk,cY,mY,pY,Kk,bk,YJ,iq,SJ,AY,gY,uY,PJ,dY,fk,wk,lY,XJ,oY,sY,Ek,iY,Qk,aY,rY,Ck,Bk,nY,hk,ck,tY,eY,mk,pk,$S,jS,Ak,gk,OS,GS,uk,dk,O4,F4,c8,m8,ZS,qS,VS,NS,JS,vS,RS,lk,ok,m1,US,sk,TJ,HS,QZ,ik,xS,LS,_S,YS,yv,ak,rk,SS,SV,nk,PS,XS,FJ,TS,tk,yJ,FS,yS,ek,zS,kS,$I,IS,jI,DS,WS,MS,OI,GI,KS,bS,fS,wS,ES,QS,CS,BS,ZI,IZ,zJ,kJ,IJ,DJ,hS,cS,WJ,MJ,qI,VI,KJ,NI,JI,bJ,vI,RI,UI,HI,mS,pS,xI,LI,AS,gS,_I,uS,fJ,wJ,dS,YI,SI,lS,oS,sS,EJ,iS,aS,rS,nS,tS,eS,$P,jP,QJ,OP,GP,ZP,qP,VP,PI,XI,NP,JP,TI,vP,DZ,RP,CJ,UP,HP,FI,yI,xP,LP,zI,kI,BJ,_P,YP,SP,II,PP,XP,DI,WI,MI,TM=I5(()=>{oN=import.meta.url,sN=async function($={}){var j,O,G=$,Z=new Promise((b,_)=>{j=b,O=_}),V=typeof window=="object",N=typeof WorkerGlobalScope<"u",J=N&&self.name?.startsWith("em-pthread");G.mountExternalData=(b,_)=>{b.startsWith("./")&&(b=b.substring(2)),(G.Eb||(G.Eb=new Map)).set(b,_)},G.unmountExternalData=()=>{delete G.Eb};var R=globalThis.SharedArrayBuffer??new WebAssembly.Memory({initial:0,maximum:0,pc:!0}).buffer.constructor;let U=(b)=>async(..._)=>{try{if(G.Fb)throw Error("Session already started");let y=G.Fb={dc:_[0],errors:[]},f=await b(..._);if(G.Fb!==y)throw Error("Session mismatch");G.Jb?.flush();let B=y.errors;if(0J0),0{if(b==="webgpu"){[G.Jb,G.Ub,G.Yb,G.Kb,G.Xb,G.jb,G.Zb,G.ac,G.Vb,G.Wb,G.$b]=_;let y=G.Jb;G.jsepRegisterBuffer=(f,B,g,J0)=>y.registerBuffer(f,B,g,J0),G.jsepGetBuffer=(f)=>y.getBuffer(f),G.jsepCreateDownloader=(f,B,g)=>y.createDownloader(f,B,g),G.jsepOnCreateSession=(f)=>{y.onCreateSession(f)},G.jsepOnReleaseSession=(f)=>{y.onReleaseSession(f)},G.jsepOnRunStart=(f)=>y.onRunStart(f),G.bc=(f,B)=>{y.upload(f,B)}}else if(b==="webnn"){let y=_[0];[G.nc,G.Nb,G.webnnEnsureTensor,G.Ob,G.webnnDownloadTensor]=_.slice(1),G.webnnReleaseTensorId=G.Nb,G.webnnUploadTensor=G.Ob,G.webnnOnRunStart=(f)=>y.onRunStart(f),G.webnnOnRunEnd=y.onRunEnd.bind(y),G.webnnRegisterMLContext=(f,B)=>{y.registerMLContext(f,B)},G.webnnOnReleaseSession=(f)=>{y.onReleaseSession(f)},G.webnnCreateMLTensorDownloader=(f,B)=>y.createMLTensorDownloader(f,B),G.webnnRegisterMLTensor=(f,B,g,J0)=>y.registerMLTensor(f,B,g,J0),G.webnnCreateMLContext=(f)=>y.createMLContext(f),G.webnnRegisterMLConstant=(f,B,g,J0,z0,f0)=>y.registerMLConstant(f,B,g,J0,z0,G.Eb,f0),G.webnnRegisterGraphInput=y.registerGraphInput.bind(y),G.webnnIsGraphInput=y.isGraphInput.bind(y),G.webnnCreateTemporaryTensor=y.createTemporaryTensor.bind(y),G.webnnIsInt64Supported=y.isInt64Supported.bind(y)}};let H=()=>{let b=(_,y,f)=>(...B)=>{let g=N6,J0=y?.();B=_(...B);let z0=y?.();return J0!==z0&&(_=z0,f(J0),y=f=null),N6!=g?new Promise((f0,A0)=>{B6={resolve:f0,reject:A0}}):B};(()=>{for(let _ of["_OrtAppendExecutionProvider","_OrtCreateSession","_OrtRun","_OrtRunWithBinding","_OrtBindInput"])G[_]=b(G[_],()=>G[_],(y)=>G[_]=y)})(),U!==void 0&&(G._OrtRun=U(G._OrtRun),G._OrtRunWithBinding=U(G._OrtRunWithBinding)),H=void 0};G.asyncInit=()=>{H?.()};var L,Y,S=Object.assign({},G),X=(b,_)=>{throw _},D="";(V||N)&&(N?D=self.location.href:typeof document<"u"&&document.currentScript&&(D=document.currentScript.src),oN&&(D=oN),D=D.startsWith("blob:")?"":D.slice(0,D.replace(/[?#].*/,"").lastIndexOf("/")+1),N&&(Y=(b)=>{var _=new XMLHttpRequest;return _.open("GET",b,!1),_.responseType="arraybuffer",_.send(null),new Uint8Array(_.response)}),L=async(b)=>{if(s(b))return new Promise((y,f)=>{var B=new XMLHttpRequest;B.open("GET",b,!0),B.responseType="arraybuffer",B.onload=()=>{B.status==200||B.status==0&&B.response?y(B.response):f(B.status)},B.onerror=f,B.send(null)});var _=await fetch(b,{credentials:"same-origin"});if(_.ok)return _.arrayBuffer();throw Error(_.status+" : "+_.url)});var I=console.log.bind(console),k=console.error.bind(console),z=I,w=k;Object.assign(G,S),S=null;var T,W,E,Q,A,l,r,e,V0,v0,$0,i,G0,S0=G.wasmBinary,F0=!1,s=(b)=>b.startsWith("file://");function n(){return T.buffer!=Q.buffer&&P0(),Q}function R0(){return T.buffer!=Q.buffer&&P0(),A}function q0(){return T.buffer!=Q.buffer&&P0(),l}function p0(){return T.buffer!=Q.buffer&&P0(),r}function Z0(){return T.buffer!=Q.buffer&&P0(),e}function M0(){return T.buffer!=Q.buffer&&P0(),V0}function q5(){return T.buffer!=Q.buffer&&P0(),v0}function E0(){return T.buffer!=Q.buffer&&P0(),G0}if(J){let b=function(_){try{var y=_.data,f=y.Bb;if(f==="load"){let B=[];self.onmessage=(g)=>B.push(g),self.startWorker=()=>{postMessage({Bb:"loaded"});for(let g of B)b(g);self.onmessage=b};for(let g of y.Rb)G[g]&&!G[g].proxy||(G[g]=(...J0)=>{postMessage({Bb:"callHandler",Qb:g,args:J0})},g=="print"&&(z=G[g]),g=="printErr"&&(w=G[g]));T=y.kc,P0(),e0(y.lc)}else if(f==="run"){S5(y.Ab),v1(y.Ab,0,0,1,0,0),N5(),b5(y.Ab),N0||(t1(),N0=!0);try{K6(y.fc,y.Hb)}catch(B){if(B!="unwind")throw B}}else y.target!=="setimmediate"&&(f==="checkMailbox"?N0&&P5():f&&(w(`worker: received unknown command ${f}`),w(y)))}catch(B){throw $2(),B}};var e0,N0=!1;w=function(..._){_=_.join(" "),console.error(_)},self.alert=function(..._){postMessage({Bb:"alert",text:_.join(" "),ic:e1()})},self.onunhandledrejection=(_)=>{throw _.reason||_},self.onmessage=b}function P0(){var b=T.buffer;G.HEAP8=Q=new Int8Array(b),G.HEAP16=l=new Int16Array(b),G.HEAPU8=A=new Uint8Array(b),G.HEAPU16=r=new Uint16Array(b),G.HEAP32=e=new Int32Array(b),G.HEAPU32=V0=new Uint32Array(b),G.HEAPF32=v0=new Float32Array(b),G.HEAPF64=G0=new Float64Array(b),G.HEAP64=$0=new BigInt64Array(b),G.HEAPU64=i=new BigUint64Array(b)}function Q0(){J?startWorker(G):o5.Ca()}J||(T=new WebAssembly.Memory({initial:256,maximum:65536,shared:!0}),P0());var a0,r0=0,g0=null;function J5(){if(--r0==0&&g0){var b=g0;g0=null,b()}}function t0(b){throw w(b="Aborted("+b+")"),F0=!0,b=new WebAssembly.RuntimeError(b+". Build with -sASSERTIONS for more info."),O(b),b}function y5(){return{a:{L:T0,Aa:U5,b:w6,$:c6,A:a9,pa:I9,X:E5,Z:v5,qa:o6,na:b9,ga:H1,ma:x1,J:o9,Y:L1,V:_1,oa:z9,W:D9,va:Y1,E:A1,Q:q1,O:g1,D:d1,u:V1,r:W1,P:M1,z:h0,R:c0,ja:F5,T:S6,aa:O9,M:g6,F:k9,ia:b5,sa:w9,t:J1,Ba:P6,w:u0,o:V2,l:i2,c:L6,n:T2,j:n2,v:A9,p:h3,f:s1,s:c3,m:m3,e:p3,k:A3,i:g3,g:i1,d:u3,da:d3,ea:y2,fa:l3,ba:e2,ca:N2,N:$3,xa:z2,ua:o3,h:f1,C:j3,G:t9,ta:Z4,x:s3,ra:i3,U:a3,q:b1,y:r3,K:n3,S:k2,za:F1,ya:e9,ka:D2,la:v2,_:t,B:W2,I:M2,ha:K2,H:Z3,a:T,wa:V5}}}var R5={829644:(b,_,y,f,B)=>{if(G===void 0||!G.Eb)return 1;if((b=V6(Number(b>>>0))).startsWith("./")&&(b=b.substring(2)),!(b=G.Eb.get(b)))return 2;if(_=Number(_>>>0),y=Number(y>>>0),f=Number(f>>>0),_+y>b.byteLength)return 3;try{let g=b.subarray(_,_+y);switch(B){case 0:R0().set(g,f>>>0);break;case 1:G.mc?G.mc(f,g):G.bc(f,g);break;default:return 4}return 0}catch{return 4}},830468:(b,_,y)=>{G.Ob(b,R0().subarray(_>>>0,_+y>>>0))},830532:()=>G.nc(),830574:(b)=>{G.Nb(b)},830611:()=>{G.Vb()},830642:()=>{G.Wb()},830671:()=>{G.$b()},830696:(b)=>G.Ub(b),830729:(b)=>G.Yb(b),830761:(b,_,y)=>{G.Kb(Number(b),Number(_),Number(y),!0)},830824:(b,_,y)=>{G.Kb(Number(b),Number(_),Number(y))},830881:()=>typeof wasmOffsetConverter<"u",830938:(b)=>{G.jb("Abs",b,void 0)},830989:(b)=>{G.jb("Neg",b,void 0)},831040:(b)=>{G.jb("Floor",b,void 0)},831093:(b)=>{G.jb("Ceil",b,void 0)},831145:(b)=>{G.jb("Reciprocal",b,void 0)},831203:(b)=>{G.jb("Sqrt",b,void 0)},831255:(b)=>{G.jb("Exp",b,void 0)},831306:(b)=>{G.jb("Erf",b,void 0)},831357:(b)=>{G.jb("Sigmoid",b,void 0)},831412:(b,_,y)=>{G.jb("HardSigmoid",b,{alpha:_,beta:y})},831491:(b)=>{G.jb("Log",b,void 0)},831542:(b)=>{G.jb("Sin",b,void 0)},831593:(b)=>{G.jb("Cos",b,void 0)},831644:(b)=>{G.jb("Tan",b,void 0)},831695:(b)=>{G.jb("Asin",b,void 0)},831747:(b)=>{G.jb("Acos",b,void 0)},831799:(b)=>{G.jb("Atan",b,void 0)},831851:(b)=>{G.jb("Sinh",b,void 0)},831903:(b)=>{G.jb("Cosh",b,void 0)},831955:(b)=>{G.jb("Asinh",b,void 0)},832008:(b)=>{G.jb("Acosh",b,void 0)},832061:(b)=>{G.jb("Atanh",b,void 0)},832114:(b)=>{G.jb("Tanh",b,void 0)},832166:(b)=>{G.jb("Not",b,void 0)},832217:(b,_,y)=>{G.jb("Clip",b,{min:_,max:y})},832286:(b)=>{G.jb("Clip",b,void 0)},832338:(b,_)=>{G.jb("Elu",b,{alpha:_})},832396:(b)=>{G.jb("Gelu",b,void 0)},832448:(b)=>{G.jb("Relu",b,void 0)},832500:(b,_)=>{G.jb("LeakyRelu",b,{alpha:_})},832564:(b,_)=>{G.jb("ThresholdedRelu",b,{alpha:_})},832634:(b,_)=>{G.jb("Cast",b,{to:_})},832692:(b)=>{G.jb("Add",b,void 0)},832743:(b)=>{G.jb("Sub",b,void 0)},832794:(b)=>{G.jb("Mul",b,void 0)},832845:(b)=>{G.jb("Div",b,void 0)},832896:(b)=>{G.jb("Pow",b,void 0)},832947:(b)=>{G.jb("Equal",b,void 0)},833000:(b)=>{G.jb("Greater",b,void 0)},833055:(b)=>{G.jb("GreaterOrEqual",b,void 0)},833117:(b)=>{G.jb("Less",b,void 0)},833169:(b)=>{G.jb("LessOrEqual",b,void 0)},833228:(b,_,y,f,B)=>{G.jb("ReduceMean",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},833403:(b,_,y,f,B)=>{G.jb("ReduceMax",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},833577:(b,_,y,f,B)=>{G.jb("ReduceMin",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},833751:(b,_,y,f,B)=>{G.jb("ReduceProd",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},833926:(b,_,y,f,B)=>{G.jb("ReduceSum",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},834100:(b,_,y,f,B)=>{G.jb("ReduceL1",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},834273:(b,_,y,f,B)=>{G.jb("ReduceL2",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},834446:(b,_,y,f,B)=>{G.jb("ReduceLogSum",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},834623:(b,_,y,f,B)=>{G.jb("ReduceSumSquare",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},834803:(b,_,y,f,B)=>{G.jb("ReduceLogSumExp",b,{keepDims:!!_,noopWithEmptyAxes:!!y,axes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},834983:(b)=>{G.jb("Where",b,void 0)},835036:(b,_,y)=>{G.jb("Transpose",b,{perm:_?Array.from(Z0().subarray(Number(_)>>>0,Number(y)>>>0)):[]})},835160:(b,_,y,f)=>{G.jb("DepthToSpace",b,{blocksize:_,mode:V6(y),format:f?"NHWC":"NCHW"})},835293:(b,_,y,f)=>{G.jb("DepthToSpace",b,{blocksize:_,mode:V6(y),format:f?"NHWC":"NCHW"})},835426:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.jb("ConvTranspose",b,{format:f0?"NHWC":"NCHW",autoPad:_,dilations:[y],group:f,kernelShape:[B],pads:[g,J0],strides:[z0],wIsConst:()=>!!n()[A0>>>0],outputPadding:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],outputShape:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[],activation:V6(q9)})},835859:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6)=>{G.jb("ConvTranspose",b,{format:z0?"NHWC":"NCHW",autoPad:_,dilations:Array.from(Z0().subarray(Number(y)>>>0,2+(Number(y)>>>0)>>>0)),group:f,kernelShape:Array.from(Z0().subarray(Number(B)>>>0,2+(Number(B)>>>0)>>>0)),pads:Array.from(Z0().subarray(Number(g)>>>0,4+(Number(g)>>>0)>>>0)),strides:Array.from(Z0().subarray(Number(J0)>>>0,2+(Number(J0)>>>0)>>>0)),wIsConst:()=>!!n()[f0>>>0],outputPadding:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],outputShape:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[],activation:V6(J6)})},836520:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9)=>{G.jb("ConvTranspose",b,{format:f0?"NHWC":"NCHW",autoPad:_,dilations:[y],group:f,kernelShape:[B],pads:[g,J0],strides:[z0],wIsConst:()=>!!n()[A0>>>0],outputPadding:Z5?Array.from(Z0().subarray(Number(Z5)>>>0,Number(M5)>>>0)):[],outputShape:p5?Array.from(Z0().subarray(Number(p5)>>>0,Number(J6)>>>0)):[],activation:V6(q9)})},836953:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6)=>{G.jb("ConvTranspose",b,{format:z0?"NHWC":"NCHW",autoPad:_,dilations:Array.from(Z0().subarray(Number(y)>>>0,2+(Number(y)>>>0)>>>0)),group:f,kernelShape:Array.from(Z0().subarray(Number(B)>>>0,2+(Number(B)>>>0)>>>0)),pads:Array.from(Z0().subarray(Number(g)>>>0,4+(Number(g)>>>0)>>>0)),strides:Array.from(Z0().subarray(Number(J0)>>>0,2+(Number(J0)>>>0)>>>0)),wIsConst:()=>!!n()[f0>>>0],outputPadding:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],outputShape:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[],activation:V6(J6)})},837614:(b,_)=>{G.jb("GlobalAveragePool",b,{format:_?"NHWC":"NCHW"})},837705:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6)=>{G.jb("AveragePool",b,{format:J6?"NHWC":"NCHW",auto_pad:_,ceil_mode:y,count_include_pad:f,storage_order:B,dilations:g?Array.from(Z0().subarray(Number(g)>>>0,Number(J0)>>>0)):[],kernel_shape:z0?Array.from(Z0().subarray(Number(z0)>>>0,Number(f0)>>>0)):[],pads:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],strides:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[]})},838184:(b,_)=>{G.jb("GlobalAveragePool",b,{format:_?"NHWC":"NCHW"})},838275:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6)=>{G.jb("AveragePool",b,{format:J6?"NHWC":"NCHW",auto_pad:_,ceil_mode:y,count_include_pad:f,storage_order:B,dilations:g?Array.from(Z0().subarray(Number(g)>>>0,Number(J0)>>>0)):[],kernel_shape:z0?Array.from(Z0().subarray(Number(z0)>>>0,Number(f0)>>>0)):[],pads:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],strides:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[]})},838754:(b,_)=>{G.jb("GlobalMaxPool",b,{format:_?"NHWC":"NCHW"})},838841:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6)=>{G.jb("MaxPool",b,{format:J6?"NHWC":"NCHW",auto_pad:_,ceil_mode:y,count_include_pad:f,storage_order:B,dilations:g?Array.from(Z0().subarray(Number(g)>>>0,Number(J0)>>>0)):[],kernel_shape:z0?Array.from(Z0().subarray(Number(z0)>>>0,Number(f0)>>>0)):[],pads:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],strides:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[]})},839316:(b,_)=>{G.jb("GlobalMaxPool",b,{format:_?"NHWC":"NCHW"})},839403:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6)=>{G.jb("MaxPool",b,{format:J6?"NHWC":"NCHW",auto_pad:_,ceil_mode:y,count_include_pad:f,storage_order:B,dilations:g?Array.from(Z0().subarray(Number(g)>>>0,Number(J0)>>>0)):[],kernel_shape:z0?Array.from(Z0().subarray(Number(z0)>>>0,Number(f0)>>>0)):[],pads:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],strides:M5?Array.from(Z0().subarray(Number(M5)>>>0,Number(p5)>>>0)):[]})},839878:(b,_,y,f,B)=>{G.jb("Gemm",b,{alpha:_,beta:y,transA:f,transB:B})},839982:(b)=>{G.jb("MatMul",b,void 0)},840036:(b,_,y,f)=>{G.jb("ArgMax",b,{keepDims:!!_,selectLastIndex:!!y,axis:f})},840144:(b,_,y,f)=>{G.jb("ArgMin",b,{keepDims:!!_,selectLastIndex:!!y,axis:f})},840252:(b,_)=>{G.jb("Softmax",b,{axis:_})},840315:(b,_)=>{G.jb("Concat",b,{axis:_})},840375:(b,_,y,f,B)=>{G.jb("Split",b,{axis:_,numOutputs:y,splitSizes:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},840531:(b)=>{G.jb("Expand",b,void 0)},840585:(b,_)=>{G.jb("Gather",b,{axis:Number(_)})},840656:(b,_)=>{G.jb("GatherElements",b,{axis:Number(_)})},840735:(b,_)=>{G.jb("GatherND",b,{batch_dims:Number(_)})},840814:(b,_,y,f,B,g,J0,z0,f0,A0,Z5)=>{G.jb("Resize",b,{antialias:_,axes:y?Array.from(Z0().subarray(Number(y)>>>0,Number(f)>>>0)):[],coordinateTransformMode:V6(B),cubicCoeffA:g,excludeOutside:J0,extrapolationValue:z0,keepAspectRatioPolicy:V6(f0),mode:V6(A0),nearestMode:V6(Z5)})},841176:(b,_,y,f,B,g,J0)=>{G.jb("Slice",b,{starts:_?Array.from(Z0().subarray(Number(_)>>>0,Number(y)>>>0)):[],ends:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[],axes:g?Array.from(Z0().subarray(Number(g)>>>0,Number(J0)>>>0)):[]})},841440:(b)=>{G.jb("Tile",b,void 0)},841492:(b,_,y)=>{G.jb("InstanceNormalization",b,{epsilon:_,format:y?"NHWC":"NCHW"})},841606:(b,_,y)=>{G.jb("InstanceNormalization",b,{epsilon:_,format:y?"NHWC":"NCHW"})},841720:(b)=>{G.jb("Range",b,void 0)},841773:(b,_)=>{G.jb("Einsum",b,{equation:V6(_)})},841854:(b,_,y,f,B)=>{G.jb("Pad",b,{mode:_,value:y,pads:f?Array.from(Z0().subarray(Number(f)>>>0,Number(B)>>>0)):[]})},841997:(b,_,y,f,B,g)=>{G.jb("BatchNormalization",b,{epsilon:_,momentum:y,spatial:!!B,trainingMode:!!f,format:g?"NHWC":"NCHW"})},842166:(b,_,y,f,B,g)=>{G.jb("BatchNormalization",b,{epsilon:_,momentum:y,spatial:!!B,trainingMode:!!f,format:g?"NHWC":"NCHW"})},842335:(b,_,y)=>{G.jb("CumSum",b,{exclusive:Number(_),reverse:Number(y)})},842432:(b,_,y)=>{G.jb("DequantizeLinear",b,{axis:_,blockSize:y})},842522:(b,_,y,f,B)=>{G.jb("GridSample",b,{align_corners:_,mode:V6(y),padding_mode:V6(f),format:B?"NHWC":"NCHW"})},842692:(b,_,y,f,B)=>{G.jb("GridSample",b,{align_corners:_,mode:V6(y),padding_mode:V6(f),format:B?"NHWC":"NCHW"})},842862:(b,_)=>{G.jb("ScatterND",b,{reduction:V6(_)})},842947:(b,_,y,f,B,g,J0,z0,f0)=>{G.jb("Attention",b,{numHeads:_,isUnidirectional:y,maskFilterValue:f,scale:B,doRotary:g,qkvHiddenSizes:J0?Array.from(Z0().subarray(Number(z0)>>>0,Number(z0)+J0>>>0)):[],pastPresentShareBuffer:!!f0})},843219:(b)=>{G.jb("BiasAdd",b,void 0)},843274:(b)=>{G.jb("BiasSplitGelu",b,void 0)},843335:(b)=>{G.jb("FastGelu",b,void 0)},843391:(b,_,y,f,B,g,J0,z0,f0,A0,Z5,M5,p5,J6,q9,y1)=>{G.jb("Conv",b,{format:M5?"NHWC":"NCHW",auto_pad:_,dilations:y?Array.from(Z0().subarray(Number(y)>>>0,Number(f)>>>0)):[],group:B,kernel_shape:g?Array.from(Z0().subarray(Number(g)>>>0,Number(J0)>>>0)):[],pads:z0?Array.from(Z0().subarray(Number(z0)>>>0,Number(f0)>>>0)):[],strides:A0?Array.from(Z0().subarray(Number(A0)>>>0,Number(Z5)>>>0)):[],w_is_const:()=>!!n()[Number(p5)>>>0],activation:V6(J6),activation_params:q9?Array.from(q5().subarray(Number(q9)>>>0,Number(y1)>>>0)):[]})},843975:(b)=>{G.jb("Gelu",b,void 0)},844027:(b,_,y,f,B,g,J0,z0,f0)=>{G.jb("GroupQueryAttention",b,{numHeads:_,kvNumHeads:y,scale:f,softcap:B,doRotary:g,rotaryInterleaved:J0,smoothSoftmax:z0,localWindowSize:f0})},844244:(b,_,y,f)=>{G.jb("LayerNormalization",b,{axis:_,epsilon:y,simplified:!!f})},844355:(b,_,y,f)=>{G.jb("LayerNormalization",b,{axis:_,epsilon:y,simplified:!!f})},844466:(b,_,y,f,B,g)=>{G.jb("MatMulNBits",b,{k:_,n:y,accuracyLevel:f,bits:B,blockSize:g})},844593:(b,_,y,f,B,g)=>{G.jb("MultiHeadAttention",b,{numHeads:_,isUnidirectional:y,maskFilterValue:f,scale:B,doRotary:g})},844752:(b,_)=>{G.jb("QuickGelu",b,{alpha:_})},844816:(b,_,y,f,B)=>{G.jb("RotaryEmbedding",b,{interleaved:!!_,numHeads:y,rotaryEmbeddingDim:f,scale:B})},844955:(b,_,y)=>{G.jb("SkipLayerNormalization",b,{epsilon:_,simplified:!!y})},845057:(b,_,y)=>{G.jb("SkipLayerNormalization",b,{epsilon:_,simplified:!!y})},845159:(b,_,y,f)=>{G.jb("GatherBlockQuantized",b,{gatherAxis:_,quantizeAxis:y,blockSize:f})},845280:(b)=>{G.Zb(b)},845314:(b,_)=>G.ac(Number(b),Number(_),G.Fb.dc,G.Fb.errors)};function U5(b,_,y){return U9(async()=>{await G.Xb(Number(b),Number(_),Number(y))})}function T0(){return typeof wasmOffsetConverter<"u"}class s0{name="ExitStatus";constructor(b){this.message=`Program terminated with exit(${b})`,this.status=b}}var D5=(b)=>{b.terminate(),b.onmessage=()=>{}},L5=[],d5=(b)=>{y0.length==0&&(Q5(),g5(y0[0]));var _=y0.pop();if(!_)return 6;O0.push(_),w0[b.Ab]=_,_.Ab=b.Ab;var y={Bb:"run",fc:b.ec,Hb:b.Hb,Ab:b.Ab};return _.postMessage(y,b.Mb),0},T5=0,$5=(b,_,...y)=>{for(var f=2*y.length,B=Q1(),g=E1(8*f),J0=g>>>3,z0=0;z0>>0]=f0)}return b=f2(b,0,f,g,_),O2(B),b};function V5(b){if(J)return $5(0,1,b);if(E=b,!(0{if(E=b,J)throw U6(b),"unwind";V5(b)},y0=[],O0=[],I0=[],w0={},H5=(b)=>{var _=b.Ab;delete w0[_],y0.push(b),O0.splice(O0.indexOf(b),1),b.Ab=0,w2(_)};function N5(){I0.forEach((b)=>b())}var g5=(b)=>new Promise((_)=>{b.onmessage=(B)=>{var g=(B=B.data).Bb;if(B.Gb&&B.Gb!=e1()){var J0=w0[B.Gb];J0?J0.postMessage(B,B.Mb):w(`Internal error! Worker sent a message "${g}" to target pthread ${B.Gb}, but that thread no longer exists!`)}else g==="checkMailbox"?P5():g==="spawnThread"?d5(B):g==="cleanupThread"?H5(w0[B.hc]):g==="loaded"?(b.loaded=!0,_(b)):g==="alert"?alert(`Thread ${B.ic}: ${B.text}`):B.target==="setimmediate"?b.postMessage(B):g==="callHandler"?G[B.Qb](...B.args):g&&w(`worker sent an unknown command ${g}`)},b.onerror=(B)=>{throw w(`worker sent an error! ${B.filename}:${B.lineno}: ${B.message}`),B};var y,f=[];for(y of[])G.propertyIsEnumerable(y)&&f.push(y);b.postMessage({Bb:"load",Rb:f,kc:T,lc:W})});function Q5(){var b=new Worker((()=>{let _=URL;return import.meta.url>"file:"&&import.meta.url<"file;"?new _("ort.bundle.min.mjs",import.meta.url):new URL(import.meta.url)})(),{type:"module",workerData:"em-pthread",name:"em-pthread"});y0.push(b)}var S5=(b)=>{P0();var _=M0()[b+52>>>2>>>0];b=M0()[b+56>>>2>>>0],U2(_,_-b),O2(_)},K6=(b,_)=>{T5=0,b=b6(b,_),0>>=0);throw _>>>=0,y>>>=0,M0()[f.Ib+16>>>2>>>0]=0,M0()[f.Ib+4>>>2>>>0]=_,M0()[f.Ib+8>>>2>>>0]=y,b}function Z6(b,_,y,f){return J?$5(2,1,b,_,y,f):c6(b,_,y,f)}function c6(b,_,y,f){if(b>>>=0,y>>>=0,f>>>=0,R===void 0)return 6;var B=[];return J&&B.length===0?Z6(b,_>>>=0,y,f):(b={ec:y,Ab:b,Hb:f,Mb:B},J?(b.Bb="spawnThread",postMessage(b,B),0):d5(b))}var Y9=typeof TextDecoder<"u"?new TextDecoder:void 0,y9=(b,_=0,y=NaN)=>{var f=(_>>>=0)+y;for(y=_;b[y]&&!(y>=f);)++y;if(16(B=(240&B)==224?(15&B)<<12|g<<6|J0:(7&B)<<18|g<<12|J0<<6|63&b[_++])?f+=String.fromCharCode(B):(B-=65536,f+=String.fromCharCode(55296|B>>10,56320|1023&B))}}else f+=String.fromCharCode(B)}return f},V6=(b,_)=>(b>>>=0)?y9(R0(),b,_):"";function a9(b,_,y){return J?$5(3,1,b,_,y):0}function I9(b,_){if(J)return $5(4,1,b,_)}var z6=(b)=>{for(var _=0,y=0;y=f?_++:2047>=f?_+=2:55296<=f&&57343>=f?(_+=4,++y):_+=3}return _},_5=(b,_,y)=>{var f=R0();if(_>>>=0,0=J0&&(J0=65536+((1023&J0)<<10)|1023&b.charCodeAt(++g)),127>=J0){if(_>=y)break;f[_++>>>0]=J0}else{if(2047>=J0){if(_+1>=y)break;f[_++>>>0]=192|J0>>6}else{if(65535>=J0){if(_+2>=y)break;f[_++>>>0]=224|J0>>12}else{if(_+3>=y)break;f[_++>>>0]=240|J0>>18,f[_++>>>0]=128|J0>>12&63}f[_++>>>0]=128|J0>>6&63}f[_++>>>0]=128|63&J0}}f[_>>>0]=0,b=_-B}else b=0;return b};function E5(b,_){if(J)return $5(5,1,b,_)}function v5(b,_,y){if(J)return $5(6,1,b,_,y)}function o6(b,_,y){return J?$5(7,1,b,_,y):0}function b9(b,_){if(J)return $5(8,1,b,_)}function H1(b,_,y){if(J)return $5(9,1,b,_,y)}function x1(b,_,y,f){if(J)return $5(10,1,b,_,y,f)}function o9(b,_,y,f){if(J)return $5(11,1,b,_,y,f)}function L1(b,_,y,f){if(J)return $5(12,1,b,_,y,f)}function _1(b){if(J)return $5(13,1,b)}function z9(b,_){if(J)return $5(14,1,b,_)}function D9(b,_,y){if(J)return $5(15,1,b,_,y)}var p9,J9,Y1=()=>t0(""),t6=(b)=>{for(var _="";R0()[b>>>0];)_+=p9[R0()[b++>>>0]];return _},f9={},r9={};function G9(b,_,y={}){return function(f,B,g={}){var J0=B.name;if(!f)throw new J9(`type "${J0}" must have a positive integer typeid pointer`);if(r9.hasOwnProperty(f)){if(g.Sb)return;throw new J9(`Cannot register type '${J0}' twice`)}r9[f]=B,f9.hasOwnProperty(f)&&(B=f9[f],delete f9[f],B.forEach((z0)=>z0()))}(b,_,y)}var S1=(b,_,y)=>{switch(_){case 1:return y?(f)=>n()[f>>>0]:(f)=>R0()[f>>>0];case 2:return y?(f)=>q0()[f>>>1>>>0]:(f)=>p0()[f>>>1>>>0];case 4:return y?(f)=>Z0()[f>>>2>>>0]:(f)=>M0()[f>>>2>>>0];case 8:return y?(f)=>$0[f>>>3]:(f)=>i[f>>>3];default:throw TypeError(`invalid integer width (${_}): ${b}`)}};function A1(b,_,y){y>>>=0,G9(b>>>=0,{name:_=t6(_>>>0),fromWireType:(f)=>f,toWireType:function(f,B){if(typeof B!="bigint"&&typeof B!="number")throw B=B===null?"null":(f=typeof B)=="object"||f==="array"||f==="function"?B.toString():""+B,TypeError(`Cannot convert "${B}" to ${this.name}`);return typeof B=="number"&&(B=BigInt(B)),B},Cb:x9,readValueFromPointer:S1(_,y,_.indexOf("u")==-1),Db:null})}var x9=8;function q1(b,_,y,f){G9(b>>>=0,{name:_=t6(_>>>0),fromWireType:function(B){return!!B},toWireType:function(B,g){return g?y:f},Cb:x9,readValueFromPointer:function(B){return this.fromWireType(R0()[B>>>0])},Db:null})}var n9=[],v9=[];function L6(b){9<(b>>>=0)&&--v9[b+1]==0&&(v9[b]=void 0,n9.push(b))}var m6=(b)=>{if(!b)throw new J9("Cannot use deleted val. handle = "+b);return v9[b]},p6=(b)=>{switch(b){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:let _=n9.pop()||v9.length;return v9[_]=b,v9[_+1]=1,_}};function B0(b){return this.fromWireType(M0()[b>>>2>>>0])}var P1={name:"emscripten::val",fromWireType:(b)=>{var _=m6(b);return L6(b),_},toWireType:(b,_)=>p6(_),Cb:x9,readValueFromPointer:B0,Db:null};function g1(b){return G9(b>>>0,P1)}var u1=(b,_)=>{switch(_){case 4:return function(y){return this.fromWireType(q5()[y>>>2>>>0])};case 8:return function(y){return this.fromWireType(E0()[y>>>3>>>0])};default:throw TypeError(`invalid float width (${_}): ${b}`)}};function d1(b,_,y){y>>>=0,G9(b>>>=0,{name:_=t6(_>>>0),fromWireType:(f)=>f,toWireType:(f,B)=>B,Cb:x9,readValueFromPointer:u1(_,y),Db:null})}function V1(b,_,y,f,B){if(b>>>=0,y>>>=0,_=t6(_>>>0),B===-1&&(B=4294967295),B=(z0)=>z0,f===0){var g=32-8*y;B=(z0)=>z0<>>g}var J0=_.includes("unsigned")?function(z0,f0){return f0>>>0}:function(z0,f0){return f0};G9(b,{name:_,fromWireType:B,toWireType:J0,Cb:x9,readValueFromPointer:S1(_,y,f!==0),Db:null})}function W1(b,_,y){function f(g){var J0=M0()[g>>>2>>>0];return g=M0()[g+4>>>2>>>0],new B(n().buffer,g,J0)}var B=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array][_];G9(b>>>=0,{name:y=t6(y>>>0),fromWireType:f,Cb:x9,readValueFromPointer:f},{Sb:!0})}function M1(b,_){G9(b>>>=0,{name:_=t6(_>>>0),fromWireType:function(y){for(var f,B=M0()[y>>>2>>>0],g=y+4,J0=g,z0=0;z0<=B;++z0){var f0=g+z0;z0!=B&&R0()[f0>>>0]!=0||(J0=V6(J0,f0-J0),f===void 0?f=J0:(f+="\x00",f+=J0),J0=f0+1)}return Q9(y),f},toWireType:function(y,f){f instanceof ArrayBuffer&&(f=new Uint8Array(f));var B=typeof f=="string";if(!(B||f instanceof Uint8Array||f instanceof Uint8ClampedArray||f instanceof Int8Array))throw new J9("Cannot pass non-string to std::string");var g=B?z6(f):f.length,J0=c9(4+g+1),z0=J0+4;if(M0()[J0>>>2>>>0]=g,B)_5(f,z0,g+1);else if(B)for(B=0;B>>0]=f0}else for(B=0;B>>0]=f[B];return y!==null&&y.push(Q9,J0),J0},Cb:x9,readValueFromPointer:B0,Db(y){Q9(y)}})}var R1=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0,l1=(b,_)=>{for(var y=b>>1,f=y+_/2;!(y>=f)&&p0()[y>>>0];)++y;if(32<(y<<=1)-b&&R1)return R1.decode(R0().slice(b,y));for(y="",f=0;!(f>=_/2);++f){var B=q0()[b+2*f>>>1>>>0];if(B==0)break;y+=String.fromCharCode(B)}return y},N1=(b,_,y)=>{if(y??=2147483647,2>y)return 0;var f=_;y=(y-=2)<2*b.length?y/2:b.length;for(var B=0;B>>1>>>0]=g,_+=2}return q0()[_>>>1>>>0]=0,_-f},p=(b)=>2*b.length,x0=(b,_)=>{for(var y=0,f="";!(y>=_/4);){var B=Z0()[b+4*y>>>2>>>0];if(B==0)break;++y,65536<=B?(B-=65536,f+=String.fromCharCode(55296|B>>10,56320|1023&B)):f+=String.fromCharCode(B)}return f},X0=(b,_,y)=>{if(_>>>=0,y??=2147483647,4>y)return 0;var f=_;y=f+y-4;for(var B=0;B=g&&(g=65536+((1023&g)<<10)|1023&b.charCodeAt(++B)),Z0()[_>>>2>>>0]=g,(_+=4)+4>y)break}return Z0()[_>>>2>>>0]=0,_-f},W0=(b)=>{for(var _=0,y=0;y=f&&++y,_+=4}return _};function h0(b,_,y){if(b>>>=0,_>>>=0,y=t6(y>>>=0),_===2)var f=l1,B=N1,g=p,J0=(z0)=>p0()[z0>>>1>>>0];else _===4&&(f=x0,B=X0,g=W0,J0=(z0)=>M0()[z0>>>2>>>0]);G9(b,{name:y,fromWireType:(z0)=>{for(var f0,A0=M0()[z0>>>2>>>0],Z5=z0+4,M5=0;M5<=A0;++M5){var p5=z0+4+M5*_;M5!=A0&&J0(p5)!=0||(Z5=f(Z5,p5-Z5),f0===void 0?f0=Z5:(f0+="\x00",f0+=Z5),Z5=p5+_)}return Q9(z0),f0},toWireType:(z0,f0)=>{if(typeof f0!="string")throw new J9(`Cannot pass non-string to C++ string type ${y}`);var A0=g(f0),Z5=c9(4+A0+_);return M0()[Z5>>>2>>>0]=A0/_,B(f0,Z5+4,A0+_),z0!==null&&z0.push(Q9,Z5),Z5},Cb:x9,readValueFromPointer:B0,Db(z0){Q9(z0)}})}function c0(b,_){G9(b>>>=0,{Tb:!0,name:_=t6(_>>>0),Cb:0,fromWireType:()=>{},toWireType:()=>{}})}function F5(b){v1(b>>>0,!N,1,!V,131072,!1),N5()}var W5=(b)=>{if(!F0)try{if(b(),!(0>>=0,typeof Atomics.jc=="function"&&(Atomics.jc(Z0(),b>>>2,b).value.then(P5),b+=128,Atomics.store(Z0(),b>>>2,1))}var P5=()=>{var b=e1();b&&(b5(b),W5(E2))};function S6(b,_){(b>>>=0)==_>>>0?setTimeout(P5):J?postMessage({Gb:b,Bb:"checkMailbox"}):(b=w0[b])&&b.postMessage({Bb:"checkMailbox"})}var _6=[];function O9(b,_,y,f,B){for(_>>>=0,f/=2,_6.length=f,y=B>>>0>>>3,B=0;B>>0];return(_?R5[_]:i5[b])(..._6)}var g6=()=>{T5=0};function k9(b){b>>>=0,J?postMessage({Bb:"cleanupThread",hc:b}):H5(w0[b])}function w9(b){}var Z9=(b,_)=>{var y=r9[b];if(y===void 0)throw b=b2(b),y=t6(b),Q9(b),new J9(`${_} has unknown type ${y}`);return y},s9=(b,_,y)=>{var f=[];return b=b.toWireType(f,y),f.length&&(M0()[_>>>2>>>0]=p6(f)),b};function J1(b,_,y){return _>>>=0,y>>>=0,b=m6(b>>>0),_=Z9(_,"emval::as"),s9(_,y,b)}function P6(b,_){return _>>>=0,b=m6(b>>>0),(_=Z9(_,"emval::as")).toWireType(null,b)}var Q6=(b)=>{try{b()}catch(_){t0(_)}},C6=0,N6=null,s6=0,C5=[],k6={},E9={},R9=0,B6=null,B5=[];function U9(b){return function(){if(!F0){if(C6===0){var _=!1,y=!1;((f)=>{b().then(f)})((f=0)=>{if(!F0&&(s6=f,_=!0,y)){C6=2,Q6(()=>C2(N6)),typeof MainLoop<"u"&&MainLoop.Pb&&MainLoop.resume(),f=!1;try{var B=(z0=Z0()[N6+8>>>2>>>0],z0=o5[E9[z0]],--T5,z0())}catch(f0){B=f0,f=!0}var g=!1;if(!N6){var J0=B6;J0&&(B6=null,(f?J0.reject:J0.resolve)(B),g=!0)}if(f&&!g)throw B}var z0}),y=!0,_||(C6=1,N6=function(){var f=c9(65548),B=f+12;M0()[f>>>2>>>0]=B,M0()[f+4>>>2>>>0]=B+65536,B=C5[0];var g=k6[B];return g===void 0&&(g=R9++,k6[B]=g,E9[g]=B),B=g,Z0()[f+8>>>2>>>0]=B,f}(),typeof MainLoop<"u"&&MainLoop.Pb&&MainLoop.pause(),Q6(()=>Q2(N6)))}else C6===2?(C6=0,Q6(B2),Q9(N6),N6=null,B5.forEach(W5)):t0(`invalid state: ${C6}`);return s6}}()}function u0(b){return b>>>=0,U9(async()=>{var _=await m6(b);return p6(_)})}var h5=[];function V2(b,_,y,f){return y>>>=0,f>>>=0,(b=h5[b>>>0])(null,_=m6(_>>>0),y,f)}var s2={},X1=(b)=>{var _=s2[b];return _===void 0?t6(b):_};function i2(b,_,y,f,B){return y>>>=0,f>>>=0,B>>>=0,(b=h5[b>>>0])(_=m6(_>>>0),_[y=X1(y)],f,B)}var a2=()=>typeof globalThis=="object"?globalThis:Function("return this")();function T2(b){return(b>>>=0)==0?p6(a2()):(b=X1(b),p6(a2()[b]))}var o1=(b)=>{var _=h5.length;return h5.push(b),_},B3=(b,_)=>{for(var y=Array(b),f=0;f>>2>>>0],"parameter "+f);return y},r2=(b,_)=>Object.defineProperty(_,"name",{value:b});function n2(b,_,y){var f=(_=B3(b,_>>>0)).shift();b--;var B=`return function (obj, func, destructorsRef, args) { +`,g=0,J0=[];y===0&&J0.push("obj");for(var z0=["retType"],f0=[f],A0=0;A0Z5.name).join(", ")}) => ${f.name}>`,o1(r2(y,b))}function A9(b){return b=X1(b>>>0),p6(G[b])}function h3(b,_){return _>>>=0,b=m6(b>>>0),_=m6(_),p6(b[_])}function s1(b){9<(b>>>=0)&&(v9[b+1]+=1)}function c3(){return p6([])}function m3(b){b=m6(b>>>0);for(var _=Array(b.length),y=0;y>>0))}function A3(){return p6({})}function g3(b){for(var _=m6(b>>>=0);_.length;){var y=_.pop();_.pop()(y)}L6(b)}function i1(b,_,y){_>>>=0,y>>>=0,b=m6(b>>>0),_=m6(_),y=m6(y),b[_]=y}function u3(b,_){return _>>>=0,b=(b=Z9(b>>>0,"_emval_take_value")).readValueFromPointer(_),p6(b)}function d3(b,_){b=-9007199254740992>b||9007199254740992>>=0,b=new Date(1000*b),Z0()[_>>>2>>>0]=b.getUTCSeconds(),Z0()[_+4>>>2>>>0]=b.getUTCMinutes(),Z0()[_+8>>>2>>>0]=b.getUTCHours(),Z0()[_+12>>>2>>>0]=b.getUTCDate(),Z0()[_+16>>>2>>>0]=b.getUTCMonth(),Z0()[_+20>>>2>>>0]=b.getUTCFullYear()-1900,Z0()[_+24>>>2>>>0]=b.getUTCDay(),b=(b.getTime()-Date.UTC(b.getUTCFullYear(),0,1,0,0,0,0))/86400000|0,Z0()[_+28>>>2>>>0]=b}var t2=(b)=>b%4==0&&(b%100!=0||b%400==0),F2=[0,31,60,91,121,152,182,213,244,274,305,335],g9=[0,31,59,90,120,151,181,212,243,273,304,334];function y2(b,_){b=-9007199254740992>b||9007199254740992>>=0,b=new Date(1000*b),Z0()[_>>>2>>>0]=b.getSeconds(),Z0()[_+4>>>2>>>0]=b.getMinutes(),Z0()[_+8>>>2>>>0]=b.getHours(),Z0()[_+12>>>2>>>0]=b.getDate(),Z0()[_+16>>>2>>>0]=b.getMonth(),Z0()[_+20>>>2>>>0]=b.getFullYear()-1900,Z0()[_+24>>>2>>>0]=b.getDay();var y=(t2(b.getFullYear())?F2:g9)[b.getMonth()]+b.getDate()-1|0;Z0()[_+28>>>2>>>0]=y,Z0()[_+36>>>2>>>0]=-60*b.getTimezoneOffset(),y=new Date(b.getFullYear(),6,1).getTimezoneOffset();var f=new Date(b.getFullYear(),0,1).getTimezoneOffset();b=0|(y!=f&&b.getTimezoneOffset()==Math.min(f,y)),Z0()[_+32>>>2>>>0]=b}function l3(b){b>>>=0;var _=new Date(Z0()[b+20>>>2>>>0]+1900,Z0()[b+16>>>2>>>0],Z0()[b+12>>>2>>>0],Z0()[b+8>>>2>>>0],Z0()[b+4>>>2>>>0],Z0()[b>>>2>>>0],0),y=Z0()[b+32>>>2>>>0],f=_.getTimezoneOffset(),B=new Date(_.getFullYear(),6,1).getTimezoneOffset(),g=new Date(_.getFullYear(),0,1).getTimezoneOffset(),J0=Math.min(g,B);return 0>y?Z0()[b+32>>>2>>>0]=+(B!=g&&J0==f):0>>2>>>0]=_.getDay(),y=(t2(_.getFullYear())?F2:g9)[_.getMonth()]+_.getDate()-1|0,Z0()[b+28>>>2>>>0]=y,Z0()[b>>>2>>>0]=_.getSeconds(),Z0()[b+4>>>2>>>0]=_.getMinutes(),Z0()[b+8>>>2>>>0]=_.getHours(),Z0()[b+12>>>2>>>0]=_.getDate(),Z0()[b+16>>>2>>>0]=_.getMonth(),Z0()[b+20>>>2>>>0]=_.getYear(),b=_.getTime(),BigInt(isNaN(b)?-1:b/1000)}function e2(b,_,y,f,B,g,J0){return J?$5(16,1,b,_,y,f,B,g,J0):-52}function N2(b,_,y,f,B,g){if(J)return $5(17,1,b,_,y,f,B,g)}var K1={},b1=()=>performance.timeOrigin+performance.now();function $3(b,_){if(J)return $5(18,1,b,_);if(K1[b]&&(clearTimeout(K1[b].id),delete K1[b]),!_)return 0;var y=setTimeout(()=>{delete K1[b],W5(()=>R2(b,performance.timeOrigin+performance.now()))},_);return K1[b]={id:y,qc:_},0}function z2(b,_,y,f){b>>>=0,_>>>=0,y>>>=0,f>>>=0;var B=new Date().getFullYear(),g=new Date(B,0,1).getTimezoneOffset();B=new Date(B,6,1).getTimezoneOffset();var J0=Math.max(g,B);M0()[b>>>2>>>0]=60*J0,Z0()[_>>>2>>>0]=+(g!=B),b=(_=(z0)=>{var f0=Math.abs(z0);return`UTC${0<=z0?"-":"+"}${String(Math.floor(f0/60)).padStart(2,"0")}${String(f0%60).padStart(2,"0")}`})(g),_=_(B),BDate.now();function o3(b,_,y){return 0<=b&&3>=b?(b=b===0?Date.now():performance.timeOrigin+performance.now(),$0[y>>>0>>>3]=BigInt(Math.round(1e6*b)),0):28}var h9=[],J2=(b,_)=>{h9.length=0;for(var y;y=R0()[b++>>>0];){var f=y!=105;_+=(f&=y!=112)&&_%8?4:0,h9.push(y==112?M0()[_>>>2>>>0]:y==106?$0[_>>>3]:y==105?Z0()[_>>>2>>>0]:E0()[_>>>3>>>0]),_+=f?8:4}return h9};function f1(b,_,y){return b>>>=0,_=J2(_>>>0,y>>>0),R5[b](..._)}function j3(b,_,y){return b>>>=0,_=J2(_>>>0,y>>>0),R5[b](..._)}var t9=()=>{};function s3(b,_){return w(V6(b>>>0,_>>>0))}var i3=()=>{throw T5+=1,"unwind"};function a3(){return 4294901760}var r3=()=>navigator.hardwareConcurrency;function n3(){return t0("Cannot use emscripten_pc_get_function without -sUSE_OFFSET_CONVERTER"),0}function k2(b){b>>>=0;var _=R0().length;if(b<=_||4294901760=y;y*=2){var f=_*(1+0.2/y);f=Math.min(f,b+100663296);$:{f=(Math.min(4294901760,65536*Math.ceil(Math.max(b,f)/65536))-T.buffer.byteLength+65535)/65536|0;try{T.grow(f),P0();var B=1;break $}catch{}B=void 0}if(B)return!0}return!1}var a1=()=>(t0("Cannot use convertFrameToPC (needed by __builtin_return_address) without -sUSE_OFFSET_CONVERTER"),0),U1={},T1=(b)=>{b.forEach((_)=>{a1()})};function F1(){var b=Error().stack.toString().split(` +`);return b[0]=="Error"&&b.shift(),T1(b),U1.Lb=a1(),U1.cc=b,U1.Lb}function e9(b,_,y){if(b>>>=0,_>>>=0,U1.Lb==b)var f=U1.cc;else(f=Error().stack.toString().split(` +`))[0]=="Error"&&f.shift(),T1(f);for(var B=3;f[B]&&a1()!=b;)++B;for(b=0;b>>2>>>0]=a1();return b}var O3,r1={},I2=()=>{if(!O3){var b,_={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8",_:"./this.program"};for(b in r1)r1[b]===void 0?delete _[b]:_[b]=r1[b];var y=[];for(b in _)y.push(`${b}=${_[b]}`);O3=y}return O3};function D2(b,_){if(J)return $5(19,1,b,_);b>>>=0,_>>>=0;var y=0;return I2().forEach((f,B)=>{var g=_+y;for(B=M0()[b+4*B>>>2>>>0]=g,g=0;g>>0]=f.charCodeAt(g);n()[B>>>0]=0,y+=f.length+1}),0}function v2(b,_){if(J)return $5(20,1,b,_);b>>>=0,_>>>=0;var y=I2();M0()[b>>>2>>>0]=y.length;var f=0;return y.forEach((B)=>f+=B.length+1),M0()[_>>>2>>>0]=f,0}function W2(b){return J?$5(21,1,b):52}function M2(b,_,y,f){return J?$5(22,1,b,_,y,f):52}function K2(b,_,y,f){return J?$5(23,1,b,_,y,f):70}var G3=[null,[],[]];function Z3(b,_,y,f){if(J)return $5(24,1,b,_,y,f);_>>>=0,y>>>=0,f>>>=0;for(var B=0,g=0;g>>2>>>0],z0=M0()[_+4>>>2>>>0];_+=8;for(var f0=0;f0>>0],Z5=G3[b];A0===0||A0===10?((b===1?z:w)(y9(Z5)),Z5.length=0):Z5.push(A0)}B+=z0}return M0()[f>>>2>>>0]=B,0}J||function(){for(var b=G.numThreads-1;b--;)Q5();L5.unshift(()=>{var _;r0++,_=()=>J5(),J?_():Promise.all(y0.map(g5)).then(_)})}();for(var w1=Array(256),n1=0;256>n1;++n1)w1[n1]=String.fromCharCode(n1);p9=w1,J9=G.BindingError=class extends Error{constructor(b){super(b),this.name="BindingError"}},G.InternalError=class extends Error{constructor(b){super(b),this.name="InternalError"}},v9.push(0,1,void 0,1,null,1,!0,1,!1,1),G.count_emval_handles=()=>v9.length/2-5-n9.length;var o5,i5=[V5,U6,Z6,a9,I9,E5,v5,o6,b9,H1,x1,o9,L1,_1,z9,D9,e2,N2,$3,D2,v2,W2,M2,K2,Z3];(async function(){function b(f,B){return o5=f.exports,o5=function(){var f0=o5,A0={};for(let[Z5,M5]of Object.entries(f0))A0[Z5]=typeof M5=="function"?(...p5)=>{C5.push(Z5);try{return M5(...p5)}finally{F0||(C5.pop(),N6&&C6===1&&C5.length===0&&(C6=0,T5+=1,Q6(H2),typeof Fibers<"u"&&Fibers.rc()))}}:M5;return A0}(),g=o5,J0=(f0)=>(A0)=>f0(A0)>>>0,z0=(f0)=>()=>f0()>>>0,(g=Object.assign({},g)).Da=J0(g.Da),g.fb=z0(g.fb),g.hb=J0(g.hb),g.tb=J0(g.tb),g.ub=z0(g.ub),g.__cxa_get_exception_ptr=J0(g.__cxa_get_exception_ptr),o5=g,I0.push(o5.ib),W=B,J5(),o5;var g,J0,z0}r0++;var _=y5();if(G.instantiateWasm)return new Promise((f)=>{G.instantiateWasm(_,(B,g)=>{b(B,g),f(B.exports)})});if(J)return new Promise((f)=>{e0=(B)=>{var g=new WebAssembly.Instance(B,y5());f(b(g,B))}});a0??=G.locateFile?G.locateFile?G.locateFile("ort-wasm-simd-threaded.jsep.wasm",D):D+"ort-wasm-simd-threaded.jsep.wasm":new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href;try{var y=await async function(f){var B=a0;if(!S0&&typeof WebAssembly.instantiateStreaming=="function"&&!s(B))try{var g=fetch(B,{credentials:"same-origin"});return await WebAssembly.instantiateStreaming(g,f)}catch(J0){w(`wasm streaming compile failed: ${J0}`),w("falling back to ArrayBuffer instantiation")}return async function(J0,z0){try{var f0=await async function(A0){if(!S0)try{var Z5=await L(A0);return new Uint8Array(Z5)}catch{}if(A0==a0&&S0)A0=new Uint8Array(S0);else{if(!Y)throw"both async and sync fetching of the wasm failed";A0=Y(A0)}return A0}(J0);return await WebAssembly.instantiate(f0,z0)}catch(A0){w(`failed to asynchronously prepare wasm: ${A0}`),t0(A0)}}(B,f)}(_);return b(y.instance,y.module)}catch(f){return O(f),Promise.reject(f)}})();var b2=(b)=>(b2=o5.Da)(b),t1=()=>(t1=o5.Ea)();G._OrtInit=(b,_)=>(G._OrtInit=o5.Fa)(b,_),G._OrtGetLastError=(b,_)=>(G._OrtGetLastError=o5.Ga)(b,_),G._OrtCreateSessionOptions=(b,_,y,f,B,g,J0,z0,f0,A0)=>(G._OrtCreateSessionOptions=o5.Ha)(b,_,y,f,B,g,J0,z0,f0,A0),G._OrtAppendExecutionProvider=(b,_,y,f,B)=>(G._OrtAppendExecutionProvider=o5.Ia)(b,_,y,f,B),G._OrtAddFreeDimensionOverride=(b,_,y)=>(G._OrtAddFreeDimensionOverride=o5.Ja)(b,_,y),G._OrtAddSessionConfigEntry=(b,_,y)=>(G._OrtAddSessionConfigEntry=o5.Ka)(b,_,y),G._OrtReleaseSessionOptions=(b)=>(G._OrtReleaseSessionOptions=o5.La)(b),G._OrtCreateSession=(b,_,y)=>(G._OrtCreateSession=o5.Ma)(b,_,y),G._OrtReleaseSession=(b)=>(G._OrtReleaseSession=o5.Na)(b),G._OrtGetInputOutputCount=(b,_,y)=>(G._OrtGetInputOutputCount=o5.Oa)(b,_,y),G._OrtGetInputOutputMetadata=(b,_,y,f)=>(G._OrtGetInputOutputMetadata=o5.Pa)(b,_,y,f),G._OrtFree=(b)=>(G._OrtFree=o5.Qa)(b),G._OrtCreateTensor=(b,_,y,f,B,g)=>(G._OrtCreateTensor=o5.Ra)(b,_,y,f,B,g),G._OrtGetTensorData=(b,_,y,f,B)=>(G._OrtGetTensorData=o5.Sa)(b,_,y,f,B),G._OrtReleaseTensor=(b)=>(G._OrtReleaseTensor=o5.Ta)(b),G._OrtCreateRunOptions=(b,_,y,f)=>(G._OrtCreateRunOptions=o5.Ua)(b,_,y,f),G._OrtAddRunConfigEntry=(b,_,y)=>(G._OrtAddRunConfigEntry=o5.Va)(b,_,y),G._OrtReleaseRunOptions=(b)=>(G._OrtReleaseRunOptions=o5.Wa)(b),G._OrtCreateBinding=(b)=>(G._OrtCreateBinding=o5.Xa)(b),G._OrtBindInput=(b,_,y)=>(G._OrtBindInput=o5.Ya)(b,_,y),G._OrtBindOutput=(b,_,y,f)=>(G._OrtBindOutput=o5.Za)(b,_,y,f),G._OrtClearBoundOutputs=(b)=>(G._OrtClearBoundOutputs=o5._a)(b),G._OrtReleaseBinding=(b)=>(G._OrtReleaseBinding=o5.$a)(b),G._OrtRunWithBinding=(b,_,y,f,B)=>(G._OrtRunWithBinding=o5.ab)(b,_,y,f,B),G._OrtRun=(b,_,y,f,B,g,J0,z0)=>(G._OrtRun=o5.bb)(b,_,y,f,B,g,J0,z0),G._OrtEndProfiling=(b)=>(G._OrtEndProfiling=o5.cb)(b),G._JsepOutput=(b,_,y)=>(G._JsepOutput=o5.db)(b,_,y),G._JsepGetNodeName=(b)=>(G._JsepGetNodeName=o5.eb)(b);var e1=()=>(e1=o5.fb)(),Q9=G._free=(b)=>(Q9=G._free=o5.gb)(b),c9=G._malloc=(b)=>(c9=G._malloc=o5.hb)(b),v1=(b,_,y,f,B,g)=>(v1=o5.kb)(b,_,y,f,B,g),$2=()=>($2=o5.lb)(),f2=(b,_,y,f,B)=>(f2=o5.mb)(b,_,y,f,B),w2=(b)=>(w2=o5.nb)(b),j2=(b)=>(j2=o5.ob)(b),R2=(b,_)=>(R2=o5.pb)(b,_),E2=()=>(E2=o5.qb)(),U2=(b,_)=>(U2=o5.rb)(b,_),O2=(b)=>(O2=o5.sb)(b),E1=(b)=>(E1=o5.tb)(b),Q1=()=>(Q1=o5.ub)(),b6=G.dynCall_ii=(b,_)=>(b6=G.dynCall_ii=o5.vb)(b,_),Q2=(b)=>(Q2=o5.wb)(b),H2=()=>(H2=o5.xb)(),C2=(b)=>(C2=o5.yb)(b),B2=()=>(B2=o5.zb)();return G.stackSave=()=>Q1(),G.stackRestore=(b)=>O2(b),G.stackAlloc=(b)=>E1(b),G.setValue=function(b,_,y="i8"){switch(y.endsWith("*")&&(y="*"),y){case"i1":case"i8":n()[b>>>0]=_;break;case"i16":q0()[b>>>1>>>0]=_;break;case"i32":Z0()[b>>>2>>>0]=_;break;case"i64":$0[b>>>3]=BigInt(_);break;case"float":q5()[b>>>2>>>0]=_;break;case"double":E0()[b>>>3>>>0]=_;break;case"*":M0()[b>>>2>>>0]=_;break;default:t0(`invalid type for setValue: ${y}`)}},G.getValue=function(b,_="i8"){switch(_.endsWith("*")&&(_="*"),_){case"i1":case"i8":return n()[b>>>0];case"i16":return q0()[b>>>1>>>0];case"i32":return Z0()[b>>>2>>>0];case"i64":return $0[b>>>3];case"float":return q5()[b>>>2>>>0];case"double":return E0()[b>>>3>>>0];case"*":return M0()[b>>>2>>>0];default:t0(`invalid type for getValue: ${_}`)}},G.UTF8ToString=V6,G.stringToUTF8=_5,G.lengthBytesUTF8=z6,function b(){if(0{jR(),iN=typeof location>"u"?void 0:location.origin,vv=import.meta.url>"file:"&&import.meta.url<"file;",$_=()=>{if(vv)return new URL(new URL("ort.bundle.min.mjs",import.meta.url).href,iN).href;return import.meta.url},Y2=$_(),hy=()=>{if(Y2&&!Y2.startsWith("blob:"))return Y2.substring(0,Y2.lastIndexOf("/")+1)},mq=($,j)=>{try{let O=j??Y2;return(O?new URL($,O):new URL($)).origin===iN}catch{return!1}},j_=($,j)=>{let O=j??Y2;try{return(O?new URL($,O):new URL($)).href}catch{return}},O_=($,j)=>`${j??"./"}${$}`,aN=async($)=>{let j=await(await fetch($,{credentials:"same-origin"})).blob();return URL.createObjectURL(j)},G_=async($)=>(await import($)).default,rN=(XM(),AZ(Ey)).default,cy=async()=>{if(!Y2)throw Error("Failed to load proxy worker: cannot determine the script source URL.");if(mq(Y2))return[void 0,rN()];let $=await aN(Y2);return[$,rN($)]},nN=(TM(),AZ(Cy)).default,my=async($,j,O)=>{if(!$&&!j&&nN&&Y2&&mq(Y2))return[void 0,nN];{let G="ort-wasm-simd-threaded.jsep.mjs",Z=$??j_(G,j),V=O&&Z&&!mq(Z,j),N=V?await aN(Z):Z??O_(G,j);return[V?N:void 0,await G_(N)]}}}),G$=I5(()=>{HR(),pq=!1,FZ=!1,eN=!1,Z_=()=>{if(typeof SharedArrayBuffer>"u")return!1;try{return typeof MessageChannel<"u"&&new MessageChannel().port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]))}catch{return!1}},q_=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,30,1,28,0,65,0,253,15,253,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,253,186,1,26,11]))}catch{return!1}},V_=()=>{try{return WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,19,1,17,0,65,1,253,15,65,2,253,15,65,3,253,15,253,147,2,11]))}catch{return!1}},OR=async($)=>{if(pq)return Promise.resolve();if(FZ)throw Error("multiple calls to 'initializeWebAssembly()' detected.");if(eN)throw Error("previous call to 'initializeWebAssembly()' failed.");FZ=!0;let{initTimeout:j,numThreads:O}=$;if($.simd!==!1){if($.simd==="relaxed"){if(!V_())throw Error("Relaxed WebAssembly SIMD is not supported in the current environment.")}else if(!q_())throw Error("WebAssembly SIMD is not supported in the current environment.")}let G=Z_();O>1&&!G&&(typeof self<"u"&&!self.crossOriginIsolated&&console.warn("env.wasm.numThreads is set to "+O+", but this will not work unless you enable crossOriginIsolated mode. See https://web.dev/cross-origin-isolation-guide/ for more info."),console.warn("WebAssembly multi-threading is not supported in the current environment. Falling back to single-threading."),$.numThreads=O=1);let Z=$.wasmPaths,V=typeof Z=="string"?Z:void 0,N=Z?.mjs,J=N?.href??N,R=Z?.wasm,U=R?.href??R,H=$.wasmBinary,[L,Y]=await my(J,V,O>1),S=!1,X=[];if(j>0&&X.push(new Promise((D)=>{setTimeout(()=>{S=!0,D()},j)})),X.push(new Promise((D,I)=>{let k={numThreads:O};if(H)k.wasmBinary=H;else if(U||V)k.locateFile=(z)=>U??V+z;else if(J&&J.indexOf("blob:")!==0)k.locateFile=(z)=>new URL(z,J).href;else if(L){let z=hy();z&&(k.locateFile=(w)=>z+w)}Y(k).then((z)=>{FZ=!1,pq=!0,tN=z,D(),L&&URL.revokeObjectURL(L)},(z)=>{FZ=!1,eN=!0,I(z)})})),await Promise.race(X),S)throw Error(`WebAssembly backend initializing failed due to timeout: ${j}ms`)},_9=()=>{if(pq&&tN)return tN;throw Error("WebAssembly is not initialized yet.")}}),xR=I5(()=>{G$(),K3=($,j)=>{let O=_9(),G=O.lengthBytesUTF8($)+1,Z=O._malloc(G);return O.stringToUTF8($,Z,G),j.push(Z),Z},HV=($,j,O,G)=>{if(typeof $=="object"&&$!==null){if(O.has($))throw Error("Circular reference in options");O.add($)}Object.entries($).forEach(([Z,V])=>{let N=j?j+Z:Z;if(typeof V=="object")HV(V,N+".",O,G);else if(typeof V=="string"||typeof V=="number")G(N,V.toString());else{if(typeof V!="boolean")throw Error("Can't handle extra config type: "+typeof V);G(N,V?"1":"0")}})},N9=($)=>{let j=_9(),O=j.stackSave();try{let G=j.PTR_SIZE,Z=j.stackAlloc(2*G);j._OrtGetLastError(Z,Z+G);let V=Number(j.getValue(Z,G===4?"i32":"i64")),N=j.getValue(Z+G,"*"),J=N?j.UTF8ToString(N):"";throw Error(`${$} ERROR_CODE: ${V}, ERROR_MESSAGE: ${J}`)}finally{j.stackRestore(O)}}}),FM=I5(()=>{G$(),xR(),py=($)=>{let j=_9(),O=0,G=[],Z=$||{};try{if($?.logSeverityLevel===void 0)Z.logSeverityLevel=2;else if(typeof $.logSeverityLevel!="number"||!Number.isInteger($.logSeverityLevel)||$.logSeverityLevel<0||$.logSeverityLevel>4)throw Error(`log serverity level is not valid: ${$.logSeverityLevel}`);if($?.logVerbosityLevel===void 0)Z.logVerbosityLevel=0;else if(typeof $.logVerbosityLevel!="number"||!Number.isInteger($.logVerbosityLevel))throw Error(`log verbosity level is not valid: ${$.logVerbosityLevel}`);$?.terminate===void 0&&(Z.terminate=!1);let V=0;return $?.tag!==void 0&&(V=K3($.tag,G)),O=j._OrtCreateRunOptions(Z.logSeverityLevel,Z.logVerbosityLevel,!!Z.terminate,V),O===0&&N9("Can't create run options."),$?.extra!==void 0&&HV($.extra,"",new WeakSet,(N,J)=>{let R=K3(N,G),U=K3(J,G);j._OrtAddRunConfigEntry(O,R,U)!==0&&N9(`Can't set a run config entry: ${N} - ${J}.`)}),[O,G]}catch(V){throw O!==0&&j._OrtReleaseRunOptions(O),G.forEach((N)=>j._free(N)),V}}}),yM=I5(()=>{G$(),xR(),N_=($)=>{switch($){case"disabled":return 0;case"basic":return 1;case"extended":return 2;case"all":return 99;default:throw Error(`unsupported graph optimization level: ${$}`)}},J_=($)=>{switch($){case"sequential":return 0;case"parallel":return 1;default:throw Error(`unsupported execution mode: ${$}`)}},v_=($)=>{$.extra||($.extra={}),$.extra.session||($.extra.session={});let j=$.extra.session;j.use_ort_model_bytes_directly||(j.use_ort_model_bytes_directly="1"),$.executionProviders&&$.executionProviders.some((O)=>(typeof O=="string"?O:O.name)==="webgpu")&&($.enableMemPattern=!1)},yZ=($,j,O,G)=>{let Z=K3(j,G),V=K3(O,G);_9()._OrtAddSessionConfigEntry($,Z,V)!==0&&N9(`Can't set a session config entry: ${j} - ${O}.`)},R_=async($,j,O)=>{for(let G of j){let Z=typeof G=="string"?G:G.name,V=[];switch(Z){case"webnn":if(Z="WEBNN",typeof G!="string"){let H=G?.deviceType;H&&yZ($,"deviceType",H,O)}break;case"webgpu":if(Z="JS",typeof G!="string"){let H=G;if(H?.preferredLayout){if(H.preferredLayout!=="NCHW"&&H.preferredLayout!=="NHWC")throw Error(`preferredLayout must be either 'NCHW' or 'NHWC': ${H.preferredLayout}`);yZ($,"preferredLayout",H.preferredLayout,O)}}break;case"wasm":case"cpu":continue;default:throw Error(`not supported execution provider: ${Z}`)}let N=K3(Z,O),J=V.length,R=0,U=0;if(J>0){R=_9()._malloc(J*_9().PTR_SIZE),O.push(R),U=_9()._malloc(J*_9().PTR_SIZE),O.push(U);for(let H=0;H{let j=_9(),O=0,G=[],Z=$||{};v_(Z);try{let V=N_(Z.graphOptimizationLevel??"all"),N=J_(Z.executionMode??"sequential"),J=typeof Z.logId=="string"?K3(Z.logId,G):0,R=Z.logSeverityLevel??2;if(!Number.isInteger(R)||R<0||R>4)throw Error(`log serverity level is not valid: ${R}`);let U=Z.logVerbosityLevel??0;if(!Number.isInteger(U)||U<0||U>4)throw Error(`log verbosity level is not valid: ${U}`);let H=typeof Z.optimizedModelFilePath=="string"?K3(Z.optimizedModelFilePath,G):0;if(O=j._OrtCreateSessionOptions(V,!!Z.enableCpuMemArena,!!Z.enableMemPattern,N,!!Z.enableProfiling,0,J,R,U,H),O===0&&N9("Can't create session options."),Z.executionProviders&&await R_(O,Z.executionProviders,G),Z.enableGraphCapture!==void 0){if(typeof Z.enableGraphCapture!="boolean")throw Error(`enableGraphCapture must be a boolean value: ${Z.enableGraphCapture}`);yZ(O,"enableGraphCapture",Z.enableGraphCapture.toString(),G)}if(Z.freeDimensionOverrides)for(let[L,Y]of Object.entries(Z.freeDimensionOverrides)){if(typeof L!="string")throw Error(`free dimension override name must be a string: ${L}`);if(typeof Y!="number"||!Number.isInteger(Y)||Y<0)throw Error(`free dimension override value must be a non-negative integer: ${Y}`);let S=K3(L,G);j._OrtAddFreeDimensionOverride(O,S,Y)!==0&&N9(`Can't set a free dimension override: ${L} - ${Y}.`)}return Z.extra!==void 0&&HV(Z.extra,"",new WeakSet,(L,Y)=>{yZ(O,L,Y,G)}),[O,G]}catch(V){throw O!==0&&j._OrtReleaseSessionOptions(O)!==0&&N9("Can't release session options."),G.forEach((N)=>j._free(N)),V}}}),Y6=I5(()=>{XG=($)=>{switch($){case"int8":return 3;case"uint8":return 2;case"bool":return 9;case"int16":return 5;case"uint16":return 4;case"int32":return 6;case"uint32":return 12;case"float16":return 10;case"float32":return 1;case"float64":return 11;case"string":return 8;case"int64":return 7;case"uint64":return 13;case"int4":return 22;case"uint4":return 21;default:throw Error(`unsupported data type: ${$}`)}},z4=($)=>{switch($){case 3:return"int8";case 2:return"uint8";case 9:return"bool";case 5:return"int16";case 4:return"uint16";case 6:return"int32";case 12:return"uint32";case 10:return"float16";case 1:return"float32";case 11:return"float64";case 8:return"string";case 7:return"int64";case 13:return"uint64";case 22:return"int4";case 21:return"uint4";default:throw Error(`unsupported data type: ${$}`)}},s8=($,j)=>{let O=[-1,4,1,1,2,2,4,8,-1,1,2,8,4,8,-1,-1,-1,-1,-1,-1,-1,0.5,0.5][$],G=typeof j=="number"?j:j.reduce((Z,V)=>Z*V,1);return O>0?Math.ceil(G*O):void 0},GR=($)=>{switch($){case"float16":return typeof Float16Array<"u"&&Float16Array.from?Float16Array:Uint16Array;case"float32":return Float32Array;case"uint8":case"bool":return Uint8Array;case"int8":return Int8Array;case"uint16":return Uint16Array;case"int16":return Int16Array;case"int32":return Int32Array;case"float64":return Float64Array;case"uint32":return Uint32Array;case"int64":return BigInt64Array;case"uint64":return BigUint64Array;default:throw Error(`unsupported type: ${$}`)}},xV=($)=>{switch($){case"verbose":return 0;case"info":return 1;case"warning":return 2;case"error":return 3;case"fatal":return 4;default:throw Error(`unsupported logging level: ${$}`)}},ZR=($)=>$==="float32"||$==="float16"||$==="int32"||$==="int64"||$==="uint32"||$==="uint8"||$==="bool"||$==="uint4"||$==="int4",qR=($)=>$==="float32"||$==="float16"||$==="int32"||$==="int64"||$==="uint32"||$==="uint64"||$==="int8"||$==="uint8"||$==="bool"||$==="uint4"||$==="int4",Rv=($)=>{switch($){case"none":return 0;case"cpu":return 1;case"cpu-pinned":return 2;case"texture":return 3;case"gpu-buffer":return 4;case"ml-tensor":return 5;default:throw Error(`unsupported data location: ${$}`)}}}),KI=I5(()=>{jR(),VR=async($)=>{if(typeof $=="string"){let j=await fetch($);if(!j.ok)throw Error(`failed to load external data file: ${$}`);let O=j.headers.get("Content-Length"),G=O?parseInt(O,10):0;if(G<1073741824)return new Uint8Array(await j.arrayBuffer());{if(!j.body)throw Error(`failed to load external data file: ${$}, no response body.`);let Z,V=j.body.getReader();try{Z=new ArrayBuffer(G)}catch(J){if(!(J instanceof RangeError))throw J;{let R=Math.ceil(G/65536);Z=new WebAssembly.Memory({initial:R,maximum:R}).buffer}}let N=0;for(;;){let{done:J,value:R}=await V.read();if(J)break;let U=R.byteLength;new Uint8Array(Z,N,U).set(R),N+=U}return new Uint8Array(Z,0,G)}}return $ instanceof Blob?new Uint8Array(await $.arrayBuffer()):$ instanceof Uint8Array?$:new Uint8Array($)}}),I4=I5(()=>{Y6(),U_=["V","I","W","E","F"],H_=($,j)=>{console.log(`[${U_[$]},${new Date().toISOString()}]${j}`)},NR=($,j)=>{x_=$,L_=j},__=($,j)=>{let O=xV($);O>=xV(x_)&&H_(O,typeof j=="function"?j():j)},l6=(...$)=>{L_&&__(...$)}}),D6=I5(()=>{Y_=class{static calcMatMulShape($,j){return $[1]!==j[0]?void 0:[$[0],j[1]]}},IG=class{static calcShape($,j,O=!1){let G=$.length,Z=j.length;if(G===0)return j;if(Z===0)return $;let V=Math.max($.length,j.length),N=Array(V);if(O){if(G<2||Z<2)return;let J=Y_.calcMatMulShape([$[G-2],$[G-1]],[j[Z-2],j[Z-1]]);if(J===void 0)return;[N[V-2],N[V-1]]=J}for(let J=O?3:1;J<=V;J++){let R=G-J<0?1:$[G-J],U=Z-J<0?1:j[Z-J];if(R!==U&&R>1&&U>1)return;let H=Math.max(R,U);if(R&&U)N[V-J]=Math.max(R,U);else{if(H>1)return;N[V-J]=0}}return N}static isValidBroadcast($,j){let O=$.length,G=j.length;if(O>G)return!1;for(let Z=1;Z<=O;Z++)if($[O-Z]!==1&&$[O-Z]!==j[G-Z])return!1;return!0}},l0=class ${static size(j){return $.getSizeFromDimensionRange(j,0,j.length)}static convertShape(j,O=4){let G=j.length;if(G===0)return[];let Z=Array(G),V=G-1;for(;V>=0;){if(j[V]%O===0){Z[V]=j[V]/O;break}if(O%j[V]!==0)throw Error("cannot convert shape");Z[V]=1,O/=j[V],V--}for(V--;V>=0;V--)Z[V]=j[V];return Z}static sizeFromDimension(j,O){if(O<0||O>j.length)throw Error(`invalid dimension of ${O} for sizeFromDimension as Tensor has ${j.length} dimensions.`);return $.getSizeFromDimensionRange(j,O,j.length)}static sizeToDimension(j,O){if(O<0||O>j.length)throw Error(`invalid dimension of ${O} for sizeToDimension as Tensor has ${j.length} dimensions.`);return $.getSizeFromDimensionRange(j,0,O)}static getSizeFromDimensionRange(j,O,G){let Z=1;for(let V=O;V=0;--Z)G[Z]=G[Z+1]*j[Z+1];return G}static normalizeAxis(j,O){if(j<-O&&j>=O)throw Error("unsupported axis for this operation.");return j<0?j+O:j}static normalizeAxes(j,O){return j.map((G)=>this.normalizeAxis(G,O??j.length))}static sortBasedOnPerm(j,O){return O?O.map((G)=>j[G]):j.slice().reverse()}static padShape(j,O){let G=j.length;return j.map((Z,V)=>Z+O[V]+O[V+G])}static areEqual(j,O){return j.length===O.length&&j.every((G,Z)=>G===O[Z])}},LV=class ${static adjustPoolAttributes(j,O,G,Z,V,N){if(!j&&G.length!==O.length-2)throw Error("length of specified kernel shapes should be 2 less than length of input dimensions");if(j)for(let J=0;J=G.length?G.push(O[J+2]):G[J]=O[J+2];for(let J=0;J=G[J]||N[J+G.length]>=G[J])throw Error("pads should be smaller than kernel")}}static adjustPadsBasedOnAutoPad(j,O,G,Z,V,N,J){if(J){if(V.length!==2*(j.length-2))throw Error("length of pads should be twice the length of data dimensions");if(O.length!==j.length-2)throw Error("length of strides should be the length of data dimensions");if(Z.length!==j.length-2)throw Error("length of kernel shapes should be the length of data dimensions");for(let R=0;R{Y6(),JR=($,j)=>new(GR(j))($)}),zM=I5(()=>{I4(),Uv=($,j=!0)=>{if($.byteLength%8!=0)throw Error("Invalid Uint8Array length - must be a multiple of 8 (BigInt).");let O=$.byteLength/8,G=new BigInt64Array($.buffer,$.byteOffset,O),Z=new Int32Array(O);for(let V=0;V2147483647n||N<-2147483648n)throw Error(`Overflow occurred when converting BigInt to Int32 at index ${V}: ${N}`);Z[V]=Number(N)}return j?new Uint8Array(Z.buffer):Z},$J=($,j=!0)=>{if($.byteLength%4!=0)throw Error("Invalid Uint8Array length - must be a multiple of 4 (Int32).");let O=$.byteLength/4,G=new Int32Array($.buffer,$.byteOffset,O),Z=BigInt64Array.from(G,BigInt);return j?new Uint8Array(Z.buffer):Z},S_=1,jJ=()=>S_++,P_=new Map([["float32",32],["float16",16],["int32",32],["uint32",32],["int64",64],["uint64",64],["int8",8],["uint8",8],["int4",4],["uint4",4]]),OJ=($,j)=>{let O=P_.get($);if(!O)throw Error("Unsupported data type.");return j.length>0?Math.ceil(j.reduce((G,Z)=>G*Z)*O/8):0},GJ=class{constructor($){this.shouldConvertInt64toInt32=!1,this.isInt64ToInt32Converted=!1;let{sessionId:j,context:O,tensor:G,dataType:Z,shape:V,shouldConvertInt64toInt32:N=!1}=$;this.sessionId=j,this.mlContext=O,this.mlTensor=G,this.dataType=Z,this.tensorShape=V,this.shouldConvertInt64toInt32=N}get tensor(){return this.mlTensor}get type(){return this.dataType}get shape(){return this.tensorShape}get byteLength(){return OJ(this.dataType,this.tensorShape)}destroy(){l6("verbose",()=>"[WebNN] TensorWrapper.destroy"),this.mlTensor.destroy()}write($){this.mlContext.writeTensor(this.mlTensor,$)}async read($,j){if($){let O=await this.mlContext.readTensor(this.mlTensor),G=$J(new Uint8Array(O));return j?void(j instanceof ArrayBuffer?new Uint8Array(j):new Uint8Array(j.buffer,j.byteOffset,j.byteLength)).set(G):G.buffer}return j?this.mlContext.readTensor(this.mlTensor,j):this.mlContext.readTensor(this.mlTensor)}canReuseTensor($,j,O){return this.mlContext===$&&this.dataType===j&&this.tensorShape.length===O.length&&this.tensorShape.every((G,Z)=>G===O[Z])}setIsInt64ToInt32Converted($){this.isInt64ToInt32Converted=$}},ZJ=class{constructor($,j){this.tensorManager=$,this.wrapper=j}get tensorWrapper(){return this.wrapper}releaseTensor(){this.tensorWrapper&&(this.tensorManager.releaseTensor(this.tensorWrapper),this.wrapper=void 0)}async ensureTensor($,j,O,G){let Z=j,V=this.tensorManager.getMLContext($),N=Z==="int64"&&!V.opSupportLimits().input.dataTypes.includes("int64");if(N&&(Z="int32",l6("verbose",()=>"[WebNN] TensorIdTracker.ensureTensor: convert dataType from int64 to int32")),this.wrapper){if(this.wrapper.canReuseTensor(V,Z,O))return this.wrapper.tensor;if(G){if(this.wrapper.byteLength!==OJ(Z,O))throw Error("Unable to copy data to tensor with different size.");this.activeUpload=new Uint8Array(await this.wrapper.read())}this.tensorManager.releaseTensor(this.wrapper)}let J=typeof MLTensorUsage>"u"?void 0:MLTensorUsage.READ|MLTensorUsage.WRITE;return this.wrapper=await this.tensorManager.getCachedTensor($,Z,O,J,!0,!0,N),G&&this.activeUpload&&(this.wrapper.write(this.activeUpload),this.activeUpload=void 0),this.wrapper.tensor}upload($){let j=$;if(this.wrapper){if(this.wrapper.shouldConvertInt64toInt32&&(j=Uv($,!0),this.wrapper.setIsInt64ToInt32Converted(!0)),j.byteLength===this.wrapper.byteLength)return void this.wrapper.write(j);l6("verbose",()=>"Data size does not match tensor size. Releasing tensor."),this.releaseTensor()}this.activeUpload?this.activeUpload.set(j):this.activeUpload=new Uint8Array(j)}async download($){if(this.activeUpload){let j=this.wrapper?.isInt64ToInt32Converted?$J(this.activeUpload):this.activeUpload;return $?void($ instanceof ArrayBuffer?new Uint8Array($).set(j):new Uint8Array($.buffer,$.byteOffset,$.byteLength).set(j)):j.buffer}if(!this.wrapper)throw Error("Tensor has not been created.");return $?this.wrapper.read(this.wrapper?.shouldConvertInt64toInt32,$):this.wrapper.read(this.wrapper?.shouldConvertInt64toInt32)}},X_=class{constructor($){this.backend=$,this.tensorTrackersById=new Map,this.freeTensors=[],this.externalTensors=new Set}getMLContext($){let j=this.backend.getMLContext($);if(!j)throw Error("MLContext not found for session.");return j}reserveTensorId(){let $=jJ();return this.tensorTrackersById.set($,new ZJ(this)),$}releaseTensorId($){let j=this.tensorTrackersById.get($);j&&(this.tensorTrackersById.delete($),j.tensorWrapper&&this.releaseTensor(j.tensorWrapper))}async ensureTensor($,j,O,G,Z){l6("verbose",()=>`[WebNN] TensorManager.ensureTensor {tensorId: ${j}, dataType: ${O}, shape: ${G}, copyOld: ${Z}}`);let V=this.tensorTrackersById.get(j);if(!V)throw Error("Tensor not found.");return V.ensureTensor($,O,G,Z)}upload($,j){let O=this.tensorTrackersById.get($);if(!O)throw Error("Tensor not found.");O.upload(j)}async download($,j){l6("verbose",()=>`[WebNN] TensorManager.download {tensorId: ${$}, dstBuffer: ${j?.byteLength}}`);let O=this.tensorTrackersById.get($);if(!O)throw Error("Tensor not found.");return O.download(j)}releaseTensorsForSession($){for(let j of this.freeTensors)j.sessionId===$&&j.destroy();this.freeTensors=this.freeTensors.filter((j)=>j.sessionId!==$)}registerTensor($,j,O,G){let Z=this.getMLContext($),V=jJ(),N=new GJ({sessionId:$,context:Z,tensor:j,dataType:O,shape:G});return this.tensorTrackersById.set(V,new ZJ(this,N)),this.externalTensors.add(N),V}async getCachedTensor($,j,O,G,Z,V,N=!1){let J=this.getMLContext($);for(let[U,H]of this.freeTensors.entries())if(H.canReuseTensor(J,j,O)){l6("verbose",()=>`[WebNN] Reusing tensor {dataType: ${j}, shape: ${O}}`);let L=this.freeTensors.splice(U,1)[0];return L.sessionId=$,L}l6("verbose",()=>`[WebNN] MLContext.createTensor {dataType: ${j}, shape: ${O}}`);let R=await J.createTensor({dataType:j,shape:O,dimensions:O,usage:G,writable:Z,readable:V});return new GJ({sessionId:$,context:J,tensor:R,dataType:j,shape:O,shouldConvertInt64toInt32:N})}releaseTensor($){this.externalTensors.has($)&&this.externalTensors.delete($),this.freeTensors.push($)}},ly=(...$)=>new X_(...$)}),kM=I5(()=>{Y6(),G$(),bI(),zM(),I4(),Aq=new Map([[1,"float32"],[10,"float16"],[6,"int32"],[12,"uint32"],[7,"int64"],[13,"uint64"],[22,"int4"],[21,"uint4"],[3,"int8"],[2,"uint8"],[9,"uint8"]]),T_=($,j)=>{if($===j)return!0;if($===void 0||j===void 0)return!1;let O=Object.keys($).sort(),G=Object.keys(j).sort();return O.length===G.length&&O.every((Z,V)=>Z===G[V]&&$[Z]===j[Z])},oy=class{constructor($){this.tensorManager=ly(this),this.mlContextBySessionId=new Map,this.sessionIdsByMLContext=new Map,this.mlContextCache=[],this.sessionGraphInputs=new Map,this.temporaryGraphInputs=[],this.temporarySessionTensorIds=new Map,NR($.logLevel,!!$.debug)}get currentSessionId(){if(this.activeSessionId===void 0)throw Error("No active session");return this.activeSessionId}onRunStart($){l6("verbose",()=>`[WebNN] onRunStart {sessionId: ${$}}`),this.activeSessionId=$}onRunEnd($){l6("verbose",()=>`[WebNN] onRunEnd {sessionId: ${$}}`);let j=this.temporarySessionTensorIds.get($);if(j){for(let O of j)l6("verbose",()=>`[WebNN] releasing temporary tensor {tensorId: ${O}}`),this.tensorManager.releaseTensorId(O);this.temporarySessionTensorIds.delete($),this.activeSessionId=void 0}}async createMLContext($){if($ instanceof GPUDevice){let O=this.mlContextCache.findIndex((G)=>G.gpuDevice===$);if(O!==-1)return this.mlContextCache[O].mlContext;{let G=await navigator.ml.createContext($);return this.mlContextCache.push({gpuDevice:$,mlContext:G}),G}}if($===void 0){let O=this.mlContextCache.findIndex((G)=>G.options===void 0&&G.gpuDevice===void 0);if(O!==-1)return this.mlContextCache[O].mlContext;{let G=await navigator.ml.createContext();return this.mlContextCache.push({mlContext:G}),G}}let j=this.mlContextCache.findIndex((O)=>T_(O.options,$));if(j!==-1)return this.mlContextCache[j].mlContext;{let O=await navigator.ml.createContext($);return this.mlContextCache.push({options:$,mlContext:O}),O}}registerMLContext($,j){this.mlContextBySessionId.set($,j);let O=this.sessionIdsByMLContext.get(j);O||(O=new Set,this.sessionIdsByMLContext.set(j,O)),O.add($),this.temporaryGraphInputs.length>0&&(this.sessionGraphInputs.set($,this.temporaryGraphInputs),this.temporaryGraphInputs=[])}onReleaseSession($){this.sessionGraphInputs.delete($);let j=this.mlContextBySessionId.get($);if(!j)return;this.tensorManager.releaseTensorsForSession($),this.mlContextBySessionId.delete($);let O=this.sessionIdsByMLContext.get(j);if(O.delete($),O.size===0){this.sessionIdsByMLContext.delete(j);let G=this.mlContextCache.findIndex((Z)=>Z.mlContext===j);G!==-1&&this.mlContextCache.splice(G,1)}}getMLContext($){return this.mlContextBySessionId.get($)}reserveTensorId(){return this.tensorManager.reserveTensorId()}releaseTensorId($){l6("verbose",()=>`[WebNN] releaseTensorId {tensorId: ${$}}`),this.tensorManager.releaseTensorId($)}async ensureTensor($,j,O,G,Z){let V=Aq.get(O);if(!V)throw Error(`Unsupported ONNX data type: ${O}`);return this.tensorManager.ensureTensor($??this.currentSessionId,j,V,G,Z)}async createTemporaryTensor($,j,O){l6("verbose",()=>`[WebNN] createTemporaryTensor {onnxDataType: ${j}, shape: ${O}}`);let G=Aq.get(j);if(!G)throw Error(`Unsupported ONNX data type: ${j}`);let Z=this.tensorManager.reserveTensorId();await this.tensorManager.ensureTensor($,Z,G,O,!1);let V=this.temporarySessionTensorIds.get($);return V?V.push(Z):this.temporarySessionTensorIds.set($,[Z]),Z}uploadTensor($,j){if(!_9().shouldTransferToMLTensor)throw Error("Trying to upload to a MLTensor while shouldTransferToMLTensor is false");l6("verbose",()=>`[WebNN] uploadTensor {tensorId: ${$}, data: ${j.byteLength}}`),this.tensorManager.upload($,j)}async downloadTensor($,j){return this.tensorManager.download($,j)}createMLTensorDownloader($,j){return async()=>{let O=await this.tensorManager.download($);return JR(O,j)}}registerMLTensor($,j,O,G){let Z=Aq.get(O);if(!Z)throw Error(`Unsupported ONNX data type: ${O}`);let V=this.tensorManager.registerTensor($,j,Z,G);return l6("verbose",()=>`[WebNN] registerMLTensor {tensor: ${j}, dataType: ${Z}, dimensions: ${G}} -> {tensorId: ${V}}`),V}registerMLConstant($,j,O,G,Z,V,N=!1){if(!V)throw Error("External mounted files are not available.");let J=$;$.startsWith("./")&&(J=$.substring(2));let R=V.get(J);if(!R)throw Error(`File with name ${J} not found in preloaded files.`);if(j+O>R.byteLength)throw Error("Out of bounds: data offset and length exceed the external file data size.");let U,H=R.slice(j,j+O).buffer;switch(Z.dataType){case"float32":U=new Float32Array(H);break;case"float16":U=typeof Float16Array<"u"&&Float16Array.from?new Float16Array(H):new Uint16Array(H);break;case"int32":U=new Int32Array(H);break;case"uint32":U=new Uint32Array(H);break;case"int64":N?(U=Uv(new Uint8Array(H),!1),Z.dataType="int32"):U=new BigInt64Array(H);break;case"uint64":U=new BigUint64Array(H);break;case"int8":U=new Int8Array(H);break;case"int4":case"uint4":case"uint8":U=new Uint8Array(H);break;default:throw Error(`Unsupported data type: ${Z.dataType} in creating WebNN Constant from external data.`)}return l6("verbose",()=>`[WebNN] registerMLConstant {dataType: ${Z.dataType}, shape: ${Z.shape}}} ${N?"(Note: it was int64 data type and registered to int32 as workaround)":""}`),G.constant(Z,U)}registerGraphInput($){this.temporaryGraphInputs.push($)}isGraphInput($,j){let O=this.sessionGraphInputs.get($);return!!O&&O.includes(j)}isInt64Supported($){return!!this.mlContextBySessionId.get($)?.opSupportLimits().input.dataTypes.includes("int64")}flush(){}}}),LR=I5(()=>{}),IM=I5(()=>{I4(),LR(),qJ=new Map([[64,250],[128,200],[256,200],[512,200],[2048,230],[4096,200],[8192,50],[16384,50],[32768,50],[65536,50],[131072,50],[262144,50],[524288,50],[1048576,50],[2097152,30],[4194304,20],[8388608,10],[12582912,10],[16777216,10],[26214400,15],[33554432,22],[44236800,2],[58982400,6],[67108864,6],[134217728,6],[167772160,6]]),gq=[],uq=($)=>16*Math.ceil(Number($)/16),F_=($)=>{for(let j=0;jy_++,Hv=async($,j,O,G)=>{let Z=uq(O),V=$.device.createBuffer({size:Z,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});try{let N=$.getCommandEncoder();$.endComputePass(),N.copyBufferToBuffer(j,0,V,0,Z),$.flush(),await V.mapAsync(GPUMapMode.READ);let J=V.getMappedRange();if(G){let R=G();return R.set(new Uint8Array(J,0,O)),R}return new Uint8Array(J.slice(0,O))}finally{V.destroy()}},z_=class{constructor($){this.backend=$,this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.buffersPending=[],this.capturedPendingBuffers=new Map;for(let[j]of qJ)gq.push(j),this.freeBuffers.set(j,[]),this.freeUniformBuffers.set(j,[]);this.sessionCount=0}upload($,j){let{buffer:O,byteOffset:G,byteLength:Z}=j,V=uq(Z),N=this.storageCache.get($);if(!N)throw Error("gpu data for uploading does not exist");if(Number(N.originalSize)!==Z)throw Error(`inconsistent data size. gpu data size=${N.originalSize}, data size=${Z}`);let J=this.backend.device.createBuffer({mappedAtCreation:!0,size:V,usage:GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC}),R=J.getMappedRange();new Uint8Array(R).set(new Uint8Array(O,G,Z)),J.unmap();let U=this.backend.device.createCommandEncoder();U.copyBufferToBuffer(J,0,N.gpuData.buffer,0,V),this.backend.device.queue.submit([U.finish()]),J.destroy(),l6("verbose",()=>`[WebGPU] GpuDataManager.upload(id=${$})`)}memcpy($,j){let O=this.storageCache.get($);if(!O)throw Error("source gpu data for memcpy does not exist");let G=this.storageCache.get(j);if(!G)throw Error("destination gpu data for memcpy does not exist");if(O.originalSize!==G.originalSize)throw Error("inconsistent source and destination gpu data size");let Z=uq(O.originalSize),V=this.backend.getCommandEncoder();this.backend.endComputePass(),V.copyBufferToBuffer(O.gpuData.buffer,0,G.gpuData.buffer,0,Z)}registerExternalBuffer($,j,O){let G;if(O){if(G=O[0],$===O[1])return l6("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${j}) => id=${G}, buffer is the same, skip.`),G;if(this.backend.capturedCommandList.has(this.backend.currentSessionId))throw Error(`Registering a different external buffer under graph capture mode is not supported yet. + Please use the previous external buffer!`)}else G=VJ();return this.storageCache.set(G,{gpuData:{id:G,type:0,buffer:$},originalSize:j}),l6("verbose",()=>`[WebGPU] GpuDataManager.registerExternalBuffer(size=${j}) => id=${G}, registered.`),G}unregisterExternalBuffer($){$!==void 0&&(this.storageCache.delete($),l6("verbose",()=>`[WebGPU] GpuDataManager.unregisterExternalBuffer() => id=${$}`))}create($,j=GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST){let O,G=F_($),Z=(j&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE,V=(j&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM;if(Z||V){let J=(Z?this.freeBuffers:this.freeUniformBuffers).get(G);O=J&&J.length>0?J.pop():this.backend.device.createBuffer({size:G,usage:j})}else O=this.backend.device.createBuffer({size:G,usage:j});let N={id:VJ(),type:0,buffer:O};return this.storageCache.set(N.id,{gpuData:N,originalSize:Number($)}),l6("verbose",()=>`[WebGPU] GpuDataManager.create(size=${$}) => id=${N.id}`),N}get($){return this.storageCache.get($)?.gpuData}release($){let j=typeof $=="bigint"?Number($):$,O=this.storageCache.get(j);if(!O){if(this.storageCache.size===0)return 0;throw Error("releasing data does not exist")}return l6("verbose",()=>`[WebGPU] GpuDataManager.release(id=${j}), gpuDataId=${O.gpuData.id}`),this.storageCache.delete(j),this.buffersPending.push(O.gpuData.buffer),O.originalSize}async download($,j){let O=this.storageCache.get(Number($));if(!O)throw Error("data does not exist");await Hv(this.backend,O.gpuData.buffer,O.originalSize,j)}refreshPendingBuffers(){if(this.buffersPending.length!==0)if(this.backend.sessionStatus==="default"){for(let $ of this.buffersPending){let j=qJ.get($.size);if(($.usage&GPUBufferUsage.STORAGE)===GPUBufferUsage.STORAGE){let O=this.freeBuffers.get($.size)||[];j===void 0||O.length>=j?$.destroy():O.push($)}else if(($.usage&GPUBufferUsage.UNIFORM)===GPUBufferUsage.UNIFORM){let O=this.freeUniformBuffers.get($.size)||[];j===void 0||O.length>=j?$.destroy():O.push($)}else $.destroy()}this.buffersPending=[]}else{let $=this.capturedPendingBuffers.get(this.backend.currentSessionId);$||($=[],this.capturedPendingBuffers.set(this.backend.currentSessionId,$));for(let j of this.buffersPending)$.push(j);this.buffersPending=[]}}dispose(){this.freeBuffers.forEach(($)=>{$.forEach((j)=>{j.destroy()})}),this.freeUniformBuffers.forEach(($)=>{$.forEach((j)=>{j.destroy()})}),this.storageCache.forEach(($)=>{$.gpuData.buffer.destroy()}),this.capturedPendingBuffers.forEach(($)=>{$.forEach((j)=>{j.destroy()})}),this.storageCache=new Map,this.freeBuffers=new Map,this.freeUniformBuffers=new Map,this.capturedPendingBuffers=new Map}onCreateSession(){this.sessionCount+=1}onReleaseSession($){let j=this.capturedPendingBuffers.get($);j&&(j.forEach((O)=>{O.destroy()}),this.capturedPendingBuffers.delete($)),this.sessionCount-=1,this.sessionCount===0&&(l6("warning",()=>"[WebGPU] Clearing webgpu buffer cache"),this.storageCache.forEach((O)=>{O.gpuData.buffer.destroy()}),this.storageCache=new Map)}},sy=(...$)=>new z_(...$)}),B9=I5(()=>{k_=class{constructor($){Object.assign(this,$)}get cacheKey(){return this.key||(this.key=Object.getOwnPropertyNames(this).sort().map(($)=>`${this[$]}`).join(";")),this.key}},j9=($)=>new k_($)}),M6=I5(()=>{Y6(),D6(),DG=64,dq=($,j)=>{if(j===3)throw Error("vec3 has same alignment as vec4, use vec4 instead");switch(Number($)){case 10:return j>1?`vec${j}`:"f16";case 1:return j>1?`vec${j}`:"f32";case 6:return j>1?`vec${j}`:"i32";case 12:return j>1?`vec${j}`:"u32";case 7:if(j>1)throw Error("currently not supported vecX of uint64 yet");return["vec2","i32"];case 13:if(j>1)throw Error("currently not supported vecX of uint64 yet");return["vec2","u32"];case 9:if(j!==4)throw Error("bool must be vec4");return["u32","vec4"];case 22:return"i32";case 21:return"u32";default:throw Error(`Unknown data type: ${$}`)}},Z1=($,j=1)=>{let O=dq($,j);return typeof O=="string"?O:O[0]},k1=($,j=1)=>{let O=dq($,j);return typeof O=="string"?O:O[1]},j6=(...$)=>{let j=[];return $.forEach((O)=>{O.length!==0&&j.push({type:12,data:O},{type:12,data:l0.computeStrides(O)})}),j},K9=($)=>$%4==0?4:$%2==0?2:1,xv=($="f32",j,O="0")=>j&&j!==1?`vec${j}<${$}>(${O})`:`${$}(${O})`,yG=($,j,O)=>$==="f32"?O:j===1?`f32(${O})`:`vec${j}(${O})`,N7=($,j)=>j===4?`(${$}.x + ${$}.y + ${$}.z + ${$}.w)`:j===2?`(${$}.x + ${$}.y)`:j===3?`(${$}.x + ${$}.y + ${$}.z)`:$,R6=($,j,O,G)=>$.startsWith("uniforms.")&&O>4?typeof j=="string"?G==="f16"?`${$}[(${j}) / 8][(${j}) % 8 / 4][(${j}) % 8 % 4]`:`${$}[(${j}) / 4][(${j}) % 4]`:G==="f16"?`${$}[${Math.floor(j/8)}][${Math.floor(j%8/4)}][${j%8%4}]`:`${$}[${Math.floor(j/4)}][${j%4}]`:O>1?`${$}[${j}]`:$,zZ=($,j,O,G,Z)=>{let V=typeof O=="number",N=V?O:O.length,J=[...Array(N).keys()],R=N<2?"u32":N<=4?`vec${N}`:`array`,U=dq(j,Z),H=typeof U=="string"?U:U[1],L=typeof U=="string"?U:U[0],Y={indices:R,value:H,storage:L,tensor:j},S=(i)=>typeof i=="string"?i:`${i}u`,X={offsetToIndices:!1,indicesToOffset:!1,broadcastedIndicesToOffset:!1,set:!1,setByIndices:!1,get:!1,getByIndices:!1},D=V?"uniforms.":"",I=`${D}${$}_shape`,k=`${D}${$}_strides`,z="";for(let i=0;i ${Y.indices} { + var indices: ${Y.indices}; + var current = offset; + ${z} + return indices; + }`,T=[];if(N>=2)for(let i=N-1;i>=0;i--)T.push(`${R6(k,i,N)} * (indices[${i}])`);let W=N<2?"":` + fn i2o_${$}(indices: ${Y.indices}) -> u32 { + return ${T.join("+")}; + }`,E=(...i)=>N===0?"0u":`${Y.indices}(${i.map(S).join(",")})`,Q=(i,G0)=>N<2?`${i}`:`${R6(i,G0,N)}`,A={},l=(i,G0)=>(()=>{if(Y.storage===Y.value)return`${$}[${i}]=${G0};`;if(Y.storage==="vec2"&&Y.value==="i32")return`${$}[${i}]=vec2(u32(${G0}), select(0u, 0xFFFFFFFFu, ${G0} < 0));`;if(Y.storage==="vec2"&&Y.value==="u32")return`${$}[${i}]=vec2(u32(${G0}), 0u);`;if(Y.storage==="u32"&&Y.value==="vec4")return`${$}[${i}]=dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(${G0}));`;throw Error(`not supported combination of storage type ${Y.storage} and value type ${Y.value} yet`)})(),r=(i)=>(()=>{if(Y.storage===Y.value)return`${$}[${i}]`;if(Y.storage==="vec2"&&Y.value==="i32")return`i32(${$}[${i}].x)`;if(Y.storage==="vec2"&&Y.value==="u32")return`u32(${$}[${i}].x)`;if(Y.storage==="u32"&&Y.value==="vec4")return`vec4(bool(${$}[${i}] & 0xFFu), bool(${$}[${i}] & 0xFF00u), bool(${$}[${i}] & 0xFF0000u), bool(${$}[${i}] & 0xFF000000u))`;throw Error(`not supported combination of storage type ${Y.storage} and value type ${Y.value} yet`)})(),e=N<2?"":` + fn get_${$}ByIndices(indices: ${Y.indices}) -> ${H} { + return ${r(`i2o_${$}(indices)`)}; + }`,V0=N<2?"":(()=>{let i=J.map((S0)=>`d${S0}: u32`).join(", "),G0=J.map((S0)=>`d${S0}`).join(", ");return` + fn get_${$}(${i}) -> ${H} { + return get_${$}ByIndices(${E(G0)}); + }`})(),v0=N<2?"":` + fn set_${$}ByIndices(indices: ${Y.indices}, value: ${H}) { + ${l(`i2o_${$}(indices)`,"value")} + }`,$0=N<2?"":(()=>{let i=J.map((S0)=>`d${S0}: u32`).join(", "),G0=J.map((S0)=>`d${S0}`).join(", ");return` + fn set_${$}(${i}, value: ${H}) { + set_${$}ByIndices(${E(G0)}, value); + }`})();return{impl:()=>{let i=[],G0=!1;return X.offsetToIndices&&(i.push(w),G0=!0),X.indicesToOffset&&(i.push(W),G0=!0),X.broadcastedIndicesToOffset&&(Object.values(A).forEach((S0)=>i.push(S0)),G0=!0),X.set&&(i.push($0),G0=!0),X.setByIndices&&(i.push(v0),G0=!0),X.get&&(i.push(V0),G0=!0),X.getByIndices&&(i.push(e),G0=!0),!V&&G0&&i.unshift(`const ${I} = ${Y.indices}(${O.join(",")});`,`const ${k} = ${Y.indices}(${l0.computeStrides(O).join(",")});`),i.join(` +`)},type:Y,offsetToIndices:(i)=>(X.offsetToIndices=!0,N<2?i:`o2i_${$}(${i})`),indicesToOffset:(i)=>(X.indicesToOffset=!0,N<2?i:`i2o_${$}(${i})`),broadcastedIndicesToOffset:(i,G0)=>{X.broadcastedIndicesToOffset=!0;let S0=`${G0.name}broadcastedIndicesTo${$}Offset`;if(S0 in A)return`${S0}(${i})`;let F0=[];for(let s=N-1;s>=0;s--){let n=G0.indicesGet("outputIndices",s+G0.rank-N);F0.push(`${Q(k,s)} * (${n} % ${Q(I,s)})`)}return A[S0]=`fn ${S0}(outputIndices: ${G0.type.indices}) -> u32 { + return ${F0.length>0?F0.join("+"):"0u"}; + }`,`${S0}(${i})`},indices:E,indicesGet:Q,indicesSet:(i,G0,S0)=>N<2?`${i}=${S0};`:`${R6(i,G0,N)}=${S0};`,set:(...i)=>{if(i.length!==N+1)throw Error(`indices length must be ${N}`);let G0=i[N];if(typeof G0!="string")throw Error("value must be string");let S0=i.slice(0,N).map(S).join(",");return N===0?l("0u",G0):N===1?l(S0[0],G0):(X.set=!0,X.setByIndices=!0,X.indicesToOffset=!0,`set_${$}(${S0}, ${G0})`)},setByOffset:l,setByIndices:(i,G0)=>N<2?l(i,G0):(X.setByIndices=!0,X.indicesToOffset=!0,`set_${$}ByIndices(${i}, ${G0});`),get:(...i)=>{if(i.length!==N)throw Error(`indices length must be ${N}`);let G0=i.map(S).join(",");return N===0?r("0u"):N===1?r(G0[0]):(X.get=!0,X.getByIndices=!0,X.indicesToOffset=!0,`get_${$}(${G0})`)},getByOffset:r,getByIndices:(i)=>N<2?r(i):(X.getByIndices=!0,X.indicesToOffset=!0,`get_${$}ByIndices(${i})`),usage:G,name:$,strides:k,shape:I,rank:N}},O5=($,j,O,G=1)=>zZ($,j,O,"input",G),t5=($,j,O,G=1)=>zZ($,j,O,"output",G),iy=($,j,O)=>zZ($,j,O,"atomicOutput",1),vR=($,j,O,G=1)=>zZ($,j,O,"internal",G),I_=class{constructor($,j){this.normalizedDispatchGroup=$,this.limits=j,this.internalVariables=[],this.variables=[],this.uniforms=[],this.variableIndex=0}guardAgainstOutOfBoundsWorkgroupSizes($){return`if (global_idx >= ${typeof $=="number"?`${$}u`:$}) { return; }`}mainStart($=DG){let j=typeof $=="number"?$:$[0],O=typeof $=="number"?1:$[1],G=typeof $=="number"?1:$[2];if(j>this.limits.maxComputeWorkgroupSizeX||O>this.limits.maxComputeWorkgroupSizeY||G>this.limits.maxComputeWorkgroupSizeZ)throw Error(`workgroup size [${j}, ${O}, ${G}] exceeds the maximum workgroup size [${this.limits.maxComputeWorkgroupSizeX}, ${this.limits.maxComputeWorkgroupSizeY}, ${this.limits.maxComputeWorkgroupSizeZ}].`);if(j*O*G>this.limits.maxComputeInvocationsPerWorkgroup)throw Error(`workgroup size [${j}, ${O}, ${G}] exceeds the maximum workgroup invocations ${this.limits.maxComputeInvocationsPerWorkgroup}.`);let Z=this.normalizedDispatchGroup[1]===1&&this.normalizedDispatchGroup[2]===1;return`@compute @workgroup_size(${j}, ${O}, ${G}) + fn main(${Z?`@builtin(global_invocation_id) global_id : vec3, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(local_invocation_id) local_id : vec3`:`@builtin(global_invocation_id) global_id : vec3, + @builtin(local_invocation_id) local_id : vec3, + @builtin(local_invocation_index) local_idx : u32, + @builtin(workgroup_id) workgroup_id : vec3, + @builtin(num_workgroups) num_workgroups : vec3`}) { + ${Z?`let global_idx = global_id.x; + let workgroup_index = workgroup_id.x;`:`let workgroup_index = workgroup_id.z * num_workgroups[0] * num_workgroups[1] + + workgroup_id.y * num_workgroups[0] + workgroup_id.x; + let global_idx = workgroup_index * ${j*O*G}u + local_idx;`} + `}appendVariableUniforms($){$.rank!==0&&($.shape.startsWith("uniforms.")&&this.uniforms.push({name:$.shape.replace("uniforms.",""),type:"u32",length:$.rank}),$.strides.startsWith("uniforms.")&&this.uniforms.push({name:$.strides.replace("uniforms.",""),type:"u32",length:$.rank}))}declareVariable($,j){if($.usage==="internal")throw Error("cannot use internal variable with declareVariable(). use registerInternalVariables() instead.");this.variables.push($),this.appendVariableUniforms($);let O=$.usage==="input"?"read":"read_write",G=$.usage==="atomicOutput"?"atomic":$.type.storage;return`@group(0) @binding(${j}) var ${$.name}: array<${G}>;`}declareVariables(...$){return $.map((j)=>this.declareVariable(j,this.variableIndex++)).join(` +`)}registerInternalVariable($){if($.usage!=="internal")throw Error("cannot use input or output variable with registerInternalVariable(). use declareVariables() instead.");this.internalVariables.push($),this.appendVariableUniforms($)}registerInternalVariables(...$){return $.forEach((j)=>this.registerInternalVariable(j)),this}registerUniform($,j,O=1){return this.uniforms.push({name:$,type:j,length:O}),this}registerUniforms($){return this.uniforms=this.uniforms.concat($),this}uniformDeclaration(){if(this.uniforms.length===0)return"";let $=[];for(let{name:j,type:O,length:G}of this.uniforms)if(G&&G>4)O==="f16"?$.push(`@align(16) ${j}:array, ${Math.ceil(G/8)}>`):$.push(`${j}:array, ${Math.ceil(G/4)}>`);else{let Z=G==null||G===1?O:`vec${G}<${O}>`;$.push(`${j}:${Z}`)}return` + struct Uniforms { ${$.join(", ")} }; + @group(0) @binding(${this.variableIndex}) var uniforms: Uniforms;`}get additionalImplementations(){return this.uniformDeclaration()+this.variables.map(($)=>$.impl()).join(` +`)+this.internalVariables.map(($)=>$.impl()).join(` +`)}get variablesInfo(){if(this.uniforms.length===0)return;let $=(j)=>[12,10,1,6][["u32","f16","f32","i32"].indexOf(j)];return this.uniforms.map((j)=>[$(j.type),j.length??1])}},ay=($,j)=>new I_($,j)}),v7=I5(()=>{Y6(),D6(),B9(),M6(),D_=($,j)=>{if(!$||$.length!==1)throw Error("Transpose requires 1 input.");if(j.length!==0&&j.length!==$[0].dims.length)throw Error(`perm size ${j.length} does not match input rank ${$[0].dims.length}`)},NJ=($,j)=>j.length!==0?j:[...Array($).keys()].reverse(),W_=($,j)=>l0.sortBasedOnPerm($,NJ($.length,j)),M_=($,j,O,G)=>{let Z=`fn perm(i: ${G.type.indices}) -> ${O.type.indices} { + var a: ${O.type.indices};`;for(let V=0;V{let O=[],G=[];for(let Z=0;Z<$.length;++Z)$[Z]!==1&&O.push($[Z]),$[j[Z]]!==1&&G.push(j[Z]);return{newShape:O,newPerm:G}},b_=($,j)=>{let O=0;for(let G=0;G<$.length;++G)if(j[$[G]]!==1){if($[G]{let O,G=$.dataType,Z=$.dims.length,V=NJ(Z,j),N=W_($.dims,V),J=$.dims,R=N;if(Z<2||b_(V,$.dims))return O=(S)=>{let X=O5("input",G,J,4),D=t5("output",G,R,4);return` + ${S.registerUniform("output_size","u32").declareVariables(X,D)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + output[global_idx] = input[global_idx]; + }`},{name:"TransposeCopy",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let S=l0.size(N);return{outputs:[{dims:N,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(S/64/4)},programUniforms:[{type:12,data:Math.ceil(S/4)}]}},getShaderSource:O};let{newShape:U,newPerm:H}=K_($.dims,V),L=l0.areEqual(H,[2,3,1]),Y=l0.areEqual(H,[3,1,2]);if(U.length===2||L||Y){J=L?[U[0],U[1]*U[2]]:Y?[U[0]*U[1],U[2]]:U,R=[J[1],J[0]];let S=16;return O=(X)=>{let D=O5("a",G,J.length),I=t5("output",G,R.length);return` + ${X.registerUniform("output_size","u32").declareVariables(D,I)} + var tile : array, ${S}>; + ${X.mainStart([S,S,1])} + let stride = (uniforms.output_shape[1] - 1) / ${S} + 1; + let workgroup_id_x = workgroup_index % stride; + let workgroup_id_y = workgroup_index / stride; + let input_col = workgroup_id_y * ${S}u + local_id.x; + let input_row = workgroup_id_x * ${S}u + local_id.y; + if (input_row < uniforms.a_shape[0] && input_col < uniforms.a_shape[1]) { + tile[local_id.y][local_id.x] = ${D.getByIndices(`${D.type.indices}(input_row, input_col)`)}; + } + workgroupBarrier(); + + let output_col = workgroup_id_x * ${S}u + local_id.x; + let output_row = workgroup_id_y * ${S}u + local_id.y; + if (output_row < uniforms.output_shape[0] && output_col < uniforms.output_shape[1]) { + ${I.setByIndices(`${I.type.indices}(output_row, output_col)`,"tile[local_id.x][local_id.y]")} + } + }`},{name:"TransposeShared",shaderCache:{inputDependencies:["type"]},getRunData:()=>{let X=l0.size(N);return{outputs:[{dims:N,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(R[1]/S),y:Math.ceil(R[0]/S)},programUniforms:[{type:12,data:X},...j6(J,R)]}},getShaderSource:O}}return O=(S)=>{let X=O5("a",G,J.length),D=t5("output",G,R.length);return` + ${S.registerUniform("output_size","u32").declareVariables(X,D)} + + ${M_(V,Z,X,D)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${D.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${D.setByOffset("global_idx",X.getByIndices("aIndices"))} + }`},{name:"Transpose",shaderCache:{hint:`${j}`,inputDependencies:["rank"]},getRunData:()=>{let S=l0.size(N);return{outputs:[{dims:N,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(S/64)},programUniforms:[{type:12,data:S},...j6(J,R)]}},getShaderSource:O}},ry=($,j)=>{D_($.inputs,j.perm),$.compute(X2($.inputs[0],j.perm))},ny=($)=>j9({perm:$.perm})}),DM=I5(()=>{Y6(),D6(),M6(),_R(),v7(),f_={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate * candidate",logSumExp:"bestValue + exp(candidate)",l1:"bestValue + abs(candidate)",l2:"bestValue + candidate * candidate",logSum:"bestValue + candidate"},w_={max:"select(bestValue, candidate, candidate > bestValue)",min:"select(bestValue, candidate, candidate < bestValue)",mean:"bestValue + candidate",sum:"bestValue + candidate",prod:"bestValue * candidate",sumSquare:"bestValue + candidate",logSumExp:"bestValue + candidate",l1:"bestValue + candidate",l2:"bestValue + candidate",logSum:"bestValue + candidate"},E_={max:"_A[offset]",min:"_A[offset]",mean:"0",sum:"0",prod:"1",sumSquare:"0",logSumExp:"0",l1:"0",l2:"0",logSum:"0"},Q_={max:"bestValue",min:"bestValue",sum:"bestValue",prod:"bestValue",sumSquare:"bestValue",logSumExp:"log(bestValue)",l1:"bestValue",l2:"sqrt(bestValue)",logSum:"log(bestValue)"},C_=($,j)=>{let O=[];for(let G=j-$;G{let O=[],G=$.length;for(let Z=0;Z$[Z])]},h_=($,j)=>{let O=$.length+j.length,G=[],Z=0;for(let V=0;V{for(let O=0;O<$.length;++O)if($[$.length-O-1]!==j-1-O)return!1;return!0},m_=($,j)=>{let O=[];if(!c_($,j)){for(let G=0;GO.push(G))}return O},p_=($,j,O,G,Z,V,N)=>{let J=O[0].dims,R=l0.size(V),U=l0.size(N),H=O5("_A",O[0].dataType,J),L=t5("output",Z,V),Y=64;R===1&&(Y=256);let S=` + var aBestValues : array; + `;return{name:$,shaderCache:{hint:`${j};${Y}`,inputDependencies:["type"]},getShaderSource:(X)=>` + ${X.registerUniform("reduceSize","u32").declareVariables(H,L)} + ${S} + fn DIV_CEIL(a : u32, b : u32) -> u32 { + return ((a - 1u) / b + 1u); + } + ${X.mainStart(Y)} + + let outputIndex = global_idx / ${Y}; + let offset = outputIndex * uniforms.reduceSize; + + var bestValue = f32(${E_[G]}); + let Length = uniforms.reduceSize; + for (var k = local_idx; k < Length; k = k + ${Y}) { + let candidate = f32(${H.getByOffset("offset + k")}); + bestValue = ${f_[G]}; + } + aBestValues[local_idx] = bestValue; + workgroupBarrier(); + + var reduceSize = min(Length, ${Y}u); + for (var currentSize = reduceSize / 2u; reduceSize > 1u; + currentSize = reduceSize / 2u) { + let interval = DIV_CEIL(reduceSize, 2u); + if (local_idx < currentSize) { + let candidate = aBestValues[local_idx + interval]; + bestValue = ${w_[G]}; + aBestValues[local_idx] = bestValue; + } + reduceSize = interval; + workgroupBarrier(); + } + + if (local_idx == 0u) { + ${L.setByOffset("outputIndex",G==="mean"?`${L.type.storage}(bestValue / f32(uniforms.reduceSize))`:`${L.type.storage}(${Q_[G]})`)}; + } + }`,getRunData:()=>({outputs:[{dims:V,dataType:Z}],dispatchGroup:{x:R},programUniforms:[{type:12,data:U}]})}},F3=($,j,O,G)=>{let Z=$.inputs.length===1?O:Lv($.inputs,O),V=Z.axes;V.length===0&&!Z.noopWithEmptyAxes&&(V=$.inputs[0].dims.map((S,X)=>X));let N=l0.normalizeAxes(V,$.inputs[0].dims.length),J=N,R=$.inputs[0],U=m_(J,$.inputs[0].dims.length);U.length>0&&(R=$.compute(X2($.inputs[0],U),{inputs:[0],outputs:[-1]})[0],J=C_(J.length,R.dims.length));let[H,L]=B_(R.dims,J),Y=H;Z.keepDims&&(Y=h_(H,N)),$.compute(p_(j,Z.cacheKey,[R],G,$.inputs[0].dataType,Y,L),{inputs:[R]})},ty=($,j)=>{F3($,"ReduceMeanShared",j,"mean")},ey=($,j)=>{F3($,"ReduceL1Shared",j,"l1")},$z=($,j)=>{F3($,"ReduceL2Shared",j,"l2")},jz=($,j)=>{F3($,"ReduceLogSumExpShared",j,"logSumExp")},Oz=($,j)=>{F3($,"ReduceMaxShared",j,"max")},Gz=($,j)=>{F3($,"ReduceMinShared",j,"min")},Zz=($,j)=>{F3($,"ReduceProdShared",j,"prod")},qz=($,j)=>{F3($,"ReduceSumShared",j,"sum")},Vz=($,j)=>{F3($,"ReduceSumSquareShared",j,"sumSquare")},Nz=($,j)=>{F3($,"ReduceLogSumShared",j,"logSum")}}),_R=I5(()=>{Y6(),D6(),B9(),M6(),DM(),y3=($)=>{if(!$||$.length===0||$.length>2)throw Error("Reduce op requires 1 or 2 inputs.");if($.length===2&&$[1].dims.length!==1)throw Error("Invalid axes input dims.")},A_=($)=>["","",`var value = ${$.getByIndices("input_indices")};`,""],_V=($,j,O,G,Z,V,N=!1,J=!1)=>{let R=[],U=O[0].dims,H=U.length,L=l0.normalizeAxes(Z,H),Y=!J&&L.length===0;U.forEach((D,I)=>{Y||L.indexOf(I)>=0?N&&R.push(1):R.push(D)});let S=R.length,X=l0.size(R);return{name:$,shaderCache:j,getShaderSource:(D)=>{let I=[],k=O5("_A",O[0].dataType,H),z=t5("output",V,S),w=G(k,z,L),T=w[2];for(let W=0,E=0;W=0?(N&&E++,T=`for(var j${W}: u32 = 0; j${W} < ${U[W]}; j${W}++) { + ${w[2].includes("last_index")?`let last_index = j${W};`:""} + ${k.indicesSet("input_indices",W,`j${W}`)} + ${T} + }`):(I.push(`${k.indicesSet("input_indices",W,z.indicesGet("output_indices",E))};`),E++);return` + + ${D.registerUniform("output_size","u32").declareVariables(k,z)} + + ${D.mainStart()} + ${D.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var input_indices: ${k.type.indices}; + let output_indices = ${z.offsetToIndices("global_idx")}; + + ${I.join(` +`)} + ${w[0]} // init ops for reduce max/min + ${w[1]} + ${T} + ${w[3]} + ${w.length===4?z.setByOffset("global_idx","value"):w.slice(4).join(` +`)} + }`},getRunData:()=>({outputs:[{dims:R,dataType:V}],dispatchGroup:{x:Math.ceil(X/64)},programUniforms:[{type:12,data:X},...j6(U,R)]})}},Lv=($,j)=>{let O=[];return $[1].dims[0]>0&&$[1].getBigInt64Array().forEach((G)=>O.push(Number(G))),j9({axes:O,keepDims:j.keepDims,noopWithEmptyAxes:j.noopWithEmptyAxes})},z3=($,j,O,G)=>{let Z=$.inputs,V=Z.length===1?O:Lv(Z,O);$.compute(_V(j,{hint:V.cacheKey,inputDependencies:["rank"]},[Z[0]],V.noopWithEmptyAxes&&V.axes.length===0?A_:G,V.axes,Z[0].dataType,V.keepDims,V.noopWithEmptyAxes),{inputs:[0]})},g_=($,j)=>{y3($.inputs),z3($,"ReduceLogSum",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += ${O.getByIndices("input_indices")};`,"value = log(value);"])},u_=($,j)=>{y3($.inputs),z3($,"ReduceL1",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += abs(${O.getByIndices("input_indices")});`,""])},d_=($,j)=>{y3($.inputs),z3($,"ReduceL2",j,(O,G)=>[`var t = ${G.type.value}(0); var value = ${G.type.value}(0);`,"",`t = ${O.getByIndices("input_indices")}; value += (t * t);`,"value = sqrt(value);"])},l_=($,j)=>{y3($.inputs),z3($,"ReduceLogSumExp",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += exp(${O.getByIndices("input_indices")});`,"value = log(value);"])},o_=($,j)=>{y3($.inputs),z3($,"ReduceMax",j,(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(O.indicesSet("input_indices",N,0));return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")};`,`value = max(value, ${O.getByIndices("input_indices")});`,""]})},s_=($,j)=>{y3($.inputs),z3($,"ReduceMean",j,(O,G,Z)=>{let V=1;for(let N=0;N=0||Z.length===0)&&(V*=$.inputs[0].dims[N]);return["var sum = f32(0);","",`sum += f32(${O.getByIndices("input_indices")});`,`let value = ${G.type.value}(sum / ${V});`]})},i_=($,j)=>{y3($.inputs),z3($,"ReduceMin",j,(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(`input_indices[${N}] = 0;`);return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")};`,`value = min(value, ${O.getByIndices("input_indices")});`,""]})},a_=($,j)=>{y3($.inputs),z3($,"ReduceProd",j,(O,G)=>[`var value = ${G.type.storage}(1);`,"",`value *= ${O.getByIndices("input_indices")};`,""])},r_=($,j)=>{y3($.inputs),z3($,"ReduceSum",j,(O,G)=>[`var value = ${G.type.storage}(0);`,"",`value += ${O.getByIndices("input_indices")};`,""])},n_=($,j)=>{y3($.inputs),z3($,"ReduceSumSquare",j,(O,G)=>[`var t = ${G.type.value}(0); var value = ${G.type.value}(0);`,"",`t = ${O.getByIndices("input_indices")}; value += t * t;`,""])},k3=($,j,O)=>{if(j.length===0)return O;let G=1,Z=1;for(let V=0;V1024},Jz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?s_($,j):ty($,j)},vz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?u_($,j):ey($,j)},Rz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?d_($,j):$z($,j)},Uz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?l_($,j):jz($,j)},Hz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?o_($,j):Oz($,j)},xz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?i_($,j):Gz($,j)},Lz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?a_($,j):Zz($,j)},_z=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?r_($,j):qz($,j)},Yz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?n_($,j):Vz($,j)},Sz=($,j)=>{k3($.inputs[0].dims,j.axes,j.noopWithEmptyAxes)?g_($,j):Nz($,j)}}),WM=I5(()=>{Y6(),B9(),_R(),JJ=($)=>{if(!$||$.length===0||$.length>2)throw Error("ArgMinMaxOp op requires 1 or 2 inputs.");if($[0].dataType!==1)throw Error("Invalid input type.")},Pz=($,j)=>{JJ($.inputs),$.compute(_V("ArgMin",{hint:j.cacheKey,inputDependencies:["rank"]},[$.inputs[0]],(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(`input_indices[${N}] = 0;`);return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${O.getByIndices("input_indices")} ${j.selectLastIndex>0?"<=":"<"} value) { + value = ${O.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",G.setByOffset("global_idx","best_index")]},[j.axis],7,j.keepDims),{inputs:[0]})},Xz=($,j)=>{JJ($.inputs),$.compute(_V("argMax",{hint:j.cacheKey,inputDependencies:["rank"]},[$.inputs[0]],(O,G,Z)=>{let V=[];for(let N=0;N=0||Z.length===0)&&V.push(`input_indices[${N}] = 0;`);return[`${V.join(` +`)}`,`var value = ${O.getByIndices("input_indices")}; +var best_index : i32 = 0;`,`if (${O.getByIndices("input_indices")} ${j.selectLastIndex>0?">=":">"} value) { + value = ${O.getByIndices("input_indices")}; + best_index = i32(last_index); + }`,"",G.setByOffset("global_idx","best_index")]},[j.axis],7,j.keepDims),{inputs:[0]})},_v=($)=>j9($)}),YR=I5(()=>{Y6(),D6(),LR(),M6(),t_=($,j)=>{let O=$[0],G=$[1],Z=$[2],V=$[3],N=$[4],J=$[5];if(N&&J)throw Error("Attention cannot have both past and attention_bias");if(O.dims.length!==3)throw Error('Input "input" must have 3 dimensions');let R=O.dims[0],U=O.dims[1],H=O.dims[2];if(Z.dims.length!==1)throw Error('Input "bias" is expected to have 1 dimensions');if(G.dims.length!==2)throw Error('Input "weights" is expected to have 2 dimensions');if(G.dims[0]!==H)throw Error("Input 1 dimension 0 should have same length as dimension 2 of input 0");if(Z.dims[0]!==G.dims[1])throw Error('Input "bias" dimension 0 should have same length as dimension 1 of input "weights"');let L=Z.dims[0]/3,Y=L,S=Y;if(j.qkvHiddenSizes.length>0){if(j.qkvHiddenSizes.length!==3)throw Error("qkv_hidden_sizes attribute should have 3 elements");for(let k of j.qkvHiddenSizes)if(k%j.numHeads!==0)throw Error("qkv_hidden_sizes should be divisible by num_heads");L=j.qkvHiddenSizes[0],Y=j.qkvHiddenSizes[1],S=j.qkvHiddenSizes[2]}let X=U;if(L!==Y)throw Error("qkv_hidden_sizes first element should be same as the second");if(Z.dims[0]!==L+Y+S)throw Error('Input "bias" dimension 0 should have same length as sum of Q/K/V hidden sizes');let D=0;if(N){if(Y!==S)throw Error('Input "past" expect k_hidden_size == v_hidden_size');if(N.dims.length!==5)throw Error('Input "past" must have 5 dimensions');if(N.dims[0]!==2)throw Error('Input "past" first dimension must be 2');if(N.dims[1]!==R)throw Error('Input "past" second dimension must be batch_size');if(N.dims[2]!==j.numHeads)throw Error('Input "past" third dimension must be num_heads');if(N.dims[4]!==Y/j.numHeads)throw Error('Input "past" fifth dimension must be k_hidden_size / num_heads');j.pastPresentShareBuffer||(D=N.dims[3])}let I=X+D;if(V)throw Error("Mask not supported");if(N)throw Error("past is not supported");if(J){if(J.dims.length!==4)throw Error('Input "attention_bias" must have 4 dimensions');if(J.dims[0]!==R||J.dims[1]!==j.numHeads||J.dims[2]!==U||J.dims[3]!==I)throw Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:R,sequenceLength:U,pastSequenceLength:D,kvSequenceLength:X,totalSequenceLength:I,maxSequenceLength:-1,inputHiddenSize:H,hiddenSize:L,vHiddenSize:S,headSize:Math.floor(L/j.numHeads),vHeadSize:Math.floor(S/j.numHeads),numHeads:j.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:j.maskFilterValue,maskType:0,scale:j.scale,broadcastResPosBias:!1,passPastInKv:!1,qkvFormat:1}},lq=($,j,O)=>j&&$?` + let total_sequence_length_input = u32(${j.getByOffset("0")}); + let present_sequence_length = max(total_sequence_length_input, uniforms.past_sequence_length); + let is_subsequent_prompt: bool = sequence_length > 1 && sequence_length != total_sequence_length_input; + let is_first_prompt: bool = is_subsequent_prompt == false && sequence_length == total_sequence_length_input; + total_sequence_length = u32(${$?.getByOffset("batchIdx")}) + 1; + var past_sequence_length: u32 = 0; + if (is_first_prompt == false) { + past_sequence_length = total_sequence_length - sequence_length; + } + `:` + ${O?"let past_sequence_length = uniforms.past_sequence_length":""}; + let present_sequence_length = total_sequence_length; + `,e_=($,j,O,G,Z,V,N,J)=>{let R=K9(N?1:V),U=64,H=V/R;H{let k=t5("x",$.dataType,$.dims,R),z=[k],w=N?O5("seq_lens",N.dataType,N.dims):void 0;w&&z.push(w);let T=J?O5("total_sequence_length_input",J.dataType,J.dims):void 0;T&&z.push(T);let W=k1($.dataType);return` + var thread_max: array; + var thread_sum: array; + ${I.registerUniforms([{name:"batch_size",type:"u32"},{name:"num_heads",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"sequence_length",type:"u32"},{name:"total_sequence_length",type:"u32"},{name:"elements_per_thread",type:"u32"}]).declareVariables(...z)} + ${I.mainStart([U,1,1])} + let batchIdx = workgroup_id.z / uniforms.num_heads; + let headIdx = workgroup_id.z % uniforms.num_heads; + let sequence_length = uniforms.sequence_length; + var total_sequence_length = uniforms.total_sequence_length; + ${lq(w,T,!1)} + let local_offset = local_idx * uniforms.elements_per_thread; + let offset = (global_idx / ${U}) * uniforms.total_sequence_length + local_offset; + let seq_causal_length = ${N?"u32(past_sequence_length + workgroup_id.y + 1)":"total_sequence_length"}; + var thread_max_vector = ${X}(-3.402823e+38f); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + thread_max_vector = max(${X}(x[offset + i]), thread_max_vector); + } + thread_max[local_idx] = ${(()=>{switch(R){case 1:return"thread_max_vector";case 2:return"max(thread_max_vector.x, thread_max_vector.y)";case 4:return"max(max(thread_max_vector.x, thread_max_vector.y), max(thread_max_vector.z, thread_max_vector.w))";default:throw Error(`Unsupported components: ${R}`)}})()}; + workgroupBarrier(); + + var max_value = f32(-3.402823e+38f); + for (var i = 0u; i < ${U}; i++) { + max_value = max(thread_max[i], max_value); + } + + var sum_vector = ${X}(0); + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + sum_vector += exp(${X}(x[offset + i]) - max_value); + } + thread_sum[local_idx] = ${(()=>{switch(R){case 1:return"sum_vector";case 2:return"sum_vector.x + sum_vector.y";case 4:return"sum_vector.x + sum_vector.y + sum_vector.z + sum_vector.w";default:throw Error(`Unsupported components: ${R}`)}})()}; + workgroupBarrier(); + + var sum: f32 = 0; + for (var i = 0u; i < ${U}; i++) { + sum += thread_sum[i]; + } + + if (sum == 0) { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + x[offset + i] = ${k.type.value}(${W}(1.0) / ${W}(seq_causal_length)); + } + } else { + for (var i: u32 = 0; i < uniforms.elements_per_thread && i + local_offset < seq_causal_length; i++) { + var f32input = ${X}(x[offset + i]); + x[offset + i] = ${k.type.value}(exp(f32input - max_value) / sum); + } + } + ${N?` + for (var total_seq_id: u32 = seq_causal_length; total_seq_id + local_offset < uniforms.total_sequence_length; total_seq_id++) { + x[offset + total_seq_id] = ${k.type.value}(${W}(0)); + }`:""}; + }`},getRunData:()=>({outputs:[],dispatchGroup:{x:1,y:Z,z:j*O},programUniforms:Y})}},$Y=($,j,O,G,Z,V,N,J,R)=>{let U=N+V.kvSequenceLength,H=[V.batchSize,V.numHeads,V.sequenceLength,U],L=$>1&&G,Y=V.kvNumHeads?V.kvNumHeads:V.numHeads,S=L?[V.batchSize,Y,U,V.headSize]:void 0,X=V.nReps?V.nReps:1,D=V.scale===0?1/Math.sqrt(V.headSize):V.scale,I=K9(V.headSize),k=V.headSize/I,z=12,w={x:Math.ceil(U/z),y:Math.ceil(V.sequenceLength/z),z:V.batchSize*V.numHeads},T=[{type:12,data:V.sequenceLength},{type:12,data:k},{type:12,data:U},{type:12,data:V.numHeads},{type:12,data:V.headSize},{type:1,data:D},{type:12,data:N},{type:12,data:V.kvSequenceLength},{type:12,data:X}],W=L&&G&&l0.size(G.dims)>0,E=["type","type"];W&&E.push("type"),Z&&E.push("type"),J&&E.push("type"),R&&E.push("type");let Q=[{dims:H,dataType:j.dataType,gpuDataType:0}];return L&&Q.push({dims:S,dataType:j.dataType,gpuDataType:0}),{name:"AttentionProbs",shaderCache:{hint:`${I};${Z!==void 0};${G!==void 0};${$}`,inputDependencies:E},getRunData:()=>({outputs:Q,dispatchGroup:w,programUniforms:T}),getShaderSource:(A)=>{let l=O5("q",j.dataType,j.dims,I),r=[l,O5("key",O.dataType,O.dims,I)];if(W){let G0=O5("past_key",G.dataType,G.dims,I);r.push(G0)}Z&&r.push(O5("attention_bias",Z.dataType,Z.dims));let e=J?O5("seq_lens",J.dataType,J.dims):void 0;e&&r.push(e);let V0=R?O5("total_sequence_length_input",R.dataType,R.dims):void 0;V0&&r.push(V0);let v0=t5("output",j.dataType,H),$0=[v0];L&&$0.push(t5("present_key",j.dataType,S,I));let i=k1(1,I);return` + const TILE_SIZE = 12u; + + var tileQ: array<${l.type.storage}, 144>; + var tileK: array<${l.type.storage}, 144>; + ${A.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"alpha",type:"f32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}]).declareVariables(...r,...$0)} + ${A.mainStart([z,z,1])} + // x holds the N and y holds the M + let headIdx = workgroup_id.z % uniforms.num_heads; + let kvHeadIdx = ${X===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${X===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let m = workgroup_id.y * TILE_SIZE; + let n = workgroup_id.x * TILE_SIZE; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.N; + ${lq(e,V0,!0)} + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; + let qOffset = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + ${W&&L?"let pastKeyOffset = absKvHeadIdx * uniforms.past_sequence_length * uniforms.K;":""}; + let kOffset = absKvHeadIdx * uniforms.kv_sequence_length * uniforms.K; + ${L?"let presentKeyOffset = absKvHeadIdx * uniforms.N * uniforms.K;":""} + var value = ${i}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (global_id.y < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = q[qOffset + local_id.y * uniforms.K + w + local_id.x]; + } + if (n + local_id.y < uniforms.N && w + local_id.x < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${W&&L?` + if (n + local_id.y < past_sequence_length) { + tileK[idx] = past_key[pastKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + } else if (n + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y - past_sequence_length) * uniforms.K + w + local_id.x]; + }`:` + if (n + local_id.y < uniforms.kv_sequence_length) { + tileK[idx] = key[kOffset + (n + local_id.y) * uniforms.K + w + local_id.x]; + }`} + ${L?`if (n + local_id.y < present_sequence_length) { + present_key[presentKeyOffset + (n + local_id.y) * uniforms.K + w + local_id.x] = tileK[idx]; + }`:""} + } + workgroupBarrier(); + + for (var k: u32 = 0u; k < TILE_SIZE && w+k < uniforms.K; k++) { + value += ${i}(tileQ[TILE_SIZE * local_id.y + k] * tileK[TILE_SIZE * local_id.x + k]); + } + + workgroupBarrier(); + } + + if (global_id.y < uniforms.M && global_id.x < total_sequence_length) { + let headOffset = workgroup_id.z * uniforms.M * uniforms.N; + let outputIdx = headOffset + global_id.y * uniforms.N + global_id.x; + var sum: f32 = ${(()=>{switch(I){case 1:return"value";case 2:return"value.x + value.y";case 4:return"value.x + value.y + value.z + value.w";default:throw Error(`Unsupported components: ${I}`)}})()}; + output[outputIdx] = ${v0.type.value} (sum * uniforms.alpha) + ${Z?"attention_bias[outputIdx]":"0.0"}; + } + }`}}},jY=($,j,O,G,Z,V,N=void 0,J=void 0)=>{let R=V+Z.kvSequenceLength,U=Z.nReps?Z.nReps:1,H=Z.vHiddenSize*U,L=$>1&&G,Y=Z.kvNumHeads?Z.kvNumHeads:Z.numHeads,S=L?[Z.batchSize,Y,R,Z.headSize]:void 0,X=[Z.batchSize,Z.sequenceLength,H],D=12,I={x:Math.ceil(Z.vHeadSize/D),y:Math.ceil(Z.sequenceLength/D),z:Z.batchSize*Z.numHeads},k=[{type:12,data:Z.sequenceLength},{type:12,data:R},{type:12,data:Z.vHeadSize},{type:12,data:Z.numHeads},{type:12,data:Z.headSize},{type:12,data:H},{type:12,data:V},{type:12,data:Z.kvSequenceLength},{type:12,data:U}],z=L&&G&&l0.size(G.dims)>0,w=["type","type"];z&&w.push("type"),N&&w.push("type"),J&&w.push("type");let T=[{dims:X,dataType:j.dataType,gpuDataType:0}];return L&&T.push({dims:S,dataType:j.dataType,gpuDataType:0}),{name:"AttentionScore",shaderCache:{hint:`${G!==void 0};${$}`,inputDependencies:w},getRunData:()=>({outputs:T,dispatchGroup:I,programUniforms:k}),getShaderSource:(W)=>{let E=O5("probs",j.dataType,j.dims),Q=[E,O5("v",O.dataType,O.dims)];z&&Q.push(O5("past_value",G.dataType,G.dims));let A=N?O5("seq_lens",N.dataType,N.dims):void 0;N&&Q.push(A);let l=J?O5("total_sequence_length_input",J.dataType,J.dims):void 0;J&&Q.push(l);let r=[t5("output",j.dataType,X)];return L&&r.push(t5("present_value",j.dataType,S)),` + const TILE_SIZE = 12u; + var tileQ: array<${E.type.value}, 144>; + var tileV: array<${E.type.value}, 144>; + ${W.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"v_hidden_size",type:"u32"},{name:"past_sequence_length",type:"u32"},{name:"kv_sequence_length",type:"u32"},{name:"n_reps",type:"u32"}]).declareVariables(...Q,...r)} + ${W.mainStart([D,D,1])} + let headIdx = workgroup_id.z % uniforms.num_heads; + let batchIdx = workgroup_id.z / uniforms.num_heads; + let kvHeadIdx = ${U===1?"headIdx":"headIdx / uniforms.n_reps"}; + let kv_num_heads = ${U===1?"uniforms.num_heads":"uniforms.num_heads / uniforms.n_reps"}; + let m = global_id.y; + let n = global_id.x; + let sequence_length = uniforms.M; + var total_sequence_length = uniforms.K; + ${lq(A,l,!0)} + let offsetA = workgroup_id.z * uniforms.M * uniforms.K + m * uniforms.K; + let absKvHeadIdx = batchIdx * kv_num_heads + kvHeadIdx; // kvHeadIdx is relative to the batch + ${z&&L?"let pastValueOffset = absKvHeadIdx * uniforms.N * uniforms.past_sequence_length + n;":""}; + let vOffset = absKvHeadIdx * uniforms.N * uniforms.kv_sequence_length + n; + ${L?"let presentValueOffset = absKvHeadIdx * uniforms.N * uniforms.K + n;":""} + var value = ${E.type.storage}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileQ[TILE_SIZE * local_id.y + local_id.x] = probs[offsetA + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + var idx = TILE_SIZE * local_id.y + local_id.x; + ${z&&L?` + if (w + local_id.y < past_sequence_length) { + tileV[idx] = past_value[pastValueOffset + (w + local_id.y) * uniforms.N]; + } else if (w + local_id.y - past_sequence_length < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y - past_sequence_length) * uniforms.N]; + } + `:` + if (w + local_id.y < uniforms.kv_sequence_length) { + tileV[idx] = v[vOffset + (w + local_id.y) * uniforms.N]; + }`} + ${L?` + if (w + local_id.y < present_sequence_length) { + present_value[presentValueOffset + (w + local_id.y) * uniforms.N] = tileV[idx]; + }`:""} + } + workgroupBarrier(); + for (var k: u32 = 0u; k < TILE_SIZE && w+k < total_sequence_length; k++) { + value += tileQ[TILE_SIZE * local_id.y + k] * tileV[TILE_SIZE * k + local_id.x]; + } + workgroupBarrier(); + } + + // we need to transpose output from BNSH_v to BSND_v + if (m < uniforms.M && n < uniforms.N) { + let outputIdx = batchIdx * uniforms.M * uniforms.v_hidden_size + m * uniforms.v_hidden_size + + headIdx * uniforms.N + n; + output[outputIdx] = value; + } + }`}}},gZ=($,j,O,G,Z,V,N,J,R,U,H=void 0,L=void 0)=>{let Y=Math.min($.outputCount,1+(N?1:0)+(J?1:0)),S=Y>1?U.pastSequenceLength:0,X=S+U.kvSequenceLength,D=R&&l0.size(R.dims)>0?R:void 0,I=[j,O];Y>1&&N&&l0.size(N.dims)>0&&I.push(N),D&&I.push(D),H&&I.push(H),L&&I.push(L);let k=$.compute($Y(Y,j,O,N,D,U,S,H,L),{inputs:I,outputs:Y>1?[-1,1]:[-1]})[0];$.compute(e_(k,U.batchSize,U.numHeads,S,U.sequenceLength,X,H,L),{inputs:H&&L?[k,H,L]:[k],outputs:[]});let z=[k,G];Y>1&&J&&l0.size(J.dims)>0&&z.push(J),H&&z.push(H),L&&z.push(L),$.compute(jY(Y,k,G,J,U,S,H,L),{inputs:z,outputs:Y>1?[0,2]:[0]})},OY=($,j)=>{let O=[j.batchSize,j.numHeads,j.sequenceLength,j.headSize],G=j.sequenceLength,Z=j.inputHiddenSize,V=j.headSize,N=12,J={x:Math.ceil(j.headSize/N),y:Math.ceil(j.sequenceLength/N),z:j.batchSize*j.numHeads},R=[$.inputs[0],$.inputs[1],$.inputs[2]],U=[{type:12,data:G},{type:12,data:Z},{type:12,data:V},{type:12,data:j.numHeads},{type:12,data:j.headSize},{type:12,data:j.hiddenSize},{type:12,data:j.hiddenSize+j.hiddenSize+j.vHiddenSize}];return $.compute({name:"AttentionPrepare",shaderCache:{inputDependencies:["type","type","type"]},getRunData:()=>({outputs:[{dims:O,dataType:$.inputs[0].dataType,gpuDataType:0},{dims:O,dataType:$.inputs[0].dataType,gpuDataType:0},{dims:O,dataType:$.inputs[0].dataType,gpuDataType:0}],dispatchGroup:J,programUniforms:U}),getShaderSource:(H)=>{let L=t5("output_q",R[0].dataType,O),Y=t5("output_k",R[0].dataType,O),S=t5("output_v",R[0].dataType,O),X=O5("input",R[0].dataType,R[0].dims),D=O5("weight",R[1].dataType,R[1].dims),I=O5("bias",R[2].dataType,R[2].dims),k=X.type.storage;return` + const TILE_SIZE = 12u; + var tileInput: array<${k}, 144>; + var tileWeightQ: array<${k}, 144>; + var tileWeightK: array<${k}, 144>; + var tileWeightV: array<${k}, 144>; + ${H.registerUniforms([{name:"M",type:"u32"},{name:"K",type:"u32"},{name:"N",type:"u32"},{name:"num_heads",type:"u32"},{name:"head_size",type:"u32"},{name:"hidden_size",type:"u32"},{name:"ldb",type:"u32"}]).declareVariables(X,D,I,L,Y,S)} + ${H.mainStart([N,N,1])} + let batchIndex = workgroup_id.z / uniforms.num_heads; + let headNumber = workgroup_id.z % uniforms.num_heads; + let m = global_id.y; + let n = global_id.x; + + let inputOffset = batchIndex * (uniforms.M * uniforms.K) + m * uniforms.K; + let biasOffsetQ = headNumber * uniforms.head_size; + let biasOffsetK = uniforms.hidden_size + biasOffsetQ; + let biasOffsetV = uniforms.hidden_size + biasOffsetK; + + var valueQ = ${k}(0); + var valueK = ${k}(0); + var valueV = ${k}(0); + for (var w: u32 = 0u; w < uniforms.K; w += TILE_SIZE) { + if (m < uniforms.M && w + local_id.x < uniforms.K) { + tileInput[TILE_SIZE * local_id.y + local_id.x] = input[inputOffset + w + local_id.x]; + } + if (n < uniforms.N && w + local_id.y < uniforms.K) { + let offset = n + (w + local_id.y) * uniforms.ldb; + tileWeightQ[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetQ + offset]; + tileWeightK[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetK + offset]; + tileWeightV[TILE_SIZE * local_id.y + local_id.x] = weight[biasOffsetV + offset]; + } + workgroupBarrier(); + for (var k: u32 = 0u; k{let O=t_($.inputs,j),[G,Z,V]=OY($,O);return gZ($,G,Z,V,$.inputs[4],void 0,void 0,void 0,$.inputs[5],O)}}),MM=I5(()=>{Q3(),Y6(),D6(),B9(),M6(),GY=($,j)=>{if(!$||$.length!==5)throw Error("BatchNormalization requires 5 inputs");let O=(G,Z,V)=>{let N=Z.length;if(N!==G.length)throw Error(`${V}: num dimensions != ${N}`);Z.forEach((J,R)=>{if(J!==G[R])throw Error(`${V}: dim[${R}] do not match`)})};if($[0].dims.length>1){let G=j.format==="NHWC"?j.spatial?$[0].dims.slice(-1):$[0].dims.slice(-1).concat($[0].dims.slice(1,$[0].dims.length-1)):$[0].dims.slice(1,j.spatial?2:void 0);O($[1].dims,G,"Invalid input scale"),O($[2].dims,G,"Invalid input B"),O($[3].dims,G,"Invalid input mean"),O($[4].dims,G,"Invalid input var")}else O($[1].dims,[1],"Invalid input scale"),O($[2].dims,[1],"Invalid input B"),O($[3].dims,[1],"Invalid input mean"),O($[4].dims,[1],"Invalid input var")},ZY=($,j)=>{let{epsilon:O,spatial:G,format:Z}=j,V=$[0].dims,N=G?K9(V[V.length-1]):1,J=Z==="NHWC"&&V.length>1?N:1,R=l0.size(V)/N,U=G,H=U?V.length:V,L=O5("x",$[0].dataType,$[0].dims,N),Y=O5("scale",$[1].dataType,$[1].dims,J),S=O5("bias",$[2].dataType,$[2].dims,J),X=O5("inputMean",$[3].dataType,$[3].dims,J),D=O5("inputVar",$[4].dataType,$[4].dims,J),I=t5("y",$[0].dataType,H,N);return{name:"BatchNormalization",shaderCache:{hint:`${j.epsilon}_${j.format}_${G}_${N}`,inputDependencies:U?["rank","type","type","type","type"]:void 0},getShaderSource:(k)=>` + const epsilon = ${O}; + ${k.registerUniform("outputSize","u32").declareVariables(L,Y,S,X,D,I)} + ${k.mainStart()} + ${k.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${I.offsetToIndices(`global_idx * ${N}`)}; + ${(()=>{let z="";if(G)z=`let cOffset = ${V.length===1?"0u":Z==="NHWC"?`outputIndices[${V.length-1}] / ${N}`:"outputIndices[1]"};`;else if(Z==="NCHW")z=` + ${I.indicesSet("outputIndices","0","0")} + let cOffset = ${I.indicesToOffset("outputIndices")};`;else{z=`var cIndices = ${Y.type.indices}(0); + cIndices[0] = outputIndices[${V.length-1}];`;for(let w=1;w({outputs:[{dims:$[0].dims,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:U?[{type:12,data:R},...j6(V)]:[{type:12,data:R}]})}},qY=($)=>j9($),Fz=($,j)=>{let{inputs:O,outputCount:G}=$,Z=qY({...j,outputCount:G});if(T9.webgpu.validateInputContent&&GY(O,Z),j.trainingMode)throw Error("BatchNormalization trainingMode is not supported yet.");$.compute(ZY(O,Z))}}),KM=I5(()=>{D6(),M6(),VY=($)=>{if($[0].dims.length!==3)throw Error("input should have 3 dimensions");if(![320,640,1280].includes($[0].dims[2]))throw Error("number of channels should be 320, 640 or 1280");if($[1].dims.length!==1)throw Error("bias is expected to have 1 dimensions");if($[0].dims[2]!==$[1].dims[0])throw Error("last dimension of input and bias are not the same")},NY=($)=>{let j=$[0].dims,O=$[0].dims[2],G=l0.size(j)/4,Z=$[0].dataType,V=O5("input",Z,j,4),N=O5("bias",Z,[O],4),J=O5("residual",Z,j,4),R=t5("output",Z,j,4);return{name:"BiasAdd",getRunData:()=>({outputs:[{dims:j,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(G/64)}}),getShaderSource:(U)=>` + const channels = ${O}u / 4; + ${U.declareVariables(V,N,J,R)} + + ${U.mainStart()} + ${U.guardAgainstOutOfBoundsWorkgroupSizes(G)} + let value = ${V.getByOffset("global_idx")} + + ${N.getByOffset("global_idx % channels")} + ${J.getByOffset("global_idx")}; + ${R.setByOffset("global_idx","value")} + }`}},yz=($)=>{VY($.inputs),$.compute(NY($.inputs))}}),SR=I5(()=>{Y6(),D6(),B9(),M6(),JY=($,j,O,G,Z,V,N)=>{let J=Math.ceil(j/4),R="";R=typeof Z=="string"?`${Z}(a)`:Z("a");let U=O5("inputData",O,[J],4),H=t5("outputData",G,[J],4),L=[{name:"vec_size",type:"u32"}];return N&&L.push(...N),` + ${$.registerUniforms(L).declareVariables(U,H)} + + ${V??""} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + + let a = ${U.getByOffset("global_idx")}; + ${H.setByOffset("global_idx",R)} + }`},n6=($,j,O,G,Z,V=$.dataType,N,J)=>{let R=[{type:12,data:Math.ceil(l0.size($.dims)/4)}];return N&&R.push(...N),{name:j,shaderCache:{hint:Z,inputDependencies:["type"]},getShaderSource:(U)=>JY(U,l0.size($.dims),$.dataType,V,O,G,J),getRunData:(U)=>({outputs:[{dims:$.dims,dataType:V}],dispatchGroup:{x:Math.ceil(l0.size(U[0].dims)/64/4)},programUniforms:R})}},zz=($)=>{$.compute(n6($.inputs[0],"Abs","abs"))},kz=($)=>{$.compute(n6($.inputs[0],"Acos","acos"))},Iz=($)=>{$.compute(n6($.inputs[0],"Acosh","acosh"))},Dz=($)=>{$.compute(n6($.inputs[0],"Asin","asin"))},Wz=($)=>{$.compute(n6($.inputs[0],"Asinh","asinh"))},Mz=($)=>{$.compute(n6($.inputs[0],"Atan","atan"))},Kz=($)=>{$.compute(n6($.inputs[0],"Atanh","atanh"))},bz=($)=>j9($),fz=($,j)=>{let O;switch(j.to){case 10:O="vec4";break;case 1:O="vec4";break;case 12:O="vec4";break;case 6:O="vec4";break;case 9:O="vec4";break;default:throw RangeError(`not supported type (specified in attribute 'to' from 'Cast' operator): ${j.to}`)}$.compute(n6($.inputs[0],"Cast",O,void 0,j.cacheKey,j.to))},vY=($)=>{let j,O,G=$.length>=2&&$[1].data!==0,Z=$.length>=3&&$[2].data!==0;switch($[0].dataType){case 1:j=G?$[1].getFloat32Array()[0]:-340282346638528860000000000000000000000,O=Z?$[2].getFloat32Array()[0]:340282346638528860000000000000000000000;break;case 10:j=G?$[1].getUint16Array()[0]:64511,O=Z?$[2].getUint16Array()[0]:31743;break;default:throw Error("Unsupport data type")}return j9({min:j,max:O})},wz=($,j)=>{let O=j||vY($.inputs),G=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"Clip",(Z)=>`clamp(${Z}, vec4<${G}>(uniforms.min), vec4<${G}>(uniforms.max))`,void 0,O.cacheKey,void 0,[{type:$.inputs[0].dataType,data:O.min},{type:$.inputs[0].dataType,data:O.max}],[{name:"min",type:G},{name:"max",type:G}]),{inputs:[0]})},Ez=($)=>{$.compute(n6($.inputs[0],"Ceil","ceil"))},Qz=($)=>{$.compute(n6($.inputs[0],"Cos","cos"))},Cz=($)=>{$.compute(n6($.inputs[0],"Cosh","cosh"))},EZ=($)=>j9($),Bz=($,j)=>{let O=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"Elu",(G)=>`elu_vf32(${G})`,` + const elu_alpha_ = ${O}(${j.alpha}); + + fn elu_f32(a: ${O}) -> ${O} { + return select((exp(a) - 1.0) * elu_alpha_, a, a >= 0.0); + } + + fn elu_vf32(v: vec4<${O}>) -> vec4<${O}> { + return vec4(elu_f32(v.x), elu_f32(v.y), elu_f32(v.z), elu_f32(v.w)); + }`,j.cacheKey))},jV=($="f32")=>` +const r0: ${$} = 0.3275911; +const r1: ${$} = 0.254829592; +const r2: ${$} = -0.284496736; +const r3: ${$} = 1.421413741; +const r4: ${$} = -1.453152027; +const r5: ${$} = 1.061405429; + +fn erf_vf32(v: vec4<${$}>) -> vec4<${$}> { + let absv = abs(v); + let x = 1.0 / (1.0 + r0 * absv); + return sign(v) * (1.0 - ((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x * exp(-absv * absv)); +}`,hz=($)=>{let j=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"Erf",(O)=>`erf_vf32(${O})`,jV(j)))},cz=($)=>{$.compute(n6($.inputs[0],"Exp","exp"))},mz=($)=>{$.compute(n6($.inputs[0],"Floor","floor"))},pz=($)=>{let j=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"Gelu",(O)=>`0.5 * ${O} * (1.0 + erf_vf32(${O} * 0.7071067811865475))`,jV(j)))},Az=($,j)=>{let O=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"LeakyRelu",(G)=>`select(leaky_relu_alpha_ * ${G}, ${G}, ${G} >= vec4<${O}>(0.0))`,`const leaky_relu_alpha_ = ${O}(${j.alpha});`,j.cacheKey))},gz=($)=>{$.compute(n6($.inputs[0],"Not",(j)=>`!${j}`))},uz=($)=>{$.compute(n6($.inputs[0],"Neg",(j)=>`-${j}`))},dz=($)=>{$.compute(n6($.inputs[0],"Reciprocal",(j)=>`1.0/${j}`))},lz=($)=>{let j=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"Relu",(O)=>`select(vec4<${j}>(0.0), ${O}, ${O} > vec4<${j}>(0.0))`))},oz=($)=>{$.compute(n6($.inputs[0],"Sigmoid",(j)=>`(1.0 / (1.0 + exp(-${j})))`))},sz=($)=>j9($),iz=($,j)=>{let O=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"HardSigmoid",(G)=>`max(vec4<${O}>(0.0), min(vec4<${O}>(1.0), ${j.alpha} * ${G} + vec4<${O}>(${j.beta})))`,void 0,j.cacheKey))},az=($)=>{$.compute(n6($.inputs[0],"Sin","sin"))},rz=($)=>{$.compute(n6($.inputs[0],"Sinh","sinh"))},nz=($)=>{$.compute(n6($.inputs[0],"Sqrt","sqrt"))},tz=($)=>{$.compute(n6($.inputs[0],"Tan","tan"))},vJ=($)=>`sign(${$}) * (1 - exp(-2 * abs(${$}))) / (1 + exp(-2 * abs(${$})))`,ez=($)=>{$.compute(n6($.inputs[0],"Tanh",vJ))},Yv=($="f32")=>` +const fast_gelu_a: ${$} = 0.5; +const fast_gelu_b: ${$} = 0.7978845608028654; +const fast_gelu_c: ${$} = 0.035677408136300125; + +fn tanh_v(v: vec4<${$}>) -> vec4<${$}> { + return ${vJ("v")}; +} +`,Sv=($)=>`(fast_gelu_a + fast_gelu_a * tanh_v(${$} * (fast_gelu_c * ${$} * ${$} + fast_gelu_b))) * ${$}`,$k=($)=>{let j=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"FastGelu",Sv,Yv(j),void 0,$.inputs[0].dataType))},jk=($,j)=>{let O=k1($.inputs[0].dataType);return $.compute(n6($.inputs[0],"ThresholdedRelu",(G)=>`select(vec4<${O}>(0.0), ${G}, ${G} > thresholded_relu_alpha_)`,`const thresholded_relu_alpha_ = vec4<${O}>(${j.alpha});`,j.cacheKey)),0},Ok=($)=>{$.compute(n6($.inputs[0],"Log","log"))},RY=($,j)=>` +const alpha = vec4<${$}>(${j}); +const one = ${$}(1.0); +const zero = ${$}(0.0); + +fn quick_gelu_impl(x: vec4<${$}>) -> vec4<${$}> { + let v = x *alpha; + var x1 : vec4<${$}>; + for (var i = 0; i < 4; i = i + 1) { + if (v[i] >= zero) { + x1[i] = one / (one + exp(-v[i])); + } else { + x1[i] = one - one / (one + exp(v[i])); + } + } + return x * x1; +} +`,UY=($)=>`quick_gelu_impl(${$})`,Gk=($,j)=>{let O=k1($.inputs[0].dataType);$.compute(n6($.inputs[0],"QuickGelu",UY,RY(O,j.alpha),j.cacheKey,$.inputs[0].dataType))}}),bM=I5(()=>{D6(),M6(),SR(),HY=($)=>{if($[0].dims.length!==3)throw Error("input should have 3 dimensions");if(![2560,5120,10240].includes($[0].dims[2]))throw Error("hidden state should be 2560, 5120 or 10240");if($[1].dims.length!==1)throw Error("bias is expected to have 1 dimensions");if($[0].dims[2]!==$[1].dims[0])throw Error("last dimension of input and bias are not the same")},xY=($)=>{let j=$[0].dims.slice();j[2]=j[2]/2;let O=O5("input",$[0].dataType,$[0].dims,4),G=O5("bias",$[0].dataType,[$[0].dims[2]],4),Z=t5("output",$[0].dataType,j,4),V=l0.size(j)/4,N=Z1($[0].dataType);return{name:"BiasSplitGelu",getRunData:()=>({outputs:[{dims:j,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(V/64)}}),getShaderSource:(J)=>` + const M_SQRT2 = sqrt(2.0); + const halfChannels = ${$[0].dims[2]/4/2}u; + + ${J.declareVariables(O,G,Z)} + + ${jV(N)} + + ${J.mainStart()} + ${J.guardAgainstOutOfBoundsWorkgroupSizes(V)} + let biasIdx = global_idx % halfChannels; + let batchIndex = global_idx / halfChannels; + let inputOffset = biasIdx + batchIndex * halfChannels * 2; + let valueLeft = input[inputOffset] + bias[biasIdx]; + let valueRight = input[inputOffset + halfChannels] + bias[biasIdx + halfChannels]; + let geluRight = valueRight * 0.5 * (erf_vf32(valueRight / M_SQRT2) + 1); + + ${Z.setByOffset("global_idx","valueLeft * geluRight")} + }`}},Zk=($)=>{HY($.inputs),$.compute(xY($.inputs))}}),fM=I5(()=>{Y6(),D6(),M6(),LY=($,j,O,G,Z,V,N,J,R,U,H,L)=>{let Y,S;typeof J=="string"?Y=S=(z,w)=>`${J}((${z}),(${w}))`:typeof J=="function"?Y=S=J:(Y=J.scalar,S=J.vector);let X,D=t5("outputData",H,G.length,4),I=O5("aData",R,j.length,4),k=O5("bData",U,O.length,4);if(Z)if(V){let z=l0.size(j)===1,w=l0.size(O)===1,T=j.length>0&&j[j.length-1]%4==0,W=O.length>0&&O[O.length-1]%4==0;X=z||w?D.setByOffset("global_idx",S(z?`${I.type.value}(${I.getByOffset("0")}.x)`:I.getByOffset("global_idx"),w?`${k.type.value}(${k.getByOffset("0")}.x)`:k.getByOffset("global_idx"))):` + let outputIndices = ${D.offsetToIndices("global_idx * 4u")}; + let offsetA = ${I.broadcastedIndicesToOffset("outputIndices",D)}; + let offsetB = ${k.broadcastedIndicesToOffset("outputIndices",D)}; + ${D.setByOffset("global_idx",S(N||T?I.getByOffset("offsetA / 4u"):`${I.type.value}(${I.getByOffset("offsetA / 4u")}[offsetA % 4u])`,N||W?k.getByOffset("offsetB / 4u"):`${k.type.value}(${k.getByOffset("offsetB / 4u")}[offsetB % 4u])`))} + `}else X=D.setByOffset("global_idx",S(I.getByOffset("global_idx"),k.getByOffset("global_idx")));else{if(!V)throw Error("no necessary to use scalar implementation for element-wise binary op implementation.");let z=(w,T,W="")=>{let E=`aData[indexA${T}][componentA${T}]`,Q=`bData[indexB${T}][componentB${T}]`;return` + let outputIndices${T} = ${D.offsetToIndices(`global_idx * 4u + ${T}u`)}; + let offsetA${T} = ${I.broadcastedIndicesToOffset(`outputIndices${T}`,D)}; + let offsetB${T} = ${k.broadcastedIndicesToOffset(`outputIndices${T}`,D)}; + let indexA${T} = offsetA${T} / 4u; + let indexB${T} = offsetB${T} / 4u; + let componentA${T} = offsetA${T} % 4u; + let componentB${T} = offsetB${T} % 4u; + ${w}[${T}] = ${W}(${Y(E,Q)}); + `};X=H===9?` + var data = vec4(0); + ${z("data",0,"u32")} + ${z("data",1,"u32")} + ${z("data",2,"u32")} + ${z("data",3,"u32")} + outputData[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:` + ${z("outputData[global_idx]",0)} + ${z("outputData[global_idx]",1)} + ${z("outputData[global_idx]",2)} + ${z("outputData[global_idx]",3)} + `}return` + ${$.registerUniform("vec_size","u32").declareVariables(I,k,D)} + + ${L??""} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${X} + }`},_Y=($,j,O,G,Z,V,N=O.dataType)=>{let J=O.dims.map((D)=>Number(D)??1),R=G.dims.map((D)=>Number(D)??1),U=!l0.areEqual(J,R),H=J,L=l0.size(J),Y=!1,S=!1,X=[U];if(U){let D=IG.calcShape(J,R,!1);if(!D)throw Error("Can't perform binary op on the given tensors");H=D.slice(),L=l0.size(H);let I=l0.size(J)===1,k=l0.size(R)===1,z=J.length>0&&J[J.length-1]%4==0,w=R.length>0&&R[R.length-1]%4==0;X.push(I),X.push(k),X.push(z),X.push(w);let T=1;for(let W=1;WD.toString()).join("_"),inputDependencies:["rank","rank"]},getShaderSource:(D)=>LY(D,J,R,H,Y,U,S,Z,O.dataType,G.dataType,N,V),getRunData:()=>({outputs:[{dims:H,dataType:N}],dispatchGroup:{x:Math.ceil(L/64/4)},programUniforms:[{type:12,data:Math.ceil(l0.size(H)/4)},...j6(J,R,H)]})}},I3=($,j,O,G,Z,V)=>{$.compute(_Y(j,Z??"",$.inputs[0],$.inputs[1],O,G,V))},qk=($)=>{I3($,"Add",(j,O)=>`${j}+${O}`)},Vk=($)=>{I3($,"Div",(j,O)=>`${j}/${O}`)},Nk=($)=>{I3($,"Equal",{scalar:(j,O)=>`u32(${j}==${O})`,vector:(j,O)=>`vec4(${j}==${O})`},void 0,void 0,9)},Jk=($)=>{I3($,"Mul",(j,O)=>`${j}*${O}`)},vk=($)=>{let j=O5("input",$.inputs[0].dataType,$.inputs[0].dims).type.value;I3($,"Pow",{scalar:(O,G)=>`pow_custom(${O},${G})`,vector:(O,G)=>`pow_vector_custom(${O},${G})`},` + fn pow_custom(a : ${j}, b : ${j}) -> ${j} { + if (b == ${j}(0.0)) { + return ${j}(1.0); + } else if (a < ${j}(0.0) && f32(b) != floor(f32(b))) { + return ${j}(pow(f32(a), f32(b))); // NaN + } + return select(sign(a), ${j}(1.0), round(f32(abs(b) % ${j}(2.0))) != 1.0) * ${j}(${j==="i32"?"round":""}(pow(f32(abs(a)), f32(b)))); + } + fn pow_vector_custom(a : vec4<${j}>, b : vec4<${j}>) -> vec4<${j}> { + // TODO: implement vectorized pow + return vec4<${j}>(pow_custom(a.x, b.x), pow_custom(a.y, b.y), pow_custom(a.z, b.z), pow_custom(a.w, b.w)); + } + `)},Rk=($)=>{I3($,"Sub",(j,O)=>`${j}-${O}`)},Uk=($)=>{I3($,"Greater",{scalar:(j,O)=>`u32(${j}>${O})`,vector:(j,O)=>`vec4(${j}>${O})`},void 0,void 0,9)},Hk=($)=>{I3($,"Less",{scalar:(j,O)=>`u32(${j}<${O})`,vector:(j,O)=>`vec4(${j}<${O})`},void 0,void 0,9)},xk=($)=>{I3($,"GreaterOrEqual",{scalar:(j,O)=>`u32(${j}>=${O})`,vector:(j,O)=>`vec4(${j}>=${O})`},void 0,void 0,9)},Lk=($)=>{I3($,"LessOrEqual",{scalar:(j,O)=>`u32(${j}<=${O})`,vector:(j,O)=>`vec4(${j}<=${O})`},void 0,void 0,9)}}),wM=I5(()=>{Y6(),D6(),B9(),M6(),YY=($,j)=>{if(!$||$.length<1)throw Error("too few inputs");let O=$[0],G=O.dataType,Z=O.dims.length;$.forEach((V,N)=>{if(N!==0){if(V.dataType!==G)throw Error("input tensors should be one type");if(V.dims.length!==Z)throw Error("input tensors should have the same shape");V.dims.forEach((J,R)=>{if(R!==j&&J!==O.dims[R])throw Error("non concat dimensions must match")})}})},SY=($,j)=>` + fn calculateInputIndex(index: u32) -> u32 { + let sizeInConcatAxis = array(${j}); + for (var i: u32 = 0u; i < ${$}; i += 1u ) { + if (index < sizeInConcatAxis[i]) { + return i; + } + } + return ${$}u; + }`,PY=($,j)=>{let O=$.length,G=[];for(let Z=0;Z{let Z=l0.size(O),V=Array($.length),N=Array($.length),J=0,R=[],U=[],H=[{type:12,data:Z}];for(let X=0;X<$.length;++X)J+=$[X].dims[j],V[X]=J,U.push($[X].dims.length),N[X]=O5(`input${X}`,G,U[X]),R.push("rank"),H.push({type:12,data:V[X]});for(let X=0;X<$.length;++X)H.push(...j6($[X].dims));H.push(...j6(O));let L=t5("output",G,O.length),Y=L.indicesGet("indices",j),S=Array.from(Array(V.length).keys()).map((X)=>`uniforms.sizeInConcatAxis${X}`).join(",");return{name:"Concat",shaderCache:{hint:`${j}`,inputDependencies:R},getRunData:()=>({outputs:[{dims:O,dataType:G}],dispatchGroup:{x:Math.ceil(Z/64)},programUniforms:H}),getShaderSource:(X)=>` + + ${(()=>{X.registerUniform("outputSize","u32");for(let D=0;D<$.length;D++)X.registerUniform(`sizeInConcatAxis${D}`,"u32");return X.declareVariables(...N,L)})()} + + ${SY(V.length,S)} + + ${X.mainStart()} + ${X.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + var indices = ${L.offsetToIndices("global_idx")}; + + let inputIndex = calculateInputIndex(${Y}); + if (inputIndex != 0u) { + let sizeInConcatAxis = array(${S}); + ${Y} -= sizeInConcatAxis[inputIndex - 1u]; + } + + ${PY(N,L)} + }`}},_k=($,j)=>{let O=$.inputs,G=O[0].dims,Z=l0.normalizeAxis(j.axis,G.length);YY(O,Z);let V=G.slice();V[Z]=O.reduce((J,R)=>J+(R.dims.length>Z?R.dims[Z]:0),0);let N=O.filter((J)=>l0.size(J.dims)>0);$.compute(XY(N,Z,V,O[0].dataType),{inputs:N})},Yk=($)=>j9({axis:$.axis})}),Z$=I5(()=>{Y6(),D6(),t8=($,j,O="f32")=>{switch($.activation){case"Relu":return`value = max(value, ${j}(0.0));`;case"Sigmoid":return`value = (${j}(1.0) / (${j}(1.0) + exp(-value)));`;case"Clip":return`value = clamp(value, ${j}(${O}(uniforms.clip_min)), ${j}(${O}(uniforms.clip_max)));`;case"HardSigmoid":return`value = max(${j}(0.0), min(${j}(1.0), ${O}(uniforms.alpha) * value + ${O}(uniforms.beta)));`;case"LeakyRelu":return`value = select(${O}(uniforms.alpha) * value, value, value >= ${j}(0.0));`;case"Tanh":return`let e2x = exp(-2.0 * abs(value)); + value = sign(value) * (1.0 - e2x) / (1.0 + e2x); + `;case"":return"";default:throw Error(`Unsupported activation ${$.activation}`)}},e8=($,j)=>{$.activation==="Clip"?j.push({type:1,data:$.clipMax},{type:1,data:$.clipMin}):$.activation==="HardSigmoid"?j.push({type:1,data:$.alpha},{type:1,data:$.beta}):$.activation==="LeakyRelu"&&j.push({type:1,data:$.alpha})},$$=($,j)=>{$.activation==="Clip"?j.push({name:"clip_max",type:"f32"},{name:"clip_min",type:"f32"}):$.activation==="HardSigmoid"?j.push({name:"alpha",type:"f32"},{name:"beta",type:"f32"}):$.activation==="LeakyRelu"&&j.push({name:"alpha",type:"f32"})},RR=($)=>{let j=$?.activation||"";if(j==="HardSigmoid"){let[O,G]=$?.activation_params||[0.2,0.5];return{activation:j,alpha:O,beta:G}}if(j==="Clip"){let[O,G]=$?.activation_params||[uy,dy];return{activation:j,clipMax:G,clipMin:O}}if(j==="LeakyRelu"){let[O]=$?.activation_params||[0.01];return{activation:j,alpha:O}}return{activation:j}}}),PR=I5(()=>{D1=($,j)=>{switch($){case 1:return j;case 2:return`vec2<${j}>`;case 3:return`vec3<${j}>`;case 4:return`vec4<${j}>`;default:throw Error(`${$}-component is not supported.`)}},Sk=($)=>` + ${$?"value = value + getBiasByOutputCoords(coords);":""} + `}),EM=I5(()=>{Pk=($)=>` +fn getIndexFromCoords4D(coords : vec4, shape : vec4) -> i32 { + return dot(coords, vec4( + shape.y * shape.z * shape.w, shape.z * shape.w, shape.w, 1)); +} +fn getOutputIndexFromCoords(coords : vec4) -> i32 { + return dot(coords, vec4( + i32(${$}.x), i32(${$}.y), i32(${$}.z), 1)); +} +`}),XR=I5(()=>{Y6(),D6(),M6(),Z$(),BZ=($,j,O,G,Z)=>{let V=G-O;return` + ${Array.from({length:O}).map((N,J)=>` + if (${R6(j.shape,J,j.rank)} != 1) { + ${j.indicesSet($,J,R6(Z,J+V,G))} + } else { + ${j.indicesSet($,J,0)} + }`).join("")} +`},UR=($,j,O,G,Z=!1,V)=>{let N=$[0].dims,J=$[1].dims,R=N[N.length-2],U=J[J.length-1],H=N[N.length-1],L=K9(U),Y=K9(H),S=K9(R),X=l0.size(O)/L/S,D=$.length>2,I=G?G.slice(0,-2):O.slice(0,-2),k=[l0.size(I),R,U],z=[{type:12,data:X},{type:12,data:R},{type:12,data:U},{type:12,data:H}];return e8(j,z),z.push(...j6(I,N,J)),D&&z.push(...j6($[2].dims)),z.push(...j6(k)),{name:"MatMulNaive",shaderCache:{hint:`${j.activation};${L};${Y};${S};${Z}`,inputDependencies:D?["rank","rank","rank"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:V?V(O):O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(X/64)},programUniforms:z}),getShaderSource:(w)=>{let T=vR("batch_dims",$[0].dataType,I.length),W=O5("a",$[0].dataType,N.length,Y),E=O5("b",$[1].dataType,J.length,L),Q=t5("output",$[0].dataType,k.length,L),A=Z1(Q.type.tensor),l=t8(j,Q.type.value,A),r=[W,E],e="";if(D){let v0=Z?L:1;r.push(O5("bias",$[2].dataType,$[2].dims.length,v0)),e=Z?`value += bias[col / ${v0}];`:`value += ${Q.type.value}(bias[row + i]);`}let V0=[{name:"output_size",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"}];return $$(j,V0),` + ${w.registerUniforms(V0).registerInternalVariables(T).declareVariables(...r,Q)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let col = (global_idx % (uniforms.N / ${L})) * ${L}; + var index1 = global_idx / (uniforms.N / ${L}); + let stride1 = uniforms.M / ${S}; + let row = (index1 % stride1) * ${S}; + let batch = index1 / stride1; + + ${O.length===2?"":`let batch_indices = ${T.offsetToIndices("batch")};`} + + var a_indices: ${W.type.indices}; + ${BZ("a_indices",W,W.rank-2,T.rank,"batch_indices")} + ${W.indicesSet("a_indices",W.rank-2,0)} + ${W.indicesSet("a_indices",W.rank-1,0)} + let a_offset = ${W.indicesToOffset("a_indices")}; + + var b_indices: ${E.type.indices}; + ${BZ("b_indices",E,E.rank-2,T.rank,"batch_indices")} + ${E.indicesSet("b_indices",E.rank-2,0)} + ${E.indicesSet("b_indices",E.rank-1,0)} + let b_offset = ${E.indicesToOffset("b_indices")}; + var values: array<${Q.type.value}, ${S}>; + for (var k: u32 = 0u; k < uniforms.K; k = k + ${Y}) { + ${(()=>{let v0=`var a_data: ${W.type.value};`;for(let $0=0;$0{Y6(),D6(),M6(),Z$(),XR(),PR(),TY=($,j)=>$?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart / innerElementSize + inputCol${j?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRow + innerRow, + kStart / innerElementSize + inputCol${j?", batchIndices":""}); + `,FY=($,j)=>$?` + let ACached0 = mm_Asub[k * innerElementSize][localRow]; + let ACached1 = mm_Asub[k * innerElementSize + 1][localRow]; + let ACached2 = mm_Asub[k * innerElementSize + 2][localRow]; + ${j===3?"":"let ACached3 = mm_Asub[k * innerElementSize + 3][localRow];"} + for (var i = 0; i < rowPerThread; i = i + 1) { + acc[i] = BCached0 * ACached0[i] + acc[i]; + acc[i] = BCached1 * ACached1[i] + acc[i]; + acc[i] = BCached2 * ACached2[i] + acc[i]; + ${j===3?"":"acc[i] = BCached3 * ACached3[i] + acc[i];"} + }`:` + for (var i = 0; i < rowPerThread; i = i + 1) { + let ACached = mm_Asub[tileRow + i][k]; + acc[i] = BCached0 * ACached.x + acc[i]; + acc[i] = BCached1 * ACached.y + acc[i]; + acc[i] = BCached2 * ACached.z + acc[i]; + ${j===3?"":"acc[i] = BCached3 * ACached.w + acc[i];"} + }`,Pv=($,j,O="f32",G,Z=!1,V=32,N=!1,J=32)=>{let R=j[1]*$[1],U=j[0]*$[0],H=Z?R:V,L=Z?V:R,Y=H/j[0],S=V/j[1];if((!Z||Y!==4||$[1]!==4)&&(Z||Y!==3&&Y!==4)||H%j[0]!==0||V%j[1]!==0||$[0]!==4)throw Error(`If transposeA ${Z} is true, innerElementSize ${Y} and workPerThread[1] ${$[1]} must be 4. + Otherwise, innerElementSize ${Y} must be 3 or 4. + tileAWidth ${H} must be divisible by workgroupSize[0]${j[0]}. tileInner ${V} must be divisible by workgroupSize[1] ${j[1]}. colPerThread ${$[0]} must be 4.`);return` +var mm_Asub: array, ${H/Y}>, ${L}>; +var mm_Bsub: array, ${U/$[0]}>, ${V}>; + +const rowPerThread = ${$[1]}; +const colPerThread = ${$[0]}; +const innerElementSize = ${Y}; +const tileInner = ${V}; + +@compute @workgroup_size(${j[0]}, ${j[1]}, ${j[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let localRow = i32(localId.y); + let tileRow = localRow * rowPerThread; + let tileCol = i32(localId.x); + + let globalRow =i32(globalId.y) * rowPerThread; + let globalCol = i32(globalId.x); + let batch = ${N?"0":"i32(globalId.z)"}; + ${G?`let batchIndices = ${G.offsetToIndices("u32(batch)")};`:""} + let globalRowStart = i32(workgroupId.y) * ${R}; + + let num_tiles = ${N?`${Math.ceil(J/V)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${N?`i32(globalId.z) * ${J}`:"0"}; + + var acc: array, rowPerThread>; + + // Loop over shared dimension. + let tileRowB = localRow * ${S}; + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let inputRow = tileRow + innerRow; + let inputCol = tileCol; + ${TY(Z,G)} + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${S}; innerRow = innerRow + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, kStart + inputRow, globalCol${G?", batchIndices":""}); + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + for (var k = 0; k < tileInner / innerElementSize; k = k + 1) { + let BCached0 = mm_Bsub[k * innerElementSize][tileCol]; + let BCached1 = mm_Bsub[k * innerElementSize + 1][tileCol]; + let BCached2 = mm_Bsub[k * innerElementSize + 2][tileCol]; + ${Y===3?"":"let BCached3 = mm_Bsub[k * innerElementSize + 3][tileCol];"} + + ${FY(Z,Y)} + } + + workgroupBarrier(); + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + mm_write(batch, globalRow + innerRow, globalCol, acc[innerRow]); + } +}`},RJ=($,j)=>$?` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + kStart + inputRow, + globalRowStart + inputCol${j?", batchIndices":""}); + `:` + mm_Asub[inputRow][inputCol] = mm_readA(batch, + globalRowStart + inputRow, + kStart + inputCol${j?", batchIndices":""}); + `,yY=($)=>$?"let ACached = mm_Asub[k][tileRow + innerRow];":"let ACached = mm_Asub[tileRow + innerRow][k];",Xv=($,j,O="f32",G,Z=!1,V=32,N=!1,J=32,R=!1)=>{let U=$[1]*j[1],H=$[0]*j[0],L=Z?U:V,Y=Z?V:U;if(Y%j[1]!==0||L%j[0]!==0||V%j[1]!==0)throw Error(`tileAHight ${Y} must be divisible by workgroupSize[1]${j[1]}, tileAWidth ${L} must be divisible by workgroupSize[0]${j[0]}, tileInner ${V} must be divisible by workgroupSize[1]${j[1]}`);let S=Y/j[1],X=L/j[0],D=V/j[1],I=R?` + let localRow = i32(localId.y); + let localCol = i32(localId.x); + let globalRowStart = i32(workgroupId.y) * ${U}; + let globalColStart = i32(workgroupId.x) * ${H}; + + // Loop over shared dimension. + for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var inputRow = localRow; inputRow < ${Y}; inputRow = inputRow + ${j[1]}) { + for (var inputCol = localCol; inputCol < ${L}; inputCol = inputCol + ${j[0]}) { + ${RJ(Z,G)} + } + } + // Load one tile of B into local memory. + for (var inputRow = localRow; inputRow < ${V}; inputRow = inputRow + ${j[1]}) { + for (var inputCol = localCol; inputCol < ${H}; inputCol = inputCol + ${j[0]}) { + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalColStart + inputCol${G?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${O}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][localCol + inner * ${j[0]}]; + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let ACached = ${Z?`mm_Asub[k][localRow + innerRow * ${j[1]}];`:`mm_Asub[localRow + innerRow * ${j[1]}][k];`} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + + ACached * BCached[innerCol]; + } + } + } + workgroupBarrier(); + } + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + let gRow = globalRowStart + localRow + innerRow * ${j[1]}; + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let gCol = globalColStart + localCol + innerCol * ${j[0]}; + mm_write(batch, gRow, gCol, acc[innerRow][innerCol]); + } + } + `:` +let tileRow = i32(localId.y) * rowPerThread; +let tileCol = i32(localId.x) * colPerThread; + +let globalRow = i32(globalId.y) * rowPerThread; +let globalCol = i32(globalId.x) * colPerThread; +let globalRowStart = i32(workgroupId.y) * ${U}; + +let tileRowA = i32(localId.y) * ${S}; +let tileColA = i32(localId.x) * ${X}; +let tileRowB = i32(localId.y) * ${D}; +// Loop over shared dimension. +for (var t = 0; t < num_tiles; t = t + 1) { + // Load one tile of A into local memory. + for (var innerRow = 0; innerRow < ${S}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < ${X}; innerCol = innerCol + 1) { + let inputRow = tileRowA + innerRow; + let inputCol = tileColA + innerCol; + ${RJ(Z,G)} + } + } + + // Load one tile of B into local memory. + for (var innerRow = 0; innerRow < ${D}; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + let inputRow = tileRowB + innerRow; + let inputCol = tileCol + innerCol; + mm_Bsub[inputRow][inputCol] = mm_readB(batch, + kStart + inputRow, + globalCol + innerCol${G?", batchIndices":""}); + } + } + kStart = kStart + tileInner; + workgroupBarrier(); + + // Compute acc values for a single thread. + var BCached : array<${O}, colPerThread>; + for (var k = 0; k < tileInner; k = k + 1) { + for (var inner = 0; inner < colPerThread; inner = inner + 1) { + BCached[inner] = mm_Bsub[k][tileCol + inner]; + } + + for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + ${yY(Z)} + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + acc[innerRow][innerCol] = acc[innerRow][innerCol] + ACached * BCached[innerCol]; + } + } + } + + workgroupBarrier(); +} + +for (var innerRow = 0; innerRow < rowPerThread; innerRow = innerRow + 1) { + for (var innerCol = 0; innerCol < colPerThread; innerCol = innerCol + 1) { + mm_write(batch, globalRow + innerRow, globalCol + innerCol, + acc[innerRow][innerCol]); + } +} +`;return` + var mm_Asub : array, ${Y}>; + var mm_Bsub : array, ${V}>; + const rowPerThread = ${$[1]}; + const colPerThread = ${$[0]}; + const tileInner = ${V}; + +@compute @workgroup_size(${j[0]}, ${j[1]}, ${j[2]}) +fn main(@builtin(local_invocation_id) localId : vec3, + @builtin(global_invocation_id) globalId : vec3, + @builtin(workgroup_id) workgroupId : vec3) { + let batch = ${N?"0":"i32(globalId.z)"}; + ${G?`let batchIndices = ${G.offsetToIndices("u32(batch)")};`:""} + let num_tiles = ${N?`${Math.ceil(J/V)}`:"(uniforms.dim_inner - 1) / tileInner + 1"}; + var kStart = ${N?`i32(globalId.z) * ${J}`:"0"}; + + var acc : array, rowPerThread>; + ${I} + } +`},zY=($,j,O,G,Z=!1)=>{let[V,N,J,R]=G,U=Z1(G[0].type.tensor);return` + fn mm_readA(batch: i32, row: i32, colIn: i32, batchIndices: ${V.type.indices}) -> ${D1($,U)} { + var value = ${D1($,U)}(0.0); + let col = colIn * ${$}; + if(row < uniforms.dim_a_outer && col < uniforms.dim_inner) + { + var aIndices: ${N.type.indices}; + ${BZ("aIndices",N,N.rank-2,V.rank,"batchIndices")} + ${N.indicesSet("aIndices",N.rank-2,"u32(row)")} + ${N.indicesSet("aIndices",N.rank-1,"u32(colIn)")} + value = ${N.getByIndices("aIndices")}; + } + return value; + } + + fn mm_readB(batch: i32, row: i32, colIn: i32, batchIndices: ${V.type.indices}) -> ${D1($,U)} { + var value = ${D1($,U)}(0.0); + let col = colIn * ${$}; + if(row < uniforms.dim_inner && col < uniforms.dim_b_outer) + { + var bIndices: ${J.type.indices}; + ${BZ("bIndices",J,J.rank-2,V.rank,"batchIndices")} + ${J.indicesSet("bIndices",J.rank-2,"u32(row)")} + ${J.indicesSet("bIndices",J.rank-1,"u32(colIn)")} + value = ${J.getByIndices("bIndices")}; + } + return value; + } + + fn mm_write(batch: i32, row: i32, colIn: i32, valueIn: ${D1($,U)}) { + let col = colIn * ${$}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) { + var value = valueIn; + let coords = vec3(batch, row, colIn); + ${j?`value = value + ${Z?"bias[colIn]":`${D1($,U)}(bias[row])`};`:""} + ${O} + ${R.setByIndices("vec3(coords)","value")} + } + } + `},YV=($,j,O,G,Z=!1,V)=>{let N=$[0].dims,J=$[1].dims,R=N.slice(0,-2),U=J.slice(0,-2),H=G?G.slice(0,-2):O.slice(0,-2),L=l0.size(H),Y=N[N.length-2],S=N[N.length-1],X=J[J.length-1],D=S%4==0&&X%4==0,I=Y<=8?[4,1,1]:[4,4,1],k=[8,8,1],z=[Math.ceil(X/k[0]/I[0]),Math.ceil(Y/k[1]/I[1]),Math.ceil(L/k[2]/I[2])],w=D?4:1,T=[...R,Y,S/w],W=T.length,E=[...U,S,X/w],Q=E.length,A=[L,Y,X/w],l=[{type:6,data:Y},{type:6,data:X},{type:6,data:S}];e8(j,l),l.push(...j6(H,T,E));let r=["rank","rank"],e=$.length>2;return e&&(l.push(...j6($[2].dims)),r.push("rank")),l.push(...j6(A)),{name:"MatMul",shaderCache:{hint:`${I};${j.activation};${D};${Z}`,inputDependencies:r},getRunData:()=>({outputs:[{dims:V?V(O):O,dataType:$[0].dataType}],dispatchGroup:{x:z[0],y:z[1],z:z[2]},programUniforms:l}),getShaderSource:(V0)=>{let v0=H.length,$0=vR("batchDims",$[0].dataType,v0,1),i=Z1($[0].dataType),G0=O5("a",$[0].dataType,W,w),S0=O5("b",$[1].dataType,Q,w),F0=t5("result",$[0].dataType,A.length,w),s=[G0,S0];if(e){let Z0=Z?w:1;s.push(O5("bias",$[2].dataType,$[2].dims.length,Z0))}let n=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"}];$$(j,n);let R0=Z1(F0.type.tensor),q0=t8(j,F0.type.value,R0),p0=zY(w,e,q0,[$0,G0,S0,F0],Z);return` + ${V0.registerUniforms(n).registerInternalVariables($0).declareVariables(...s,F0)} + ${p0} + ${D?Pv(I,k,i,$0):Xv(I,k,i,$0)} + `}}}}),QM=I5(()=>{Y6(),I4(),M6(),Z$(),PR(),EM(),TR(),kY=($,j,O,G,Z=!1,V,N=4,J=4,R=4,U="f32")=>{let H=(A)=>{switch(A){case 1:return"return w[row * i32(uniforms.w_shape[3]) + colIn];";case 4:return"return w[row * i32(uniforms.w_shape[3]) / 4 + colIn];";default:throw Error(`innerElementSize ${A} is not supported.`)}},L=$?` + let coord = vec4(batch, xRow, xCol, xCh); + `:` + let coord = vec4(batch, xCh, xRow, xCol); + `,Y=$?` + let coords = vec4( + batch, + row / outWidth, + row % outWidth, + col); + `:` + let coords = vec4( + batch, + row, + col / outWidth, + col % outWidth); + `,S=$?"i32(uniforms.x_shape[1])":"i32(uniforms.x_shape[2])",X=$?"i32(uniforms.x_shape[2])":"i32(uniforms.x_shape[3])",D=$?"row":"col",I=$?"col":"row",k=` + let inChannels = i32(uniforms.w_shape[2]); + let outWidth = ${$?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + let outRow = ${D} / outWidth; + let outCol = ${D} % outWidth; + + let WRow = ${I} / (i32(uniforms.w_shape[1]) * inChannels); + let WCol = ${I} / inChannels % i32(uniforms.w_shape[1]); + let xRow = outRow * uniforms.stride[0] + uniforms.dilation[0] * WRow - uniforms.pad[0]; + let xCol = outCol * uniforms.stride[1] + uniforms.dilation[1] * WCol - uniforms.pad[1]; + let xCh = ${I} % inChannels; + var resData = ${D1(N,U)}(0.0); + // The bounds checking is always needed since we use it to pad zero for + // the 'same' padding type. + if (xRow >= 0 && xRow < ${S} && xCol >= 0 && xCol < ${X}) { + ${L} + let xIndex = getIndexFromCoords4D(coord, vec4(uniforms.x_shape)); + ${((A)=>{switch(A){case 1:return"resData = x[xIndex];";case 3:return`resData = vec3<${U}>(x[xIndex], x[xIndex + 1], x[xIndex + 2]);`;case 4:return"resData = x[xIndex / 4];";default:throw Error(`innerElementSize ${A} is not supported.`)}})(N)} + } + return resData;`,z=$?j&&G?` + let col = colIn * ${N}; + ${k}`:` + let col = colIn * ${N}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_inner) { + ${k} + } + return ${D1(N,U)}(0.0);`:G&&O?` + let col = colIn * ${N}; + ${k}`:` + let col = colIn * ${N}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${k} + } + return ${D1(N,U)}(0.0);`,w=$?G&&O?H(J):` + let col = colIn * ${J}; + if (row < uniforms.dim_inner && col < uniforms.dim_b_outer) { + ${H(J)} + } + return ${D1(J,U)}(0.0);`:` + let col = colIn * ${J}; + if (row < uniforms.dim_inner && col < uniforms.dim_a_outer) { + ${H(J)} + } + return ${D1(J,U)}(0.0);`,T=D1(R,U),W=D1($?N:J,U),E=D1($?J:N,U),Q=t8(V,T,U);return` + fn mm_readA(batch: i32, row : i32, colIn : i32) -> ${W} { + ${$?z:w} + } + + fn mm_readB(batch: i32, row : i32, colIn : i32) -> ${E} { + ${$?w:z} + } + + fn mm_write(batch: i32, row : i32, colIn : i32, valueIn : ${T}) { + let col = colIn * ${R}; + if (row < uniforms.dim_a_outer && col < uniforms.dim_b_outer) + { + var value = valueIn; + let outWidth = ${$?"i32(uniforms.result_shape[2])":"i32(uniforms.result_shape[3])"}; + ${Y} + ${Sk(Z)} + ${Q} + setOutputAtCoords(coords[0], coords[1], coords[2], coords[3], value); + } + }`},Xk=($,j,O,G,Z,V,N,J,R)=>{let U=j.format==="NHWC",H=U?$[0].dims[3]:$[0].dims[1],L=O[0],Y=U?O[2]:O[3],S=U?O[1]:O[2],X=U?O[3]:O[1],D=U&&(H%4==0||H%3==0)&&X%4==0,I=U?X:Y*S,k=U?Y*S:X,z=[8,8,1],w=G<=8?[4,1,1]:[4,4,1],T=[Math.ceil(I/z[0]/w[0]),Math.ceil(k/z[1]/w[1]),Math.ceil(L/z[2]/w[2])];l6("verbose",()=>`[conv2d_mm_webgpu] dispatch = ${T}`);let W=D?U&&H%4!=0?3:4:1,E=z[1]*w[1],Q=z[0]*w[0],A=Math.max(z[0]*W,z[1]),l=G%E===0,r=Z%Q===0,e=V%A===0,V0=D?[W,4,4]:[1,1,1],v0=[{type:6,data:G},{type:6,data:Z},{type:6,data:V},{type:6,data:[j.pads[0],j.pads[1]]},{type:6,data:j.strides},{type:6,data:j.dilations}];e8(j,v0),v0.push(...j6($[0].dims,$[1].dims));let $0=["rank","rank"];return N&&(v0.push(...j6($[2].dims)),$0.push("rank")),v0.push(...j6(O)),{name:"Conv2DMatMul",shaderCache:{hint:`${j.cacheKey};${W};${D};${l};${r};${e};${E};${Q};${A}`,inputDependencies:$0},getRunData:()=>({outputs:[{dims:R?R(O):O,dataType:$[0].dataType}],dispatchGroup:{x:T[0],y:T[1],z:T[2]},programUniforms:v0}),getShaderSource:(i)=>{let G0=[{name:"dim_a_outer",type:"i32"},{name:"dim_b_outer",type:"i32"},{name:"dim_inner",type:"i32"},{name:"pad",type:"i32",length:2},{name:"stride",type:"i32",length:2},{name:"dilation",type:"i32",length:2}];$$(j,G0);let S0=D?4:1,F0=Z1($[0].dataType),s=` + fn setOutputAtIndex(flatIndex : i32, value : ${D?`vec4<${F0}>`:F0}) { + result[flatIndex] = ${D?`vec4<${F0}>`:F0}(value); + } + fn setOutputAtCoords(d0 : i32, d1 : i32, d2 : i32, d3 : i32, value : ${D?`vec4<${F0}>`:F0}) { + let flatIndex = getOutputIndexFromCoords(vec4(d0, d1, d2, d3)); + setOutputAtIndex(flatIndex ${D?"/ 4":""}, value); + }`,n=[O5("x",$[0].dataType,$[0].dims.length,W===3?1:W),O5("w",$[1].dataType,$[1].dims.length,S0)],R0=t5("result",$[0].dataType,O.length,S0);if(N){let q0=O5("bias",$[2].dataType,$[2].dims.length,S0);n.push(q0),s+=` + fn getBiasByOutputCoords(coords : vec4) -> ${D?`vec4<${F0}>`:F0} { + return bias[coords.${U?"w":"y"}${D?"/ 4":""}]; + }`}return` + ${Pk("uniforms.result_strides")} + //struct Uniforms { xShape : vec4, wShape : vec4, outShape : vec4, + // outShapeStrides: vec3, filterDims : vec2, pad : vec2, stride : vec2, + // dilation : vec2, dimAOuter : i32, dimBOuter : i32, dimInner : i32 }; + ${i.registerUniforms(G0).declareVariables(...n,R0)} + ${s} + ${kY(U,l,r,e,N,j,V0[0],V0[1],V0[2],F0)} + ${D?Pv(w,z,F0,void 0,!U,A):Xv(w,z,F0,void 0,!U,A,!1,void 0,J)}`}}}}),CM=I5(()=>{Y6(),I4(),D6(),M6(),Z$(),PR(),IY=($)=>{let j=1;for(let O=0;O<$.length;O++)j*=$[O];return j},UJ=($)=>typeof $=="number"?[$,$,$]:$,kZ=($,j)=>j<=1?$:$+($-1)*(j-1),DY=($,j,O,G=1)=>{let Z=kZ(j,G);return Math.floor(($[0]*(O-1)-O+Z)/2)},HJ=($,j,O,G,Z)=>{Z==null&&(Z=DY($,j[0],G[0]));let V=[0,0,0,O];for(let N=0;N<3;N++)$[N]+2*Z>=j[N]&&(V[N]=Math.trunc(($[N]-j[N]+2*Z)/G[N]+1));return V},WY=($,j,O,G,Z,V,N,J,R,U)=>{let H,L,Y,S;if($==="VALID"&&($=0),typeof $=="number"){H={top:$,bottom:$,left:$,right:$,front:$,back:$};let X=HJ([j,O,G,1],[J,R,U],1,[Z,V,N],$);L=X[0],Y=X[1],S=X[2]}else if(Array.isArray($)){if(!$.every((D,I,k)=>D===k[0]))throw Error(`Unsupported padding parameter: ${$}`);H={top:$[0],bottom:$[1],left:$[2],right:$[3],front:$[4],back:$[5]};let X=HJ([j,O,G,1],[J,R,U],1,[Z,V,N],$[0]);L=X[0],Y=X[1],S=X[2]}else{if($!=="SAME_UPPER")throw Error(`Unknown padding parameter: ${$}`);{L=Math.ceil(j/Z),Y=Math.ceil(O/V),S=Math.ceil(G/N);let X=(L-1)*Z+J-j,D=(Y-1)*V+R-O,I=(S-1)*N+U-G,k=Math.floor(X/2),z=X-k,w=Math.floor(D/2),T=D-w,W=Math.floor(I/2);H={top:w,bottom:T,left:W,right:I-W,front:k,back:z}}}return{padInfo:H,outDepth:L,outHeight:Y,outWidth:S}},Tk=($,j,O,G,Z,V=!1,N="channelsLast")=>{let J,R,U,H,L;if(N==="channelsLast")[J,R,U,H,L]=$;else{if(N!=="channelsFirst")throw Error(`Unknown dataFormat ${N}`);[J,L,R,U,H]=$}let[Y,,S,X,D]=j,[I,k,z]=UJ(O),[w,T,W]=UJ(G),E=kZ(S,w),Q=kZ(X,T),A=kZ(D,W),{padInfo:l,outDepth:r,outHeight:e,outWidth:V0}=WY(Z,R,U,H,I,k,z,E,Q,A),v0=V?Y*L:Y,$0=[0,0,0,0,0];return N==="channelsFirst"?$0=[J,v0,r,e,V0]:N==="channelsLast"&&($0=[J,r,e,V0,v0]),{batchSize:J,dataFormat:N,inDepth:R,inHeight:U,inWidth:H,inChannels:L,outDepth:r,outHeight:e,outWidth:V0,outChannels:v0,padInfo:l,strideDepth:I,strideHeight:k,strideWidth:z,filterDepth:S,filterHeight:X,filterWidth:D,effectiveFilterDepth:E,effectiveFilterHeight:Q,effectiveFilterWidth:A,dilationDepth:w,dilationHeight:T,dilationWidth:W,inShape:$,outShape:$0,filterShape:j}},Fk=($,j,O,G,Z,V)=>{let N=V==="channelsLast";N?$[0].dims[3]:$[0].dims[1];let J={x:O.map((Y,S)=>S)},R=[Math.ceil(IY(J.x.map((Y)=>O[Y]))/64),1,1];l6("verbose",()=>`[conv3d_naive_webgpu] dispatch = ${R}`);let U=[{type:12,data:l0.size(O)},{type:12,data:G},{type:12,data:Z},{type:12,data:j.strides},{type:12,data:j.dilations}];e8(j,U),U.push(...j6($[0].dims,$[1].dims));let H=["rank","rank"],L=$.length===3;return L&&(U.push(...j6($[2].dims)),H.push("rank")),U.push(...j6(O)),{name:"Conv3DNaive",shaderCache:{hint:`${j.cacheKey};${N};1;${L}`,inputDependencies:H},getRunData:()=>({outputs:[{dims:O,dataType:$[0].dataType}],dispatchGroup:{x:R[0],y:R[1],z:R[2]},programUniforms:U}),getShaderSource:(Y)=>{let S=[{name:"output_size",type:"u32"},{name:"filter_dims",type:"u32",length:G.length},{name:"pads",type:"u32",length:Z.length},{name:"strides",type:"u32",length:j.strides.length},{name:"dilations",type:"u32",length:j.dilations.length}];$$(j,S);let X=Z1($[0].dataType),D=O5("x",$[0].dataType,$[0].dims.length,1),I=O5("W",$[1].dataType,$[1].dims.length,1),k=[D,I],z=t5("result",$[0].dataType,O.length,1),w="";if(L){let E=O5("bias",$[2].dataType,$[2].dims.length,1);k.push(E),w+=` + fn getBiasByOutputCoords(coords : array) -> ${X} { + return bias[${R6("coords",N?4:1,5)}]; + }`}let T=D1(1,X),W=t8(j,T,X);return` + ${w} + fn getX(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${D.getByIndices("aIndices")}; + } + fn getW(d0 : u32, d1 : u32, d2 : u32, d3 : u32, d4 : u32) -> f32 { + let aIndices = array(d0, d1, d2, d3, d4); + return ${I.getByIndices("aIndices")}; + } + ${Y.registerUniforms(S).declareVariables(...k,z)} + ${Y.mainStart()} + ${Y.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let coords = ${z.offsetToIndices("global_idx")}; + let batch = ${R6("coords",0,D.rank)}; + let d2 = ${R6("coords",N?D.rank-1:1,D.rank)}; + let xFRCCorner = vec3(${R6("coords",N?1:2,D.rank)}, + ${R6("coords",N?2:3,D.rank)}, + ${R6("coords",N?3:4,D.rank)}) * uniforms.strides - uniforms.pads; + let xFCorner = xFRCCorner.x; + let xRCorner = xFRCCorner.y; + let xCCorner = xFRCCorner.z; + let xShapeY = ${R6("uniforms.x_shape",N?1:2,D.rank)}; + let xShapeZ = ${R6("uniforms.x_shape",N?2:3,D.rank)}; + let xShapeW = ${R6("uniforms.x_shape",N?3:4,D.rank)}; + let xShapeU = ${R6("uniforms.x_shape",N?4:1,D.rank)}; + let inputDepthNearestVec4 = (xShapeU / 4) * 4; + let inputDepthVec4Remainder = xShapeU % 4; + + var value = 0.0; + for (var wF = 0u; wF < uniforms.filter_dims[0]; wF++) { + let xF = xFCorner + wF * uniforms.dilations[0]; + if (xF < 0 || xF >= xShapeY) { + continue; + } + + for (var wR = 0u; wR < uniforms.filter_dims[1]; wR++) { + let xR = xRCorner + wR * uniforms.dilations[1]; + if (xR < 0 || xR >= xShapeZ) { + continue; + } + + for (var wC = 0u; wC < uniforms.filter_dims[2]; wC++) { + let xC = xCCorner + wC * uniforms.dilations[2]; + if (xC < 0 || xC >= xShapeW) { + continue; + } + + for (var d1 = 0u; d1 < inputDepthNearestVec4; d1 += 4) { + ${N?`let xValues = vec4( + getX(batch, xF, xR, xC, d1), + getX(batch, xF, xR, xC, d1 + 1), + getX(batch, xF, xR, xC, d1 + 2), + getX(batch, xF, xR, xC, d1 + 3)); + `:`let xValues = vec4( + getX(batch, d1, xF, xR, xC), + getX(batch, d1 + 1, xF, xR, xC), + getX(batch, d1 + 2, xF, xR, xC), + getX(batch, d1 + 3, xF, xR, xC)); + `} + let wValues = vec4( + getW(d2, d1, wF, wR, wC), + getW(d2, d1 + 1, wF, wR, wC), + getW(d2, d1 + 2, wF, wR, wC), + getW(d2, d1 + 3, wF, wR, wC)); + value += dot(xValues, wValues); + } + if (inputDepthVec4Remainder == 1) { + ${N?`value += getX(batch, xF, xR, xC, inputDepthNearestVec4) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`:`value += getX(batch, inputDepthNearestVec4, xF, xR, xC) + * getW(d2, inputDepthNearestVec4, wF, wR, wC);`} + } else if (inputDepthVec4Remainder == 2) { + ${N?`let xValues = vec2( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1)); + `:`let xValues = vec2( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC)); + `} + let wValues = vec2( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC)); + value += dot(xValues, wValues); + } else if (inputDepthVec4Remainder == 3) { + ${N?`let xValues = vec3( + getX(batch, xF, xR, xC, inputDepthNearestVec4), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 1), + getX(batch, xF, xR, xC, inputDepthNearestVec4 + 2)); + `:`let xValues = vec3( + getX(batch, inputDepthNearestVec4, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 1, xF, xR, xC), + getX(batch, inputDepthNearestVec4 + 2, xF, xR, xC)); + `} + let wValues = vec3( + getW(d2, inputDepthNearestVec4, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 1, wF, wR, wC), + getW(d2, inputDepthNearestVec4 + 2, wF, wR, wC)); + value += dot(xValues, wValues); + } + } + } + } + ${L?"value = value + getBiasByOutputCoords(coords)":""}; + ${W} + result[global_idx] = f32(value); + }`}}}}),BM=I5(()=>{Y6(),D6(),M6(),Z$(),yk=($,j,O,G)=>{let Z=$.length>2,V=Z?"value += b[output_channel];":"",N=$[0].dims,J=$[1].dims,R=j.format==="NHWC",U=R?O[3]:O[1],H=U/j.group,L=R&&H>=4?K9(U):1,Y=l0.size(O)/L,S=[{type:12,data:Y},{type:12,data:j.dilations},{type:12,data:[j.strides[0],j.strides[1]]},{type:12,data:[j.pads[0],j.pads[1]]},{type:12,data:H}];e8(j,S),S.push(...j6(N,[J[0],J[1],J[2],J[3]/L]));let X=Z?["rank","rank","rank"]:["rank","rank"];return S.push(...j6([O[0],O[1],O[2],O[3]/L])),{name:"GroupedConv",shaderCache:{hint:`${j.cacheKey}_${L}`,inputDependencies:X},getRunData:()=>({outputs:[{dims:G?G(O):O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(Y/64)},programUniforms:S}),getShaderSource:(D)=>{let I=t5("output",$[0].dataType,O.length,L),k=Z1(I.type.tensor),z=t8(j,I.type.value,k),w=O5("x",$[0].dataType,N.length),T=O5("w",$[1].dataType,J.length,L),W=[w,T];Z&&W.push(O5("b",$[2].dataType,$[2].dims,L));let E=[{name:"output_size",type:"u32"},{name:"dilations",type:"u32",length:j.dilations.length},{name:"strides",type:"u32",length:2},{name:"pads",type:"u32",length:2},{name:"output_channels_per_group",type:"u32"}];$$(j,E);let Q=R?` + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[0]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[1]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[1]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[2]) { + continue; + } + + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[2]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + let xVal = ${w.get("batch","xHeight","xWidth","input_channel")}; + let wVal = ${T.get("wHeight","wWidth","wInChannel","output_channel")}; + value += xVal * wVal; + } + } + } + `:` + for (var wInChannel: u32 = 0u; wInChannel < uniforms.w_shape[1]; wInChannel++) { + let input_channel = in_channel_offset + wInChannel; + for (var wHeight: u32 = 0u; wHeight < uniforms.w_shape[2]; wHeight++) { + let xHeight = xRCCorner.x + wHeight * uniforms.dilations[0]; + + if (xHeight < 0u || xHeight >= uniforms.x_shape[2]) { + continue; + } + + for (var wWidth: u32 = 0u; wWidth < uniforms.w_shape[3]; wWidth++) { + let xWidth = xRCCorner.y + wWidth * uniforms.dilations[1]; + if (xWidth < 0u || xWidth >= uniforms.x_shape[3]) { + continue; + } + + let xVal = ${w.get("batch","input_channel","xHeight","xWidth")}; + let wVal = ${T.get("output_channel","wInChannel","wHeight","wWidth")}; + value += xVal * wVal; + } + } + } + `;return` + ${D.registerUniforms(E).declareVariables(...W,I)} + + ${D.mainStart()} + ${D.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let outputIndices = ${I.offsetToIndices("global_idx")}; + let batch: u32 = outputIndices[0]; + let output_channel: u32 = outputIndices[${R?3:1}]; + let xRCCorner: vec2 = vec2(outputIndices[${R?1:2}], outputIndices[${R?2:3}]) * uniforms.strides - uniforms.pads; + let group_id: u32 = output_channel * ${L} / uniforms.output_channels_per_group; + var in_channel_offset = group_id * uniforms.w_shape[${R?2:1}]; + + var value: ${I.type.value} = ${I.type.value}(0); + ${Q} + ${V} + ${z} + ${I.setByOffset("global_idx","value")} + }`}}},zk=($,j,O,G)=>{let Z=$.length>2,V=K9(O[3]),N=K9(O[2]),J=l0.size(O)/V/N,R=[$[0].dims[0],$[0].dims[1],$[0].dims[2],$[0].dims[3]/V],U=[$[1].dims[0],$[1].dims[1],$[1].dims[2],$[1].dims[3]/V],H=[O[0],O[1],O[2],O[3]/V],L=[{type:12,data:J},{type:6,data:[j.strides[0],j.strides[1]]},{type:6,data:[j.pads[0],j.pads[1]]}];e8(j,L),L.push(...j6(R,U,H));let Y=(N-1)*j.strides[1]+U[1];return{name:"GroupedConv-Vectorize",shaderCache:{hint:`${j.cacheKey};${V};${N};${Y};${U[0]};${U[1]}`,inputDependencies:Z?["rank","rank","type"]:["rank","rank"]},getRunData:()=>({outputs:[{dims:G?G(O):O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(J/64)},programUniforms:L}),getShaderSource:(S)=>{let X=t5("output",$[0].dataType,H.length,V),D=Z1(X.type.tensor),I=t8(j,X.type.value,D),k=O5("x",$[0].dataType,R.length,V),z=O5("w",$[1].dataType,U.length,V),w=[k,z];Z&&w.push(O5("b",$[2].dataType,$[2].dims,V));let T=Z?"value += b[output_channel];":"",W=[{name:"output_size",type:"u32"},{name:"strides",type:"i32",length:2},{name:"pads",type:"i32",length:2}];return $$(j,W),` + ${S.registerUniforms(W).declareVariables(...w,X)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let width0 = uniforms.output_shape[3]; + let output_channel = global_idx % width0; + var index1 = global_idx / width0; + let width1 = uniforms.output_shape[2] / ${N}u; + let col = (index1 % width1) * ${N}u; + index1 = index1 / width1; + let row = index1 % uniforms.output_shape[1]; + let batch = index1 / uniforms.output_shape[1]; + + let x_corner = vec2(i32(row), i32(col)) * uniforms.strides - uniforms.pads; + + var x_vals: array<${k.type.value}, ${Y}>; + var values: array<${X.type.value}, ${N}>; + let input_channel = output_channel; + // Use constant instead of uniform can give better performance for w's height/width. + for (var w_height: u32 = 0u; w_height < ${U[0]}; w_height++) { + let x_height = x_corner.x + i32(w_height); + if (x_height >= 0 && u32(x_height) < uniforms.x_shape[1]) { + for (var i = 0; i < ${Y}; i++) { + let x_width = x_corner.y + i; + if (x_width >= 0 && u32(x_width) < uniforms.x_shape[2]) { + x_vals[i] = ${k.get("batch","u32(x_height)","u32(x_width)","input_channel")}; + } else { + x_vals[i] = ${k.type.value}(0); + } + } + for (var w_width: u32 = 0u; w_width < ${U[1]}; w_width++) { + let w_val = ${z.get("w_height","w_width","0","output_channel")}; + for (var i = 0u; i < ${N}u; i++) { + values[i] = fma(x_vals[i * u32(uniforms.strides[1]) + w_width], w_val, values[i]); + } + } + } + } + + for (var i = 0u; i < ${N}u; i++) { + var value = values[i]; + ${T} + ${I} + ${X.set("batch","row","col + i","output_channel","value")}; + } + }`}}}}),hM=I5(()=>{D6(),QM(),CM(),TR(),BM(),Z$(),XR(),v7(),MY=($,j,O,G,Z,V)=>{let N=$[0],J=$.slice(V?1:2,V?3:4),R=J.length,U=j[0],H=j.slice(2).map((Y,S)=>Y+(Y-1)*(O[S]-1)),L=J.map((Y,S)=>Y+G[S]+G[S+R]).map((Y,S)=>Math.floor((Y-H[S]+Z[S])/Z[S]));return L.splice(0,0,N),L.splice(V?3:1,0,U),L},oq=[2,3,1,0],KY=($,j)=>{if(!$||$.length!==2&&$.length!==3)throw Error("Conv requires 2 or 3 inputs");if($[0].dims.length>5)throw Error("greater than 5D is not supported");if($[0].dims.length!==$[1].dims.length)throw Error("filter does not have same dimension as input");if($[0].dims[j.format==="NHWC"?$[0].dims.length-1:1]!==$[1].dims[1]*j.group)throw Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");if($.length===3&&($[2].dims.length!==1||$[1].dims[0]!==$[2].dims[0]))throw Error("invalid bias");let O=$[0].dims.length-2;if(j.dilations.length!==O)throw Error(`dilations should be ${O}D`);if(j.strides.length!==O)throw Error(`strides should be ${O}D`);if(j.pads.length!==2*O)throw Error(`pads should be ${2*O}D`);if(j.kernelShape.length!==0&&j.kernelShape.length!==$[1].dims.length-2)throw Error("invalid kernel shape")},sq=($,j)=>{let O=$.kernelShape.slice();O.length{let j=RR($),O=$.format;return{autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][$.auto_pad],format:O,dilations:$.dilations,group:$.group,kernelShape:$.kernel_shape,pads:$.pads,strides:$.strides,wIsConst:$.w_is_const(),...j,cacheKey:`${$.format};${j.activation};`}},xJ=($,j,O,G)=>{let Z=O.format==="NHWC",V=MY(j[0].dims,j[1].dims,O.dilations,O.pads,O.strides,Z);if(O.group!==1){let W=[j[0]];if(Z){let E=$.kernelCustomData.wT??$.compute(X2(j[1],oq),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=E),W.push(E)}else W.push(j[1]);return j.length===3&&W.push(j[2]),void(!$.adapterInfo.isArchitecture("ampere")&&Z&&j[1].dims[0]===O.group&&j[1].dims[1]===1&&O.dilations[0]===1&&O.dilations[1]===1?$.compute(zk(W,O,V,G),{inputs:W}):$.compute(yk(W,O,V,G),{inputs:W}))}let N=j.length===3,J=j[0].dims[Z?1:2],R=j[0].dims[Z?2:3],U=j[0].dims[Z?3:1],H=j[1].dims[2],L=j[1].dims[3],Y=V[Z?1:2],S=V[Z?2:3],X=V[Z?3:1],D=Z&&H===J&&L===R&&O.pads[0]===0&&O.pads[1]===0;if(D||H===1&&L===1&&O.dilations[0]===1&&O.dilations[1]===1&&O.strides[0]===1&&O.strides[1]===1&&O.pads[0]===0&&O.pads[1]===0){let W,E,Q,A=V[0],l=[];if(Z){let V0=$.kernelCustomData.wT??$.compute(X2(j[1],oq),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];if(O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=V0),D){let v0=J*R*U;W=j[0].reshape([1,A,v0]),E=V0.reshape([1,v0,X]),Q=[1,A,X]}else W=j[0].reshape([A,J*R,U]),E=V0.reshape([1,U,X]),Q=[A,Y*S,X];l.push(W),l.push(E)}else W=j[0].reshape([A,U,J*R]),E=j[1].reshape([1,X,U]),Q=[A,X,Y*S],l.push(E),l.push(W);N&&l.push(j[2]);let r=Q[2],e=l[0].dims[l[0].dims.length-1];return void(r<8&&e<8?$.compute(UR(l,O,V,Q,Z,G),{inputs:l}):$.compute(YV(l,O,V,Q,Z,G),{inputs:l}))}let I=$.kernelCustomData.wT??$.compute(X2(j[1],oq),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=I);let k=[j[0],I];N&&k.push(j[2]);let z=Z?Y*S:X,w=Z?X:Y*S,T=H*L*U;$.compute(Xk(k,O,V,z,w,T,N,!0,G),{inputs:k})},bY=($,j)=>{let O=j.format==="NHWC",G=[$.inputs[0].reshape(O?[$.inputs[0].dims[0],1,$.inputs[0].dims[1],$.inputs[0].dims[2]]:[$.inputs[0].dims[0],$.inputs[0].dims[1],1,$.inputs[0].dims[2]]),$.inputs[1].reshape([$.inputs[1].dims[0],$.inputs[1].dims[1],1,$.inputs[1].dims[2]])];$.inputs.length===3&&G.push($.inputs[2]);let Z=[0,j.pads[0],0,j.pads[1]],V=[1].concat(j.strides),N=[1].concat(j.dilations),J=[1].concat(j.kernelShape),R=sq({...j,pads:Z,strides:V,dilations:N,kernelShape:J},G);xJ($,G,R,(U)=>O?[U[0],U[2],U[3]]:[U[0],U[1],U[3]])},fY=($,j,O)=>{let G=O.format==="NHWC"?"channelsLast":"channelsFirst",Z=sq(O,j),V=O.autoPad==="NOTSET"?O.pads:O.autoPad,N=Tk(j[0].dims,j[1].dims,O.strides,O.dilations,V,!1,G);$.compute(Fk(j,Z,N.outShape,[N.filterDepth,N.filterHeight,N.filterWidth],[N.padInfo.front,N.padInfo.top,N.padInfo.left],G))},Fv=($,j)=>{if(KY($.inputs,j),$.inputs[0].dims.length===3)bY($,j);else if($.inputs[0].dims.length===5)fY($,$.inputs,j);else{let O=sq(j,$.inputs);xJ($,$.inputs,O)}}}),cM=I5(()=>{Y6(),I4(),D6(),M6(),kk=($,j,O)=>{let G=$.length>2,Z=j.outputShape,V=j.format==="NHWC",N=j.group,J=$[1].dims,R=J[2]/N,U=J[3],H=V?K9(R):1,L=V&&U===1&&R>=4,Y=L?4*Math.floor(R/4):Math.floor(R/H)*H,S=R-Y,X=V?K9(U):1,D=V?U===1?H:X:1,I=l0.size(Z)/X,k=[Math.ceil(I/64),1,1];l6("verbose",()=>`[conv2d_backprop_webgpu] dispatch = ${k}`);let z=["rank","rank"],w=[j.strides[0],j.strides[1]],T=[j.kernelShape[V?1:2],j.kernelShape[V?2:3]],W=[j.dilations[0],j.dilations[1]],E=[T[0]+(j.dilations[0]<=1?0:(j.kernelShape[V?1:2]-1)*(j.dilations[0]-1)),T[1]+(j.dilations[1]<=1?0:(j.kernelShape[V?2:3]-1)*(j.dilations[1]-1))],Q=[E[0]-1-Math.floor((j.pads[0]+j.pads[2])/2),E[1]-1-Math.floor((j.pads[1]+j.pads[3])/2)],A=[{type:12,data:I},{type:12,data:w},{type:12,data:T},{type:12,data:W},{type:12,data:E},{type:6,data:Q},{type:12,data:Y},{type:12,data:R},{type:12,data:U},...j6($[0].dims,$[1].dims)];return G&&(A.push(...j6($[2].dims)),z.push("rank")),A.push(...j6(Z)),{name:"ConvTranspose2D",shaderCache:{hint:`${j.cacheKey};${H}${D}${X}${L}${S}`,inputDependencies:z},getRunData:()=>({dispatchGroup:{x:k[0],y:k[1],z:k[2]},outputs:[{dims:O?O(Z):Z,dataType:$[0].dataType}],programUniforms:A}),getShaderSource:(l)=>{let r=[{name:"output_size",type:"u32"},{name:"strides",type:"u32",length:w.length},{name:"filter_dims",type:"u32",length:T.length},{name:"dilations",type:"u32",length:T.length},{name:"effective_filter_dims",type:"u32",length:E.length},{name:"pads",type:"i32",length:Q.length},{name:"input_channels_per_group_int",type:"u32"},{name:"input_channels_per_group",type:"u32"},{name:"output_channels_per_group",type:"u32"}],e=Z1($[0].dataType),V0=V?1:2,v0=V?2:3,$0=V?3:1,i=O5("W",$[1].dataType,$[1].dims.length,D),G0=O5("Dy",$[0].dataType,$[0].dims.length,H),S0=[G0,i];G&&S0.push(O5("bias",$[2].dataType,[Z[$0]].length,X));let F0=t5("result",$[0].dataType,Z.length,X),s=` + let outputIndices = ${F0.offsetToIndices(`global_idx * ${X}`)}; + let batch = ${F0.indicesGet("outputIndices",0)}; + let d1 = ${F0.indicesGet("outputIndices",$0)}; + let r = ${F0.indicesGet("outputIndices",V0)}; + let c = ${F0.indicesGet("outputIndices",v0)}; + let dyCorner = vec2(i32(r), i32(c)) - uniforms.pads; + let dyRCorner = dyCorner.x; + let dyCCorner = dyCorner.y; + let groupId = d1 / uniforms.output_channels_per_group; + let wOutChannel = d1 - groupId * uniforms.output_channels_per_group; + // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1). + // ? = to be determined. : = across all values in that axis. + var dotProd = ${F0.type.value}(0.0); + var wR: u32 = 0; + if (uniforms.dilations.x == 1) { + // Minimum wR >= 0 that satisfies (dyRCorner + wR) % (uniforms.strides.x) == 0 + wR = u32(((dyRCorner + i32(uniforms.strides.x) - 1) / i32(uniforms.strides.x)) * i32(uniforms.strides.x) - dyRCorner); + } + for (; wR < uniforms.effective_filter_dims.x; wR = wR + 1) { + if (wR % uniforms.dilations.x != 0) { + continue; + } + let dyR = (${e}(dyRCorner) + ${e}(wR)) / ${e}(uniforms.strides[0]); + let wRPerm = uniforms.filter_dims.x - 1 - wR / uniforms.dilations.x; + if (dyR < 0.0 || dyR >= ${e}(uniforms.Dy_shape[${V0}]) || fract(dyR) > 0.0 || + wRPerm < 0) { + continue; + } + let idyR: u32 = u32(dyR); + var wC: u32 = 0; + if (uniforms.dilations.y == 1) { + // Minimum wC >= 0 that satisfies (dyCCorner + wC) % (uniforms.strides.y) == 0 + wC = u32(((dyCCorner + i32(uniforms.strides.y) - 1) / i32(uniforms.strides.y)) * i32(uniforms.strides.y) - dyCCorner); + } + for (; wC < uniforms.effective_filter_dims.y; wC = wC + 1) { + if (wC % uniforms.dilations.y != 0) { + continue; + } + let dyC = (${e}(dyCCorner) + ${e}(wC)) / ${e}(uniforms.strides.y); + let wCPerm = uniforms.filter_dims.y - 1 - wC / uniforms.dilations.y; + if (dyC < 0.0 || dyC >= ${e}(uniforms.Dy_shape[${v0}]) || + fract(dyC) > 0.0 || wCPerm < 0) { + continue; + } + let idyC: u32 = u32(dyC); + var inputChannel = groupId * uniforms.input_channels_per_group; + ${L?` + var x_offset = ${G0.indicesToOffset(`${G0.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${H}; + var w_offset = ${i.indicesToOffset(`${i.type.indices}(wRPerm, wCPerm, inputChannel, wOutChannel)`)} / ${D}; + `:""} + for (var d2: u32 = 0; d2 < uniforms.input_channels_per_group_int; d2 = d2 + ${L?4:H}) { + ${(()=>{let n="";if(L)H===4?n+=` + let xValue = ${G0.getByOffset("x_offset")}; + let wValue = ${i.getByOffset("w_offset")}; + dotProd = dotProd + dot(xValue, wValue); + x_offset += 1u; + w_offset += 1u;`:H===2?n+=` + dotProd = dotProd + dot(vec4<${e}>(${G0.getByOffset("x_offset")}, ${G0.getByOffset("x_offset + 1u")}), vec4<${e}>(${i.getByOffset("w_offset")}, ${i.getByOffset("w_offset + 1u")})); + x_offset += 2u; + w_offset += 2u;`:H===1&&(n+=` + dotProd = dotProd + dot(vec4<${e}>(${G0.getByOffset("x_offset")}, ${G0.getByOffset("x_offset + 1u")}, ${G0.getByOffset("x_offset + 2u")}, ${G0.getByOffset("x_offset + 3u")}), vec4<${e}>(${i.getByOffset("w_offset")}, ${i.getByOffset("w_offset + 1u")}, ${i.getByOffset("w_offset + 2u")}, ${i.getByOffset("w_offset + 3u")})); + x_offset += 4u; + w_offset += 4u;`);else if(n+=` + let xValue = ${V?G0.getByOffset(`${G0.indicesToOffset(`${G0.type.indices}(batch, idyR, idyC, inputChannel)`)} / ${H}`):G0.get("batch","inputChannel","idyR","idyC")}; + `,H===1)n+=` + let w_offset = ${i.indicesToOffset(`${i.type.indices}(u32(wRPerm), u32(wCPerm), inputChannel, wOutChannel)`)}; + let wValue = ${i.getByOffset(`w_offset / ${D}`)}; + dotProd = dotProd + xValue * wValue;`;else for(let R0=0;R0{if(S===0)return"";if(!L)throw Error(`packInputAs4 ${L} is not true.`);let n="";if(H===1){n+="dotProd = dotProd";for(let R0=0;R0{cM(),Z$(),v7(),wY=($,j,O,G,Z,V)=>($-1)*j+O+(G-1)*Z+1-V,EY=($,j,O,G,Z)=>{let V=Math.floor($/2);j==="SAME_UPPER"?(O[G]=V,O[Z]=$-V):j==="SAME_LOWER"&&(O[G]=$-V,O[Z]=V)},QY=($,j,O,G,Z,V,N,J,R,U)=>{let H=$.length-2,L=U.length===0;R.length{let O=$.kernelShape.slice();if($.kernelShape.length===0||$.kernelShape.reduce((L,Y)=>L*Y,1)===0){O.length=0;for(let L=2;LL+Y,0)===0){let L=j[0].dims.length-2;R=Array(L).fill(1)}let U=$.strides.slice();if(U.reduce((L,Y)=>L+Y,0)===0){let L=j[0].dims.length-2;U=Array(L).fill(1)}QY(J,O,R,$.autoPad,$.group,Z,U,G,N,V);let H=Object.assign({},$);return Object.assign(H,{kernelShape:O,pads:Z,outputPadding:N,outputShape:V,dilations:R,strides:U}),H},Ik=($)=>{let j=RR($),O=$.format,G=["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][typeof $.autoPad>"u"?0:$.autoPad],Z=$.dilations,V=$.group,N=$.kernelShape,J=$.pads,R=$.strides,U=$.wIsConst();return{autoPad:G,format:O,dilations:Z,group:V,kernelShape:N,outputPadding:$.outputPadding,outputShape:$.outputShape,pads:J,strides:R,wIsConst:U,...j,cacheKey:`${$.format};${j.activation};`}},CY=($,j)=>{if(!$||$.length!==2&&$.length!==3)throw Error("Conv requires 2 or 3 inputs");if($[0].dims.length!==4&&$[0].dims.length!==3)throw Error("currently only support 2-dimensional conv");if($[0].dims.length!==$[1].dims.length)throw Error("filter does not have same dimension as input");if($[0].dims[j.format==="NHWC"?$[0].dims.length-1:1]!==$[1].dims[0])throw Error("FILTER_IN_CHANNEL should be equal to DATA_CHANNEL");let O=$[1].dims[1]*j.group;if($.length===3&&($[2].dims.length!==1||$[2].dims[0]!==O))throw Error("invalid bias");let G=$[0].dims.length-2;if(j.dilations.reduce((Z,V)=>Z+V,0)>0&&j.dilations.length!==G)throw Error(`dilations should be ${G}D`);if(j.strides.reduce((Z,V)=>Z+V,0)>0&&j.strides.length!==G)throw Error(`strides should be ${G}D`);if(j.pads.reduce((Z,V)=>Z+V,0)>0&&j.pads.length!==2*G)throw Error(`pads should be ${2*G}D`);if(j.outputPadding.length!==G&&j.outputPadding.length!==0)throw Error(`output_padding should be ${G}D`);if(j.kernelShape.reduce((Z,V)=>Z+V,0)>0&&j.kernelShape.length!==0&&j.kernelShape.length!==$[1].dims.length-2)throw Error("invalid kernel shape");if(j.outputShape.length!==0&&j.outputShape.length!==$[0].dims.length-2)throw Error("invalid output shape")},_J=($,j,O,G)=>{let Z=$.kernelCustomData.wT??$.compute(X2(j[1],[2,3,0,1]),{inputs:[1],outputs:[O.wIsConst?-2:-1]})[0];O.wIsConst&&!$.kernelCustomData.wT&&($.kernelCustomData.wT=Z);let V=[j[0],Z];j.length===3&&V.push(j[2]),$.compute(kk(V,O,G),{inputs:V})},BY=($,j)=>{let O=j.format==="NHWC",G=[$.inputs[0].reshape(O?[$.inputs[0].dims[0],1,$.inputs[0].dims[1],$.inputs[0].dims[2]]:[$.inputs[0].dims[0],$.inputs[0].dims[1],1,$.inputs[0].dims[2]]),$.inputs[1].reshape([$.inputs[1].dims[0],$.inputs[1].dims[1],1,$.inputs[1].dims[2]])];$.inputs.length===3&&G.push($.inputs[2]);let Z=j.kernelShape;(Z.length===0||Z[0]===0)&&(Z=[$.inputs[1].dims[2]]);let V=j.dilations;(V.length===0||V[0]===0)&&(V=[1]);let N=j.strides;(N.length===0||N[0]===0)&&(N=[1]);let J=j.pads;J.length===0&&(J=[0,0]),J=[0,J[0],0,J[1]],N=[1].concat(N),V=[1].concat(V),Z=[1].concat(Z);let R=j.outputPadding;R=[0].concat(R);let U=LJ({...j,pads:J,strides:N,dilations:V,kernelShape:Z,outputPadding:R},G);_J($,G,U,(H)=>O?[H[0],H[2],H[3]]:[H[0],H[1],H[3]])},Dk=($,j)=>{if(CY($.inputs,j),$.inputs[0].dims.length===3)BY($,j);else{let O=LJ(j,$.inputs);_J($,$.inputs,O)}}}),pM=I5(()=>{Y6(),D6(),B9(),M6(),hY=($,j,O,G)=>{let Z=l0.size(j),V=j.length,N=O5("input",$,V),J=t5("output",$,V),R=O.dataType===6?O.getInt32Array()[0]:Number(O.getBigInt64Array()[0]),U=l0.normalizeAxis(R,V);return{name:"CumSum",shaderCache:{hint:G.cacheKey,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:j,dataType:$}],dispatchGroup:{x:Math.ceil(Z/64)},programUniforms:[{type:12,data:Z},{type:12,data:U},...j6(j,j)]}),getShaderSource:(H)=>{let L=` i32(${N.indicesGet("inputIndices","uniforms.axis")}) `,Y=R6("uniforms.input_shape","uniforms.axis",V),S=G.reverse?L+(G.exclusive?" + 1":""):"0",X=G.reverse?Y:L+(G.exclusive?"":" + 1");return` + ${H.registerUniform("outputSize","u32").registerUniform("axis","u32").declareVariables(N,J)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var inputIndices = ${J.offsetToIndices("global_idx")}; + var sum = ${J.type.value}(0); + let first : i32 = ${S}; + let last : i32 = ${X}; + for (var i : i32 = first; i < last; i++) { + ${N.indicesSet("inputIndices","uniforms.axis","u32(i)")}; + sum = sum + ${N.getByIndices("inputIndices")}; + } + ${J.setByOffset("global_idx","sum")}; + }`}}},Wk=($,j)=>{let O=$.inputs[0].dims,G=$.inputs[0].dataType,Z=$.inputs[1];$.compute(hY(G,O,Z,j),{inputs:[0]})},Mk=($)=>{let j=$.exclusive===1,O=$.reverse===1;return j9({exclusive:j,reverse:O})}}),AM=I5(()=>{Y6(),D6(),B9(),M6(),cY=($)=>{if(!$||$.length!==1)throw Error("DepthToSpace requires 1 input.");if($[0].dims.length!==4)throw Error("DepthToSpace requires 4D input.")},mY=($,j,O,G)=>{let Z=[];Z.push(`fn perm(i: ${G.type.indices}) -> ${O.type.indices} { + var a: ${O.type.indices};`);for(let V=0;V{let O,G,Z,V,N,J,R=j.format==="NHWC",U=j.blocksize,H=j.mode==="DCR";R?([O,G,Z,V]=$.dims,N=H?[O,G,Z,U,U,V/U**2]:[O,G,Z,V/U**2,U,U],J=H?[0,1,3,2,4,5]:[0,1,4,2,5,3]):([O,G,Z,V]=[$.dims[0],$.dims[2],$.dims[3],$.dims[1]],N=H?[O,U,U,V/U**2,G,Z]:[O,V/U**2,U,U,G,Z],J=H?[0,3,4,1,5,2]:[0,1,4,2,5,3]);let L=$.reshape(N),Y=L.dims.length,S=$.dataType,X=O5("a",S,Y),D=t5("output",S,Y);return{name:"DepthToSpace",shaderCache:{hint:`${$.dims};${j.blocksize};${j.mode}`,inputDependencies:["rank"]},getRunData:(I)=>{let k=R?[O,G*U,Z*U,V/U**2]:[O,V/U**2,G*U,Z*U],z=l0.size(k),w=L.dims,T=l0.sortBasedOnPerm(w,J);return{outputs:[{dims:k,dataType:I[0].dataType}],dispatchGroup:{x:Math.ceil(z/64)},programUniforms:[{type:12,data:z},...j6(w,T)]}},getShaderSource:(I)=>` + ${I.registerUniform("output_size","u32").declareVariables(X,D)} + + ${mY(J,Y,X,D)} + + ${I.mainStart()} + ${I.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${D.offsetToIndices("global_idx")}; + let aIndices = perm(indices); + + ${D.setByOffset("global_idx",X.getByIndices("aIndices"))} + }`}},Kk=($,j)=>{cY($.inputs),$.compute(pY($.inputs[0],j))},bk=($)=>j9({blocksize:$.blocksize,mode:$.mode,format:$.format})}),gM=I5(()=>{Y6(),D6(),B9(),M6(),SJ="^"+(iq="("+(YJ="[a-zA-Z]|\\.\\.\\.")+")+")+"$",AY="^"+("("+iq+",)*"+iq)+"$",gY=class{constructor($=-1){this.symbolToIndices=new Map,this.inputIndex=$}addSymbol($,j){let O=this.symbolToIndices.get($);O===void 0?O=[j]:O.push(j),this.symbolToIndices.set($,O)}},uY=class{constructor($,j){this.equation=j,this.hasEllipsis=!1,this.symbolToInfo=new Map,this.lhs=[],this.outputDims=[];let[O,G]=j.includes("->")?j.split("->",2):[j,""];if(!O.match(RegExp(AY)))throw Error("Invalid LHS term");if(O.split(",").forEach((Z,V)=>{let N=$[V].dims.slice();if(!Z.match(RegExp(SJ)))throw Error("Invalid LHS term");let J=this.processTerm(Z,!0,N,V);this.lhs.push(J)}),G==="")G+=[...this.symbolToInfo.entries()].filter(([Z,V])=>V.count===1||Z==="...").map(([Z])=>Z).join("");else if(!G.match(RegExp(iq)))throw Error("Invalid RHS");G.match(RegExp(YJ,"g"))?.forEach((Z)=>{if(Z==="...")this.outputDims=this.outputDims.concat(this.ellipsisDims);else{let V=this.symbolToInfo.get(Z);if(V===void 0)throw Error("Invalid RHS symbol");this.outputDims.push(V.dimValue)}}),this.rhs=this.processTerm(G,!1,this.outputDims)}addSymbol($,j,O){let G=this.symbolToInfo.get($);if(G!==void 0){if(G.dimValue!==j&&G.count!==1)throw Error("Dimension mismatch");G.count++,G.inputIndices.push(O)}else G={count:1,dimValue:j,inputIndices:[O]};this.symbolToInfo.set($,G)}processTerm($,j,O,G=-1){let Z=O.length,V=!1,N=[],J=0;if(!$.match(RegExp(SJ))&&!j&&$!=="")throw Error("Invalid LHS term");let R=$.match(RegExp(YJ,"g")),U=new gY(G);return R?.forEach((H,L)=>{if(H==="..."){if(V)throw Error("Only one ellipsis is allowed per input term");V=!0;let Y=Z-R.length+1;if(Y<0)throw Error("Ellipsis out of bounds");if(N=O.slice(J,J+Y),this.hasEllipsis){if(this.ellipsisDims.length!==N.length||this.ellipsisDims.toString()!==N.toString())throw Error("Ellipsis dimensions mismatch")}else{if(!j)throw Error("Ellipsis must be specified in the LHS");this.hasEllipsis=!0,this.ellipsisDims=N}for(let S=0;S$+"_max",dY=($,j,O,G)=>{let Z=$.map((R)=>R.length).map((R,U)=>O5(`input${U}`,j,R)),V=l0.size(G),N=t5("output",j,G.length),J=[...O.symbolToInfo.keys()].filter((R)=>!O.rhs.symbolToIndices.has(R));return{name:"Einsum",shaderCache:{hint:O.equation,inputDependencies:$.map(()=>"rank")},getRunData:()=>{let R=J.filter((H)=>O.symbolToInfo.has(H)).map((H)=>({type:12,data:O.symbolToInfo.get(H)?.dimValue||0}));R.push({type:12,data:V});let U=$.map((H,L)=>[...j6(H)]).reduce((H,L)=>H.concat(L),R);return U.push(...j6(G)),{outputs:[{dims:G,dataType:j}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:U}},getShaderSource:(R)=>{let U=[],H=[],L=[],Y=[],S=[],X=O.symbolToInfo.size===O.rhs.symbolToIndices.size;O.symbolToInfo.forEach((I,k)=>{if(O.rhs.symbolToIndices.has(k)){let z=O.rhs.symbolToIndices.get(k)?.[0];z!==void 0&&O.lhs.forEach((w,T)=>{if(I.inputIndices.includes(T)){let W=w.symbolToIndices.get(k);if(W===void 0)throw Error("Invalid symbol error");W.forEach((E)=>{U.push(`${Z[T].indicesSet(`input${T}Indices`,E,N.indicesGet("outputIndices",z))}`)})}})}else O.lhs.forEach((z,w)=>{if(I.inputIndices.includes(w)){let T=z.symbolToIndices.get(k);if(T===void 0)throw Error("Invalid symbol error");T.forEach((W)=>{H.push(`${Z[w].indicesSet(`input${w}Indices`,W,`${k}`)}`)}),S.push(`prod *= ${Z[w].getByIndices(`input${w}Indices`)};`)}}),L.push(`for(var ${k}: u32 = 0; ${k} < uniforms.${PJ(k)}; ${k}++) {`),Y.push("}")});let D=X?[...U,`let sum = ${Z.map((I,k)=>I.getByIndices(`input${k}Indices`)).join(" * ")};`]:[...U,"var sum = 0.0;",...L,...H,"var prod = 1.0;",...S,"sum += prod;",...Y];return` + ${R.registerUniforms(J.map((I)=>({name:`${PJ(I)}`,type:"u32"}))).registerUniform("outputSize","u32").declareVariables(...Z,N)} + + ${R.mainStart()} + ${R.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + var outputIndices = ${N.offsetToIndices("global_idx")}; + ${Z.map((I,k)=>`var input${k}Indices: ${Z[k].type.indices};`).join(` +`)} + ${D.join(` +`)}; + ${N.setByOffset("global_idx","sum")}; + }`}}},fk=($,j)=>{let O=new uY($.inputs,j.equation),G=O.outputDims,Z=$.inputs.map((V,N)=>V.dims);$.compute(dY(Z,$.inputs[0].dataType,O,G))},wk=($)=>{let j=$.equation.replace(/\s+/g,"");return j9({equation:j})}}),uM=I5(()=>{Y6(),D6(),M6(),lY=($)=>{if(!$||$.length!==2)throw Error("Expand requires 2 input.");let j=$[0].dims,O=Array.from($[1].getBigInt64Array(),Number),G=O.length{let O=$.length-j.length,G=[];for(let Z=0;Z$.length>j.length?XJ($,j):XJ(j,$),sY=($)=>{let j=$[0].dims,O=Array.from($[1].getBigInt64Array(),Number),G=oY(j,O),Z=$[0].dataType,V=Z===9||l0.size(j)===1,N=Z===9||j.length>0&&j[j.length-1]%4==0?4:1,J=V||G.length>0&&G[G.length-1]%4==0?4:1,R=Math.ceil(l0.size(G)/J),U=[{type:12,data:R},...j6(j,G)];return{name:"Expand",shaderCache:{hint:`${G.length};${N}${J}`,inputDependencies:["rank"]},getShaderSource:(H)=>{let L,Y=O5("input",Z,j.length,N),S=t5("output",Z,G.length,J);if(Z===9){let X=(D,I,k="")=>` + let outputIndices${I} = ${S.offsetToIndices(`outputOffset + ${I}u`)}; + let offset${I} = ${Y.broadcastedIndicesToOffset(`outputIndices${I}`,S)}; + let index${I} = offset${I} / 4u; + let component${I} = offset${I} % 4u; + ${D}[${I}] = ${k}(${Y.getByOffset(`index${I}`)}[component${I}]); + `;L=` + let outputOffset = global_idx * ${J}; + var data = vec4(0); + ${X("data",0,"u32")} + ${X("data",1,"u32")} + ${X("data",2,"u32")} + ${X("data",3,"u32")} + ${S.setByOffset("global_idx","data")} + }`}else L=` + let outputIndices = ${S.offsetToIndices(`global_idx * ${J}`)}; + let inputOffset = ${Y.broadcastedIndicesToOffset("outputIndices",S)}; + let data = ${S.type.value}(${Y.getByOffset(`inputOffset / ${N}`)}); + ${S.setByOffset("global_idx","data")} + }`;return` + ${H.registerUniform("vec_size","u32").declareVariables(Y,S)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${L}`},getRunData:()=>({outputs:[{dims:G,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:U})}},Ek=($)=>{lY($.inputs),$.compute(sY($.inputs),{inputs:[0]})}}),dM=I5(()=>{Y6(),D6(),M6(),SR(),iY=($)=>{let j=$[0].dataType,O=l0.size($[0].dims),G=l0.size($[1].dims),Z=G%4==0;return{name:"FastGeluWithBias",shaderCache:{hint:`${Z}`,inputDependencies:["type","type"]},getShaderSource:(V)=>{let N=O5("x",j,[1],4),J=O5("bias",j,[1],4),R=t5("y",j,[1],4),U=(L)=>` + let bias${L}_offset: u32 = (global_idx * 4 + ${L}) % uniforms.bias_size; + let bias${L} = ${J.getByOffset(`bias${L}_offset / 4`)}[bias${L}_offset % 4];`,H=Z?` + let bias = ${J.getByOffset("global_idx % (uniforms.bias_size / 4)")};`:`${U(0)}${U(1)}${U(2)}${U(3)} + let bias = ${N.type.value}(bias0, bias1, bias2, bias3);`;return`${V.registerUniforms([{name:"output_vec_size",type:"u32"},{name:"bias_size",type:"u32"}]).declareVariables(N,J,R)} + + ${Yv(k1(j))} + + ${V.mainStart(DG)} + ${V.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_vec_size")} + + let x = ${N.getByOffset("global_idx")}; + ${H} + let x_in = x + bias; + ${R.setByOffset("global_idx",Sv("x_in"))} + }`},getRunData:(V)=>({outputs:[{dims:V[0].dims,dataType:V[0].dataType}],programUniforms:[{type:12,data:Math.ceil(O/4)},{type:12,data:G}],dispatchGroup:{x:Math.ceil(O/DG/4)}})}},Qk=($)=>{$.inputs.length<2||l0.size($.inputs[1].dims)===0?$k($):$.compute(iY($.inputs))}}),lM=I5(()=>{Y6(),D6(),B9(),M6(),aY=($)=>{if(!$||$.length!==2)throw Error("Gather requires 2 inputs.")},rY=($,j)=>{let O=$[0].dims,G=$[1].dims,Z=O.length,V=l0.normalizeAxis(j.axis,Z),N=O.slice(0);N.splice(V,1,...G);let J=O[V],R=$[0].dataType===9?4:1,U=Math.ceil(l0.size(N)/R),H=[{type:12,data:U},{type:6,data:J},{type:12,data:V},...j6($[0].dims,$[1].dims,N)];return{name:"Gather",shaderCache:{hint:j.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:N,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(U/64)},programUniforms:H}),getShaderSource:(L)=>{let Y,S=O5("data",$[0].dataType,$[0].dims.length,R),X=O5("inputIndices",$[1].dataType,$[1].dims.length),D=t5("output",$[0].dataType,N.length,R),I=(k)=>{let z=G.length,w=`var indicesIndices${k} = ${X.type.indices}(0);`;for(let T=0;T1?`indicesIndices${k}[${T}]`:`indicesIndices${k}`} = ${N.length>1?`outputIndices${k}[uniforms.axis + ${T}]`:`outputIndices${k}`};`;w+=` + var idx${k} = ${X.getByIndices(`indicesIndices${k}`)}; + if (idx${k} < 0) { + idx${k} = idx${k} + uniforms.axisDimLimit; + } + var dataIndices${k} : ${S.type.indices}; + `;for(let T=0,W=0;T1?`dataIndices${k}[${T}]`:`dataIndices${k}`} = u32(idx${k});`,W+=z):(w+=`${Z>1?`dataIndices${k}[${T}]`:`dataIndices${k}`} = ${N.length>1?`outputIndices${k}[${W}]`:`outputIndices${k}`};`,W++);return w};if($[0].dataType===9){let k=(z,w,T="")=>` + let outputIndices${w} = ${D.offsetToIndices(`outputOffset + ${w}u`)}; + ${I(w)}; + let offset${w} = ${S.indicesToOffset(`dataIndices${w}`)}; + let index${w} = offset${w} / 4u; + let component${w} = offset${w} % 4u; + ${z}[${w}] = ${T}(${S.getByOffset(`index${w}`)}[component${w}]); + `;Y=` + let outputOffset = global_idx * ${R}; + var value = vec4(0); + ${k("value",0,"u32")} + ${k("value",1,"u32")} + ${k("value",2,"u32")} + ${k("value",3,"u32")} + ${D.setByOffset("global_idx","value")} + `}else Y=` + let outputIndices = ${D.offsetToIndices("global_idx")}; + ${I("")}; + let value = ${S.getByIndices("dataIndices")}; + ${D.setByOffset("global_idx","value")}; + `;return` + ${L.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(S,X,D)} + ${L.mainStart()} + ${L.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + ${Y} + }`}}},Ck=($)=>j9({axis:$.axis}),Bk=($,j)=>{let O=$.inputs;aY(O),$.compute(rY($.inputs,j))}}),oM=I5(()=>{Y6(),D6(),M6(),nY=($,j,O,G,Z,V,N,J,R)=>{let U=[{type:12,data:V},{type:12,data:G},{type:12,data:Z},{type:12,data:O},{type:12,data:N},{type:12,data:J},{type:12,data:R}],H=[V];return U.push(...j6(j.dims,H)),$.compute({name:"computeSliceOffsets",shaderCache:{hint:`${Z.length}_${O.length}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:H,dataType:$.inputs[1].dataType}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:U}),getShaderSource:(L)=>{let Y=[O5("indices_data",j.dataType,j.dims.length),t5("input_slice_offsets_data",12,1,1)],S=[{name:"output_size",type:"u32"},{name:"batch_dims",type:"u32"},{name:"input_dims",type:"u32",length:Z.length},{name:"sizes_from_slice_dims_data",type:"u32",length:O.length},{name:"num_slices_per_batch",type:"u32"},{name:"input_batch_stride",type:"u32"},{name:"num_slice_dims",type:"u32"}];return` + ${L.registerUniforms(S).declareVariables(...Y)} + ${L.mainStart()} + ${L.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let batch_idx = global_idx / uniforms.num_slices_per_batch; + let base_offset = batch_idx * uniforms.input_batch_stride; + + let slice_indices_base_offset = global_idx * uniforms.num_slice_dims; + var relative_slice_offset = 0; + for (var dim_idx = 0u; dim_idx < uniforms.num_slice_dims; dim_idx ++) { + var index = i32(indices_data[dim_idx + slice_indices_base_offset].x); + let input_dim_idx = uniforms.batch_dims + dim_idx; + if (index < 0) { + ${Z.length===1?"index += i32(uniforms.input_dims);":"index += i32(uniforms.input_dims[input_dim_idx]);"} + } + ${O.length===1?"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data);":"relative_slice_offset += index * i32(uniforms.sizes_from_slice_dims_data[dim_idx]);"} + } + + input_slice_offsets_data[global_idx] = base_offset + u32(relative_slice_offset); + }`}},{inputs:[j],outputs:[-1]})[0]},hk=($,j)=>{let O=$.inputs,G=O[0].dims,Z=O[0].dataType,V=O[1].dims,N=V[V.length-1],J=l0.sizeToDimension(V,V.length-1),R=l0.sizeFromDimension(G,j.batchDims+N),U=l0.sizeToDimension(G,j.batchDims),H=l0.sizeFromDimension(G,j.batchDims),L=J/U,Y=Array(N),S=R;for(let w=0;wG.length)throw Error("last dimension of indices must not be larger than rank of input tensor");let I=V.slice(0,-1).concat(G.slice(D)),k=l0.size(I),z=[{type:12,data:k},{type:12,data:R},...j6(O[0].dims,X.dims,I)];$.compute({name:"GatherND",shaderCache:{hint:j.cacheKey,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:I,dataType:Z}],dispatchGroup:{x:Math.ceil(k/64)},programUniforms:z}),getShaderSource:(w)=>{let T=O5("data",O[0].dataType,O[0].dims.length),W=O5("slice_offsets",12,X.dims.length),E=t5("output",O[0].dataType,I.length);return` + ${w.registerUniform("output_size","u32").registerUniform("slice_size","u32").declareVariables(T,W,E)} + ${w.mainStart()} + ${w.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let slice_offset = slice_offsets[global_idx / uniforms.slice_size]; + output[global_idx] = data[u32(slice_offset) + global_idx % uniforms.slice_size]; + }`}},{inputs:[O[0],X]})},ck=($)=>({batchDims:$.batch_dims,cacheKey:""})}),sM=I5(()=>{Y6(),D6(),B9(),M6(),tY=($,j)=>{if($.length<3||$.length>4)throw Error("GatherBlockQuantized requires 3 or 4 inputs.");let O=l0.normalizeAxis(j.quantizeAxis,$[0].dims.length),G=j.blockSize,Z=$[0],V=$[2],N=$.length===4?$[3]:void 0;if(V.dims.length!==Z.dims.length||!Z.dims.map((J,R)=>R===O?Math.ceil(J/G)===V.dims[R]:J===V.dims[R]).reduce((J,R)=>J&&R,!0))throw Error("Scales must have the same rank as the input tensor and the dims should match except on gatherAxis.");if(N){if(N.dataType!==Z.dataType)throw Error("Zero point must have the same data type as the input tensor.");if(N.dims.length!==V.dims.length||!N.dims.map((J,R)=>J===V.dims[R]).reduce((J,R)=>J&&R,!0))throw Error("Zero point must have the same rank as the input tensor and the dims should match except on quantizeAxis.")}},eY=($,j)=>{let O=$[0].dims,G=$[1].dims,Z=O.length,V=l0.normalizeAxis(j.gatherAxis,Z),N=l0.normalizeAxis(j.quantizeAxis,Z),J=O.slice(0);J.splice(V,1,...G);let R=l0.size(J),U=$[2].dataType,H=$[0].dataType===22,L=[{type:12,data:R},{type:12,data:N},{type:12,data:V},{type:12,data:j.blockSize},...j6(...$.map((Y,S)=>Y.dims),J)];return{name:"GatherBlockQuantized",shaderCache:{hint:`${j.cacheKey};${$.filter((Y,S)=>S!==1).map((Y)=>Y.dims.join("_")).join(";")}`,inputDependencies:Array.from({length:$.length},(Y,S)=>"rank")},getRunData:()=>({outputs:[{dims:J,dataType:U}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:L}),getShaderSource:(Y)=>{let S=O5("data",$[0].dataType,$[0].dims.length),X=O5("inputIndices",$[1].dataType,$[1].dims.length),D=O5("scales",$[2].dataType,$[2].dims.length),I=$.length>3?O5("zeroPoint",$[3].dataType,$[3].dims.length):void 0,k=t5("output",U,J.length),z=[S,X,D];return I&&z.push(I),` + ${Y.registerUniforms([{name:"output_size",type:"u32"},{name:"quantize_axis",type:"u32"},{name:"gather_axis",type:"u32"},{name:"block_size",type:"u32"}]).declareVariables(...z,k)} + ${Y.mainStart()} + let output_indices = ${k.offsetToIndices("global_idx")}; + var indices_indices = ${X.type.indices}(0); + ${G.length>1?` + for (var i: u32 = 0; i < ${G.length}; i++) { + let index = ${k.indicesGet("output_indices","uniforms.gather_axis + i")}; + ${X.indicesSet("indices_indices","i","index")}; + }`:`indices_indices = ${k.indicesGet("output_indices","uniforms.gather_axis")};`}; + var data_indices = ${S.type.indices}(0); + for (var i: u32 = 0; i < uniforms.gather_axis; i++) { + let index = ${k.indicesGet("output_indices","i")}; + ${S.indicesSet("data_indices","i","index")}; + } + var index_from_indices = ${X.getByIndices("indices_indices")}; + if (index_from_indices < 0) { + index_from_indices += ${O[V]}; + } + ${S.indicesSet("data_indices","uniforms.gather_axis","u32(index_from_indices)")}; + for (var i = uniforms.gather_axis + 1; i < ${J.length}; i++) { + let index = ${k.indicesGet("output_indices",`i + ${G.length} - 1`)}; + ${S.indicesSet("data_indices","i","index")}; + } + let data_offset = ${S.indicesToOffset("data_indices")}; + let data_index = data_offset % 8; + // Convert 4-bit packed data to 8-bit packed data. + let packed_4bit_quantized_data = ${S.getByOffset("data_offset / 8")}; + let packed_8bit_quantized_data = (packed_4bit_quantized_data >> (4 * (data_index % 2))) & 0x0f0f0f0f; + let quantized_data_vec = ${H?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_quantized_data)); + let quantized_data = quantized_data_vec[data_index / 2]; + var scale_indices = data_indices; + let quantize_axis_index = ${D.indicesGet("data_indices","uniforms.quantize_axis")} / uniforms.block_size; + ${D.indicesSet("scale_indices","uniforms.quantize_axis","quantize_axis_index")}; + var scale = ${D.getByIndices("scale_indices")}; + ${I?` + let zero_point_indices = scale_indices; + let zero_point_offset = ${I.indicesToOffset("zero_point_indices")}; + let zero_point_index = zero_point_offset % 8; + let packed_4bit_zero_points = ${I.getByOffset("zero_point_offset / 8")}; + let packed_8bit_zero_points = (packed_4bit_zero_points >> (4 * (zero_point_index % 2))) & 0x0f0f0f0f; + let zero_point_vec = ${H?"unpack4xI8":"unpack4xU8"}(u32(packed_8bit_zero_points)); + let zero_point = zero_point_vec[zero_point_index / 2];`:"var zero_point = 0"}; + let dequantized_data = ${k1(U)}(quantized_data - zero_point) * scale; + ${k.setByOffset("global_idx","dequantized_data")}; + }`}}},mk=($,j)=>{let O=$.inputs;tY(O,j),$.compute(eY($.inputs,j))},pk=($)=>j9({blockSize:$.blockSize,gatherAxis:$.gatherAxis,quantizeAxis:$.quantizeAxis})}),iM=I5(()=>{Y6(),D6(),B9(),M6(),$S=($)=>{if(!$||$.length!==2)throw Error("GatherElements requires 2 inputs.");if($[0].dims.length<1)throw Error("GatherElements requires that the data input be rank >= 1.");if($[0].dims.length!==$[1].dims.length)throw Error(`GatherElements requires that the data input and + indices input tensors be of same rank.`)},jS=($,j)=>{let O=$[0].dims,G=$[0].dataType,Z=O.length,V=$[1].dims,N=$[1].dataType,J=l0.normalizeAxis(j.axis,Z),R=O[J],U=V.slice(0),H=l0.size(U),L=O5("input",G,Z),Y=O5("indicesInput",N,V.length),S=t5("output",G,U.length),X=[{type:12,data:H},{type:6,data:R},{type:12,data:J}];return X.push(...j6(O,V,U)),{name:"GatherElements",shaderCache:{inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:U,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(H/64)},programUniforms:X}),getShaderSource:(D)=>` + ${D.registerUniform("outputSize","u32").registerUniform("axisDimLimit","i32").registerUniform("axis","u32").declareVariables(L,Y,S)} + ${D.mainStart()} + ${D.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let outputIndices = ${S.offsetToIndices("global_idx")}; + + var idx = ${Y.getByOffset("global_idx")}; + if (idx < 0) { + idx = idx + uniforms.axisDimLimit; + } + var inputIndices = ${L.type.indices}(outputIndices); + ${L.indicesSet("inputIndices","uniforms.axis","u32(idx)")}; + let value = ${L.getByIndices("inputIndices")}; + + ${S.setByOffset("global_idx","value")}; + }`}},Ak=($)=>j9({axis:$.axis}),gk=($,j)=>{let O=$.inputs;$S(O),$.compute(jS($.inputs,j))}}),aM=I5(()=>{Y6(),D6(),M6(),OS=($)=>{if(!$)throw Error("Input is missing");if($.length<2||$.length>3)throw Error("Invaid input number.");if($.length===3&&$[2].dims.length>2)throw Error("Invalid input shape of C");if($[0].dataType!==$[1].dataType||$.length===3&&$[0].dataType!==$[2].dataType)throw Error("Input types are mismatched")},GS=($,j)=>{let O=$[0].dims.slice(),G=$[1].dims.slice(),[Z,V,N]=gy.getShapeOfGemmResult(O,j.transA,G,j.transB,$.length===3?$[2].dims:void 0),J=[Z,V];if(!J)throw Error("Can't use gemm on the given tensors");let R=16,U=Math.ceil(V/R),H=Math.ceil(Z/R),L=(l0.size(J),[{type:12,data:U},{type:12,data:Z},{type:12,data:V},{type:12,data:N},{type:1,data:j.alpha},{type:1,data:j.beta}]),Y=["type","type"];return $.length===3&&(L.push(...j6($[2].dims)),Y.push("rank")),L.push(...j6(J)),{name:"GemmShared",shaderCache:{hint:`${j.cacheKey}`,inputDependencies:Y},getRunData:()=>({outputs:[{dims:J,dataType:$[0].dataType}],dispatchGroup:{x:U*H},programUniforms:L}),getShaderSource:(S)=>{let X=O5("a",$[0].dataType,$[0].dims),D=O5("b",$[1].dataType,$[1].dims),I=null,k=[X,D];$.length===3&&(I=O5("c",$[2].dataType,$[2].dims.length),k.push(I));let z=t5("output",$[0].dataType,J.length);k.push(z);let w="",T="";j.transA&&j.transB?(T=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[k][local_id.y] * tile_b[local_id.x][k];"):j.transA&&!j.transB?(T=` + var col = tile_row_start + local_id.x; + var row = k_start + local_id.y; + if (col < uniforms.M && row < uniforms.K) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.M + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[k][local_id.y] * tile_b[k][local_id.x];"):!j.transA&&j.transB?(T=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = k_start + local_id.x; + row = tile_col_start + local_id.y; + if (col < uniforms.K && row < uniforms.N) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.K + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[local_id.y][k] * tile_b[local_id.x][k];"):!j.transA&&!j.transB&&(T=` + var col = k_start + local_id.x; + var row = tile_row_start + local_id.y; + if (col < uniforms.K && row < uniforms.M) { + tile_a[local_id.y][local_id.x] = a[row * uniforms.K + col]; + } else { + tile_a[local_id.y][local_id.x] = ${X.type.value}(0); + } + + col = tile_col_start + local_id.x; + row = k_start + local_id.y; + if (col < uniforms.N && row < uniforms.K) { + tile_b[local_id.y][local_id.x] = b[row * uniforms.N + col]; + } else { + tile_b[local_id.y][local_id.x] = ${D.type.value}(0); + } + `,w="value += tile_a[local_id.y][k] * tile_b[k][local_id.x];");let W=j.alpha===1?"":"value *= uniforms.alpha;";return` + ${S.registerUniforms([{name:"num_tile_n",type:"u32"},{name:"M",type:"u32"},{name:"N",type:"u32"},{name:"K",type:"u32"},{name:"alpha",type:"f32"},{name:"beta",type:"f32"}]).declareVariables(...k)} + var tile_a: array, 16>; + var tile_b: array, 16>; + ${S.mainStart([R,R,1])} + let tile_col_start = (workgroup_index % uniforms.num_tile_n) * 16; + let tile_row_start = (workgroup_index / uniforms.num_tile_n) * 16; + let num_tiles = (uniforms.K - 1) / 16 + 1; + var k_start = 0u; + var value = ${z.type.value}(0); + for (var t: u32 = 0u; t < num_tiles; t++) { + ${T} + k_start = k_start + 16; + workgroupBarrier(); + + for (var k: u32 = 0u; k < 16; k++) { + ${w} + } + workgroupBarrier(); + } + + ${W} + let m = tile_row_start + local_id.y; + let n = tile_col_start + local_id.x; + ${I!=null?`let cOffset = ${I.broadcastedIndicesToOffset("vec2(m, n)",z)}; value += ${z.type.value}(uniforms.beta) * ${I.getByOffset("cOffset")};`:""} + if (m < uniforms.M && n < uniforms.N) { + output[m * uniforms.N + n] = value; + } + }`}}},uk=($)=>({transA:$.transA,transB:$.transB,alpha:$.alpha,beta:$.beta,cacheKey:`${$.transA};${$.transB};${$.alpha===1}`}),dk=($,j)=>{OS($.inputs),$.compute(GS($.inputs,j))}}),rM=I5(()=>{Y6(),D6(),B9(),M6(),[O4,F4,c8,m8]=[0,1,2,3],ZS=($)=>{if($[0].dims.length!==4)throw Error("only 4-D tensor is supported.");if($[0].dims.length!==$[1].dims.length)throw Error("input dimensions must be equal to grid dimensions");if($[0].dims.length-2!==$[1].dims[$[1].dims.length-1])throw Error("last dimension of grid must be equal to "+($[0].dims.length-2));if($[0].dims[0]!==$[1].dims[0])throw Error("grid batch size must match input batch size")},qS=($)=>` + fn gs_bicubic_interpolate(p: mat4x4<${$}>, x: f32, y: f32) -> ${$} { + var v: vec4; + var coeffs = gs_get_cubic_coeffs(x); + for (var i = 0; i < 4; i++) { + v[i] = coeffs[0] * p[i][0] + coeffs[1] * p[i][1] + coeffs[2] * p[i][2] + coeffs[3] * p[i][3]; + } + coeffs = gs_get_cubic_coeffs(y); + let pixel = ${$}(coeffs[0] * v[0] + coeffs[1] * v[1] + coeffs[2] * v[2] + coeffs[3] * v[3]); + return pixel; + } +`,VS=($)=>` + fn gs_denormalize(n: f32, length: i32) -> f32 { + ${$.alignCorners===0?` + // alignCorners: false => [-1, 1] to [-0.5, length - 0.5] + return ((n + 1.0) * f32(length) - 1.0) / 2.0; + `:` + // alignCorners: true => [-1, 1] to [0, length - 1] + return (n + 1.0) / 2.0 * (f32(length - 1)); + `} + } +`,NS=($)=>` + ${$.paddingMode==="reflection"?` + fn gs_reflect(x: i32, x_min: f32, x_max: f32) -> u32 { + var dx = 0.0; + var fx = f32(x); + let range = x_max - x_min; + if (fx < x_min) { + dx = x_min - fx; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_min + r; + } else { + fx = x_max - r; + } + } else if (fx > x_max) { + dx = fx - x_max; + let n = u32(dx / range); + let r = dx - f32(n) * range; + if (n % 2 == 0) { + fx = x_max - r; + } else { + fx = x_min + r; + } + } + return u32(fx); + }`:""} +`,JS=($,j,O)=>` + fn pixel_at_grid(r: i32, c: i32, H: i32, W: i32, batch: u32, channel: u32, border: vec4) -> ${j} { + var pixel = ${j}(0); + var indices = vec4(0); + indices[${O4}] = batch; + indices[${F4}] = channel;`+(()=>{switch(O.paddingMode){case"zeros":return` + if (r >= 0 && r < H && c >=0 && c < W) { + indices[${c8}] = u32(r); + indices[${m8}] = u32(c); + } else { + return ${j}(0); + } + `;case"border":return` + indices[${c8}] = u32(clamp(r, 0, H - 1)); + indices[${m8}] = u32(clamp(c, 0, W - 1)); + `;case"reflection":return` + indices[${c8}] = gs_reflect(r, border[1], border[3]); + indices[${m8}] = gs_reflect(c, border[0], border[2]); + `;default:throw Error(`padding mode ${O.paddingMode} is not supported`)}})()+` + return ${$.getByIndices("indices")}; + } +`,vS=($,j,O)=>(()=>{switch(O.mode){case"nearest":return` + let result = pixel_at_grid(i32(round(y)), i32(round(x)), H_in, W_in, indices[${O4}], indices[${F4}], border); + `;case"bilinear":return` + let x1 = i32(floor(x)); + let y1 = i32(floor(y)); + let x2 = x1 + 1; + let y2 = y1 + 1; + + let p11 = pixel_at_grid(y1, x1, H_in, W_in, indices[${O4}], indices[${F4}], border); + let p12 = pixel_at_grid(y1, x2, H_in, W_in, indices[${O4}], indices[${F4}], border); + let p21 = pixel_at_grid(y2, x1, H_in, W_in, indices[${O4}], indices[${F4}], border); + let p22 = pixel_at_grid(y2, x2, H_in, W_in, indices[${O4}], indices[${F4}], border); + + let dx2 = ${j}(f32(x2) - x); + let dx1 = ${j}(x - f32(x1)); + let dy2 = ${j}(f32(y2) - y); + let dy1 = ${j}(y - f32(y1)); + let result = dy2 * (dx2 * p11 + dx1 * p12) + dy1 * (dx2 * p21 + dx1 * p22); + `;case"bicubic":return` + let x0 = i32(floor(x)) - 1; + let y0 = i32(floor(y)) - 1; + var p: mat4x4<${j}>; + for (var h = 0; h < 4; h++) { + for (var w = 0; w < 4; w++) { + p[h][w] = pixel_at_grid(h + y0, w + x0, H_in, W_in, indices[${O4}], indices[${F4}], border); + } + } + + let dx = x - f32(x0 + 1); + let dy = y - f32(y0 + 1); + let result = gs_bicubic_interpolate(p, dx, dy); + `;default:throw Error(`mode ${O.mode} is not supported`)}})()+`${$.setByOffset("global_idx","result")}`,RS=($,j)=>{let O=O5("x",$[0].dataType,$[0].dims.length),G=[$[1].dims[0],$[1].dims[1],$[1].dims[2]],Z=O5("grid",$[1].dataType,G.length,2),V=[$[0].dims[0],$[0].dims[1],$[1].dims[1],$[1].dims[2]];j.format==="NHWC"&&(V=[$[0].dims[0],$[1].dims[1],$[1].dims[2],$[0].dims[3]],[O4,F4,c8,m8]=[0,3,1,2]);let N=t5("output",$[0].dataType,V.length),J=O.type.value,R=[{type:12,data:l0.size(V)},...j6($[0].dims,G,V)];return{name:"GridSample",shaderCache:{hint:`${j.cacheKey}`,inputDependencies:["type","type"]},getRunData:(U)=>{let H=l0.size(V);return{outputs:[{dims:V,dataType:U[0].dataType}],dispatchGroup:{x:Math.ceil(H/64)},programUniforms:R}},getShaderSource:(U)=>` + ${U.registerUniform("output_size","u32").declareVariables(O,Z,N)} + + fn gs_get_cubic_coeffs(x: f32) -> vec4 { + let cubic_alpha = -0.75f; + let x_abs = abs(x); + var coeffs: vec4; + coeffs[0] = (((cubic_alpha * (x_abs + 1) - 5 * cubic_alpha) * (x_abs + 1) + 8 * cubic_alpha) * (x_abs + 1) - 4 * cubic_alpha); + coeffs[1] = (((cubic_alpha + 2) * x_abs - (cubic_alpha + 3)) * x_abs * x_abs + 1); + coeffs[2] = (((cubic_alpha + 2) * (1 - x_abs) - (cubic_alpha + 3)) * (1 - x_abs) * (1 - x_abs) + 1); + coeffs[3] = (((cubic_alpha * (2 - x_abs) - 5 * cubic_alpha) * (2 - x_abs) + 8 * cubic_alpha) * (2 - x_abs) - 4 * cubic_alpha); + return coeffs; + } + + ${qS(J)} + ${VS(j)} + ${NS(j)} + ${JS(O,J,j)} + + ${U.mainStart()} + ${U.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let H_in = i32(uniforms.x_shape[${c8}]); + let W_in = i32(uniforms.x_shape[${m8}]); + + ${j.alignCorners===0?` + let x_min = -0.5; + let x_max = f32(W_in) - 0.5; + let y_min = -0.5; + let y_max = f32(H_in) - 0.5; + `:` + let x_min = 0.0; + let x_max = f32(W_in) - 1.0; + let y_min = 0.0; + let y_max = f32(H_in) - 1.0; + `}; + let border = vec4(x_min, y_min, x_max, y_max); + + let indices = ${N.offsetToIndices("global_idx")}; + var grid_indices = vec3(indices[${O4}], indices[${c8}], indices[${m8}]); + let nxy = ${Z.getByIndices("grid_indices")}; + var x = gs_denormalize(f32(nxy[0]), W_in); + var y = gs_denormalize(f32(nxy[1]), H_in); + + ${vS(N,J,j)} + }`}},lk=($,j)=>{ZS($.inputs),$.compute(RS($.inputs,j))},ok=($)=>j9({alignCorners:$.align_corners,mode:$.mode,paddingMode:$.padding_mode,format:$.format})}),fI=I5(()=>{Y6(),D6(),B9(),LR(),YR(),M6(),v7(),m1=($,j)=>$.length>j&&$[j].dims.length>0?$[j]:void 0,US=($,j)=>{let O=$[0],G=m1($,1),Z=m1($,2),V=m1($,3),N=m1($,4),J=m1($,5),R=m1($,6),U=m1($,7);if(O.dims.length!==3&&O.dims.length!==5)throw Error("Input query is expected to have 3 or 5 dimensions");let H,L=O.dims[0],Y=O.dims[1],S=O.dims.length===3?O.dims[2]:j.numHeads*O.dims[4],X=Y,D=0,I=0,k=Math.floor(S/j.numHeads);if(R&&U&&l0.size(R.dims)&&l0.size(U.dims)){if(R.dims.length!==4)throw Error('Input "past_key" is expected to have 4 dimensions');if(R.dims[0]!==L||R.dims[1]!==j.numHeads||R.dims[3]!==k)throw Error('Input "past_key" shape (batch_size, num_heads, past_sequence_length, head_size)');if(U.dims[0]!==L||U.dims[1]!==j.numHeads||U.dims[3]!==k)throw Error('Input "past_value" shape (batch_size, num_heads, past_sequence_length, head_size)');if(R.dims[2]!==U.dims[2])throw Error('Input "past_key" and "past_value" shall have same dim 2 (past_sequence_length)');if(U.dims.length!==4)throw Error('Input "past_value" is expected to have 4 dimensions');D=R.dims[2],I=R.dims[2]}else if(R&&l0.size(R.dims)||U&&l0.size(U.dims))throw Error('Input "past_key" and "past_value" shall be both present or both absent');if(G&&l0.size(G.dims)>0){if(O.dims.length!==3)throw Error('Input "query" is expected to have 3 dimensions when key is given');if(G.dims.length<3||G.dims.length>5)throw Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(O.dims[0]!==G.dims[0])throw Error('Input "query" and "key" shall have same dim 0 (batch size)');if(G.dims.length===3){if(G.dims[2]!==O.dims[2])throw Error('Input "query" and "key" shall have same dim 2 (hidden_size)');H=2,X=G.dims[1]}else if(G.dims.length===5){if(G.dims[2]!==j.numHeads||G.dims[3]!==2||G.dims[4]!==k)throw Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(Z)throw Error('Expect "value" be none when "key" has packed kv format.');H=5,X=G.dims[1]}else{if(G.dims[1]!==j.numHeads||G.dims[3]!==k)throw Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');H=0,X=G.dims[2]}}else{if(O.dims.length!==5)throw Error('Input "query" is expected to have 5 dimensions when key is empty');if(O.dims[2]!==j.numHeads||O.dims[3]!==3)throw Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');H=3}if(V&&l0.size(V.dims)>0){if(V.dims.length!==1)throw Error('Input "bias" is expected to have 1 dimension');if(G&&G.dims.length===5&&G.dims[3]===2)throw Error("bias is not allowed for packed kv.")}let z=D+X,w=0;if(N&&l0.size(N.dims)>0){w=8;let E=N.dims;throw E.length===1?E[0]===L?w=1:E[0]===3*L+2&&(w=3):E.length===2&&E[0]===L&&E[1]===z&&(w=5),w===8?Error('Input "key_padding_mask" shape shall be (batch_size) or (batch_size, total_sequence_length)'):Error("Mask not supported")}let T=!1,W=S;if(Z&&l0.size(Z.dims)>0){if(Z.dims.length!==3&&Z.dims.length!==4)throw Error('Input "value" is expected to have 3 or 4 dimensions');if(O.dims[0]!==Z.dims[0])throw Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(Z.dims.length===3){if(X!==Z.dims[1])throw Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');W=Z.dims[2]}else{if(X!==Z.dims[2])throw Error('Input "key" and "value" shall have the same dim 2 (kv_sequence_length)');W=Z.dims[1]*Z.dims[3],T=!0}}if(N&&l0.size(N.dims)>0)throw Error("Key padding mask is not supported");if(J&&l0.size(J.dims)>0){if(J.dims.length!==4)throw Error('Input "attention_bias" is expected to have 4 dimensions');if(J.dims[0]!==L||J.dims[1]!==j.numHeads||J.dims[2]!==Y||J.dims[3]!==z)throw Error('Expect "attention_bias" shape (batch_size, num_heads, sequence_length, total_sequence_length)')}return{batchSize:L,sequenceLength:Y,pastSequenceLength:D,kvSequenceLength:X,totalSequenceLength:z,maxSequenceLength:I,inputHiddenSize:0,hiddenSize:S,vHiddenSize:W,headSize:k,vHeadSize:Math.floor(W/j.numHeads),numHeads:j.numHeads,isUnidirectional:!1,pastPresentShareBuffer:!1,maskFilterValue:j.maskFilterValue,maskType:w,scale:j.scale,broadcastResPosBias:!1,passPastInKv:T,qkvFormat:H}},sk=($)=>j9({...$}),TJ=j9({perm:[0,2,1,3]}),HS=($,j,O,G,Z,V,N)=>{let J=[G,Z,V],R=l0.size(J),U=[{type:12,data:R},{type:12,data:N},{type:12,data:V}];return $.compute({name:"MultiHeadAttentionAddBias",shaderCache:{inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:J,dataType:j.dataType,gpuDataType:0}],dispatchGroup:{x:Math.ceil(R/64)},programUniforms:U}),getShaderSource:(H)=>{let L=t5("qkv_with_bias",j.dataType,J),Y=O5("qkv",j.dataType,J),S=O5("bias",O.dataType,J);return` + ${H.registerUniforms([{name:"output_size",type:"u32"},{name:"bias_offset",type:"u32"},{name:"hidden_size",type:"u32"}]).declareVariables(Y,S,L)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let bias_offset_idx = (global_idx % uniforms.hidden_size) + uniforms.bias_offset; + + qkv_with_bias[global_idx] = qkv[global_idx] + bias[bias_offset_idx]; + }`}},{inputs:[j,O],outputs:[-1]})[0]},QZ=($,j,O,G,Z,V,N,J)=>{let R=V;if(N&&l0.size(N.dims)>0){if(G===1)throw Error("AddBiasReshape is not implemented. Please export your model with packed QKV or KV");return R=HS($,V,N,j,G,O*Z,J),R=R.reshape([j,G,O,Z]),O===1||G===1?R:$.compute(X2(R,TJ.perm),{inputs:[R],outputs:[-1]})[0]}return V.dims.length===3&&(R=V.reshape([j,G,O,Z])),O===1||G===1?R:$.compute(X2(R,TJ.perm),{inputs:[R],outputs:[-1]})[0]},ik=($,j)=>{let O=US($.inputs,j),G=$.inputs[0],Z=m1($.inputs,1),V=m1($.inputs,2),N=m1($.inputs,3),J=m1($.inputs,4),R=m1($.inputs,5),U=m1($.inputs,6),H=m1($.inputs,7);if(G.dims.length===5)throw Error("Packed QKV is not implemented");if(Z?.dims.length===5)throw Error("Packed KV is not implemented");let L=Z&&V&&Z.dims.length===4&&V.dims.length===4,Y=QZ($,O.batchSize,O.numHeads,O.sequenceLength,O.headSize,G,N,0);if(L)return gZ($,Y,Z,V,J,void 0,U,H,R,O);if(!Z||!V)throw Error("key and value must be provided");let S=QZ($,O.batchSize,O.numHeads,O.kvSequenceLength,O.headSize,Z,N,O.hiddenSize),X=QZ($,O.batchSize,O.numHeads,O.kvSequenceLength,O.vHeadSize,V,N,2*O.hiddenSize);gZ($,Y,S,X,J,void 0,U,H,R,O)}}),wI=I5(()=>{Y6(),D6(),B9(),M6(),xS=($)=>{if(!$||$.length<1)throw Error("too few inputs")},LS=($,j)=>{let O=[],G=j.numOutputs;return $[1].dims[0]>0&&($[1].getBigInt64Array().forEach((Z)=>O.push(Number(Z))),G=O.length),j9({numOutputs:G,axis:j.axis,splitSizes:O})},_S=($)=>` +fn calculateOutputIndex(index: u32) -> u32 { + for (var i: u32 = 0u; i < ${$}u; i += 1u ) { + if (index < ${R6("uniforms.size_in_split_axis","i",$)}) { + return i; + } + } + return ${$}u; +}`,YS=($)=>{let j=$.length,O=[];for(let G=0;G{let O=$[0].dims,G=l0.size(O),Z=$[0].dataType,V=l0.normalizeAxis(j.axis,O.length),N=Array(j.numOutputs),J=O5("input",Z,O.length),R=Array(j.numOutputs),U=[],H=[],L=0,Y=[{type:12,data:G}];for(let S=0;S` + ${S.registerUniform("input_size","u32").registerUniform("size_in_split_axis","u32",R.length).declareVariables(J,...N)} + ${_S(R.length)} + ${YS(N)} + + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.input_size")} + + var indices = ${J.offsetToIndices("global_idx")}; + var index = ${J.indicesGet("indices",V)}; + let output_number = calculateOutputIndex(index); + if (output_number != 0) { + index -= ${R6("uniforms.size_in_split_axis","output_number - 1u",R.length)}; + ${J.indicesSet("indices",V,"index")}; + } + writeBufferData(output_number, indices, global_idx); + }`,getRunData:()=>({outputs:U,dispatchGroup:{x:Math.ceil(G/64)},programUniforms:Y})}},ak=($,j)=>{xS($.inputs);let O=$.inputs.length===1?j:LS($.inputs,j);$.compute(yv($.inputs,O),{inputs:[0]})},rk=($)=>{let{axis:j,splitSizes:O}=$,G=$.numOutputs<0?O.length:$.numOutputs;if(G!==O.length)throw Error("numOutputs and splitSizes lengh must be equal");return j9({axis:j,numOutputs:G,splitSizes:O})}}),EI=I5(()=>{Y6(),D6(),B9(),M6(),SS=($,j)=>{let[O,G,Z,V]=$,{numHeads:N,rotaryEmbeddingDim:J}=j;if(O.dims.length!==3&&O.dims.length!==4)throw Error(`Input 'x' is expected to have 3 or 4 dimensions, got ${O.dims.length}`);if(!l0.areEqual(G.dims,[])&&!l0.areEqual(G.dims,[1])&&G.dims.length!==2)throw Error(`Input 'position_ids' is expected to have 0, 1, or 2 dimensions, got ${G.dims.length}`);if(Z.dims.length!==2)throw Error(`Input 'cos_cache' is expected to have 2 dimensions, got ${Z.dims.length}`);if(V.dims.length!==2)throw Error(`Input 'sin_cache' is expected to have 2 dimensions, got ${V.dims.length}`);if(!l0.areEqual(Z.dims,V.dims))throw Error("Inputs 'cos_cache' and 'sin_cache' are expected to have the same shape");if(J>0&&N===0)throw Error("num_heads must be provided if rotary_embedding_dim is specified");let R=O.dims[0],U=O.dims[O.dims.length-2],H=Z.dims[0],L=l0.sizeFromDimension(O.dims,1)/U,Y=J===0?2*Z.dims[1]:L/N;if(J>Y)throw Error("rotary_embedding_dim must be less than or equal to head_size");if(G.dims.length===2){if(R!==G.dims[0])throw Error(`Input 'position_ids' dimension 0 should be of size batch_size, got ${G.dims[0]}`);if(U!==G.dims[1])throw Error(`Input 'position_ids' dimension 1 should be of size sequence_length, got ${G.dims[1]}`)}if(Y/2!==Z.dims[1]&&J/2!==Z.dims[1])throw Error(`Input 'cos_cache' dimension 1 should be same as head_size / 2 or rotary_embedding_dim / 2, got ${Z.dims[1]}`);if(U>H)throw Error("Updating cos_cache and sin_cache in RotaryEmbedding is not currently supported")},SV=($,j)=>{let{interleaved:O,numHeads:G,rotaryEmbeddingDim:Z,scale:V}=j,N=$[0].dims[0],J=l0.sizeFromDimension($[0].dims,1),R=$[0].dims[$[0].dims.length-2],U=J/R,H=$[2].dims[1],L=Z===0?2*H:U/G,Y=[N,R,U/L,L-H],S=l0.computeStrides(Y),X=[{type:1,data:V},{type:12,data:Y},{type:12,data:S},...$[0].dims.length===3?[{type:12,data:[J,U,L,1]}]:[],...$[0].dims.length===4?[{type:12,data:[J,L,R*L,1]}]:[],...j6($[0].dims,$[1].dims,$[2].dims,$[3].dims,$[0].dims)];return{name:"RotaryEmbedding",shaderCache:{hint:j9({interleaved:O}).cacheKey,inputDependencies:["rank","rank","rank","rank"]},getShaderSource:(D)=>{let I=O5("input",$[0].dataType,$[0].dims.length),k=O5("position_ids",$[1].dataType,$[1].dims.length),z=O5("cos_cache",$[2].dataType,$[2].dims.length),w=O5("sin_cache",$[3].dataType,$[3].dims.length),T=t5("output",$[0].dataType,$[0].dims.length);return D.registerUniforms([{name:"scale",type:"f32"},{name:"global_shape",type:"u32",length:Y.length},{name:"global_strides",type:"u32",length:S.length},{name:"input_output_strides",type:"u32",length:S.length}]),` + ${D.declareVariables(I,k,z,w,T)} + + ${D.mainStart(DG)} + let half_rotary_emb_dim = uniforms.${z.name}_shape[1]; + let bsnh = global_idx / uniforms.global_strides % uniforms.global_shape; + let size = uniforms.global_shape[0] * uniforms.global_strides[0]; + ${D.guardAgainstOutOfBoundsWorkgroupSizes("size")} + + if (bsnh[3] < half_rotary_emb_dim) { + let position_ids_idx = + ${k.broadcastedIndicesToOffset("bsnh.xy",t5("",k.type.tensor,2))}; + let position_id = + u32(${k.getByOffset("position_ids_idx")}) + select(0, bsnh[1], position_ids_idx == 0); + let i = dot(bsnh, uniforms.input_output_strides) + select(0, bsnh[3], ${O}); + let j = i + select(half_rotary_emb_dim, 1, ${O}); + let re = ${I.getByOffset("i")} * ${z.get("position_id","bsnh[3]")} - + ${I.getByOffset("j")} * ${w.get("position_id","bsnh[3]")}; + ${T.setByOffset("i","re")} + let im = ${I.getByOffset("i")} * ${w.get("position_id","bsnh[3]")} + + ${I.getByOffset("j")} * ${z.get("position_id","bsnh[3]")}; + ${T.setByOffset("j","im")} + } else { + let k = dot(bsnh, uniforms.input_output_strides) + half_rotary_emb_dim; + ${T.setByOffset("k",I.getByOffset("k"))} + } + }`},getRunData:()=>({outputs:[{dims:$[0].dims,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(l0.size(Y)/DG)},programUniforms:X})}},nk=($,j)=>{SS($.inputs,j),$.compute(SV($.inputs,j))}}),nM=I5(()=>{B9(),Y6(),YR(),fI(),wI(),v7(),EI(),M6(),PS=($,j)=>{if(j.doRotary&&$.length<=7)throw Error("cos_cache and sin_cache inputs are required if do_rotary is specified");let O=$[0],G=$[1],Z=$[2],V=$[3],N=$[4];if(j.doRotary!==0&&$.length<=7)throw Error("cos_cast and sin_cache are expected if do_rotary attribute is non-zero");if(j.localWindowSize!==-1)throw Error("Local attention is not supported");if(j.softcap!==0)throw Error("Softcap is not supported");if(j.rotaryInterleaved!==0)throw Error("Rotary interleaved is not supported");if(j.smoothSoftmax)throw Error("Smooth softmax is not supported");if(O.dims.length!==3&&O.dims.length!==5)throw Error("Input query is expected to have 3 or 5 dimensions");let J=O.dims[0],R=O.dims[1],U=O.dims.length===3?O.dims[2]:j.numHeads*O.dims[4],H=R,L=0,Y=!G||G.dims.length===0,S=Math.floor(Y?U/(j.numHeads+2*j.kvNumHeads):U/j.numHeads);Y&&(U=S*j.numHeads);let X=V&&V.dims.length!==0,D=N&&N.dims.length!==0;if(X&&V.dims.length===4&&V.dims[0]===J&&V.dims[1]!==j.kvNumHeads&&V.dims[2]===j.kvNumHeads&&V.dims[3]===S)throw Error("BSNH pastKey/pastValue is not supported");if(X&&D){if(V.dims.length!==4)throw Error('Input "past_key" is expected to have 4 dimensions');if(N.dims.length!==4)throw Error('Input "past_value" is expected to have 4 dimensions');L=V.dims[2]}else if(X||D)throw Error('Input "past_key" and "past_value" shall be both present or both absent');let I=1;if(G&&G.dims.length>0){if(O.dims.length!==3)throw Error('Input "query" is expected to have 3 dimensions when key is given');if(G.dims.length<3||G.dims.length>5)throw Error('Input "key" is expected to have 3, 4, or 5 dimensions');if(O.dims[0]!==G.dims[0])throw Error('Input "query" and "key" shall have same dim 0 (batch size)');if(G.dims.length===3){if(O.dims[2]%G.dims[2]!==0)throw Error('Dimension 2 of "query" should be a multiple of "key"');H=G.dims[1]}else if(G.dims.length===5){if(G.dims[2]!==j.numHeads||G.dims[3]!==2||G.dims[4]!==S)throw Error('Expect "key" shape (batch_size, kv_sequence_length, num_heads, 2, head_size) for packed kv');if(Z)throw Error('Expect "value" be none when "key" has packed kv format.');H=G.dims[1]}else{if(G.dims[1]!==j.numHeads||G.dims[3]!==S)throw Error('Expect "key" shape (batch_size, num_heads, kv_sequence_length, head_size) for past_key');H=G.dims[2]}}else{if(O.dims.length!==3&&O.dims.length!==5)throw Error('Input "query" is expected to have 3 or 5 dimensions when key is empty');if(O.dims.length===5&&(O.dims[2]!==j.numHeads||O.dims[3]!==3))throw Error('Expect "query" shape (batch_size, kv_sequence_length, num_heads, 3, head_size) for packed kv');I=3}let k=!1,z=j.kvNumHeads?S*j.kvNumHeads:U;if(Z&&Z.dims.length>0){if(Z.dims.length!==3&&Z.dims.length!==4)throw Error('Input "value" is expected to have 3 or 4 dimensions');if(O.dims[0]!==Z.dims[0])throw Error('Input "query" and "value" shall have same dim 0 (batch_size)');if(Z.dims.length===3){if(H!==Z.dims[1])throw Error('Input "key" and "value" shall have the same dim 1 (kv_sequence_length)');z=Z.dims[2]}else{if(H!==Z.dims[2])throw Error('Input "past_key" and "past_value" shall have the same dim 2 (kv_sequence_length)');z=Z.dims[1]*Z.dims[3],k=!0}}let w=$.length>4?$[5]:void 0;if(w&&w.dims.length!==1&&w.dims[0]!==J)throw Error('Input "seqlens" is expected to have 1 dimension and the same dim 0 as batch_size');return{batchSize:J,sequenceLength:R,pastSequenceLength:L,kvSequenceLength:H,totalSequenceLength:-1,maxSequenceLength:-1,inputHiddenSize:0,hiddenSize:U,vHiddenSize:z,headSize:S,vHeadSize:Math.floor(z/j.kvNumHeads),numHeads:j.numHeads,kvNumHeads:j.kvNumHeads,nReps:j.numHeads/j.kvNumHeads,pastPresentShareBuffer:!1,maskType:0,scale:j.scale,broadcastResPosBias:!1,passPastInKv:k,qkvFormat:I}},XS=j9({perm:[0,2,1,3]}),FJ=($,j,O)=>{let G=j,Z=O.kvNumHeads;return j.dims.length===3&&O.kvSequenceLength!==0&&(G=j.reshape([O.batchSize,O.kvSequenceLength,Z,O.headSize]),G=$.compute(X2(G,XS.perm),{inputs:[G],outputs:[-1]})[0]),G},TS=($,j,O,G)=>{let Z=[$*j],V=$*j,N=[{type:12,data:V},{type:12,data:j},{type:12,data:$}];return{name:"GeneratePositionIds",shaderCache:{hint:`${$};${j}`,inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:Z,dataType:7}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:N}),getShaderSource:(J)=>{let R=O5("seq_lens",O.dataType,O.dims),U=O5("total_seq_lens",G.dataType,G.dims),H=t5("pos_ids",7,Z);return` + ${J.registerUniforms([{name:"output_size",type:"u32"},{name:"sequence_length",type:"u32"},{name:"batch_size",type:"u32"}]).declareVariables(R,U,H)} + ${J.mainStart()} + ${J.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let total_sequence_length = u32(${U.getByOffset("0")}); + let is_subsequent_prompt = uniforms.sequence_length > 1 && uniforms.sequence_length != total_sequence_length; + let is_first_prompt = !is_subsequent_prompt && uniforms.sequence_length == total_sequence_length; + let batch_idx = global_idx / uniforms.sequence_length; + let sequence_idx = i32(global_idx % uniforms.sequence_length); + var pos_id: i32 = 0; + let seqlen = ${R.getByOffset("batch_idx")}; + let total_seqlen = seqlen + 1; + if (is_first_prompt) { + if (sequence_idx < total_seqlen) { + pos_id = sequence_idx; + } else { + pos_id = 1; + } + ${H.setByOffset("global_idx","pos_id")} + } else if (is_subsequent_prompt) { + let past_seqlen = total_seqlen - i32(uniforms.sequence_length); + if (past_seqlen + sequence_idx < total_seqlen) { + pos_id = past_seqlen + sequence_idx; + } else { + pos_id = 1; + } + ${H.setByOffset("global_idx","pos_id")} + } else if (global_idx < uniforms.batch_size) { + ${H.setByOffset("global_idx","seqlen")} + }; + } + `}}},tk=($,j)=>{let O=PS($.inputs,j);if($.inputs[0].dims.length===5)throw Error("Packed QKV is not implemented");if($.inputs[1]?.dims.length===5)throw Error("Packed KV is not implemented");let G,Z,V=$.inputs[0],N=$.inputs[1]&&$.inputs[1].dims.length>0?$.inputs[1]:void 0,J=$.inputs[2]&&$.inputs[2].dims.length>0?$.inputs[2]:void 0,R=$.inputs[3]&&$.inputs[3].dims.length!==0?$.inputs[3]:void 0,U=$.inputs[4]&&$.inputs[4].dims.length!==0?$.inputs[4]:void 0,H=$.inputs.length>4?$.inputs[5]:void 0,L=$.inputs.length>5?$.inputs[6]:void 0,Y=O.kvNumHeads?O.kvNumHeads:O.numHeads,S=j9({axis:2,numOutputs:3,splitSizes:[O.numHeads*O.headSize,Y*O.headSize,Y*O.headSize]}),[X,D,I]=N||J?[V,N,J]:$.compute(yv([V],S),{inputs:[V],outputs:[-1,-1,-1]});if(j.doRotary){let T=$.compute(TS(O.batchSize,O.sequenceLength,H,L),{inputs:[H,L],outputs:[-1]})[0],W=$.inputs[7],E=$.inputs[8],Q=j9({interleaved:j.rotaryInterleaved!==0,numHeads:O.numHeads,rotaryEmbeddingDim:0,scale:j.scale}),A=[X,T,W,E],l=[-1];G=$.compute(SV(A,Q),{inputs:A,outputs:l})[0],A.splice(0,1,D);let r=j9({interleaved:j.rotaryInterleaved!==0,numHeads:O.kvNumHeads,rotaryEmbeddingDim:0,scale:j.scale});Z=$.compute(SV(A,r),{inputs:A,outputs:l})[0]}let k=QZ($,O.batchSize,O.numHeads,O.sequenceLength,O.headSize,j.doRotary?G:X,void 0,0),z=FJ($,j.doRotary?Z:D,O),w=FJ($,I,O);gZ($,k,z,w,void 0,void 0,R,U,void 0,O,H,L)}}),tM=I5(()=>{Y6(),D6(),v7(),M6(),yJ=($,j,O,G,Z,V,N,J)=>{let R=K9(V),U=R===1?"f32":`vec${R}f`,H=R===1?"vec2f":`mat2x${R}f`,L=Z*N,Y=64;L===1&&(Y=256);let S=[Z,N,V/R],X=[Z,N,2],D=[];return D.push(...j6(S,X)),$.compute({name:"InstanceNormComputeChannelScaleShift",shaderCache:{hint:`${R};${J};${Y}`,inputDependencies:["rank","type","type"]},getRunData:()=>({outputs:[{dims:X,dataType:1}],dispatchGroup:{x:L},programUniforms:D}),getShaderSource:(I)=>{let k=O5("x",j.dataType,3,R),z=[k,O5("scale",O.dataType,O.dims),O5("bias",G.dataType,G.dims),t5("output",1,3,2)];return` + var workgroup_shared : array<${H}, ${Y}>; + const workgroup_size = ${Y}u; + ${I.declareVariables(...z)} + ${I.mainStart(Y)} + let batch = workgroup_index / uniforms.x_shape[1]; + let channel = workgroup_index % uniforms.x_shape[1]; + let hight = uniforms.x_shape[2]; + // initialize workgroup memory + var sum = ${U}(0); + var squared_sum = ${U}(0); + for (var h = local_idx; h < hight; h += workgroup_size) { + let value = ${U}(${k.get("batch","channel","h")}); + sum += value; + squared_sum += value * value; + } + workgroup_shared[local_idx] = ${H}(sum, squared_sum); + workgroupBarrier(); + + for (var currSize = workgroup_size >> 1; currSize > 0; currSize = currSize >> 1) { + if (local_idx < currSize) { + workgroup_shared[local_idx] = workgroup_shared[local_idx] + workgroup_shared[local_idx + currSize]; + } + workgroupBarrier(); + } + if (local_idx == 0) { + let sum_final = ${N7("workgroup_shared[0][0]",R)} / f32(hight * ${R}); + let squared_sum_final = ${N7("workgroup_shared[0][1]",R)} / f32(hight * ${R}); + + let inv_std_dev = inverseSqrt(squared_sum_final - sum_final * sum_final + f32(${J})); + let channel_scale = inv_std_dev * f32(scale[channel]); + let channel_shift = f32(bias[channel]) - sum_final * channel_scale; + output[workgroup_index] = vec2f(channel_scale, channel_shift); + } + }`}},{inputs:[j,O,G],outputs:[-1]})[0]},FS=($,j,O)=>{let G=j[0].dims,Z=G,V=G[0],N=G[1],J=l0.sizeFromDimension(G,2),R=K9(J),U=l0.size(Z)/R,H=yJ($,j[0],j[1],j[2],V,J,N,O.epsilon),L=[V,N,J/R],Y=[V,N];$.compute({name:"InstanceNormalization",shaderCache:{hint:`${R}`,inputDependencies:["type","none"]},getRunData:()=>({outputs:[{dims:Z,dataType:j[0].dataType}],dispatchGroup:{x:Math.ceil(U/64)},programUniforms:[{type:12,data:U},...j6(L,Y,L)]}),getShaderSource:(S)=>{let X=O5("x",j[0].dataType,L.length,R),D=O5("scale_shift",1,Y.length,2),I=t5("output",j[0].dataType,L.length,R),k=[X,D,I];return` + ${S.registerUniform("output_size","u32").declareVariables(...k)} + ${S.mainStart()} + ${S.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let outputIndices = ${I.offsetToIndices("global_idx")}; + let batch = outputIndices[0]; + let channel = outputIndices[1]; + let scale_shift = ${D.getByIndices("vec2(batch, channel)")}; + let value = ${X.getByOffset("global_idx")} * ${I.type.value}(scale_shift.x) + ${I.type.value}(scale_shift.y); + ${I.setByOffset("global_idx","value")}; + }`}},{inputs:[j[0],H]})},yS=($,j,O)=>{let G=j[0].dims,Z=G,V=G[0],N=G[G.length-1],J=l0.sizeFromDimension(G,1)/N,R=K9(N),U=l0.size(Z)/R,H=[{type:12,data:J},{type:12,data:Math.floor(N/R)}],L=!1,Y=[0,G.length-1];for(let D=0;DG[Y[I]])),X=yJ($,S,j[1],j[2],V,J,N,O.epsilon);$.compute({name:"InstanceNormalizationNHWC",shaderCache:{hint:`${R}`,inputDependencies:["type","type"]},getRunData:()=>({outputs:[{dims:Z,dataType:j[0].dataType}],dispatchGroup:{x:Math.ceil(U/64)},programUniforms:H}),getShaderSource:(D)=>{let I=Z1(j[0].dataType),k=R===1?"vec2f":`mat${R}x2f`,z=(W)=>{let E=W===0?"x":"y",Q=R===1?"f32":`vec${R}f`;switch(R){case 1:return`${I}(${Q}(scale.${E}))`;case 2:return`vec2<${I}>(${Q}(scale[0].${E}, scale[1].${E}))`;case 4:return`vec4<${I}>(${Q}(scale[0].${E}, scale[1].${E}, scale[2].${E}, scale[3].${E}))`;default:throw Error(`Not supported compoents ${R}`)}},w=O5("input",j[0].dataType,j[0].dims,R),T=t5("output",j[0].dataType,Z,R);return` + @group(0) @binding(0) var input : array<${w.type.storage}>; + @group(0) @binding(1) var scale_input : array<${k}>; + @group(0) @binding(2) var output : array<${T.type.storage}>; + struct Uniforms {H: u32, C : u32}; + @group(0) @binding(3) var uniforms: Uniforms; + + ${D.mainStart()} + let current_image_number = global_idx / (uniforms.C * uniforms.H); + let current_channel_number = global_idx % uniforms.C; + + let scale_offset = current_image_number * uniforms.C + current_channel_number; + let scale = scale_input[scale_offset]; + output[global_idx] = fma(input[global_idx], ${z(0)}, ${z(1)}); + }`}},{inputs:[j[0],X]})},ek=($,j)=>{j.format==="NHWC"?yS($,$.inputs,j):FS($,$.inputs,j)}}),eM=I5(()=>{Y6(),D6(),M6(),zS=($)=>{if(!$||$.length<2)throw Error("layerNorm requires at least 2 inputs.")},kS=($,j,O)=>{let G=j.simplified,Z=$[0].dims,V=$[1],N=!G&&$[2],J=Z,R=l0.normalizeAxis(j.axis,Z.length),U=l0.sizeToDimension(Z,R),H=l0.sizeFromDimension(Z,R),L=l0.size(V.dims),Y=N?l0.size(N.dims):0;if(L!==H||N&&Y!==H)throw Error(`Size of X.shape()[axis:] == ${H}. + Size of scale and bias (if provided) must match this. + Got scale size of ${L} and bias size of ${Y}`);let S=[];for(let T=0;T1,z=O>2,w=[{dims:J,dataType:$[0].dataType}];return k&&w.push({dims:S,dataType:1}),z&&w.push({dims:S,dataType:1}),{name:"LayerNormalization",shaderCache:{hint:`${X};${O};${G}`,inputDependencies:D},getRunData:()=>({outputs:w,dispatchGroup:{x:Math.ceil(U/64)},programUniforms:I}),getShaderSource:(T)=>{let W=Z1($[0].dataType),E=[O5("x",$[0].dataType,$[0].dims,X),O5("scale",V.dataType,V.dims,X)];return N&&E.push(O5("bias",N.dataType,N.dims,X)),E.push(t5("output",$[0].dataType,J,X)),k&&E.push(t5("mean_data_output",1,S)),z&&E.push(t5("inv_std_output",1,S)),` + ${T.registerUniforms([{name:"norm_count",type:"u32"},{name:"norm_size",type:"f32"},{name:"norm_size_vectorized",type:"u32"},{name:"epsilon",type:"f32"}]).declareVariables(...E)} + ${T.mainStart()} + ${T.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.norm_count")} + let offset = global_idx * uniforms.norm_size_vectorized; + var mean_vector = ${xv("f32",X)}; + var mean_square_vector = ${xv("f32",X)}; + + for (var h: u32 = 0u; h < uniforms.norm_size_vectorized; h++) { + let value = ${yG(W,X,"x[h + offset]")}; + mean_vector += value; + mean_square_vector += value * value; + } + let mean = ${N7("mean_vector",X)} / uniforms.norm_size; + let inv_std_dev = inverseSqrt(${N7("mean_square_vector",X)} / uniforms.norm_size ${G?"":"- mean * mean"} + uniforms.epsilon); + + for (var j: u32 = 0; j < uniforms.norm_size_vectorized; j++) { + let f32input = ${yG(W,X,"x[j + offset]")}; + let f32scale = ${yG(W,X,"scale[j]")}; + output[j + offset] = ${E[0].type.value}((f32input ${G?"":"- mean"}) * inv_std_dev * f32scale + ${N?`+ ${yG(W,X,"bias[j]")}`:""} + ); + } + + ${k?"mean_data_output[global_idx] = mean":""}; + ${z?"inv_std_output[global_idx] = inv_std_dev":""}; + }`}}},$I=($,j)=>{zS($.inputs),$.compute(kS($.inputs,j,$.outputCount))}}),$K=I5(()=>{D6(),XR(),TR(),IS=($)=>{if(!$||$.length!==2)throw Error("MatMul requires 2 inputs.");if($[0].dims[$[0].dims.length-1]!==$[1].dims[$[1].dims.length-2])throw Error("shared dimension does not match.")},jI=($)=>{IS($.inputs);let j=IG.calcShape($.inputs[0].dims,$.inputs[1].dims,!0);if(!j)throw Error("Can't use matmul on the given tensors");let O=j[j.length-1],G=$.inputs[0].dims[$.inputs[0].dims.length-1];if(O<8&&G<8)$.compute(UR($.inputs,{activation:""},j));else{let Z=j[j.length-2],V=l0.size($.inputs[0].dims.slice(0,-2)),N=l0.size($.inputs[1].dims.slice(0,-2));if(V!==1&&Z===1&&N===1){let J=[1,V,O],R=[$.inputs[0].reshape([1,V,G]),$.inputs[1].reshape([1,G,O])];$.compute(YV(R,{activation:""},j,J),{inputs:R})}else $.compute(YV($.inputs,{activation:""},j))}}}),jK=I5(()=>{Y6(),D6(),B9(),M6(),DS=($,j)=>{if($.length<3||$.length>4)throw Error("MatMulNBits requires 3 or 4 inputs");let O=$[0],G=O.dims.length;if(O.dims[G-1]!==j.k)throw Error("The last dim of input shape does not match the k value");let Z=Math.floor((j.k+j.blockSize-1)/j.blockSize),V=j.blockSize/8*j.bits,N=$[1];if(!l0.areEqual(N.dims,[j.n,Z,V]))throw Error("The second inputs must be 3D tensor with shape N X nBlocksPerCol X blobSize");let J=$[2].dims;if(l0.size(J)!==j.n*Z)throw Error("scales input size error.");if($.length===4){let R=$[3].dims,U=j.bits>4?j.n*Z:j.n*Math.floor((Z+1)/2);if(l0.size(R)!==U)throw Error("zeroPoints input size error.")}},WS=($,j)=>{let O=$[0].dims,G=O.length,Z=O[G-2],V=j.k,N=j.n,J=O.slice(0,G-2),R=l0.size(J),U=$[1].dims[2]/4,H=$[0].dataType,L=K9(j.k),Y=K9(U),S=K9(N),X=J.concat([Z,N]),D=Z>1&&N/S%2==0?2:1,I=l0.size(X)/S/D,k=64,z=[],w=[R,Z,V/L],T=l0.convertShape($[1].dims).slice();T.splice(-1,1,U/Y),z.push(...j6(w)),z.push(...j6(T)),z.push(...j6($[2].dims)),$.length===4&&z.push(...j6(l0.convertShape($[3].dims)));let W=[R,Z,N/S];return z.push(...j6(W)),{name:"MatMulNBits",shaderCache:{hint:`${j.blockSize};${j.bits};${L};${Y};${S};${D};64`,inputDependencies:Array($.length).fill("rank")},getRunData:()=>({outputs:[{dims:X,dataType:H}],dispatchGroup:{x:I},programUniforms:z}),getShaderSource:(E)=>{let Q=w.length,A=O5("a",$[0].dataType,Q,L),l=O5("b",12,T.length,Y),r=O5("scales",$[2].dataType,$[2].dims.length),e=[A,l,r],V0=$.length===4?O5("zero_points",12,$[3].dims.length):void 0;V0&&e.push(V0);let v0=W.length,$0=t5("output",$[0].dataType,v0,S),i=Z1($[0].dataType),G0=(()=>{switch(L){case 1:return`array<${i}, 8>`;case 2:return`mat4x2<${i}>`;case 4:return`mat2x4<${i}>`;default:throw Error(`${L}-component is not supported.`)}})();return` + var workgroup_shared: array<${$0.type.value}, ${D*k}>; + ${E.declareVariables(...e,$0)} + ${E.mainStart([k,1,1])} + let output_indices = ${$0.offsetToIndices(`(global_idx / 64) * ${D}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let nBlocksPerCol = uniforms.b_shape[1]; + + for (var block = local_id.x; block < nBlocksPerCol; block += 64) { + //process one block + var word_offset: u32 = block * ${j.blockSize/L}; + ${(()=>{let S0=` + var col_index = col * ${S}; + ${V0?` + let zero_point_bytes_per_col = (nBlocksPerCol + 1) / 2; + var zero_point_byte_count: u32; + var zero_point_word_index: u32; + var zero_point_byte_offset: u32; + let zero_point_nibble_offset: u32 = block & 0x1u; + var zero_point_bits_offset: u32; + var zero_point_word: u32;`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${i}(8);`} + `;for(let F0=0;F0> 0x1u); + zero_point_word_index = zero_point_byte_count >> 0x2u; + zero_point_byte_offset = zero_point_byte_count & 0x3u; + zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + zero_point_word = ${V0.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point${F0} = ${i}((zero_point_word) & 0xFu);`:""} + col_index += 1;`;return S0})()} + for (var word: u32 = 0; word < ${U}; word += ${Y}) { + ${(()=>{let S0=`col_index = col * ${S};`;for(let F0=0;F0; + var b_value_upper: vec4; + var b_quantized_values: ${G0}; + var b_dequantized_values: ${G0};`,S0})()} + for (var i: u32 = 0; i < ${Y}; i++) { + ${(()=>{let S0=` + // reuse a data + var input_offset = ${A.indicesToOffset(`${A.type.indices}(batch, row, word_offset)`)}; + var a_data: ${G0}; + for (var j: u32 = 0; j < ${8/L}; j++) { + a_data[j] = ${A.getByOffset("input_offset")}; + input_offset++; + } + `;for(let F0=0;F0> 4) & b_mask); + b_quantized_values = ${G0}(${Array.from({length:4},(s,n)=>`${i}(b_value_lower[${n}]), ${i}(b_value_upper[${n}])`).join(", ")}); + b_dequantized_values = ${L===1?`${G0}(${Array.from({length:8},(s,n)=>`(b_quantized_values[${n}] - ${V0?`zero_point${F0}`:"zero_point"}) * scale${F0}`).join(", ")});`:`(b_quantized_values - ${G0}(${Array(8).fill(V0?`zero_point${F0}`:"zero_point").join(",")})) * scale${F0};`}; + workgroup_shared[local_id.x * ${D} + ${Math.floor(F0/S)}]${S>1?`[${F0%S}]`:""} += ${Array.from({length:8/L},(s,n)=>L===1?`a_data[${n}] * b_dequantized_values[${n}]`:`dot(a_data[${n}], b_dequantized_values[${n}])`).join(" + ")}; + `;return S0})()} + word_offset += ${8/L}; + } + } + } + workgroupBarrier(); + + if (local_id.x < ${D}) { + var output_value: ${$0.type.value} = ${$0.type.value}(0); + var workgroup_shared_offset: u32 = local_id.x; + for (var b: u32 = 0u; b < 64u; b++) { + output_value += workgroup_shared[workgroup_shared_offset]; + workgroup_shared_offset += ${D}; + } + ${$0.setByIndices(`${$0.type.indices}(batch, row, col + local_id.x)`,"output_value")}; + } + }`}}},MS=($,j)=>{let O=$[0].dims,G=O.length,Z=O[G-2],V=j.k,N=j.n,J=O.slice(0,G-2),R=l0.size(J),U=$[1].dims[2]/4,H=$[0].dataType,L=K9(j.k),Y=K9(U),S=J.concat([Z,N]),X=N%8==0?8:N%4==0?4:1,D=128/X,I=D*Y*8,k=I/L,z=I/j.blockSize,w=l0.size(S)/X,T=[],W=[R,Z,V/L],E=l0.convertShape($[1].dims).slice();E.splice(-1,1,U/Y),T.push(...j6(W)),T.push(...j6(E)),T.push(...j6($[2].dims)),$.length===4&&T.push(...j6(l0.convertShape($[3].dims)));let Q=[R,Z,N];return T.push(...j6(Q)),{name:"BlockwiseMatMulNBits32",shaderCache:{hint:`${j.blockSize};${L};${Y};${D};${X}`,inputDependencies:Array($.length).fill("rank")},getRunData:()=>({outputs:[{dims:S,dataType:H}],dispatchGroup:{x:w},programUniforms:T}),getShaderSource:(A)=>{let l=W.length,r=O5("a",$[0].dataType,l,L),e=O5("b",12,E.length,Y),V0=O5("scales",$[2].dataType,$[2].dims.length),v0=[r,e,V0],$0=$.length===4?O5("zero_points",12,$[3].dims.length):void 0;$0&&v0.push($0);let i=Q.length,G0=t5("output",$[0].dataType,i),S0=Z1($[0].dataType);return` + var sub_a: array<${r.type.value}, ${k}>; + var inter_results: array, ${X}>; + ${A.declareVariables(...v0,G0)} + ${A.mainStart([D,X,1])} + let output_indices = ${G0.offsetToIndices(`workgroup_index * ${X}`)}; + let col = output_indices[2]; + let row = output_indices[1]; + let batch = output_indices[0]; + let n_blocks_per_col = uniforms.b_shape[1]; + let num_tiles = (n_blocks_per_col - 1) / ${z} + 1; + + // Loop over shared dimension. + for (var tile: u32 = 0; tile < num_tiles; tile += 1) { + let a_col_start = tile * ${k}; + // load one tile A data into shared memory. + for (var a_offset = local_idx; a_offset < ${k}; a_offset += 128) + { + let a_col = a_col_start + a_offset; + if (a_col < uniforms.a_shape[2]) + { + sub_a[a_offset] = ${r.getByIndices(`${r.type.indices}(batch, row, a_col)`)}; + } else { + sub_a[a_offset] = ${r.type.value}(0); + } + } + workgroupBarrier(); + + // each thread process one block + let b_row = col + local_id.y; + let block = tile * ${z} + local_id.x; + ${$0?` + let zero_point_bytes_per_col = (n_blocks_per_col + 1) / 2; + let zero_point_byte_count = b_row * zero_point_bytes_per_col + (block >> 0x1u); + let zero_point_word_index = zero_point_byte_count >> 0x2u; + let zero_point_byte_offset = zero_point_byte_count & 0x3u; + let zero_point_nibble_offset: u32 = block & 0x1u; + let zero_point_bits_offset = (zero_point_byte_offset << 3) + (zero_point_nibble_offset << 2); + let zero_point_word = ${$0.getByOffset("zero_point_word_index")} >> zero_point_bits_offset; + let zero_point = ${S0}((zero_point_word) & 0xFu);`:` + // The default zero point is 8 for unsigned 4-bit quantization. + let zero_point = ${S0}(8);`} + let scale = ${V0.getByOffset("b_row * n_blocks_per_col + block")}; + let b_data = ${e.getByIndices(`${e.type.indices}(b_row, block, 0)`)}; + var word_offset = local_id.x * ${j.blockSize/L}; + for (var i: u32 = 0; i < ${Y}; i++) { + ${(()=>{switch(L){case 1:return` + let a_data0 = vec4<${S0}>(sub_a[word_offset], sub_a[word_offset + 1], sub_a[word_offset + 2], sub_a[word_offset + 3]); + let a_data1 = vec4<${S0}>(sub_a[word_offset + 4], sub_a[word_offset + 5], sub_a[word_offset + 6], sub_a[word_offset + 7]);`;case 2:return` + let a_data0 = vec4<${S0}>(sub_a[word_offset], sub_a[word_offset + 1]); + let a_data1 = vec4<${S0}>(sub_a[word_offset + 2], sub_a[word_offset + 3]);`;case 4:return` + let a_data0 = sub_a[word_offset]; + let a_data1 = sub_a[word_offset + 1];`;default:throw Error(`${L}-component is not supported.`)}})()} + let b_value = ${Y===1?"b_data":"b_data[i]"}; + let b_value_lower = unpack4xU8(b_value & 0x0F0F0F0Fu); + let b_value_upper = unpack4xU8((b_value >> 4) & 0x0F0F0F0Fu); + let b_quantized_values = mat2x4<${S0}>(${Array.from({length:4},(F0,s)=>`${S0}(b_value_lower[${s}]), ${S0}(b_value_upper[${s}])`).join(", ")}); + let b_dequantized_values = (b_quantized_values - mat2x4<${S0}>(${Array(8).fill("zero_point").join(",")})) * scale; + inter_results[local_id.y][local_id.x] += ${Array.from({length:2},(F0,s)=>`dot(a_data${s}, b_dequantized_values[${s}])`).join(" + ")}; + word_offset += ${8/L}; + } + workgroupBarrier(); + } + + if (local_idx < ${X}) { + var output_value: ${G0.type.value} = ${G0.type.value}(0); + for (var b = 0u; b < ${D}; b++) { + output_value += inter_results[local_idx][b]; + } + if (col + local_idx < uniforms.output_shape[2]) + { + ${G0.setByIndices(`${G0.type.indices}(batch, row, col + local_idx)`,"output_value")} + } + } + }`}}},OI=($,j)=>{DS($.inputs,j),j.blockSize===32&&$.adapterInfo.isVendor("intel")&&$.adapterInfo.isArchitecture("gen-12lp")?$.compute(MS($.inputs,j)):$.compute(WS($.inputs,j))},GI=($)=>j9($)}),OK=I5(()=>{Y6(),D6(),M6(),KS=($)=>{if(!$||$.length<1)throw Error("Too few inputs");if($[0].dataType!==1&&$[0].dataType!==10)throw Error("Input type must be float or float16.");if($.length>=2){let j=2*$[0].dims.length===$[1].dims[0];if($.length===4&&(j=2*$[3].dims[0]===$[1].dims[0]),!j)throw Error("The pads should be a 1D tensor of shape [2 * input_rank] or [2 * num_axes].")}},bS=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${R6("uniforms.pads",Z,O)}; + if (k < 0) { + break; + } + if (k >= i32(${R6("uniforms.x_shape",Z,j)})) { + break; + } + offset += k * i32(${R6("uniforms.x_strides",Z,j)}); + `;return` + value = ${$.type.value}(uniforms.constant_value); + for (var i = 0; i < 1; i++) { + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + } + `},fS=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${R6("uniforms.pads",Z,O)}; + if (k < 0) { + k = -k; + } + { + let _2n_1 = 2 * (i32(${R6("uniforms.x_shape",Z,j)}) - 1); + k = k % _2n_1; + if(k >= i32(${R6("uniforms.x_shape",Z,j)})) { + k = _2n_1 - k; + } + } + offset += k * i32(${R6("uniforms.x_strides",Z,j)}); + `;return` + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + `},wS=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${R6("uniforms.pads",Z,O)}; + if (k < 0) { + k = 0; + } + if (k >= i32(${R6("uniforms.x_shape",Z,j)})) { + k = i32(${R6("uniforms.x_shape",Z,j)}) - 1; + } + offset += k * i32(${R6("uniforms.x_strides",Z,j)}); + `;return` + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + `},ES=($,j,O)=>{let G="";for(let Z=j-1;Z>=0;--Z)G+=` + k = i32(${$.indicesGet("indices",Z)}) - ${R6("uniforms.pads",Z,O)}; + if (k < 0) { + k += i32(${R6("uniforms.x_shape",Z,j)}]); + } + if (k >= i32(${R6("uniforms.x_shape",Z,j)})) { + k -= i32(${R6("uniforms.x_shape",Z,j)}); + } + offset += k * i32(${R6("uniforms.x_strides",Z,j)}); + `;return` + var offset = 0; + var k = 0; + ${G} + value = x[offset]; + `},QS=($,j,O)=>{switch(O.mode){case 0:return bS($,j,O.pads.length);case 1:return fS($,j,O.pads.length);case 2:return wS($,j,O.pads.length);case 3:return ES($,j,O.pads.length);default:throw Error("Invalid mode")}},CS=($,j)=>{let O=l0.padShape($[0].dims.slice(),j.pads),G=$[0].dims,Z=[{type:12,data:l0.size(O)},{type:6,data:j.pads}],V=$.length>=3&&$[2].data;return j.mode===0&&Z.push({type:V?$[2].dataType:1,data:j.value}),Z.push(...j6($[0].dims,O)),{name:"Pad",shaderCache:{hint:`${j.mode}${V}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:O,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(l0.size(O)/64)},programUniforms:Z}),getShaderSource:(N)=>{let J=t5("output",$[0].dataType,O.length),R=O5("x",$[0].dataType,G.length),U=R.type.value,H=QS(J,G.length,j),L=[{name:"output_size",type:"u32"},{name:"pads",type:"i32",length:j.pads.length}];return j.mode===0&&L.push({name:"constant_value",type:V?U:"f32"}),` + ${N.registerUniforms(L).declareVariables(R,J)} + ${N.mainStart()} + ${N.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + + let indices = ${J.offsetToIndices("global_idx")}; + + var value = ${U}(0); + ${H} + output[global_idx] = value; + }`}}},BS=($,j)=>{if($.length>1){let O=$[1].getBigInt64Array(),G=$.length>=3&&$[2].data?$[2].dataType===10?$[2].getUint16Array()[0]:$[2].getFloat32Array()[0]:0,Z=$[0].dims.length,V=new Int32Array(2*Z).fill(0);if($.length>=4){let J=$[3].getBigInt64Array();for(let R=0;RV[Number(R)]=Number(J));let N=[];return V.forEach((J)=>N.push(J)),{mode:j.mode,value:G,pads:N}}return j},ZI=($,j)=>{KS($.inputs);let O=BS($.inputs,j);$.compute(CS($.inputs,O),{inputs:[0]})}}),GK=I5(()=>{Q3(),Y6(),D6(),M6(),IZ=($)=>{if(T9.webgpu.validateInputContent&&(!$||$.length!==1))throw Error("Pool ops requires 1 input.")},zJ=($,j,O)=>{let G=j.format==="NHWC",Z=$.dims.slice();G&&Z.splice(1,0,Z.pop());let V=Object.hasOwnProperty.call(j,"dilations"),N=j.kernelShape.slice(),J=j.strides.slice(),R=V?j.dilations.slice():[],U=j.pads.slice();LV.adjustPoolAttributes(O,Z,N,J,R,U);let H=LV.computePoolOutputShape(O,Z,J,R,N,U,j.autoPad),L=Object.assign({},j);V?Object.assign(L,{kernelShape:N,strides:J,pads:U,dilations:R,cacheKey:j.cacheKey}):Object.assign(L,{kernelShape:N,strides:J,pads:U,cacheKey:j.cacheKey});let Y=H.slice();return Y.push(Y.splice(1,1)[0]),[L,G?Y:H]},kJ=($,j)=>{let O=j.format==="NHWC",G=[{type:12,data:l0.size($)},{type:12,data:l0.size(j.kernelShape)}],Z=[{name:"outputSize",type:"u32"},{name:"kernelSize",type:"u32"}];if(j.kernelShape.length<=2){let V=j.kernelShape[j.kernelShape.length-1],N=j.strides[j.strides.length-1],J=j.pads[j.pads.length/2-1],R=j.pads[j.pads.length-1],U=!!(J+R);G.push({type:12,data:V},{type:12,data:N},{type:12,data:J},{type:12,data:R}),Z.push({name:"kw",type:"u32"},{name:"sw",type:"u32"},{name:"pwStart",type:"u32"},{name:"pwEnd",type:"u32"});let H=!1;if(j.kernelShape.length===2){let L=j.kernelShape[j.kernelShape.length-2],Y=j.strides[j.strides.length-2],S=j.pads[j.pads.length/2-2],X=j.pads[j.pads.length-2];H=!!(S+X),G.push({type:12,data:L},{type:12,data:Y},{type:12,data:S},{type:12,data:X}),Z.push({name:"kh",type:"u32"},{name:"sh",type:"u32"},{name:"phStart",type:"u32"},{name:"phEnd",type:"u32"})}return[G,Z,!0,U,H]}{if(O)throw Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let V=l0.computeStrides(j.kernelShape);return G.push({type:12,data:V},{type:12,data:j.pads},{type:12,data:j.strides}),Z.push({name:"kernelStrides",type:"u32",length:V.length},{name:"pads",type:"u32",length:j.pads.length},{name:"strides",type:"u32",length:j.strides.length}),[G,Z,!!j.pads.reduce((N,J)=>N+J),!1,!1]}},IJ=($,j,O,G,Z,V,N,J,R,U,H,L)=>{let Y=Z.format==="NHWC",S=j.type.value,X=t5("output",j.type.tensor,G);if(Z.kernelShape.length<=2){let D="",I="",k="",z=O-(Y?2:1);if(D=H?` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${z}] = indices[${z}] * uniforms.sw - uniforms.pwStart + i; + if (xIndices[${z}] < 0 || xIndices[${z}] + >= uniforms.x_shape[${z}]) { + pad++; + continue; + } + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + }`:` + for (var i: u32 = 0u; i < uniforms.kw; i++) { + xIndices[${z}] = indices[${z}] * uniforms.sw - uniforms.pwStart + i; + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + }`,Z.kernelShape.length===2){let w=O-(Y?3:2);I=L?` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${w}] = indices[${w}] * uniforms.sh - uniforms.phStart + j; + if (xIndices[${w}] < 0 || xIndices[${w}] >= uniforms.x_shape[${w}]) { + pad += i32(uniforms.kw); + continue; + } + `:` + for (var j: u32 = 0u; j < uniforms.kh; j++) { + xIndices[${w}] = indices[${w}] * uniforms.sh - uniforms.phStart + j; + `,k=` + } + `}return` + ${$.registerUniforms(R).declareVariables(j,X)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + + let indices = ${X.offsetToIndices("global_idx")}; + var xIndices = ${X.offsetToIndices("global_idx")}; + + var value = ${S}(${J}); + var pad = 0; + ${I} + ${D} + ${k} + ${N} + + output[global_idx] = value; + }`}{if(Y)throw Error("Pooling with kernelShape.length > 2 is not supported for NHWC format.");let D=Z.kernelShape.length,I=Z.pads.length,k="";return k=U?` + if (xIndices[j] >= uniforms.x_shape[j]) { + pad++; + isPad = true; + break; + } + } + if (!isPad) { + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + }`:` + } + let x_val = x[${j.indicesToOffset("xIndices")}]; + ${V} + `,` + ${$.registerUniforms(R).declareVariables(j,X)} + + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let indices = ${X.offsetToIndices("global_idx")}; + var xIndices = ${X.offsetToIndices("global_idx")}; + + var offsets: array; + + var value = ${S}(${J}); + var pad = 0; + var isPad = false; + + for (var i: u32 = 0u; i < uniforms.kernelSize; i++) { + var offset = i; + for (var j = 0u; j < ${D-1}u; j++) { + offsets[j] = offset / ${R6("uniforms.kernelStrides","j",D)}; + offset -= offsets[j] * ${R6("uniforms.kernelStrides","j",D)}; + } + offsets[${D-1}] = offset; + + isPad = false; + for (var j = ${O-D}u; j < ${O}u; j++) { + xIndices[j] = indices[j] * ${R6("uniforms.strides",`j - ${O-D}u`,D)} + + offsets[j - ${O-D}u] - ${R6("uniforms.pads","j - 2u",I)}; + ${k} + } + ${N} + + output[global_idx] = value; + }`}},DJ=($)=>`${$.format};${$.ceilMode};${$.autoPad};${$.kernelShape.length}`,hS=($)=>`${DJ($)};${$.countIncludePad}`,cS=($)=>`${DJ($)};${$.storageOrder};${$.dilations}`,WJ=($)=>({format:$.format,autoPad:["NOTSET","VALID","SAME_UPPER","SAME_LOWER"][$.auto_pad],ceilMode:$.ceil_mode,kernelShape:$.kernel_shape,strides:$.strides,pads:$.pads}),MJ=($,j,O,G)=>{let[Z,V]=zJ(j,G,O),N=O5("x",j.dataType,j.dims.length),J=N.type.value,R="";Z.countIncludePad?R+=`value /= ${J}(uniforms.kernelSize);`:R+=`value /= ${J}(i32(uniforms.kernelSize) - pad);`;let[U,H,L,Y,S]=kJ(V,Z);return U.push(...j6(j.dims,V)),{name:$,shaderCache:{hint:`${G.cacheKey};${L};${Y};${S}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:V,dataType:j.dataType}],dispatchGroup:{x:Math.ceil(l0.size(V)/64)},programUniforms:U}),getShaderSource:(X)=>IJ(X,N,j.dims.length,V.length,Z,"value += x_val;",R,0,H,L,Y,S)}},qI=($)=>{let j=$.count_include_pad!==0,O=WJ($);if(O.ceilMode!==0)throw Error("using ceil() in shape computation is not yet supported for AveragePool");let G={countIncludePad:j,...O,cacheKey:""};return{...G,cacheKey:hS(G)}},VI=($,j)=>{IZ($.inputs),$.compute(MJ("AveragePool",$.inputs[0],!1,j))},KJ={autoPad:"",ceilMode:0,countIncludePad:!1,kernelShape:[],strides:[],pads:[],storageOrder:0,dilations:[]},NI=($)=>{let j=$.format;return{format:j,...KJ,cacheKey:j}},JI=($,j)=>{IZ($.inputs),$.compute(MJ("GlobalAveragePool",$.inputs[0],!0,j))},bJ=($,j,O,G)=>{let[Z,V]=zJ(j,G,O),N=O5("x",j.dataType,j.dims.length),[J,R,U,H,L]=kJ(V,Z);return J.push(...j6(j.dims,V)),{name:$,shaderCache:{hint:`${G.cacheKey};${U};${H};${L}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:V,dataType:j.dataType}],dispatchGroup:{x:Math.ceil(l0.size(V)/64)},programUniforms:J}),getShaderSource:(Y)=>IJ(Y,N,j.dims.length,V.length,Z,` + value = max(x_val, value); + `,"",j.dataType===10?-65504:-1e5,R,U,H,L)}},vI=($,j)=>{IZ($.inputs),$.compute(bJ("MaxPool",$.inputs[0],!1,j))},RI=($)=>{let{storage_order:j,dilations:O}=$,G=WJ($);if(j!==0)throw Error("column major storage order is not yet supported for MaxPool");if(G.ceilMode!==0)throw Error("using ceil() in shape computation is not yet supported for MaxPool");let Z={storageOrder:j,dilations:O,...G,cacheKey:""};return{...Z,cacheKey:cS(Z)}},UI=($)=>{let j=$.format;return{format:j,...KJ,cacheKey:j}},HI=($,j)=>{IZ($.inputs),$.compute(bJ("GlobalMaxPool",$.inputs[0],!0,j))}}),ZK=I5(()=>{Y6(),D6(),B9(),M6(),mS=($,j)=>{if($.length<2||$.length>3)throw Error("DequantizeLinear requires 2 or 3 inputs.");if($.length===3&&$[1].dims===$[2].dims)throw Error("x-scale and x-zero-point must have the same shape.");if($.length===3&&$[0].dataType!==$[2].dataType)throw Error("x and x-zero-point must have the same data type.");if($[0].dataType===6&&$.length>2)throw Error("In the case of dequantizing int32 there is no zero point.");if($[1].dims.length!==0&&$[1].dims.length!==1&&$[1].dims.length!==$[0].dims.length)throw Error("scale input must be a scalar, a 1D tensor, or have the same rank as the input tensor.");if($.length>2){if($[0].dataType!==$[2].dataType)throw Error("x and x-zero-point must have the same data type.");if($[1].dims.length!==$[2].dims.length)throw Error("scale and zero-point inputs must have the same rank.");if(!$[1].dims.map((O,G)=>O===$[2].dims[G]).reduce((O,G)=>O&&G,!0))throw Error("scale and zero-point inputs must have the same shape.")}if(j.blockSize>0){if($[1].dims.length===0||$[1].dims.length===1&&$[1].dims[0]===1)throw Error("blockSize must be set only for block quantization.");if(!$[1].dims.map((Z,V)=>V===j.axis||Z===$[0].dims[V]).reduce((Z,V)=>Z&&V,!0))throw Error("For block qunatization, scale input shape to match the input shape except for the axis");if($[1].dims.length!==$[0].dims.length)throw Error("For block qunatization the scale input rank must be the same as the x rank.");let O=$[0].dims[j.axis],G=$[1].dims[j.axis];if(j.blockSizeMath.ceil(O/(G-1)-1))throw Error("blockSize must be with in the range [ceil(dI / Si), ceil(dI / (Si - 1) - 1)].")}},pS=($,j)=>{let O=l0.normalizeAxis(j.axis,$[0].dims.length),G=$[0].dataType,Z=G===3,V=$[0].dims,N=$[1].dataType,J=l0.size(V),R=G===3||G===2,U=R?[Math.ceil(l0.size($[0].dims)/4)]:$[0].dims,H=$[1].dims,L=$.length>2?$[2]:void 0,Y=L?R?[Math.ceil(l0.size(L.dims)/4)]:L.dims:void 0,S=H.length===0||H.length===1&&H[0]===1,X=S===!1&&H.length===1,D=K9(J),I=S&&(!R||D===4),k=I?D:1,z=I&&!R?D:1,w=O5("input",R?12:G,U.length,z),T=O5("scale",N,H.length),W=L?O5("zero_point",R?12:G,Y.length):void 0,E=t5("output",N,V.length,k),Q=[w,T];W&&Q.push(W);let A=[U,H];L&&A.push(Y);let l=[{type:12,data:J/k},{type:12,data:O},{type:12,data:j.blockSize},...j6(...A,V)];return{name:"DequantizeLinear",shaderCache:{hint:j.cacheKey,inputDependencies:W?["rank","rank","rank"]:["rank","rank"]},getShaderSource:(r)=>` + ${r.registerUniforms([{name:"output_size",type:"u32"},{name:"axis",type:"u32"},{name:"block_size",type:"u32"}]).declareVariables(...Q,E)} + ${r.mainStart()} + ${r.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${E.offsetToIndices("global_idx")}; + + // Set input x + ${R?` + let input = ${w.getByOffset("global_idx / 4")}; + let x_vec = ${Z?"unpack4xI8(input)":"unpack4xU8(input)"}; + let x_value = ${k===1?"x_vec[global_idx % 4]":"x_vec"};`:`let x_value = ${w.getByOffset("global_idx")};`}; + + // Set scale input + ${S?`let scale_value= ${T.getByOffset("0")}`:X?` + let scale_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let scale_value= ${T.getByOffset("scale_index")};`:` + var scale_indices: ${T.type.indices} = output_indices; + let index = ${T.indicesGet("scale_indices","uniforms.axis")} / uniforms.block_size; + ${T.indicesSet("scale_indices","uniforms.axis","index")}; + let scale_value= ${T.getByIndices("scale_indices")};`}; + + // Set zero-point input + ${W?S?R?` + let zero_point_input = ${W.getByOffset("0")}; + let zero_point_vec = ${Z?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value= zero_point_vec[0]`:`let zero_point_value = ${W.getByOffset("0")}`:X?R?` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_input = ${W.getByOffset("zero_point_index / 4")}; + let zero_point_vec = ${Z?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_index % 4]`:` + let zero_point_index = ${E.indicesGet("output_indices","uniforms.axis")}; + let zero_point_value = ${W.getByOffset("zero_point_index")};`:R?` + let zero_point_offset = ${T.indicesToOffset("scale_indices")}; + let zero_point_input = ${W.getByOffset("zero_point_offset / 4")}; + let zero_point_vec = ${Z?"unpack4xI8(zero_point_input)":"unpack4xU8(zero_point_input)"}; + let zero_point_value = zero_point_vec[zero_point_offset % 4];`:`let zero_point_value = ${W.getByIndices("scale_indices")};`:`let zero_point_value = ${R?Z?"i32":"u32":w.type.value}(0);`}; + // Compute and write output + ${E.setByOffset("global_idx",`${E.type.value}(x_value - zero_point_value) * scale_value`)}; + }`,getRunData:()=>({outputs:[{dims:V,dataType:N}],dispatchGroup:{x:Math.ceil(J/k/64),y:1,z:1},programUniforms:l})}},xI=($,j)=>{mS($.inputs,j),$.compute(pS($.inputs,j))},LI=($)=>j9({axis:$.axis,blockSize:$.blockSize})}),qK=I5(()=>{Q3(),Y6(),M6(),AS=($,j,O)=>{if($===j||$j&&O>0)throw Error("Range these inputs' contents are invalid.")},gS=($,j,O,G)=>{let Z=Math.abs(Math.ceil((j-$)/O)),V=[Z],N=Z,J=[{type:12,data:N},{type:G,data:$},{type:G,data:O},...j6(V)];return{name:"Range",shaderCache:{hint:`${G}`},getShaderSource:(R)=>{let U=t5("output",G,V.length),H=U.type.value,L=[{name:"outputSize",type:"u32"},{name:"start",type:H},{name:"delta",type:H}];return` + ${R.registerUniforms(L).declareVariables(U)} + ${R.mainStart()} + ${R.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + output[global_idx] = uniforms.start + ${H}(global_idx) * uniforms.delta; + }`},getRunData:()=>({outputs:[{dims:V,dataType:G}],dispatchGroup:{x:Math.ceil(N/64)},programUniforms:J})}},_I=($)=>{let j=0,O=0,G=0;$.inputs[0].dataType===6?(j=$.inputs[0].getInt32Array()[0],O=$.inputs[1].getInt32Array()[0],G=$.inputs[2].getInt32Array()[0]):$.inputs[0].dataType===1&&(j=$.inputs[0].getFloat32Array()[0],O=$.inputs[1].getFloat32Array()[0],G=$.inputs[2].getFloat32Array()[0]),T9.webgpu.validateInputContent&&AS(j,O,G),$.compute(gS(j,O,G,$.inputs[0].dataType),{inputs:[]})}}),VK=I5(()=>{Y6(),D6(),B9(),M6(),uS=($,j,O,G)=>{if($!=="none"&&G!=="i32"&&G!=="u32"&&G!=="f32")throw Error(`Input ${G} is not supported with reduction ${$}.`);let Z=`{ + var oldValue = 0; + loop { + let newValueF32 =`,V=`; + let newValue = bitcast(newValueF32); + let res = atomicCompareExchangeWeak(&${j}, oldValue, newValue); + if res.exchanged { + break; + } + oldValue = res.old_value; + } + }`;switch($){case"none":return`${j}=${O};`;case"add":return G==="i32"||G==="u32"?`atomicAdd(&${j}, bitcast<${G}>(${O}));`:` + ${Z}bitcast<${G}>(oldValue) + (${O})${V}`;case"max":return G==="i32"||G==="u32"?`atomicMax(&${j}, bitcast<${G}>(${O}));`:` + ${Z}max(bitcast(oldValue), (${O}))${V}`;case"min":return G==="i32"||G==="u32"?`atomicMin(&${j}, bitcast<${G}>(${O}));`:`${Z}min(bitcast<${G}>(oldValue), (${O}))${V}`;case"mul":return`${Z}(bitcast<${G}>(oldValue) * (${O}))${V}`;default:throw Error(`Reduction ${$} is not supported.`)}},fJ=($,j)=>($===1?` + let element_count_dim = uniforms.output_strides; + let dim_value = uniforms.output_shape;`:` + let element_count_dim = uniforms.output_strides[${j?"i - indices_start":"i"}]; + let dim_value = uniforms.output_shape[${j?"i - indices_start":"i"} + uniforms.last_index_dimension];`)+` + + if (index >= 0) { + if (index >= i32(dim_value)) { + index = i32(dim_value - 1); + } + } else { + if (index < -i32(dim_value)) { + index = 0; + } else { + index += i32(dim_value); + } + } + data_offset += u32((u32(index) * element_count_dim));`,wJ=($,j,O)=>`for (var i = 0u; i < uniforms.num_updates_elements; i++) { + let value = updates[uniforms.num_updates_elements * ${O?"global_idx":"idx"} + i]; + ${uS($.reduction,"output[data_offset + i]","value",j)} + }`,dS=($,j)=>{let O=$[0].dims,G=$[1].dims,Z=O,V=Math.ceil(l0.size(G)/1),N=G[G.length-1],J=l0.sizeFromDimension(O,N),R=l0.sizeFromDimension(G,0)/N,U=[{type:12,data:V},{type:12,data:N},{type:12,data:J},...j6($[1].dims,$[2].dims,Z)];return{name:"ScatterND",shaderCache:{hint:`${j.cacheKey}_${j.reduction}`,inputDependencies:["rank","rank"]},getRunData:()=>({outputs:[{dims:Z,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:U}),getShaderSource:(H)=>{let L=O5("indices",$[1].dataType,$[1].dims.length),Y=O5("updates",$[2].dataType,$[2].dims.length,1),S=j.reduction!=="none"&&j.reduction!==""?iy("output",$[0].dataType,Z.length):t5("output",$[0].dataType,Z.length,1);return` + ${H.registerUniform("output_size","u32").registerUniform("last_index_dimension","u32").registerUniform("num_updates_elements","u32").declareVariables(L,Y,S)} + ${H.mainStart()} + ${H.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + var hasDuplicates = false; + if (${j.reduction==="none"}) { + for (var i = 0; i < ${R}; i = i + 1) { + for (var j = i + 1; j < ${R}; j = j + 1) { + var index_i = i32(indices[i].x); + var index_j = i32(indices[j].x); + if (index_i == index_j) { + hasDuplicates = true; + break; + } + } + if (hasDuplicates) { + break; + } + } + } + + if (${j.reduction==="none"} && hasDuplicates) { + if (global_idx != 0u) { + return; + } + // Process each index-update pair individually when duplicates exist + for (var idx = 0u; idx < ${R}u; idx++) { + var data_offset = 0u; + for (var i = 0u; i < uniforms.last_index_dimension; i++) { + var index = i32(indices[idx * uniforms.last_index_dimension + i].x); + ${fJ(O.length,!1)} + } + ${wJ(j,S.type.value,!1)} + } + return; + } + + var data_offset = 0u; + var indices_start = uniforms.last_index_dimension * global_idx; + var indices_end = indices_start + uniforms.last_index_dimension; + for (var i = indices_start; i < indices_end; i++) { + var index = i32(indices[i].x); + ${fJ(O.length,!0)} + } + ${wJ(j,S.type.value,!0)} + }`}}},YI=($)=>j9({reduction:$.reduction}),SI=($,j)=>{$.compute(dS($.inputs,j),{inputs:[$.inputs[1],$.inputs[2]],outputs:[]})}}),NK=I5(()=>{Y6(),D6(),B9(),M6(),lS=($,j)=>{if($.every((O)=>O>0||(()=>{throw Error("Resize requires scales input values to be positive")})),$.length>0){if(j.mode==="linear"){if(!($.length===2||$.length===3||$.length===4&&$[0]===1&&$[1]===1||$.length===4&&$[0]===1&&$[3]===1||$.length===5&&$[0]===1&&$[1]===1))throw Error(`For linear mode, Resize requires scales to be 2D, 3D, 4D with either two outermost or one innermost and + one outermost scale values equal to 1, or 5D with two outermost scale values equal to 1`)}else if(j.mode==="cubic"&&!($.length===2||$.length===4&&$[0]===1&&$[1]===1||$.length===4&&$[0]===1&&$[3]===1))throw Error("Resize requires scales input size to be 2 or 4 for cubic mode")}},oS=($,j,O)=>{j.every((Z)=>Z>=0&&Z{throw Error("Resize requires axes input values to be positive and less than rank")}));let G=Array(O).fill(1);return j.forEach((Z,V)=>G[Z]=$[V]),G},sS=($,j,O,G,Z,V)=>{let[N,J,R]=O>10?[1,2,3]:[-1,$.length>1?1:-1,-1],U=$[0].dims.length;if(N>0&&$.length>N&&$[N].dims.length>0)$[N].getFloat32Array().forEach((H)=>V.push(H));else if(j.coordinateTransformMode==="tf_crop_and_resize")throw Error("Resize requires RoI input to be specified when coordinateTransformMode is tfCropAndResize");if(J>0&&$.length>J&&$[J].dims.length===1&&$[J].dims[0]>0){if($[J].getFloat32Array().forEach((H)=>G.push(H)),G.length!==0&&G.length!==U&&O>=18&&G.length!==j.axes.length)throw Error("Resize requires scales input size to be same as input rank or axes size for opset 18 and up");lS(G,j),j.axes.length>0&&oS(G,j.axes,U).forEach((H,L)=>G[L]=H)}if(R>0&&$.length>R&&$[R].dims.length===1&&$[R].dims[0]>0&&($[R].getBigInt64Array().forEach((H)=>Z.push(Number(H))),Z.length!==0&&Z.length!==U&&O>=18&&Z.length!==j.axes.length))throw Error("Resize requires sizes input size to be same as input rank or axes size for opset 18 and up");if(j.axes.length>0){if(G.length!==0&&G.length!==j.axes.length)throw Error('Resize requires "scales" input size to be of axes rank when axes attributes is specified');if(Z.length!==0&&Z.length!==j.axes.length)throw Error('Resize requires "sizes" input size to be of rank axes rank when axes attributes is specified')}if(typeof G<"u"&&typeof Z<"u"&&G.length>0&&Z.length>U)throw Error("Resize requires only of scales or sizes to be specified")},EJ=($,j,O,G)=>` + // The whole part and the fractional part are calculated separately due to inaccuracy of floating + // point division. As an example, f32(21) / f32(7) may evaluate to 2.99... instead of 3, causing an + // offset-by-one error later in floor(). + let big = (${$}) * (${j}); + let whole = ${G}(big / (${O})); + let fract = ${G}(big % (${O})) / ${G}(${O}); + return whole + fract; +`,iS=($,j)=>`fn getOriginalCoordinateFromResizedCoordinate(xResized: u32, xScale: f32, lengthResized: u32, + lengthOriginal: u32, roiStart: f32, roiEnd: f32) -> ${j} { `+(()=>{switch($){case"asymmetric":return` + if (xScale < 1.0 || floor(xScale) != xScale) { + return ${j}(xResized) / ${j}(xScale); + } else { + ${EJ("xResized","lengthOriginal","lengthResized",j)} + } + `;case"pytorch_half_pixel":return`if (lengthResized > 1) { + return (${j}(xResized) + 0.5) / ${j}(xScale) - 0.5; + } else { + return 0.0; + }`;case"tf_half_pixel_for_nn":return`return (${j}(xResized) + 0.5) / ${j}(xScale);`;case"align_corners":return`if (lengthResized == 1) { + return 0.0; + } else { + ${EJ("xResized","lengthOriginal - 1","lengthResized - 1",j)} + }`;case"tf_crop_and_resize":return`if (lengthResized > 1) { + return ${j}(roiStart) * ${j}(lengthOriginal - 1) + + (${j}(xResized) * ${j}(roiEnd - roiStart) * ${j}(lengthOriginal - 1)) / + ${j}(lengthResized - 1); + } else { + return 0.5 * ${j}(roiStart + roiEnd) * ${j}(lengthOriginal - 1); + }`;case"half_pixel_symmetric":return`const outputWidth = ${j}xScale * ${j}(lengthResized); + const adjustment = ${j}(lengthResized) / outputWidth; + const center = ${j}(lengthOriginal) / 2; + const offset = center * (1 - adjustment); + return offset + ((${j}(xResized) + 0.5) / ${j}(xScale)) - 0.5;`;case"half_pixel":return`return ((${j}(xResized) + 0.5) / ${j}(xScale)) - 0.5;`;default:throw Error(`Coordinate transform mode ${$} is not supported`)}})()+"}",aS=($,j,O)=>`fn getNearestPixelFromOriginal(xOriginal: ${O}, isDownSample: bool) -> ${O} {`+(()=>{switch($){case"round_prefer_ceil":return"if (fract(xOriginal) == 0.5) { return ceil(xOriginal); } else { return round(xOriginal); }";case"floor":return"return floor(xOriginal);";case"ceil":return"return ceil(xOriginal);";case"round_prefer_floor":return"if (fract(xOriginal) == 0.5) { return floor(xOriginal); } else { return round(xOriginal); }";default:if(j<11)return"if (isDownSample) { return ceil(xOriginal); } else { return xOriginal; }";throw Error(`Nearest mode ${$} is not supported`)}})()+"}",rS=($,j,O)=>{let G=Array(O).fill(0).concat(Array(O).fill(1)),Z=$.length===0?G:$.slice();return j.length>0?(j.forEach((V,N)=>{G[V]=Z[N],G[N+O]=Z[j.length+N]}),G):Z},nS=($,j,O,G)=>{let Z=[];if(O.length>0)if(G.length>0){if($.forEach((V)=>Z.push(V)),Math.max(...G)>$.length)throw Error("axes is out of bound");G.forEach((V,N)=>Z[V]=O[N])}else O.forEach((V)=>Z.push(V));else{if(j.length===0)throw Error("Resize requires either scales or sizes.");Z=$.map((V,N)=>Math.round(V*j[N]))}return Z},tS=($,j,O)=>{let G=(()=>{switch(O.keepAspectRatioPolicy){case"not_larger":return O.axes.length>0?Math.min(...O.axes.map((V)=>j[V]),Number.MAX_VALUE):Math.min(...j,Number.MAX_VALUE);case"not_smaller":return O.axes.length>0?Math.max(...O.axes.map((V)=>j[V]),Number.MIN_VALUE):Math.max(...j,Number.MIN_VALUE);default:throw Error(`Keep aspect ratio policy ${O.keepAspectRatioPolicy} is not supported`)}})();j.fill(1,0,j.length);let Z=$.slice();return O.axes.length>0?(O.axes.forEach((V)=>j[V]=G),O.axes.forEach((V)=>Z[V]=Math.round($[V]*j[V]))):(j.fill(G,0,j.length),Z.forEach((V,N)=>Z[N]=Math.round(V*j[N]))),Z},eS=($,j,O,G,Z)=>` + fn calculateOriginalIndicesFromOutputIndices(output_indices: ${$.type.indices}) -> array<${$.type.value}, ${O.length}> { + var original_indices: array<${$.type.value}, ${O.length}>; + for (var i:u32 = 0; i < ${O.length}; i++) { + var output_index = ${$.indicesGet("output_indices","i")}; + var scale = ${R6("uniforms.scales","i",G)}; + var roi_low = ${R6("uniforms.roi","i",Z)}; + var roi_hi = ${R6("uniforms.roi",`i + ${j.length}`,Z)}; + if (scale == 1.0) { + original_indices[i] = ${$.type.value}(output_index); + } else { + var input_shape_i = ${R6("uniforms.input_shape","i",j.length)}; + var output_shape_i = ${R6("uniforms.output_shape","i",O.length)}; + original_indices[i] = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + } + } + return original_indices; + }`,$P=($,j,O,G,Z,V,N)=>` + fn calculateInputIndicesFromOutputIndices(output_indices: ${j.type.indices}) -> ${$.type.indices} { + var input_indices: ${$.type.indices}; + for (var i:u32 = 0; i < ${G.length}; i++) { + var output_index = ${j.indicesGet("output_indices","i")}; + var input_index: u32; + var scale = ${R6("uniforms.scales","i",Z)}; + if (scale == 1.0) { + input_index = output_index; + } else { + var roi_low = ${R6("uniforms.roi","i",V)}; + var roi_hi = ${R6("uniforms.roi",`i + ${O.length}`,V)}; + var input_shape_i = ${R6("uniforms.input_shape","i",O.length)}; + var output_shape_i = ${R6("uniforms.output_shape","i",G.length)}; + var original_idx = getOriginalCoordinateFromResizedCoordinate(output_index, scale, output_shape_i, + input_shape_i, roi_low, roi_hi); + if (!${N} || (original_idx >= 0 && original_idx < ${j.type.value}(input_shape_i))) { + if (original_idx < 0) { + input_index = 0; + } else if (original_idx > ${j.type.value}(input_shape_i - 1)) { + input_index = input_shape_i - 1; + } else { + input_index = u32(getNearestPixelFromOriginal(original_idx, scale < 1)); + } + } else { + input_index = u32(original_idx); + } + } + ${$.indicesSet("input_indices","i","input_index")} + } + return input_indices; + }`,jP=($,j)=>` + fn checkInputIndices(input_indices: ${$.type.indices}) -> bool { + for (var i:u32 = 0; i < ${j.length}; i++) { + var input_index = ${$.indicesGet("input_indices","i")}; + if (input_index < 0 || input_index >= ${R6("uniforms.input_shape","i",j.length)}) { + return false; + } + } + return true; + }`,QJ=($,j,O,G)=>$.rank>G?` + ${$.indicesSet("input_indices",j,"channel")}; + ${$.indicesSet("input_indices",O,"batch")}; +`:"",OP=($,j,O,G,Z)=>{let[V,N,J,R]=O.length===2?[-1,0,1,-1]:[0,2,3,1],U=$.type.value;return` + fn getInputValue(batch: u32, channel: u32, row: u32, col: u32) -> ${U} { + var input_indices: ${$.type.indices}; + ${$.indicesSet("input_indices",N,`max(0, min(row, ${O[N]} - 1))`)}; + ${$.indicesSet("input_indices",J,`max(0, min(col, ${O[J]} - 1))`)}; + ${QJ($,R,V,2)} + return ${$.getByIndices("input_indices")}; + } + + fn bilinearInterpolation(output_indices: ${j.type.indices}) -> ${U} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var row:${U} = originalIndices[${N}]; + var col:${U} = originalIndices[${J}]; + ${G?`if (row < 0 || row > (${O[N]} - 1) || col < 0 || col > (${O[J]} - 1)) { + return ${Z}; + }`:""}; + row = max(0, min(row, ${O[N]} - 1)); + col = max(0, min(col, ${O[J]} - 1)); + var row1: u32 = u32(row); + var col1: u32 = u32(col); + var row2: u32 = u32(row + 1); + var col2: u32 = u32(col + 1); + var channel: u32 = ${O.length>2?`u32(originalIndices[${R}])`:"0"}; + var batch: u32 = ${O.length>2?`u32(originalIndices[${V}])`:"0"}; + var x11: ${U} = getInputValue(batch, channel, row1, col1); + var x12: ${U} = getInputValue(batch, channel, row1, col2); + var x21: ${U} = getInputValue(batch, channel, row2, col1); + var x22: ${U} = getInputValue(batch, channel, row2, col2); + var dx1: ${U} = abs(row - ${U}(row1)); + var dx2: ${U} = abs(${U}(row2) - row); + var dy1: ${U} = abs(col - ${U}(col1)); + var dy2: ${U} = abs(${U}(col2) - col); + if (row1 == row2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (col1 == col2) { + dy1 = 0.5; + dy2 = 0.5; + } + return (x11 * dx2 * dy2 + x12 * dx2 * dy1 + x21 * dx1 * dy2 + x22 * dx1 * dy1); + }`},GP=($,j,O,G,Z,V,N,J,R,U)=>{let H=O.length===2,[L,Y]=H?[0,1]:[2,3],S=$.type.value,X=(D)=>{let I=D===L?"row":"col";return` + fn ${I}CubicInterpolation(input_indices: ${$.type.indices}, output_indices: ${j.type.indices}) -> ${S} { + var output_index = ${j.indicesGet("output_indices",D)}; + var originalIdx: ${S} = getOriginalCoordinateFromResizedCoordinate(output_index, ${Z[D]}, + ${G[D]}, ${O[D]}, ${V[D]}, ${V[D]} + ${O.length}); + var fractOriginalIdx: ${S} = originalIdx - floor(originalIdx); + var coefs = getCubicInterpolationCoefs(fractOriginalIdx); + + if (${J} && (originalIdx < 0 || originalIdx > (${O[D]} - 1))) { + return ${R}; + } + var data: array<${S}, 4> = array<${S}, 4>(0.0, 0.0, 0.0, 0.0); + for (var i: i32 = -1; i < 3; i++) { + var ${I}: ${S} = originalIdx + ${S}(i); + if (${I} < 0 || ${I} >= ${O[D]}) { + ${U?`coefs[i + 1] = 0.0; + continue;`:J?`return ${R};`:`${I} = max(0, min(${I}, ${O[D]} - 1));`}; + } + var input_indices_copy: ${$.type.indices} = input_indices; + ${$.indicesSet("input_indices_copy",D,`u32(${I})`)}; + data[i + 1] = ${D===L?$.getByIndices("input_indices_copy"):"rowCubicInterpolation(input_indices_copy, output_indices)"}; + } + return cubicInterpolation1D(data, coefs); + }`};return` + ${X(L)}; + ${X(Y)}; + fn getCubicInterpolationCoefs(s: ${S}) -> array<${S}, 4> { + var absS = abs(s); + var coeffs: array<${S}, 4> = array<${S}, 4>(0.0, 0.0, 0.0, 0.0); + var oneMinusAbsS: ${S} = 1.0 - absS; + var twoMinusAbsS: ${S} = 2.0 - absS; + var onePlusAbsS: ${S} = 1.0 + absS; + coeffs[0] = ((${N} * onePlusAbsS - 5 * ${N}) * onePlusAbsS + 8 * ${N}) * onePlusAbsS - 4 * ${N}; + coeffs[1] = ((${N} + 2) * absS - (${N} + 3)) * absS * absS + 1; + coeffs[2] = ((${N} + 2) * oneMinusAbsS - (${N} + 3)) * oneMinusAbsS * oneMinusAbsS + 1; + coeffs[3] = ((${N} * twoMinusAbsS - 5 * ${N}) * twoMinusAbsS + 8 * ${N}) * twoMinusAbsS - 4 * ${N}; + return coeffs; + } + + fn cubicInterpolation1D(x: array<${S}, 4>, coefs: array<${S}, 4>) -> ${S} { + var coefsSum: ${S} = coefs[0] + coefs[1] + coefs[2] + coefs[3]; + return (x[0] * coefs[0] + x[1] * coefs[1]+ x[2] * coefs[2]+ x[3] * coefs[3]) / coefsSum; + } + + fn bicubicInterpolation(output_indices: ${j.type.indices}) -> ${S} { + var input_indices: ${$.type.indices} = output_indices; + return colCubicInterpolation(input_indices, output_indices); + } + `},ZP=($,j,O,G,Z)=>{let[V,N,J,R,U]=O.length===3?[-1,0,1,2,-1]:[0,2,3,4,1],H=$.type.value;return` + fn getInputValue(batch: u32, channel: u32, depth:u32, height: u32, width: u32) -> ${H} { + var input_indices: ${$.type.indices}; + ${$.indicesSet("input_indices",N,`max(0, min(depth, ${O[N]} - 1))`)}; + ${$.indicesSet("input_indices",J,`max(0, min(height, ${O[J]} - 1))`)}; + ${$.indicesSet("input_indices",R,`max(0, min(width, ${O[R]} - 1))`)}; + ${QJ($,U,V,3)} + return ${$.getByIndices("input_indices")}; + } + + fn trilinearInterpolation(output_indices: ${j.type.indices}) -> ${H} { + var originalIndices = calculateOriginalIndicesFromOutputIndices(output_indices); + var depth:${H} = originalIndices[${N}]; + var height:${H} = originalIndices[${J}]; + var width:${H} = originalIndices[${R}]; + ${G?`if (depth < 0 || depth > (${O[N]} - 1) || height < 0 || height > (${O[J]} - 1) || width < 0 || (width > ${O[R]} - 1)) { + return ${Z}; + }`:""}; + + depth = max(0, min(depth, ${O[N]} - 1)); + height = max(0, min(height, ${O[J]} - 1)); + width = max(0, min(width, ${O[R]} - 1)); + var depth1: u32 = u32(depth); + var height1: u32 = u32(height); + var width1: u32 = u32(width); + var depth2: u32 = u32(depth + 1); + var height2: u32 = u32(height + 1); + var width2: u32 = u32(width + 1); + var channel: u32 = ${O.length>3?`u32(originalIndices[${U}])`:"0"}; + var batch: u32 = ${O.length>3?`u32(originalIndices[${V}])`:"0"}; + + var x111: ${H} = getInputValue(batch, channel, depth1, height1, width1); + var x112: ${H} = getInputValue(batch, channel, depth1, height1, width2); + var x121: ${H} = getInputValue(batch, channel, depth1, height2, width1); + var x122: ${H} = getInputValue(batch, channel, depth1, height2, width2); + var x211: ${H} = getInputValue(batch, channel, depth2, height1, width1); + var x212: ${H} = getInputValue(batch, channel, depth2, height1, width2); + var x221: ${H} = getInputValue(batch, channel, depth2, height2, width1); + var x222: ${H} = getInputValue(batch, channel, depth2, height2, width2); + var dx1: ${H} = abs(depth - ${H}(depth1)); + var dx2: ${H} = abs(${H}(depth2) - depth); + var dy1: ${H} = abs(height - ${H}(height1)); + var dy2: ${H} = abs(${H}(height2) - height); + var dz1: ${H} = abs(width - ${H}(width1)); + var dz2: ${H} = abs(${H}(width2) - width); + if (depth1 == depth2) { + dx1 = 0.5; + dx2 = 0.5; + } + if (height1 == height2) { + dy1 = 0.5; + dy2 = 0.5; + } + if (width1 == width2) { + dz1 = 0.5; + dz2 = 0.5; + } + return (x111 * dx2 * dy2 * dz2 + x112 * dx2 * dy2 * dz1 + x121 * dx2 * dy1 *dz2 + x122 * dx2 * dy1 * dz1 + + x211 * dx1 * dy2 * dz2 + x212 * dx1 * dy2 * dz1 + x221 * dx1 * dy1 *dz2 + x222 * dx1 * dy1 * dz1); + }`},qP=($,j,O,G,Z,V)=>{let N=$.dims,J=rS(V,j.axes,N.length),R=nS(N,G,Z,j.axes),U=G.slice();G.length===0&&(U=N.map((k,z)=>k===0?1:R[z]/k),j.keepAspectRatioPolicy!=="stretch"&&(R=tS(N,U,j)));let H=t5("output",$.dataType,R.length),L=O5("input",$.dataType,N.length),Y=l0.size(R),S=N.length===R.length&&N.every((k,z)=>k===R[z]),X=j.coordinateTransformMode==="tf_crop_and_resize",D=j.extrapolationValue,I=L.type.value;return{name:"Resize",shaderCache:{hint:`${j.cacheKey}|${O}|${U.length>0?j.mode==="cubic"?U:U.length:""}|${Z.length>0?Z:""}|${J.length>0?J:""}|${S}|${j.mode==="nearest"?N.length:N}`,inputDependencies:["rank"]},getShaderSource:(k)=>` + ${S?"":` + ${iS(j.coordinateTransformMode,I)}; + ${(()=>{switch(j.mode){case"nearest":return` + ${jP(L,N)}; + ${aS(j.nearestMode,O,I)}; + ${$P(L,H,N,R,U.length,J.length,X)}; + `;case"linear":return` + ${eS(H,N,R,U.length,J.length)}; + ${(()=>{if(N.length===2||N.length===4)return`${OP(L,H,N,X,D)}`;if(N.length===3||N.length===5)return`${ZP(L,H,N,X,D)}`;throw Error("Linear mode only supports input dims 2, 3, 4 and 5 are supported in linear mode.")})()}; + `;case"cubic":return` + ${(()=>{if(N.length===2||N.length===4)return`${GP(L,H,N,R,U,J,j.cubicCoeffA,X,j.extrapolationValue,j.excludeOutside)}`;throw Error("Cubic mode only supports input dims 2 and 4 are supported in linear mode.")})()}; + `;default:throw Error("Invalid resize mode")}})()}; + `} + ${k.registerUniform("output_size","u32").registerUniform("scales","f32",U.length).registerUniform("roi","f32",J.length).declareVariables(L,H)} + ${k.mainStart()} + ${k.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + ${S?"output[global_idx] = input[global_idx];":` + let output_indices = ${H.offsetToIndices("global_idx")}; + var input_indices: ${L.type.indices}; + ${(()=>{switch(j.mode){case"nearest":return`input_indices = calculateInputIndicesFromOutputIndices(output_indices); + if (checkInputIndices(input_indices)) { + output[global_idx] = ${L.getByIndices("input_indices")}; + } else { + output[global_idx] = ${j.extrapolationValue}; + }`;case"linear":return`output[global_idx] = ${N.length===2||N.length===4?"bilinearInterpolation":"trilinearInterpolation"}(output_indices);`;case"cubic":return"output[global_idx] = bicubicInterpolation(output_indices);";default:throw Error(`Unsupported resize mode: ${j.mode}`)}})()}; +`} + }`,getRunData:()=>({outputs:[{dims:R,dataType:$.dataType}],dispatchGroup:{x:Math.ceil(Y/64)},programUniforms:[{type:12,data:Y},{type:1,data:U},{type:1,data:J},...j6(N,R)]})}},VP=($)=>{let j=$.customDataBuffer;return new Uint32Array(j,j.byteOffset,1)[0]},PI=($,j)=>{let O=[],G=[],Z=[],V=VP($);if(j.antialias!==0)throw Error("Only default value (0) for Antialias attribute is supported");sS($.inputs,j,V,O,G,Z),$.compute(qP($.inputs[0],j,V,O,G,Z),{inputs:[0]})},XI=($)=>{let{antialias:j,axes:O,coordinateTransformMode:G,cubicCoeffA:Z}=$,V=$.excludeOutside!==0,N=$.extrapolationValue,J=$.keepAspectRatioPolicy,R=$.mode,U=$.nearestMode===""?"simple":$.nearestMode;return j9({antialias:j,axes:O,coordinateTransformMode:G,cubicCoeffA:Z,excludeOutside:V,extrapolationValue:N,keepAspectRatioPolicy:J,mode:R,nearestMode:U})}}),JK=I5(()=>{Y6(),D6(),M6(),NP=($)=>{if(!$||$.length<3)throw Error("layerNorm requires at least 3 inputs.");let j=$[0],O=$[1],G=$[2];if(j.dataType!==O.dataType||j.dataType!==G.dataType)throw Error("All inputs must have the same data type");if(j.dims.length!==3&&j.dims.length!==2)throw Error("Input must be 2D or 3D");if(O.dims.length!==3&&O.dims.length!==2)throw Error("Skip must be 2D or 3D");let Z=j.dims[j.dims.length-1],V=j.dims[j.dims.length-2];if(O.dims[O.dims.length-1]!==Z)throw Error("Skip must have the same hidden size as input");if(O.dims[O.dims.length-2]!==V)throw Error("Skip must have the same sequence length as input");if(G.dims.length!==1)throw Error("Gamma must be 1D");if(G.dims[G.dims.length-1]!==Z)throw Error("Gamma must have the same hidden size as input");if($.length>3){let N=$[3];if(N.dims.length!==1)throw Error("Beta must be 1D");if(N.dims[N.dims.length-1]!==Z)throw Error("Beta must have the same hidden size as input")}if($.length>4){let N=$[4];if(N.dims.length!==1)throw Error("Bias must be 1D");if(N.dims[N.dims.length-1]!==Z)throw Error("Bias must have the same hidden size as input")}},JP=($,j,O,G)=>{let Z=j.simplified,V=$[0].dims,N=l0.size(V),J=V,R=N,U=V.slice(-1)[0],H=G?V.slice(0,-1).concat(1):[],L=!Z&&$.length>3,Y=$.length>4,S=G&&O>1,X=G&&O>2,D=O>3,I=64,k=K9(U),z=[{type:12,data:R},{type:12,data:k},{type:12,data:U},{type:1,data:j.epsilon}],w=[{dims:J,dataType:$[0].dataType}];return O>1&&w.push({dims:H,dataType:1}),O>2&&w.push({dims:H,dataType:1}),O>3&&w.push({dims:V,dataType:$[0].dataType}),{name:"SkipLayerNormalization",shaderCache:{hint:`${k};${S};${X};${D}`,inputDependencies:$.map((T,W)=>"type")},getShaderSource:(T)=>{let W=[O5("x",$[0].dataType,$[0].dims,k),O5("skip",$[1].dataType,$[1].dims,k),O5("gamma",$[2].dataType,$[2].dims,k)];L&&W.push(O5("beta",$[3].dataType,$[3].dims,k)),Y&&W.push(O5("bias",$[4].dataType,$[4].dims,k)),W.push(t5("output",$[0].dataType,J,k)),S&&W.push(t5("mean_output",1,H)),X&&W.push(t5("inv_std_output",1,H)),D&&W.push(t5("input_skip_bias_sum",$[0].dataType,J,k));let E=Z1($[0].dataType),Q=Z1(1,k);return` + + ${T.registerUniforms([{name:"output_size",type:"u32"},{name:"components",type:"u32"},{name:"hidden_size",type:"u32"},{name:"epsilon",type:"f32"}]).declareVariables(...W)} + var sum_shared : array<${Q}, 64>; + var sum_squared_shared : array<${Q}, 64>; + + ${T.mainStart([I,1,1])} + let ix = local_id.x; + let iy = global_id.x / 64; + + let hidden_size_vectorized: u32 = uniforms.hidden_size / uniforms.components; + var stride = hidden_size_vectorized / 64; + let offset = ix * stride + iy * hidden_size_vectorized; + let offset1d = stride * ix; + if (ix == 63) { + stride = hidden_size_vectorized - stride * ix; + } + for (var i: u32 = 0; i < stride; i++) { + let skip_value = skip[offset + i]; + let bias_value = ${Y?"bias[offset1d + i]":E+"(0.0)"}; + let input_value = x[offset + i]; + let value = input_value + skip_value + bias_value; + ${D?"input_skip_bias_sum[offset + i] = value;":""} + output[offset + i] = value; + let f32_value = ${yG(E,k,"value")}; + sum_shared[ix] += f32_value; + sum_squared_shared[ix] += f32_value * f32_value; + } + workgroupBarrier(); + + var reduce_size : u32 = 64; + for (var curr_size = reduce_size >> 1; curr_size > 0; curr_size = reduce_size >> 1) { + reduce_size = curr_size + (reduce_size & 1); + if (ix < curr_size) { + sum_shared[ix] += sum_shared[ix + reduce_size]; + sum_squared_shared[ix] += sum_squared_shared[ix + reduce_size]; + } + workgroupBarrier(); + } + + let sum = sum_shared[0]; + let square_sum = sum_squared_shared[0]; + let mean = ${N7("sum",k)} / f32(uniforms.hidden_size); + let inv_std_dev = inverseSqrt(${N7("square_sum",k)} / f32(uniforms.hidden_size) ${Z?"":"- mean * mean"} + uniforms.epsilon); + ${S?"mean_output[global_idx] = mean;":""} + ${X?"inv_std_output[global_idx] = inv_std_dev;":""} + + for (var i: u32 = 0; i < stride; i++) { + output[offset + i] = (output[offset + i] ${Z?"":`- ${E}(mean)`}) * + ${E}(inv_std_dev) * gamma[offset1d + i] + ${L?"+ beta[offset1d + i]":""}; + } + }`},getRunData:()=>({outputs:w,dispatchGroup:{x:Math.ceil(R/U)},programUniforms:z})}},TI=($,j)=>{NP($.inputs);let O=[0];$.outputCount>1&&O.push(-3),$.outputCount>2&&O.push(-3),$.outputCount>3&&O.push(3),$.compute(JP($.inputs,j,$.outputCount,!1),{outputs:O})}}),vK=I5(()=>{Y6(),D6(),B9(),M6(),vP=($,j)=>{if(!$||$.length<1)throw Error("too few inputs");if(j.axes.length!==0){if(j.axes.length!==j.starts.length||j.axes.length!==j.ends.length)throw Error("axes, starts and ends must have the same length")}else if(j.starts.length!==j.ends.length)throw Error("starts and ends must have the same length");$.slice(1).forEach((O,G)=>{if($[G+1].dataType!==6&&$[G+1].dataType!==7)throw Error(`Input ${G} must be an array of int32 or int64`)})},DZ=($,j)=>{let O=[];if($.length>j)if($[j].dataType===7)$[j].getBigInt64Array().forEach((G)=>O.push(Number(G)));else{if($[j].dataType!==6)throw Error(`Input ${j} must be an array of int32 or int64`);$[j].getInt32Array().forEach((G)=>O.push(Number(G)))}return O},RP=($,j)=>{if($.length>1){let O=DZ($,1),G=DZ($,2),Z=DZ($,3);return Z.length===0&&(Z=[...Array($[0].dims.length).keys()]),j9({starts:O,ends:G,axes:Z})}return j},CJ=($,j,O,G,Z)=>{let V=$;return $<0&&(V+=O[G[j]]),Z[j]<0?Math.max(0,Math.min(V,O[G[j]]-1)):Math.max(0,Math.min(V,O[G[j]]))},UP=($,j,O)=>`fn calculateInputIndices(output_indices: ${j.type.indices}) -> ${$.type.indices} { + var input_indices: ${$.type.indices}; + var carry = 0u; + for (var i = ${O.length}; i >= 0; i--) { + let input_shape_i = ${R6("uniforms.input_shape","i",O.length)}; + let steps_i = ${R6("uniforms.steps","i",O.length)}; + let signs_i = ${R6("uniforms.signs","i",O.length)}; + let starts_i = ${R6("uniforms.starts","i",O.length)}; + var output_index = ${j.indicesGet("output_indices","i")}; + var input_index = output_index * steps_i + starts_i + carry; + carry = input_index / input_shape_i; + input_index = input_index % input_shape_i; + if (signs_i < 0) { + input_index = input_shape_i - input_index - 1u + starts_i; + } + ${$.indicesSet("input_indices","i","input_index")}; + } + return input_indices; + }`,HP=($,j)=>{let O=$[0].dims,G=l0.size(O),Z=j.axes.length>0?l0.normalizeAxes(j.axes,O.length):[...Array(O.length).keys()],V=DZ($,4);V.forEach((I)=>I!==0||(()=>{throw Error("step cannot be 0")})),V.length===0&&(V=Array(Z.length).fill(1));let N=j.starts.map((I,k)=>CJ(I,k,O,Z,V)),J=j.ends.map((I,k)=>CJ(I,k,O,Z,V));if(Z.length!==N.length||Z.length!==J.length)throw Error("start, ends and axes should have the same number of elements");if(Z.length!==O.length)for(let I=0;IMath.sign(I));V.forEach((I,k,z)=>{if(I<0){let w=(J[k]-N[k])/I,T=N[k],W=T+w*V[k];N[k]=W,J[k]=T,z[k]=-I}});let U=O.slice(0);Z.forEach((I,k)=>{U[I]=Math.ceil((J[I]-N[I])/V[I])});let H={dims:U,dataType:$[0].dataType},L=t5("output",$[0].dataType,U.length),Y=O5("input",$[0].dataType,$[0].dims.length),S=l0.size(U),X=[{name:"outputSize",type:"u32"},{name:"starts",type:"u32",length:N.length},{name:"signs",type:"i32",length:R.length},{name:"steps",type:"u32",length:V.length}],D=[{type:12,data:S},{type:12,data:N},{type:6,data:R},{type:12,data:V},...j6($[0].dims,U)];return{name:"Slice",shaderCache:{hint:`${R.length}_${N.length}_${V.length}`,inputDependencies:["rank"]},getShaderSource:(I)=>` + ${I.registerUniforms(X).declareVariables(Y,L)} + ${UP(Y,L,O)} + ${I.mainStart()} + ${I.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.outputSize")} + let output_indices = ${L.offsetToIndices("global_idx")}; + let input_indices = calculateInputIndices(output_indices); + ${L.setByOffset("global_idx",Y.getByIndices("input_indices"))} + }`,getRunData:()=>({outputs:[H],dispatchGroup:{x:Math.ceil(G/64)},programUniforms:D})}},FI=($,j)=>{vP($.inputs,j);let O=RP($.inputs,j);$.compute(HP($.inputs,O),{inputs:[0]})},yI=($)=>{let{starts:j,ends:O,axes:G}=$;return j9({starts:j,ends:O,axes:G})}}),RK=I5(()=>{Y6(),D6(),B9(),v7(),M6(),xP=($)=>{if(!$||$.length!==1)throw Error("Softmax op requires 1 input.")},LP=($,j)=>{let O,G=$.inputs[0],Z=G.dims,V=l0.size(Z),N=Z.length,J=l0.normalizeAxis(j.axis,N),R=JE),U[J]=N-1,U[N-1]=J,O=$.compute(X2(G,U),{inputs:[G],outputs:[-1]})[0]):O=G;let H=O.dims,L=H[N-1],Y=V/L,S=K9(L),X=L/S,D=64;Y===1&&(D=256);let I=O5("x",O.dataType,O.dims,S),k=t5("result",O.dataType,O.dims,S),z=I.type.value,w=Z1(O.dataType)==="f32"?`var threadMax = ${z}(-3.402823e+38f);`:`var threadMax = ${z}(-65504.0h);`,T=$.compute({name:"Softmax",shaderCache:{hint:`${S};${D}`,inputDependencies:["type"]},getRunData:()=>({outputs:[{dims:H,dataType:O.dataType}],dispatchGroup:{x:Y},programUniforms:[{type:6,data:X}]}),getShaderSource:(W)=>` + var rowMaxShared : ${z}; + var rowSumShared : ${z}; + var threadShared : array<${z}, ${D}>; + + fn getValue(row: i32, col: i32, row_stride: i32) -> ${z} { + let index = row * row_stride + col; + return x[index]; + } + + fn setValue(row: i32, col: i32, row_stride: i32, value: ${z}) { + let index = row * row_stride + col; + result[index] = value; + } + ${W.registerUniform("packedCols","i32").declareVariables(I,k)} + ${W.mainStart(D)} + let gindex = i32(global_idx); + let lindex = i32(local_idx); + const wg = ${D}; + let row = gindex / wg; + let cols = uniforms.packedCols; + let row_stride : i32 = uniforms.packedCols; + + // find the rows max + ${w} + for (var col = lindex; col < cols; col += wg) { + let value = getValue(row, col, row_stride); + threadMax = max(threadMax, value); + } + if (lindex < cols) { + threadShared[lindex] = threadMax; + } + workgroupBarrier(); + + var reduceSize = min(cols, wg); + for (var currSize = reduceSize >> 1; currSize > 0; currSize = reduceSize >> 1) { + reduceSize = currSize + (reduceSize & 1); + if (lindex < currSize) { + threadShared[lindex] = max(threadShared[lindex], threadShared[lindex + reduceSize]); + } + workgroupBarrier(); + } + if (lindex == 0) { + rowMaxShared = ${z}(${((E,Q)=>Q===4?`max(max(${E}.x, ${E}.y), max(${E}.z, ${E}.w))`:Q===2?`max(${E}.x, ${E}.y)`:Q===3?`max(max(${E}.x, ${E}.y), ${E}.z)`:E)("threadShared[0]",S)}); + } + workgroupBarrier(); + + // find the rows sum + var threadSum = ${z}(0.0); + for (var col = lindex; col < cols; col += wg) { + let subExp = exp(getValue(row, col, row_stride) - rowMaxShared); + threadSum += subExp; + } + threadShared[lindex] = threadSum; + workgroupBarrier(); + + for (var currSize = wg >> 1; currSize > 0; currSize = currSize >> 1) { + if (lindex < currSize) { + threadShared[lindex] = threadShared[lindex] + threadShared[lindex + currSize]; + } + workgroupBarrier(); + } + if (lindex == 0) { + rowSumShared = ${z}(${N7("threadShared[0]",S)}); + } + workgroupBarrier(); + + // calculate final value for each element in the row + for (var col = lindex; col < cols; col += wg) { + let value = exp(getValue(row, col, row_stride) - rowMaxShared) / rowSumShared; + setValue(row, col, row_stride, value); + } + }`},{inputs:[O],outputs:[R?-1:0]})[0];R&&$.compute(X2(T,U),{inputs:[T]})},zI=($,j)=>{xP($.inputs),LP($,j)},kI=($)=>j9({axis:$.axis})}),UK=I5(()=>{Y6(),D6(),M6(),BJ=($)=>Array.from($.getBigInt64Array(),Number),_P=($)=>{if(!$||$.length!==2)throw Error("Tile requires 2 inputs.");if($[0].dataType!==1&&$[0].dataType!==10&&$[0].dataType!==6&&$[0].dataType!==12)throw Error("Tile only support float, float16, int32, and uint32 data types");if($[1].dataType!==7)throw Error("Tile `repeats` input should be of int64 data type");if($[1].dims.length!==1)throw Error("Tile `repeats` input should be 1-D");if(BJ($[1]).length!==$[0].dims.length)throw Error("Tile `repeats` input should have same number of elements as rank of input data tensor")},YP=($,j)=>{let O=[];for(let G=0;G<$.length;++G)O.push($[G]*j[G]);return O},SP=($,j)=>{let O=$[0].dims,G=j??BJ($[1]),Z=YP(O,G),V=l0.size(Z),N=$[0].dataType,J=O5("input",N,O.length),R=t5("output",N,Z.length);return{name:"Tile",shaderCache:{hint:`${G}`,inputDependencies:["rank"]},getRunData:()=>({outputs:[{dims:Z,dataType:$[0].dataType}],dispatchGroup:{x:Math.ceil(V/64)},programUniforms:[{type:12,data:V},...j6($[0].dims,Z)]}),getShaderSource:(U)=>` + const inputShape = ${J.indices(...O)}; + ${U.registerUniform("output_size","u32").declareVariables(J,R)} + ${U.mainStart()} + ${U.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.output_size")} + let output_indices = ${R.offsetToIndices("global_idx")}; + var input_indices: ${J.type.indices}; + for (var i = 0; i < ${O.length}; i++) { + let input_dim_i = ${J.indicesGet("uniforms.input_shape","i")}; + let input_dim_value = ${R.indicesGet("output_indices","i")} % input_dim_i; + + ${J.indicesSet("input_indices","i","input_dim_value")} + } + ${R.setByOffset("global_idx",J.getByIndices("input_indices"))} + }`}},II=($)=>{_P($.inputs),$.compute(SP($.inputs),{inputs:[0]})}}),HK=I5(()=>{Y6(),D6(),M6(),PP=($,j,O,G,Z)=>{let V,N=t5("output_data",Z,O.length,4),J=O5("a_data",j[1].dataType,j[1].dims.length,4),R=O5("b_data",j[2].dataType,j[2].dims.length,4),U=O5("c_data",j[0].dataType,j[0].dims.length,4),H=(L,Y,S)=>`select(${Y}, ${L}, ${S})`;if(G){let L=(Y,S,X="")=>{let D=`a_data[index_a${S}][component_a${S}]`,I=`b_data[index_b${S}][component_b${S}]`,k=`bool(c_data[index_c${S}] & (0xffu << (component_c${S} * 8)))`;return` + let output_indices${S} = ${N.offsetToIndices(`global_idx * 4u + ${S}u`)}; + let offset_a${S} = ${J.broadcastedIndicesToOffset(`output_indices${S}`,N)}; + let offset_b${S} = ${R.broadcastedIndicesToOffset(`output_indices${S}`,N)}; + let offset_c${S} = ${U.broadcastedIndicesToOffset(`output_indices${S}`,N)}; + let index_a${S} = offset_a${S} / 4u; + let index_b${S} = offset_b${S} / 4u; + let index_c${S} = offset_c${S} / 4u; + let component_a${S} = offset_a${S} % 4u; + let component_b${S} = offset_b${S} % 4u; + let component_c${S} = offset_c${S} % 4u; + ${Y}[${S}] = ${X}(${H(D,I,k)}); + `};V=Z===9?` + var data = vec4(0); + ${L("data",0,"u32")} + ${L("data",1,"u32")} + ${L("data",2,"u32")} + ${L("data",3,"u32")} + output_data[global_idx] = dot(vec4(0x1, 0x100, 0x10000, 0x1000000), vec4(data));`:` + ${L("output_data[global_idx]",0)} + ${L("output_data[global_idx]",1)} + ${L("output_data[global_idx]",2)} + ${L("output_data[global_idx]",3)} + `}else V=N.setByOffset("global_idx",H(J.getByOffset("global_idx"),R.getByOffset("global_idx"),U.getByOffset("global_idx")));return` + ${$.registerUniform("vec_size","u32").declareVariables(U,J,R,N)} + ${$.mainStart()} + ${$.guardAgainstOutOfBoundsWorkgroupSizes("uniforms.vec_size")} + ${V} + }`},XP=($)=>{let j=$[1].dims,O=$[2].dims,G=$[0].dims,Z=$[1].dataType,V=!(l0.areEqual(j,O)&&l0.areEqual(O,G)),N=j,J=l0.size(j);if(V){let U=IG.calcShape(IG.calcShape(j,O,!1),G,!1);if(!U)throw Error("Can't perform where op on the given tensors");N=U,J=l0.size(N)}let R=Math.ceil(J/4);return{name:"Where",shaderCache:{inputDependencies:["rank","rank","rank"]},getShaderSource:(U)=>PP(U,$,N,V,Z),getRunData:()=>({outputs:[{dims:N,dataType:Z}],dispatchGroup:{x:Math.ceil(J/64/4)},programUniforms:[{type:12,data:R},...j6(G,j,O,N)]})}},DI=($)=>{$.compute(XP($.inputs))}}),xK=I5(()=>{WM(),YR(),MM(),KM(),bM(),fM(),wM(),hM(),mM(),pM(),AM(),gM(),uM(),dM(),lM(),oM(),sM(),iM(),aM(),rM(),nM(),tM(),eM(),$K(),jK(),fI(),OK(),GK(),ZK(),qK(),VK(),_R(),NK(),EI(),JK(),vK(),RK(),wI(),UK(),v7(),SR(),HK(),WI=new Map([["Abs",[zz]],["Acos",[kz]],["Acosh",[Iz]],["Add",[qk]],["ArgMax",[Xz,_v]],["ArgMin",[Pz,_v]],["Asin",[Dz]],["Asinh",[Wz]],["Atan",[Mz]],["Atanh",[Kz]],["Attention",[Tz]],["AveragePool",[VI,qI]],["BatchNormalization",[Fz]],["BiasAdd",[yz]],["BiasSplitGelu",[Zk]],["Cast",[fz,bz]],["Ceil",[Ez]],["Clip",[wz]],["Concat",[_k,Yk]],["Conv",[Fv,Tv]],["ConvTranspose",[Dk,Ik]],["Cos",[Qz]],["Cosh",[Cz]],["CumSum",[Wk,Mk]],["DepthToSpace",[Kk,bk]],["DequantizeLinear",[xI,LI]],["Div",[Vk]],["Einsum",[fk,wk]],["Elu",[Bz,EZ]],["Equal",[Nk]],["Erf",[hz]],["Exp",[cz]],["Expand",[Ek]],["FastGelu",[Qk]],["Floor",[mz]],["FusedConv",[Fv,Tv]],["Gather",[Bk,Ck]],["GatherElements",[gk,Ak]],["GatherBlockQuantized",[mk,pk]],["GatherND",[hk,ck]],["Gelu",[pz]],["Gemm",[dk,uk]],["GlobalAveragePool",[JI,NI]],["GlobalMaxPool",[HI,UI]],["Greater",[Uk]],["GreaterOrEqual",[xk]],["GridSample",[lk,ok]],["GroupQueryAttention",[tk]],["HardSigmoid",[iz,sz]],["InstanceNormalization",[ek]],["LayerNormalization",[$I]],["LeakyRelu",[Az,EZ]],["Less",[Hk]],["LessOrEqual",[Lk]],["Log",[Ok]],["MatMul",[jI]],["MatMulNBits",[OI,GI]],["MaxPool",[vI,RI]],["Mul",[Jk]],["MultiHeadAttention",[ik,sk]],["Neg",[uz]],["Not",[gz]],["Pad",[ZI]],["Pow",[vk]],["QuickGelu",[Gk,EZ]],["Range",[_I]],["Reciprocal",[dz]],["ReduceMin",[xz]],["ReduceMean",[Jz]],["ReduceMax",[Hz]],["ReduceSum",[_z]],["ReduceProd",[Lz]],["ReduceL1",[vz]],["ReduceL2",[Rz]],["ReduceLogSum",[Sz]],["ReduceLogSumExp",[Uz]],["ReduceSumSquare",[Yz]],["Relu",[lz]],["Resize",[PI,XI]],["RotaryEmbedding",[nk]],["ScatterND",[SI,YI]],["Sigmoid",[oz]],["Sin",[az]],["Sinh",[rz]],["Slice",[FI,yI]],["SkipLayerNormalization",[TI]],["Split",[ak,rk]],["Sqrt",[nz]],["Softmax",[zI,kI]],["Sub",[Rk]],["Tan",[tz]],["Tanh",[ez]],["ThresholdedRelu",[jk,EZ]],["Tile",[II]],["Transpose",[ry,ny]],["Where",[DI]]])}),LK=I5(()=>{Q3(),I4(),M6(),MI=class{constructor($){this.backend=$,this.repo=new Map,this.attributesBound=!1}getArtifact($){return this.repo.get($)}setArtifact($,j){this.repo.set($,j)}run($,j,O,G,Z){C3($.programInfo.name);let V=this.backend.device,N=this.backend.getComputePassEncoder();this.backend.writeTimestamp(2*this.backend.pendingDispatchNumber);let J=[];for(let U of j)J.push({binding:J.length,resource:{buffer:U.buffer}});for(let U of O)J.push({binding:J.length,resource:{buffer:U.buffer}});Z&&J.push({binding:J.length,resource:Z});let R=V.createBindGroup({layout:$.computePipeline.getBindGroupLayout(0),entries:J,label:$.programInfo.name});if(this.backend.sessionStatus==="capturing"){let U={kernelId:this.backend.currentKernelId,computePipeline:$.computePipeline,bindGroup:R,dispatchGroup:G};this.backend.capturedCommandList.get(this.backend.currentSessionId).push(U)}N.setPipeline($.computePipeline),N.setBindGroup(0,R),N.dispatchWorkgroups(...G),this.backend.writeTimestamp(2*this.backend.pendingDispatchNumber+1),this.backend.pendingDispatchNumber++,(this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber||this.backend.queryType==="at-passes")&&this.backend.endComputePass(),this.backend.pendingDispatchNumber>=this.backend.maxDispatchNumber&&this.backend.flush(),o2($.programInfo.name)}dispose(){}build($,j){C3($.name);let O=this.backend.device,G=[];[{feature:"shader-f16",extension:"f16"},{feature:"subgroups",extension:"subgroups"}].forEach((U)=>{O.features.has(U.feature)&&G.push(`enable ${U.extension};`)});let Z=ay(j,this.backend.device.limits),V=$.getShaderSource(Z),N=`${G.join(` +`)} +${Z.additionalImplementations} +${V}`,J=O.createShaderModule({code:N,label:$.name});l6("verbose",()=>`[WebGPU] ${$.name} shader code: ${N}`);let R=O.createComputePipeline({compute:{module:J,entryPoint:"main"},layout:"auto",label:$.name});return o2($.name),{programInfo:$,computePipeline:R,uniformVariablesInfo:Z.variablesInfo}}normalizeDispatchGroupSize($){let j=typeof $=="number"?$:$.x,O=typeof $=="number"?1:$.y||1,G=typeof $=="number"?1:$.z||1,Z=this.backend.device.limits.maxComputeWorkgroupsPerDimension;if(j<=Z&&O<=Z&&G<=Z)return[j,O,G];let V=j*O*G,N=Math.ceil(Math.sqrt(V));if(N>Z){if(N=Math.ceil(Math.cbrt(V)),N>Z)throw Error("Total dispatch size exceeds WebGPU maximum.");return[N,N,N]}return[N,N,1]}}}),QI={};MG(QI,{WebGpuBackend:()=>CI});var TP,FP,yP,CI,_K=I5(()=>{Q3(),Y6(),I4(),bI(),IM(),xK(),LK(),TP=($,j)=>{if(j.length!==$.length)throw Error(`inputDependencies length ${j.length} is not equal to inputTensors length ${$.length}.`);let O=[];for(let G=0;G<$.length;++G){let Z=$[G].dataType;switch(j[G]){case"none":O.push("");break;case"type":O.push(`${Z}`);break;case"rank":{let V=$[G].dims.length;O.push(`${Z};${V}`);break}case"dims":{let V=$[G].dims.join(",");O.push(`${Z};${V}`);break}default:throw Error(`unsupported input dependency: ${j[G]}`)}}return O.join("|")},FP=($,j,O)=>{let G=$.name;return $.shaderCache?.hint&&(G+="["+$.shaderCache.hint+"]"),G+=":"+O+`:${TP(j,$.shaderCache?.inputDependencies??Array(j.length).fill("dims"))}`,G},yP=class{constructor($){$&&(this.architecture=$.architecture,this.vendor=$.vendor)}isArchitecture($){return this.architecture===$}isVendor($){return this.vendor===$}},CI=class{constructor(){this.currentSessionId=null,this.currentKernelId=null,this.commandEncoder=null,this.computePassEncoder=null,this.maxDispatchNumber=16,this.pendingDispatchNumber=0,this.pendingKernels=[],this.pendingQueries=new Map,this.sessionStatus="default",this.capturedCommandList=new Map,this.capturedPendingKernels=new Map,this.sessionExternalDataMapping=new Map}get currentKernelCustomData(){if(this.currentKernelId===null)throw Error("currentKernelCustomData(): currentKernelId is null. (should not happen)");let $=this.kernelCustomData.get(this.currentKernelId);return $||($={},this.kernelCustomData.set(this.currentKernelId,$)),$}async initialize($,j){this.env=$;let O=[],G={requiredLimits:{maxComputeWorkgroupStorageSize:j.limits.maxComputeWorkgroupStorageSize,maxComputeWorkgroupsPerDimension:j.limits.maxComputeWorkgroupsPerDimension,maxStorageBufferBindingSize:j.limits.maxStorageBufferBindingSize,maxBufferSize:j.limits.maxBufferSize,maxComputeInvocationsPerWorkgroup:j.limits.maxComputeInvocationsPerWorkgroup,maxComputeWorkgroupSizeX:j.limits.maxComputeWorkgroupSizeX,maxComputeWorkgroupSizeY:j.limits.maxComputeWorkgroupSizeY,maxComputeWorkgroupSizeZ:j.limits.maxComputeWorkgroupSizeZ},requiredFeatures:O},Z=(V)=>j.features.has(V)&&O.push(V)&&!0;Z("chromium-experimental-timestamp-query-inside-passes")||Z("timestamp-query"),Z("shader-f16"),Z("subgroups"),this.device=await j.requestDevice(G),this.adapterInfo=new yP(j.info||await j.requestAdapterInfo()),this.gpuDataManager=sy(this),this.programManager=new MI(this),this.kernels=new Map,this.kernelPersistentData=new Map,this.kernelCustomData=new Map,NR($.logLevel,!!$.debug),this.device.onuncapturederror=(V)=>{V.error instanceof GPUValidationError&&console.error(`An uncaught WebGPU validation error was raised: ${V.error.message}`)},Object.defineProperty(this.env.webgpu,"device",{value:this.device,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(this.env.webgpu,"adapter",{value:j,writable:!1,enumerable:!0,configurable:!1}),this.setQueryType()}dispose(){typeof this.querySet<"u"&&this.querySet.destroy(),this.gpuDataManager.dispose()}getCommandEncoder(){return this.commandEncoder||(this.commandEncoder=this.device.createCommandEncoder()),this.commandEncoder}getComputePassEncoder(){if(!this.computePassEncoder){let $=this.getCommandEncoder(),j={};this.queryType==="at-passes"&&(j.timestampWrites={querySet:this.querySet,beginningOfPassWriteIndex:2*this.pendingDispatchNumber,endOfPassWriteIndex:2*this.pendingDispatchNumber+1}),this.computePassEncoder=$.beginComputePass(j)}return this.computePassEncoder}endComputePass(){this.computePassEncoder&&(this.computePassEncoder.end(),this.computePassEncoder=null)}flush(){if(!this.commandEncoder)return;let $;C3(),this.endComputePass(),this.queryType!=="none"&&(this.commandEncoder.resolveQuerySet(this.querySet,0,2*this.pendingDispatchNumber,this.queryResolveBuffer,0),$=this.device.createBuffer({size:2*this.pendingDispatchNumber*8,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),this.pendingQueries.set($,this.pendingKernels),this.pendingKernels=[],this.commandEncoder.copyBufferToBuffer(this.queryResolveBuffer,0,$,0,2*this.pendingDispatchNumber*8)),this.device.queue.submit([this.commandEncoder.finish()]),this.gpuDataManager.refreshPendingBuffers(),this.commandEncoder=null,this.pendingDispatchNumber=0,this.queryType!=="none"&&$.mapAsync(GPUMapMode.READ).then(()=>{let j=new BigUint64Array($.getMappedRange()),O=this.pendingQueries.get($);for(let G=0;G"u"&&(this.queryTimeBase=Y);let X=Number(Y-this.queryTimeBase),D=Number(S-this.queryTimeBase);if(!Number.isSafeInteger(X)||!Number.isSafeInteger(D))throw RangeError("incorrect timestamp range");if(this.env.webgpu.profiling?.ondata)this.env.webgpu.profiling.ondata({version:1,inputsMetadata:H.map((I)=>({dims:I.dims,dataType:z4(I.dataType)})),outputsMetadata:L.map((I)=>({dims:I.dims,dataType:z4(I.dataType)})),kernelId:V,kernelType:J,kernelName:R,programName:U,startTime:X,endTime:D});else{let I="";H.forEach((z,w)=>{I+=`input[${w}]: [${z.dims}] | ${z4(z.dataType)}, `});let k="";L.forEach((z,w)=>{k+=`output[${w}]: [${z.dims}] | ${z4(z.dataType)}, `}),console.log(`[profiling] kernel "${V}|${J}|${R}|${U}" ${I}${k}execution time: ${D-X} ns`)}pZ("GPU",`${U}::${Y}::${S}`)}$.unmap(),this.pendingQueries.delete($)}),o2()}run($,j,O,G,Z,V){C3($.name);let N=[];for(let z=0;zw):O;if(H.length!==J.length)throw Error(`Output size ${H.length} must be equal to ${J.length}.`);let L,Y=[],S=[];for(let z=0;z=V)throw Error(`Invalid output index: ${H[z]}`);if(H[z]===-3)continue;let w=H[z]===-1,T=H[z]===-2,W=w||T?Z(J[z].dataType,J[z].dims):G(H[z],J[z].dataType,J[z].dims);if(Y.push(W),W.data===0)continue;let E=this.gpuDataManager.get(W.data);if(!E)throw Error(`no GPU data for output: ${W.data}`);if(w&&this.temporaryData.push(E),T){let Q=this.kernelPersistentData.get(this.currentKernelId);Q||(Q=[],this.kernelPersistentData.set(this.currentKernelId,Q)),Q.push(E)}S.push(E)}if(N.length!==j.length||S.length!==Y.length){if(S.length===0)return o2($.name),Y;throw Error(`Program ${$.name} has zero-sized tensor(s) in inputs or outputs. This is not supported now.`)}if(U){let z=0,w=[];U.forEach((Q)=>{let A=typeof Q.data=="number"?[Q.data]:Q.data;if(A.length===0)return;let l,r,e=Q.type===10?2:4;Q.type===10?(r=A.length>4?16:A.length>2?8:A.length*e,l=A.length>4?16:e*A.length):(r=A.length<=2?A.length*e:16,l=16),z=Math.ceil(z/r)*r,w.push(z);let V0=Q.type===10?8:4;z+=A.length>4?Math.ceil(A.length/V0)*l:A.length*e});let T=16;z=Math.ceil(z/T)*T;let W=new ArrayBuffer(z);U.forEach((Q,A)=>{let l=w[A],r=typeof Q.data=="number"?[Q.data]:Q.data;if(Q.type===6)new Int32Array(W,l,r.length).set(r);else if(Q.type===12)new Uint32Array(W,l,r.length).set(r);else if(Q.type===10)new Uint16Array(W,l,r.length).set(r);else{if(Q.type!==1)throw Error(`Unsupported uniform type: ${z4(Q.type)}`);new Float32Array(W,l,r.length).set(r)}});let E=this.gpuDataManager.create(z,GPUBufferUsage.COPY_DST|GPUBufferUsage.UNIFORM);this.device.queue.writeBuffer(E.buffer,0,W,0,z),this.gpuDataManager.release(E.id),L={offset:0,size:z,buffer:E.buffer}}let X=this.programManager.normalizeDispatchGroupSize(R),D=X[1]===1&&X[2]===1,I=FP($,j,D),k=this.programManager.getArtifact(I);if(k||(k=this.programManager.build($,X),this.programManager.setArtifact(I,k),l6("info",()=>`[artifact] key: ${I}, programName: ${$.name}`)),U&&k.uniformVariablesInfo){if(U.length!==k.uniformVariablesInfo.length)throw Error(`Uniform variables count mismatch: expect ${k.uniformVariablesInfo.length}, got ${U.length} in program "${k.programInfo.name}".`);for(let z=0;z`[ProgramManager] run "${$.name}" (key=${I}) with ${X[0]}x${X[1]}x${X[2]}`),this.queryType!=="none"||this.sessionStatus==="capturing"){let z={kernelId:this.currentKernelId,programName:k.programInfo.name,inputTensorViews:j,outputTensorViews:Y};this.pendingKernels.push(z),this.sessionStatus==="capturing"&&this.capturedPendingKernels.get(this.currentSessionId).push(z)}return this.programManager.run(k,N,S,X,L),o2($.name),Y}upload($,j){this.gpuDataManager.upload($,j)}memcpy($,j){this.gpuDataManager.memcpy($,j)}async download($,j){await this.gpuDataManager.download($,j)}alloc($){return this.gpuDataManager.create($).id}free($){return this.gpuDataManager.release($)}createKernel($,j,O,G){let Z=WI.get($);if(!Z)throw Error(`kernel not implemented: ${$}`);let V={kernelType:$,kernelName:G,kernelEntry:Z[0],attributes:[Z[1],O]};this.kernels.set(j,V)}releaseKernel($){let j=this.kernelPersistentData.get($);if(j){for(let O of j)this.gpuDataManager.release(O.id);this.kernelPersistentData.delete($)}this.kernelCustomData.delete($),this.kernels.delete($)}computeKernel($,j,O){let G=this.kernels.get($);if(!G)throw Error(`kernel not created: ${$}`);let{kernelType:Z,kernelName:V,kernelEntry:N,attributes:J}=G;if(this.currentKernelId!==null)throw Error(`kernel "[${Z}] ${V}" is not allowed to be called recursively`);this.currentKernelId=$,J[0]&&(J[1]=J[0](J[1]),J[0]=void 0),l6("info",()=>`[WebGPU] Start to run kernel "[${Z}] ${V}"...`);let R=this.env.debug;this.temporaryData=[];try{return R&&this.device.pushErrorScope("validation"),N(j,J[1]),0}catch(U){return O.push(Promise.resolve(`[WebGPU] Kernel "[${Z}] ${V}" failed. ${U}`)),1}finally{R&&O.push(this.device.popErrorScope().then((U)=>U?`GPU validation error for kernel "[${Z}] ${V}": ${U.message}`:null));for(let U of this.temporaryData)this.gpuDataManager.release(U.id);this.temporaryData=[],this.currentKernelId=null}}registerBuffer($,j,O,G){let Z=this.sessionExternalDataMapping.get($);Z||(Z=new Map,this.sessionExternalDataMapping.set($,Z));let V=Z.get(j),N=this.gpuDataManager.registerExternalBuffer(O,G,V);return Z.set(j,[N,O]),N}unregisterBuffers($){let j=this.sessionExternalDataMapping.get($);j&&(j.forEach((O)=>this.gpuDataManager.unregisterExternalBuffer(O[0])),this.sessionExternalDataMapping.delete($))}getBuffer($){let j=this.gpuDataManager.get($);if(!j)throw Error(`no GPU data for buffer: ${$}`);return j.buffer}createDownloader($,j,O){return async()=>{let G=await Hv(this,$,j);return JR(G.buffer,O)}}writeTimestamp($){this.queryType==="inside-passes"&&this.computePassEncoder.writeTimestamp(this.querySet,$)}setQueryType(){this.queryType="none",(this.env.webgpu.profiling?.mode==="default"||(typeof this.env.trace>"u"?this.env.wasm.trace:this.env.trace))&&(this.device.features.has("chromium-experimental-timestamp-query-inside-passes")?this.queryType="inside-passes":this.device.features.has("timestamp-query")&&(this.queryType="at-passes"),this.queryType!=="none"&&typeof this.querySet>"u"&&(this.querySet=this.device.createQuerySet({type:"timestamp",count:2*this.maxDispatchNumber}),this.queryResolveBuffer=this.device.createBuffer({size:2*this.maxDispatchNumber*8,usage:GPUBufferUsage.COPY_SRC|GPUBufferUsage.QUERY_RESOLVE})))}captureBegin(){l6("info","captureBegin"),this.capturedCommandList.get(this.currentSessionId)||this.capturedCommandList.set(this.currentSessionId,[]),this.capturedPendingKernels.get(this.currentSessionId)||this.capturedPendingKernels.set(this.currentSessionId,[]),this.flush(),this.sessionStatus="capturing"}captureEnd(){l6("info","captureEnd"),this.flush(),this.sessionStatus="default"}replay(){l6("info","replay"),this.sessionStatus="replaying";let $=this.capturedCommandList.get(this.currentSessionId),j=this.capturedPendingKernels.get(this.currentSessionId),O=$.length;this.pendingKernels=[];for(let G=0;G=this.maxDispatchNumber||this.queryType==="at-passes")&&this.endComputePass(),this.pendingDispatchNumber>=this.maxDispatchNumber&&this.flush()}this.flush(),this.sessionStatus="default"}onCreateSession(){this.gpuDataManager.onCreateSession()}onReleaseSession($){this.unregisterBuffers($),this.capturedCommandList.has($)&&this.capturedCommandList.delete($),this.capturedPendingKernels.has($)&&this.capturedPendingKernels.delete($),this.gpuDataManager.onReleaseSession($)}onRunStart($){this.currentSessionId=$,this.setQueryType()}}}),BI={};MG(BI,{init:()=>hI});var aq,zP,hI,kP,FR,yR,Z7,IP,hJ,PV,zR,kR,cJ,IR,DR,WR,q7,D3,YG,WZ,MZ,rq,mJ,nq,p8,A8,DP,cI,mI,pI,AI,gI,uI,dI,pJ,WP,lI,YK=I5(()=>{Y6(),I4(),D6(),kM(),aq=class ${constructor(j,O,G,Z){this.module=j,this.dataType=O,this.data=G,this.dims=Z}getFloat32Array(){if(this.dataType!==1)throw Error("Invalid data type");let j=l0.size(this.dims);return j===0?new Float32Array:new Float32Array(this.module.HEAP8.buffer,this.data,j)}getBigInt64Array(){if(this.dataType!==7)throw Error("Invalid data type");let j=l0.size(this.dims);return j===0?new BigInt64Array:new BigInt64Array(this.module.HEAP8.buffer,this.data,j)}getInt32Array(){if(this.dataType!==6)throw Error("Invalid data type");let j=l0.size(this.dims);return j===0?new Int32Array:new Int32Array(this.module.HEAP8.buffer,this.data,j)}getUint16Array(){if(this.dataType!==10&&this.dataType!==4)throw Error("Invalid data type");let j=l0.size(this.dims);return j===0?new Uint16Array:new Uint16Array(this.module.HEAP8.buffer,this.data,j)}reshape(j){if(l0.size(j)!==l0.size(this.dims))throw Error("Invalid new shape");return new $(this.module,this.dataType,this.data,j)}},zP=class{constructor($,j,O){this.module=$,this.backend=j,this.customDataOffset=0,this.customDataSize=0,this.adapterInfo=j.adapterInfo;let G=$.PTR_SIZE,Z=O/$.PTR_SIZE,V=G===4?"i32":"i64";this.opKernelContext=Number($.getValue(G*Z++,V));let N=Number($.getValue(G*Z++,V));this.outputCount=Number($.getValue(G*Z++,V)),this.customDataOffset=Number($.getValue(G*Z++,"*")),this.customDataSize=Number($.getValue(G*Z++,V));let J=[];for(let R=0;Rtypeof Z=="number"?this.inputs[Z]:Z)??this.inputs,G=j?.outputs??[];return this.backend.run($,O,G,(Z,V,N)=>new aq(this.module,V,this.output(Z,N),N),(Z,V)=>{let N=s8(Z,V);if(!N)throw Error(`Unsupported data type: ${Z}`);let J=N>0?this.backend.gpuDataManager.create(N).id:0;return new aq(this.module,Z,J,V)},this.outputCount)}output($,j){let O=this.module.stackSave();try{let G=this.module.PTR_SIZE,Z=G===4?"i32":"i64",V=this.module.stackAlloc((1+j.length)*G);this.module.setValue(V,j.length,Z);for(let N=0;N{let Z=j.jsepInit;if(!Z)throw Error("Failed to initialize JSEP. The WebAssembly module is not built with JSEP support.");if($==="webgpu"){let V=new(_K(),AZ(QI)).WebGpuBackend;await V.initialize(O,G),Z("webgpu",[V,(N)=>V.alloc(Number(N)),(N)=>V.free(N),(N,J,R,U=!1)=>{if(U)l6("verbose",()=>`[WebGPU] jsepCopyGpuToGpu: src=${Number(N)}, dst=${Number(J)}, size=${Number(R)}`),V.memcpy(Number(N),Number(J));else{l6("verbose",()=>`[WebGPU] jsepCopyCpuToGpu: dataOffset=${Number(N)}, gpuDataId=${Number(J)}, size=${Number(R)}`);let H=j.HEAPU8.subarray(Number(N>>>0),Number(N>>>0)+Number(R));V.upload(Number(J),H)}},async(N,J,R)=>{l6("verbose",()=>`[WebGPU] jsepCopyGpuToCpu: gpuDataId=${N}, dataOffset=${J}, size=${R}`),await V.download(Number(N),()=>j.HEAPU8.subarray(Number(J)>>>0,Number(J+R)>>>0))},(N,J,R)=>V.createKernel(N,Number(J),R,j.UTF8ToString(j._JsepGetNodeName(Number(J)))),(N)=>V.releaseKernel(N),(N,J,R,U)=>{l6("verbose",()=>`[WebGPU] jsepRun: sessionHandle=${R}, kernel=${N}, contextDataOffset=${J}`);let H=new zP(j,V,Number(J));return V.computeKernel(Number(N),H,U)},()=>V.captureBegin(),()=>V.captureEnd(),()=>V.replay()])}else{let V=new oy(O);Z("webnn",[V,()=>V.reserveTensorId(),(N)=>V.releaseTensorId(N),async(N,J,R,U,H)=>V.ensureTensor(N,J,R,U,H),(N,J)=>{V.uploadTensor(N,J)},async(N,J)=>V.downloadTensor(N,J)])}}}),oI=I5(()=>{FM(),yM(),Y6(),G$(),xR(),KI(),kP=($,j)=>{_9()._OrtInit($,j)!==0&&N9("Can't initialize onnxruntime.")},FR=async($)=>{kP($.wasm.numThreads,xV($.logLevel))},yR=async($,j)=>{_9().asyncInit?.();{let O=(YK(),AZ(BI)).init;if(j==="webgpu"){if(typeof navigator>"u"||!navigator.gpu)throw Error("WebGPU is not supported in current environment");let G=$.webgpu.adapter;if(G){if(typeof G.limits!="object"||typeof G.features!="object"||typeof G.requestDevice!="function")throw Error("Invalid GPU adapter set in `env.webgpu.adapter`. It must be a GPUAdapter object.")}else{let Z=$.webgpu.powerPreference;if(Z!==void 0&&Z!=="low-power"&&Z!=="high-performance")throw Error(`Invalid powerPreference setting: "${Z}"`);let V=$.webgpu.forceFallbackAdapter;if(V!==void 0&&typeof V!="boolean")throw Error(`Invalid forceFallbackAdapter setting: "${V}"`);if(G=await navigator.gpu.requestAdapter({powerPreference:Z,forceFallbackAdapter:V}),!G)throw Error('Failed to get GPU adapter. You may need to enable flag "--enable-unsafe-webgpu" if you are using Chrome.')}await O("webgpu",_9(),$,G)}if(j==="webnn"){if(typeof navigator>"u"||!navigator.ml)throw Error("WebNN is not supported in current environment");await O("webnn",_9(),$)}}},Z7=new Map,IP=($)=>{let j=_9(),O=j.stackSave();try{let G=j.PTR_SIZE,Z=j.stackAlloc(2*G);j._OrtGetInputOutputCount($,Z,Z+G)!==0&&N9("Can't get session input/output count.");let V=G===4?"i32":"i64";return[Number(j.getValue(Z,V)),Number(j.getValue(Z+G,V))]}finally{j.stackRestore(O)}},hJ=($,j)=>{let O=_9(),G=O.stackSave(),Z=0;try{let V=O.PTR_SIZE,N=O.stackAlloc(2*V);O._OrtGetInputOutputMetadata($,j,N,N+V)!==0&&N9("Can't get session input/output metadata.");let J=Number(O.getValue(N,"*"));Z=Number(O.getValue(N+V,"*"));let R=O.HEAP32[Z/4];if(R===0)return[J,0];let U=O.HEAPU32[Z/4+1],H=[];for(let L=0;L{let j=_9(),O=j._malloc($.byteLength);if(O===0)throw Error(`Can't create a session. failed to allocate a buffer of size ${$.byteLength}.`);return j.HEAPU8.set($,O),[O,$.byteLength]},zR=async($,j)=>{let O,G,Z=_9();Array.isArray($)?[O,G]=$:$.buffer===Z.HEAPU8.buffer?[O,G]=[$.byteOffset,$.byteLength]:[O,G]=PV($);let V=0,N=0,J=0,R=[],U=[],H=[];try{if([N,R]=await Ay(j),j?.externalData&&Z.mountExternalData){let T=[];for(let W of j.externalData){let E=typeof W=="string"?W:W.path;T.push(VR(typeof W=="string"?W:W.data).then((Q)=>{Z.mountExternalData(E,Q)}))}await Promise.all(T)}for(let T of j?.executionProviders??[])if((typeof T=="string"?T:T.name)==="webnn"){if(Z.shouldTransferToMLTensor=!1,typeof T!="string"){let W=T,E=W?.context,Q=W?.gpuDevice,A=W?.deviceType,l=W?.powerPreference;Z.currentContext=E||(Q?await Z.webnnCreateMLContext(Q):await Z.webnnCreateMLContext({deviceType:A,powerPreference:l}))}else Z.currentContext=await Z.webnnCreateMLContext();break}V=await Z._OrtCreateSession(O,G,N),Z.webgpuOnCreateSession?.(V),V===0&&N9("Can't create a session."),Z.jsepOnCreateSession?.(),Z.currentContext&&(Z.webnnRegisterMLContext(V,Z.currentContext),Z.currentContext=void 0,Z.shouldTransferToMLTensor=!0);let[L,Y]=IP(V),S=!!j?.enableGraphCapture,X=[],D=[],I=[],k=[],z=[];for(let T=0;TT==="gpu-buffer"||T==="ml-tensor")&&(J=Z._OrtCreateBinding(V),J===0&&N9("Can't create IO binding."),w={handle:J,outputPreferredLocations:z,outputPreferredLocationsEncoded:z.map((T)=>Rv(T))}),Z7.set(V,[V,U,H,w,S,!1]),[V,X,D,I,k]}catch(L){throw U.forEach((Y)=>Z._OrtFree(Y)),H.forEach((Y)=>Z._OrtFree(Y)),J!==0&&Z._OrtReleaseBinding(J)!==0&&N9("Can't release IO binding."),V!==0&&Z._OrtReleaseSession(V)!==0&&N9("Can't release session."),L}finally{Z._free(O),N!==0&&Z._OrtReleaseSessionOptions(N)!==0&&N9("Can't release session options."),R.forEach((L)=>Z._free(L)),Z.unmountExternalData?.()}},kR=($)=>{let j=_9(),O=Z7.get($);if(!O)throw Error(`cannot release session. invalid session id: ${$}`);let[G,Z,V,N,J]=O;N&&(J&&j._OrtClearBoundOutputs(N.handle)!==0&&N9("Can't clear bound outputs."),j._OrtReleaseBinding(N.handle)!==0&&N9("Can't release IO binding.")),j.jsepOnReleaseSession?.($),j.webnnOnReleaseSession?.($),j.webgpuOnReleaseSession?.($),Z.forEach((R)=>j._OrtFree(R)),V.forEach((R)=>j._OrtFree(R)),j._OrtReleaseSession(G)!==0&&N9("Can't release session."),Z7.delete($)},cJ=async($,j,O,G,Z,V,N=!1)=>{if(!$)return void j.push(0);let J,R,U=_9(),H=U.PTR_SIZE,L=$[0],Y=$[1],S=$[3],X=S;if(L==="string"&&(S==="gpu-buffer"||S==="ml-tensor"))throw Error("String tensor is not supported on GPU.");if(N&&S!=="gpu-buffer")throw Error(`External buffer must be provided for input/output index ${V} when enableGraphCapture is true.`);if(S==="gpu-buffer"){let k=$[2].gpuBuffer;R=s8(XG(L),Y);{let z=U.jsepRegisterBuffer;if(!z)throw Error('Tensor location "gpu-buffer" is not supported without using WebGPU.');J=z(G,V,k,R)}}else if(S==="ml-tensor"){let k=$[2].mlTensor;R=s8(XG(L),Y);let z=U.webnnRegisterMLTensor;if(!z)throw Error('Tensor location "ml-tensor" is not supported without using WebNN.');J=z(G,k,XG(L),Y)}else{let k=$[2];if(Array.isArray(k)){R=H*k.length,J=U._malloc(R),O.push(J);for(let z=0;zU.setValue(I+w*H,z,H===4?"i32":"i64"));let k=U._OrtCreateTensor(XG(L),J,R,I,Y.length,Rv(X));k===0&&N9(`Can't create tensor for input/output. session=${G}, index=${V}.`),j.push(k)}finally{U.stackRestore(D)}},IR=async($,j,O,G,Z,V)=>{let N=_9(),J=N.PTR_SIZE,R=Z7.get($);if(!R)throw Error(`cannot run inference. invalid session id: ${$}`);let U=R[0],H=R[1],L=R[2],Y=R[3],S=R[4],X=R[5],D=j.length,I=G.length,k=0,z=[],w=[],T=[],W=[],E=N.stackSave(),Q=N.stackAlloc(D*J),A=N.stackAlloc(D*J),l=N.stackAlloc(I*J),r=N.stackAlloc(I*J);try{[k,z]=py(V);for(let v0=0;v0E0*e0,1);i=z4(R0);let q5=Y?.outputPreferredLocations[G[v0]];if(i==="string"){if(q5==="gpu-buffer"||q5==="ml-tensor")throw Error("String tensor is not supported on GPU.");let E0=[];for(let e0=0;e00){let E0=N.jsepGetBuffer;if(!E0)throw Error('preferredLocation "gpu-buffer" is not supported without using WebGPU.');let e0=E0(s),N0=s8(R0,M0);if(N0===void 0||!ZR(i))throw Error(`Unsupported data type: ${i}`);F0=!0,V0.push([i,Z0,{gpuBuffer:e0,download:N.jsepCreateDownloader(e0,N0,i),dispose:()=>{N._OrtReleaseTensor($0)!==0&&N9("Can't release tensor.")}},"gpu-buffer"])}else if(q5==="ml-tensor"&&M0>0){let{webnnEnsureTensor:E0,webnnIsInt64Supported:e0}=N;if(!E0||!e0)throw Error('preferredLocation "ml-tensor" is not supported without using WebNN.');if(s8(R0,M0)===void 0||!qR(i))throw Error(`Unsupported data type: ${i}`);if(i==="int64"&&!e0($))throw Error('preferredLocation "ml-tensor" for int64 output is not supported by current WebNN Context.');let N0=await E0($,s,R0,Z0,!1);F0=!0,V0.push([i,Z0,{mlTensor:N0,download:N.webnnCreateMLTensorDownloader(s,i),dispose:()=>{N.webnnReleaseTensorId(s),N._OrtReleaseTensor($0)}},"ml-tensor"])}else{let E0=new(GR(i))(M0);new Uint8Array(E0.buffer,E0.byteOffset,E0.byteLength).set(N.HEAPU8.subarray(s,s+E0.byteLength)),V0.push([i,Z0,E0,"cpu"])}}finally{N.stackRestore(G0),i==="string"&&s&&N._free(s),F0||N._OrtReleaseTensor($0),N.webnnOnRunEnd?.(U)}}return Y&&!S&&(N._OrtClearBoundOutputs(Y.handle)!==0&&N9("Can't clear bound outputs."),Z7.set($,[U,H,L,Y,S,!1])),V0}finally{N.stackRestore(E),w.forEach((e)=>N._OrtReleaseTensor(e)),T.forEach((e)=>N._OrtReleaseTensor(e)),W.forEach((e)=>N._free(e)),k!==0&&N._OrtReleaseRunOptions(k),z.forEach((e)=>N._free(e))}},DR=($)=>{let j=_9(),O=Z7.get($);if(!O)throw Error("invalid session id");let G=O[0],Z=j._OrtEndProfiling(G);Z===0&&N9("Can't get an profile file name."),j._OrtFree(Z)},WR=($)=>{let j=[];for(let O of $){let G=O[2];!Array.isArray(G)&&"buffer"in G&&j.push(G.buffer)}return j}}),sI=I5(()=>{Q3(),oI(),G$(),HR(),q7=()=>!!T9.wasm.proxy&&typeof document<"u",YG=!1,WZ=!1,MZ=!1,nq=new Map,p8=($,j)=>{let O=nq.get($);O?O.push(j):nq.set($,[j])},A8=()=>{if(YG||!WZ||MZ||!D3)throw Error("worker not ready")},DP=($)=>{switch($.data.type){case"init-wasm":YG=!1,$.data.err?(MZ=!0,mJ[1]($.data.err)):(WZ=!0,mJ[0]()),rq&&(URL.revokeObjectURL(rq),rq=void 0);break;case"init-ep":case"copy-from":case"create":case"release":case"run":case"end-profiling":{let j=nq.get($.data.type);$.data.err?j.shift()[1]($.data.err):j.shift()[0]($.data.out);break}}},cI=async()=>{if(!WZ){if(YG)throw Error("multiple calls to 'initWasm()' detected.");if(MZ)throw Error("previous call to 'initWasm()' failed.");if(YG=!0,q7())return new Promise(($,j)=>{D3?.terminate(),cy().then(([O,G])=>{try{(D3=G).onerror=(V)=>j(V),D3.onmessage=DP,mJ=[$,j];let Z={type:"init-wasm",in:T9};!Z.in.wasm.wasmPaths&&(O||vv)&&(Z.in.wasm.wasmPaths={wasm:new URL("ort-wasm-simd-threaded.jsep.wasm",import.meta.url).href}),D3.postMessage(Z),rq=O}catch(Z){j(Z)}},j)});try{await OR(T9.wasm),await FR(T9),WZ=!0}catch($){throw MZ=!0,$}finally{YG=!1}}},mI=async($)=>{if(q7())return A8(),new Promise((j,O)=>{p8("init-ep",[j,O]);let G={type:"init-ep",in:{epName:$,env:T9}};D3.postMessage(G)});await yR(T9,$)},pI=async($)=>q7()?(A8(),new Promise((j,O)=>{p8("copy-from",[j,O]);let G={type:"copy-from",in:{buffer:$}};D3.postMessage(G,[$.buffer])})):PV($),AI=async($,j)=>{if(q7()){if(j?.preferredOutputLocation)throw Error('session option "preferredOutputLocation" is not supported for proxy.');return A8(),new Promise((O,G)=>{p8("create",[O,G]);let Z={type:"create",in:{model:$,options:{...j}}},V=[];$ instanceof Uint8Array&&V.push($.buffer),D3.postMessage(Z,V)})}return zR($,j)},gI=async($)=>{if(q7())return A8(),new Promise((j,O)=>{p8("release",[j,O]);let G={type:"release",in:$};D3.postMessage(G)});kR($)},uI=async($,j,O,G,Z,V)=>{if(q7()){if(O.some((N)=>N[3]!=="cpu"))throw Error("input tensor on GPU is not supported for proxy.");if(Z.some((N)=>N))throw Error("pre-allocated output tensor is not supported for proxy.");return A8(),new Promise((N,J)=>{p8("run",[N,J]);let R=O,U={type:"run",in:{sessionId:$,inputIndices:j,inputs:R,outputIndices:G,options:V}};D3.postMessage(U,WR(R))})}return IR($,j,O,G,Z,V)},dI=async($)=>{if(q7())return A8(),new Promise((j,O)=>{p8("end-profiling",[j,O]);let G={type:"end-profiling",in:$};D3.postMessage(G)});DR($)}}),SK=I5(()=>{Q3(),sI(),Y6(),jR(),KI(),pJ=($,j)=>{switch($.location){case"cpu":return[$.type,$.dims,$.data,"cpu"];case"gpu-buffer":return[$.type,$.dims,{gpuBuffer:$.gpuBuffer},"gpu-buffer"];case"ml-tensor":return[$.type,$.dims,{mlTensor:$.mlTensor},"ml-tensor"];default:throw Error(`invalid data location: ${$.location} for ${j()}`)}},WP=($)=>{switch($[3]){case"cpu":return new b3($[0],$[2],$[1]);case"gpu-buffer":{let j=$[0];if(!ZR(j))throw Error(`not supported data type: ${j} for deserializing GPU tensor`);let{gpuBuffer:O,download:G,dispose:Z}=$[2];return b3.fromGpuBuffer(O,{dataType:j,dims:$[1],download:G,dispose:Z})}case"ml-tensor":{let j=$[0];if(!qR(j))throw Error(`not supported data type: ${j} for deserializing MLTensor tensor`);let{mlTensor:O,download:G,dispose:Z}=$[2];return b3.fromMLTensor(O,{dataType:j,dims:$[1],download:G,dispose:Z})}default:throw Error(`invalid data location: ${$[3]}`)}},lI=class{async fetchModelAndCopyToWasmMemory($){return pI(await VR($))}async loadModel($,j){let O;C3(),O=typeof $=="string"?await this.fetchModelAndCopyToWasmMemory($):$,[this.sessionId,this.inputNames,this.outputNames,this.inputMetadata,this.outputMetadata]=await AI(O,j),o2()}async dispose(){return gI(this.sessionId)}async run($,j,O){C3();let G=[],Z=[];Object.entries($).forEach((L)=>{let Y=L[0],S=L[1],X=this.inputNames.indexOf(Y);if(X===-1)throw Error(`invalid input '${Y}'`);G.push(S),Z.push(X)});let V=[],N=[];Object.entries(j).forEach((L)=>{let Y=L[0],S=L[1],X=this.outputNames.indexOf(Y);if(X===-1)throw Error(`invalid output '${Y}'`);V.push(S),N.push(X)});let J=G.map((L,Y)=>pJ(L,()=>`input "${this.inputNames[Z[Y]]}"`)),R=V.map((L,Y)=>L?pJ(L,()=>`output "${this.outputNames[N[Y]]}"`):null),U=await uI(this.sessionId,Z,J,N,R,O),H={};for(let L=0;LaI,initializeFlags:()=>zv,wasmBackend:()=>rI});var zv,aI,rI,PK=I5(()=>{Q3(),sI(),SK(),zv=()=>{(typeof T9.wasm.initTimeout!="number"||T9.wasm.initTimeout<0)&&(T9.wasm.initTimeout=0);let $=T9.wasm.simd;if(typeof $!="boolean"&&$!==void 0&&$!=="fixed"&&$!=="relaxed"&&(console.warn(`Property "env.wasm.simd" is set to unknown value "${$}". Reset it to \`false\` and ignore SIMD feature checking.`),T9.wasm.simd=!1),typeof T9.wasm.proxy!="boolean"&&(T9.wasm.proxy=!1),typeof T9.wasm.trace!="boolean"&&(T9.wasm.trace=!1),typeof T9.wasm.numThreads!="number"||!Number.isInteger(T9.wasm.numThreads)||T9.wasm.numThreads<=0)if(typeof self<"u"&&!self.crossOriginIsolated)T9.wasm.numThreads=1;else{let j=typeof navigator>"u"?qM("node:os").cpus().length:navigator.hardwareConcurrency;T9.wasm.numThreads=Math.min(4,Math.ceil((j||1)/2))}},rI=new(aI=class{async init($){zv(),await cI(),await mI($)}async createInferenceSessionHandler($,j){let O=new lI;return await O.loadModel($,j),O}})});Q3(),Q3(),Q3();var XK=wy;{let $=(PK(),AZ(iI)).wasmBackend;i8("webgpu",$,5),i8("webnn",$,5),i8("cpu",$,10),i8("wasm",$,10)}Object.defineProperty(T9.versions,"web",{value:"1.22.0-dev.20250409-89f8206ba4",enumerable:!0});var AJ,SG,TK=Object.freeze({__proto__:null,get InferenceSession(){return ev},get TRACE(){return pZ},get TRACE_FUNC_BEGIN(){return C3},get TRACE_FUNC_END(){return o2},get Tensor(){return b3},default:XK,get env(){return T9},get registerBackend(){return i8}}),FK={"onnxruntime-common":($)=>{/*!*************************************!*\ + !*** external "onnxruntime-common" ***! + \*************************************/$.exports=jM},"onnxruntime-web":($)=>{/*!**********************************!*\ + !*** external "onnxruntime-web" ***! + \**********************************/$.exports=TK},"?2ce3":()=>{/*!**********************************!*\ + !*** onnxruntime-node (ignored) ***! + \**********************************/},"?7a2c":()=>{/*!********************!*\ + !*** fs (ignored) ***! + \********************/},"?a42a":()=>{/*!**********************!*\ + !*** path (ignored) ***! + \**********************/},"?2b25":()=>{/*!***********************!*\ + !*** sharp (ignored) ***! + \***********************/},"?569f":()=>{/*!********************!*\ + !*** fs (ignored) ***! + \********************/},"?3f59":()=>{/*!**********************!*\ + !*** path (ignored) ***! + \**********************/},"?154a":()=>{/*!*********************!*\ + !*** url (ignored) ***! + \*********************/},"./node_modules/@huggingface/jinja/dist/index.js":($,j,O)=>{/*!*******************************************************!*\ + !*** ./node_modules/@huggingface/jinja/dist/index.js ***! + \*******************************************************/O.r(j),O.d(j,{Environment:()=>U5,Interpreter:()=>T0,Template:()=>U6,parse:()=>q0,tokenize:()=>H});var G=Object.freeze({Text:"Text",NumericLiteral:"NumericLiteral",BooleanLiteral:"BooleanLiteral",NullLiteral:"NullLiteral",StringLiteral:"StringLiteral",Identifier:"Identifier",Equals:"Equals",OpenParen:"OpenParen",CloseParen:"CloseParen",OpenStatement:"OpenStatement",CloseStatement:"CloseStatement",OpenExpression:"OpenExpression",CloseExpression:"CloseExpression",OpenSquareBracket:"OpenSquareBracket",CloseSquareBracket:"CloseSquareBracket",OpenCurlyBracket:"OpenCurlyBracket",CloseCurlyBracket:"CloseCurlyBracket",Comma:"Comma",Dot:"Dot",Colon:"Colon",Pipe:"Pipe",CallOperator:"CallOperator",AdditiveBinaryOperator:"AdditiveBinaryOperator",MultiplicativeBinaryOperator:"MultiplicativeBinaryOperator",ComparisonBinaryOperator:"ComparisonBinaryOperator",UnaryOperator:"UnaryOperator",Set:"Set",If:"If",For:"For",In:"In",Is:"Is",NotIn:"NotIn",Else:"Else",EndSet:"EndSet",EndIf:"EndIf",ElseIf:"ElseIf",EndFor:"EndFor",And:"And",Or:"Or",Not:"UnaryOperator",Macro:"Macro",EndMacro:"EndMacro",Break:"Break",Continue:"Continue"}),Z=Object.freeze({set:G.Set,for:G.For,in:G.In,is:G.Is,if:G.If,else:G.Else,endset:G.EndSet,endif:G.EndIf,elif:G.ElseIf,endfor:G.EndFor,and:G.And,or:G.Or,not:G.Not,"not in":G.NotIn,macro:G.Macro,endmacro:G.EndMacro,break:G.Break,continue:G.Continue,true:G.BooleanLiteral,false:G.BooleanLiteral,none:G.NullLiteral,True:G.BooleanLiteral,False:G.BooleanLiteral,None:G.NullLiteral}),V=class{constructor(t,y0){this.value=t,this.type=y0}};function N(t){return/\w/.test(t)}function J(t){return/[0-9]/.test(t)}var R=[["{%",G.OpenStatement],["%}",G.CloseStatement],["{{",G.OpenExpression],["}}",G.CloseExpression],["(",G.OpenParen],[")",G.CloseParen],["{",G.OpenCurlyBracket],["}",G.CloseCurlyBracket],["[",G.OpenSquareBracket],["]",G.CloseSquareBracket],[",",G.Comma],[".",G.Dot],[":",G.Colon],["|",G.Pipe],["<=",G.ComparisonBinaryOperator],[">=",G.ComparisonBinaryOperator],["==",G.ComparisonBinaryOperator],["!=",G.ComparisonBinaryOperator],["<",G.ComparisonBinaryOperator],[">",G.ComparisonBinaryOperator],["+",G.AdditiveBinaryOperator],["-",G.AdditiveBinaryOperator],["*",G.MultiplicativeBinaryOperator],["/",G.MultiplicativeBinaryOperator],["%",G.MultiplicativeBinaryOperator],["=",G.Equals]],U=new Map([["n",` +`],["t","\t"],["r","\r"],["b","\b"],["f","\f"],["v","\v"],["'","'"],['"','"'],["\\","\\"]]);function H(t,y0={}){let O0=[],I0=function(N5,g5={}){return N5.endsWith(` +`)&&(N5=N5.slice(0,-1)),N5=N5.replace(/{#.*?#}/gs,"{##}"),g5.lstrip_blocks&&(N5=N5.replace(/^[ \t]*({[#%])/gm,"$1")),g5.trim_blocks&&(N5=N5.replace(/([#%]})\n/g,"$1")),N5.replace(/{##}/g,"").replace(/-%}\s*/g,"%}").replace(/\s*{%-/g,"{%").replace(/-}}\s*/g,"}}").replace(/\s*{{-/g,"{{")}(t,y0),w0=0,H5=(N5)=>{let g5="";for(;N5(I0[w0]);){if(I0[w0]==="\\"){if(++w0,w0>=I0.length)throw SyntaxError("Unexpected end of input");let Q5=I0[w0++],S5=U.get(Q5);if(S5===void 0)throw SyntaxError(`Unexpected escaped character: ${Q5}`);g5+=S5;continue}if(g5+=I0[w0++],w0>=I0.length)throw SyntaxError("Unexpected end of input")}return g5};$:for(;w00){O0.push(new V(Q5,G.Text));continue}}H5((Q5)=>/\s/.test(Q5));let g5=I0[w0];if(g5==="-"||g5==="+"){let Q5=O0.at(-1)?.type;if(Q5===G.Text||Q5===void 0)throw SyntaxError(`Unexpected character: ${g5}`);switch(Q5){case G.Identifier:case G.NumericLiteral:case G.BooleanLiteral:case G.NullLiteral:case G.StringLiteral:case G.CloseParen:case G.CloseSquareBracket:break;default:{++w0;let S5=H5(J);O0.push(new V(`${g5}${S5}`,S5.length>0?G.NumericLiteral:G.UnaryOperator));continue}}}for(let[Q5,S5]of R)if(I0.slice(w0,w0+Q5.length)===Q5){O0.push(new V(Q5,S5)),w0+=Q5.length;continue $}if(g5==="'"||g5==='"'){++w0;let Q5=H5((S5)=>S5!==g5);O0.push(new V(Q5,G.StringLiteral)),++w0;continue}if(J(g5)){let Q5=H5(J);O0.push(new V(Q5,G.NumericLiteral));continue}if(N(g5)){let Q5=H5(N),S5=Object.hasOwn(Z,Q5)?Z[Q5]:G.Identifier;S5===G.In&&O0.at(-1)?.type===G.Not?(O0.pop(),O0.push(new V("not in",G.NotIn))):O0.push(new V(Q5,S5));continue}throw SyntaxError(`Unexpected character: ${g5}`)}return O0}var L=class{type="Statement"},Y=class extends L{constructor(t){super(),this.body=t}type="Program"},S=class extends L{constructor(t,y0,O0){super(),this.test=t,this.body=y0,this.alternate=O0}type="If"},X=class extends L{constructor(t,y0,O0,I0){super(),this.loopvar=t,this.iterable=y0,this.body=O0,this.defaultBlock=I0}type="For"},D=class extends L{type="Break"},I=class extends L{type="Continue"},k=class extends L{constructor(t,y0,O0){super(),this.assignee=t,this.value=y0,this.body=O0}type="Set"},z=class extends L{constructor(t,y0,O0){super(),this.name=t,this.args=y0,this.body=O0}type="Macro"},w=class extends L{type="Expression"},T=class extends w{constructor(t,y0,O0){super(),this.object=t,this.property=y0,this.computed=O0}type="MemberExpression"},W=class extends w{constructor(t,y0){super(),this.callee=t,this.args=y0}type="CallExpression"},E=class extends w{constructor(t){super(),this.value=t}type="Identifier"},Q=class extends w{constructor(t){super(),this.value=t}type="Literal"},A=class extends Q{type="NumericLiteral"},l=class extends Q{type="StringLiteral"},r=class extends Q{type="BooleanLiteral"},e=class extends Q{type="NullLiteral"},V0=class extends Q{type="ArrayLiteral"},v0=class extends Q{type="TupleLiteral"},$0=class extends Q{type="ObjectLiteral"},i=class extends w{constructor(t,y0,O0){super(),this.operator=t,this.left=y0,this.right=O0}type="BinaryExpression"},G0=class extends w{constructor(t,y0){super(),this.operand=t,this.filter=y0}type="FilterExpression"},S0=class extends w{constructor(t,y0){super(),this.iterable=t,this.test=y0}type="SelectExpression"},F0=class extends w{constructor(t,y0,O0){super(),this.operand=t,this.negate=y0,this.test=O0}type="TestExpression"},s=class extends w{constructor(t,y0){super(),this.operator=t,this.argument=y0}type="UnaryExpression"},n=class extends w{constructor(t=void 0,y0=void 0,O0=void 0){super(),this.start=t,this.stop=y0,this.step=O0}type="SliceExpression"},R0=class extends w{constructor(t,y0){super(),this.key=t,this.value=y0}type="KeywordArgumentExpression"};function q0(t){let y0=new Y([]),O0=0;function I0(_5,E5){let v5=t[O0++];if(!v5||v5.type!==_5)throw Error(`Parser Error: ${E5}. ${v5.type} !== ${_5}.`);return v5}function w0(){switch(t[O0].type){case G.Text:return new l(I0(G.Text,"Expected text token").value);case G.OpenStatement:return function(){let _5;switch(I0(G.OpenStatement,"Expected opening statement token"),t[O0].type){case G.Set:++O0,_5=function(){let E5=S5();if(N5(G.Equals)){++O0;let v5=S5();return new k(E5,v5,[])}{let v5=[];for(I0(G.CloseStatement,"Expected %} token");t[O0]?.type!==G.OpenStatement||t[O0+1]?.type!==G.EndSet;){let o6=w0();v5.push(o6)}return I0(G.OpenStatement,"Expected {% token"),I0(G.EndSet,"Expected endset token"),new k(E5,null,v5)}}(),I0(G.CloseStatement,"Expected closing statement token");break;case G.If:++O0,_5=g5(),I0(G.OpenStatement,"Expected {% token"),I0(G.EndIf,"Expected endif token"),I0(G.CloseStatement,"Expected %} token");break;case G.Macro:++O0,_5=function(){let E5=z6();if(E5.type!=="Identifier")throw SyntaxError("Expected identifier following macro statement");let v5=Y9();I0(G.CloseStatement,"Expected closing statement token");let o6=[];for(;H5(G.OpenStatement,G.EndMacro);)o6.push(w0());return new z(E5,v5,o6)}(),I0(G.OpenStatement,"Expected {% token"),I0(G.EndMacro,"Expected endmacro token"),I0(G.CloseStatement,"Expected %} token");break;case G.For:++O0,_5=function(){let E5=Q5(!0);if(!(E5 instanceof E||E5 instanceof v0))throw SyntaxError(`Expected identifier/tuple for the loop variable, got ${E5.type} instead`);I0(G.In,"Expected `in` keyword following loop variable");let v5=S5();I0(G.CloseStatement,"Expected closing statement token");let o6=[];for(;H5(G.OpenStatement,G.EndFor)&&H5(G.OpenStatement,G.Else);)o6.push(w0());let b9=[];if(N5(G.OpenStatement,G.Else))for(++O0,++O0,I0(G.CloseStatement,"Expected closing statement token");H5(G.OpenStatement,G.EndFor);)b9.push(w0());return new X(E5,v5,o6,b9)}(),I0(G.OpenStatement,"Expected {% token"),I0(G.EndFor,"Expected endfor token"),I0(G.CloseStatement,"Expected %} token");break;case G.Break:++O0,I0(G.CloseStatement,"Expected closing statement token"),_5=new D;break;case G.Continue:++O0,I0(G.CloseStatement,"Expected closing statement token"),_5=new I;break;default:throw SyntaxError(`Unknown statement type: ${t[O0].type}`)}return _5}();case G.OpenExpression:return function(){I0(G.OpenExpression,"Expected opening expression token");let _5=S5();return I0(G.CloseExpression,"Expected closing expression token"),_5}();default:throw SyntaxError(`Unexpected token type: ${t[O0].type}`)}}function H5(..._5){return O0+_5.length<=t.length&&_5.some((E5,v5)=>E5!==t[O0+v5].type)}function N5(..._5){return O0+_5.length<=t.length&&_5.every((E5,v5)=>E5===t[O0+v5].type)}function g5(){let _5=S5();I0(G.CloseStatement,"Expected closing statement token");let E5=[],v5=[];for(;t[O0]?.type!==G.OpenStatement||t[O0+1]?.type!==G.ElseIf&&t[O0+1]?.type!==G.Else&&t[O0+1]?.type!==G.EndIf;)E5.push(w0());if(t[O0]?.type===G.OpenStatement&&t[O0+1]?.type!==G.EndIf)if(++O0,N5(G.ElseIf))I0(G.ElseIf,"Expected elseif token"),v5.push(g5());else for(I0(G.Else,"Expected else token"),I0(G.CloseStatement,"Expected closing statement token");t[O0]?.type!==G.OpenStatement||t[O0+1]?.type!==G.EndIf;)v5.push(w0());return new S(_5,E5,v5)}function Q5(_5=!1){let E5=_5?z6:S5,v5=[E5()],o6=N5(G.Comma);for(;o6&&(++O0,v5.push(E5()),N5(G.Comma)););return o6?new v0(v5):v5[0]}function S5(){return function(){let _5=K6();if(N5(G.If)){++O0;let E5=K6();if(N5(G.Else)){++O0;let v5=K6();return new S(E5,[_5],[v5])}return new S0(_5,E5)}return _5}()}function K6(){let _5=Y5();for(;N5(G.Or);){let E5=t[O0];++O0;let v5=Y5();_5=new i(E5,_5,v5)}return _5}function Y5(){let _5=w6();for(;N5(G.And);){let E5=t[O0];++O0;let v5=w6();_5=new i(E5,_5,v5)}return _5}function w6(){let _5;for(;N5(G.Not);){let E5=t[O0];++O0;let v5=w6();_5=new s(E5,v5)}return _5??function(){let E5=Z6();for(;N5(G.ComparisonBinaryOperator)||N5(G.In)||N5(G.NotIn);){let v5=t[O0];++O0;let o6=Z6();E5=new i(v5,E5,o6)}return E5}()}function Z6(){let _5=a9();for(;N5(G.AdditiveBinaryOperator);){let E5=t[O0];++O0;let v5=a9();_5=new i(E5,_5,v5)}return _5}function c6(_5){let E5=new W(_5,Y9());return E5=V6(E5),N5(G.OpenParen)&&(E5=c6(E5)),E5}function Y9(){I0(G.OpenParen,"Expected opening parenthesis for arguments list");let _5=function(){let E5=[];for(;!N5(G.CloseParen);){let v5=S5();if(N5(G.Equals)){if(++O0,!(v5 instanceof E))throw SyntaxError("Expected identifier for keyword argument");let o6=S5();v5=new R0(v5,o6)}E5.push(v5),N5(G.Comma)&&++O0}return E5}();return I0(G.CloseParen,"Expected closing parenthesis for arguments list"),_5}function y9(){let _5=[],E5=!1;for(;!N5(G.CloseSquareBracket);)N5(G.Colon)?(_5.push(void 0),++O0,E5=!0):(_5.push(S5()),N5(G.Colon)&&(++O0,E5=!0));if(_5.length===0)throw SyntaxError("Expected at least one argument for member/slice expression");if(E5){if(_5.length>3)throw SyntaxError("Expected 0-3 arguments for slice expression");return new n(..._5)}return _5[0]}function V6(_5){for(;N5(G.Dot)||N5(G.OpenSquareBracket);){let E5=t[O0],v5;++O0;let o6=E5.type!==G.Dot;if(o6)v5=y9(),I0(G.CloseSquareBracket,"Expected closing square bracket");else if(v5=z6(),v5.type!=="Identifier")throw SyntaxError("Expected identifier following dot operator");_5=new T(_5,v5,o6)}return _5}function a9(){let _5=I9();for(;N5(G.MultiplicativeBinaryOperator);){let E5=t[O0];++O0;let v5=I9();_5=new i(E5,_5,v5)}return _5}function I9(){let _5=function(){let E5=function(){let v5=V6(z6());return N5(G.OpenParen)?c6(v5):v5}();for(;N5(G.Pipe);){++O0;let v5=z6();if(!(v5 instanceof E))throw SyntaxError("Expected identifier for the filter");N5(G.OpenParen)&&(v5=c6(v5)),E5=new G0(E5,v5)}return E5}();for(;N5(G.Is);){++O0;let E5=N5(G.Not);E5&&++O0;let v5=z6();if(v5 instanceof r?v5=new E(v5.value.toString()):v5 instanceof e&&(v5=new E("none")),!(v5 instanceof E))throw SyntaxError("Expected identifier for the test");_5=new F0(_5,E5,v5)}return _5}function z6(){let _5=t[O0];switch(_5.type){case G.NumericLiteral:return++O0,new A(Number(_5.value));case G.StringLiteral:return++O0,new l(_5.value);case G.BooleanLiteral:return++O0,new r(_5.value.toLowerCase()==="true");case G.NullLiteral:return++O0,new e(null);case G.Identifier:return++O0,new E(_5.value);case G.OpenParen:{++O0;let E5=Q5();if(t[O0].type!==G.CloseParen)throw SyntaxError(`Expected closing parenthesis, got ${t[O0].type} instead`);return++O0,E5}case G.OpenSquareBracket:{++O0;let E5=[];for(;!N5(G.CloseSquareBracket);)E5.push(S5()),N5(G.Comma)&&++O0;return++O0,new V0(E5)}case G.OpenCurlyBracket:{++O0;let E5=new Map;for(;!N5(G.CloseCurlyBracket);){let v5=S5();I0(G.Colon,"Expected colon between key and value in object literal");let o6=S5();E5.set(v5,o6),N5(G.Comma)&&++O0}return++O0,new $0(E5)}default:throw SyntaxError(`Unexpected token: ${_5.type}`)}}for(;O0=0?(y0=(y0??=0)<0?Math.max(t.length+y0,0):Math.min(y0,t.length),O0=(O0??=t.length)<0?Math.max(t.length+O0,0):Math.min(O0,t.length)):(y0=(y0??=t.length-1)<0?Math.max(t.length+y0,-1):Math.min(y0,t.length-1),O0=(O0??=-1)<-1?Math.max(t.length+O0,-1):Math.min(O0,t.length-1));let H5=[];for(let N5=y0;w0*N5y0.toUpperCase())}var q5=class extends Error{},E0=class extends Error{},e0=class{type="RuntimeValue";value;builtins=new Map;constructor(t=void 0){this.value=t}__bool__(){return new Q0(!!this.value)}},N0=class extends e0{type="NumericValue"},P0=class extends e0{type="StringValue";builtins=new Map([["upper",new t0(()=>new P0(this.value.toUpperCase()))],["lower",new t0(()=>new P0(this.value.toLowerCase()))],["strip",new t0(()=>new P0(this.value.trim()))],["title",new t0(()=>new P0(M0(this.value)))],["length",new N0(this.value.length)],["rstrip",new t0(()=>new P0(this.value.trimEnd()))],["lstrip",new t0(()=>new P0(this.value.trimStart()))],["startswith",new t0((t)=>{if(t.length===0)throw Error("startswith() requires at least one argument");let y0=t[0];if(!(y0 instanceof P0))throw Error("startswith() argument must be a string");return new Q0(this.value.startsWith(y0.value))})],["endswith",new t0((t)=>{if(t.length===0)throw Error("endswith() requires at least one argument");let y0=t[0];if(!(y0 instanceof P0))throw Error("endswith() argument must be a string");return new Q0(this.value.endsWith(y0.value))})],["split",new t0((t)=>{let y0=t[0]??new y5;if(!(y0 instanceof P0||y0 instanceof y5))throw Error("sep argument must be a string or null");let O0=t[1]??new N0(-1);if(!(O0 instanceof N0))throw Error("maxsplit argument must be a number");let I0=[];if(y0 instanceof y5){let w0=this.value.trimStart();for(let{0:H5,index:N5}of w0.matchAll(/\S+/g)){if(O0.value!==-1&&I0.length>=O0.value&&N5!==void 0){I0.push(H5+w0.slice(N5+H5.length));break}I0.push(H5)}}else{if(y0.value==="")throw Error("empty separator");I0=this.value.split(y0.value),O0.value!==-1&&I0.length>O0.value&&I0.push(I0.splice(O0.value).join(y0.value))}return new g0(I0.map((w0)=>new P0(w0)))})]])},Q0=class extends e0{type="BooleanValue"},a0=class extends e0{type="ObjectValue";__bool__(){return new Q0(this.value.size>0)}builtins=new Map([["get",new t0(([t,y0])=>{if(!(t instanceof P0))throw Error(`Object key must be a string: got ${t.type}`);return this.value.get(t.value)??y0??new y5})],["items",new t0(()=>new g0(Array.from(this.value.entries()).map(([t,y0])=>new g0([new P0(t),y0]))))]])},r0=class extends a0{type="KeywordArgumentsValue"},g0=class extends e0{type="ArrayValue";builtins=new Map([["length",new N0(this.value.length)]]);__bool__(){return new Q0(this.value.length>0)}},J5=class extends g0{type="TupleValue"},t0=class extends e0{type="FunctionValue"},y5=class extends e0{type="NullValue"},R5=class extends e0{type="UndefinedValue"},U5=class{constructor(t){this.parent=t}variables=new Map([["namespace",new t0((t)=>{if(t.length===0)return new a0(new Map);if(t.length!==1||!(t[0]instanceof a0))throw Error("`namespace` expects either zero arguments or a single object argument");return t[0]})]]);tests=new Map([["boolean",(t)=>t.type==="BooleanValue"],["callable",(t)=>t instanceof t0],["odd",(t)=>{if(t.type!=="NumericValue")throw Error(`Cannot apply test "odd" to type: ${t.type}`);return t.value%2!=0}],["even",(t)=>{if(t.type!=="NumericValue")throw Error(`Cannot apply test "even" to type: ${t.type}`);return t.value%2==0}],["false",(t)=>t.type==="BooleanValue"&&!t.value],["true",(t)=>t.type==="BooleanValue"&&t.value],["none",(t)=>t.type==="NullValue"],["string",(t)=>t.type==="StringValue"],["number",(t)=>t.type==="NumericValue"],["integer",(t)=>t.type==="NumericValue"&&Number.isInteger(t.value)],["iterable",(t)=>t.type==="ArrayValue"||t.type==="StringValue"],["mapping",(t)=>t.type==="ObjectValue"],["lower",(t)=>{let y0=t.value;return t.type==="StringValue"&&y0===y0.toLowerCase()}],["upper",(t)=>{let y0=t.value;return t.type==="StringValue"&&y0===y0.toUpperCase()}],["none",(t)=>t.type==="NullValue"],["defined",(t)=>t.type!=="UndefinedValue"],["undefined",(t)=>t.type==="UndefinedValue"],["equalto",(t,y0)=>t.value===y0.value],["eq",(t,y0)=>t.value===y0.value]]);set(t,y0){return this.declareVariable(t,s0(y0))}declareVariable(t,y0){if(this.variables.has(t))throw SyntaxError(`Variable already declared: ${t}`);return this.variables.set(t,y0),y0}setVariable(t,y0){return this.variables.set(t,y0),y0}resolve(t){if(this.variables.has(t))return this;if(this.parent)return this.parent.resolve(t);throw Error(`Unknown variable: ${t}`)}lookupVariable(t){try{return this.resolve(t).variables.get(t)??new R5}catch{return new R5}}},T0=class{global;constructor(t){this.global=t??new U5}run(t){return this.evaluate(t,this.global)}evaluateBinaryExpression(t,y0){let O0=this.evaluate(t.left,y0);switch(t.operator.value){case"and":return O0.__bool__().value?this.evaluate(t.right,y0):O0;case"or":return O0.__bool__().value?O0:this.evaluate(t.right,y0)}let I0=this.evaluate(t.right,y0);switch(t.operator.value){case"==":return new Q0(O0.value==I0.value);case"!=":return new Q0(O0.value!=I0.value)}if(O0 instanceof R5||I0 instanceof R5)throw Error("Cannot perform operation on undefined values");if(O0 instanceof y5||I0 instanceof y5)throw Error("Cannot perform operation on null values");if(O0 instanceof N0&&I0 instanceof N0)switch(t.operator.value){case"+":return new N0(O0.value+I0.value);case"-":return new N0(O0.value-I0.value);case"*":return new N0(O0.value*I0.value);case"/":return new N0(O0.value/I0.value);case"%":return new N0(O0.value%I0.value);case"<":return new Q0(O0.value":return new Q0(O0.value>I0.value);case">=":return new Q0(O0.value>=I0.value);case"<=":return new Q0(O0.value<=I0.value)}else if(O0 instanceof g0&&I0 instanceof g0){if(t.operator.value==="+")return new g0(O0.value.concat(I0.value))}else if(I0 instanceof g0){let w0=I0.value.find((H5)=>H5.value===O0.value)!==void 0;switch(t.operator.value){case"in":return new Q0(w0);case"not in":return new Q0(!w0)}}if((O0 instanceof P0||I0 instanceof P0)&&t.operator.value==="+")return new P0(O0.value.toString()+I0.value.toString());if(O0 instanceof P0&&I0 instanceof P0)switch(t.operator.value){case"in":return new Q0(I0.value.includes(O0.value));case"not in":return new Q0(!I0.value.includes(O0.value))}if(O0 instanceof P0&&I0 instanceof a0)switch(t.operator.value){case"in":return new Q0(I0.value.has(O0.value));case"not in":return new Q0(!I0.value.has(O0.value))}throw SyntaxError(`Unknown operator "${t.operator.value}" between ${O0.type} and ${I0.type}`)}evaluateArguments(t,y0){let O0=[],I0=new Map;for(let w0 of t)if(w0.type==="KeywordArgumentExpression"){let H5=w0;I0.set(H5.key.value,this.evaluate(H5.value,y0))}else{if(I0.size>0)throw Error("Positional arguments must come before keyword arguments");O0.push(this.evaluate(w0,y0))}return[O0,I0]}evaluateFilterExpression(t,y0){let O0=this.evaluate(t.operand,y0);if(t.filter.type==="Identifier"){let I0=t.filter;if(I0.value==="tojson")return new P0(D5(O0));if(O0 instanceof g0)switch(I0.value){case"list":return O0;case"first":return O0.value[0];case"last":return O0.value[O0.value.length-1];case"length":return new N0(O0.value.length);case"reverse":return new g0(O0.value.reverse());case"sort":return new g0(O0.value.sort((w0,H5)=>{if(w0.type!==H5.type)throw Error(`Cannot compare different types: ${w0.type} and ${H5.type}`);switch(w0.type){case"NumericValue":return w0.value-H5.value;case"StringValue":return w0.value.localeCompare(H5.value);default:throw Error(`Cannot compare type: ${w0.type}`)}}));case"join":return new P0(O0.value.map((w0)=>w0.value).join(""));case"string":return new P0(D5(O0));default:throw Error(`Unknown ArrayValue filter: ${I0.value}`)}else if(O0 instanceof P0)switch(I0.value){case"length":return new N0(O0.value.length);case"upper":return new P0(O0.value.toUpperCase());case"lower":return new P0(O0.value.toLowerCase());case"title":return new P0(M0(O0.value));case"capitalize":return new P0(O0.value.charAt(0).toUpperCase()+O0.value.slice(1));case"trim":return new P0(O0.value.trim());case"indent":return new P0(O0.value.split(` +`).map((w0,H5)=>H5===0||w0.length===0?w0:" "+w0).join(` +`));case"join":case"string":return O0;default:throw Error(`Unknown StringValue filter: ${I0.value}`)}else{if(O0 instanceof N0){if(I0.value==="abs")return new N0(Math.abs(O0.value));throw Error(`Unknown NumericValue filter: ${I0.value}`)}if(O0 instanceof a0)switch(I0.value){case"items":return new g0(Array.from(O0.value.entries()).map(([w0,H5])=>new g0([new P0(w0),H5])));case"length":return new N0(O0.value.size);default:throw Error(`Unknown ObjectValue filter: ${I0.value}`)}}throw Error(`Cannot apply filter "${I0.value}" to type: ${O0.type}`)}if(t.filter.type==="CallExpression"){let I0=t.filter;if(I0.callee.type!=="Identifier")throw Error(`Unknown filter: ${I0.callee.type}`);let w0=I0.callee.value;if(w0==="tojson"){let[,H5]=this.evaluateArguments(I0.args,y0),N5=H5.get("indent")??new y5;if(!(N5 instanceof N0||N5 instanceof y5))throw Error("If set, indent must be a number");return new P0(D5(O0,N5.value))}if(w0==="join"){let H5;if(O0 instanceof P0)H5=Array.from(O0.value);else{if(!(O0 instanceof g0))throw Error(`Cannot apply filter "${w0}" to type: ${O0.type}`);H5=O0.value.map((S5)=>S5.value)}let[N5,g5]=this.evaluateArguments(I0.args,y0),Q5=N5.at(0)??g5.get("separator")??new P0("");if(!(Q5 instanceof P0))throw Error("separator must be a string");return new P0(H5.join(Q5.value))}if(O0 instanceof g0){switch(w0){case"selectattr":case"rejectattr":{let H5=w0==="selectattr";if(O0.value.some((Y5)=>!(Y5 instanceof a0)))throw Error(`\`${w0}\` can only be applied to array of objects`);if(I0.args.some((Y5)=>Y5.type!=="StringLiteral"))throw Error(`arguments of \`${w0}\` must be strings`);let[N5,g5,Q5]=I0.args.map((Y5)=>this.evaluate(Y5,y0)),S5;if(g5){let Y5=y0.tests.get(g5.value);if(!Y5)throw Error(`Unknown test: ${g5.value}`);S5=Y5}else S5=(...Y5)=>Y5[0].__bool__().value;let K6=O0.value.filter((Y5)=>{let w6=Y5.value.get(N5.value),Z6=!!w6&&S5(w6,Q5);return H5?Z6:!Z6});return new g0(K6)}case"map":{let[,H5]=this.evaluateArguments(I0.args,y0);if(H5.has("attribute")){let N5=H5.get("attribute");if(!(N5 instanceof P0))throw Error("attribute must be a string");let g5=H5.get("default"),Q5=O0.value.map((S5)=>{if(!(S5 instanceof a0))throw Error("items in map must be an object");return S5.value.get(N5.value)??g5??new R5});return new g0(Q5)}throw Error("`map` expressions without `attribute` set are not currently supported.")}}throw Error(`Unknown ArrayValue filter: ${w0}`)}if(O0 instanceof P0){if(w0==="indent"){let[H5,N5]=this.evaluateArguments(I0.args,y0),g5=H5.at(0)??N5.get("width")??new N0(4);if(!(g5 instanceof N0))throw Error("width must be a number");let Q5=H5.at(1)??N5.get("first")??new Q0(!1),S5=H5.at(2)??N5.get("blank")??new Q0(!1),K6=O0.value.split(` +`),Y5=" ".repeat(g5.value),w6=K6.map((Z6,c6)=>!Q5.value&&c6===0||!S5.value&&Z6.length===0?Z6:Y5+Z6);return new P0(w6.join(` +`))}throw Error(`Unknown StringValue filter: ${w0}`)}throw Error(`Cannot apply filter "${w0}" to type: ${O0.type}`)}throw Error(`Unknown filter: ${t.filter.type}`)}evaluateTestExpression(t,y0){let O0=this.evaluate(t.operand,y0),I0=y0.tests.get(t.test.value);if(!I0)throw Error(`Unknown test: ${t.test.value}`);let w0=I0(O0);return new Q0(t.negate?!w0:w0)}evaluateUnaryExpression(t,y0){let O0=this.evaluate(t.argument,y0);if(t.operator.value==="not")return new Q0(!O0.value);throw SyntaxError(`Unknown operator: ${t.operator.value}`)}evalProgram(t,y0){return this.evaluateBlock(t.body,y0)}evaluateBlock(t,y0){let O0="";for(let I0 of t){let w0=this.evaluate(I0,y0);w0.type!=="NullValue"&&w0.type!=="UndefinedValue"&&(O0+=w0.value)}return new P0(O0)}evaluateIdentifier(t,y0){return y0.lookupVariable(t.value)}evaluateCallExpression(t,y0){let[O0,I0]=this.evaluateArguments(t.args,y0);I0.size>0&&O0.push(new r0(I0));let w0=this.evaluate(t.callee,y0);if(w0.type!=="FunctionValue")throw Error(`Cannot call something that is not a function: got ${w0.type}`);return w0.value(O0,y0)}evaluateSliceExpression(t,y0,O0){if(!(t instanceof g0||t instanceof P0))throw Error("Slice object must be an array or string");let I0=this.evaluate(y0.start,O0),w0=this.evaluate(y0.stop,O0),H5=this.evaluate(y0.step,O0);if(!(I0 instanceof N0||I0 instanceof R5))throw Error("Slice start must be numeric or undefined");if(!(w0 instanceof N0||w0 instanceof R5))throw Error("Slice stop must be numeric or undefined");if(!(H5 instanceof N0||H5 instanceof R5))throw Error("Slice step must be numeric or undefined");return t instanceof g0?new g0(Z0(t.value,I0.value,w0.value,H5.value)):new P0(Z0(Array.from(t.value),I0.value,w0.value,H5.value).join(""))}evaluateMemberExpression(t,y0){let O0=this.evaluate(t.object,y0),I0,w0;if(t.computed){if(t.property.type==="SliceExpression")return this.evaluateSliceExpression(O0,t.property,y0);I0=this.evaluate(t.property,y0)}else I0=new P0(t.property.value);if(O0 instanceof a0){if(!(I0 instanceof P0))throw Error(`Cannot access property with non-string: got ${I0.type}`);w0=O0.value.get(I0.value)??O0.builtins.get(I0.value)}else if(O0 instanceof g0||O0 instanceof P0)if(I0 instanceof N0)w0=O0.value.at(I0.value),O0 instanceof P0&&(w0=new P0(O0.value.at(I0.value)));else{if(!(I0 instanceof P0))throw Error(`Cannot access property with non-string/non-number: got ${I0.type}`);w0=O0.builtins.get(I0.value)}else{if(!(I0 instanceof P0))throw Error(`Cannot access property with non-string: got ${I0.type}`);w0=O0.builtins.get(I0.value)}return w0 instanceof e0?w0:new R5}evaluateSet(t,y0){let O0=t.value?this.evaluate(t.value,y0):this.evaluateBlock(t.body,y0);if(t.assignee.type==="Identifier"){let I0=t.assignee.value;y0.setVariable(I0,O0)}else{if(t.assignee.type!=="MemberExpression")throw Error(`Invalid LHS inside assignment expression: ${JSON.stringify(t.assignee)}`);{let I0=t.assignee,w0=this.evaluate(I0.object,y0);if(!(w0 instanceof a0))throw Error("Cannot assign to member of non-object");if(I0.property.type!=="Identifier")throw Error("Cannot assign to member with non-identifier property");w0.value.set(I0.property.value,O0)}}return new y5}evaluateIf(t,y0){let O0=this.evaluate(t.test,y0);return this.evaluateBlock(O0.__bool__().value?t.body:t.alternate,y0)}evaluateFor(t,y0){let O0=new U5(y0),I0,w0;if(t.iterable.type==="SelectExpression"){let S5=t.iterable;w0=this.evaluate(S5.iterable,O0),I0=S5.test}else w0=this.evaluate(t.iterable,O0);if(!(w0 instanceof g0))throw Error(`Expected iterable type in for loop: got ${w0.type}`);let H5=[],N5=[];for(let S5=0;S5Z6.setVariable(t.loopvar.value,Y5);else{if(t.loopvar.type!=="TupleLiteral")throw Error(`Invalid loop variable(s): ${t.loopvar.type}`);{let Z6=t.loopvar;if(Y5.type!=="ArrayValue")throw Error(`Cannot unpack non-iterable type: ${Y5.type}`);let c6=Y5;if(Z6.value.length!==c6.value.length)throw Error(`Too ${Z6.value.length>c6.value.length?"few":"many"} items to unpack`);w6=(Y9)=>{for(let y9=0;y90?H5[S5-1]:new R5],["nextitem",S5{let w0=new U5(I0),H5;O0=O0.slice(),O0.at(-1)?.type==="KeywordArgumentsValue"&&(H5=O0.pop());for(let N5=0;N5this.evaluate(O0,y0)));case"TupleLiteral":return new J5(t.value.map((O0)=>this.evaluate(O0,y0)));case"ObjectLiteral":{let O0=new Map;for(let[I0,w0]of t.value){let H5=this.evaluate(I0,y0);if(!(H5 instanceof P0))throw Error(`Object keys must be strings: got ${H5.type}`);O0.set(H5.value,this.evaluate(w0,y0))}return new a0(O0)}case"Identifier":return this.evaluateIdentifier(t,y0);case"CallExpression":return this.evaluateCallExpression(t,y0);case"MemberExpression":return this.evaluateMemberExpression(t,y0);case"UnaryExpression":return this.evaluateUnaryExpression(t,y0);case"BinaryExpression":return this.evaluateBinaryExpression(t,y0);case"FilterExpression":return this.evaluateFilterExpression(t,y0);case"TestExpression":return this.evaluateTestExpression(t,y0);default:throw SyntaxError(`Unknown node type: ${t.type}`)}}};function s0(t){switch(typeof t){case"number":return new N0(t);case"string":return new P0(t);case"boolean":return new Q0(t);case"undefined":return new R5;case"object":return t===null?new y5:Array.isArray(t)?new g0(t.map(s0)):new a0(new Map(Object.entries(t).map(([y0,O0])=>[y0,s0(O0)])));case"function":return new t0((y0,O0)=>s0(t(...y0.map((I0)=>I0.value))??null));default:throw Error(`Cannot convert to runtime value: ${t}`)}}function D5(t,y0,O0){let I0=O0??0;switch(t.type){case"NullValue":case"UndefinedValue":return"null";case"NumericValue":case"StringValue":case"BooleanValue":return JSON.stringify(t.value);case"ArrayValue":case"ObjectValue":{let w0=y0?" ".repeat(y0):"",H5=` +`+w0.repeat(I0),N5=H5+w0;if(t.type==="ArrayValue"){let g5=t.value.map((Q5)=>D5(Q5,y0,I0+1));return y0?`[${N5}${g5.join(`,${N5}`)}${H5}]`:`[${g5.join(", ")}]`}{let g5=Array.from(t.value.entries()).map(([Q5,S5])=>{let K6=`"${Q5}": ${D5(S5,y0,I0+1)}`;return y0?`${N5}${K6}`:K6});return y0?`{${g5.join(",")}${H5}}`:`{${g5.join(", ")}}`}}default:throw Error(`Cannot convert to JSON: ${t.type}`)}}var L5=` +`,d5={MultiplicativeBinaryOperator:2,AdditiveBinaryOperator:1,ComparisonBinaryOperator:0};function T5(...t){return"{%- "+t.join(" ")+" -%}"}function $5(t,y0,O0){return t.map((I0)=>function(w0,H5,N5){let g5=N5.repeat(H5);switch(w0.type){case"Program":return $5(w0.body,H5,N5);case"If":return function(Q5,S5,K6){let Y5=K6.repeat(S5),w6=[],Z6=Q5;for(;Z6&&(w6.push({test:Z6.test,body:Z6.body}),Z6.alternate.length===1&&Z6.alternate[0].type==="If");)Z6=Z6.alternate[0];let c6=Y5+T5("if",V5(w6[0].test))+L5+$5(w6[0].body,S5+1,K6);for(let Y9=1;Y90&&(c6+=L5+Y5+T5("else")+L5+$5(Z6.alternate,S5+1,K6)),c6+=L5+Y5+T5("endif"),c6}(w0,H5,N5);case"For":return function(Q5,S5,K6){let Y5=K6.repeat(S5),w6="";if(Q5.iterable.type==="SelectExpression"){let c6=Q5.iterable;w6=`${V5(c6.iterable)} if ${V5(c6.test)}`}else w6=V5(Q5.iterable);let Z6=Y5+T5("for",V5(Q5.loopvar),"in",w6)+L5+$5(Q5.body,S5+1,K6);return Q5.defaultBlock.length>0&&(Z6+=L5+Y5+T5("else")+L5+$5(Q5.defaultBlock,S5+1,K6)),Z6+=L5+Y5+T5("endfor"),Z6}(w0,H5,N5);case"Set":return function(Q5,S5,K6){let Y5=K6.repeat(S5),w6=V5(Q5.assignee),Z6=Q5.value?V5(Q5.value):"",c6=Y5+T5("set",`${w6}${Q5.value?" = "+Z6:""}`);if(Q5.body.length===0)return c6;return c6+L5+$5(Q5.body,S5+1,K6)+L5+Y5+T5("endset")}(w0,H5,N5);case"Macro":return function(Q5,S5,K6){let Y5=K6.repeat(S5),w6=Q5.args.map(V5).join(", ");return Y5+T5("macro",`${Q5.name.value}(${w6})`)+L5+$5(Q5.body,S5+1,K6)+L5+Y5+T5("endmacro")}(w0,H5,N5);case"Break":return g5+T5("break");case"Continue":return g5+T5("continue");default:return g5+"{{- "+V5(w0)+" -}}"}}(I0,y0,O0)).join(L5)}function V5(t,y0=-1){switch(t.type){case"Identifier":return t.value;case"NullLiteral":return"none";case"NumericLiteral":case"BooleanLiteral":return`${t.value}`;case"StringLiteral":return JSON.stringify(t.value);case"BinaryExpression":{let O0=t,I0=d5[O0.operator.type]??0,w0=V5(O0.left,I0),H5=V5(O0.right,I0+1),N5=`${w0} ${O0.operator.value} ${H5}`;return I0V5(w0,-1)).join(", ");return`${V5(O0.callee,-1)}(${I0})`}case"MemberExpression":{let O0=t,I0=V5(O0.object,-1);O0.object.type!=="Identifier"&&(I0=`(${I0})`);let w0=V5(O0.property,-1);return O0.computed||O0.property.type==="Identifier"||(w0=`(${w0})`),O0.computed?`${I0}[${w0}]`:`${I0}.${w0}`}case"FilterExpression":{let O0=t,I0=V5(O0.operand,1/0);return O0.filter.type==="CallExpression"?`${I0} | ${V5(O0.filter,-1)}`:`${I0} | ${O0.filter.value}`}case"SelectExpression":{let O0=t;return`${V5(O0.iterable,-1)} | select(${V5(O0.test,-1)})`}case"TestExpression":{let O0=t;return`${V5(O0.operand,-1)} is${O0.negate?" not":""} ${O0.test.value}`}case"ArrayLiteral":case"TupleLiteral":{let O0=t.value.map((w0)=>V5(w0,-1)),I0=t.type==="ArrayLiteral"?"[]":"()";return`${I0[0]}${O0.join(", ")}${I0[1]}`}case"ObjectLiteral":return`{ ${Array.from(t.value.entries()).map(([I0,w0])=>`${V5(I0,-1)}: ${V5(w0,-1)}`).join(", ")} }`;case"SliceExpression":{let O0=t;return`${O0.start?V5(O0.start,-1):""}:${O0.stop?V5(O0.stop,-1):""}${O0.step?`:${V5(O0.step,-1)}`:""}`}case"KeywordArgumentExpression":{let O0=t;return`${O0.key.value}=${V5(O0.value,-1)}`}case"If":{let O0=t,I0=V5(O0.test,-1);return`${V5(O0.body[0],0)} if ${I0} else ${V5(O0.alternate[0],-1)}`}default:throw Error(`Unknown expression type: ${t.type}`)}}var U6=class{parsed;constructor(t){let y0=H(t,{lstrip_blocks:!0,trim_blocks:!0});this.parsed=q0(y0)}render(t){let y0=new U5;if(y0.set("false",!1),y0.set("true",!0),y0.set("raise_exception",(O0)=>{throw Error(O0)}),y0.set("range",p0),t)for(let[O0,I0]of Object.entries(t))y0.set(O0,I0);return new T0(y0).run(this.parsed).value}format(t){return function(y0,O0="\t"){let I0=typeof O0=="number"?" ".repeat(O0):O0;return $5(y0.body,0,I0).replace(/\n$/,"")}(this.parsed,t?.indent||"\t")}}},"./src/backends/onnx.js":($,j,O)=>{/*!******************************!*\ + !*** ./src/backends/onnx.js ***! + \******************************/var G;O.r(j),O.d(j,{Tensor:()=>J.Tensor,createInferenceSession:()=>I,deviceToExecutionProviders:()=>X,isONNXProxy:()=>w,isONNXTensor:()=>k});var Z=O("./src/env.js"),V=O("?2ce3"),N=O("onnxruntime-web"),J=O("onnxruntime-common");/*! ../env.js *//*! onnxruntime-node *//*! onnxruntime-web *//*! onnxruntime-common */let R=Object.freeze({auto:null,gpu:null,cpu:"cpu",wasm:"wasm",webgpu:"webgpu",cuda:"cuda",dml:"dml",webnn:{name:"webnn",deviceType:"cpu"},"webnn-npu":{name:"webnn",deviceType:"npu"},"webnn-gpu":{name:"webnn",deviceType:"gpu"},"webnn-cpu":{name:"webnn",deviceType:"cpu"}}),U=[],H,L,Y=Symbol.for("onnxruntime");if(Y in globalThis)L=globalThis[Y];else if(Z.apis.IS_NODE_ENV){switch(L=V??(G||(G=O.t(V,2))),process.platform){case"win32":U.push("dml");break;case"linux":process.arch==="x64"&&U.push("cuda")}U.push("cpu"),H=["cpu"]}else L=N,Z.apis.IS_WEBNN_AVAILABLE&&U.push("webnn-npu","webnn-gpu","webnn-cpu","webnn"),Z.apis.IS_WEBGPU_AVAILABLE&&U.push("webgpu"),U.push("wasm"),H=["wasm"];let S=L.InferenceSession;function X(T=null){if(!T)return H;switch(T){case"auto":return U;case"gpu":return U.filter((W)=>["webgpu","cuda","dml","webnn-gpu"].includes(W))}if(U.includes(T))return[R[T]??T];throw Error(`Unsupported device: "${T}". Should be one of: ${U.join(", ")}.`)}let D=null;async function I(T,W,E){D&&await D;let Q=S.create(T,W);D??=Q;let A=await Q;return A.config=E,A}function k(T){return T instanceof L.Tensor}let z=L?.env;function w(){return z?.wasm?.proxy}z?.wasm&&(typeof ServiceWorkerGlobalScope<"u"&&self instanceof ServiceWorkerGlobalScope||z.wasm.wasmPaths||(z.wasm.wasmPaths=`https://cdn.jsdelivr.net/npm/@huggingface/transformers@${Z.env.version}/dist/`),z.wasm.proxy=!1),z?.webgpu&&(z.webgpu.powerPreference="high-performance"),Z.env.backends.onnx=z},"./src/base/feature_extraction_utils.js":($,j,O)=>{/*!**********************************************!*\ + !*** ./src/base/feature_extraction_utils.js ***! + \**********************************************/O.r(j),O.d(j,{FeatureExtractor:()=>N,validate_audio_inputs:()=>J});var G=O("./src/utils/constants.js"),Z=O("./src/utils/generic.js"),V=O("./src/utils/hub.js");/*! ../utils/constants.js *//*! ../utils/generic.js *//*! ../utils/hub.js */class N extends Z.Callable{constructor(R){super(),this.config=R}static async from_pretrained(R,U){return new this(await(0,V.getModelJSON)(R,G.FEATURE_EXTRACTOR_NAME,!0,U))}}function J(R,U){if(!(R instanceof Float32Array||R instanceof Float64Array))throw Error(`${U} expects input to be a Float32Array or a Float64Array, but got ${R?.constructor?.name??typeof R} instead. If using the feature extractor directly, remember to use \`read_audio(url, sampling_rate)\` to obtain the raw audio data of the file/url.`)}},"./src/base/image_processors_utils.js":($,j,O)=>{/*!********************************************!*\ + !*** ./src/base/image_processors_utils.js ***! + \********************************************/O.r(j),O.d(j,{ImageProcessor:()=>w,center_to_corners_format:()=>L,post_process_instance_segmentation:()=>z,post_process_object_detection:()=>Y,post_process_panoptic_segmentation:()=>k,post_process_semantic_segmentation:()=>S});var G=O("./src/utils/generic.js"),Z=O("./src/utils/tensor.js"),V=O("./src/utils/maths.js");/*! ../utils/generic.js *//*! ../utils/tensor.js *//*! ../utils/maths.js */O("./src/utils/image.js");/*! ../utils/image.js */var N=O("./src/utils/core.js"),J=O("./src/utils/hub.js"),R=O("./src/utils/constants.js");/*! ../utils/core.js *//*! ../utils/hub.js *//*! ../utils/constants.js */function U(T,W,E=0,Q=null){let A=T/W,l=(0,V.bankers_round)(A)*W;return Q!==null&&l>Q&&(l=Math.floor(A)*W),lW&&q0.push(p0)}else{let p0=(0,V.max)(R0.data)[1];if(p0===V0-1)continue;if(n=(0,V.softmax)(R0.data),n[p0]M0*i[(q5+1)%2])),G0.boxes.push(Z0),G0.classes.push(p0),G0.scores.push(n[p0])}}v0.push(G0)}return v0}function S(T,W=null){let E=T.logits,Q=E.dims[0];if(W!==null&&W.length!==Q)throw Error("Make sure that you pass in as many target sizes as the batch dimension of the logits");let A=[];for(let l=0;li[R0]&&(i[R0]=n[R0],G0[R0]=s)}let S0=Array(e.dims[0]);for(let s=0;ss!==void 0);A.push({segmentation:$0,labels:F0})}return A}function X(T,W,E,Q){let A=[],l=[],r=[];for(let e=0;eE&&(A.push(v0),l.push(i),r.push($0))}return[A,l,r]}function D(T,W,E,Q=0.5,A=0.8){let l=[],r=0,e=0,V0=W[E].data;for(let $0=0;$0=Q&&++e;let v0=r>0&&e>0;if(v0)v0=r/e>A;return[v0,l]}function I(T,W,E,Q,A,l=null,r=null){let[e,V0]=r??T[0].dims,v0=new Z.Tensor("int32",new Int32Array(e*V0),[e,V0]),$0=[];if(r!==null)for(let s=0;sG0[q0]&&(i[q0]=s,G0[q0]=R0[q0])}let S0=0,F0=v0.data;for(let s=0;sA?V0=Math.floor(A*e/Q):A>Q&&(e=Math.floor(Q*V0/A)),await T.resize(V0,e,{resample:E}))}async crop_margin(T,W=200){let E=T.clone().grayscale(),Q=(0,V.min)(E.data)[0],A=(0,V.max)(E.data)[0]-Q;if(A===0)return T;let l=W/255,r=E.width,e=E.height,V0=0,v0=0,$0=E.data;for(let i=0;i200)throw Error("absolute aspect ratio must be smaller than 200, got "+Math.max(r,e)/Math.min(r,e));let i=Math.round(r/V0)*V0,G0=Math.round(e/V0)*V0;if(i*G0>$0){let S0=Math.sqrt(r*e/$0);i=Math.floor(r/S0/V0)*V0,G0=Math.floor(e/S0/V0)*V0}else if(i*G0this.preprocess(Q)));return{pixel_values:(0,Z.stack)(E.map((Q)=>Q.pixel_values),0),original_sizes:E.map((Q)=>Q.original_size),reshaped_input_sizes:E.map((Q)=>Q.reshaped_input_size)}}static async from_pretrained(T,W){return new this(await(0,J.getModelJSON)(T,R.IMAGE_PROCESSOR_NAME,!0,W))}}},"./src/base/processing_utils.js":($,j,O)=>{/*!**************************************!*\ + !*** ./src/base/processing_utils.js ***! + \**************************************/O.r(j),O.d(j,{Processor:()=>N});var G=O("./src/utils/constants.js"),Z=O("./src/utils/generic.js"),V=O("./src/utils/hub.js");/*! ../utils/constants.js *//*! ../utils/generic.js *//*! ../utils/hub.js */class N extends Z.Callable{static classes=["image_processor_class","tokenizer_class","feature_extractor_class"];static uses_processor_config=!1;constructor(J,R){super(),this.config=J,this.components=R}get image_processor(){return this.components.image_processor}get tokenizer(){return this.components.tokenizer}get feature_extractor(){return this.components.feature_extractor}apply_chat_template(J,R={}){if(!this.tokenizer)throw Error("Unable to apply chat template without a tokenizer.");return this.tokenizer.apply_chat_template(J,{tokenize:!1,...R})}batch_decode(...J){if(!this.tokenizer)throw Error("Unable to decode without a tokenizer.");return this.tokenizer.batch_decode(...J)}decode(...J){if(!this.tokenizer)throw Error("Unable to decode without a tokenizer.");return this.tokenizer.decode(...J)}async _call(J,...R){for(let U of[this.image_processor,this.feature_extractor,this.tokenizer])if(U)return U(J,...R);throw Error("No image processor, feature extractor, or tokenizer found.")}static async from_pretrained(J,R){let[U,H]=await Promise.all([this.uses_processor_config?(0,V.getModelJSON)(J,G.PROCESSOR_NAME,!0,R):{},Promise.all(this.classes.filter((L)=>(L in this)).map(async(L)=>{let Y=await this[L].from_pretrained(J,R);return[L.replace(/_class$/,""),Y]})).then(Object.fromEntries)]);return new this(U,H)}}},"./src/configs.js":($,j,O)=>{/*!************************!*\ + !*** ./src/configs.js ***! + \************************/O.r(j),O.d(j,{AutoConfig:()=>R,PretrainedConfig:()=>J,getKeyValueShapes:()=>N});var G=O("./src/utils/core.js"),Z=O("./src/utils/hub.js");/*! ./utils/core.js *//*! ./utils/hub.js */function V(U){let H={},L={};switch(U.model_type){case"llava":case"paligemma":case"gemma3":case"florence2":case"llava_onevision":case"idefics3":case"ultravox":case"smolvlm":L=V(U.text_config);break;case"moondream1":L=V(U.phi_config);break;case"musicgen":L=V(U.decoder);break;case"multi_modality":L=V(U.language_config);break;case"gpt2":case"gptj":case"jais":case"codegen":case"gpt_bigcode":H.num_heads="n_head",H.num_layers="n_layer",H.hidden_size="n_embd";break;case"gpt_neox":case"stablelm":case"opt":case"falcon":H.num_heads="num_attention_heads",H.num_layers="num_hidden_layers",H.hidden_size="hidden_size";break;case"llama":case"olmo":case"olmo2":case"mobilellm":case"granite":case"cohere":case"mistral":case"starcoder2":case"qwen2":case"qwen2_vl":case"phi":case"phi3":case"phi3_v":H.num_heads="num_key_value_heads",H.num_layers="num_hidden_layers",H.hidden_size="hidden_size",H.num_attention_heads="num_attention_heads";break;case"qwen3":case"gemma":case"gemma2":case"gemma3_text":case"glm":case"helium":H.num_heads="num_key_value_heads",H.num_layers="num_hidden_layers",H.dim_kv="head_dim";break;case"openelm":H.num_heads="num_kv_heads",H.num_layers="num_transformer_layers",H.dim_kv="head_dim";break;case"gpt_neo":case"donut-swin":H.num_heads="num_heads",H.num_layers="num_layers",H.hidden_size="hidden_size";break;case"bloom":H.num_heads="n_head",H.num_layers="n_layer",H.hidden_size="hidden_size";break;case"mpt":H.num_heads="n_heads",H.num_layers="n_layers",H.hidden_size="d_model";break;case"exaone":H.num_heads="num_key_value_heads",H.num_layers="num_layers",H.dim_kv="head_dim",H.num_attention_heads="num_attention_heads";break;case"t5":case"mt5":case"longt5":H.num_decoder_layers="num_decoder_layers",H.num_decoder_heads="num_heads",H.decoder_dim_kv="d_kv",H.num_encoder_layers="num_layers",H.num_encoder_heads="num_heads",H.encoder_dim_kv="d_kv";break;case"bart":case"mbart":case"marian":case"whisper":case"lite-whisper":case"m2m_100":case"blenderbot":case"blenderbot-small":case"florence2_language":H.num_decoder_layers="decoder_layers",H.num_decoder_heads="decoder_attention_heads",H.decoder_hidden_size="d_model",H.num_encoder_layers="encoder_layers",H.num_encoder_heads="encoder_attention_heads",H.encoder_hidden_size="d_model";break;case"speecht5":H.num_decoder_layers="decoder_layers",H.num_decoder_heads="decoder_attention_heads",H.decoder_hidden_size="hidden_size",H.num_encoder_layers="encoder_layers",H.num_encoder_heads="encoder_attention_heads",H.encoder_hidden_size="hidden_size";break;case"trocr":H.num_encoder_layers=H.num_decoder_layers="decoder_layers",H.num_encoder_heads=H.num_decoder_heads="decoder_attention_heads",H.encoder_hidden_size=H.decoder_hidden_size="d_model";break;case"musicgen_decoder":H.num_encoder_layers=H.num_decoder_layers="num_hidden_layers",H.num_encoder_heads=H.num_decoder_heads="num_attention_heads",H.encoder_hidden_size=H.decoder_hidden_size="hidden_size";break;case"moonshine":H.num_decoder_layers="decoder_num_hidden_layers",H.num_decoder_heads="decoder_num_key_value_heads",H.num_encoder_layers="encoder_num_hidden_layers",H.num_encoder_heads="encoder_num_key_value_heads",H.encoder_hidden_size=H.decoder_hidden_size="hidden_size";break;case"vision-encoder-decoder":let S=V(U.decoder),X="num_decoder_layers"in S,D=(0,G.pick)(U,["model_type","is_encoder_decoder"]);return X?(D.num_decoder_layers=S.num_decoder_layers,D.num_decoder_heads=S.num_decoder_heads,D.decoder_hidden_size=S.decoder_hidden_size,D.num_encoder_layers=S.num_encoder_layers,D.num_encoder_heads=S.num_encoder_heads,D.encoder_hidden_size=S.encoder_hidden_size):(D.num_layers=S.num_layers,D.num_heads=S.num_heads,D.hidden_size=S.hidden_size),D}let Y={...L,...(0,G.pick)(U,["model_type","multi_query","is_encoder_decoder"])};for(let S in H)Y[S]=U[H[S]];return Y}function N(U,{prefix:H="past_key_values",batch_size:L=1}={}){let Y={},S=U.normalized_config;if(S.is_encoder_decoder&&"num_encoder_heads"in S&&"num_decoder_heads"in S){let X=S.encoder_dim_kv??S.encoder_hidden_size/S.num_encoder_heads,D=S.decoder_dim_kv??S.decoder_hidden_size/S.num_decoder_heads,I=[L,S.num_encoder_heads,0,X],k=[L,S.num_decoder_heads,0,D];for(let z=0;z{/*!********************!*\ + !*** ./src/env.js ***! + \********************/O.r(j),O.d(j,{apis:()=>D,env:()=>T});var G=O("?569f"),Z=O("?3f59"),V=O("?154a");/*! fs *//*! path *//*! url */let N=typeof window<"u"&&window.document!==void 0,J=typeof self<"u"&&self.constructor?.name==="DedicatedWorkerGlobalScope",R=typeof self<"u"&&"caches"in self,U=typeof navigator<"u"&&"gpu"in navigator,H=typeof navigator<"u"&&"ml"in navigator,L=typeof process<"u",Y=L&&process?.release?.name==="node",S=!W(G),X=!W(Z),D=Object.freeze({IS_BROWSER_ENV:N,IS_WEBWORKER_ENV:J,IS_WEB_CACHE_AVAILABLE:R,IS_WEBGPU_AVAILABLE:U,IS_WEBNN_AVAILABLE:H,IS_PROCESS_AVAILABLE:L,IS_NODE_ENV:Y,IS_FS_AVAILABLE:S,IS_PATH_AVAILABLE:X}),I=S&&X,k="./";if(I){let E=Object(import.meta).url;E?k=Z.dirname(Z.dirname(V.fileURLToPath(E))):typeof __dirname<"u"&&(k=Z.dirname(__dirname))}let z=I?Z.join(k,"/.cache/"):null,w="/models/",T={version:"3.5.2",backends:{onnx:{}},allowRemoteModels:!0,remoteHost:"https://huggingface.co/",remotePathTemplate:"{model}/resolve/{revision}/",allowLocalModels:!(N||J),localModelPath:I?Z.join(k,w):w,useFS:S,useBrowserCache:R,useFSCache:S,cacheDir:z,useCustomCache:!1,customCache:null};function W(E){return Object.keys(E).length===0}},"./src/generation/configuration_utils.js":($,j,O)=>{/*!***********************************************!*\ + !*** ./src/generation/configuration_utils.js ***! + \***********************************************/O.r(j),O.d(j,{GenerationConfig:()=>Z});var G=O("./src/utils/core.js");/*! ../utils/core.js */class Z{max_length=20;max_new_tokens=null;min_length=0;min_new_tokens=null;early_stopping=!1;max_time=null;do_sample=!1;num_beams=1;num_beam_groups=1;penalty_alpha=null;use_cache=!0;temperature=1;top_k=50;top_p=1;typical_p=1;epsilon_cutoff=0;eta_cutoff=0;diversity_penalty=0;repetition_penalty=1;encoder_repetition_penalty=1;length_penalty=1;no_repeat_ngram_size=0;bad_words_ids=null;force_words_ids=null;renormalize_logits=!1;constraints=null;forced_bos_token_id=null;forced_eos_token_id=null;remove_invalid_values=!1;exponential_decay_length_penalty=null;suppress_tokens=null;streamer=null;begin_suppress_tokens=null;forced_decoder_ids=null;guidance_scale=null;num_return_sequences=1;output_attentions=!1;output_hidden_states=!1;output_scores=!1;return_dict_in_generate=!1;pad_token_id=null;bos_token_id=null;eos_token_id=null;encoder_no_repeat_ngram_size=0;decoder_start_token_id=null;generation_kwargs={};constructor(V){Object.assign(this,(0,G.pick)(V,Object.getOwnPropertyNames(this)))}}},"./src/generation/logits_process.js":($,j,O)=>{/*!******************************************!*\ + !*** ./src/generation/logits_process.js ***! + \******************************************/O.r(j),O.d(j,{ClassifierFreeGuidanceLogitsProcessor:()=>k,ForcedBOSTokenLogitsProcessor:()=>R,ForcedEOSTokenLogitsProcessor:()=>U,LogitsProcessor:()=>V,LogitsProcessorList:()=>J,LogitsWarper:()=>N,MinLengthLogitsProcessor:()=>X,MinNewTokensLengthLogitsProcessor:()=>D,NoBadWordsLogitsProcessor:()=>I,NoRepeatNGramLogitsProcessor:()=>Y,RepetitionPenaltyLogitsProcessor:()=>S,SuppressTokensAtBeginLogitsProcessor:()=>H,TemperatureLogitsWarper:()=>z,TopKLogitsWarper:()=>T,TopPLogitsWarper:()=>w,WhisperTimeStampLogitsProcessor:()=>L});var G=O("./src/utils/generic.js");/*! ../utils/generic.js */O("./src/utils/tensor.js");/*! ../utils/tensor.js */var Z=O("./src/utils/maths.js");/*! ../utils/maths.js */class V extends G.Callable{_call(W,E){throw Error("`_call` should be implemented in a subclass")}}class N extends G.Callable{_call(W,E){throw Error("`_call` should be implemented in a subclass")}}class J extends G.Callable{constructor(){super(),this.processors=[]}push(W){this.processors.push(W)}extend(W){this.processors.push(...W)}_call(W,E){let Q=E;for(let A of this.processors)Q=A(W,Q);return Q}[Symbol.iterator](){return this.processors.values()}}class R extends V{constructor(W){super(),this.bos_token_id=W}_call(W,E){for(let Q=0;Q=1&&l[l.length-1]>=this.timestamp_begin,e=l.length<2||l[l.length-2]>=this.timestamp_begin;if(r&&(e?A.subarray(this.timestamp_begin).fill(-1/0):A.subarray(0,this.eos_token_id).fill(-1/0)),W[Q].length===this.begin_index&&this.max_initial_timestamp_index!==null){let v0=this.timestamp_begin+this.max_initial_timestamp_index;A.subarray(v0+1).fill(-1/0)}let V0=(0,Z.log_softmax)(A);Math.log(V0.subarray(this.timestamp_begin).map(Math.exp).reduce((v0,$0)=>v0+$0))>(0,Z.max)(V0.subarray(0,this.timestamp_begin))[0]&&A.subarray(0,this.timestamp_begin).fill(-1/0)}return E}}class Y extends V{constructor(W){super(),this.no_repeat_ngram_size=W}getNgrams(W){let E=W.length,Q=[];for(let l=0;l1 to use the classifier free guidance processor, got guidance scale ${W}.`);this.guidance_scale=W}_call(W,E){if(E.dims[0]!==2*W.length)throw Error(`Logits should have twice the batch size of the input ids, the first half of batches corresponding to the conditional inputs, and the second half of batches corresponding to the unconditional inputs. Got batch size ${E.dims[0]} for the logits and ${W.length} for the input ids.`);let Q=W.length,A=E.slice([0,Q],null),l=E.slice([Q,E.dims[0]],null);for(let r=0;r1)throw Error(`\`top_p\` must be a float > 0 and < 1, but is ${W}`);if(!Number.isInteger(Q)||Q<1)throw Error(`\`min_tokens_to_keep\` must be a positive integer, but is ${Q}`);this.top_p=W,this.filter_value=E,this.min_tokens_to_keep=Q}}class T extends N{constructor(W,{filter_value:E=-1/0,min_tokens_to_keep:Q=1}={}){if(super(),!Number.isInteger(W)||W<0)throw Error(`\`top_k\` must be a positive integer, but is ${W}`);this.top_k=Math.max(W,Q),this.filter_value=E}}},"./src/generation/logits_sampler.js":($,j,O)=>{/*!******************************************!*\ + !*** ./src/generation/logits_sampler.js ***! + \******************************************/O.r(j),O.d(j,{LogitsSampler:()=>N});var G=O("./src/utils/generic.js"),Z=O("./src/utils/tensor.js"),V=O("./src/utils/maths.js");/*! ../utils/generic.js *//*! ../utils/tensor.js *//*! ../utils/maths.js */O("./src/generation/configuration_utils.js");/*! ../generation/configuration_utils.js */class N extends G.Callable{constructor(H){super(),this.generation_config=H}async _call(H){return this.sample(H)}async sample(H){throw Error("sample should be implemented in subclasses.")}getLogits(H,L){let Y=H.dims.at(-1),S=H.data;if(L===-1)S=S.slice(-Y);else{let X=L*Y;S=S.slice(X,X+Y)}return S}randomSelect(H){let L=0;for(let S=0;S1)return new U(H);if(H.num_return_sequences>1)throw Error(`num_return_sequences has to be 1 when doing greedy search, but is ${H.num_return_sequences}.`);return new J(H)}}class J extends N{async sample(H){let L=(0,V.max)(H.data)[1];return[[BigInt(L),0]]}}class R extends N{async sample(H){let L=H.dims.at(-1);this.generation_config.top_k>0&&(L=Math.min(this.generation_config.top_k,L));let[Y,S]=await(0,Z.topk)(H,L),X=(0,V.softmax)(Y.data);return Array.from({length:this.generation_config.num_beams},()=>{let D=this.randomSelect(X);return[S.data[D],Math.log(X[D])]})}}class U extends N{async sample(H){let L=H.dims.at(-1);this.generation_config.top_k>0&&(L=Math.min(this.generation_config.top_k,L));let[Y,S]=await(0,Z.topk)(H,L),X=(0,V.softmax)(Y.data);return Array.from({length:this.generation_config.num_beams},(D,I)=>[S.data[I],Math.log(X[I])])}}},"./src/generation/stopping_criteria.js":($,j,O)=>{/*!*********************************************!*\ + !*** ./src/generation/stopping_criteria.js ***! + \*********************************************/O.r(j),O.d(j,{EosTokenCriteria:()=>J,InterruptableStoppingCriteria:()=>R,MaxLengthCriteria:()=>N,StoppingCriteria:()=>Z,StoppingCriteriaList:()=>V});var G=O("./src/utils/generic.js");/*! ../utils/generic.js */class Z extends G.Callable{_call(U,H){throw Error("StoppingCriteria needs to be subclassed")}}class V extends G.Callable{constructor(){super(),this.criteria=[]}push(U){this.criteria.push(U)}extend(U){U instanceof V?U=U.criteria:U instanceof Z&&(U=[U]),this.criteria.push(...U)}_call(U,H){let L=Array(U.length).fill(!1);for(let Y of this.criteria){let S=Y(U,H);for(let X=0;XH.length>=this.max_length)}}class J extends Z{constructor(U){super(),Array.isArray(U)||(U=[U]),this.eos_token_id=U}_call(U,H){return U.map((L)=>{let Y=L.at(-1);return this.eos_token_id.some((S)=>Y==S)})}}class R extends Z{constructor(){super(),this.interrupted=!1}interrupt(){this.interrupted=!0}reset(){this.interrupted=!1}_call(U,H){return Array(U.length).fill(this.interrupted)}}},"./src/generation/streamers.js":($,j,O)=>{/*!*************************************!*\ + !*** ./src/generation/streamers.js ***! + \*************************************/O.r(j),O.d(j,{BaseStreamer:()=>N,TextStreamer:()=>R,WhisperTextStreamer:()=>U});var G=O("./src/utils/core.js"),Z=O("./src/tokenizers.js"),V=O("./src/env.js");/*! ../utils/core.js *//*! ../tokenizers.js *//*! ../env.js */class N{put(H){throw Error("Not implemented")}end(){throw Error("Not implemented")}}let J=V.apis.IS_PROCESS_AVAILABLE?(H)=>process.stdout.write(H):(H)=>console.log(H);class R extends N{constructor(H,{skip_prompt:L=!1,callback_function:Y=null,token_callback_function:S=null,skip_special_tokens:X=!0,decode_kwargs:D={},...I}={}){super(),this.tokenizer=H,this.skip_prompt=L,this.callback_function=Y??J,this.token_callback_function=S,this.decode_kwargs={skip_special_tokens:X,...D,...I},this.token_cache=[],this.print_len=0,this.next_tokens_are_prompt=!0}put(H){if(H.length>1)throw Error("TextStreamer only supports batch size of 1");let L=this.next_tokens_are_prompt;if(L&&(this.next_tokens_are_prompt=!1,this.skip_prompt))return;let Y=H[0];this.token_callback_function?.(Y),this.token_cache=(0,G.mergeArrays)(this.token_cache,Y);let S=this.tokenizer.decode(this.token_cache,this.decode_kwargs),X;L||S.endsWith(` +`)?(X=S.slice(this.print_len),this.token_cache=[],this.print_len=0):S.length>0&&(0,Z.is_chinese_char)(S.charCodeAt(S.length-1))?(X=S.slice(this.print_len),this.print_len+=X.length):(X=S.slice(this.print_len,S.lastIndexOf(" ")+1),this.print_len+=X.length),this.on_finalized_text(X,!1)}end(){let H;if(this.token_cache.length>0)H=this.tokenizer.decode(this.token_cache,this.decode_kwargs).slice(this.print_len),this.token_cache=[],this.print_len=0;else H="";this.next_tokens_are_prompt=!0,this.on_finalized_text(H,!0)}on_finalized_text(H,L){H.length>0&&this.callback_function?.(H),L&&this.callback_function===J&&V.apis.IS_PROCESS_AVAILABLE&&this.callback_function?.(` +`)}}class U extends R{constructor(H,{skip_prompt:L=!1,callback_function:Y=null,token_callback_function:S=null,on_chunk_start:X=null,on_chunk_end:D=null,on_finalize:I=null,time_precision:k=0.02,skip_special_tokens:z=!0,decode_kwargs:w={}}={}){super(H,{skip_prompt:L,skip_special_tokens:z,callback_function:Y,token_callback_function:S,decode_kwargs:w}),this.timestamp_begin=H.timestamp_begin,this.on_chunk_start=X,this.on_chunk_end=D,this.on_finalize=I,this.time_precision=k,this.waiting_for_timestamp=!1}put(H){if(H.length>1)throw Error("WhisperTextStreamer only supports batch size of 1");let L=H[0];if(L.length===1){let Y=Number(L[0])-this.timestamp_begin;if(Y>=0){let S=Y*this.time_precision;return this.waiting_for_timestamp?this.on_chunk_end?.(S):this.on_chunk_start?.(S),this.waiting_for_timestamp=!this.waiting_for_timestamp,void this.token_callback_function?.(L)}}return super.put(H)}end(){super.end(),this.on_finalize?.()}}},"./src/models.js":($,j,O)=>{/*!***********************!*\ + !*** ./src/models.js ***! + \***********************/O.r(j),O.d(j,{ASTForAudioClassification:()=>e2,ASTModel:()=>l3,ASTPreTrainedModel:()=>y2,AlbertForMaskedLM:()=>k9,AlbertForQuestionAnswering:()=>g6,AlbertForSequenceClassification:()=>O9,AlbertModel:()=>_6,AlbertPreTrainedModel:()=>S6,AutoModel:()=>Hq,AutoModelForAudioClassification:()=>GG,AutoModelForAudioFrameClassification:()=>OZ,AutoModelForAudioTextToText:()=>U3,AutoModelForCTC:()=>OG,AutoModelForCausalLM:()=>sG,AutoModelForDepthEstimation:()=>VG,AutoModelForDocumentQuestionAnswering:()=>ZG,AutoModelForImageClassification:()=>nG,AutoModelForImageFeatureExtraction:()=>vG,AutoModelForImageMatting:()=>E8,AutoModelForImageSegmentation:()=>Xq,AutoModelForImageTextToText:()=>RG,AutoModelForImageToImage:()=>qG,AutoModelForMaskGeneration:()=>jZ,AutoModelForMaskedLM:()=>iG,AutoModelForNormalEstimation:()=>NG,AutoModelForObjectDetection:()=>eG,AutoModelForPoseEstimation:()=>JG,AutoModelForQuestionAnswering:()=>aG,AutoModelForSemanticSegmentation:()=>tG,AutoModelForSeq2SeqLM:()=>_q,AutoModelForSequenceClassification:()=>xq,AutoModelForSpeechSeq2Seq:()=>Yq,AutoModelForTextToSpectrogram:()=>Sq,AutoModelForTextToWaveform:()=>Pq,AutoModelForTokenClassification:()=>Lq,AutoModelForUniversalSegmentation:()=>w8,AutoModelForVision2Seq:()=>rG,AutoModelForXVector:()=>R3,AutoModelForZeroShotObjectDetection:()=>$Z,BartForConditionalGeneration:()=>E9,BartForSequenceClassification:()=>R9,BartModel:()=>k6,BartPretrainedModel:()=>C5,BaseModelOutput:()=>D5,BeitForImageClassification:()=>i$,BeitModel:()=>s$,BeitPreTrainedModel:()=>p7,BertForMaskedLM:()=>T5,BertForQuestionAnswering:()=>U6,BertForSequenceClassification:()=>$5,BertForTokenClassification:()=>V5,BertModel:()=>d5,BertPreTrainedModel:()=>L5,BlenderbotForConditionalGeneration:()=>X1,BlenderbotModel:()=>s2,BlenderbotPreTrainedModel:()=>V2,BlenderbotSmallForConditionalGeneration:()=>T2,BlenderbotSmallModel:()=>a2,BlenderbotSmallPreTrainedModel:()=>i2,BloomForCausalLM:()=>K$,BloomModel:()=>M$,BloomPreTrainedModel:()=>D7,CLIPModel:()=>e9,CLIPPreTrainedModel:()=>F1,CLIPSegForImageSegmentation:()=>e1,CLIPSegModel:()=>t1,CLIPSegPreTrainedModel:()=>b2,CLIPTextModel:()=>O3,CLIPTextModelWithProjection:()=>r1,CLIPVisionModel:()=>I2,CLIPVisionModelWithProjection:()=>D2,CamembertForMaskedLM:()=>x1,CamembertForQuestionAnswering:()=>_1,CamembertForSequenceClassification:()=>o9,CamembertForTokenClassification:()=>L1,CamembertModel:()=>H1,CamembertPreTrainedModel:()=>b9,CausalLMOutput:()=>L2,CausalLMOutputWithPast:()=>$4,ChineseCLIPModel:()=>Z3,ChineseCLIPPreTrainedModel:()=>G3,ClapAudioModelWithProjection:()=>DO,ClapModel:()=>X8,ClapPreTrainedModel:()=>A4,ClapTextModelWithProjection:()=>IO,CodeGenForCausalLM:()=>y,CodeGenModel:()=>_,CodeGenPreTrainedModel:()=>b,CohereForCausalLM:()=>_7,CohereModel:()=>H$,CoherePreTrainedModel:()=>L7,ConvBertForMaskedLM:()=>Y9,ConvBertForQuestionAnswering:()=>a9,ConvBertForSequenceClassification:()=>y9,ConvBertForTokenClassification:()=>V6,ConvBertModel:()=>c6,ConvBertPreTrainedModel:()=>Z6,ConvNextForImageClassification:()=>j8,ConvNextModel:()=>Ej,ConvNextPreTrainedModel:()=>$8,ConvNextV2ForImageClassification:()=>Qj,ConvNextV2Model:()=>v4,ConvNextV2PreTrainedModel:()=>O8,DFineForObjectDetection:()=>o7,DFineModel:()=>Zj,DFinePreTrainedModel:()=>l7,DPTForDepthEstimation:()=>Tj,DPTModel:()=>Xj,DPTPreTrainedModel:()=>n7,DacDecoderModel:()=>M8,DacDecoderOutput:()=>T6,DacEncoderModel:()=>cG,DacEncoderOutput:()=>S9,DacModel:()=>m2,DacPreTrainedModel:()=>W8,DebertaForMaskedLM:()=>p9,DebertaForQuestionAnswering:()=>t6,DebertaForSequenceClassification:()=>J9,DebertaForTokenClassification:()=>Y1,DebertaModel:()=>D9,DebertaPreTrainedModel:()=>z9,DebertaV2ForMaskedLM:()=>G9,DebertaV2ForQuestionAnswering:()=>x9,DebertaV2ForSequenceClassification:()=>S1,DebertaV2ForTokenClassification:()=>A1,DebertaV2Model:()=>r9,DebertaV2PreTrainedModel:()=>f9,DecisionTransformerModel:()=>lO,DecisionTransformerPreTrainedModel:()=>dO,DeiTForImageClassification:()=>vj,DeiTModel:()=>Jj,DeiTPreTrainedModel:()=>Q4,DepthAnythingForDepthEstimation:()=>yj,DepthAnythingPreTrainedModel:()=>Fj,DepthProForDepthEstimation:()=>x2,DepthProPreTrainedModel:()=>G2,DetrForObjectDetection:()=>r$,DetrForSegmentation:()=>f4,DetrModel:()=>a$,DetrObjectDetectionOutput:()=>A7,DetrPreTrainedModel:()=>N4,DetrSegmentationOutput:()=>n$,Dinov2ForImageClassification:()=>Bj,Dinov2Model:()=>Cj,Dinov2PreTrainedModel:()=>G8,Dinov2WithRegistersForImageClassification:()=>hj,Dinov2WithRegistersModel:()=>q8,Dinov2WithRegistersPreTrainedModel:()=>Z8,DistilBertForMaskedLM:()=>p6,DistilBertForQuestionAnswering:()=>m6,DistilBertForSequenceClassification:()=>v9,DistilBertForTokenClassification:()=>L6,DistilBertModel:()=>n9,DistilBertPreTrainedModel:()=>q1,DonutSwinModel:()=>$1,DonutSwinPreTrainedModel:()=>wj,EfficientNetForImageClassification:()=>EO,EfficientNetModel:()=>wO,EfficientNetPreTrainedModel:()=>F8,ElectraForMaskedLM:()=>_5,ElectraForQuestionAnswering:()=>o6,ElectraForSequenceClassification:()=>E5,ElectraForTokenClassification:()=>v5,ElectraModel:()=>z6,ElectraPreTrainedModel:()=>I9,EsmForMaskedLM:()=>g1,EsmForSequenceClassification:()=>u1,EsmForTokenClassification:()=>d1,EsmModel:()=>P1,EsmPreTrainedModel:()=>B0,ExaoneForCausalLM:()=>q9,ExaoneModel:()=>J6,ExaonePreTrainedModel:()=>p5,FalconForCausalLM:()=>kO,FalconModel:()=>zO,FalconPreTrainedModel:()=>P8,FastViTForImageClassification:()=>m$,FastViTModel:()=>C7,FastViTPreTrainedModel:()=>Q7,Florence2ForConditionalGeneration:()=>i3,Florence2PreTrainedModel:()=>s3,GLPNForDepthEstimation:()=>fj,GLPNModel:()=>bj,GLPNPreTrainedModel:()=>e7,GPT2LMHeadModel:()=>v1,GPT2Model:()=>c9,GPT2PreTrainedModel:()=>Q9,GPTBigCodeForCausalLM:()=>B2,GPTBigCodeModel:()=>C2,GPTBigCodePreTrainedModel:()=>H2,GPTJForCausalLM:()=>Q2,GPTJModel:()=>b6,GPTJPreTrainedModel:()=>Q1,GPTNeoForCausalLM:()=>E2,GPTNeoModel:()=>R2,GPTNeoPreTrainedModel:()=>j2,GPTNeoXForCausalLM:()=>E1,GPTNeoXModel:()=>O2,GPTNeoXPreTrainedModel:()=>U2,Gemma2ForCausalLM:()=>L$,Gemma2Model:()=>x$,Gemma2PreTrainedModel:()=>X7,Gemma3ForCausalLM:()=>Y$,Gemma3Model:()=>_$,Gemma3PreTrainedModel:()=>T7,GemmaForCausalLM:()=>P7,GemmaModel:()=>S7,GemmaPreTrainedModel:()=>Y7,GlmForCausalLM:()=>M5,GlmModel:()=>Z5,GlmPreTrainedModel:()=>A0,GraniteForCausalLM:()=>U$,GraniteModel:()=>R$,GranitePreTrainedModel:()=>x7,GroundingDinoForObjectDetection:()=>mj,GroundingDinoPreTrainedModel:()=>cj,GroupViTModel:()=>q4,GroupViTPreTrainedModel:()=>E7,HeliumForCausalLM:()=>f0,HeliumModel:()=>z0,HeliumPreTrainedModel:()=>J0,HieraForImageClassification:()=>Uj,HieraModel:()=>Rj,HieraPreTrainedModel:()=>i7,HubertForCTC:()=>x8,HubertForSequenceClassification:()=>vO,HubertModel:()=>H8,HubertPreTrainedModel:()=>KG,IJepaForImageClassification:()=>E$,IJepaModel:()=>K7,IJepaPreTrainedModel:()=>t3,Idefics3ForConditionalGeneration:()=>k2,Idefics3PreTrainedModel:()=>n3,ImageMattingOutput:()=>H3,JAISLMHeadModel:()=>w2,JAISModel:()=>f2,JAISPreTrainedModel:()=>$2,JinaCLIPModel:()=>n1,JinaCLIPPreTrainedModel:()=>w1,JinaCLIPTextModel:()=>o5,JinaCLIPVisionModel:()=>i5,LiteWhisperForConditionalGeneration:()=>$3,LlamaForCausalLM:()=>g,LlamaModel:()=>B,LlamaPreTrainedModel:()=>f,LlavaForConditionalGeneration:()=>f1,LlavaOnevisionForConditionalGeneration:()=>j3,LlavaPreTrainedModel:()=>J2,LongT5ForConditionalGeneration:()=>Q6,LongT5Model:()=>P6,LongT5PreTrainedModel:()=>J1,M2M100ForConditionalGeneration:()=>ij,M2M100Model:()=>sj,M2M100PreTrainedModel:()=>N8,MBartForCausalLM:()=>h5,MBartForConditionalGeneration:()=>U9,MBartForSequenceClassification:()=>u0,MBartModel:()=>B5,MBartPreTrainedModel:()=>B6,MPNetForMaskedLM:()=>x0,MPNetForQuestionAnswering:()=>h0,MPNetForSequenceClassification:()=>X0,MPNetForTokenClassification:()=>W0,MPNetModel:()=>p,MPNetPreTrainedModel:()=>N1,MT5ForConditionalGeneration:()=>s6,MT5Model:()=>N6,MT5PreTrainedModel:()=>C6,MarianMTModel:()=>oj,MarianModel:()=>lj,MarianPreTrainedModel:()=>h4,MaskFormerForInstanceSegmentation:()=>Kj,MaskFormerModel:()=>Mj,MaskFormerPreTrainedModel:()=>t7,MaskedLMOutput:()=>W9,Metric3DForDepthEstimation:()=>J3,Metric3DPreTrainedModel:()=>N3,Metric3Dv2ForDepthEstimation:()=>Wj,Metric3Dv2PreTrainedModel:()=>Dj,MgpstrForSceneTextRecognition:()=>rO,MgpstrModelOutput:()=>iO,MgpstrPreTrainedModel:()=>aO,MimiDecoderModel:()=>D8,MimiDecoderOutput:()=>eO,MimiEncoderModel:()=>hG,MimiEncoderOutput:()=>X6,MimiModel:()=>BG,MimiPreTrainedModel:()=>B1,MistralForCausalLM:()=>S8,MistralModel:()=>TO,MistralPreTrainedModel:()=>Y8,MobileBertForMaskedLM:()=>M1,MobileBertForQuestionAnswering:()=>l1,MobileBertForSequenceClassification:()=>R1,MobileBertModel:()=>W1,MobileBertPreTrainedModel:()=>V1,MobileLLMForCausalLM:()=>q$,MobileLLMModel:()=>D4,MobileLLMPreTrainedModel:()=>y1,MobileNetV1ForImageClassification:()=>L4,MobileNetV1ForSemanticSegmentation:()=>CO,MobileNetV1Model:()=>QO,MobileNetV1PreTrainedModel:()=>d4,MobileNetV2ForImageClassification:()=>hO,MobileNetV2ForSemanticSegmentation:()=>cO,MobileNetV2Model:()=>BO,MobileNetV2PreTrainedModel:()=>_4,MobileNetV3ForImageClassification:()=>pO,MobileNetV3ForSemanticSegmentation:()=>AO,MobileNetV3Model:()=>mO,MobileNetV3PreTrainedModel:()=>l4,MobileNetV4ForImageClassification:()=>gO,MobileNetV4ForSemanticSegmentation:()=>uO,MobileNetV4Model:()=>k8,MobileNetV4PreTrainedModel:()=>o4,MobileViTForImageClassification:()=>u$,MobileViTModel:()=>g$,MobileViTPreTrainedModel:()=>B7,MobileViTV2ForImageClassification:()=>K4,MobileViTV2Model:()=>d$,MobileViTV2PreTrainedModel:()=>V4,ModelOutput:()=>s0,ModernBertForMaskedLM:()=>O0,ModernBertForSequenceClassification:()=>I0,ModernBertForTokenClassification:()=>w0,ModernBertModel:()=>y0,ModernBertPreTrainedModel:()=>t,Moondream1ForConditionalGeneration:()=>t9,MoonshineForConditionalGeneration:()=>o3,MoonshineModel:()=>Z4,MoonshinePreTrainedModel:()=>z2,MptForCausalLM:()=>q3,MptModel:()=>b$,MptPreTrainedModel:()=>W7,MultiModalityCausalLM:()=>sO,MultiModalityPreTrainedModel:()=>oO,MusicgenForCausalLM:()=>EG,MusicgenForConditionalGeneration:()=>z8,MusicgenModel:()=>wG,MusicgenPreTrainedModel:()=>y8,NomicBertModel:()=>N5,NomicBertPreTrainedModel:()=>H5,OPTForCausalLM:()=>M7,OPTModel:()=>V3,OPTPreTrainedModel:()=>h2,Olmo2ForCausalLM:()=>v$,Olmo2Model:()=>J$,Olmo2PreTrainedModel:()=>H7,OlmoForCausalLM:()=>N$,OlmoModel:()=>V$,OlmoPreTrainedModel:()=>U7,OpenELMForCausalLM:()=>P$,OpenELMModel:()=>S$,OpenELMPreTrainedModel:()=>F7,OwlViTForObjectDetection:()=>l$,OwlViTModel:()=>h7,OwlViTPreTrainedModel:()=>b4,Owlv2ForObjectDetection:()=>o$,Owlv2Model:()=>m7,Owlv2PreTrainedModel:()=>c7,PaliGemmaForConditionalGeneration:()=>r3,PaliGemmaPreTrainedModel:()=>a3,PatchTSMixerForPrediction:()=>CG,PatchTSMixerModel:()=>QG,PatchTSMixerPreTrainedModel:()=>s4,PatchTSTForPrediction:()=>v3,PatchTSTModel:()=>I8,PatchTSTPreTrainedModel:()=>nO,Phi3ForCausalLM:()=>W$,Phi3Model:()=>D$,Phi3PreTrainedModel:()=>I7,Phi3VForCausalLM:()=>T1,Phi3VPreTrainedModel:()=>U1,PhiForCausalLM:()=>I$,PhiModel:()=>k$,PhiPreTrainedModel:()=>k7,PreTrainedModel:()=>T0,PretrainedMixin:()=>u6,PvtForImageClassification:()=>f7,PvtModel:()=>C$,PvtPreTrainedModel:()=>W4,PyAnnoteForAudioFrameClassification:()=>$O,PyAnnoteModel:()=>ej,PyAnnotePreTrainedModel:()=>J8,QuestionAnsweringModelOutput:()=>d9,Qwen2ForCausalLM:()=>C1,Qwen2Model:()=>X$,Qwen2PreTrainedModel:()=>y7,Qwen2VLForConditionalGeneration:()=>z$,Qwen2VLPreTrainedModel:()=>y$,Qwen3ForCausalLM:()=>F$,Qwen3Model:()=>T$,Qwen3PreTrainedModel:()=>z7,RFDetrForObjectDetection:()=>d7,RFDetrModel:()=>E4,RFDetrObjectDetectionOutput:()=>Gj,RFDetrPreTrainedModel:()=>w4,RTDetrForObjectDetection:()=>e$,RTDetrModel:()=>t$,RTDetrObjectDetectionOutput:()=>J4,RTDetrPreTrainedModel:()=>g7,RTDetrV2ForObjectDetection:()=>jj,RTDetrV2Model:()=>$j,RTDetrV2ObjectDetectionOutput:()=>Oj,RTDetrV2PreTrainedModel:()=>u7,ResNetForImageClassification:()=>xj,ResNetModel:()=>Hj,ResNetPreTrainedModel:()=>a7,RoFormerForMaskedLM:()=>S5,RoFormerForQuestionAnswering:()=>w6,RoFormerForSequenceClassification:()=>K6,RoFormerForTokenClassification:()=>Y5,RoFormerModel:()=>Q5,RoFormerPreTrainedModel:()=>g5,RobertaForMaskedLM:()=>r2,RobertaForQuestionAnswering:()=>h3,RobertaForSequenceClassification:()=>n2,RobertaForTokenClassification:()=>A9,RobertaModel:()=>B3,RobertaPreTrainedModel:()=>o1,SamImageSegmentationOutput:()=>dj,SamModel:()=>uj,SamPreTrainedModel:()=>V8,SapiensForDepthEstimation:()=>kj,SapiensForNormalEstimation:()=>Ij,SapiensForSemanticSegmentation:()=>zj,SapiensPreTrainedModel:()=>B4,SegformerForImageClassification:()=>MO,SegformerForSemanticSegmentation:()=>KO,SegformerModel:()=>fG,SegformerPreTrainedModel:()=>g4,Seq2SeqLMOutput:()=>Z2,SequenceClassifierOutput:()=>H6,SiglipModel:()=>W2,SiglipPreTrainedModel:()=>v2,SiglipTextModel:()=>M2,SiglipVisionModel:()=>K2,SmolVLMForConditionalGeneration:()=>a1,SnacDecoderModel:()=>pG,SnacEncoderModel:()=>mG,SnacModel:()=>b8,SnacPreTrainedModel:()=>K8,SpeechT5ForSpeechToText:()=>_O,SpeechT5ForTextToSpeech:()=>YO,SpeechT5HifiGan:()=>SO,SpeechT5Model:()=>bG,SpeechT5PreTrainedModel:()=>m4,SqueezeBertForMaskedLM:()=>W5,SqueezeBertForQuestionAnswering:()=>P5,SqueezeBertForSequenceClassification:()=>b5,SqueezeBertModel:()=>F5,SqueezeBertPreTrainedModel:()=>c0,StableLmForCausalLM:()=>fO,StableLmModel:()=>bO,StableLmPreTrainedModel:()=>u4,Starcoder2ForCausalLM:()=>yO,Starcoder2Model:()=>FO,Starcoder2PreTrainedModel:()=>p4,StyleTextToSpeech2Model:()=>LO,StyleTextToSpeech2PreTrainedModel:()=>xO,Swin2SRForImageSuperResolution:()=>Pj,Swin2SRModel:()=>Sj,Swin2SRPreTrainedModel:()=>r7,SwinForImageClassification:()=>_j,SwinForSemanticSegmentation:()=>Yj,SwinModel:()=>Lj,SwinPreTrainedModel:()=>C4,T5ForConditionalGeneration:()=>s9,T5Model:()=>Z9,T5PreTrainedModel:()=>w9,TableTransformerForObjectDetection:()=>Vj,TableTransformerModel:()=>qj,TableTransformerObjectDetectionOutput:()=>Nj,TableTransformerPreTrainedModel:()=>s7,TokenClassifierOutput:()=>F9,TrOCRForCausalLM:()=>XO,TrOCRPreTrainedModel:()=>PO,UltravoxModel:()=>tO,UltravoxPreTrainedModel:()=>q6,UniSpeechForCTC:()=>ZO,UniSpeechForSequenceClassification:()=>qO,UniSpeechModel:()=>GO,UniSpeechPreTrainedModel:()=>c4,UniSpeechSatForAudioFrameClassification:()=>v8,UniSpeechSatForCTC:()=>NO,UniSpeechSatForSequenceClassification:()=>H4,UniSpeechSatModel:()=>VO,UniSpeechSatPreTrainedModel:()=>U4,ViTForImageClassification:()=>w$,ViTMAEModel:()=>M4,ViTMAEPreTrainedModel:()=>B$,ViTMSNForImageClassification:()=>c$,ViTMSNModel:()=>h$,ViTMSNPreTrainedModel:()=>w7,ViTModel:()=>f$,ViTPreTrainedModel:()=>u9,VisionEncoderDecoderModel:()=>h9,VitMatteForImageMatting:()=>A$,VitMattePreTrainedModel:()=>p$,VitPoseForPoseEstimation:()=>b7,VitPosePreTrainedModel:()=>Q$,VitsModel:()=>T8,VitsModelOutput:()=>UG,VitsPreTrainedModel:()=>WO,Wav2Vec2BertForCTC:()=>U8,Wav2Vec2BertForSequenceClassification:()=>JO,Wav2Vec2BertModel:()=>R8,Wav2Vec2BertPreTrainedModel:()=>x4,Wav2Vec2ForAudioFrameClassification:()=>tj,Wav2Vec2ForCTC:()=>rj,Wav2Vec2ForSequenceClassification:()=>nj,Wav2Vec2Model:()=>aj,Wav2Vec2PreTrainedModel:()=>c2,WavLMForAudioFrameClassification:()=>HO,WavLMForCTC:()=>RO,WavLMForSequenceClassification:()=>UO,WavLMForXVector:()=>_8,WavLMModel:()=>L8,WavLMPreTrainedModel:()=>e3,WeSpeakerResNetModel:()=>OO,WeSpeakerResNetPreTrainedModel:()=>jO,WhisperForConditionalGeneration:()=>b1,WhisperModel:()=>K1,WhisperPreTrainedModel:()=>N2,XLMForQuestionAnswering:()=>g3,XLMForSequenceClassification:()=>p3,XLMForTokenClassification:()=>A3,XLMModel:()=>c3,XLMPreTrainedModel:()=>s1,XLMRobertaForMaskedLM:()=>d3,XLMRobertaForQuestionAnswering:()=>g9,XLMRobertaForSequenceClassification:()=>t2,XLMRobertaForTokenClassification:()=>F2,XLMRobertaModel:()=>u3,XLMRobertaPreTrainedModel:()=>i1,XLMWithLMHeadModel:()=>m3,XVectorOutput:()=>S4,YolosForObjectDetection:()=>Aj,YolosModel:()=>pj,YolosObjectDetectionOutput:()=>gj,YolosPreTrainedModel:()=>R4});var G=O("./src/configs.js"),Z=O("./src/backends/onnx.js"),V=O("./src/utils/dtypes.js"),N=O("./src/utils/generic.js"),J=O("./src/utils/core.js"),R=O("./src/utils/hub.js"),U=O("./src/utils/constants.js"),H=O("./src/generation/logits_process.js"),L=O("./src/generation/configuration_utils.js"),Y=O("./src/utils/tensor.js"),S=O("./src/utils/image.js"),X=O("./src/utils/maths.js"),D=O("./src/generation/stopping_criteria.js"),I=O("./src/generation/logits_sampler.js"),k=O("./src/env.js"),z=O("./src/models/whisper/generation_whisper.js"),w=O("./src/models/whisper/common_whisper.js");/*! ./configs.js *//*! ./backends/onnx.js *//*! ./utils/dtypes.js *//*! ./utils/generic.js *//*! ./utils/core.js *//*! ./utils/hub.js *//*! ./utils/constants.js *//*! ./generation/logits_process.js *//*! ./generation/configuration_utils.js *//*! ./utils/tensor.js *//*! ./utils/image.js *//*! ./utils/maths.js *//*! ./generation/stopping_criteria.js *//*! ./generation/logits_sampler.js *//*! ./env.js *//*! ./models/whisper/generation_whisper.js *//*! ./models/whisper/common_whisper.js */let T=0,W=1,E=2,Q=3,A=4,l=5,r=6,e=7,V0=8,v0=9,$0=10,i=11,G0=new Map,S0=new Map,F0=new Map;async function s(c,L0,K0){return Object.fromEntries(await Promise.all(Object.keys(L0).map(async(C0)=>{let{buffer_or_path:o0,session_options:G5,session_config:X5}=await async function(K5,u5,a5){let m5=a5.config?.["transformers.js_config"]??{},F6=a5.device??m5.device;F6&&typeof F6!="string"&&(F6.hasOwnProperty(u5)?F6=F6[u5]:(console.warn(`device not specified for "${u5}". Using the default device.`),F6=null));let A5=F6??(k.apis.IS_NODE_ENV?"cpu":"wasm"),i6=(0,Z.deviceToExecutionProviders)(A5),O6=m5.device_config??{};O6.hasOwnProperty(A5)&&(m5={...m5,...O6[A5]});let e5=a5.dtype??m5.dtype;if(typeof e5!="string"&&(e5&&e5.hasOwnProperty(u5)?e5=e5[u5]:(e5=V.DEFAULT_DEVICE_DTYPE_MAPPING[A5]??V.DATA_TYPES.fp32,console.warn(`dtype not specified for "${u5}". Using the default dtype (${e5}) for this device (${A5}).`))),e5===V.DATA_TYPES.auto){let C=m5.dtype;typeof C!="string"&&(C=C?.[u5]),e5=C&&C!==V.DATA_TYPES.auto&&V.DATA_TYPES.hasOwnProperty(C)?C:V.DEFAULT_DEVICE_DTYPE_MAPPING[A5]??V.DATA_TYPES.fp32}let E6=e5;if(!V.DEFAULT_DTYPE_SUFFIX_MAPPING.hasOwnProperty(E6))throw Error(`Invalid dtype: ${E6}. Should be one of: ${Object.keys(V.DATA_TYPES).join(", ")}`);if(E6===V.DATA_TYPES.fp16&&A5==="webgpu"&&!await(0,V.isWebGpuFp16Supported)())throw Error(`The device (${A5}) does not support fp16.`);let a6=m5.kv_cache_dtype,H9=a6?typeof a6=="string"?a6:a6[E6]??"float32":void 0;if(H9&&!["float32","float16"].includes(H9))throw Error(`Invalid kv_cache_dtype: ${H9}. Should be one of: float32, float16`);let l9={dtype:E6,kv_cache_dtype:H9,device:A5},i9=`${u5}${V.DEFAULT_DTYPE_SUFFIX_MAPPING[E6]}.onnx`,q=`${a5.subfolder??""}/${i9}`,v={...a5.session_options};v.executionProviders??=i6;let x=m5.free_dimension_overrides;x?v.freeDimensionOverrides??=x:A5.startsWith("webnn")&&!v.freeDimensionOverrides&&console.warn(`WebNN does not currently support dynamic shapes and requires 'free_dimension_overrides' to be set in config.json, preferably as a field within config["transformers.js_config"]["device_config"]["${A5}"]. When 'free_dimension_overrides' is not set, you may experience significant performance degradation.`);let P=k.apis.IS_NODE_ENV&&k.env.useFSCache,F=(0,R.getModelFile)(K5,q,!0,a5,P),M=a5.use_external_data_format??m5.use_external_data_format,K=[];if(M){let C;C=typeof M=="object"?M.hasOwnProperty(i9)?M[i9]:!!M.hasOwnProperty(u5)&&M[u5]:M;let h=+C;if(h>R.MAX_EXTERNAL_DATA_CHUNKS)throw Error(`The number of external data chunks (${h}) exceeds the maximum allowed value (${R.MAX_EXTERNAL_DATA_CHUNKS}).`);for(let m=0;m{let j0=await(0,R.getModelFile)(K5,d,!0,a5,P);o(j0 instanceof Uint8Array?{path:u,data:j0}:u)}))}}else v.externalData!==void 0&&(K=v.externalData.map(async(C)=>{if(typeof C.data=="string"){let h=await(0,R.getModelFile)(K5,C.data,!0,a5);return{...C,data:h}}return C}));if(K.length>0){let C=await Promise.all(K);k.apis.IS_NODE_ENV||(v.externalData=C)}if(A5==="webgpu"){let C=(0,G.getKeyValueShapes)(a5.config,{prefix:"present"});if(Object.keys(C).length>0&&!(0,Z.isONNXProxy)()){let h={};for(let m in C)h[m]="gpu-buffer";v.preferredOutputLocation=h}}return{buffer_or_path:await F,session_options:v,session_config:l9}}(c,L0[C0],K0);return[C0,await(0,Z.createInferenceSession)(o0,G5,X5)]})))}async function n(c,L0,K0){return Object.fromEntries(await Promise.all(Object.keys(L0).map(async(C0)=>[C0,await(0,R.getModelJSON)(c,L0[C0],!1,K0)])))}let R0=Promise.resolve();async function q0(c,L0){let K0=function(C0,o0){let G5=Object.create(null),X5=[];for(let a5 of C0.inputNames){let m5=o0[a5];m5 instanceof Y.Tensor?G5[a5]=(0,Z.isONNXProxy)()?m5.clone():m5:X5.push(a5)}if(X5.length>0)throw Error(`An error occurred during model execution: "Missing the following inputs: ${X5.join(", ")}.`);let K5=Object.keys(o0).length,u5=C0.inputNames.length;if(K5>u5){let a5=Object.keys(o0).filter((m5)=>!C0.inputNames.includes(m5));console.warn(`WARNING: Too many inputs were provided (${K5} > ${u5}). The following inputs will be ignored: "${a5.join(", ")}".`)}return G5}(c,L0);try{let C0=Object.fromEntries(Object.entries(K0).map(([G5,X5])=>[G5,X5.ort_tensor])),o0=()=>c.run(C0);return p0(await(k.apis.IS_BROWSER_ENV||k.apis.IS_WEBWORKER_ENV?R0=R0.then(o0):o0()))}catch(C0){let o0=Object.fromEntries(Object.entries(K0).map(([G5,X5])=>{let K5={type:X5.type,dims:X5.dims,location:X5.location};return K5.location!=="gpu-buffer"&&(K5.data=X5.data),[G5,K5]}));throw console.error(`An error occurred during model execution: "${C0}".`),console.error("Inputs given to model:",o0),C0}}function p0(c){for(let L0 in c)(0,Z.isONNXTensor)(c[L0])?c[L0]=new Y.Tensor(c[L0]):typeof c[L0]=="object"&&p0(c[L0]);return c}function Z0(c){if(c instanceof Y.Tensor)return c;if(c.length===0)throw Error("items must be non-empty");if(Array.isArray(c[0])){if(c.some((L0)=>L0.length!==c[0].length))throw Error("Unable to create tensor, you should probably activate truncation and/or padding with 'padding=True' and/or 'truncation=True' to have batched tensors with the same length.");return new Y.Tensor("int64",BigInt64Array.from(c.flat().map((L0)=>BigInt(L0))),[c.length,c[0].length])}return new Y.Tensor("int64",BigInt64Array.from(c.map((L0)=>BigInt(L0))),[1,c.length])}function M0(c){return new Y.Tensor("bool",[c],[1])}async function q5(c,L0){let{encoder_outputs:K0,input_ids:C0,decoder_input_ids:o0,...G5}=L0;if(!K0){let X5=(0,J.pick)(L0,c.sessions.model.inputNames);K0=(await E0(c,X5)).last_hidden_state}return G5.input_ids=o0,G5.encoder_hidden_states=K0,c.sessions.decoder_model_merged.inputNames.includes("encoder_attention_mask")&&(G5.encoder_attention_mask=L0.attention_mask),await N0(c,G5,!0)}async function E0(c,L0){let K0=c.sessions.model,C0=(0,J.pick)(L0,K0.inputNames);if(K0.inputNames.includes("inputs_embeds")&&!C0.inputs_embeds){if(!L0.input_ids)throw Error("Both `input_ids` and `inputs_embeds` are missing in the model inputs.");C0.inputs_embeds=await c.encode_text({input_ids:L0.input_ids})}if(K0.inputNames.includes("token_type_ids")&&!C0.token_type_ids){if(!C0.input_ids)throw Error("Both `input_ids` and `token_type_ids` are missing in the model inputs.");C0.token_type_ids=(0,Y.zeros_like)(C0.input_ids)}if(K0.inputNames.includes("pixel_mask")&&!C0.pixel_mask){if(!C0.pixel_values)throw Error("Both `pixel_values` and `pixel_mask` are missing in the model inputs.");let o0=C0.pixel_values.dims;C0.pixel_mask=(0,Y.ones)([o0[0],o0[2],o0[3]])}return await q0(K0,C0)}async function e0(c,L0){let K0=await c.encode(L0);return await c.decode(K0)}async function N0(c,L0,K0=!1){let C0=c.sessions[K0?"decoder_model_merged":"model"],{past_key_values:o0,...G5}=L0;if(C0.inputNames.includes("use_cache_branch")&&(G5.use_cache_branch=M0(!!o0)),C0.inputNames.includes("position_ids")&&G5.attention_mask&&!G5.position_ids){let K5=["paligemma","gemma3_text","gemma3"].includes(c.config.model_type)?1:0;G5.position_ids=function(u5,a5=null,m5=0){let{input_ids:F6,inputs_embeds:A5,attention_mask:i6}=u5,{data:O6,dims:e5}=J5(i6,m5),E6=new Y.Tensor("int64",O6,e5);if(a5){let a6=-(F6??A5).dims.at(1);E6=E6.slice(null,[a6,null])}return E6}(G5,o0,K5)}c.addPastKeyValues(G5,o0);let X5=(0,J.pick)(G5,C0.inputNames);return await q0(C0,X5)}function P0({modality_token_id:c,inputs_embeds:L0,modality_features:K0,input_ids:C0,attention_mask:o0}){let G5=C0.tolist().map((a5)=>a5.reduce((m5,F6,A5)=>(F6==c&&m5.push(A5),m5),[])),X5=G5.reduce((a5,m5)=>a5+m5.length,0),K5=K0.dims[0];if(X5!==K5)throw Error(`Number of tokens and features do not match: tokens: ${X5}, features ${K5}`);let u5=0;for(let a5=0;a5G5.dims[1]);else if(o0K5==c.config.image_token_index)){let K5=c.config.num_image_tokens;if(!K5)throw Error("`num_image_tokens` is missing in the model configuration.");let u5=G5.dims[1]-(o0-K5);K0.input_ids=G5.slice(null,[-u5,null]),K0.attention_mask=(0,Y.ones)([1,o0+u5])}}return K0}function y5(c,L0,K0,C0){return K0.past_key_values&&(L0=L0.map((o0)=>[o0.at(-1)])),{...K0,decoder_input_ids:Z0(L0)}}function R5(c,...L0){return c.config.is_encoder_decoder?y5(c,...L0):t0(c,...L0)}function U5(c,L0,K0,C0){let o0=!!K0.past_key_values;if(C0.guidance_scale!==null&&C0.guidance_scale>1&&(o0?K0.input_ids=(0,Y.cat)([K0.input_ids,K0.input_ids],0):(K0.input_ids=(0,Y.cat)([K0.input_ids,(0,Y.full_like)(K0.input_ids,BigInt(C0.pad_token_id))],0),K0.attention_mask=(0,Y.cat)([K0.attention_mask,(0,Y.full_like)(K0.attention_mask,0n)],0))),!o0&&K0.pixel_values||(K0.pixel_values=(0,Y.full)([0,0,3,384,384],1)),o0)K0.images_seq_mask=new Y.Tensor("bool",[,].fill(!0).fill(!1,0,1),[1,1]),K0.images_emb_mask=new Y.Tensor("bool",[].fill(!1),[1,1,0]);return K0}class T0 extends N.Callable{main_input_name="input_ids";forward_params=["input_ids","attention_mask"];constructor(c,L0,K0){super(),this.config=c,this.sessions=L0,this.configs=K0;let C0=F0.get(this.constructor),o0=G0.get(C0);switch(this.can_generate=!1,this._forward=null,this._prepare_inputs_for_generation=null,o0){case A:this.can_generate=!0,this._forward=N0,this._prepare_inputs_for_generation=t0;break;case E:case Q:case e:this.can_generate=!0,this._forward=q5,this._prepare_inputs_for_generation=y5;break;case W:this._forward=q5;break;case r:this.can_generate=!0,this._forward=g0,this._prepare_inputs_for_generation=R5;break;case $0:this.can_generate=!0,this._forward=r0,this._prepare_inputs_for_generation=R5;break;case v0:this.can_generate=!0,this._prepare_inputs_for_generation=R5;break;case V0:this.can_generate=!0,this._prepare_inputs_for_generation=U5;break;case i:this._forward=e0;break;default:this._forward=E0}this.can_generate&&this.forward_params.push("past_key_values"),this.custom_config=this.config["transformers.js_config"]??{}}async dispose(){let c=[];for(let L0 of Object.values(this.sessions))L0?.handler?.dispose&&c.push(L0.handler.dispose());return await Promise.all(c)}static async from_pretrained(c,{progress_callback:L0=null,config:K0=null,cache_dir:C0=null,local_files_only:o0=!1,revision:G5="main",model_file_name:X5=null,subfolder:K5="onnx",device:u5=null,dtype:a5=null,use_external_data_format:m5=null,session_options:F6={}}={}){let A5={progress_callback:L0,config:K0,cache_dir:C0,local_files_only:o0,revision:G5,model_file_name:X5,subfolder:K5,device:u5,dtype:a5,use_external_data_format:m5,session_options:F6},i6=F0.get(this),O6=G0.get(i6),e5;if(K0=A5.config=await G.AutoConfig.from_pretrained(c,A5),O6===A)e5=await Promise.all([s(c,{model:A5.model_file_name??"model"},A5),n(c,{generation_config:"generation_config.json"},A5)]);else if(O6===E||O6===Q)e5=await Promise.all([s(c,{model:"encoder_model",decoder_model_merged:"decoder_model_merged"},A5),n(c,{generation_config:"generation_config.json"},A5)]);else if(O6===l)e5=await Promise.all([s(c,{model:"vision_encoder",prompt_encoder_mask_decoder:"prompt_encoder_mask_decoder"},A5)]);else if(O6===W)e5=await Promise.all([s(c,{model:"encoder_model",decoder_model_merged:"decoder_model_merged"},A5)]);else if(O6===r){let E6={embed_tokens:"embed_tokens",vision_encoder:"vision_encoder",decoder_model_merged:"decoder_model_merged"};K0.is_encoder_decoder&&(E6.model="encoder_model"),e5=await Promise.all([s(c,E6,A5),n(c,{generation_config:"generation_config.json"},A5)])}else if(O6===$0)e5=await Promise.all([s(c,{embed_tokens:"embed_tokens",audio_encoder:"audio_encoder",decoder_model_merged:"decoder_model_merged"},A5),n(c,{generation_config:"generation_config.json"},A5)]);else if(O6===e)e5=await Promise.all([s(c,{model:"text_encoder",decoder_model_merged:"decoder_model_merged",encodec_decode:"encodec_decode"},A5),n(c,{generation_config:"generation_config.json"},A5)]);else if(O6===V0)e5=await Promise.all([s(c,{prepare_inputs_embeds:"prepare_inputs_embeds",model:"language_model",lm_head:"lm_head",gen_head:"gen_head",gen_img_embeds:"gen_img_embeds",image_decode:"image_decode"},A5),n(c,{generation_config:"generation_config.json"},A5)]);else if(O6===v0)e5=await Promise.all([s(c,{prepare_inputs_embeds:"prepare_inputs_embeds",model:"model",vision_encoder:"vision_encoder"},A5),n(c,{generation_config:"generation_config.json"},A5)]);else if(O6===i)e5=await Promise.all([s(c,{encoder_model:"encoder_model",decoder_model:"decoder_model"},A5)]);else{if(O6!==T){let E6=i6??K0?.model_type;E6!=="custom"&&console.warn(`Model type for '${E6}' not found, assuming encoder-only architecture. Please report this at ${U.GITHUB_ISSUE_URL}.`)}e5=await Promise.all([s(c,{model:A5.model_file_name??"model"},A5)])}return new this(K0,...e5)}async _call(c){return await this.forward(c)}async forward(c){return await this._forward(this,c)}get generation_config(){return this.configs?.generation_config??null}_get_logits_warper(c){let L0=new H.LogitsProcessorList;return c.temperature!==null&&c.temperature!==1&&L0.push(new H.TemperatureLogitsWarper(c.temperature)),c.top_k!==null&&c.top_k!==0&&L0.push(new H.TopKLogitsWarper(c.top_k)),c.top_p!==null&&c.top_p<1&&L0.push(new H.TopPLogitsWarper(c.top_p)),L0}_get_logits_processor(c,L0,K0=null){let C0=new H.LogitsProcessorList;if(c.repetition_penalty!==null&&c.repetition_penalty!==1&&C0.push(new H.RepetitionPenaltyLogitsProcessor(c.repetition_penalty)),c.no_repeat_ngram_size!==null&&c.no_repeat_ngram_size>0&&C0.push(new H.NoRepeatNGramLogitsProcessor(c.no_repeat_ngram_size)),c.bad_words_ids!==null&&C0.push(new H.NoBadWordsLogitsProcessor(c.bad_words_ids,c.eos_token_id)),c.min_length!==null&&c.eos_token_id!==null&&c.min_length>0&&C0.push(new H.MinLengthLogitsProcessor(c.min_length,c.eos_token_id)),c.min_new_tokens!==null&&c.eos_token_id!==null&&c.min_new_tokens>0&&C0.push(new H.MinNewTokensLengthLogitsProcessor(L0,c.min_new_tokens,c.eos_token_id)),c.forced_bos_token_id!==null&&C0.push(new H.ForcedBOSTokenLogitsProcessor(c.forced_bos_token_id)),c.forced_eos_token_id!==null&&C0.push(new H.ForcedEOSTokenLogitsProcessor(c.max_length,c.forced_eos_token_id)),c.begin_suppress_tokens!==null){let o0=L0>1||c.forced_bos_token_id===null?L0:L0+1;C0.push(new H.SuppressTokensAtBeginLogitsProcessor(c.begin_suppress_tokens,o0))}return c.guidance_scale!==null&&c.guidance_scale>1&&C0.push(new H.ClassifierFreeGuidanceLogitsProcessor(c.guidance_scale)),K0!==null&&C0.extend(K0),C0}_prepare_generation_config(c,L0,K0=L.GenerationConfig){let C0={...this.config};for(let G5 of["decoder","generator","text_config"])G5 in C0&&Object.assign(C0,C0[G5]);let o0=new K0(C0);return Object.assign(o0,this.generation_config??{}),c&&Object.assign(o0,c),L0&&Object.assign(o0,(0,J.pick)(L0,Object.getOwnPropertyNames(o0))),o0}_get_stopping_criteria(c,L0=null){let K0=new D.StoppingCriteriaList;return c.max_length!==null&&K0.push(new D.MaxLengthCriteria(c.max_length,this.config.max_position_embeddings??null)),c.eos_token_id!==null&&K0.push(new D.EosTokenCriteria(c.eos_token_id)),L0&&K0.extend(L0),K0}_validate_model_class(){if(!this.can_generate){let c=[gG,uG,AG,f8],L0=F0.get(this.constructor),K0=new Set,C0=this.config.model_type;for(let G5 of c){let X5=G5.get(C0);X5&&K0.add(X5[0])}let o0=`The current model class (${L0}) is not compatible with \`.generate()\`, as it doesn't have a language model head.`;throw K0.size>0&&(o0+=` Please use the following class instead: ${[...K0].join(", ")}`),Error(o0)}}prepare_inputs_for_generation(...c){return this._prepare_inputs_for_generation(this,...c)}_update_model_kwargs_for_generation({generated_input_ids:c,outputs:L0,model_inputs:K0,is_encoder_decoder:C0}){return K0.past_key_values=this.getPastKeyValues(L0,K0.past_key_values),K0.input_ids=new Y.Tensor("int64",c.flat(),[c.length,1]),C0||(K0.attention_mask=(0,Y.cat)([K0.attention_mask,(0,Y.ones)([K0.attention_mask.dims[0],1])],1)),K0.position_ids=null,K0}_prepare_model_inputs({inputs:c,bos_token_id:L0,model_kwargs:K0}){let C0=(0,J.pick)(K0,this.forward_params),o0=this.main_input_name;if(o0 in C0){if(c)throw Error("`inputs`: {inputs}` were passed alongside {input_name} which is not allowed. Make sure to either pass {inputs} or {input_name}=...")}else C0[o0]=c;return{inputs_tensor:C0[o0],model_inputs:C0,model_input_name:o0}}async _prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:c,model_inputs:L0,model_input_name:K0,generation_config:C0}){if(this.sessions.model.inputNames.includes("inputs_embeds")&&!L0.inputs_embeds&&"_prepare_inputs_embeds"in this){let{input_ids:G5,pixel_values:X5,attention_mask:K5,...u5}=L0,a5=await this._prepare_inputs_embeds(L0);L0={...u5,...(0,J.pick)(a5,["inputs_embeds","attention_mask"])}}let{last_hidden_state:o0}=await E0(this,L0);if(C0.guidance_scale!==null&&C0.guidance_scale>1)o0=(0,Y.cat)([o0,(0,Y.full_like)(o0,0)],0),"attention_mask"in L0&&(L0.attention_mask=(0,Y.cat)([L0.attention_mask,(0,Y.zeros_like)(L0.attention_mask)],0));else if(L0.decoder_input_ids){let G5=Z0(L0.decoder_input_ids).dims[0];if(G5!==o0.dims[0]){if(o0.dims[0]!==1)throw Error(`The encoder outputs have a different batch size (${o0.dims[0]}) than the decoder inputs (${G5}).`);o0=(0,Y.cat)(Array.from({length:G5},()=>o0),0)}}return L0.encoder_outputs=o0,L0}_prepare_decoder_input_ids_for_generation({batch_size:c,model_input_name:L0,model_kwargs:K0,decoder_start_token_id:C0,bos_token_id:o0,generation_config:G5}){let{decoder_input_ids:X5,...K5}=K0;if(!(X5 instanceof Y.Tensor)){if(X5)Array.isArray(X5[0])||(X5=Array.from({length:c},()=>X5));else if(C0??=o0,this.config.model_type==="musicgen")X5=Array.from({length:c*this.config.decoder.num_codebooks},()=>[C0]);else if(Array.isArray(C0)){if(C0.length!==c)throw Error(`\`decoder_start_token_id\` expcted to have length ${c} but got ${C0.length}`);X5=C0}else X5=Array.from({length:c},()=>[C0]);X5=Z0(X5)}return K0.decoder_attention_mask=(0,Y.ones_like)(X5),{input_ids:X5,model_inputs:K5}}async generate({inputs:c=null,generation_config:L0=null,logits_processor:K0=null,stopping_criteria:C0=null,streamer:o0=null,...G5}){this._validate_model_class(),L0=this._prepare_generation_config(L0,G5);let{inputs_tensor:X5,model_inputs:K5,model_input_name:u5}=this._prepare_model_inputs({inputs:c,model_kwargs:G5}),a5=this.config.is_encoder_decoder,m5;a5&&(("encoder_outputs"in K5)||(K5=await this._prepare_encoder_decoder_kwargs_for_generation({inputs_tensor:X5,model_inputs:K5,model_input_name:u5,generation_config:L0}))),a5?{input_ids:m5,model_inputs:K5}=this._prepare_decoder_input_ids_for_generation({batch_size:K5[u5].dims.at(0),model_input_name:u5,model_kwargs:K5,decoder_start_token_id:L0.decoder_start_token_id,bos_token_id:L0.bos_token_id,generation_config:L0}):m5=K5[u5];let F6=m5.dims.at(-1);L0.max_new_tokens!==null&&(L0.max_length=F6+L0.max_new_tokens);let A5=this._get_logits_processor(L0,F6,K0),i6=this._get_stopping_criteria(L0,C0),O6=K5[u5].dims.at(0),e5=I.LogitsSampler.getSampler(L0),E6=Array(O6).fill(0),a6=m5.tolist(),H9;o0&&o0.put(a6);let l9={};for(;;){if(K5=this.prepare_inputs_for_generation(a6,K5,L0),H9=await this.forward(K5),L0.output_attentions&&L0.return_dict_in_generate){let P=this.getAttentions(H9);for(let F in P)F in l9||(l9[F]=[]),l9[F].push(P[F])}let v=A5(a6,H9.logits.slice(null,-1,null)),x=[];for(let P=0;PP))break;K5=this._update_model_kwargs_for_generation({generated_input_ids:x,outputs:H9,model_inputs:K5,is_encoder_decoder:a5})}o0&&o0.end();let i9=this.getPastKeyValues(H9,K5.past_key_values,!0),q=new Y.Tensor("int64",a6.flat(),[a6.length,a6[0].length]);if(L0.return_dict_in_generate)return{sequences:q,past_key_values:i9,...l9};for(let v of Object.values(H9))v.location==="gpu-buffer"&&v.dispose();return q}getPastKeyValues(c,L0,K0=!1){let C0=Object.create(null);for(let o0 in c)if(o0.startsWith("present")){let G5=o0.replace("present","past_key_values"),X5=o0.includes("encoder");if(C0[G5]=X5&&L0?L0[G5]:c[o0],L0&&(!X5||K0)){let K5=L0[G5];K5.location==="gpu-buffer"&&K5.dispose()}}return C0}getAttentions(c){let L0={};for(let K0 of["cross_attentions","encoder_attentions","decoder_attentions"])for(let C0 in c)C0.startsWith(K0)&&((K0 in L0)||(L0[K0]=[]),L0[K0].push(c[C0]));return L0}addPastKeyValues(c,L0){if(L0)Object.assign(c,L0);else{let K0=this.sessions.decoder_model_merged??this.sessions.model,C0=K0?.config?.kv_cache_dtype??"float32",o0=C0==="float16"?new Y.DataTypeMap.float16:[],G5=(c[this.main_input_name]??c.attention_mask)?.dims?.[0]??1,X5=(0,G.getKeyValueShapes)(this.config,{batch_size:G5});for(let K5 in X5)c[K5]=new Y.Tensor(C0,o0,X5[K5])}}async encode_image({pixel_values:c}){let L0=(await q0(this.sessions.vision_encoder,{pixel_values:c})).image_features;return this.config.num_image_tokens||(console.warn(`The number of image tokens was not set in the model configuration. Setting it to the number of features detected by the vision encoder (${L0.dims[1]}).`),this.config.num_image_tokens=L0.dims[1]),L0}async encode_text({input_ids:c}){return(await q0(this.sessions.embed_tokens,{input_ids:c})).inputs_embeds}async encode_audio({audio_values:c}){return(await q0(this.sessions.audio_encoder,{audio_values:c})).audio_features}}class s0{}class D5 extends s0{constructor({last_hidden_state:c,hidden_states:L0=null,attentions:K0=null}){super(),this.last_hidden_state=c,this.hidden_states=L0,this.attentions=K0}}class L5 extends T0{}class d5 extends L5{}class T5 extends L5{async _call(c){return new W9(await super._call(c))}}class $5 extends L5{async _call(c){return new H6(await super._call(c))}}class V5 extends L5{async _call(c){return new F9(await super._call(c))}}class U6 extends L5{async _call(c){return new d9(await super._call(c))}}class t extends T0{}class y0 extends t{}class O0 extends t{async _call(c){return new W9(await super._call(c))}}class I0 extends t{async _call(c){return new H6(await super._call(c))}}class w0 extends t{async _call(c){return new F9(await super._call(c))}}class H5 extends T0{}class N5 extends H5{}class g5 extends T0{}class Q5 extends g5{}class S5 extends g5{async _call(c){return new W9(await super._call(c))}}class K6 extends g5{async _call(c){return new H6(await super._call(c))}}class Y5 extends g5{async _call(c){return new F9(await super._call(c))}}class w6 extends g5{async _call(c){return new d9(await super._call(c))}}class Z6 extends T0{}class c6 extends Z6{}class Y9 extends Z6{async _call(c){return new W9(await super._call(c))}}class y9 extends Z6{async _call(c){return new H6(await super._call(c))}}class V6 extends Z6{async _call(c){return new F9(await super._call(c))}}class a9 extends Z6{async _call(c){return new d9(await super._call(c))}}class I9 extends T0{}class z6 extends I9{}class _5 extends I9{async _call(c){return new W9(await super._call(c))}}class E5 extends I9{async _call(c){return new H6(await super._call(c))}}class v5 extends I9{async _call(c){return new F9(await super._call(c))}}class o6 extends I9{async _call(c){return new d9(await super._call(c))}}class b9 extends T0{}class H1 extends b9{}class x1 extends b9{async _call(c){return new W9(await super._call(c))}}class o9 extends b9{async _call(c){return new H6(await super._call(c))}}class L1 extends b9{async _call(c){return new F9(await super._call(c))}}class _1 extends b9{async _call(c){return new d9(await super._call(c))}}class z9 extends T0{}class D9 extends z9{}class p9 extends z9{async _call(c){return new W9(await super._call(c))}}class J9 extends z9{async _call(c){return new H6(await super._call(c))}}class Y1 extends z9{async _call(c){return new F9(await super._call(c))}}class t6 extends z9{async _call(c){return new d9(await super._call(c))}}class f9 extends T0{}class r9 extends f9{}class G9 extends f9{async _call(c){return new W9(await super._call(c))}}class S1 extends f9{async _call(c){return new H6(await super._call(c))}}class A1 extends f9{async _call(c){return new F9(await super._call(c))}}class x9 extends f9{async _call(c){return new d9(await super._call(c))}}class q1 extends T0{}class n9 extends q1{}class v9 extends q1{async _call(c){return new H6(await super._call(c))}}class L6 extends q1{async _call(c){return new F9(await super._call(c))}}class m6 extends q1{async _call(c){return new d9(await super._call(c))}}class p6 extends q1{async _call(c){return new W9(await super._call(c))}}class B0 extends T0{}class P1 extends B0{}class g1 extends B0{async _call(c){return new W9(await super._call(c))}}class u1 extends B0{async _call(c){return new H6(await super._call(c))}}class d1 extends B0{async _call(c){return new F9(await super._call(c))}}class V1 extends T0{}class W1 extends V1{}class M1 extends V1{async _call(c){return new W9(await super._call(c))}}class R1 extends V1{async _call(c){return new H6(await super._call(c))}}class l1 extends V1{async _call(c){return new d9(await super._call(c))}}class N1 extends T0{}class p extends N1{}class x0 extends N1{async _call(c){return new W9(await super._call(c))}}class X0 extends N1{async _call(c){return new H6(await super._call(c))}}class W0 extends N1{async _call(c){return new F9(await super._call(c))}}class h0 extends N1{async _call(c){return new d9(await super._call(c))}}class c0 extends T0{}class F5 extends c0{}class W5 extends c0{async _call(c){return new W9(await super._call(c))}}class b5 extends c0{async _call(c){return new H6(await super._call(c))}}class P5 extends c0{async _call(c){return new d9(await super._call(c))}}class S6 extends T0{}class _6 extends S6{}class O9 extends S6{async _call(c){return new H6(await super._call(c))}}class g6 extends S6{async _call(c){return new d9(await super._call(c))}}class k9 extends S6{async _call(c){return new W9(await super._call(c))}}class w9 extends T0{forward_params=["input_ids","attention_mask","encoder_outputs","decoder_input_ids","decoder_attention_mask","past_key_values"]}class Z9 extends w9{}class s9 extends w9{}class J1 extends T0{}class P6 extends J1{}class Q6 extends J1{}class C6 extends T0{}class N6 extends C6{}class s6 extends C6{}class C5 extends T0{}class k6 extends C5{}class E9 extends C5{}class R9 extends C5{async _call(c){return new H6(await super._call(c))}}class B6 extends T0{}class B5 extends B6{}class U9 extends B6{}class u0 extends B6{async _call(c){return new H6(await super._call(c))}}class h5 extends B6{}class V2 extends T0{}class s2 extends V2{}class X1 extends V2{}class i2 extends T0{}class a2 extends i2{}class T2 extends i2{}class o1 extends T0{}class B3 extends o1{}class r2 extends o1{async _call(c){return new W9(await super._call(c))}}class n2 extends o1{async _call(c){return new H6(await super._call(c))}}class A9 extends o1{async _call(c){return new F9(await super._call(c))}}class h3 extends o1{async _call(c){return new d9(await super._call(c))}}class s1 extends T0{}class c3 extends s1{}class m3 extends s1{async _call(c){return new W9(await super._call(c))}}class p3 extends s1{async _call(c){return new H6(await super._call(c))}}class A3 extends s1{async _call(c){return new F9(await super._call(c))}}class g3 extends s1{async _call(c){return new d9(await super._call(c))}}class i1 extends T0{}class u3 extends i1{}class d3 extends i1{async _call(c){return new W9(await super._call(c))}}class t2 extends i1{async _call(c){return new H6(await super._call(c))}}class F2 extends i1{async _call(c){return new F9(await super._call(c))}}class g9 extends i1{async _call(c){return new d9(await super._call(c))}}class y2 extends T0{}class l3 extends y2{}class e2 extends y2{}class N2 extends T0{requires_attention_mask=!1;main_input_name="input_features";forward_params=["input_features","attention_mask","decoder_input_ids","decoder_attention_mask","past_key_values"]}class K1 extends N2{}class b1 extends N2{_prepare_generation_config(c,L0){return super._prepare_generation_config(c,L0,z.WhisperGenerationConfig)}_retrieve_init_tokens(c){let L0=[c.decoder_start_token_id],K0=c.language,C0=c.task;if(c.is_multilingual){K0||(console.warn("No language specified - defaulting to English (en)."),K0="en");let o0=`<|${(0,w.whisper_language_to_code)(K0)}|>`;L0.push(c.lang_to_id[o0]),L0.push(c.task_to_id[C0??"transcribe"])}else if(K0||C0)throw Error("Cannot specify `task` or `language` for an English-only model. If the model is intended to be multilingual, pass `is_multilingual=true` to generate, or update the generation config.");return!c.return_timestamps&&c.no_timestamps_token_id&&L0.at(-1)!==c.no_timestamps_token_id?L0.push(c.no_timestamps_token_id):c.return_timestamps&&L0.at(-1)===c.no_timestamps_token_id&&(console.warn("<|notimestamps|> prompt token is removed from generation_config since `return_timestamps` is set to `true`."),L0.pop()),L0.filter((o0)=>o0!=null)}async generate({inputs:c=null,generation_config:L0=null,logits_processor:K0=null,stopping_criteria:C0=null,...o0}){L0=this._prepare_generation_config(L0,o0);let G5=o0.decoder_input_ids??this._retrieve_init_tokens(L0);if(L0.return_timestamps&&(K0??=new H.LogitsProcessorList,K0.push(new H.WhisperTimeStampLogitsProcessor(L0,G5))),L0.begin_suppress_tokens&&(K0??=new H.LogitsProcessorList,K0.push(new H.SuppressTokensAtBeginLogitsProcessor(L0.begin_suppress_tokens,G5.length))),L0.return_token_timestamps){if(!L0.alignment_heads)throw Error("Model generation config has no `alignment_heads`, token-level timestamps not available. See https://gist.github.com/hollance/42e32852f24243b748ae6bc1f985b13a on how to add this property to the generation config.");L0.task==="translate"&&console.warn("Token-level timestamps may not be reliable for task 'translate'."),L0.output_attentions=!0,L0.return_dict_in_generate=!0}let X5=await super.generate({inputs:c,generation_config:L0,logits_processor:K0,decoder_input_ids:G5,...o0});return L0.return_token_timestamps&&(X5.token_timestamps=this._extract_token_timestamps(X5,L0.alignment_heads,L0.num_frames)),X5}_extract_token_timestamps(c,L0,K0=null,C0=0.02){if(!c.cross_attentions)throw Error("Model outputs must contain cross attentions to extract timestamps. This is most likely because the model was not exported with `output_attentions=True`.");K0==null&&console.warn("`num_frames` has not been set, meaning the entire audio will be analyzed. This may lead to inaccurate token-level timestamps for short audios (< 30 seconds).");let o0=this.config.median_filter_width;o0===void 0&&(console.warn("Model config has no `median_filter_width`, using default value of 7."),o0=7);let G5=c.cross_attentions,X5=Array.from({length:this.config.decoder_layers},(O6,e5)=>(0,Y.cat)(G5.map((E6)=>E6[e5]),2)),K5=(0,Y.stack)(L0.map(([O6,e5])=>{if(O6>=X5.length)throw Error(`Layer index ${O6} is out of bounds for cross attentions (length ${X5.length}).`);return K0?X5[O6].slice(null,e5,null,[0,K0]):X5[O6].slice(null,e5)})).transpose(1,0,2,3),[u5,a5]=(0,Y.std_mean)(K5,-2,0,!0),m5=K5.clone();for(let O6=0;O6E6[v+1]-E6[v]),l9=(0,J.mergeArrays)([1],H9).map((q)=>!!q),i9=[];for(let q=0;qm5.findIndex((F6)=>F6==o0)),X5=G5.every((m5)=>m5===-1),K5=G5.every((m5)=>m5!==-1);if(!X5&&!K5)throw Error("Every input should contain either 0 or 1 image token.");if(X5)return{inputs_embeds:c,attention_mask:C0};let u5=[],a5=[];for(let m5=0;m5Array.from({length:c.dims[0]},(H9)=>Array.from({length:c.dims[1]},(l9)=>1))),i6=L0?L0.tolist():[],O6=K0?K0.tolist():[],e5=0,E6=0;for(let a6=0;a6F6[a6][o]==1),l9=H9.reduce((d,o,a)=>(o==K5&&d.push(a),d),[]).map((d)=>H9[d+1]),i9=l9.filter((d)=>d==G5).length,q=l9.filter((d)=>d==X5).length,v=[],x=0,P=i9,F=q;for(let d=0;di0>x&&w5==G5),a=H9.findIndex((w5,i0)=>i0>x&&w5==X5),j0=P>0&&o!==-1?o:H9.length+1,U0=F>0&&a!==-1?a:H9.length+1,_0,H0,Y0,k0;j00?(0,X.max)(v.at(-1))[0]+1:0;v.push(Array.from({length:3*x5},(w5,i0)=>f5+i0%x5));let c5=x5+f5,l5=D0*b0*m0,G6=Array.from({length:l5},(w5,i0)=>c5+Math.floor(i0/(b0*m0))),y6=Array.from({length:l5},(w5,i0)=>c5+Math.floor(i0/m0)%b0),A6=Array.from({length:l5},(w5,i0)=>c5+i0%m0);v.push([G6,y6,A6].flat()),x=_0+l5}if(x0?(0,X.max)(v.at(-1))[0]+1:0,o=H9.length-x;v.push(Array.from({length:3*o},(a,j0)=>d+j0%o))}let M=v.reduce((d,o)=>d+o.length,0),K=Array(M),C=0;for(let d=0;d<3;++d)for(let o=0;om5[e5%m5.length]),i6=Array.from({length:F6[0]},(O6,e5)=>(0,X.max)(m5.subarray(F6[1]*e5,F6[1]*(e5+1)))[0]+1n+BigInt(F6[1]));return[new Y.Tensor("int64",A5,[3,...F6]),new Y.Tensor("int64",i6,[i6.length,1])]}{let[m5,F6]=c.dims,A5=BigInt64Array.from({length:3*m5*F6},(i6,O6)=>BigInt(Math.floor(O6%F6/m5)));return[new Y.Tensor("int64",A5,[3,...c.dims]),(0,Y.zeros)([m5,1])]}}async encode_image({pixel_values:c,image_grid_thw:L0}){return(await q0(this.sessions.vision_encoder,{pixel_values:c,grid_thw:L0})).image_features}_merge_input_ids_with_image_features(c){return Q0({image_token_id:this.config.image_token_id,...c})}prepare_inputs_for_generation(c,L0,K0){if(L0.attention_mask&&!L0.position_ids)if(L0.past_key_values){L0.pixel_values=null;let C0=BigInt(Object.values(L0.past_key_values)[0].dims.at(-2)),o0=L0.rope_deltas.map((G5)=>C0+G5);L0.position_ids=(0,Y.stack)([o0,o0,o0],0)}else[L0.position_ids,L0.rope_deltas]=this.get_rope_index(L0.input_ids,L0.image_grid_thw,L0.video_grid_thw,L0.attention_mask);return L0}}class k7 extends T0{}class k$ extends k7{}class I$ extends k7{}class I7 extends T0{}class D$ extends I7{}class W$ extends I7{}class D7 extends T0{}class M$ extends D7{}class K$ extends D7{}class W7 extends T0{}class b$ extends W7{}class q3 extends W7{}class h2 extends T0{}class V3 extends h2{}class M7 extends h2{}class u9 extends T0{}class f$ extends u9{}class w$ extends u9{async _call(c){return new H6(await super._call(c))}}class t3 extends T0{}class K7 extends t3{}class E$ extends t3{async _call(c){return new H6(await super._call(c))}}class Q$ extends T0{}class b7 extends Q${}class W4 extends T0{}class C$ extends W4{}class f7 extends W4{async _call(c){return new H6(await super._call(c))}}class B$ extends T0{}class M4 extends B${}class w7 extends T0{}class h$ extends w7{}class c$ extends w7{async _call(c){return new H6(await super._call(c))}}class E7 extends T0{}class q4 extends E7{}class Q7 extends T0{}class C7 extends Q7{}class m$ extends Q7{async _call(c){return new H6(await super._call(c))}}class p$ extends T0{}class A$ extends p${async _call(c){return new H3(await super._call(c))}}class B7 extends T0{}class g$ extends B7{}class u$ extends B7{async _call(c){return new H6(await super._call(c))}}class V4 extends T0{}class d$ extends V4{}class K4 extends V4{async _call(c){return new H6(await super._call(c))}}class b4 extends T0{}class h7 extends b4{}class l$ extends b4{}class c7 extends T0{}class m7 extends c7{}class o$ extends c7{}class p7 extends T0{}class s$ extends p7{}class i$ extends p7{async _call(c){return new H6(await super._call(c))}}class N4 extends T0{}class a$ extends N4{}class r$ extends N4{async _call(c){return new A7(await super._call(c))}}class f4 extends N4{async _call(c){return new n$(await super._call(c))}}class A7 extends s0{constructor({logits:c,pred_boxes:L0}){super(),this.logits=c,this.pred_boxes=L0}}class n$ extends s0{constructor({logits:c,pred_boxes:L0,pred_masks:K0}){super(),this.logits=c,this.pred_boxes=L0,this.pred_masks=K0}}class g7 extends T0{}class t$ extends g7{}class e$ extends g7{async _call(c){return new J4(await super._call(c))}}class J4 extends s0{constructor({logits:c,pred_boxes:L0}){super(),this.logits=c,this.pred_boxes=L0}}class u7 extends T0{}class $j extends u7{}class jj extends u7{async _call(c){return new Oj(await super._call(c))}}class Oj extends J4{}class w4 extends T0{}class E4 extends w4{}class d7 extends w4{async _call(c){return new Gj(await super._call(c))}}class Gj extends J4{}class l7 extends T0{}class Zj extends l7{}class o7 extends l7{async _call(c){return new J4(await super._call(c))}}class s7 extends T0{}class qj extends s7{}class Vj extends s7{async _call(c){return new Nj(await super._call(c))}}class Nj extends A7{}class Q4 extends T0{}class Jj extends Q4{}class vj extends Q4{async _call(c){return new H6(await super._call(c))}}class i7 extends T0{}class Rj extends i7{}class Uj extends i7{async _call(c){return new H6(await super._call(c))}}class a7 extends T0{}class Hj extends a7{}class xj extends a7{async _call(c){return new H6(await super._call(c))}}class C4 extends T0{}class Lj extends C4{}class _j extends C4{async _call(c){return new H6(await super._call(c))}}class Yj extends C4{}class r7 extends T0{}class Sj extends r7{}class Pj extends r7{}class n7 extends T0{}class Xj extends n7{}class Tj extends n7{}class Fj extends T0{}class yj extends Fj{}class B4 extends T0{}class zj extends B4{}class kj extends B4{}class Ij extends B4{}class G2 extends T0{}class x2 extends G2{}class N3 extends T0{}class J3 extends N3{}class Dj extends T0{}class Wj extends Dj{}class t7 extends T0{}class Mj extends t7{}class Kj extends t7{}class e7 extends T0{}class bj extends e7{}class fj extends e7{}class wj extends T0{}class $1 extends wj{}class $8 extends T0{}class Ej extends $8{}class j8 extends $8{async _call(c){return new H6(await super._call(c))}}class O8 extends T0{}class v4 extends O8{}class Qj extends O8{async _call(c){return new H6(await super._call(c))}}class G8 extends T0{}class Cj extends G8{}class Bj extends G8{async _call(c){return new H6(await super._call(c))}}class Z8 extends T0{}class q8 extends Z8{}class hj extends Z8{async _call(c){return new H6(await super._call(c))}}class cj extends T0{}class mj extends cj{}class R4 extends T0{}class pj extends R4{}class Aj extends R4{async _call(c){return new gj(await super._call(c))}}class gj extends s0{constructor({logits:c,pred_boxes:L0}){super(),this.logits=c,this.pred_boxes=L0}}class V8 extends T0{}class uj extends V8{async get_image_embeddings({pixel_values:c}){return await E0(this,{pixel_values:c})}async forward(c){if(c.image_embeddings&&c.image_positional_embeddings||(c={...c,...await this.get_image_embeddings(c)}),!c.input_labels&&c.input_points){let K0=c.input_points.dims.slice(0,-1),C0=K0.reduce((o0,G5)=>o0*G5,1);c.input_labels=new Y.Tensor("int64",new BigInt64Array(C0).fill(1n),K0)}let L0={image_embeddings:c.image_embeddings,image_positional_embeddings:c.image_positional_embeddings};return c.input_points&&(L0.input_points=c.input_points),c.input_labels&&(L0.input_labels=c.input_labels),c.input_boxes&&(L0.input_boxes=c.input_boxes),await q0(this.sessions.prompt_encoder_mask_decoder,L0)}async _call(c){return new dj(await super._call(c))}}class dj extends s0{constructor({iou_scores:c,pred_masks:L0}){super(),this.iou_scores=c,this.pred_masks=L0}}class h4 extends T0{}class lj extends h4{}class oj extends h4{}class N8 extends T0{}class sj extends N8{}class ij extends N8{}class c2 extends T0{}class aj extends c2{}class rj extends c2{async _call(c){return new L2(await super._call(c))}}class nj extends c2{async _call(c){return new H6(await super._call(c))}}class tj extends c2{async _call(c){return new F9(await super._call(c))}}class J8 extends T0{}class ej extends J8{}class $O extends J8{async _call(c){return new F9(await super._call(c))}}class jO extends T0{}class OO extends jO{}class c4 extends T0{}class GO extends c4{}class ZO extends c4{async _call(c){return new L2(await super._call(c))}}class qO extends c4{async _call(c){return new H6(await super._call(c))}}class U4 extends T0{}class VO extends U4{}class NO extends U4{async _call(c){return new L2(await super._call(c))}}class H4 extends U4{async _call(c){return new H6(await super._call(c))}}class v8 extends U4{async _call(c){return new F9(await super._call(c))}}class x4 extends T0{}class R8 extends x4{}class U8 extends x4{async _call(c){return new L2(await super._call(c))}}class JO extends x4{async _call(c){return new H6(await super._call(c))}}class KG extends T0{}class H8 extends c2{}class x8 extends c2{async _call(c){return new L2(await super._call(c))}}class vO extends c2{async _call(c){return new H6(await super._call(c))}}class e3 extends T0{}class L8 extends e3{}class RO extends e3{async _call(c){return new L2(await super._call(c))}}class UO extends e3{async _call(c){return new H6(await super._call(c))}}class _8 extends e3{async _call(c){return new S4(await super._call(c))}}class HO extends e3{async _call(c){return new F9(await super._call(c))}}class xO extends T0{}class LO extends xO{}class m4 extends T0{}class bG extends m4{}class _O extends m4{}class YO extends m4{async generate_speech(c,L0,{threshold:K0=0.5,minlenratio:C0=0,maxlenratio:o0=20,vocoder:G5=null}={}){let X5={input_ids:c},{encoder_outputs:K5,encoder_attention_mask:u5}=await E0(this,X5),a5=K5.dims[1]/this.config.reduction_factor,m5=Math.floor(a5*o0),F6=Math.floor(a5*C0),A5=this.config.num_mel_bins,i6=[],O6=null,e5=null,E6=0;for(;;){++E6;let l9=M0(!!e5),i9;i9=e5?e5.output_sequence_out:new Y.Tensor("float32",new Float32Array(A5),[1,1,A5]);let q={use_cache_branch:l9,output_sequence:i9,encoder_attention_mask:u5,speaker_embeddings:L0,encoder_hidden_states:K5};this.addPastKeyValues(q,O6),e5=await q0(this.sessions.decoder_model_merged,q),O6=this.getPastKeyValues(e5,O6);let{prob:v,spectrum:x}=e5;if(i6.push(x),E6>=F6&&(Array.from(v.data).filter((P)=>P>=K0).length>0||E6>=m5))break}let a6=(0,Y.cat)(i6),{waveform:H9}=await q0(G5.sessions.model,{spectrogram:a6});return{spectrogram:a6,waveform:H9}}}class SO extends T0{main_input_name="spectrogram"}class PO extends T0{}class XO extends PO{}class Y8 extends T0{}class TO extends Y8{}class S8 extends Y8{}class p4 extends T0{}class FO extends p4{}class yO extends p4{}class P8 extends T0{}class zO extends P8{}class kO extends P8{}class A4 extends T0{}class X8 extends A4{}class IO extends A4{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"text_model"})}}class DO extends A4{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"audio_model"})}}class WO extends T0{}class T8 extends WO{async _call(c){return new UG(await super._call(c))}}class g4 extends T0{}class fG extends g4{}class MO extends g4{}class KO extends g4{}class u4 extends T0{}class bO extends u4{}class fO extends u4{}class F8 extends T0{}class wO extends F8{}class EO extends F8{async _call(c){return new H6(await super._call(c))}}class y8 extends T0{}class wG extends y8{}class EG extends y8{}class z8 extends T0{forward_params=["input_ids","attention_mask","encoder_outputs","decoder_input_ids","decoder_attention_mask","past_key_values"];_apply_and_filter_by_delay_pattern_mask(c){let[L0,K0]=c.dims,C0=this.config.decoder.num_codebooks,o0=K0-C0,G5=0;for(let u5=0;u50&&a5<=o0&&(c.data[G5++]=c.data[u5])}let X5=Math.floor(L0/C0),K5=G5/(X5*C0);return new Y.Tensor(c.type,c.data.slice(0,G5),[X5,C0,K5])}prepare_inputs_for_generation(c,L0,K0){let C0=structuredClone(c);for(let o0=0;o0=G5&&(C0[o0][G5]=BigInt(this.config.decoder.pad_token_id));return K0.guidance_scale!==null&&K0.guidance_scale>1&&(C0=C0.concat(C0)),super.prepare_inputs_for_generation(C0,L0,K0)}async generate(c){let L0=await super.generate(c),K0=this._apply_and_filter_by_delay_pattern_mask(L0).unsqueeze_(0),{audio_values:C0}=await q0(this.sessions.encodec_decode,{audio_codes:K0});return C0}}class d4 extends T0{}class QO extends d4{}class L4 extends d4{async _call(c){return new H6(await super._call(c))}}class CO extends d4{}class _4 extends T0{}class BO extends _4{}class hO extends _4{async _call(c){return new H6(await super._call(c))}}class cO extends _4{}class l4 extends T0{}class mO extends l4{}class pO extends l4{async _call(c){return new H6(await super._call(c))}}class AO extends l4{}class o4 extends T0{}class k8 extends o4{}class gO extends o4{async _call(c){return new H6(await super._call(c))}}class uO extends o4{}class dO extends T0{}class lO extends dO{}class oO extends T0{}class sO extends oO{forward_params=["input_ids","pixel_values","images_seq_mask","images_emb_mask","attention_mask","position_ids","past_key_values"];constructor(...c){super(...c),this._generation_mode="text"}async forward(c){let L0=this._generation_mode??"text",K0;if(L0!=="text"&&c.past_key_values){let K5=this.sessions.gen_img_embeds,u5=(0,J.pick)({image_ids:c.input_ids},K5.inputNames);K0=await q0(K5,u5)}else{let K5=this.sessions.prepare_inputs_embeds,u5=(0,J.pick)(c,K5.inputNames);K0=await q0(K5,u5)}let C0={...c,...K0},o0=await N0(this,C0),G5=this.sessions[L0==="text"?"lm_head":"gen_head"];if(!G5)throw Error(`Unable to find "${G5}" generation head`);let X5=await q0(G5,(0,J.pick)(o0,G5.inputNames));return{...K0,...o0,...X5}}async generate(c){return this._generation_mode="text",super.generate(c)}async generate_images(c){this._generation_mode="image";let L0=(c.inputs??c[this.main_input_name]).dims[1],K0=(await super.generate(c)).slice(null,[L0,null]),C0=this.sessions.image_decode,{decoded_image:o0}=await q0(C0,{generated_tokens:K0}),G5=o0.add_(1).mul_(127.5).clamp_(0,255).to("uint8"),X5=[];for(let K5 of G5){let u5=S.RawImage.fromTensor(K5);X5.push(u5)}return X5}}class iO extends s0{constructor({char_logits:c,bpe_logits:L0,wp_logits:K0}){super(),this.char_logits=c,this.bpe_logits=L0,this.wp_logits=K0}get logits(){return[this.char_logits,this.bpe_logits,this.wp_logits]}}class aO extends T0{}class rO extends aO{async _call(c){return new iO(await super._call(c))}}class nO extends T0{}class I8 extends nO{}class v3 extends nO{}class s4 extends T0{}class QG extends s4{}class CG extends s4{}class q6 extends T0{forward_params=["input_ids","attention_mask","position_ids","audio_values","past_key_values"]}class tO extends q6{_merge_input_ids_with_audio_features(c){let L0=c.audio_features.dims.at(-1),K0=c.audio_features.view(-1,L0);return function({audio_token_id:C0,inputs_embeds:o0,audio_features:G5,input_ids:X5,attention_mask:K5}){return P0({modality_token_id:C0,inputs_embeds:o0,modality_features:G5,input_ids:X5,attention_mask:K5})}({audio_token_id:this.config.ignore_index,...c,audio_features:K0})}}class B1 extends T0{main_input_name="input_values";forward_params=["input_values"]}class X6 extends s0{constructor({audio_codes:c}){super(),this.audio_codes=c}}class eO extends s0{constructor({audio_values:c}){super(),this.audio_values=c}}class BG extends B1{async encode(c){return new X6(await q0(this.sessions.encoder_model,c))}async decode(c){return new eO(await q0(this.sessions.decoder_model,c))}}class hG extends B1{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"encoder_model"})}}class D8 extends B1{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"decoder_model"})}}class W8 extends T0{main_input_name="input_values";forward_params=["input_values"]}class S9 extends s0{constructor({audio_codes:c}){super(),this.audio_codes=c}}class T6 extends s0{constructor({audio_values:c}){super(),this.audio_values=c}}class m2 extends W8{async encode(c){return new S9(await q0(this.sessions.encoder_model,c))}async decode(c){return new T6(await q0(this.sessions.decoder_model,c))}}class cG extends W8{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"encoder_model"})}}class M8 extends W8{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"decoder_model"})}}class K8 extends T0{main_input_name="input_values";forward_params=["input_values"]}class b8 extends K8{async encode(c){return await q0(this.sessions.encoder_model,c)}async decode(c){return await q0(this.sessions.decoder_model,c)}}class mG extends K8{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"encoder_model"})}}class pG extends K8{static async from_pretrained(c,L0={}){return super.from_pretrained(c,{...L0,model_file_name:L0.model_file_name??"decoder_model"})}}class u6{static MODEL_CLASS_MAPPINGS=null;static BASE_IF_FAIL=!1;static async from_pretrained(c,{progress_callback:L0=null,config:K0=null,cache_dir:C0=null,local_files_only:o0=!1,revision:G5="main",model_file_name:X5=null,subfolder:K5="onnx",device:u5=null,dtype:a5=null,use_external_data_format:m5=null,session_options:F6={}}={}){let A5={progress_callback:L0,config:K0,cache_dir:C0,local_files_only:o0,revision:G5,model_file_name:X5,subfolder:K5,device:u5,dtype:a5,use_external_data_format:m5,session_options:F6};if(A5.config=await G.AutoConfig.from_pretrained(c,A5),!this.MODEL_CLASS_MAPPINGS)throw Error("`MODEL_CLASS_MAPPINGS` not implemented for this type of `AutoClass`: "+this.name);let i6=A5.config.model_type;for(let O6 of this.MODEL_CLASS_MAPPINGS){let e5=O6.get(i6);if(!e5){for(let E6 of O6.values())if(E6[0]===i6){e5=E6;break}if(!e5)continue}return await e5[1].from_pretrained(c,A5)}if(this.BASE_IF_FAIL)return Uq.has(i6)||console.warn(`Unknown model class "${i6}", attempting to construct from base class.`),await T0.from_pretrained(c,A5);throw Error(`Unsupported model type: ${i6}`)}}let kV=new Map([["bert",["BertModel",d5]],["modernbert",["ModernBertModel",y0]],["nomic_bert",["NomicBertModel",N5]],["roformer",["RoFormerModel",Q5]],["electra",["ElectraModel",z6]],["esm",["EsmModel",P1]],["convbert",["ConvBertModel",c6]],["camembert",["CamembertModel",H1]],["deberta",["DebertaModel",D9]],["deberta-v2",["DebertaV2Model",r9]],["mpnet",["MPNetModel",p]],["albert",["AlbertModel",_6]],["distilbert",["DistilBertModel",n9]],["roberta",["RobertaModel",B3]],["xlm",["XLMModel",c3]],["xlm-roberta",["XLMRobertaModel",u3]],["clap",["ClapModel",X8]],["clip",["CLIPModel",e9]],["clipseg",["CLIPSegModel",t1]],["chinese_clip",["ChineseCLIPModel",Z3]],["siglip",["SiglipModel",W2]],["jina_clip",["JinaCLIPModel",n1]],["mobilebert",["MobileBertModel",W1]],["squeezebert",["SqueezeBertModel",F5]],["wav2vec2",["Wav2Vec2Model",aj]],["wav2vec2-bert",["Wav2Vec2BertModel",R8]],["unispeech",["UniSpeechModel",GO]],["unispeech-sat",["UniSpeechSatModel",VO]],["hubert",["HubertModel",H8]],["wavlm",["WavLMModel",L8]],["audio-spectrogram-transformer",["ASTModel",l3]],["vits",["VitsModel",T8]],["pyannote",["PyAnnoteModel",ej]],["wespeaker-resnet",["WeSpeakerResNetModel",OO]],["detr",["DetrModel",a$]],["rt_detr",["RTDetrModel",t$]],["rt_detr_v2",["RTDetrV2Model",$j]],["rf_detr",["RFDetrModel",E4]],["d_fine",["DFineModel",Zj]],["table-transformer",["TableTransformerModel",qj]],["vit",["ViTModel",f$]],["ijepa",["IJepaModel",K7]],["pvt",["PvtModel",C$]],["vit_msn",["ViTMSNModel",h$]],["vit_mae",["ViTMAEModel",M4]],["groupvit",["GroupViTModel",q4]],["fastvit",["FastViTModel",C7]],["mobilevit",["MobileViTModel",g$]],["mobilevitv2",["MobileViTV2Model",d$]],["owlvit",["OwlViTModel",h7]],["owlv2",["Owlv2Model",m7]],["beit",["BeitModel",s$]],["deit",["DeiTModel",Jj]],["hiera",["HieraModel",Rj]],["convnext",["ConvNextModel",Ej]],["convnextv2",["ConvNextV2Model",v4]],["dinov2",["Dinov2Model",Cj]],["dinov2_with_registers",["Dinov2WithRegistersModel",q8]],["resnet",["ResNetModel",Hj]],["swin",["SwinModel",Lj]],["swin2sr",["Swin2SRModel",Sj]],["donut-swin",["DonutSwinModel",$1]],["yolos",["YolosModel",pj]],["dpt",["DPTModel",Xj]],["glpn",["GLPNModel",bj]],["hifigan",["SpeechT5HifiGan",SO]],["efficientnet",["EfficientNetModel",wO]],["decision_transformer",["DecisionTransformerModel",lO]],["patchtst",["PatchTSTForPrediction",I8]],["patchtsmixer",["PatchTSMixerForPrediction",QG]],["mobilenet_v1",["MobileNetV1Model",QO]],["mobilenet_v2",["MobileNetV2Model",BO]],["mobilenet_v3",["MobileNetV3Model",mO]],["mobilenet_v4",["MobileNetV4Model",k8]],["maskformer",["MaskFormerModel",Mj]],["mgp-str",["MgpstrForSceneTextRecognition",rO]],["style_text_to_speech_2",["StyleTextToSpeech2Model",LO]]]),IV=new Map([["t5",["T5Model",Z9]],["longt5",["LongT5Model",P6]],["mt5",["MT5Model",N6]],["bart",["BartModel",k6]],["mbart",["MBartModel",B5]],["marian",["MarianModel",lj]],["whisper",["WhisperModel",K1]],["m2m_100",["M2M100Model",sj]],["blenderbot",["BlenderbotModel",s2]],["blenderbot-small",["BlenderbotSmallModel",a2]]]),DV=new Map([["mimi",["MimiModel",BG]],["dac",["DacModel",m2]],["snac",["SnacModel",b8]]]),Y4=new Map([["bloom",["BloomModel",M$]],["jais",["JAISModel",f2]],["gpt2",["GPT2Model",c9]],["gptj",["GPTJModel",b6]],["gpt_bigcode",["GPTBigCodeModel",C2]],["gpt_neo",["GPTNeoModel",R2]],["gpt_neox",["GPTNeoXModel",O2]],["codegen",["CodeGenModel",_]],["llama",["LlamaModel",B]],["exaone",["ExaoneModel",J6]],["olmo",["OlmoModel",V$]],["olmo2",["Olmo2Model",J$]],["mobilellm",["MobileLLMModel",D4]],["granite",["GraniteModel",R$]],["cohere",["CohereModel",H$]],["gemma",["GemmaModel",S7]],["gemma2",["Gemma2Model",x$]],["gemma3_text",["Gemma3Model",_$]],["helium",["HeliumModel",z0]],["glm",["GlmModel",Z5]],["openelm",["OpenELMModel",S$]],["qwen2",["Qwen2Model",X$]],["qwen3",["Qwen3Model",T$]],["phi",["PhiModel",k$]],["phi3",["Phi3Model",D$]],["mpt",["MptModel",b$]],["opt",["OPTModel",V3]],["mistral",["MistralModel",TO]],["starcoder2",["Starcoder2Model",FO]],["falcon",["FalconModel",zO]],["stablelm",["StableLmModel",bO]]]),f8=new Map([["speecht5",["SpeechT5ForSpeechToText",_O]],["whisper",["WhisperForConditionalGeneration",b1]],["lite-whisper",["LiteWhisperForConditionalGeneration",$3]],["moonshine",["MoonshineForConditionalGeneration",o3]]]),lZ=new Map([["speecht5",["SpeechT5ForTextToSpeech",YO]]]),$G=new Map([["vits",["VitsModel",T8]],["musicgen",["MusicgenForConditionalGeneration",z8]]]),jG=new Map([["bert",["BertForSequenceClassification",$5]],["modernbert",["ModernBertForSequenceClassification",I0]],["roformer",["RoFormerForSequenceClassification",K6]],["electra",["ElectraForSequenceClassification",E5]],["esm",["EsmForSequenceClassification",u1]],["convbert",["ConvBertForSequenceClassification",y9]],["camembert",["CamembertForSequenceClassification",o9]],["deberta",["DebertaForSequenceClassification",J9]],["deberta-v2",["DebertaV2ForSequenceClassification",S1]],["mpnet",["MPNetForSequenceClassification",X0]],["albert",["AlbertForSequenceClassification",O9]],["distilbert",["DistilBertForSequenceClassification",v9]],["roberta",["RobertaForSequenceClassification",n2]],["xlm",["XLMForSequenceClassification",p3]],["xlm-roberta",["XLMRobertaForSequenceClassification",t2]],["bart",["BartForSequenceClassification",R9]],["mbart",["MBartForSequenceClassification",u0]],["mobilebert",["MobileBertForSequenceClassification",R1]],["squeezebert",["SqueezeBertForSequenceClassification",b5]]]),oZ=new Map([["bert",["BertForTokenClassification",V5]],["modernbert",["ModernBertForTokenClassification",w0]],["roformer",["RoFormerForTokenClassification",Y5]],["electra",["ElectraForTokenClassification",v5]],["esm",["EsmForTokenClassification",d1]],["convbert",["ConvBertForTokenClassification",V6]],["camembert",["CamembertForTokenClassification",L1]],["deberta",["DebertaForTokenClassification",Y1]],["deberta-v2",["DebertaV2ForTokenClassification",A1]],["mpnet",["MPNetForTokenClassification",W0]],["distilbert",["DistilBertForTokenClassification",L6]],["roberta",["RobertaForTokenClassification",A9]],["xlm",["XLMForTokenClassification",A3]],["xlm-roberta",["XLMRobertaForTokenClassification",F2]]]),AG=new Map([["t5",["T5ForConditionalGeneration",s9]],["longt5",["LongT5ForConditionalGeneration",Q6]],["mt5",["MT5ForConditionalGeneration",s6]],["bart",["BartForConditionalGeneration",E9]],["mbart",["MBartForConditionalGeneration",U9]],["marian",["MarianMTModel",oj]],["m2m_100",["M2M100ForConditionalGeneration",ij]],["blenderbot",["BlenderbotForConditionalGeneration",X1]],["blenderbot-small",["BlenderbotSmallForConditionalGeneration",T2]]]),gG=new Map([["bloom",["BloomForCausalLM",K$]],["gpt2",["GPT2LMHeadModel",v1]],["jais",["JAISLMHeadModel",w2]],["gptj",["GPTJForCausalLM",Q2]],["gpt_bigcode",["GPTBigCodeForCausalLM",B2]],["gpt_neo",["GPTNeoForCausalLM",E2]],["gpt_neox",["GPTNeoXForCausalLM",E1]],["codegen",["CodeGenForCausalLM",y]],["llama",["LlamaForCausalLM",g]],["exaone",["ExaoneForCausalLM",q9]],["olmo",["OlmoForCausalLM",N$]],["olmo2",["Olmo2ForCausalLM",v$]],["mobilellm",["MobileLLMForCausalLM",q$]],["granite",["GraniteForCausalLM",U$]],["cohere",["CohereForCausalLM",_7]],["gemma",["GemmaForCausalLM",P7]],["gemma2",["Gemma2ForCausalLM",L$]],["gemma3_text",["Gemma3ForCausalLM",Y$]],["helium",["HeliumForCausalLM",f0]],["glm",["GlmForCausalLM",M5]],["openelm",["OpenELMForCausalLM",P$]],["qwen2",["Qwen2ForCausalLM",C1]],["qwen3",["Qwen3ForCausalLM",F$]],["phi",["PhiForCausalLM",I$]],["phi3",["Phi3ForCausalLM",W$]],["mpt",["MptForCausalLM",q3]],["opt",["OPTForCausalLM",M7]],["mbart",["MBartForCausalLM",h5]],["mistral",["MistralForCausalLM",S8]],["starcoder2",["Starcoder2ForCausalLM",yO]],["falcon",["FalconForCausalLM",kO]],["trocr",["TrOCRForCausalLM",XO]],["stablelm",["StableLmForCausalLM",fO]],["phi3_v",["Phi3VForCausalLM",T1]]]),WV=new Map([["multi_modality",["MultiModalityCausalLM",sO]]]),sZ=new Map([["bert",["BertForMaskedLM",T5]],["modernbert",["ModernBertForMaskedLM",O0]],["roformer",["RoFormerForMaskedLM",S5]],["electra",["ElectraForMaskedLM",_5]],["esm",["EsmForMaskedLM",g1]],["convbert",["ConvBertForMaskedLM",Y9]],["camembert",["CamembertForMaskedLM",x1]],["deberta",["DebertaForMaskedLM",p9]],["deberta-v2",["DebertaV2ForMaskedLM",G9]],["mpnet",["MPNetForMaskedLM",x0]],["albert",["AlbertForMaskedLM",k9]],["distilbert",["DistilBertForMaskedLM",p6]],["roberta",["RobertaForMaskedLM",r2]],["xlm",["XLMWithLMHeadModel",m3]],["xlm-roberta",["XLMRobertaForMaskedLM",d3]],["mobilebert",["MobileBertForMaskedLM",M1]],["squeezebert",["SqueezeBertForMaskedLM",W5]]]),iZ=new Map([["bert",["BertForQuestionAnswering",U6]],["roformer",["RoFormerForQuestionAnswering",w6]],["electra",["ElectraForQuestionAnswering",o6]],["convbert",["ConvBertForQuestionAnswering",a9]],["camembert",["CamembertForQuestionAnswering",_1]],["deberta",["DebertaForQuestionAnswering",t6]],["deberta-v2",["DebertaV2ForQuestionAnswering",x9]],["mpnet",["MPNetForQuestionAnswering",h0]],["albert",["AlbertForQuestionAnswering",g6]],["distilbert",["DistilBertForQuestionAnswering",m6]],["roberta",["RobertaForQuestionAnswering",h3]],["xlm",["XLMForQuestionAnswering",g3]],["xlm-roberta",["XLMRobertaForQuestionAnswering",g9]],["mobilebert",["MobileBertForQuestionAnswering",l1]],["squeezebert",["SqueezeBertForQuestionAnswering",P5]]]),uG=new Map([["vision-encoder-decoder",["VisionEncoderDecoderModel",h9]],["idefics3",["Idefics3ForConditionalGeneration",k2]],["smolvlm",["SmolVLMForConditionalGeneration",a1]]]),aZ=new Map([["llava",["LlavaForConditionalGeneration",f1]],["llava_onevision",["LlavaOnevisionForConditionalGeneration",j3]],["moondream1",["Moondream1ForConditionalGeneration",t9]],["florence2",["Florence2ForConditionalGeneration",i3]],["qwen2-vl",["Qwen2VLForConditionalGeneration",z$]],["idefics3",["Idefics3ForConditionalGeneration",k2]],["smolvlm",["SmolVLMForConditionalGeneration",a1]],["paligemma",["PaliGemmaForConditionalGeneration",r3]]]),rZ=new Map([["ultravox",["UltravoxModel",tO]]]),MV=new Map([["vision-encoder-decoder",["VisionEncoderDecoderModel",h9]]]),nZ=new Map([["vit",["ViTForImageClassification",w$]],["ijepa",["IJepaForImageClassification",E$]],["pvt",["PvtForImageClassification",f7]],["vit_msn",["ViTMSNForImageClassification",c$]],["fastvit",["FastViTForImageClassification",m$]],["mobilevit",["MobileViTForImageClassification",u$]],["mobilevitv2",["MobileViTV2ForImageClassification",K4]],["beit",["BeitForImageClassification",i$]],["deit",["DeiTForImageClassification",vj]],["hiera",["HieraForImageClassification",Uj]],["convnext",["ConvNextForImageClassification",j8]],["convnextv2",["ConvNextV2ForImageClassification",Qj]],["dinov2",["Dinov2ForImageClassification",Bj]],["dinov2_with_registers",["Dinov2WithRegistersForImageClassification",hj]],["resnet",["ResNetForImageClassification",xj]],["swin",["SwinForImageClassification",_j]],["segformer",["SegformerForImageClassification",MO]],["efficientnet",["EfficientNetForImageClassification",EO]],["mobilenet_v1",["MobileNetV1ForImageClassification",L4]],["mobilenet_v2",["MobileNetV2ForImageClassification",hO]],["mobilenet_v3",["MobileNetV3ForImageClassification",pO]],["mobilenet_v4",["MobileNetV4ForImageClassification",gO]]]),tZ=new Map([["detr",["DetrForObjectDetection",r$]],["rt_detr",["RTDetrForObjectDetection",e$]],["rt_detr_v2",["RTDetrV2ForObjectDetection",jj]],["rf_detr",["RFDetrForObjectDetection",d7]],["d_fine",["DFineForObjectDetection",o7]],["table-transformer",["TableTransformerForObjectDetection",Vj]],["yolos",["YolosForObjectDetection",Aj]]]),eZ=new Map([["owlvit",["OwlViTForObjectDetection",l$]],["owlv2",["Owlv2ForObjectDetection",o$]],["grounding-dino",["GroundingDinoForObjectDetection",mj]]]),i4=new Map([["detr",["DetrForSegmentation",f4]],["clipseg",["CLIPSegForImageSegmentation",e1]]]),$q=new Map([["segformer",["SegformerForSemanticSegmentation",KO]],["sapiens",["SapiensForSemanticSegmentation",zj]],["swin",["SwinForSemanticSegmentation",Yj]],["mobilenet_v1",["MobileNetV1ForSemanticSegmentation",CO]],["mobilenet_v2",["MobileNetV2ForSemanticSegmentation",cO]],["mobilenet_v3",["MobileNetV3ForSemanticSegmentation",AO]],["mobilenet_v4",["MobileNetV4ForSemanticSegmentation",uO]]]),jq=new Map([["detr",["DetrForSegmentation",f4]],["maskformer",["MaskFormerForInstanceSegmentation",Kj]]]),Oq=new Map([["sam",["SamModel",uj]]]),dG=new Map([["wav2vec2",["Wav2Vec2ForCTC",rj]],["wav2vec2-bert",["Wav2Vec2BertForCTC",U8]],["unispeech",["UniSpeechForCTC",ZO]],["unispeech-sat",["UniSpeechSatForCTC",NO]],["wavlm",["WavLMForCTC",RO]],["hubert",["HubertForCTC",x8]]]),lG=new Map([["wav2vec2",["Wav2Vec2ForSequenceClassification",nj]],["wav2vec2-bert",["Wav2Vec2BertForSequenceClassification",JO]],["unispeech",["UniSpeechForSequenceClassification",qO]],["unispeech-sat",["UniSpeechSatForSequenceClassification",H4]],["wavlm",["WavLMForSequenceClassification",UO]],["hubert",["HubertForSequenceClassification",vO]],["audio-spectrogram-transformer",["ASTForAudioClassification",e2]]]),oG=new Map([["wavlm",["WavLMForXVector",_8]]]),Gq=new Map([["unispeech-sat",["UniSpeechSatForAudioFrameClassification",v8]],["wavlm",["WavLMForAudioFrameClassification",HO]],["wav2vec2",["Wav2Vec2ForAudioFrameClassification",tj]],["pyannote",["PyAnnoteForAudioFrameClassification",$O]]]),Zq=new Map([["vitmatte",["VitMatteForImageMatting",A$]]]),KV=new Map([["patchtst",["PatchTSTForPrediction",v3]],["patchtsmixer",["PatchTSMixerForPrediction",CG]]]),qq=new Map([["swin2sr",["Swin2SRForImageSuperResolution",Pj]]]),Vq=new Map([["dpt",["DPTForDepthEstimation",Tj]],["depth_anything",["DepthAnythingForDepthEstimation",yj]],["glpn",["GLPNForDepthEstimation",fj]],["sapiens",["SapiensForDepthEstimation",kj]],["depth_pro",["DepthProForDepthEstimation",x2]],["metric3d",["Metric3DForDepthEstimation",J3]],["metric3dv2",["Metric3Dv2ForDepthEstimation",Wj]]]),Nq=new Map([["sapiens",["SapiensForNormalEstimation",Ij]]]),Jq=new Map([["vitpose",["VitPoseForPoseEstimation",b7]]]),vq=new Map([["clip",["CLIPVisionModelWithProjection",D2]],["siglip",["SiglipVisionModel",K2]],["jina_clip",["JinaCLIPVisionModel",i5]]]),Rq=[[kV,T],[IV,W],[Y4,A],[DV,i],[jG,T],[oZ,T],[AG,E],[f8,E],[gG,A],[WV,V0],[sZ,T],[iZ,T],[uG,Q],[aZ,r],[rZ,$0],[nZ,T],[i4,T],[jq,T],[$q,T],[Zq,T],[KV,T],[qq,T],[Vq,T],[Nq,T],[Jq,T],[tZ,T],[eZ,T],[Oq,l],[dG,T],[lG,T],[lZ,E],[$G,T],[oG,T],[Gq,T],[vq,T]];for(let[c,L0]of Rq)for(let[K0,C0]of c.values())G0.set(K0,L0),F0.set(C0,K0),S0.set(K0,C0);let bV=[["MusicgenForConditionalGeneration",z8,e],["Phi3VForCausalLM",T1,v0],["CLIPTextModelWithProjection",r1,T],["SiglipTextModel",M2,T],["JinaCLIPTextModel",o5,T],["ClapTextModelWithProjection",IO,T],["ClapAudioModelWithProjection",DO,T],["DacEncoderModel",cG,T],["DacDecoderModel",M8,T],["MimiEncoderModel",hG,T],["MimiDecoderModel",D8,T],["SnacEncoderModel",mG,T],["SnacDecoderModel",pG,T]];for(let[c,L0,K0]of bV)G0.set(c,K0),F0.set(L0,c),S0.set(c,L0);let Uq=new Map([["modnet",i4],["birefnet",i4],["isnet",i4],["ben",i4]]);for(let[c,L0]of Uq.entries())L0.set(c,["PreTrainedModel",T0]),G0.set(c,T),F0.set(T0,c),S0.set(c,T0);class Hq extends u6{static MODEL_CLASS_MAPPINGS=Rq.map((c)=>c[0]);static BASE_IF_FAIL=!0}class xq extends u6{static MODEL_CLASS_MAPPINGS=[jG]}class Lq extends u6{static MODEL_CLASS_MAPPINGS=[oZ]}class _q extends u6{static MODEL_CLASS_MAPPINGS=[AG]}class Yq extends u6{static MODEL_CLASS_MAPPINGS=[f8]}class Sq extends u6{static MODEL_CLASS_MAPPINGS=[lZ]}class Pq extends u6{static MODEL_CLASS_MAPPINGS=[$G]}class sG extends u6{static MODEL_CLASS_MAPPINGS=[gG]}class iG extends u6{static MODEL_CLASS_MAPPINGS=[sZ]}class aG extends u6{static MODEL_CLASS_MAPPINGS=[iZ]}class rG extends u6{static MODEL_CLASS_MAPPINGS=[uG]}class nG extends u6{static MODEL_CLASS_MAPPINGS=[nZ]}class Xq extends u6{static MODEL_CLASS_MAPPINGS=[i4]}class tG extends u6{static MODEL_CLASS_MAPPINGS=[$q]}class w8 extends u6{static MODEL_CLASS_MAPPINGS=[jq]}class eG extends u6{static MODEL_CLASS_MAPPINGS=[tZ]}class $Z extends u6{static MODEL_CLASS_MAPPINGS=[eZ]}class jZ extends u6{static MODEL_CLASS_MAPPINGS=[Oq]}class OG extends u6{static MODEL_CLASS_MAPPINGS=[dG]}class GG extends u6{static MODEL_CLASS_MAPPINGS=[lG]}class R3 extends u6{static MODEL_CLASS_MAPPINGS=[oG]}class OZ extends u6{static MODEL_CLASS_MAPPINGS=[Gq]}class ZG extends u6{static MODEL_CLASS_MAPPINGS=[MV]}class E8 extends u6{static MODEL_CLASS_MAPPINGS=[Zq]}class qG extends u6{static MODEL_CLASS_MAPPINGS=[qq]}class VG extends u6{static MODEL_CLASS_MAPPINGS=[Vq]}class NG extends u6{static MODEL_CLASS_MAPPINGS=[Nq]}class JG extends u6{static MODEL_CLASS_MAPPINGS=[Jq]}class vG extends u6{static MODEL_CLASS_MAPPINGS=[vq]}class RG extends u6{static MODEL_CLASS_MAPPINGS=[aZ]}class U3 extends u6{static MODEL_CLASS_MAPPINGS=[rZ]}class Z2 extends s0{constructor({logits:c,past_key_values:L0,encoder_outputs:K0,decoder_attentions:C0=null,cross_attentions:o0=null}){super(),this.logits=c,this.past_key_values=L0,this.encoder_outputs=K0,this.decoder_attentions=C0,this.cross_attentions=o0}}class H6 extends s0{constructor({logits:c,...L0}){super(),this.logits=c;let K0=Object.values(L0);K0.length>0&&(this.attentions=K0)}}class S4 extends s0{constructor({logits:c,embeddings:L0}){super(),this.logits=c,this.embeddings=L0}}class F9 extends s0{constructor({logits:c}){super(),this.logits=c}}class W9 extends s0{constructor({logits:c}){super(),this.logits=c}}class d9 extends s0{constructor({start_logits:c,end_logits:L0}){super(),this.start_logits=c,this.end_logits=L0}}class L2 extends s0{constructor({logits:c}){super(),this.logits=c}}class $4 extends s0{constructor({logits:c,past_key_values:L0}){super(),this.logits=c,this.past_key_values=L0}}class H3 extends s0{constructor({alphas:c}){super(),this.alphas=c}}class UG extends s0{constructor({waveform:c,spectrogram:L0}){super(),this.waveform=c,this.spectrogram=L0}}},"./src/models/audio_spectrogram_transformer/feature_extraction_audio_spectrogram_transformer.js":($,j,O)=>{/*!******************************************************************************************************!*\ + !*** ./src/models/audio_spectrogram_transformer/feature_extraction_audio_spectrogram_transformer.js ***! + \******************************************************************************************************/O.r(j),O.d(j,{ASTFeatureExtractor:()=>V});var G=O("./src/base/feature_extraction_utils.js");/*! ../../base/feature_extraction_utils.js */O("./src/utils/tensor.js");/*! ../../utils/tensor.js */var Z=O("./src/utils/audio.js");/*! ../../utils/audio.js */class V extends G.FeatureExtractor{constructor(N){super(N);let J=this.config.sampling_rate,R=(0,Z.mel_filter_bank)(257,this.config.num_mel_bins,20,Math.floor(J/2),J,null,"kaldi",!0);this.mel_filters=R,this.window=(0,Z.window_function)(400,"hann",{periodic:!1}),this.mean=this.config.mean,this.std=this.config.std}async _extract_fbank_features(N,J){return(0,Z.spectrogram)(N,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:0.97,mel_filters:this.mel_filters,log_mel:"log",mel_floor:0.0000001192092955078125,remove_dc_offset:!0,max_num_frames:J,transpose:!0})}async _call(N){(0,G.validate_audio_inputs)(N,"ASTFeatureExtractor");let J=await this._extract_fbank_features(N,this.config.max_length);if(this.config.do_normalize){let R=2*this.std,U=J.data;for(let H=0;H{/*!****************************************************!*\ + !*** ./src/models/auto/feature_extraction_auto.js ***! + \****************************************************/O.r(j),O.d(j,{AutoFeatureExtractor:()=>N});var G=O("./src/utils/constants.js"),Z=O("./src/utils/hub.js");/*! ../../utils/constants.js *//*! ../../utils/hub.js */O("./src/base/feature_extraction_utils.js");/*! ../../base/feature_extraction_utils.js */var V=O("./src/models/feature_extractors.js");/*! ../feature_extractors.js */class N{static async from_pretrained(J,R={}){let U=await(0,Z.getModelJSON)(J,G.FEATURE_EXTRACTOR_NAME,!0,R),H=U.feature_extractor_type,L=V[H];if(!L)throw Error(`Unknown feature_extractor_type: '${H}'. Please report this at ${G.GITHUB_ISSUE_URL}.`);return new L(U)}}},"./src/models/auto/image_processing_auto.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/auto/image_processing_auto.js ***! + \**************************************************/O.r(j),O.d(j,{AutoImageProcessor:()=>J});var G=O("./src/utils/constants.js"),Z=O("./src/utils/hub.js"),V=O("./src/base/image_processors_utils.js"),N=O("./src/models/image_processors.js");/*! ../../utils/constants.js *//*! ../../utils/hub.js *//*! ../../base/image_processors_utils.js *//*! ../image_processors.js */class J{static async from_pretrained(R,U={}){let H=await(0,Z.getModelJSON)(R,G.IMAGE_PROCESSOR_NAME,!0,U),L=H.image_processor_type??H.feature_extractor_type,Y=N[L];return Y||(L!==void 0&&console.warn(`Image processor type '${L}' not found, assuming base ImageProcessor. Please report this at ${G.GITHUB_ISSUE_URL}.`),Y=V.ImageProcessor),new Y(H)}}},"./src/models/auto/processing_auto.js":($,j,O)=>{/*!********************************************!*\ + !*** ./src/models/auto/processing_auto.js ***! + \********************************************/O.r(j),O.d(j,{AutoProcessor:()=>U});var G=O("./src/utils/constants.js"),Z=O("./src/utils/hub.js"),V=O("./src/base/processing_utils.js"),N=O("./src/models/processors.js"),J=O("./src/models/image_processors.js"),R=O("./src/models/feature_extractors.js");/*! ../../utils/constants.js *//*! ../../utils/hub.js *//*! ../../base/processing_utils.js *//*! ../processors.js *//*! ../image_processors.js *//*! ../feature_extractors.js */class U{static async from_pretrained(H,L={}){let Y=await(0,Z.getModelJSON)(H,G.IMAGE_PROCESSOR_NAME,!0,L),{image_processor_type:S,feature_extractor_type:X,processor_class:D}=Y;if(D&&N[D])return N[D].from_pretrained(H,L);if(!S&&!X)throw Error("No `image_processor_type` or `feature_extractor_type` found in the config.");let I={};if(S){let k=J[S];if(!k)throw Error(`Unknown image_processor_type: '${S}'.`);I.image_processor=new k(Y)}if(X){let k=J[X];if(k)I.image_processor=new k(Y);else{let z=R[X];if(!z)throw Error(`Unknown feature_extractor_type: '${X}'.`);I.feature_extractor=new z(Y)}}return new V.Processor({},I)}}},"./src/models/beit/image_processing_beit.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/beit/image_processing_beit.js ***! + \**************************************************/O.r(j),O.d(j,{BeitFeatureExtractor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/bit/image_processing_bit.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/bit/image_processing_bit.js ***! + \************************************************/O.r(j),O.d(j,{BitImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/chinese_clip/image_processing_chinese_clip.js":($,j,O)=>{/*!******************************************************************!*\ + !*** ./src/models/chinese_clip/image_processing_chinese_clip.js ***! + \******************************************************************/O.r(j),O.d(j,{ChineseCLIPFeatureExtractor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/clap/feature_extraction_clap.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/clap/feature_extraction_clap.js ***! + \****************************************************/O.r(j),O.d(j,{ClapFeatureExtractor:()=>V});var G=O("./src/base/feature_extraction_utils.js");/*! ../../base/feature_extraction_utils.js */O("./src/utils/tensor.js");/*! ../../utils/tensor.js */var Z=O("./src/utils/audio.js");/*! ../../utils/audio.js */class V extends G.FeatureExtractor{constructor(N){super(N),this.mel_filters=(0,Z.mel_filter_bank)(this.config.nb_frequency_bins,this.config.feature_size,this.config.frequency_min,this.config.frequency_max,this.config.sampling_rate,null,"htk"),this.mel_filters_slaney=(0,Z.mel_filter_bank)(this.config.nb_frequency_bins,this.config.feature_size,this.config.frequency_min,this.config.frequency_max,this.config.sampling_rate,"slaney","slaney"),this.window=(0,Z.window_function)(this.config.fft_window_size,"hann")}async _get_input_mel(N,J,R,U){let H,L=N.length-J;if(L>0){if(R!=="rand_trunc")throw Error(`Truncation strategy "${R}" not implemented`);{let Y=Math.floor(Math.random()*(L+1));N=N.subarray(Y,Y+J),H=await this._extract_fbank_features(N,this.mel_filters_slaney,this.config.nb_max_samples)}}else{if(L<0){let Y=new Float64Array(J);if(Y.set(N),U==="repeat")for(let S=N.length;S{/*!**************************************************!*\ + !*** ./src/models/clip/image_processing_clip.js ***! + \**************************************************/O.r(j),O.d(j,{CLIPFeatureExtractor:()=>V,CLIPImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/convnext/image_processing_convnext.js":($,j,O)=>{/*!**********************************************************!*\ + !*** ./src/models/convnext/image_processing_convnext.js ***! + \**********************************************************/O.r(j),O.d(j,{ConvNextFeatureExtractor:()=>V,ConvNextImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{constructor(N){super(N),this.crop_pct=this.config.crop_pct??0.875}async resize(N){let J=this.size?.shortest_edge;if(J===void 0)throw Error("Size dictionary must contain 'shortest_edge' key.");if(J<384){let R=Math.floor(J/this.crop_pct),[U,H]=this.get_resize_output_image_size(N,{shortest_edge:R});N=await N.resize(U,H,{resample:this.resample}),N=await N.center_crop(J,J)}else N=await N.resize(J,J,{resample:this.resample});return N}}class V extends Z{}},"./src/models/dac/feature_extraction_dac.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/dac/feature_extraction_dac.js ***! + \**************************************************/O.r(j),O.d(j,{DacFeatureExtractor:()=>Z});var G=O("./src/models/encodec/feature_extraction_encodec.js");/*! ../encodec/feature_extraction_encodec.js */class Z extends G.EncodecFeatureExtractor{}},"./src/models/deit/image_processing_deit.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/deit/image_processing_deit.js ***! + \**************************************************/O.r(j),O.d(j,{DeiTFeatureExtractor:()=>V,DeiTImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/detr/image_processing_detr.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/detr/image_processing_detr.js ***! + \**************************************************/O.r(j),O.d(j,{DetrFeatureExtractor:()=>N,DetrImageProcessor:()=>V});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/tensor.js */class V extends G.ImageProcessor{async _call(J){let R=await super._call(J),U=[R.pixel_values.dims[0],64,64],H=(0,Z.full)(U,1n);return{...R,pixel_mask:H}}post_process_object_detection(...J){return(0,G.post_process_object_detection)(...J)}post_process_panoptic_segmentation(...J){return(0,G.post_process_panoptic_segmentation)(...J)}post_process_instance_segmentation(...J){return(0,G.post_process_instance_segmentation)(...J)}}class N extends V{}},"./src/models/donut/image_processing_donut.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/donut/image_processing_donut.js ***! + \****************************************************/O.r(j),O.d(j,{DonutFeatureExtractor:()=>V,DonutImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{pad_image(N,J,R,U={}){let[H,L,Y]=J,S=this.image_mean;Array.isArray(this.image_mean)||(S=Array(Y).fill(S));let X=this.image_std;Array.isArray(X)||(X=Array(Y).fill(S));let D=S.map((I,k)=>-I/X[k]);return super.pad_image(N,J,R,{center:!0,constant_values:D,...U})}}class V extends Z{}},"./src/models/dpt/image_processing_dpt.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/dpt/image_processing_dpt.js ***! + \************************************************/O.r(j),O.d(j,{DPTFeatureExtractor:()=>V,DPTImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/efficientnet/image_processing_efficientnet.js":($,j,O)=>{/*!******************************************************************!*\ + !*** ./src/models/efficientnet/image_processing_efficientnet.js ***! + \******************************************************************/O.r(j),O.d(j,{EfficientNetImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{constructor(V){super(V),this.include_top=this.config.include_top??!0,this.include_top&&(this.image_std=this.image_std.map((N)=>N*N))}}},"./src/models/encodec/feature_extraction_encodec.js":($,j,O)=>{/*!**********************************************************!*\ + !*** ./src/models/encodec/feature_extraction_encodec.js ***! + \**********************************************************/O.r(j),O.d(j,{EncodecFeatureExtractor:()=>V});var G=O("./src/base/feature_extraction_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/feature_extraction_utils.js *//*! ../../utils/tensor.js */class V extends G.FeatureExtractor{async _call(N){(0,G.validate_audio_inputs)(N,"EncodecFeatureExtractor"),N instanceof Float64Array&&(N=new Float32Array(N));let J=this.config.feature_size;if(N.length%J!==0)throw Error(`The length of the audio data must be a multiple of the number of channels (${J}).`);let R=[1,J,N.length/J];return{input_values:new Z.Tensor("float32",N,R)}}}},"./src/models/feature_extractors.js":($,j,O)=>{/*!******************************************!*\ + !*** ./src/models/feature_extractors.js ***! + \******************************************/O.r(j),O.d(j,{ASTFeatureExtractor:()=>G.ASTFeatureExtractor,ClapFeatureExtractor:()=>V.ClapFeatureExtractor,DacFeatureExtractor:()=>N.DacFeatureExtractor,EncodecFeatureExtractor:()=>Z.EncodecFeatureExtractor,ImageFeatureExtractor:()=>D.ImageProcessor,MoonshineFeatureExtractor:()=>J.MoonshineFeatureExtractor,PyAnnoteFeatureExtractor:()=>R.PyAnnoteFeatureExtractor,SeamlessM4TFeatureExtractor:()=>U.SeamlessM4TFeatureExtractor,SnacFeatureExtractor:()=>H.SnacFeatureExtractor,SpeechT5FeatureExtractor:()=>L.SpeechT5FeatureExtractor,Wav2Vec2FeatureExtractor:()=>Y.Wav2Vec2FeatureExtractor,WeSpeakerFeatureExtractor:()=>S.WeSpeakerFeatureExtractor,WhisperFeatureExtractor:()=>X.WhisperFeatureExtractor});var G=O("./src/models/audio_spectrogram_transformer/feature_extraction_audio_spectrogram_transformer.js"),Z=O("./src/models/encodec/feature_extraction_encodec.js"),V=O("./src/models/clap/feature_extraction_clap.js"),N=O("./src/models/dac/feature_extraction_dac.js"),J=O("./src/models/moonshine/feature_extraction_moonshine.js"),R=O("./src/models/pyannote/feature_extraction_pyannote.js"),U=O("./src/models/seamless_m4t/feature_extraction_seamless_m4t.js"),H=O("./src/models/snac/feature_extraction_snac.js"),L=O("./src/models/speecht5/feature_extraction_speecht5.js"),Y=O("./src/models/wav2vec2/feature_extraction_wav2vec2.js"),S=O("./src/models/wespeaker/feature_extraction_wespeaker.js"),X=O("./src/models/whisper/feature_extraction_whisper.js"),D=O("./src/base/image_processors_utils.js");/*! ./audio_spectrogram_transformer/feature_extraction_audio_spectrogram_transformer.js *//*! ./encodec/feature_extraction_encodec.js *//*! ./clap/feature_extraction_clap.js *//*! ./dac/feature_extraction_dac.js *//*! ./moonshine/feature_extraction_moonshine.js *//*! ./pyannote/feature_extraction_pyannote.js *//*! ./seamless_m4t/feature_extraction_seamless_m4t.js *//*! ./snac/feature_extraction_snac.js *//*! ./speecht5/feature_extraction_speecht5.js *//*! ./wav2vec2/feature_extraction_wav2vec2.js *//*! ./wespeaker/feature_extraction_wespeaker.js *//*! ./whisper/feature_extraction_whisper.js *//*! ../base/image_processors_utils.js */},"./src/models/florence2/processing_florence2.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/florence2/processing_florence2.js ***! + \******************************************************/O.r(j),O.d(j,{Florence2Processor:()=>N});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */class N extends G.Processor{static tokenizer_class=V.AutoTokenizer;static image_processor_class=Z.AutoImageProcessor;constructor(J,R){super(J,R);let{tasks_answer_post_processing_type:U,task_prompts_without_inputs:H,task_prompts_with_input:L}=this.image_processor.config;this.tasks_answer_post_processing_type=new Map(Object.entries(U??{})),this.task_prompts_without_inputs=new Map(Object.entries(H??{})),this.task_prompts_with_input=new Map(Object.entries(L??{})),this.regexes={quad_boxes:/(.+?)/gm,bboxes:/([^<]+)?/gm},this.size_per_bin=1000}construct_prompts(J){typeof J=="string"&&(J=[J]);let R=[];for(let U of J)if(this.task_prompts_without_inputs.has(U))R.push(this.task_prompts_without_inputs.get(U));else{for(let[H,L]of this.task_prompts_with_input)if(U.includes(H)){R.push(L.replaceAll("{input}",U).replaceAll(H,""));break}R.length!==J.length&&R.push(U)}return R}post_process_generation(J,R,U){let H=this.tasks_answer_post_processing_type.get(R)??"pure_text",L;switch(J=J.replaceAll("","").replaceAll("",""),H){case"pure_text":L=J;break;case"description_with_bboxes":case"bboxes":case"phrase_grounding":case"ocr":let Y=H==="ocr"?"quad_boxes":"bboxes",S=J.matchAll(this.regexes[Y]),X=[],D=[];for(let[I,k,...z]of S)X.push(k?k.trim():X.at(-1)??""),D.push(z.map((w,T)=>(Number(w)+0.5)/this.size_per_bin*U[T%2]));L={labels:X,[Y]:D};break;default:throw Error(`Task "${R}" (of type "${H}") not yet implemented.`)}return{[R]:L}}async _call(J,R=null,U={}){if(!J&&!R)throw Error("Either text or images must be provided");return{...await this.image_processor(J,U),...R?this.tokenizer(R,U):{}}}}},"./src/models/glpn/image_processing_glpn.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/glpn/image_processing_glpn.js ***! + \**************************************************/O.r(j),O.d(j,{GLPNFeatureExtractor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/grounding_dino/image_processing_grounding_dino.js":($,j,O)=>{/*!**********************************************************************!*\ + !*** ./src/models/grounding_dino/image_processing_grounding_dino.js ***! + \**********************************************************************/O.r(j),O.d(j,{GroundingDinoImageProcessor:()=>V});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/tensor.js */class V extends G.ImageProcessor{async _call(N){let J=await super._call(N),R=J.pixel_values.dims,U=(0,Z.ones)([R[0],R[2],R[3]]);return{...J,pixel_mask:U}}}},"./src/models/grounding_dino/processing_grounding_dino.js":($,j,O)=>{/*!****************************************************************!*\ + !*** ./src/models/grounding_dino/processing_grounding_dino.js ***! + \****************************************************************/O.r(j),O.d(j,{GroundingDinoProcessor:()=>R});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js"),N=O("./src/base/image_processors_utils.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js *//*! ../../base/image_processors_utils.js */function J(U,H){let L=U.dims.at(-1)-1,Y=U.tolist();Y.fill(!1,0,1),Y.fill(!1,L);let S=H.tolist();return Y.map((X,D)=>X?D:null).filter((X)=>X!==null).map((X)=>S[X])}class R extends G.Processor{static tokenizer_class=V.AutoTokenizer;static image_processor_class=Z.AutoImageProcessor;async _call(U,H,L={}){let Y=U?await this.image_processor(U,L):{};return{...H?this.tokenizer(H,L):{},...Y}}post_process_grounded_object_detection(U,H,{box_threshold:L=0.25,text_threshold:Y=0.25,target_sizes:S=null}={}){let{logits:X,pred_boxes:D}=U,I=X.dims[0];if(S!==null&&S.length!==I)throw Error("Make sure that you pass in as many target sizes as the batch dimension of the logits");let k=X.dims.at(1),z=X.sigmoid(),w=z.max(-1).tolist(),T=D.tolist().map((E)=>E.map((Q)=>(0,N.center_to_corners_format)(Q))),W=[];for(let E=0;EV0.map((v0,$0)=>v0*Q[($0+1)%2])));let A=w[E],l=[],r=[],e=[];for(let V0=0;V0{/*!**********************************************************!*\ + !*** ./src/models/idefics3/image_processing_idefics3.js ***! + \**********************************************************/O.r(j),O.d(j,{Idefics3ImageProcessor:()=>V});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/tensor.js */class V extends G.ImageProcessor{constructor(N){super(N),this.do_image_splitting=N.do_image_splitting??!0,this.max_image_size=N.max_image_size}get_resize_for_vision_encoder(N,J){let[R,U]=N.dims.slice(-2),H=U/R;return U>=R?(U=Math.ceil(U/J)*J,R=Math.floor(U/H),R=Math.ceil(R/J)*J):(R=Math.ceil(R/J)*J,U=Math.floor(R*H),U=Math.ceil(U/J)*J),{height:R,width:U}}async _call(N,{do_image_splitting:J=null,return_row_col_info:R=!1}={}){let U;if(Array.isArray(N)){if(N.length===0||!N[0])throw Error("No images provided.");U=Array.isArray(N[0])?N:[N]}else U=[[N]];let H=[],L=[],Y=[],S=[],X=[];for(let E of U){let Q=await Promise.all(E.map((r)=>this.preprocess(r)));S.push(...Q.map((r)=>r.original_size)),X.push(...Q.map((r)=>r.reshaped_input_size)),Q.forEach((r)=>r.pixel_values.unsqueeze_(0));let{longest_edge:A}=this.max_image_size,l;if(J??this.do_image_splitting){let r=Array(Q.length),e=Array(Q.length);l=await Promise.all(Q.map(async(V0,v0)=>{let $0=this.get_resize_for_vision_encoder(V0.pixel_values,A),i=await(0,Z.interpolate_4d)(V0.pixel_values,{size:[$0.height,$0.width]}),{frames:G0,num_splits_h:S0,num_splits_w:F0}=await this.split_image(i,this.max_image_size);return r[v0]=S0,e[v0]=F0,(0,Z.cat)(G0,0)})),L.push(r),Y.push(e)}else{let r=[A,A];l=await Promise.all(Q.map((e)=>(0,Z.interpolate_4d)(e.pixel_values,{size:r}))),L.push(Array(Q.length).fill(0)),Y.push(Array(Q.length).fill(0))}H.push((0,Z.cat)(l,0))}let D=H.length,[I,k,z,w]=H[0].dims,T,W;if(D===1)T=H[0].unsqueeze_(0),W=(0,Z.full)([D,I,z,w],!0);else{let E=Math.max(...H.map((l)=>l.dims.at(0)));W=(0,Z.full)([D,E,z,w],!0);let Q=W.data,A=E*z*w;for(let l=0;lR||Y>U){S=Math.ceil(L/R),X=Math.ceil(Y/U);let D=Math.ceil(L/S),I=Math.ceil(Y/X);for(let w=0;w{/*!****************************************************!*\ + !*** ./src/models/idefics3/processing_idefics3.js ***! + \****************************************************/O.r(j),O.d(j,{Idefics3Processor:()=>R});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */O("./src/utils/image.js");/*! ../../utils/image.js */var N=O("./src/utils/core.js");/*! ../../utils/core.js */function J(U,H,L,Y,S,X){return U===0&&H===0?function(D,I,k,z){return`${I}${z}`+k.repeat(D)+`${I}`}(L,Y,S,X):function(D,I,k,z,w,T){let W="";for(let E=0;E`+w.repeat(D);W+=` +`}return W+=` +${z}${T}`+w.repeat(D)+`${z}`,W}(L,U,H,Y,S,X)}class R extends G.Processor{static image_processor_class=Z.AutoImageProcessor;static tokenizer_class=V.AutoTokenizer;static uses_processor_config=!0;fake_image_token="";image_token="";global_img_token="";async _call(U,H=null,L={}){let Y;L.return_row_col_info??=!0,H&&(Y=await this.image_processor(H,L)),Array.isArray(U)||(U=[U]);let S=Y.rows??[Array(U.length).fill(0)],X=Y.cols??[Array(U.length).fill(0)],D=this.config.image_seq_len,I=[],k=[];for(let z=0;zJ(l,W[r],D,this.fake_image_token,this.image_token,this.global_img_token)),Q=w.split(this.image_token);if(Q.length===0)throw Error("The image token should be present in the text.");let A=Q[0];for(let l=0;l{/*!****************************************!*\ + !*** ./src/models/image_processors.js ***! + \****************************************/O.r(j),O.d(j,{BeitFeatureExtractor:()=>G.BeitFeatureExtractor,BitImageProcessor:()=>Z.BitImageProcessor,CLIPFeatureExtractor:()=>N.CLIPFeatureExtractor,CLIPImageProcessor:()=>N.CLIPImageProcessor,ChineseCLIPFeatureExtractor:()=>V.ChineseCLIPFeatureExtractor,ConvNextFeatureExtractor:()=>J.ConvNextFeatureExtractor,ConvNextImageProcessor:()=>J.ConvNextImageProcessor,DPTFeatureExtractor:()=>L.DPTFeatureExtractor,DPTImageProcessor:()=>L.DPTImageProcessor,DeiTFeatureExtractor:()=>R.DeiTFeatureExtractor,DeiTImageProcessor:()=>R.DeiTImageProcessor,DetrFeatureExtractor:()=>U.DetrFeatureExtractor,DetrImageProcessor:()=>U.DetrImageProcessor,DonutFeatureExtractor:()=>H.DonutFeatureExtractor,DonutImageProcessor:()=>H.DonutImageProcessor,EfficientNetImageProcessor:()=>Y.EfficientNetImageProcessor,GLPNFeatureExtractor:()=>S.GLPNFeatureExtractor,GroundingDinoImageProcessor:()=>X.GroundingDinoImageProcessor,Idefics3ImageProcessor:()=>D.Idefics3ImageProcessor,JinaCLIPImageProcessor:()=>k.JinaCLIPImageProcessor,LlavaOnevisionImageProcessor:()=>z.LlavaOnevisionImageProcessor,Mask2FormerImageProcessor:()=>w.Mask2FormerImageProcessor,MaskFormerFeatureExtractor:()=>T.MaskFormerFeatureExtractor,MaskFormerImageProcessor:()=>T.MaskFormerImageProcessor,MobileNetV1FeatureExtractor:()=>W.MobileNetV1FeatureExtractor,MobileNetV1ImageProcessor:()=>W.MobileNetV1ImageProcessor,MobileNetV2FeatureExtractor:()=>E.MobileNetV2FeatureExtractor,MobileNetV2ImageProcessor:()=>E.MobileNetV2ImageProcessor,MobileNetV3FeatureExtractor:()=>Q.MobileNetV3FeatureExtractor,MobileNetV3ImageProcessor:()=>Q.MobileNetV3ImageProcessor,MobileNetV4FeatureExtractor:()=>A.MobileNetV4FeatureExtractor,MobileNetV4ImageProcessor:()=>A.MobileNetV4ImageProcessor,MobileViTFeatureExtractor:()=>l.MobileViTFeatureExtractor,MobileViTImageProcessor:()=>l.MobileViTImageProcessor,NougatImageProcessor:()=>r.NougatImageProcessor,OwlViTFeatureExtractor:()=>V0.OwlViTFeatureExtractor,OwlViTImageProcessor:()=>V0.OwlViTImageProcessor,Owlv2ImageProcessor:()=>e.Owlv2ImageProcessor,Phi3VImageProcessor:()=>v0.Phi3VImageProcessor,PvtImageProcessor:()=>$0.PvtImageProcessor,Qwen2VLImageProcessor:()=>i.Qwen2VLImageProcessor,RTDetrImageProcessor:()=>G0.RTDetrImageProcessor,SamImageProcessor:()=>S0.SamImageProcessor,SegformerFeatureExtractor:()=>F0.SegformerFeatureExtractor,SegformerImageProcessor:()=>F0.SegformerImageProcessor,SiglipImageProcessor:()=>s.SiglipImageProcessor,SmolVLMImageProcessor:()=>n.SmolVLMImageProcessor,Swin2SRImageProcessor:()=>R0.Swin2SRImageProcessor,VLMImageProcessor:()=>I.VLMImageProcessor,ViTFeatureExtractor:()=>q0.ViTFeatureExtractor,ViTImageProcessor:()=>q0.ViTImageProcessor,VitMatteImageProcessor:()=>p0.VitMatteImageProcessor,VitPoseImageProcessor:()=>Z0.VitPoseImageProcessor,YolosFeatureExtractor:()=>M0.YolosFeatureExtractor,YolosImageProcessor:()=>M0.YolosImageProcessor});var G=O("./src/models/beit/image_processing_beit.js"),Z=O("./src/models/bit/image_processing_bit.js"),V=O("./src/models/chinese_clip/image_processing_chinese_clip.js"),N=O("./src/models/clip/image_processing_clip.js"),J=O("./src/models/convnext/image_processing_convnext.js"),R=O("./src/models/deit/image_processing_deit.js"),U=O("./src/models/detr/image_processing_detr.js"),H=O("./src/models/donut/image_processing_donut.js"),L=O("./src/models/dpt/image_processing_dpt.js"),Y=O("./src/models/efficientnet/image_processing_efficientnet.js"),S=O("./src/models/glpn/image_processing_glpn.js"),X=O("./src/models/grounding_dino/image_processing_grounding_dino.js"),D=O("./src/models/idefics3/image_processing_idefics3.js"),I=O("./src/models/janus/image_processing_janus.js"),k=O("./src/models/jina_clip/image_processing_jina_clip.js"),z=O("./src/models/llava_onevision/image_processing_llava_onevision.js"),w=O("./src/models/mask2former/image_processing_mask2former.js"),T=O("./src/models/maskformer/image_processing_maskformer.js"),W=O("./src/models/mobilenet_v1/image_processing_mobilenet_v1.js"),E=O("./src/models/mobilenet_v2/image_processing_mobilenet_v2.js"),Q=O("./src/models/mobilenet_v3/image_processing_mobilenet_v3.js"),A=O("./src/models/mobilenet_v4/image_processing_mobilenet_v4.js"),l=O("./src/models/mobilevit/image_processing_mobilevit.js"),r=O("./src/models/nougat/image_processing_nougat.js"),e=O("./src/models/owlv2/image_processing_owlv2.js"),V0=O("./src/models/owlvit/image_processing_owlvit.js"),v0=O("./src/models/phi3_v/image_processing_phi3_v.js"),$0=O("./src/models/pvt/image_processing_pvt.js"),i=O("./src/models/qwen2_vl/image_processing_qwen2_vl.js"),G0=O("./src/models/rt_detr/image_processing_rt_detr.js"),S0=O("./src/models/sam/image_processing_sam.js"),F0=O("./src/models/segformer/image_processing_segformer.js"),s=O("./src/models/siglip/image_processing_siglip.js"),n=O("./src/models/smolvlm/image_processing_smolvlm.js"),R0=O("./src/models/swin2sr/image_processing_swin2sr.js"),q0=O("./src/models/vit/image_processing_vit.js"),p0=O("./src/models/vitmatte/image_processing_vitmatte.js"),Z0=O("./src/models/vitpose/image_processing_vitpose.js"),M0=O("./src/models/yolos/image_processing_yolos.js");/*! ./beit/image_processing_beit.js *//*! ./bit/image_processing_bit.js *//*! ./chinese_clip/image_processing_chinese_clip.js *//*! ./clip/image_processing_clip.js *//*! ./convnext/image_processing_convnext.js *//*! ./deit/image_processing_deit.js *//*! ./detr/image_processing_detr.js *//*! ./donut/image_processing_donut.js *//*! ./dpt/image_processing_dpt.js *//*! ./efficientnet/image_processing_efficientnet.js *//*! ./glpn/image_processing_glpn.js *//*! ./grounding_dino/image_processing_grounding_dino.js *//*! ./idefics3/image_processing_idefics3.js *//*! ./janus/image_processing_janus.js *//*! ./jina_clip/image_processing_jina_clip.js *//*! ./llava_onevision/image_processing_llava_onevision.js *//*! ./mask2former/image_processing_mask2former.js *//*! ./maskformer/image_processing_maskformer.js *//*! ./mobilenet_v1/image_processing_mobilenet_v1.js *//*! ./mobilenet_v2/image_processing_mobilenet_v2.js *//*! ./mobilenet_v3/image_processing_mobilenet_v3.js *//*! ./mobilenet_v4/image_processing_mobilenet_v4.js *//*! ./mobilevit/image_processing_mobilevit.js *//*! ./nougat/image_processing_nougat.js *//*! ./owlv2/image_processing_owlv2.js *//*! ./owlvit/image_processing_owlvit.js *//*! ./phi3_v/image_processing_phi3_v.js *//*! ./pvt/image_processing_pvt.js *//*! ./qwen2_vl/image_processing_qwen2_vl.js *//*! ./rt_detr/image_processing_rt_detr.js *//*! ./sam/image_processing_sam.js *//*! ./segformer/image_processing_segformer.js *//*! ./siglip/image_processing_siglip.js *//*! ./smolvlm/image_processing_smolvlm.js *//*! ./swin2sr/image_processing_swin2sr.js *//*! ./vit/image_processing_vit.js *//*! ./vitmatte/image_processing_vitmatte.js *//*! ./vitpose/image_processing_vitpose.js *//*! ./yolos/image_processing_yolos.js */},"./src/models/janus/image_processing_janus.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/janus/image_processing_janus.js ***! + \****************************************************/O.r(j),O.d(j,{VLMImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{constructor(V){super({do_pad:!0,pad_size:{width:V.image_size,height:V.image_size},...V}),this.constant_values=this.config.background_color.map((N)=>N*this.rescale_factor)}pad_image(V,N,J,R){return super.pad_image(V,N,J,{constant_values:this.constant_values,center:!0,...R})}}},"./src/models/janus/processing_janus.js":($,j,O)=>{/*!**********************************************!*\ + !*** ./src/models/janus/processing_janus.js ***! + \**********************************************/O.r(j),O.d(j,{VLChatProcessor:()=>U});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js"),N=O("./src/utils/core.js"),J=O("./src/utils/tensor.js"),R=O("./src/utils/image.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js *//*! ../../utils/core.js *//*! ../../utils/tensor.js *//*! ../../utils/image.js */class U extends G.Processor{static image_processor_class=Z.AutoImageProcessor;static tokenizer_class=V.AutoTokenizer;static uses_processor_config=!0;constructor(H,L){super(H,L),this.image_tag=this.config.image_tag,this.image_start_tag=this.config.image_start_tag,this.image_end_tag=this.config.image_end_tag,this.num_image_tokens=this.config.num_image_tokens}async _call(H,{images:L=null,chat_template:Y="default"}={}){L?Array.isArray(L)||(L=[L]):L=await Promise.all(H.filter((A)=>A.images).flatMap((A)=>A.images).map((A)=>R.RawImage.read(A)));let S=this.tokenizer,X=(A)=>S.encode(A,{add_special_tokens:!1}),D=S.apply_chat_template(H,{tokenize:!1,add_generation_prompt:!0,chat_template:Y}).split(this.image_tag),I=D.length-1;if(L.length!==I)throw Error(`Number of images provided (${L.length}) does not match number of "${this.image_tag}" image tags (${I})`);let[k,z,w]=S.model.convert_tokens_to_ids([this.image_tag,this.image_start_tag,this.image_end_tag]),T=X(D[0]),W=Array(T.length).fill(!1);for(let A=1;A0){let A=await this.image_processor(L);return A.pixel_values.unsqueeze_(0),{...Q,...A}}return Q}}},"./src/models/jina_clip/image_processing_jina_clip.js":($,j,O)=>{/*!************************************************************!*\ + !*** ./src/models/jina_clip/image_processing_jina_clip.js ***! + \************************************************************/O.r(j),O.d(j,{JinaCLIPImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{constructor(V){let{resize_mode:N,fill_color:J,interpolation:R,size:U,...H}=V;super({...H,size:N==="squash"?{width:U,height:U}:N==="shortest"?{shortest_edge:U}:{longest_edge:U},resample:R==="bicubic"?3:2,do_center_crop:!0,crop_size:U,do_normalize:!0})}}},"./src/models/jina_clip/processing_jina_clip.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/jina_clip/processing_jina_clip.js ***! + \******************************************************/O.r(j),O.d(j,{JinaCLIPProcessor:()=>N});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */class N extends G.Processor{static tokenizer_class=V.AutoTokenizer;static image_processor_class=Z.AutoImageProcessor;async _call(J=null,R=null,U={}){if(!J&&!R)throw Error("Either text or images must be provided");return{...J?this.tokenizer(J,U):{},...R?await this.image_processor(R,U):{}}}}},"./src/models/llava_onevision/image_processing_llava_onevision.js":($,j,O)=>{/*!************************************************************************!*\ + !*** ./src/models/llava_onevision/image_processing_llava_onevision.js ***! + \************************************************************************/O.r(j),O.d(j,{LlavaOnevisionImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/mask2former/image_processing_mask2former.js":($,j,O)=>{/*!****************************************************************!*\ + !*** ./src/models/mask2former/image_processing_mask2former.js ***! + \****************************************************************/O.r(j),O.d(j,{Mask2FormerImageProcessor:()=>Z});var G=O("./src/models/maskformer/image_processing_maskformer.js");/*! ../maskformer/image_processing_maskformer.js */class Z extends G.MaskFormerImageProcessor{}},"./src/models/maskformer/image_processing_maskformer.js":($,j,O)=>{/*!**************************************************************!*\ + !*** ./src/models/maskformer/image_processing_maskformer.js ***! + \**************************************************************/O.r(j),O.d(j,{MaskFormerFeatureExtractor:()=>V,MaskFormerImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{post_process_panoptic_segmentation(...N){return(0,G.post_process_panoptic_segmentation)(...N)}post_process_instance_segmentation(...N){return(0,G.post_process_instance_segmentation)(...N)}}class V extends Z{}},"./src/models/mgp_str/processing_mgp_str.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/mgp_str/processing_mgp_str.js ***! + \**************************************************/O.r(j),O.d(j,{MgpstrProcessor:()=>R});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js"),N=O("./src/utils/maths.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js *//*! ../../utils/maths.js */let J={char:["char_decode",1],bpe:["bpe_decode",2],wp:["wp_decode",102]};class R extends G.Processor{static tokenizer_class=V.AutoTokenizer;static image_processor_class=Z.AutoImageProcessor;get char_tokenizer(){return this.components.char_tokenizer}get bpe_tokenizer(){return this.components.bpe_tokenizer}get wp_tokenizer(){return this.components.wp_tokenizer}_decode_helper(U,H){if(!J.hasOwnProperty(H))throw Error(`Format ${H} is not supported.`);let[L,Y]=J[H],S=this[L].bind(this),[X,D]=U.dims,I=[],k=[],z=U.tolist();for(let w=0;w0?E.reduce((A,l)=>A*l,1):0;k.push(W),I.push(Q)}return[S(k),I]}char_decode(U){return this.char_tokenizer.batch_decode(U).map((H)=>H.replaceAll(" ",""))}bpe_decode(U){return this.bpe_tokenizer.batch_decode(U)}wp_decode(U){return this.wp_tokenizer.batch_decode(U).map((H)=>H.replaceAll(" ",""))}batch_decode([U,H,L]){let[Y,S]=this._decode_helper(U,"char"),[X,D]=this._decode_helper(H,"bpe"),[I,k]=this._decode_helper(L,"wp"),z=[],w=[];for(let T=0;T{/*!******************************************************************!*\ + !*** ./src/models/mobilenet_v1/image_processing_mobilenet_v1.js ***! + \******************************************************************/O.r(j),O.d(j,{MobileNetV1FeatureExtractor:()=>V,MobileNetV1ImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/mobilenet_v2/image_processing_mobilenet_v2.js":($,j,O)=>{/*!******************************************************************!*\ + !*** ./src/models/mobilenet_v2/image_processing_mobilenet_v2.js ***! + \******************************************************************/O.r(j),O.d(j,{MobileNetV2FeatureExtractor:()=>V,MobileNetV2ImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/mobilenet_v3/image_processing_mobilenet_v3.js":($,j,O)=>{/*!******************************************************************!*\ + !*** ./src/models/mobilenet_v3/image_processing_mobilenet_v3.js ***! + \******************************************************************/O.r(j),O.d(j,{MobileNetV3FeatureExtractor:()=>V,MobileNetV3ImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/mobilenet_v4/image_processing_mobilenet_v4.js":($,j,O)=>{/*!******************************************************************!*\ + !*** ./src/models/mobilenet_v4/image_processing_mobilenet_v4.js ***! + \******************************************************************/O.r(j),O.d(j,{MobileNetV4FeatureExtractor:()=>V,MobileNetV4ImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/mobilevit/image_processing_mobilevit.js":($,j,O)=>{/*!************************************************************!*\ + !*** ./src/models/mobilevit/image_processing_mobilevit.js ***! + \************************************************************/O.r(j),O.d(j,{MobileViTFeatureExtractor:()=>V,MobileViTImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/moonshine/feature_extraction_moonshine.js":($,j,O)=>{/*!**************************************************************!*\ + !*** ./src/models/moonshine/feature_extraction_moonshine.js ***! + \**************************************************************/O.r(j),O.d(j,{MoonshineFeatureExtractor:()=>V});var G=O("./src/base/feature_extraction_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/feature_extraction_utils.js *//*! ../../utils/tensor.js */class V extends G.FeatureExtractor{async _call(N){(0,G.validate_audio_inputs)(N,"MoonshineFeatureExtractor"),N instanceof Float64Array&&(N=new Float32Array(N));let J=[1,N.length];return{input_values:new Z.Tensor("float32",N,J)}}}},"./src/models/moonshine/processing_moonshine.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/moonshine/processing_moonshine.js ***! + \******************************************************/O.r(j),O.d(j,{MoonshineProcessor:()=>N});var G=O("./src/models/auto/feature_extraction_auto.js"),Z=O("./src/tokenizers.js"),V=O("./src/base/processing_utils.js");/*! ../auto/feature_extraction_auto.js *//*! ../../tokenizers.js *//*! ../../base/processing_utils.js */class N extends V.Processor{static tokenizer_class=Z.AutoTokenizer;static feature_extractor_class=G.AutoFeatureExtractor;async _call(J){return await this.feature_extractor(J)}}},"./src/models/nougat/image_processing_nougat.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/nougat/image_processing_nougat.js ***! + \******************************************************/O.r(j),O.d(j,{NougatImageProcessor:()=>Z});var G=O("./src/models/donut/image_processing_donut.js");/*! ../donut/image_processing_donut.js */class Z extends G.DonutImageProcessor{}},"./src/models/owlv2/image_processing_owlv2.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/owlv2/image_processing_owlv2.js ***! + \****************************************************/O.r(j),O.d(j,{Owlv2ImageProcessor:()=>Z});var G=O("./src/models/owlvit/image_processing_owlvit.js");/*! ../owlvit/image_processing_owlvit.js */class Z extends G.OwlViTImageProcessor{}},"./src/models/owlvit/image_processing_owlvit.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/owlvit/image_processing_owlvit.js ***! + \******************************************************/O.r(j),O.d(j,{OwlViTFeatureExtractor:()=>V,OwlViTImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{post_process_object_detection(...N){return(0,G.post_process_object_detection)(...N)}}class V extends Z{}},"./src/models/owlvit/processing_owlvit.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/owlvit/processing_owlvit.js ***! + \************************************************/O.r(j),O.d(j,{OwlViTProcessor:()=>N});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */class N extends G.Processor{static tokenizer_class=V.AutoTokenizer;static image_processor_class=Z.AutoImageProcessor}},"./src/models/paligemma/processing_paligemma.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/paligemma/processing_paligemma.js ***! + \******************************************************/O.r(j),O.d(j,{PaliGemmaProcessor:()=>J});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */let N="";class J extends G.Processor{static tokenizer_class=V.AutoTokenizer;static image_processor_class=Z.AutoImageProcessor;static uses_processor_config=!1;async _call(R,U=null,H={}){U||(console.warn("You are using PaliGemma without a text prefix. It will perform as a picture-captioning model."),U=""),Array.isArray(R)||(R=[R]),Array.isArray(U)||(U=[U]);let L=this.tokenizer.bos_token,Y=this.image_processor.config.image_seq_length,S;U.some((D)=>D.includes(N))?S=U.map((D)=>{let I=D.replaceAll(N,N.repeat(Y)),k=I.lastIndexOf(N),z=k===-1?0:k+7;return I.slice(0,z)+L+I.slice(z)+` +`}):(console.warn("You are passing both `text` and `images` to `PaliGemmaProcessor`. The processor expects special image tokens in the text, as many tokens as there are images per each text. It is recommended to add `` tokens in the very beginning of your text. For this call, we will infer how many images each text has and add special tokens."),S=U.map((D)=>function(I,k,z,w,T){return`${w.repeat(z*T)}${k}${I} +`}(D,L,Y,N,R.length)));let X=this.tokenizer(S,H);return{...await this.image_processor(R,H),...X}}}},"./src/models/phi3_v/image_processing_phi3_v.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/phi3_v/image_processing_phi3_v.js ***! + \******************************************************/O.r(j),O.d(j,{Phi3VImageProcessor:()=>H});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/tensor.js */let V=336,N=[2,3],{ceil:J,floor:R,sqrt:U}=Math;class H extends G.ImageProcessor{constructor(L){super({...L,do_normalize:!0,do_pad:!0,pad_size:"custom",do_convert_rgb:!0,do_resize:!0}),this._num_crops=L.num_crops}calc_num_image_tokens_from_image_size(L,Y){let{num_img_tokens:S}=this.config;return R((R(Y/V)*R(L/V)+1)*S+1+(R(Y/V)+1)*U(S))}get_resize_output_image_size(L,Y){let S=this._num_crops,[X,D]=L.size,I=X/D,k=1;for(;k*Math.ceil(k/I)<=S;)k+=1;k-=1;let z=Math.floor(336*k);return[z,Math.floor(z/I)]}pad_image(L,Y,S,X={}){let[D,I]=Y,k=V*J(D/V),z=V*J(I/V),w=[1,1,1].map((T,W)=>(T-this.image_mean[W])/this.image_std[W]);return super.pad_image(L,Y,{width:z,height:k},{center:!0,constant_values:w,...X})}async _call(L,{num_crops:Y=null}={}){if(this._num_crops=Y??=this.config.num_crops,Y<4||U(Y)%1!=0)throw Error("num_crops must be a square number >= 4");Array.isArray(L)||(L=[L]);let S=L.length,X=await Promise.all(L.map((T)=>this.preprocess(T))),D=X.map((T)=>T.original_size),I=X.map((T)=>T.reshaped_input_size),k=[];for(let{pixel_values:T}of X){T.unsqueeze_(0);let[W,E]=T.dims.slice(-2),Q=await(0,Z.interpolate_4d)(T,{size:[V,V],mode:"bicubic"});if(Y>0){let A=[],l=U(Y),r=R(E/l),e=R(W/l);for(let v0=0;v0T.map((W)=>V*J(W/V)));return{pixel_values:z,original_sizes:D,reshaped_input_sizes:I,image_sizes:new Z.Tensor("int64",w.flat(),[S,2]),num_img_tokens:w.map(([T,W])=>this.calc_num_image_tokens_from_image_size(W,T))}}}},"./src/models/phi3_v/processing_phi3_v.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/phi3_v/processing_phi3_v.js ***! + \************************************************/O.r(j),O.d(j,{Phi3VProcessor:()=>R});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */O("./src/utils/image.js");/*! ../../utils/image.js */let N="<|image|>",J=/<\|image_\d+\|>/g;class R extends G.Processor{static image_processor_class=Z.AutoImageProcessor;static tokenizer_class=V.AutoTokenizer;async _call(U,H=null,{padding:L=!0,truncation:Y=!0,num_crops:S=null}={}){let X,D;if(Array.isArray(U)||(U=[U]),H){D=await this.image_processor(H,{num_crops:S});let{num_img_tokens:I}=D,k=U.map((w,T)=>w.split(J).join(N.repeat(I[T])));X=this.tokenizer(k,{padding:L,truncation:Y});let z=this.tokenizer.model.convert_tokens_to_ids([N])[0];X.input_ids.map_((w)=>w==z?-w:w)}else X=this.tokenizer(U);return{...X,...D}}}},"./src/models/processors.js":($,j,O)=>{/*!**********************************!*\ + !*** ./src/models/processors.js ***! + \**********************************/O.r(j),O.d(j,{Florence2Processor:()=>G.Florence2Processor,GroundingDinoProcessor:()=>Z.GroundingDinoProcessor,Idefics3Processor:()=>V.Idefics3Processor,JinaCLIPProcessor:()=>J.JinaCLIPProcessor,MgpstrProcessor:()=>R.MgpstrProcessor,MoonshineProcessor:()=>U.MoonshineProcessor,OwlViTProcessor:()=>H.OwlViTProcessor,PaliGemmaProcessor:()=>Y.PaliGemmaProcessor,Phi3VProcessor:()=>L.Phi3VProcessor,PyAnnoteProcessor:()=>S.PyAnnoteProcessor,Qwen2VLProcessor:()=>X.Qwen2VLProcessor,SamProcessor:()=>D.SamProcessor,SmolVLMProcessor:()=>I.SmolVLMProcessor,SpeechT5Processor:()=>k.SpeechT5Processor,UltravoxProcessor:()=>z.UltravoxProcessor,VLChatProcessor:()=>N.VLChatProcessor,Wav2Vec2Processor:()=>w.Wav2Vec2Processor,Wav2Vec2ProcessorWithLM:()=>T.Wav2Vec2ProcessorWithLM,WhisperProcessor:()=>W.WhisperProcessor});var G=O("./src/models/florence2/processing_florence2.js"),Z=O("./src/models/grounding_dino/processing_grounding_dino.js"),V=O("./src/models/idefics3/processing_idefics3.js"),N=O("./src/models/janus/processing_janus.js"),J=O("./src/models/jina_clip/processing_jina_clip.js"),R=O("./src/models/mgp_str/processing_mgp_str.js"),U=O("./src/models/moonshine/processing_moonshine.js"),H=O("./src/models/owlvit/processing_owlvit.js"),L=O("./src/models/phi3_v/processing_phi3_v.js"),Y=O("./src/models/paligemma/processing_paligemma.js"),S=O("./src/models/pyannote/processing_pyannote.js"),X=O("./src/models/qwen2_vl/processing_qwen2_vl.js"),D=O("./src/models/sam/processing_sam.js"),I=O("./src/models/smolvlm/processing_smolvlm.js"),k=O("./src/models/speecht5/processing_speecht5.js"),z=O("./src/models/ultravox/processing_ultravox.js"),w=O("./src/models/wav2vec2/processing_wav2vec2.js"),T=O("./src/models/wav2vec2_with_lm/processing_wav2vec2_with_lm.js"),W=O("./src/models/whisper/processing_whisper.js");/*! ./florence2/processing_florence2.js *//*! ./grounding_dino/processing_grounding_dino.js *//*! ./idefics3/processing_idefics3.js *//*! ./janus/processing_janus.js *//*! ./jina_clip/processing_jina_clip.js *//*! ./mgp_str/processing_mgp_str.js *//*! ./moonshine/processing_moonshine.js *//*! ./owlvit/processing_owlvit.js *//*! ./phi3_v/processing_phi3_v.js *//*! ./paligemma/processing_paligemma.js *//*! ./pyannote/processing_pyannote.js *//*! ./qwen2_vl/processing_qwen2_vl.js *//*! ./sam/processing_sam.js *//*! ./smolvlm/processing_smolvlm.js *//*! ./speecht5/processing_speecht5.js *//*! ./ultravox/processing_ultravox.js *//*! ./wav2vec2/processing_wav2vec2.js *//*! ./wav2vec2_with_lm/processing_wav2vec2_with_lm.js *//*! ./whisper/processing_whisper.js */},"./src/models/pvt/image_processing_pvt.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/pvt/image_processing_pvt.js ***! + \************************************************/O.r(j),O.d(j,{PvtImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/pyannote/feature_extraction_pyannote.js":($,j,O)=>{/*!************************************************************!*\ + !*** ./src/models/pyannote/feature_extraction_pyannote.js ***! + \************************************************************/O.r(j),O.d(j,{PyAnnoteFeatureExtractor:()=>N});var G=O("./src/base/feature_extraction_utils.js"),Z=O("./src/utils/tensor.js"),V=O("./src/utils/maths.js");/*! ../../base/feature_extraction_utils.js *//*! ../../utils/tensor.js *//*! ../../utils/maths.js */class N extends G.FeatureExtractor{async _call(J){(0,G.validate_audio_inputs)(J,"PyAnnoteFeatureExtractor"),J instanceof Float64Array&&(J=new Float32Array(J));let R=[1,1,J.length];return{input_values:new Z.Tensor("float32",J,R)}}samples_to_frames(J){return(J-this.config.offset)/this.config.step}post_process_speaker_diarization(J,R){let U=R/this.samples_to_frames(R)/this.config.sampling_rate,H=[];for(let L of J.tolist()){let Y=[],S=-1;for(let X=0;X({id:X,start:D*U,end:I*U,confidence:k/(I-D)})))}return H}}},"./src/models/pyannote/processing_pyannote.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/pyannote/processing_pyannote.js ***! + \****************************************************/O.r(j),O.d(j,{PyAnnoteProcessor:()=>V});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/pyannote/feature_extraction_pyannote.js");/*! ../../base/processing_utils.js *//*! ./feature_extraction_pyannote.js */class V extends G.Processor{static feature_extractor_class=Z.PyAnnoteFeatureExtractor;async _call(N){return await this.feature_extractor(N)}post_process_speaker_diarization(...N){return this.feature_extractor.post_process_speaker_diarization(...N)}get sampling_rate(){return this.feature_extractor.config.sampling_rate}}},"./src/models/qwen2_vl/image_processing_qwen2_vl.js":($,j,O)=>{/*!**********************************************************!*\ + !*** ./src/models/qwen2_vl/image_processing_qwen2_vl.js ***! + \**********************************************************/O.r(j),O.d(j,{Qwen2VLImageProcessor:()=>V});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/tensor.js */class V extends G.ImageProcessor{async _call(N,...J){let{pixel_values:R,original_sizes:U,reshaped_input_sizes:H}=await super._call(N,...J),L=R,{temporal_patch_size:Y,merge_size:S,patch_size:X}=this.config;L.dims[0]===1&&(L=(0,Z.cat)(Array.from({length:Y},()=>L),0));let D=L.dims[0]/Y,I=L.dims[1],k=Math.floor(L.dims[2]/X),z=Math.floor(L.dims[3]/X);return{pixel_values:L.view(D,Y,I,Math.floor(k/S),S,X,Math.floor(z/S),S,X).permute(0,3,6,4,7,2,1,5,8).view(D*k*z,I*Y*X*X),image_grid_thw:new Z.Tensor("int64",[D,k,z],[1,3]),original_sizes:U,reshaped_input_sizes:H}}}},"./src/models/qwen2_vl/processing_qwen2_vl.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/qwen2_vl/processing_qwen2_vl.js ***! + \****************************************************/O.r(j),O.d(j,{Qwen2VLProcessor:()=>N});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js"),V=O("./src/tokenizers.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js *//*! ../../tokenizers.js */O("./src/utils/image.js");/*! ../../utils/image.js */class N extends G.Processor{static image_processor_class=Z.AutoImageProcessor;static tokenizer_class=V.AutoTokenizer;async _call(J,R=null,...U){let H,L;if(Array.isArray(J)||(J=[J]),R&&(H=await this.image_processor(R),L=H.image_grid_thw),L){let Y=this.image_processor.config.merge_size**2,S=0,X=L.tolist();J=J.map((D)=>{for(;D.includes("<|image_pad|>");){let I=Number(X[S++].reduce((k,z)=>k*z,1n));D=D.replace("<|image_pad|>","<|placeholder|>".repeat(Math.floor(I/Y)))}return D.replaceAll("<|placeholder|>","<|image_pad|>")})}return{...this.tokenizer(J),...H}}}},"./src/models/rt_detr/image_processing_rt_detr.js":($,j,O)=>{/*!********************************************************!*\ + !*** ./src/models/rt_detr/image_processing_rt_detr.js ***! + \********************************************************/O.r(j),O.d(j,{RTDetrImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{post_process_object_detection(...V){return(0,G.post_process_object_detection)(...V)}}},"./src/models/sam/image_processing_sam.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/sam/image_processing_sam.js ***! + \************************************************/O.r(j),O.d(j,{SamImageProcessor:()=>N});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/core.js"),V=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/core.js *//*! ../../utils/tensor.js */class N extends G.ImageProcessor{reshape_input_points(J,R,U,H=!1){J=structuredClone(J);let L=(0,Z.calculateDimensions)(J);if(L.length===3)H||(L=[1,...L]),J=[J];else if(L.length!==4)throw Error("The input_points must be a 4D tensor of shape `batch_size`, `point_batch_size`, `nb_points_per_image`, `2`.");for(let Y=0;YH!==R.dims[L]))throw Error(`The first ${U.length} dimensions of 'input_points' and 'input_labels' must be the same.`);return new V.Tensor("int64",J.flat(1/0).map(BigInt),U)}async _call(J,{input_points:R=null,input_labels:U=null,input_boxes:H=null}={}){let L=await super._call(J);if(R&&(L.input_points=this.reshape_input_points(R,L.original_sizes,L.reshaped_input_sizes)),U){if(!L.input_points)throw Error("`input_points` must be provided if `input_labels` are provided.");L.input_labels=this.add_input_labels(U,L.input_points)}return H&&(L.input_boxes=this.reshape_input_points(H,L.original_sizes,L.reshaped_input_sizes,!0)),L}async post_process_masks(J,R,U,{mask_threshold:H=0,binarize:L=!0,pad_size:Y=null}={}){let S=[],X=[(Y=Y??this.pad_size).height,Y.width];for(let D=0;DH&&(T[W]=1);z=new V.Tensor("bool",T,z.dims)}S.push(z)}return S}generate_crop_boxes(J,R,{crop_n_layers:U=0,overlap_ratio:H=0.3413333333333333,points_per_crop:L=32,crop_n_points_downscale_factor:Y=1}={}){}}},"./src/models/sam/processing_sam.js":($,j,O)=>{/*!******************************************!*\ + !*** ./src/models/sam/processing_sam.js ***! + \******************************************/O.r(j),O.d(j,{SamProcessor:()=>V});var G=O("./src/base/processing_utils.js"),Z=O("./src/models/auto/image_processing_auto.js");/*! ../../base/processing_utils.js *//*! ../auto/image_processing_auto.js */class V extends G.Processor{static image_processor_class=Z.AutoImageProcessor;async _call(...N){return await this.image_processor(...N)}post_process_masks(...N){return this.image_processor.post_process_masks(...N)}reshape_input_points(...N){return this.image_processor.reshape_input_points(...N)}}},"./src/models/seamless_m4t/feature_extraction_seamless_m4t.js":($,j,O)=>{/*!********************************************************************!*\ + !*** ./src/models/seamless_m4t/feature_extraction_seamless_m4t.js ***! + \********************************************************************/O.r(j),O.d(j,{SeamlessM4TFeatureExtractor:()=>N});var G=O("./src/base/feature_extraction_utils.js"),Z=O("./src/utils/tensor.js"),V=O("./src/utils/audio.js");/*! ../../base/feature_extraction_utils.js *//*! ../../utils/tensor.js *//*! ../../utils/audio.js */class N extends G.FeatureExtractor{constructor(J){super(J);let R=this.config.sampling_rate,U=(0,V.mel_filter_bank)(257,this.config.num_mel_bins,20,Math.floor(R/2),R,null,"kaldi",!0);this.mel_filters=U,this.window=(0,V.window_function)(400,"povey",{periodic:!1})}async _extract_fbank_features(J,R){return J=J.map((U)=>32768*U),(0,V.spectrogram)(J,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:0.97,mel_filters:this.mel_filters,log_mel:"log",mel_floor:0.0000001192092955078125,remove_dc_offset:!0,max_num_frames:R,transpose:!0})}async _call(J,{padding:R=!0,pad_to_multiple_of:U=2,do_normalize_per_mel_bins:H=!0,return_attention_mask:L=!0}={}){(0,G.validate_audio_inputs)(J,"SeamlessM4TFeatureExtractor");let Y,S=await this._extract_fbank_features(J,this.config.max_length);if(H){let[w,T]=S.dims,W=S.data;for(let E=0;E0){let Q=new Float32Array(T*(w+E));Q.set(W),Q.fill(this.config.padding_value,W.length);let A=w+E;S=new Z.Tensor(S.type,Q,[A,T]),L&&(Y=new Z.Tensor("int64",new BigInt64Array(A),[1,A]),Y.data.fill(1n,0,w))}}let[X,D]=S.dims,I=this.config.stride;if(X%I!==0)throw Error(`The number of frames (${X}) must be a multiple of the stride (${I}).`);let k=S.view(1,Math.floor(X/I),D*I),z={input_features:k};if(L){let w=k.dims[1],T=new BigInt64Array(w);if(Y){let W=Y.data;for(let E=1,Q=0;E{/*!************************************************************!*\ + !*** ./src/models/segformer/image_processing_segformer.js ***! + \************************************************************/O.r(j),O.d(j,{SegformerFeatureExtractor:()=>V,SegformerImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{post_process_semantic_segmentation(...N){return(0,G.post_process_semantic_segmentation)(...N)}}class V extends Z{}},"./src/models/siglip/image_processing_siglip.js":($,j,O)=>{/*!******************************************************!*\ + !*** ./src/models/siglip/image_processing_siglip.js ***! + \******************************************************/O.r(j),O.d(j,{SiglipImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}},"./src/models/smolvlm/image_processing_smolvlm.js":($,j,O)=>{/*!********************************************************!*\ + !*** ./src/models/smolvlm/image_processing_smolvlm.js ***! + \********************************************************/O.r(j),O.d(j,{SmolVLMImageProcessor:()=>G.Idefics3ImageProcessor});var G=O("./src/models/idefics3/image_processing_idefics3.js");/*! ../idefics3/image_processing_idefics3.js */},"./src/models/smolvlm/processing_smolvlm.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/smolvlm/processing_smolvlm.js ***! + \**************************************************/O.r(j),O.d(j,{SmolVLMProcessor:()=>G.Idefics3Processor});var G=O("./src/models/idefics3/processing_idefics3.js");/*! ../idefics3/processing_idefics3.js */},"./src/models/snac/feature_extraction_snac.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/snac/feature_extraction_snac.js ***! + \****************************************************/O.r(j),O.d(j,{SnacFeatureExtractor:()=>Z});var G=O("./src/models/dac/feature_extraction_dac.js");/*! ../dac/feature_extraction_dac.js */class Z extends G.DacFeatureExtractor{}},"./src/models/speecht5/feature_extraction_speecht5.js":($,j,O)=>{/*!************************************************************!*\ + !*** ./src/models/speecht5/feature_extraction_speecht5.js ***! + \************************************************************/O.r(j),O.d(j,{SpeechT5FeatureExtractor:()=>Z});var G=O("./src/base/feature_extraction_utils.js");/*! ../../base/feature_extraction_utils.js */class Z extends G.FeatureExtractor{}},"./src/models/speecht5/processing_speecht5.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/speecht5/processing_speecht5.js ***! + \****************************************************/O.r(j),O.d(j,{SpeechT5Processor:()=>N});var G=O("./src/base/processing_utils.js"),Z=O("./src/tokenizers.js"),V=O("./src/models/auto/feature_extraction_auto.js");/*! ../../base/processing_utils.js *//*! ../../tokenizers.js *//*! ../auto/feature_extraction_auto.js */class N extends G.Processor{static tokenizer_class=Z.AutoTokenizer;static feature_extractor_class=V.AutoFeatureExtractor;async _call(J){return await this.feature_extractor(J)}}},"./src/models/swin2sr/image_processing_swin2sr.js":($,j,O)=>{/*!********************************************************!*\ + !*** ./src/models/swin2sr/image_processing_swin2sr.js ***! + \********************************************************/O.r(j),O.d(j,{Swin2SRImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{pad_image(V,N,J,R={}){let[U,H,L]=N;return super.pad_image(V,N,{width:H+(J-H%J)%J,height:U+(J-U%J)%J},{mode:"symmetric",center:!1,constant_values:-1,...R})}}},"./src/models/ultravox/processing_ultravox.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/ultravox/processing_ultravox.js ***! + \****************************************************/O.r(j),O.d(j,{UltravoxProcessor:()=>N});var G=O("./src/models/auto/feature_extraction_auto.js"),Z=O("./src/tokenizers.js"),V=O("./src/base/processing_utils.js");/*! ../auto/feature_extraction_auto.js *//*! ../../tokenizers.js *//*! ../../base/processing_utils.js */class N extends V.Processor{static tokenizer_class=Z.AutoTokenizer;static feature_extractor_class=G.AutoFeatureExtractor;static uses_processor_config=!0;async _call(J,R=null,U={}){if(Array.isArray(J))throw Error("Batched inputs are not supported yet.");let H={};if(R){let L=R.length,{input_features:Y}=await this.feature_extractor(R,{...U,max_length:L}),S=Math.round(L/this.config.encoder_ds_factor+0.0001),X=1+Math.ceil(S/this.config.stack_factor);H.audio_token_len=[X],H.audio_values=Y;let D=this.config.audio_placeholder;if(!J.includes(D))throw Error(`The input text does not contain the image token ${D}.`);J=J.replaceAll(D,D.repeat(X))}return{...this.tokenizer(J,{add_special_tokens:!1,...U}),...H}}}},"./src/models/vit/image_processing_vit.js":($,j,O)=>{/*!************************************************!*\ + !*** ./src/models/vit/image_processing_vit.js ***! + \************************************************/O.r(j),O.d(j,{ViTFeatureExtractor:()=>V,ViTImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{}class V extends Z{}},"./src/models/vitmatte/image_processing_vitmatte.js":($,j,O)=>{/*!**********************************************************!*\ + !*** ./src/models/vitmatte/image_processing_vitmatte.js ***! + \**********************************************************/O.r(j),O.d(j,{VitMatteImageProcessor:()=>V});var G=O("./src/base/image_processors_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/image_processors_utils.js *//*! ../../utils/tensor.js */class V extends G.ImageProcessor{async _call(N,J){Array.isArray(N)||(N=[N]),Array.isArray(J)||(J=[J]);let R=await Promise.all(N.map((H)=>this.preprocess(H))),U=await Promise.all(J.map((H)=>this.preprocess(H,{do_normalize:!1,do_convert_rgb:!1,do_convert_grayscale:!0})));return{pixel_values:(0,Z.stack)(R.map((H,L)=>(0,Z.cat)([H.pixel_values,U[L].pixel_values],0)),0),original_sizes:R.map((H)=>H.original_size),reshaped_input_sizes:R.map((H)=>H.reshaped_input_size)}}}},"./src/models/vitpose/image_processing_vitpose.js":($,j,O)=>{/*!********************************************************!*\ + !*** ./src/models/vitpose/image_processing_vitpose.js ***! + \********************************************************/O.r(j),O.d(j,{VitPoseImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{post_process_pose_estimation(V,N,{threshold:J=null}={}){let R=V.tolist(),[U,H,L,Y]=V.dims,S=[];for(let X=0;X{/*!************************************************************!*\ + !*** ./src/models/wav2vec2/feature_extraction_wav2vec2.js ***! + \************************************************************/O.r(j),O.d(j,{Wav2Vec2FeatureExtractor:()=>V});var G=O("./src/base/feature_extraction_utils.js"),Z=O("./src/utils/tensor.js");/*! ../../base/feature_extraction_utils.js *//*! ../../utils/tensor.js */class V extends G.FeatureExtractor{_zero_mean_unit_var_norm(N){let J=N.reduce((U,H)=>U+H,0)/N.length,R=N.reduce((U,H)=>U+(H-J)**2,0)/N.length;return N.map((U)=>(U-J)/Math.sqrt(R+0.0000001))}async _call(N){(0,G.validate_audio_inputs)(N,"Wav2Vec2FeatureExtractor"),N instanceof Float64Array&&(N=new Float32Array(N));let J=N;this.config.do_normalize&&(J=this._zero_mean_unit_var_norm(J));let R=[1,J.length];return{input_values:new Z.Tensor("float32",J,R),attention_mask:new Z.Tensor("int64",new BigInt64Array(J.length).fill(1n),R)}}}},"./src/models/wav2vec2/processing_wav2vec2.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/wav2vec2/processing_wav2vec2.js ***! + \****************************************************/O.r(j),O.d(j,{Wav2Vec2Processor:()=>N});var G=O("./src/tokenizers.js"),Z=O("./src/models/auto/feature_extraction_auto.js"),V=O("./src/base/processing_utils.js");/*! ../../tokenizers.js *//*! ../auto/feature_extraction_auto.js *//*! ../../base/processing_utils.js */class N extends V.Processor{static tokenizer_class=G.AutoTokenizer;static feature_extractor_class=Z.AutoFeatureExtractor;async _call(J){return await this.feature_extractor(J)}}},"./src/models/wav2vec2_with_lm/processing_wav2vec2_with_lm.js":($,j,O)=>{/*!********************************************************************!*\ + !*** ./src/models/wav2vec2_with_lm/processing_wav2vec2_with_lm.js ***! + \********************************************************************/O.r(j),O.d(j,{Wav2Vec2ProcessorWithLM:()=>N});var G=O("./src/tokenizers.js"),Z=O("./src/models/auto/feature_extraction_auto.js"),V=O("./src/base/processing_utils.js");/*! ../../tokenizers.js *//*! ../auto/feature_extraction_auto.js *//*! ../../base/processing_utils.js */class N extends V.Processor{static tokenizer_class=G.AutoTokenizer;static feature_extractor_class=Z.AutoFeatureExtractor;async _call(J){return await this.feature_extractor(J)}}},"./src/models/wespeaker/feature_extraction_wespeaker.js":($,j,O)=>{/*!**************************************************************!*\ + !*** ./src/models/wespeaker/feature_extraction_wespeaker.js ***! + \**************************************************************/O.r(j),O.d(j,{WeSpeakerFeatureExtractor:()=>V});var G=O("./src/base/feature_extraction_utils.js");/*! ../../base/feature_extraction_utils.js */O("./src/utils/tensor.js");/*! ../../utils/tensor.js */var Z=O("./src/utils/audio.js");/*! ../../utils/audio.js */class V extends G.FeatureExtractor{constructor(N){super(N);let J=this.config.sampling_rate,R=(0,Z.mel_filter_bank)(257,this.config.num_mel_bins,20,Math.floor(J/2),J,null,"kaldi",!0);this.mel_filters=R,this.window=(0,Z.window_function)(400,"hamming",{periodic:!1}),this.min_num_frames=this.config.min_num_frames}async _extract_fbank_features(N){return N=N.map((J)=>32768*J),(0,Z.spectrogram)(N,this.window,400,160,{fft_length:512,power:2,center:!1,preemphasis:0.97,mel_filters:this.mel_filters,log_mel:"log",mel_floor:0.0000001192092955078125,remove_dc_offset:!0,transpose:!0,min_num_frames:this.min_num_frames})}async _call(N){(0,G.validate_audio_inputs)(N,"WeSpeakerFeatureExtractor");let J=(await this._extract_fbank_features(N)).unsqueeze_(0);if(this.config.fbank_centering_span===null){let R=J.mean(1).data,U=J.data,[H,L,Y]=J.dims;for(let S=0;S{/*!**********************************************!*\ + !*** ./src/models/whisper/common_whisper.js ***! + \**********************************************/O.r(j),O.d(j,{WHISPER_LANGUAGE_MAPPING:()=>Z,WHISPER_TO_LANGUAGE_CODE_MAPPING:()=>V,whisper_language_to_code:()=>N});let G=[["en","english"],["zh","chinese"],["de","german"],["es","spanish"],["ru","russian"],["ko","korean"],["fr","french"],["ja","japanese"],["pt","portuguese"],["tr","turkish"],["pl","polish"],["ca","catalan"],["nl","dutch"],["ar","arabic"],["sv","swedish"],["it","italian"],["id","indonesian"],["hi","hindi"],["fi","finnish"],["vi","vietnamese"],["he","hebrew"],["uk","ukrainian"],["el","greek"],["ms","malay"],["cs","czech"],["ro","romanian"],["da","danish"],["hu","hungarian"],["ta","tamil"],["no","norwegian"],["th","thai"],["ur","urdu"],["hr","croatian"],["bg","bulgarian"],["lt","lithuanian"],["la","latin"],["mi","maori"],["ml","malayalam"],["cy","welsh"],["sk","slovak"],["te","telugu"],["fa","persian"],["lv","latvian"],["bn","bengali"],["sr","serbian"],["az","azerbaijani"],["sl","slovenian"],["kn","kannada"],["et","estonian"],["mk","macedonian"],["br","breton"],["eu","basque"],["is","icelandic"],["hy","armenian"],["ne","nepali"],["mn","mongolian"],["bs","bosnian"],["kk","kazakh"],["sq","albanian"],["sw","swahili"],["gl","galician"],["mr","marathi"],["pa","punjabi"],["si","sinhala"],["km","khmer"],["sn","shona"],["yo","yoruba"],["so","somali"],["af","afrikaans"],["oc","occitan"],["ka","georgian"],["be","belarusian"],["tg","tajik"],["sd","sindhi"],["gu","gujarati"],["am","amharic"],["yi","yiddish"],["lo","lao"],["uz","uzbek"],["fo","faroese"],["ht","haitian creole"],["ps","pashto"],["tk","turkmen"],["nn","nynorsk"],["mt","maltese"],["sa","sanskrit"],["lb","luxembourgish"],["my","myanmar"],["bo","tibetan"],["tl","tagalog"],["mg","malagasy"],["as","assamese"],["tt","tatar"],["haw","hawaiian"],["ln","lingala"],["ha","hausa"],["ba","bashkir"],["jw","javanese"],["su","sundanese"]],Z=new Map(G),V=new Map([...G.map(([J,R])=>[R,J]),["burmese","my"],["valencian","ca"],["flemish","nl"],["haitian","ht"],["letzeburgesch","lb"],["pushto","ps"],["panjabi","pa"],["moldavian","ro"],["moldovan","ro"],["sinhalese","si"],["castilian","es"]]);function N(J){J=J.toLowerCase();let R=V.get(J);if(R===void 0){let U=J.match(/^<\|([a-z]{2})\|>$/);if(U&&(J=U[1]),!Z.has(J)){let H=J.length===2?Z.keys():Z.values();throw Error(`Language "${J}" is not supported. Must be one of: ${JSON.stringify(Array.from(H))}`)}R=J}return R}},"./src/models/whisper/feature_extraction_whisper.js":($,j,O)=>{/*!**********************************************************!*\ + !*** ./src/models/whisper/feature_extraction_whisper.js ***! + \**********************************************************/O.r(j),O.d(j,{WhisperFeatureExtractor:()=>N});var G=O("./src/base/feature_extraction_utils.js");/*! ../../base/feature_extraction_utils.js */O("./src/utils/tensor.js");/*! ../../utils/tensor.js */var Z=O("./src/utils/audio.js"),V=O("./src/utils/maths.js");/*! ../../utils/audio.js *//*! ../../utils/maths.js */class N extends G.FeatureExtractor{constructor(J){super(J),this.config.mel_filters??=(0,Z.mel_filter_bank)(Math.floor(1+this.config.n_fft/2),this.config.feature_size,0,8000,this.config.sampling_rate,"slaney","slaney"),this.window=(0,Z.window_function)(this.config.n_fft,"hann")}async _extract_fbank_features(J){let R=await(0,Z.spectrogram)(J,this.window,this.config.n_fft,this.config.hop_length,{power:2,mel_filters:this.config.mel_filters,log_mel:"log10",max_num_frames:Math.min(Math.floor(J.length/this.config.hop_length),this.config.nb_max_frames)}),U=R.data,H=(0,V.max)(U)[0];for(let L=0;LH?(J.length>this.config.n_samples&&console.warn("Attempting to extract features for audio longer than 30 seconds. If using a pipeline to extract transcript from a long audio clip, remember to specify `chunk_length_s` and/or `stride_length_s`."),U=J.slice(0,H)):(U=new Float32Array(H),U.set(J)),{input_features:(await this._extract_fbank_features(U)).unsqueeze_(0)}}}},"./src/models/whisper/generation_whisper.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/whisper/generation_whisper.js ***! + \**************************************************/O.r(j),O.d(j,{WhisperGenerationConfig:()=>Z});var G=O("./src/generation/configuration_utils.js");/*! ../../generation/configuration_utils.js */class Z extends G.GenerationConfig{return_timestamps=null;return_token_timestamps=null;num_frames=null;alignment_heads=null;task=null;language=null;no_timestamps_token_id=null;prompt_ids=null;is_multilingual=null;lang_to_id=null;task_to_id=null;max_initial_timestamp_index=1}},"./src/models/whisper/processing_whisper.js":($,j,O)=>{/*!**************************************************!*\ + !*** ./src/models/whisper/processing_whisper.js ***! + \**************************************************/O.r(j),O.d(j,{WhisperProcessor:()=>N});var G=O("./src/models/auto/feature_extraction_auto.js"),Z=O("./src/tokenizers.js"),V=O("./src/base/processing_utils.js");/*! ../auto/feature_extraction_auto.js *//*! ../../tokenizers.js *//*! ../../base/processing_utils.js */class N extends V.Processor{static tokenizer_class=Z.AutoTokenizer;static feature_extractor_class=G.AutoFeatureExtractor;async _call(J){return await this.feature_extractor(J)}}},"./src/models/yolos/image_processing_yolos.js":($,j,O)=>{/*!****************************************************!*\ + !*** ./src/models/yolos/image_processing_yolos.js ***! + \****************************************************/O.r(j),O.d(j,{YolosFeatureExtractor:()=>V,YolosImageProcessor:()=>Z});var G=O("./src/base/image_processors_utils.js");/*! ../../base/image_processors_utils.js */class Z extends G.ImageProcessor{post_process_object_detection(...N){return(0,G.post_process_object_detection)(...N)}}class V extends Z{}},"./src/ops/registry.js":($,j,O)=>{/*!*****************************!*\ + !*** ./src/ops/registry.js ***! + \*****************************/O.r(j),O.d(j,{TensorOpRegistry:()=>R});var G=O("./src/backends/onnx.js"),Z=O("./src/utils/tensor.js"),V=O("./src/env.js");/*! ../backends/onnx.js *//*! ../utils/tensor.js *//*! ../env.js */let N=V.apis.IS_BROWSER_ENV||V.apis.IS_WEBWORKER_ENV,J=async(U,H,L)=>{let Y=await(0,G.createInferenceSession)(new Uint8Array(U),H),S=Promise.resolve();return async(X)=>{let D=(0,G.isONNXProxy)(),I=Object.fromEntries(Object.entries(X).map(([z,w])=>[z,(D?w.clone():w).ort_tensor])),k=await(S=N?S.then(()=>Y.run(I)):Y.run(I));return Array.isArray(L)?L.map((z)=>new Z.Tensor(k[z])):new Z.Tensor(k[L])}};class R{static session_options={};static get nearest_interpolate_4d(){return this._nearest_interpolate_4d||(this._nearest_interpolate_4d=J([8,10,18,0,58,129,1,10,41,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,18,10,4,109,111,100,101,34,7,110,101,97,114,101,115,116,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,21],this.session_options,"y")),this._nearest_interpolate_4d}static get bilinear_interpolate_4d(){return this._bilinear_interpolate_4d||(this._bilinear_interpolate_4d=J([8,9,18,0,58,128,1,10,40,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,17,10,4,109,111,100,101,34,6,108,105,110,101,97,114,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,"y")),this._bilinear_interpolate_4d}static get bicubic_interpolate_4d(){return this._bicubic_interpolate_4d||(this._bicubic_interpolate_4d=J([8,9,18,0,58,127,10,39,10,1,120,10,0,10,0,10,1,115,18,1,121,34,6,82,101,115,105,122,101,42,16,10,4,109,111,100,101,34,5,99,117,98,105,99,160,1,3,18,1,114,90,31,10,1,120,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,90,15,10,1,115,18,10,10,8,8,7,18,4,10,2,8,4,98,31,10,1,121,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,99,10,3,18,1,104,10,3,18,1,119,66,2,16,20],this.session_options,"y")),this._bicubic_interpolate_4d}static get matmul(){return this._matmul||(this._matmul=J([8,9,18,0,58,55,10,17,10,1,97,10,1,98,18,1,99,34,6,77,97,116,77,117,108,18,1,114,90,9,10,1,97,18,4,10,2,8,1,90,9,10,1,98,18,4,10,2,8,1,98,9,10,1,99,18,4,10,2,8,1,66,2,16,20],this.session_options,"c")),this._matmul}static get stft(){return this._stft||(this._stft=J([8,7,18,0,58,148,1,10,38,10,1,115,10,1,106,10,1,119,10,1,108,18,1,111,34,4,83,84,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,115,90,26,10,1,115,18,21,10,19,8,1,18,15,10,3,18,1,98,10,3,18,1,115,10,3,18,1,99,90,11,10,1,106,18,6,10,4,8,7,18,0,90,16,10,1,119,18,11,10,9,8,1,18,5,10,3,18,1,119,90,11,10,1,108,18,6,10,4,8,7,18,0,98,31,10,1,111,18,26,10,24,8,1,18,20,10,3,18,1,98,10,3,18,1,102,10,3,18,1,100,10,3,18,1,99,66,2,16,17],this.session_options,"o")),this._stft}static get rfft(){return this._rfft||(this._rfft=J([8,9,18,0,58,97,10,33,10,1,120,10,0,10,1,97,18,1,121,34,3,68,70,84,42,15,10,8,111,110,101,115,105,100,101,100,24,1,160,1,2,18,1,100,90,21,10,1,120,18,16,10,14,8,1,18,10,10,3,18,1,115,10,3,18,1,99,90,11,10,1,97,18,6,10,4,8,7,18,0,98,21,10,1,121,18,16,10,14,8,1,18,10,10,3,18,1,115,10,3,18,1,99,66,2,16,20],this.session_options,"y")),this._rfft}static get top_k(){return this._top_k||(this._top_k=J([8,10,18,0,58,73,10,18,10,1,120,10,1,107,18,1,118,18,1,105,34,4,84,111,112,75,18,1,116,90,9,10,1,120,18,4,10,2,8,1,90,15,10,1,107,18,10,10,8,8,7,18,4,10,2,8,1,98,9,10,1,118,18,4,10,2,8,1,98,9,10,1,105,18,4,10,2,8,7,66,2,16,21],this.session_options,["v","i"])),this._top_k}static get slice(){return this._slice||(this._slice=J([8,7,18,0,58,96,10,25,10,1,120,10,1,115,10,1,101,10,1,97,10,1,116,18,1,121,34,5,83,108,105,99,101,18,1,114,90,9,10,1,120,18,4,10,2,8,1,90,9,10,1,115,18,4,10,2,8,7,90,9,10,1,101,18,4,10,2,8,7,90,9,10,1,97,18,4,10,2,8,7,90,9,10,1,116,18,4,10,2,8,7,98,9,10,1,121,18,4,10,2,8,1,66,2,16,13],this.session_options,"y")),this._slice}}},"./src/pipelines.js":($,j,O)=>{/*!**************************!*\ + !*** ./src/pipelines.js ***! + \**************************/O.r(j),O.d(j,{AudioClassificationPipeline:()=>V0,AutomaticSpeechRecognitionPipeline:()=>$0,BackgroundRemovalPipeline:()=>F0,DepthEstimationPipeline:()=>M0,DocumentQuestionAnsweringPipeline:()=>q0,FeatureExtractionPipeline:()=>r,FillMaskPipeline:()=>w,ImageClassificationPipeline:()=>G0,ImageFeatureExtractionPipeline:()=>e,ImageSegmentationPipeline:()=>S0,ImageToImagePipeline:()=>Z0,ImageToTextPipeline:()=>i,ObjectDetectionPipeline:()=>n,Pipeline:()=>D,QuestionAnsweringPipeline:()=>z,SummarizationPipeline:()=>W,Text2TextGenerationPipeline:()=>T,TextClassificationPipeline:()=>I,TextGenerationPipeline:()=>A,TextToAudioPipeline:()=>p0,TokenClassificationPipeline:()=>k,TranslationPipeline:()=>E,ZeroShotAudioClassificationPipeline:()=>v0,ZeroShotClassificationPipeline:()=>l,ZeroShotImageClassificationPipeline:()=>s,ZeroShotObjectDetectionPipeline:()=>R0,pipeline:()=>e0});var G=O("./src/tokenizers.js"),Z=O("./src/models.js"),V=O("./src/models/auto/processing_auto.js");/*! ./tokenizers.js *//*! ./models.js *//*! ./models/auto/processing_auto.js */O("./src/base/processing_utils.js");/*! ./base/processing_utils.js */var N=O("./src/utils/generic.js"),J=O("./src/utils/core.js"),R=O("./src/utils/maths.js"),U=O("./src/utils/audio.js"),H=O("./src/utils/tensor.js"),L=O("./src/utils/image.js");/*! ./utils/generic.js *//*! ./utils/core.js *//*! ./utils/maths.js *//*! ./utils/audio.js *//*! ./utils/tensor.js *//*! ./utils/image.js */async function Y(N0){return Array.isArray(N0)||(N0=[N0]),await Promise.all(N0.map((P0)=>L.RawImage.read(P0)))}async function S(N0,P0){return Array.isArray(N0)||(N0=[N0]),await Promise.all(N0.map((Q0)=>typeof Q0=="string"||Q0 instanceof URL?(0,U.read_audio)(Q0,P0):Q0 instanceof Float64Array?new Float32Array(Q0):Q0))}function X(N0,P0){P0&&(N0=N0.map((J5)=>0|J5));let[Q0,a0,r0,g0]=N0;return{xmin:Q0,ymin:a0,xmax:r0,ymax:g0}}class D extends N.Callable{constructor({task:N0,model:P0,tokenizer:Q0=null,processor:a0=null}){super(),this.task=N0,this.model=P0,this.tokenizer=Q0,this.processor=a0}async dispose(){await this.model.dispose()}}class I extends D{constructor(N0){super(N0)}async _call(N0,{top_k:P0=1}={}){let Q0=this.tokenizer(N0,{padding:!0,truncation:!0}),a0=await this.model(Q0),r0=this.model.config.problem_type==="multi_label_classification"?(t0)=>t0.sigmoid():(t0)=>new H.Tensor("float32",(0,R.softmax)(t0.data),t0.dims),g0=this.model.config.id2label,J5=[];for(let t0 of a0.logits){let y5=r0(t0),R5=await(0,H.topk)(y5,P0),U5=R5[0].tolist(),T0=R5[1].tolist().map((s0,D5)=>({label:g0?g0[s0]:`LABEL_${s0}`,score:U5[D5]}));P0===1?J5.push(...T0):J5.push(T0)}return Array.isArray(N0)||P0===1?J5:J5[0]}}class k extends D{constructor(N0){super(N0)}async _call(N0,{ignore_labels:P0=["O"]}={}){let Q0=Array.isArray(N0),a0=this.tokenizer(Q0?N0:[N0],{padding:!0,truncation:!0}),r0=(await this.model(a0)).logits,g0=this.model.config.id2label,J5=[];for(let t0=0;t0V5==this.tokenizer.sep_token_id);t0[U5].map((V5,U6)=>V5==1&&(U6===0||U6>s0&&y5.findIndex((t)=>t==T0[U6])===-1));let D5=r0[U5].tolist(),L5=g0[U5].tolist();for(let V5=1;V5U6==T0[V5])!==-1)&&(D5[V5]=-1/0,L5[V5]=-1/0);let d5=(0,R.softmax)(D5).map((V5,U6)=>[V5,U6]),T5=(0,R.softmax)(L5).map((V5,U6)=>[V5,U6]);d5[0][0]=0,T5[0][0]=0;let $5=(0,J.product)(d5,T5).filter((V5)=>V5[0][1]<=V5[1][1]).map((V5)=>[V5[0][1],V5[1][1],V5[0][0]*V5[1][0]]).sort((V5,U6)=>U6[2]-V5[2]);for(let V5=0;V5D5==this.tokenizer.mask_token_id);if(y5===-1)throw Error(`Mask token (${this.tokenizer.mask_token}) not found in text.`);let R5=a0[J5][y5],U5=await(0,H.topk)(new H.Tensor("float32",(0,R.softmax)(R5.data),R5.dims),P0),T0=U5[0].tolist(),s0=U5[1].tolist();r0.push(s0.map((D5,L5)=>{let d5=t0.slice();return d5[y5]=D5,{score:T0[L5],token:Number(D5),token_str:this.tokenizer.decode([D5]),sequence:this.tokenizer.decode(d5,{skip_special_tokens:!0})}}))}return Array.isArray(N0)?r0:r0[0]}}class T extends D{_key="generated_text";constructor(N0){super(N0)}async _call(N0,P0={}){Array.isArray(N0)||(N0=[N0]),this.model.config.prefix&&(N0=N0.map((t0)=>this.model.config.prefix+t0));let Q0=this.model.config.task_specific_params;Q0&&Q0[this.task]&&Q0[this.task].prefix&&(N0=N0.map((t0)=>Q0[this.task].prefix+t0));let a0=this.tokenizer,r0={padding:!0,truncation:!0},g0;g0=this instanceof E&&"_build_translation_inputs"in a0?a0._build_translation_inputs(N0,r0,P0):a0(N0,r0);let J5=await this.model.generate({...g0,...P0});return a0.batch_decode(J5,{skip_special_tokens:!0}).map((t0)=>({[this._key]:t0}))}}class W extends T{_key="summary_text";constructor(N0){super(N0)}}class E extends T{_key="translation_text";constructor(N0){super(N0)}}function Q(N0){return Array.isArray(N0)&&N0.every((P0)=>("role"in P0)&&("content"in P0))}class A extends D{constructor(N0){super(N0)}async _call(N0,P0={}){let Q0,a0=!1,r0=!1;if(typeof N0=="string")Q0=N0=[N0];else if(Array.isArray(N0)&&N0.every((s0)=>typeof s0=="string"))a0=!0,Q0=N0;else{if(Q(N0))N0=[N0];else{if(!Array.isArray(N0)||!N0.every(Q))throw Error("Input must be a string, an array of strings, a Chat, or an array of Chats");a0=!0}r0=!0,Q0=N0.map((s0)=>this.tokenizer.apply_chat_template(s0,{tokenize:!1,add_generation_prompt:!0}))}let g0=P0.add_special_tokens??!1,J5=!r0&&(P0.return_full_text??!0);this.tokenizer.padding_side="left";let t0=this.tokenizer(Q0,{add_special_tokens:g0,padding:!0,truncation:!0}),y5=await this.model.generate({...t0,...P0}),R5=this.tokenizer.batch_decode(y5,{skip_special_tokens:!0}),U5;!J5&&t0.input_ids.dims.at(-1)>0&&(U5=this.tokenizer.batch_decode(t0.input_ids,{skip_special_tokens:!0}).map((s0)=>s0.length));let T0=Array.from({length:N0.length},(s0)=>[]);for(let s0=0;s0[P0.toLowerCase(),Q0])),this.entailment_id=this.label2id.entailment,this.entailment_id===void 0&&(console.warn("Could not find 'entailment' in label2id mapping. Using 2 as entailment_id."),this.entailment_id=2),this.contradiction_id=this.label2id.contradiction??this.label2id.not_entailment,this.contradiction_id===void 0&&(console.warn("Could not find 'contradiction' in label2id mapping. Using 0 as contradiction_id."),this.contradiction_id=0)}async _call(N0,P0,{hypothesis_template:Q0="This example is {}.",multi_label:a0=!1}={}){let r0=Array.isArray(N0);r0||(N0=[N0]),Array.isArray(P0)||(P0=[P0]);let g0=P0.map((y5)=>Q0.replace("{}",y5)),J5=a0||P0.length===1,t0=[];for(let y5 of N0){let R5=[];for(let T0 of g0){let s0=this.tokenizer(y5,{text_pair:T0,padding:!0,truncation:!0}),D5=await this.model(s0);J5?R5.push([D5.logits.data[this.contradiction_id],D5.logits.data[this.entailment_id]]):R5.push(D5.logits.data[this.entailment_id])}let U5=(J5?R5.map((T0)=>(0,R.softmax)(T0)[1]):(0,R.softmax)(R5)).map((T0,s0)=>[T0,s0]).sort((T0,s0)=>s0[0]-T0[0]);t0.push({sequence:y5,labels:U5.map((T0)=>P0[T0[1]]),scores:U5.map((T0)=>T0[0])})}return r0?t0:t0[0]}}class r extends D{constructor(N0){super(N0)}async _call(N0,{pooling:P0="none",normalize:Q0=!1,quantize:a0=!1,precision:r0="binary"}={}){let g0=this.tokenizer(N0,{padding:!0,truncation:!0}),J5=await this.model(g0),t0=J5.last_hidden_state??J5.logits??J5.token_embeddings;if(P0==="none");else if(P0==="mean")t0=(0,H.mean_pooling)(t0,g0.attention_mask);else{if(P0!=="cls")throw Error(`Pooling method '${P0}' not supported.`);t0=t0.slice(null,0)}return Q0&&(t0=t0.normalize(2,-1)),a0&&(t0=(0,H.quantize_embeddings)(t0,r0)),t0}}class e extends D{constructor(N0){super(N0)}async _call(N0,{pool:P0=null}={}){let Q0=await Y(N0),{pixel_values:a0}=await this.processor(Q0),r0=await this.model({pixel_values:a0}),g0;if(P0){if(!("pooler_output"in r0))throw Error("No pooled output was returned. Make sure the model has a 'pooler' layer when using the 'pool' option.");g0=r0.pooler_output}else g0=r0.last_hidden_state??r0.logits??r0.image_embeds;return g0}}class V0 extends D{constructor(N0){super(N0)}async _call(N0,{top_k:P0=5}={}){let Q0=this.processor.feature_extractor.config.sampling_rate,a0=await S(N0,Q0),r0=this.model.config.id2label,g0=[];for(let J5 of a0){let t0=await this.processor(J5),y5=(await this.model(t0)).logits[0],R5=await(0,H.topk)(new H.Tensor("float32",(0,R.softmax)(y5.data),y5.dims),P0),U5=R5[0].tolist(),T0=R5[1].tolist().map((s0,D5)=>({label:r0?r0[s0]:`LABEL_${s0}`,score:U5[D5]}));g0.push(T0)}return Array.isArray(N0)?g0:g0[0]}}class v0 extends D{constructor(N0){super(N0)}async _call(N0,P0,{hypothesis_template:Q0="This is a sound of {}."}={}){let a0=!Array.isArray(N0);a0&&(N0=[N0]);let r0=P0.map((R5)=>Q0.replace("{}",R5)),g0=this.tokenizer(r0,{padding:!0,truncation:!0}),J5=this.processor.feature_extractor.config.sampling_rate,t0=await S(N0,J5),y5=[];for(let R5 of t0){let U5=await this.processor(R5),T0=await this.model({...g0,...U5}),s0=(0,R.softmax)(T0.logits_per_audio.data);y5.push([...s0].map((D5,L5)=>({score:D5,label:P0[L5]})))}return a0?y5[0]:y5}}class $0 extends D{constructor(N0){super(N0)}async _call(N0,P0={}){switch(this.model.config.model_type){case"whisper":case"lite-whisper":return this._call_whisper(N0,P0);case"wav2vec2":case"wav2vec2-bert":case"unispeech":case"unispeech-sat":case"hubert":return this._call_wav2vec2(N0,P0);case"moonshine":return this._call_moonshine(N0,P0);default:throw Error(`AutomaticSpeechRecognitionPipeline does not support model type '${this.model.config.model_type}'.`)}}async _call_wav2vec2(N0,P0){P0.language&&console.warn('`language` parameter is not yet supported for `wav2vec2` models, defaulting to "English".'),P0.task&&console.warn('`task` parameter is not yet supported for `wav2vec2` models, defaulting to "transcribe".');let Q0=!Array.isArray(N0);Q0&&(N0=[N0]);let a0=this.processor.feature_extractor.config.sampling_rate,r0=await S(N0,a0),g0=[];for(let J5 of r0){let t0=await this.processor(J5),y5=(await this.model(t0)).logits[0],R5=[];for(let T0 of y5)R5.push((0,R.max)(T0.data)[1]);let U5=this.tokenizer.decode(R5);g0.push({text:U5})}return Q0?g0[0]:g0}async _call_whisper(N0,P0){let Q0=P0.return_timestamps??!1,a0=P0.chunk_length_s??0,r0=P0.force_full_sequences??!1,g0=P0.stride_length_s??null,J5={...P0};Q0==="word"&&(J5.return_token_timestamps=!0,J5.return_timestamps=!1);let t0=!Array.isArray(N0);t0&&(N0=[N0]);let y5=this.processor.feature_extractor.config.chunk_length/this.model.config.max_source_positions,R5=this.processor.feature_extractor.config.hop_length,U5=this.processor.feature_extractor.config.sampling_rate,T0=await S(N0,U5),s0=[];for(let D5 of T0){let L5=[];if(a0>0){if(g0===null)g0=a0/6;else if(a0<=g0)throw Error("`chunk_length_s` must be larger than `stride_length_s`.");let $5=U5*a0,V5=U5*g0,U6=$5-2*V5,t=0;for(;;){let y0=t+$5,O0=D5.subarray(t,y0),I0=await this.processor(O0),w0=t===0,H5=y0>=D5.length;if(L5.push({stride:[O0.length,w0?0:V5,H5?0:V5],input_features:I0.input_features,is_last:H5}),H5)break;t+=U6}}else L5=[{stride:[D5.length,0,0],input_features:(await this.processor(D5)).input_features,is_last:!0}];for(let $5 of L5){J5.num_frames=Math.floor($5.stride[0]/R5);let V5=await this.model.generate({inputs:$5.input_features,...J5});Q0==="word"?($5.tokens=V5.sequences.tolist()[0],$5.token_timestamps=V5.token_timestamps.tolist()[0].map((U6)=>(0,R.round)(U6,2))):$5.tokens=V5[0].tolist(),$5.stride=$5.stride.map((U6)=>U6/U5)}let[d5,T5]=this.tokenizer._decode_asr(L5,{time_precision:y5,return_timestamps:Q0,force_full_sequences:r0});s0.push({text:d5,...T5})}return t0?s0[0]:s0}async _call_moonshine(N0,P0){let Q0=!Array.isArray(N0);Q0&&(N0=[N0]);let a0=this.processor.feature_extractor.config.sampling_rate,r0=await S(N0,a0),g0=[];for(let J5 of r0){let t0=await this.processor(J5),y5=6*Math.floor(J5.length/a0),R5=await this.model.generate({max_new_tokens:y5,...P0,...t0}),U5=this.processor.batch_decode(R5,{skip_special_tokens:!0})[0];g0.push({text:U5})}return Q0?g0[0]:g0}}class i extends D{constructor(N0){super(N0)}async _call(N0,P0={}){let Q0=Array.isArray(N0),a0=await Y(N0),{pixel_values:r0}=await this.processor(a0),g0=[];for(let J5 of r0){J5.dims=[1,...J5.dims];let t0=await this.model.generate({inputs:J5,...P0}),y5=this.tokenizer.batch_decode(t0,{skip_special_tokens:!0}).map((R5)=>({generated_text:R5.trim()}));g0.push(y5)}return Q0?g0:g0[0]}}class G0 extends D{constructor(N0){super(N0)}async _call(N0,{top_k:P0=5}={}){let Q0=await Y(N0),{pixel_values:a0}=await this.processor(Q0),r0=await this.model({pixel_values:a0}),g0=this.model.config.id2label,J5=[];for(let t0 of r0.logits){let y5=await(0,H.topk)(new H.Tensor("float32",(0,R.softmax)(t0.data),t0.dims),P0),R5=y5[0].tolist(),U5=y5[1].tolist().map((T0,s0)=>({label:g0?g0[T0]:`LABEL_${T0}`,score:R5[s0]}));J5.push(U5)}return Array.isArray(N0)?J5:J5[0]}}class S0 extends D{constructor(N0){super(N0),this.subtasks_mapping={panoptic:"post_process_panoptic_segmentation",instance:"post_process_instance_segmentation",semantic:"post_process_semantic_segmentation"}}async _call(N0,{threshold:P0=0.5,mask_threshold:Q0=0.5,overlap_mask_area_threshold:a0=0.8,label_ids_to_fuse:r0=null,target_sizes:g0=null,subtask:J5=null}={}){if(Array.isArray(N0)&&N0.length!==1)throw Error("Image segmentation pipeline currently only supports a batch size of 1.");let t0=await Y(N0),y5=t0.map((T5)=>[T5.height,T5.width]),R5=await this.processor(t0),{inputNames:U5,outputNames:T0}=this.model.sessions.model;if(!U5.includes("pixel_values")){if(U5.length!==1)throw Error(`Expected a single input name, but got ${U5.length} inputs: ${U5}.`);let T5=U5[0];if(T5 in R5)throw Error(`Input name ${T5} already exists in the inputs.`);R5[T5]=R5.pixel_values}let s0=await this.model(R5),D5=null;if(J5!==null)D5=this.subtasks_mapping[J5];else if(this.processor.image_processor){for(let[T5,$5]of Object.entries(this.subtasks_mapping))if($5 in this.processor.image_processor){D5=this.processor.image_processor[$5].bind(this.processor.image_processor),J5=T5;break}}let L5=this.model.config.id2label,d5=[];if(J5)if(J5==="panoptic"||J5==="instance"){let T5=D5(s0,P0,Q0,a0,r0,g0??y5)[0],$5=T5.segmentation;for(let V5 of T5.segments_info){let U6=new Uint8ClampedArray($5.data.length);for(let y0=0;y0<$5.data.length;++y0)$5.data[y0]===V5.id&&(U6[y0]=255);let t=new L.RawImage(U6,$5.dims[1],$5.dims[0],1);d5.push({score:V5.score,label:L5[V5.label_id],mask:t})}}else{if(J5!=="semantic")throw Error(`Subtask ${J5} not supported.`);{let{segmentation:T5,labels:$5}=D5(s0,g0??y5)[0];for(let V5 of $5){let U6=new Uint8ClampedArray(T5.data.length);for(let y0=0;y0O0<-0.00001||O0>1.00001)&&t.sigmoid_();let y0=await L.RawImage.fromTensor(t.mul_(255).to("uint8")).resize(U6[1],U6[0]);d5.push({label:null,score:null,mask:y0})}}return d5}}class F0 extends S0{constructor(N0){super(N0)}async _call(N0,P0={}){if(Array.isArray(N0)&&N0.length!==1)throw Error("Background removal pipeline currently only supports a batch size of 1.");let Q0=await Y(N0),a0=await super._call(N0,P0);return Q0.map((r0,g0)=>{let J5=r0.clone();return J5.putAlpha(a0[g0].mask),J5})}}class s extends D{constructor(N0){super(N0)}async _call(N0,P0,{hypothesis_template:Q0="This is a photo of {}"}={}){let a0=Array.isArray(N0),r0=await Y(N0),g0=P0.map((T0)=>Q0.replace("{}",T0)),J5=this.tokenizer(g0,{padding:this.model.config.model_type!=="siglip"||"max_length",truncation:!0}),{pixel_values:t0}=await this.processor(r0),y5=await this.model({...J5,pixel_values:t0}),R5=this.model.config.model_type==="siglip"?(T0)=>T0.sigmoid().data:(T0)=>(0,R.softmax)(T0.data),U5=[];for(let T0 of y5.logits_per_image){let s0=[...R5(T0)].map((D5,L5)=>({score:D5,label:P0[L5]}));s0.sort((D5,L5)=>L5.score-D5.score),U5.push(s0)}return a0?U5:U5[0]}}class n extends D{constructor(N0){super(N0)}async _call(N0,{threshold:P0=0.9,percentage:Q0=!1}={}){let a0=Array.isArray(N0);if(a0&&N0.length!==1)throw Error("Object detection pipeline currently only supports a batch size of 1.");let r0=await Y(N0),g0=Q0?null:r0.map((s0)=>[s0.height,s0.width]),{pixel_values:J5,pixel_mask:t0}=await this.processor(r0),y5=await this.model({pixel_values:J5,pixel_mask:t0}),R5=this.processor.image_processor.post_process_object_detection(y5,P0,g0),U5=this.model.config.id2label,T0=R5.map((s0)=>s0.boxes.map((D5,L5)=>({score:s0.scores[L5],label:U5[s0.classes[L5]],box:X(D5,!Q0)})));return a0?T0:T0[0]}}class R0 extends D{constructor(N0){super(N0)}async _call(N0,P0,{threshold:Q0=0.1,top_k:a0=null,percentage:r0=!1}={}){let g0=Array.isArray(N0),J5=await Y(N0),t0=this.tokenizer(P0,{padding:!0,truncation:!0}),y5=await this.processor(J5),R5=[];for(let U5=0;U5({score:T5.scores[V5],label:T5.labels[V5],box:X($5,!r0)}))}else{let T5=this.processor.image_processor.post_process_object_detection(L5,Q0,s0,!0)[0];d5=T5.boxes.map(($5,V5)=>({score:T5.scores[V5],label:P0[T5.classes[V5]],box:X($5,!r0)}))}d5.sort((T5,$5)=>$5.score-T5.score),a0!==null&&(d5=d5.slice(0,a0)),R5.push(d5)}return g0?R5:R5[0]}}class q0 extends D{constructor(N0){super(N0)}async _call(N0,P0,Q0={}){let a0=(await Y(N0))[0],{pixel_values:r0}=await this.processor(a0),g0=`${P0}`,J5=this.tokenizer(g0,{add_special_tokens:!1,padding:!0,truncation:!0}).input_ids,t0=await this.model.generate({inputs:r0,max_length:this.model.config.decoder.max_position_embeddings,decoder_input_ids:J5,...Q0}),y5=this.tokenizer.batch_decode(t0)[0].match(/(.*?)<\/s_answer>/),R5=null;return y5&&y5.length>=2&&(R5=y5[1].trim()),[{answer:R5}]}}class p0 extends D{DEFAULT_VOCODER_ID="Xenova/speecht5_hifigan";constructor(N0){super(N0),this.vocoder=N0.vocoder??null}async _call(N0,{speaker_embeddings:P0=null}={}){return this.processor?this._call_text_to_spectrogram(N0,{speaker_embeddings:P0}):this._call_text_to_waveform(N0)}async _call_text_to_waveform(N0){let P0=this.tokenizer(N0,{padding:!0,truncation:!0}),{waveform:Q0}=await this.model(P0),a0=this.model.config.sampling_rate;return new U.RawAudio(Q0.data,a0)}async _call_text_to_spectrogram(N0,{speaker_embeddings:P0}){if(this.vocoder||(console.log("No vocoder specified, using default HifiGan vocoder."),this.vocoder=await Z.AutoModel.from_pretrained(this.DEFAULT_VOCODER_ID,{dtype:"fp32"})),(typeof P0=="string"||P0 instanceof URL)&&(P0=new Float32Array(await(await fetch(P0)).arrayBuffer())),P0 instanceof Float32Array)P0=new H.Tensor("float32",P0,[1,P0.length]);else if(!(P0 instanceof H.Tensor))throw Error("Speaker embeddings must be a `Tensor`, `Float32Array`, `string`, or `URL`.");let{input_ids:Q0}=this.tokenizer(N0,{padding:!0,truncation:!0}),{waveform:a0}=await this.model.generate_speech(Q0,P0,{vocoder:this.vocoder}),r0=this.processor.feature_extractor.config.sampling_rate;return new U.RawAudio(a0.data,r0)}}class Z0 extends D{constructor(N0){super(N0)}async _call(N0){let P0=await Y(N0),Q0=await this.processor(P0),a0=await this.model(Q0),r0=[];for(let g0 of a0.reconstruction){let J5=g0.squeeze().clamp_(0,1).mul_(255).round_().to("uint8");r0.push(L.RawImage.fromTensor(J5))}return r0.length>1?r0:r0[0]}}class M0 extends D{constructor(N0){super(N0)}async _call(N0){let P0=await Y(N0),Q0=await this.processor(P0),{predicted_depth:a0}=await this.model(Q0),r0=[];for(let g0=0;g01?r0:r0[0]}}let q5=Object.freeze({"text-classification":{tokenizer:G.AutoTokenizer,pipeline:I,model:Z.AutoModelForSequenceClassification,default:{model:"Xenova/distilbert-base-uncased-finetuned-sst-2-english"},type:"text"},"token-classification":{tokenizer:G.AutoTokenizer,pipeline:k,model:Z.AutoModelForTokenClassification,default:{model:"Xenova/bert-base-multilingual-cased-ner-hrl"},type:"text"},"question-answering":{tokenizer:G.AutoTokenizer,pipeline:z,model:Z.AutoModelForQuestionAnswering,default:{model:"Xenova/distilbert-base-cased-distilled-squad"},type:"text"},"fill-mask":{tokenizer:G.AutoTokenizer,pipeline:w,model:Z.AutoModelForMaskedLM,default:{model:"Xenova/bert-base-uncased"},type:"text"},summarization:{tokenizer:G.AutoTokenizer,pipeline:W,model:Z.AutoModelForSeq2SeqLM,default:{model:"Xenova/distilbart-cnn-6-6"},type:"text"},translation:{tokenizer:G.AutoTokenizer,pipeline:E,model:Z.AutoModelForSeq2SeqLM,default:{model:"Xenova/t5-small"},type:"text"},"text2text-generation":{tokenizer:G.AutoTokenizer,pipeline:T,model:Z.AutoModelForSeq2SeqLM,default:{model:"Xenova/flan-t5-small"},type:"text"},"text-generation":{tokenizer:G.AutoTokenizer,pipeline:A,model:Z.AutoModelForCausalLM,default:{model:"Xenova/gpt2"},type:"text"},"zero-shot-classification":{tokenizer:G.AutoTokenizer,pipeline:l,model:Z.AutoModelForSequenceClassification,default:{model:"Xenova/distilbert-base-uncased-mnli"},type:"text"},"audio-classification":{pipeline:V0,model:Z.AutoModelForAudioClassification,processor:V.AutoProcessor,default:{model:"Xenova/wav2vec2-base-superb-ks"},type:"audio"},"zero-shot-audio-classification":{tokenizer:G.AutoTokenizer,pipeline:v0,model:Z.AutoModel,processor:V.AutoProcessor,default:{model:"Xenova/clap-htsat-unfused"},type:"multimodal"},"automatic-speech-recognition":{tokenizer:G.AutoTokenizer,pipeline:$0,model:[Z.AutoModelForSpeechSeq2Seq,Z.AutoModelForCTC],processor:V.AutoProcessor,default:{model:"Xenova/whisper-tiny.en"},type:"multimodal"},"text-to-audio":{tokenizer:G.AutoTokenizer,pipeline:p0,model:[Z.AutoModelForTextToWaveform,Z.AutoModelForTextToSpectrogram],processor:[V.AutoProcessor,null],default:{model:"Xenova/speecht5_tts"},type:"text"},"image-to-text":{tokenizer:G.AutoTokenizer,pipeline:i,model:Z.AutoModelForVision2Seq,processor:V.AutoProcessor,default:{model:"Xenova/vit-gpt2-image-captioning"},type:"multimodal"},"image-classification":{pipeline:G0,model:Z.AutoModelForImageClassification,processor:V.AutoProcessor,default:{model:"Xenova/vit-base-patch16-224"},type:"multimodal"},"image-segmentation":{pipeline:S0,model:[Z.AutoModelForImageSegmentation,Z.AutoModelForSemanticSegmentation,Z.AutoModelForUniversalSegmentation],processor:V.AutoProcessor,default:{model:"Xenova/detr-resnet-50-panoptic"},type:"multimodal"},"background-removal":{pipeline:F0,model:[Z.AutoModelForImageSegmentation,Z.AutoModelForSemanticSegmentation,Z.AutoModelForUniversalSegmentation],processor:V.AutoProcessor,default:{model:"Xenova/modnet"},type:"image"},"zero-shot-image-classification":{tokenizer:G.AutoTokenizer,pipeline:s,model:Z.AutoModel,processor:V.AutoProcessor,default:{model:"Xenova/clip-vit-base-patch32"},type:"multimodal"},"object-detection":{pipeline:n,model:Z.AutoModelForObjectDetection,processor:V.AutoProcessor,default:{model:"Xenova/detr-resnet-50"},type:"multimodal"},"zero-shot-object-detection":{tokenizer:G.AutoTokenizer,pipeline:R0,model:Z.AutoModelForZeroShotObjectDetection,processor:V.AutoProcessor,default:{model:"Xenova/owlvit-base-patch32"},type:"multimodal"},"document-question-answering":{tokenizer:G.AutoTokenizer,pipeline:q0,model:Z.AutoModelForDocumentQuestionAnswering,processor:V.AutoProcessor,default:{model:"Xenova/donut-base-finetuned-docvqa"},type:"multimodal"},"image-to-image":{pipeline:Z0,model:Z.AutoModelForImageToImage,processor:V.AutoProcessor,default:{model:"Xenova/swin2SR-classical-sr-x2-64"},type:"image"},"depth-estimation":{pipeline:M0,model:Z.AutoModelForDepthEstimation,processor:V.AutoProcessor,default:{model:"Xenova/dpt-large"},type:"image"},"feature-extraction":{tokenizer:G.AutoTokenizer,pipeline:r,model:Z.AutoModel,default:{model:"Xenova/all-MiniLM-L6-v2"},type:"text"},"image-feature-extraction":{processor:V.AutoProcessor,pipeline:e,model:[Z.AutoModelForImageFeatureExtraction,Z.AutoModel],default:{model:"Xenova/vit-base-patch16-224-in21k"},type:"image"}}),E0=Object.freeze({"sentiment-analysis":"text-classification",ner:"token-classification",asr:"automatic-speech-recognition","text-to-speech":"text-to-audio",embeddings:"feature-extraction"});async function e0(N0,P0=null,{progress_callback:Q0=null,config:a0=null,cache_dir:r0=null,local_files_only:g0=!1,revision:J5="main",device:t0=null,dtype:y5=null,subfolder:R5="onnx",use_external_data_format:U5=null,model_file_name:T0=null,session_options:s0={}}={}){N0=E0[N0]??N0;let D5=q5[N0.split("_",1)[0]];if(!D5)throw Error(`Unsupported pipeline: ${N0}. Must be one of [${Object.keys(q5)}]`);P0||(P0=D5.default.model,console.log(`No model specified. Using default model: "${P0}".`));let L5={progress_callback:Q0,config:a0,cache_dir:r0,local_files_only:g0,revision:J5,device:t0,dtype:y5,subfolder:R5,use_external_data_format:U5,model_file_name:T0,session_options:s0},d5=new Map([["tokenizer",D5.tokenizer],["model",D5.model],["processor",D5.processor]]),T5=await async function($5,V5,U6){let t=Object.create(null),y0=[];for(let[O0,I0]of $5.entries()){if(!I0)continue;let w0;w0=Array.isArray(I0)?new Promise(async(H5,N5)=>{let g5;for(let Q5 of I0){if(Q5===null)return void H5(null);try{return void H5(await Q5.from_pretrained(V5,U6))}catch(S5){if(S5.message?.includes("Unsupported model type"))g5=S5;else{if(!S5.message?.includes("Could not locate file"))return void N5(S5);g5=S5}}}N5(g5)}):I0.from_pretrained(V5,U6),t[O0]=w0,y0.push(w0)}await Promise.all(y0);for(let[O0,I0]of Object.entries(t))t[O0]=await I0;return t}(d5,P0,L5);return T5.task=N0,(0,J.dispatchCallback)(Q0,{status:"ready",task:N0,model:P0}),new D5.pipeline(T5)}},"./src/tokenizers.js":($,j,O)=>{/*!***************************!*\ + !*** ./src/tokenizers.js ***! + \***************************/O.r(j),O.d(j,{AlbertTokenizer:()=>Z6,AutoTokenizer:()=>N1,BartTokenizer:()=>x1,BertTokenizer:()=>w6,BlenderbotSmallTokenizer:()=>d1,BlenderbotTokenizer:()=>u1,BloomTokenizer:()=>z9,CLIPTokenizer:()=>p6,CamembertTokenizer:()=>E5,CodeGenTokenizer:()=>m6,CodeLlamaTokenizer:()=>J9,CohereTokenizer:()=>R1,ConvBertTokenizer:()=>I9,DebertaTokenizer:()=>y9,DebertaV2Tokenizer:()=>V6,DistilBertTokenizer:()=>_5,ElectraTokenizer:()=>o6,EsmTokenizer:()=>G9,FalconTokenizer:()=>f9,GPT2Tokenizer:()=>H1,GPTNeoXTokenizer:()=>r9,GemmaTokenizer:()=>A1,Grok1Tokenizer:()=>x9,HerbertTokenizer:()=>a9,LlamaTokenizer:()=>p9,M2M100Tokenizer:()=>v9,MBart50Tokenizer:()=>L1,MBartTokenizer:()=>o9,MPNetTokenizer:()=>t6,MarianTokenizer:()=>P1,MgpstrTokenizer:()=>l1,MobileBertTokenizer:()=>c6,NllbTokenizer:()=>n9,NougatTokenizer:()=>W1,PreTrainedTokenizer:()=>Y5,Qwen2Tokenizer:()=>S1,RoFormerTokenizer:()=>z6,RobertaTokenizer:()=>_1,SiglipTokenizer:()=>B0,SpeechT5Tokenizer:()=>V1,SqueezeBertTokenizer:()=>Y9,T5Tokenizer:()=>b9,TokenizerModel:()=>Q,VitsTokenizer:()=>M1,Wav2Vec2CTCTokenizer:()=>g1,WhisperTokenizer:()=>L6,XLMRobertaTokenizer:()=>Y1,XLMTokenizer:()=>v5,is_chinese_char:()=>k});var G=O("./src/utils/generic.js"),Z=O("./src/utils/core.js"),V=O("./src/utils/hub.js"),N=O("./src/utils/maths.js"),J=O("./src/utils/tensor.js"),R=O("./src/utils/data-structures.js"),U=O("./node_modules/@huggingface/jinja/dist/index.js"),H=O("./src/models/whisper/common_whisper.js");/*! ./utils/generic.js *//*! ./utils/core.js *//*! ./utils/hub.js *//*! ./utils/maths.js *//*! ./utils/tensor.js *//*! ./utils/data-structures.js *//*! @huggingface/jinja *//*! ./models/whisper/common_whisper.js */async function L(p,x0){let X0=await Promise.all([(0,V.getModelJSON)(p,"tokenizer.json",!0,x0),(0,V.getModelJSON)(p,"tokenizer_config.json",!0,x0)]);return x0.legacy!==null&&(X0[1].legacy=x0.legacy),X0}function Y(p,x0=!0){if(p.Regex!==void 0){let X0=p.Regex.replace(/\\([#&~])/g,"$1");for(let[W0,h0]of W)X0=X0.replaceAll(W0,h0);return new RegExp(X0,"gu")}if(p.String!==void 0){let X0=(0,Z.escapeRegExp)(p.String);return new RegExp(x0?X0:`(${X0})`,"gu")}return console.warn("Unknown pattern type:",p),null}function S(p){return new Map(Object.entries(p))}function X(p){let x0=p.dims;switch(x0.length){case 1:return p.tolist();case 2:if(x0[0]!==1)throw Error("Unable to decode tensor with `batch size !== 1`. Use `tokenizer.batch_decode(...)` for batched inputs.");return p.tolist()[0];default:throw Error(`Expected tensor to have 1-2 dimensions, got ${x0.length}.`)}}function D(p){return p.replace(/ \./g,".").replace(/ \?/g,"?").replace(/ \!/g,"!").replace(/ ,/g,",").replace(/ \' /g,"'").replace(/ n\'t/g,"n't").replace(/ \'m/g,"'m").replace(/ \'s/g,"'s").replace(/ \'ve/g,"'ve").replace(/ \'re/g,"'re")}function I(p){return p.replace(/\p{M}/gu,"")}function k(p){return p>=19968&&p<=40959||p>=13312&&p<=19903||p>=131072&&p<=173791||p>=173824&&p<=177983||p>=177984&&p<=178207||p>=178208&&p<=183983||p>=63744&&p<=64255||p>=194560&&p<=195103}let z="\\p{P}\\u0021-\\u002F\\u003A-\\u0040\\u005B-\\u0060\\u007B-\\u007E",w=new RegExp(`^[${z}]+$`,"gu"),T=".,!?…。,、।۔،",W=new Map([["(?i:'s|'t|'re|'ve|'m|'ll|'d)","(?:'([sS]|[tT]|[rR][eE]|[vV][eE]|[mM]|[lL][lL]|[dD]))"],[` ?[^(\\s|[${T}])]+`,` ?[^\\s${T}]+`]]);class E{constructor(p){this.content=p.content,this.id=p.id,this.single_word=p.single_word??!1,this.lstrip=p.lstrip??!1,this.rstrip=p.rstrip??!1,this.special=p.special??!1,this.normalized=p.normalized??null}}class Q extends G.Callable{constructor(p){super(),this.config=p,this.vocab=[],this.tokens_to_ids=new Map,this.unk_token_id=void 0,this.unk_token=void 0,this.end_of_word_suffix=void 0,this.fuse_unk=this.config.fuse_unk??!1}static fromConfig(p,...x0){switch(p.type){case"WordPiece":return new A(p);case"Unigram":return new l(p,...x0);case"BPE":return new V0(p);default:if(p.vocab)return Array.isArray(p.vocab)?new l(p,...x0):Object.hasOwn(p,"continuing_subword_prefix")&&Object.hasOwn(p,"unk_token")?Object.hasOwn(p,"merges")?new V0(p):new A(p):new v0(p,...x0);throw Error(`Unknown TokenizerModel type: ${p.type}`)}}_call(p){return p=this.encode(p),this.fuse_unk&&(p=function(x0,X0,W0){let h0=[],c0=0;for(;c0this.tokens_to_ids.get(x0)??this.unk_token_id)}convert_ids_to_tokens(p){return p.map((x0)=>this.vocab[x0]??this.unk_token)}}class A extends Q{constructor(p){super(p),this.tokens_to_ids=S(p.vocab),this.unk_token_id=this.tokens_to_ids.get(p.unk_token),this.unk_token=p.unk_token,this.max_input_chars_per_word=p.max_input_chars_per_word??100,this.vocab=Array(this.tokens_to_ids.size);for(let[x0,X0]of this.tokens_to_ids)this.vocab[X0]=x0}encode(p){let x0=[];for(let X0 of p){let W0=[...X0];if(W0.length>this.max_input_chars_per_word){x0.push(this.unk_token);continue}let h0=!1,c0=0,F5=[];for(;c00&&(P5=this.config.continuing_subword_prefix+P5),this.tokens_to_ids.has(P5)){b5=P5;break}--W5}if(b5===null){h0=!0;break}F5.push(b5),c0=W5}h0?x0.push(this.unk_token):x0.push(...F5)}return x0}}class l extends Q{constructor(p,x0){super(p);let X0=p.vocab.length;this.vocab=Array(X0),this.scores=Array(X0);for(let W0=0;W0[W0,h0])),this.bos_token=" ",this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=x0.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.unk_token=this.vocab[this.unk_token_id],this.minScore=(0,N.min)(this.scores)[0],this.unk_score=this.minScore-10,this.scores[this.unk_token_id]=this.unk_score,this.trie=new R.CharTrie,this.trie.extend(this.vocab),this.fuse_unk=!0}populateNodes(p){let x0=p.chars,X0=0;for(;X0{let p=[...Array.from({length:94},(h0,c0)=>c0+33),...Array.from({length:"¬".charCodeAt(0)-"¡".charCodeAt(0)+1},(h0,c0)=>c0+"¡".charCodeAt(0)),...Array.from({length:"ÿ".charCodeAt(0)-"®".charCodeAt(0)+1},(h0,c0)=>c0+"®".charCodeAt(0))],x0=p.slice(),X0=0;for(let h0=0;h0<256;++h0)p.includes(h0)||(p.push(h0),x0.push(256+X0),X0+=1);let W0=x0.map((h0)=>String.fromCharCode(h0));return Object.fromEntries(p.map((h0,c0)=>[h0,W0[c0]]))})(),e=(0,Z.reverseDictionary)(r);class V0 extends Q{constructor(p){super(p),this.tokens_to_ids=S(p.vocab),this.unk_token_id=this.tokens_to_ids.get(p.unk_token),this.unk_token=p.unk_token,this.vocab=Array(this.tokens_to_ids.size);for(let[X0,W0]of this.tokens_to_ids)this.vocab[W0]=X0;let x0=Array.isArray(p.merges[0]);this.merges=x0?p.merges:p.merges.map((X0)=>X0.split(" ",2)),this.bpe_ranks=new Map(this.merges.map((X0,W0)=>[JSON.stringify(X0),W0])),this.end_of_word_suffix=p.end_of_word_suffix,this.continuing_subword_suffix=p.continuing_subword_suffix??null,this.byte_fallback=this.config.byte_fallback??!1,this.byte_fallback&&(this.text_encoder=new TextEncoder),this.ignore_merges=this.config.ignore_merges??!1,this.max_length_to_cache=256,this.cache_capacity=1e4,this.cache=new R.LRUCache(this.cache_capacity)}clear_cache(){this.cache.clear()}bpe(p){if(p.length===0)return[];let x0=this.cache.get(p);if(x0!==void 0)return x0;let X0=Array.from(p);this.end_of_word_suffix&&(X0[X0.length-1]+=this.end_of_word_suffix);let W0=[];if(X0.length>1){let h0=new R.PriorityQueue((W5,b5)=>W5.score`<0x${F5.toString(16).toUpperCase().padStart(2,"0")}>`);c0.every((F5)=>this.tokens_to_ids.has(F5))?x0.push(...c0):x0.push(this.unk_token)}else x0.push(this.unk_token)}return x0}}class v0 extends Q{constructor(p,x0){super(p),this.tokens_to_ids=S(x0.target_lang?p.vocab[x0.target_lang]:p.vocab),this.bos_token=x0.bos_token,this.bos_token_id=this.tokens_to_ids.get(this.bos_token),this.eos_token=x0.eos_token,this.eos_token_id=this.tokens_to_ids.get(this.eos_token),this.pad_token=x0.pad_token,this.pad_token_id=this.tokens_to_ids.get(this.pad_token),this.unk_token=x0.unk_token,this.unk_token_id=this.tokens_to_ids.get(this.unk_token),this.vocab=Array(this.tokens_to_ids.size);for(let[X0,W0]of this.tokens_to_ids)this.vocab[W0]=X0}encode(p){return p}}class $0 extends G.Callable{constructor(p){super(),this.config=p}static fromConfig(p){if(p===null)return null;switch(p.type){case"BertNormalizer":return new q5(p);case"Precompiled":return new I0(p);case"Sequence":return new M0(p);case"Replace":return new i(p);case"NFC":return new S0(p);case"NFD":return new F0(p);case"NFKC":return new s(p);case"NFKD":return new n(p);case"Strip":return new R0(p);case"StripAccents":return new q0(p);case"Lowercase":return new p0(p);case"Prepend":return new Z0(p);default:throw Error(`Unknown Normalizer type: ${p.type}`)}}normalize(p){throw Error("normalize should be implemented in subclass.")}_call(p){return this.normalize(p)}}class i extends $0{normalize(p){let x0=Y(this.config.pattern);return x0===null?p:p.replaceAll(x0,this.config.content)}}class G0 extends $0{form=void 0;normalize(p){return p=p.normalize(this.form)}}class S0 extends G0{form="NFC"}class F0 extends G0{form="NFD"}class s extends G0{form="NFKC"}class n extends G0{form="NFKD"}class R0 extends $0{normalize(p){return this.config.strip_left&&this.config.strip_right?p=p.trim():(this.config.strip_left&&(p=p.trimStart()),this.config.strip_right&&(p=p.trimEnd())),p}}class q0 extends $0{normalize(p){return p=I(p)}}class p0 extends $0{normalize(p){return p=p.toLowerCase()}}class Z0 extends $0{normalize(p){return p=this.config.prepend+p}}class M0 extends $0{constructor(p){super(p),this.normalizers=p.normalizers.map((x0)=>$0.fromConfig(x0))}normalize(p){return this.normalizers.reduce((x0,X0)=>X0.normalize(x0),p)}}class q5 extends $0{_tokenize_chinese_chars(p){let x0=[];for(let X0=0;X0this.pre_tokenize_text(X0,x0)):this.pre_tokenize_text(p,x0)).flat()}_call(p,x0){return this.pre_tokenize(p,x0)}}class e0 extends E0{constructor(p){super(),this.pattern=new RegExp(`[^\\s${z}]+|[${z}]`,"gu")}pre_tokenize_text(p,x0){return p.trim().match(this.pattern)||[]}}class N0 extends E0{constructor(p){super(),this.config=p,this.add_prefix_space=this.config.add_prefix_space,this.trim_offsets=this.config.trim_offsets,this.use_regex=this.config.use_regex??!0,this.pattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu,this.byte_encoder=r,this.text_encoder=new TextEncoder}pre_tokenize_text(p,x0){return this.add_prefix_space&&!p.startsWith(" ")&&(p=" "+p),(this.use_regex?p.match(this.pattern)||[]:[p]).map((X0)=>Array.from(this.text_encoder.encode(X0),(W0)=>this.byte_encoder[W0]).join(""))}}class P0 extends E0{constructor(p){super(),this.config=p,this.pattern=Y(this.config.pattern,this.config.invert)}pre_tokenize_text(p,x0){return this.pattern===null?[]:this.config.invert?p.match(this.pattern)||[]:this.config.behavior?.toLowerCase()==="removed"?p.split(this.pattern).filter((X0)=>X0):function(X0,W0){let h0=[],c0=0;for(let F5 of X0.matchAll(W0)){let W5=F5[0];c00&&h0.push(W5),c0=F5.index+W5.length}return c0r0.fromConfig(x0))}post_process(p,x0=null,X0={}){let W0;for(let h0 of this.processors)if(h0 instanceof y5){if(p=h0.post_process(p).tokens,x0)x0=h0.post_process(x0).tokens}else{let c0=h0.post_process(p,x0,X0);p=c0.tokens,W0=c0.token_type_ids}return{tokens:p,token_type_ids:W0}}}class U5 extends G.Callable{constructor(p){super(),this.config=p,this.added_tokens=[],this.end_of_word_suffix=null,this.trim_offsets=p.trim_offsets}static fromConfig(p){if(p===null)return null;switch(p.type){case"WordPiece":return new d5(p);case"Metaspace":return new O0(p);case"ByteLevel":return new T5(p);case"Replace":return new T0(p);case"ByteFallback":return new s0(p);case"Fuse":return new D5(p);case"Strip":return new L5(p);case"Sequence":return new V5(p);case"CTC":return new $5(p);case"BPEDecoder":return new U6(p);default:throw Error(`Unknown Decoder type: ${p.type}`)}}_call(p){return this.decode(p)}decode(p){return this.decode_chain(p).join("")}decode_chain(p){throw Error("`decode_chain` should be implemented in subclass.")}}class T0 extends U5{decode_chain(p){let x0=Y(this.config.pattern);return x0===null?p:p.map((X0)=>X0.replaceAll(x0,this.config.content))}}class s0 extends U5{constructor(p){super(p),this.text_decoder=new TextDecoder}decode_chain(p){let x0=[],X0=[];for(let W0 of p){let h0=null;if(W0.length===6&&W0.startsWith("<0x")&&W0.endsWith(">")){let c0=parseInt(W0.slice(3,5),16);isNaN(c0)||(h0=c0)}if(h0!==null)X0.push(h0);else{if(X0.length>0){let c0=this.text_decoder.decode(Uint8Array.from(X0));x0.push(c0),X0=[]}x0.push(W0)}}if(X0.length>0){let W0=this.text_decoder.decode(Uint8Array.from(X0));x0.push(W0),X0=[]}return x0}}class D5 extends U5{decode_chain(p){return[p.join("")]}}class L5 extends U5{constructor(p){super(p),this.content=this.config.content,this.start=this.config.start,this.stop=this.config.stop}decode_chain(p){return p.map((x0)=>{let X0=0;for(let h0=0;h0(X0!==0&&(x0=x0.startsWith(this.config.prefix)?x0.replace(this.config.prefix,""):" "+x0),this.cleanup&&(x0=D(x0)),x0))}}class T5 extends U5{constructor(p){super(p),this.byte_decoder=e,this.text_decoder=new TextDecoder("utf-8",{fatal:!1,ignoreBOM:!0}),this.end_of_word_suffix=null}convert_tokens_to_string(p){let x0=p.join(""),X0=new Uint8Array([...x0].map((W0)=>this.byte_decoder[W0]));return this.text_decoder.decode(X0)}decode_chain(p){let x0=[],X0=[];for(let W0 of p)this.added_tokens.find((h0)=>h0.content===W0)!==void 0?(X0.length>0&&(x0.push(this.convert_tokens_to_string(X0)),X0=[]),x0.push(W0)):X0.push(W0);return X0.length>0&&x0.push(this.convert_tokens_to_string(X0)),x0}}class $5 extends U5{constructor(p){super(p),this.pad_token=this.config.pad_token,this.word_delimiter_token=this.config.word_delimiter_token,this.cleanup=this.config.cleanup}convert_tokens_to_string(p){if(p.length===0)return"";let x0=[p[0]];for(let W0=1;W0W0!==this.pad_token).join("");return this.cleanup&&(X0=D(X0).replaceAll(this.word_delimiter_token," ").trim()),X0}decode_chain(p){return[this.convert_tokens_to_string(p)]}}class V5 extends U5{constructor(p){super(p),this.decoders=p.decoders.map((x0)=>U5.fromConfig(x0))}decode_chain(p){return this.decoders.reduce((x0,X0)=>X0.decode_chain(x0),p)}}class U6 extends U5{constructor(p){super(p),this.suffix=this.config.suffix}decode_chain(p){return p.map((x0,X0)=>x0.replaceAll(this.suffix,X0===p.length-1?"":" "))}}class t extends U5{decode_chain(p){let x0="";for(let X0=1;X0X0.normalize("NFKC")).join("~");else p=p.normalize("NFKC");return p}}class w0 extends E0{constructor(p){super(),this.tokenizers=p.pretokenizers.map((x0)=>E0.fromConfig(x0))}pre_tokenize_text(p,x0){return this.tokenizers.reduce((X0,W0)=>W0.pre_tokenize(X0,x0),[p])}}class H5 extends E0{constructor(p){super()}pre_tokenize_text(p,x0){return p.match(/\w+|[^\w\s]+/g)||[]}}class N5 extends E0{constructor(p){super()}pre_tokenize_text(p,x0){return function(X0){return X0.match(/\S+/g)||[]}(p)}}class g5 extends E0{constructor(p){super(),this.config=p,this.pattern=Y(this.config.pattern),this.content=this.config.content}pre_tokenize_text(p,x0){return this.pattern===null?[p]:[p.replaceAll(this.pattern,this.config.content)]}}let Q5=["bos_token","eos_token","unk_token","sep_token","pad_token","cls_token","mask_token"];function S5(p,x0,X0,W0){for(let h0 of Object.keys(p)){let c0=x0-p[h0].length,F5=X0(h0),W5=Array(c0).fill(F5);p[h0]=W0==="right"?(0,Z.mergeArrays)(p[h0],W5):(0,Z.mergeArrays)(W5,p[h0])}}function K6(p,x0){for(let X0 of Object.keys(p))p[X0].length=x0}class Y5 extends G.Callable{return_token_type_ids=!1;padding_side="right";constructor(p,x0){super(),this._tokenizer_config=x0,this.normalizer=$0.fromConfig(p.normalizer),this.pre_tokenizer=E0.fromConfig(p.pre_tokenizer),this.model=Q.fromConfig(p.model,x0),this.post_processor=r0.fromConfig(p.post_processor),this.decoder=U5.fromConfig(p.decoder),this.special_tokens=[],this.all_special_ids=[],this.added_tokens=[];for(let X0 of p.added_tokens){let W0=new E(X0);this.added_tokens.push(W0),this.model.tokens_to_ids.set(W0.content,W0.id),this.model.vocab[W0.id]=W0.content,W0.special&&(this.special_tokens.push(W0.content),this.all_special_ids.push(W0.id))}if(this.additional_special_tokens=x0.additional_special_tokens??[],this.special_tokens.push(...this.additional_special_tokens),this.special_tokens=[...new Set(this.special_tokens)],this.decoder&&(this.decoder.added_tokens=this.added_tokens,this.decoder.end_of_word_suffix=this.model.end_of_word_suffix),this.added_tokens_splitter=new R.DictionarySplitter(this.added_tokens.map((X0)=>X0.content)),this.added_tokens_map=new Map(this.added_tokens.map((X0)=>[X0.content,X0])),this.mask_token=this.getToken("mask_token"),this.mask_token_id=this.model.tokens_to_ids.get(this.mask_token),this.pad_token=this.getToken("pad_token","eos_token"),this.pad_token_id=this.model.tokens_to_ids.get(this.pad_token),this.sep_token=this.getToken("sep_token"),this.sep_token_id=this.model.tokens_to_ids.get(this.sep_token),this.unk_token=this.getToken("unk_token"),this.unk_token_id=this.model.tokens_to_ids.get(this.unk_token),this.bos_token=this.getToken("bos_token"),this.bos_token_id=this.model.tokens_to_ids.get(this.bos_token),this.eos_token=this.getToken("eos_token"),this.eos_token_id=this.model.tokens_to_ids.get(this.eos_token),this.model_max_length=x0.model_max_length,this.remove_space=x0.remove_space,this.clean_up_tokenization_spaces=x0.clean_up_tokenization_spaces??!0,this.do_lowercase_and_remove_accent=x0.do_lowercase_and_remove_accent??!1,x0.padding_side&&(this.padding_side=x0.padding_side),this.legacy=!1,this.chat_template=x0.chat_template??null,Array.isArray(this.chat_template)){let X0=Object.create(null);for(let{name:W0,template:h0}of this.chat_template){if(typeof W0!="string"||typeof h0!="string")throw Error('Chat template must be a list of objects with "name" and "template" properties');X0[W0]=h0}this.chat_template=X0}this._compiled_template_cache=new Map}getToken(...p){for(let x0 of p){let X0=this._tokenizer_config[x0];if(X0){if(typeof X0=="object"){if(X0.__type==="AddedToken")return X0.content;throw Error(`Unknown token: ${X0}`)}return X0}}return null}static async from_pretrained(p,{progress_callback:x0=null,config:X0=null,cache_dir:W0=null,local_files_only:h0=!1,revision:c0="main",legacy:F5=null}={}){return new this(...await L(p,{progress_callback:x0,config:X0,cache_dir:W0,local_files_only:h0,revision:c0,legacy:F5}))}_call(p,{text_pair:x0=null,add_special_tokens:X0=!0,padding:W0=!1,truncation:h0=null,max_length:c0=null,return_tensor:F5=!0,return_token_type_ids:W5=null}={}){let b5=Array.isArray(p),P5;if(b5){if(p.length===0)throw Error("text array must be non-empty");if(x0!==null){if(!Array.isArray(x0))throw Error("text_pair must also be an array");if(p.length!==x0.length)throw Error("text and text_pair must have the same length");P5=p.map((_6,O9)=>this._encode_plus(_6,{text_pair:x0[O9],add_special_tokens:X0,return_token_type_ids:W5}))}else P5=p.map((_6)=>this._encode_plus(_6,{add_special_tokens:X0,return_token_type_ids:W5}))}else{if(p==null)throw Error("text may not be null or undefined");if(Array.isArray(x0))throw Error("When specifying `text_pair`, since `text` is a string, `text_pair` must also be a string (i.e., not an array).");P5=[this._encode_plus(p,{text_pair:x0,add_special_tokens:X0,return_token_type_ids:W5})]}if(c0===null?c0=this.model_max_length:h0===null&&(W0===!0?(console.warn("`max_length` is ignored when `padding: true` and there is no truncation strategy. To pad to max length, use `padding: 'max_length'`."),c0=this.model_max_length):W0===!1&&(console.warn("Truncation was not explicitly activated but `max_length` is provided a specific value, please use `truncation: true` to explicitly truncate examples to max length."),h0=!0)),W0===!0&&(c0=Math.min((0,N.max)(P5.map((_6)=>_6.input_ids.length))[0],c0??1/0)),c0=Math.min(c0,this.model_max_length??1/0),W0||h0)for(let _6=0;_6c0?h0&&K6(P5[_6],c0):W0&&S5(P5[_6],c0,(O9)=>O9==="input_ids"?this.pad_token_id:0,this.padding_side));let S6={};if(F5){if((!W0||!h0)&&P5.some((O9)=>{for(let g6 of Object.keys(O9))if(O9[g6].length!==P5[0][g6]?.length)return!0;return!1}))throw Error("Unable to create tensor, you should probably activate truncation and/or padding with 'padding=true' and 'truncation=true' to have batched tensors with the same length.");let _6=[P5.length,P5[0].input_ids.length];for(let O9 of Object.keys(P5[0]))S6[O9]=new J.Tensor("int64",BigInt64Array.from(P5.flatMap((g6)=>g6[O9]).map(BigInt)),_6)}else{for(let _6 of Object.keys(P5[0]))S6[_6]=P5.map((O9)=>O9[_6]);if(!b5)for(let _6 of Object.keys(S6))S6[_6]=S6[_6][0]}return S6}_encode_text(p){if(p===null)return null;let x0=this.added_tokens_splitter.split(p);for(let W0=0;W00&&(x0[W0-1]=x0[W0-1].trimEnd()),h0.rstrip&&W0{if(W0.length===0)return[];if(this.added_tokens_map.has(W0))return[W0];if(this.remove_space===!0&&(W0=W0.trim().split(/\s+/).join(" ")),this.do_lowercase_and_remove_accent&&(W0=function(F5){return I(F5.toLowerCase())}(W0)),this.normalizer!==null&&(W0=this.normalizer(W0)),W0.length===0)return[];let c0=this.pre_tokenizer!==null?this.pre_tokenizer(W0,{section_index:h0}):[W0];return this.model(c0)})}_encode_plus(p,{text_pair:x0=null,add_special_tokens:X0=!0,return_token_type_ids:W0=null}={}){let{tokens:h0,token_type_ids:c0}=this._tokenize_helper(p,{pair:x0,add_special_tokens:X0}),F5=this.model.convert_tokens_to_ids(h0),W5={input_ids:F5,attention_mask:Array(F5.length).fill(1)};return(W0??this.return_token_type_ids)&&c0&&(W5.token_type_ids=c0),W5}_tokenize_helper(p,{pair:x0=null,add_special_tokens:X0=!1}={}){let W0=this._encode_text(p),h0=this._encode_text(x0);return this.post_processor?this.post_processor(W0,h0,{add_special_tokens:X0}):{tokens:(0,Z.mergeArrays)(W0??[],h0??[])}}tokenize(p,{pair:x0=null,add_special_tokens:X0=!1}={}){return this._tokenize_helper(p,{pair:x0,add_special_tokens:X0}).tokens}encode(p,{text_pair:x0=null,add_special_tokens:X0=!0,return_token_type_ids:W0=null}={}){return this._encode_plus(p,{text_pair:x0,add_special_tokens:X0,return_token_type_ids:W0}).input_ids}batch_decode(p,x0={}){return p instanceof J.Tensor&&(p=p.tolist()),p.map((X0)=>this.decode(X0,x0))}decode(p,x0={}){if(p instanceof J.Tensor&&(p=X(p)),!Array.isArray(p)||p.length===0||!(0,Z.isIntegralNumber)(p[0]))throw Error("token_ids must be a non-empty array of integers.");return this.decode_single(p,x0)}decode_single(p,{skip_special_tokens:x0=!1,clean_up_tokenization_spaces:X0=null}){let W0=this.model.convert_ids_to_tokens(p);x0&&(W0=W0.filter((c0)=>!this.special_tokens.includes(c0)));let h0=this.decoder?this.decoder(W0):W0.join(" ");return this.decoder&&this.decoder.end_of_word_suffix&&(h0=h0.replaceAll(this.decoder.end_of_word_suffix," "),x0&&(h0=h0.trim())),(X0??this.clean_up_tokenization_spaces)&&(h0=D(h0)),h0}get_chat_template({chat_template:p=null,tools:x0=null}={}){if(this.chat_template&&typeof this.chat_template=="object"){let X0=this.chat_template;if(p!==null&&Object.hasOwn(X0,p))p=X0[p];else if(p===null)if(x0!==null&&"tool_use"in X0)p=X0.tool_use;else{if(!("default"in X0))throw Error(`This model has multiple chat templates with no default specified! Please either pass a chat template or the name of the template you wish to use to the 'chat_template' argument. Available template names are ${Object.keys(X0).sort()}.`);p=X0.default}}else if(p===null){if(!this.chat_template)throw Error("Cannot use apply_chat_template() because tokenizer.chat_template is not set and no template argument was passed! For information about writing templates and setting the tokenizer.chat_template attribute, please see the documentation at https://huggingface.co/docs/transformers/main/en/chat_templating");p=this.chat_template}return p}apply_chat_template(p,{tools:x0=null,documents:X0=null,chat_template:W0=null,add_generation_prompt:h0=!1,tokenize:c0=!0,padding:F5=!1,truncation:W5=!1,max_length:b5=null,return_tensor:P5=!0,return_dict:S6=!1,tokenizer_kwargs:_6={},...O9}={}){if(typeof(W0=this.get_chat_template({chat_template:W0,tools:x0}))!="string")throw Error("chat_template must be a string, but got "+typeof W0);let g6=this._compiled_template_cache.get(W0);g6===void 0&&(g6=new U.Template(W0),this._compiled_template_cache.set(W0,g6));let k9=Object.create(null);for(let Z9 of Q5){let s9=this.getToken(Z9);s9&&(k9[Z9]=s9)}let w9=g6.render({messages:p,add_generation_prompt:h0,tools:x0,documents:X0,...k9,...O9});if(c0){let Z9=this._call(w9,{add_special_tokens:!1,padding:F5,truncation:W5,max_length:b5,return_tensor:P5,..._6});return S6?Z9:Z9.input_ids}return w9}}class w6 extends Y5{return_token_type_ids=!0}class Z6 extends Y5{return_token_type_ids=!0}class c6 extends Y5{return_token_type_ids=!0}class Y9 extends Y5{return_token_type_ids=!0}class y9 extends Y5{return_token_type_ids=!0}class V6 extends Y5{return_token_type_ids=!0}class a9 extends Y5{return_token_type_ids=!0}class I9 extends Y5{return_token_type_ids=!0}class z6 extends Y5{return_token_type_ids=!0}class _5 extends Y5{}class E5 extends Y5{}class v5 extends Y5{return_token_type_ids=!0;constructor(p,x0){super(p,x0),console.warn('WARNING: `XLMTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}}class o6 extends Y5{return_token_type_ids=!0}class b9 extends Y5{}class H1 extends Y5{}class x1 extends Y5{}class o9 extends Y5{constructor(p,x0){super(p,x0),this.languageRegex=/^[a-z]{2}_[A-Z]{2}$/,this.language_codes=this.special_tokens.filter((X0)=>this.languageRegex.test(X0)),this.lang_to_token=(X0)=>X0}_build_translation_inputs(p,x0,X0){return q1(this,p,x0,X0)}}class L1 extends o9{}class _1 extends Y5{}class z9 extends Y5{}let D9="▁";class p9 extends Y5{padding_side="left";constructor(p,x0){super(p,x0),this.legacy=x0.legacy??!0,this.legacy||(this.normalizer=null,this.pre_tokenizer=new y0({replacement:D9,add_prefix_space:!0,prepend_scheme:"first"}))}_encode_text(p){if(p===null)return null;if(this.legacy||p.length===0)return super._encode_text(p);let x0=super._encode_text(D9+p.replaceAll(D9," "));return x0.length>1&&x0[0]===D9&&this.special_tokens.includes(x0[1])&&(x0=x0.slice(1)),x0}}class J9 extends Y5{}class Y1 extends Y5{}class t6 extends Y5{}class f9 extends Y5{}class r9 extends Y5{}class G9 extends Y5{}class S1 extends Y5{}class A1 extends Y5{}class x9 extends Y5{}function q1(p,x0,X0,W0){if(!("language_codes"in p)||!Array.isArray(p.language_codes))throw Error("Tokenizer must have `language_codes` attribute set and it should be an array of language ids.");if(!(("languageRegex"in p)&&p.languageRegex instanceof RegExp))throw Error("Tokenizer must have `languageRegex` attribute set and it should be a regular expression.");if(!("lang_to_token"in p)||typeof p.lang_to_token!="function")throw Error("Tokenizer must have `lang_to_token` attribute set and it should be a function.");let{src_lang:h0,tgt_lang:c0}=W0;if(!p.language_codes.includes(c0))throw Error(`Target language code "${c0}" is not valid. Must be one of: {${p.language_codes.join(", ")}}`);if(h0!==void 0){if(!p.language_codes.includes(h0))throw Error(`Source language code "${h0}" is not valid. Must be one of: {${p.language_codes.join(", ")}}`);for(let F5 of p.post_processor.config.single)if("SpecialToken"in F5&&p.languageRegex.test(F5.SpecialToken.id)){F5.SpecialToken.id=p.lang_to_token(h0);break}}return W0.forced_bos_token_id=p.model.convert_tokens_to_ids([p.lang_to_token(c0)])[0],p._call(x0,X0)}class n9 extends Y5{constructor(p,x0){super(p,x0),this.languageRegex=/^[a-z]{3}_[A-Z][a-z]{3}$/,this.language_codes=this.special_tokens.filter((X0)=>this.languageRegex.test(X0)),this.lang_to_token=(X0)=>X0}_build_translation_inputs(p,x0,X0){return q1(this,p,x0,X0)}}class v9 extends Y5{constructor(p,x0){super(p,x0),this.languageRegex=/^__[a-z]{2,3}__$/,this.language_codes=this.special_tokens.filter((X0)=>this.languageRegex.test(X0)).map((X0)=>X0.slice(2,-2)),this.lang_to_token=(X0)=>`__${X0}__`}_build_translation_inputs(p,x0,X0){return q1(this,p,x0,X0)}}class L6 extends Y5{get timestamp_begin(){return this.model.convert_tokens_to_ids(["<|notimestamps|>"])[0]+1}_decode_asr(p,{return_timestamps:x0=!1,return_language:X0=!1,time_precision:W0=null,force_full_sequences:h0=!0}={}){if(W0===null)throw Error("Must specify time_precision");let c0=null,F5=x0==="word";function W5(){return{language:c0,timestamp:[null,null],text:""}}let b5=[],P5=W5(),S6=0,_6=this.timestamp_begin,O9=_6+1500,g6=[],k9=[],w9=!1,Z9=null,s9=new Set(this.all_special_ids);for(let Q6 of p){let C6=Q6.tokens,N6=F5?Q6.token_timestamps:null,s6=null,C5=_6;if("stride"in Q6){let[R9,B6,B5]=Q6.stride;if(S6-=B6,Z9=R9-B5,B6&&(C5=B6/W0+_6),B5)for(let U9=C6.length-1;U9>=0;--U9){let u0=Number(C6[U9]);if(u0>=_6){if(s6!==null&&(u0-_6)*W0=_6&&B6<=O9){let B5=(B6-_6)*W0+S6,U9=(0,N.round)(B5,2);if(s6!==null&&B6>=s6)w9=!0;else if(w9||g6.length>0&&B60?(g6.push(k6),F5&&k9.push(E9)):g6.every((R9)=>R9.length===0)&&(P5=W5(),g6=[],k6=[],k9=[],E9=[])}if(g6.length>0){if(h0&&x0)throw Error("Whisper did not predict an ending timestamp, which can happen if audio is cut off in the middle of a word. Also make sure WhisperTimeStampLogitsProcessor was used during generation.");let[Q6,C6]=this.findLongestCommonSequence(g6,k9),N6=this.decode(Q6);P5.text=N6,F5&&(P5.words=this.collateWordTimestamps(Q6,C6,c0)),b5.push(P5)}let J1=Object.create(null),P6=b5.map((Q6)=>Q6.text).join("");if(x0||X0){for(let Q6=0;Q60,F5=c0?[]:null,W5=c0?x0[0]:null;for(let b5=1;b5B6===k6[B5]&&W5[Q6+B5]<=x0[b5][s6+B5]).length:N6.filter((B6,B5)=>B6===k6[B5]).length;let R9=E9/P6+P6/1e4;E9>1&&R9>S6&&(S6=R9,_6=[Q6,C6,s6,C5])}let[g6,k9,w9,Z9]=_6,s9=Math.floor((k9+g6)/2),J1=Math.floor((Z9+w9)/2);h0.push(...X0.slice(0,s9)),X0=P5.slice(J1),W0=X0.length,c0&&(F5.push(...W5.slice(0,s9)),W5=x0[b5].slice(J1))}return h0.push(...X0),c0?(F5.push(...W5),[h0,F5]):[h0,[]]}collateWordTimestamps(p,x0,X0){let[W0,h0,c0]=this.combineTokensIntoWords(p,X0),F5=[];for(let W5=0;W5=W0){let F5=((c0-W0)*X0).toFixed(2);h0.push(`<|${F5}|>`),h0.push([])}else h0[h0.length-1].push(c0);return h0=h0.map((c0)=>typeof c0=="string"?c0:super.decode(c0,x0)),h0.join("")}splitTokensOnUnicode(p){let x0=this.decode(p,{decode_with_timestamps:!0}),X0=[],W0=[],h0=[],c0=[],F5=[],W5=0;for(let b5=0;b5=this.model.tokens_to_ids.get("<|endoftext|>"),g6=P5.startsWith(" "),k9=P5.trim(),w9=W5.test(k9);if(O9||g6||w9||h0.length===0)h0.push(P5),c0.push(S6),F5.push(_6);else{let Z9=h0.length-1;h0[Z9]+=P5,c0[Z9].push(...S6),F5[Z9].push(..._6)}}return[h0,c0,F5]}mergePunctuations(p,x0,X0,W0,h0){let c0=structuredClone(p),F5=structuredClone(x0),W5=structuredClone(X0),b5=c0.length-2,P5=c0.length-1;for(;b5>=0;)c0[b5].startsWith(" ")&&W0.includes(c0[b5].trim())?(c0[P5]=c0[b5]+c0[P5],F5[P5]=(0,Z.mergeArrays)(F5[b5],F5[P5]),W5[P5]=(0,Z.mergeArrays)(W5[b5],W5[P5]),c0[b5]="",F5[b5]=[],W5[b5]=[]):P5=b5,--b5;for(b5=0,P5=1;P5S6),F5.filter((S6)=>S6.length>0),W5.filter((S6)=>S6.length>0)]}}class m6 extends Y5{}class p6 extends Y5{}class B0 extends Y5{}class P1 extends Y5{constructor(p,x0){super(p,x0),this.languageRegex=/^(>>\w+<<)\s*/g,this.supported_language_codes=this.model.vocab.filter((X0)=>this.languageRegex.test(X0)),console.warn('WARNING: `MarianTokenizer` is not yet supported by Hugging Face\'s "fast" tokenizers library. Therefore, you may experience slightly inaccurate results.')}_encode_text(p){if(p===null)return null;let[x0,...X0]=p.trim().split(this.languageRegex);if(X0.length===0)return super._encode_text(x0);if(X0.length===2){let[W0,h0]=X0;return this.supported_language_codes.includes(W0)||console.warn(`Unsupported language code "${W0}" detected, which may lead to unexpected behavior. Should be one of: ${JSON.stringify(this.supported_language_codes)}`),(0,Z.mergeArrays)([W0],super._encode_text(h0))}}}class g1 extends Y5{}class u1 extends Y5{}class d1 extends Y5{}class V1 extends Y5{}class W1 extends Y5{}class M1 extends Y5{constructor(p,x0){super(p,x0),this.decoder=new t({})}}class R1 extends Y5{}class l1 extends Y5{}class N1{static TOKENIZER_CLASS_MAPPING={T5Tokenizer:b9,DistilBertTokenizer:_5,CamembertTokenizer:E5,DebertaTokenizer:y9,DebertaV2Tokenizer:V6,BertTokenizer:w6,HerbertTokenizer:a9,ConvBertTokenizer:I9,RoFormerTokenizer:z6,XLMTokenizer:v5,ElectraTokenizer:o6,MobileBertTokenizer:c6,SqueezeBertTokenizer:Y9,AlbertTokenizer:Z6,GPT2Tokenizer:H1,BartTokenizer:x1,MBartTokenizer:o9,MBart50Tokenizer:L1,RobertaTokenizer:_1,WhisperTokenizer:L6,CodeGenTokenizer:m6,CLIPTokenizer:p6,SiglipTokenizer:B0,MarianTokenizer:P1,BloomTokenizer:z9,NllbTokenizer:n9,M2M100Tokenizer:v9,LlamaTokenizer:p9,CodeLlamaTokenizer:J9,XLMRobertaTokenizer:Y1,MPNetTokenizer:t6,FalconTokenizer:f9,GPTNeoXTokenizer:r9,EsmTokenizer:G9,Wav2Vec2CTCTokenizer:g1,BlenderbotTokenizer:u1,BlenderbotSmallTokenizer:d1,SpeechT5Tokenizer:V1,NougatTokenizer:W1,VitsTokenizer:M1,Qwen2Tokenizer:S1,GemmaTokenizer:A1,Grok1Tokenizer:x9,CohereTokenizer:R1,MgpstrTokenizer:l1,PreTrainedTokenizer:Y5};static async from_pretrained(p,{progress_callback:x0=null,config:X0=null,cache_dir:W0=null,local_files_only:h0=!1,revision:c0="main",legacy:F5=null}={}){let[W5,b5]=await L(p,{progress_callback:x0,config:X0,cache_dir:W0,local_files_only:h0,revision:c0,legacy:F5}),P5=b5.tokenizer_class?.replace(/Fast$/,"")??"PreTrainedTokenizer",S6=this.TOKENIZER_CLASS_MAPPING[P5];return S6||(console.warn(`Unknown tokenizer class "${P5}", attempting to construct from base class.`),S6=Y5),new S6(W5,b5)}}},"./src/utils/audio.js":($,j,O)=>{/*!****************************!*\ + !*** ./src/utils/audio.js ***! + \****************************/O.r(j),O.d(j,{RawAudio:()=>E,hamming:()=>Y,hanning:()=>L,mel_filter_bank:()=>k,read_audio:()=>U,spectrogram:()=>w,window_function:()=>T});var G=O("./src/utils/hub.js"),Z=O("./src/utils/maths.js"),V=O("./src/utils/core.js"),N=O("./src/env.js"),J=O("?7a2c"),R=O("./src/utils/tensor.js");/*! ./hub.js *//*! ./maths.js *//*! ./core.js *//*! ../env.js *//*! fs *//*! ./tensor.js */async function U(Q,A){if(typeof AudioContext>"u")throw Error("Unable to load audio from path/URL since `AudioContext` is not available in your environment. Instead, audio data should be passed directly to the pipeline/processor. For more information and some example code, see https://huggingface.co/docs/transformers.js/guides/node-audio-processing.");let l=await(await(0,G.getFile)(Q)).arrayBuffer(),r=new AudioContext({sampleRate:A});A===void 0&&console.warn(`No sampling rate provided, using default of ${r.sampleRate}Hz.`);let e=await r.decodeAudioData(l),V0;if(e.numberOfChannels===2){let v0=Math.sqrt(2),$0=e.getChannelData(0),i=e.getChannelData(1);V0=new Float32Array($0.length);for(let G0=0;G02595*Math.log10(1+Q/700),kaldi:(Q)=>1127*Math.log(1+Q/700),slaney:(Q,A=1000,l=15,r=27/Math.log(6.4))=>Q>=A?l+Math.log(Q/A)*r:3*Q/200};function X(Q,A="htk"){let l=S[A];if(!l)throw Error('mel_scale should be one of "htk", "slaney" or "kaldi".');return typeof Q=="number"?l(Q):Q.map((r)=>l(r))}let D={htk:(Q)=>700*(10**(Q/2595)-1),kaldi:(Q)=>700*(Math.exp(Q/1127)-1),slaney:(Q,A=1000,l=15,r=Math.log(6.4)/27)=>Q>=l?A*Math.exp(r*(Q-l)):200*Q/3};function I(Q,A,l){let r=(A-Q)/(l-1);return Float64Array.from({length:l},(e,V0)=>Q+r*V0)}function k(Q,A,l,r,e,V0=null,v0="htk",$0=!1){if(V0!==null&&V0!=="slaney")throw Error('norm must be one of null or "slaney"');if(Q<2)throw Error(`Require num_frequency_bins: ${Q} >= 2`);if(l>r)throw Error(`Require min_frequency: ${l} <= max_frequency: ${r}`);let i=I(X(l,v0),X(r,v0),A+2),G0,S0=function(s,n="htk"){let R0=D[n];if(!R0)throw Error('mel_scale should be one of "htk", "slaney" or "kaldi".');return typeof s=="number"?R0(s):s.map((q0)=>R0(q0))}(i,v0);if($0){let s=e/(2*(Q-1));G0=X(Float64Array.from({length:Q},(n,R0)=>R0*s),v0),S0=i}else G0=I(0,Math.floor(e/2),Q);let F0=function(s,n){let R0=Float64Array.from({length:n.length-1},(M0,q5)=>n[q5+1]-n[q5]),q0=Array.from({length:s.length},()=>Array(n.length));for(let M0=0;M0Array(s.length));for(let M0=0;M0e)throw Error(`frame_length (${l}) may not be larger than fft_length (${e})`);if(e0!==l)throw Error(`Length of the window (${e0}) must equal frame_length (${l})`);if(r<=0)throw Error("hop_length must be greater than zero");if(V0===null&&S0!==null)throw Error("You have provided `mel_filters` but `power` is `None`. Mel spectrogram computation is not yet supported for complex-valued spectrogram. Specify `power` to fix this issue.");if(v0){if($0!=="reflect")throw Error(`pad_mode="${$0}" not implemented yet.`);let T0=Math.floor((e-1)/2)+1;Q=function(s0,D5,L5){let d5=new s0.constructor(s0.length+D5+L5),T5=s0.length-1;for(let $5=0;$5N0?q5&&(a0=M0):a0=Q0=M0);let r0=new Z.FFT(e),g0=new Float64Array(e),J5=new Float64Array(r0.outputBufferSize),t0=new Float32Array(P0*a0);for(let T0=0;T0=1;--L5)g0[L5]-=G0*g0[L5-1];g0[0]*=1-G0}for(let L5=0;L5Math.pow($0,0.85));break;default:throw Error(`Unknown window type ${A}.`)}if(l&&(v0=v0.subarray(0,Q)),r===null)return v0;if(Q>r)throw Error(`Length of the window (${Q}) may not be larger than frame_length (${r})`);return v0}function W(Q,A,l){for(let r=0;r{let e=await r.arrayBuffer();J.writeFileSync(l,Buffer.from(e))}}await A(Q,this.toBlob())}}},"./src/utils/constants.js":($,j,O)=>{/*!********************************!*\ + !*** ./src/utils/constants.js ***! + \********************************/O.r(j),O.d(j,{CHAT_TEMPLATE_NAME:()=>R,CONFIG_NAME:()=>Z,FEATURE_EXTRACTOR_NAME:()=>V,GENERATION_CONFIG_NAME:()=>U,GITHUB_ISSUE_URL:()=>G,IMAGE_PROCESSOR_NAME:()=>N,PROCESSOR_NAME:()=>J});let G="https://github.com/huggingface/transformers.js/issues/new/choose",Z="config.json",V="preprocessor_config.json",N=V,J="processor_config.json",R="chat_template.json",U="generation_config.json"},"./src/utils/core.js":($,j,O)=>{/*!***************************!*\ + !*** ./src/utils/core.js ***! + \***************************/function G(z,w){z&&z(w)}function Z(z){return Object.fromEntries(Object.entries(z).map(([w,T])=>[T,w]))}function V(z){return z.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function N(z){return z?.prototype?.__proto__?.constructor?.name==="TypedArray"}function J(z){return Number.isInteger(z)||typeof z=="bigint"}function R(z){return z==null||z===-1}function U(z){let w=[],T=z;for(;Array.isArray(T);)w.push(T.length),T=T[0];return w}function H(z,w,T=void 0){let W=z[w];if(W!==void 0)return delete z[w],W;if(T===void 0)throw Error(`Key ${w} does not exist in object.`);return T}function L(...z){return Array.prototype.concat.apply([],z)}function Y(...z){return z.reduce((w,T)=>w.flatMap((W)=>T.map((E)=>[W,E])))}function S(z,w){return Math.abs((z+w)%(2*w)-w)}function X(z,w){let T=URL.createObjectURL(w),W=document.createElement("a");W.href=T,W.download=z,W.click(),W.remove(),URL.revokeObjectURL(T)}function D(z,w){return Object.assign({},...w.map((T)=>{if(z[T]!==void 0)return{[T]:z[T]}}))}function I(z){let w=0;for(let T of z)++w;return w}function k(z,w){let T=0;for(let W of z)W===w&&++T;return T}O.r(j),O.d(j,{calculateDimensions:()=>U,calculateReflectOffset:()=>S,count:()=>k,dispatchCallback:()=>G,escapeRegExp:()=>V,isIntegralNumber:()=>J,isNullishDimension:()=>R,isTypedArray:()=>N,len:()=>I,mergeArrays:()=>L,pick:()=>D,pop:()=>H,product:()=>Y,reverseDictionary:()=>Z,saveBlob:()=>X})},"./src/utils/data-structures.js":($,j,O)=>{/*!**************************************!*\ + !*** ./src/utils/data-structures.js ***! + \**************************************/O.r(j),O.d(j,{CharTrie:()=>Z,DictionarySplitter:()=>R,LRUCache:()=>U,PriorityQueue:()=>G,TokenLattice:()=>N});class G{constructor(H=(Y,S)=>Y>S,L=1/0){this._heap=[],this._comparator=H,this._maxSize=L}get size(){return this._heap.length}isEmpty(){return this.size===0}peek(){return this._heap[0]}push(...H){return this.extend(H)}extend(H){for(let L of H)if(this.size0&&this._swap(0,L),this._heap.pop(),this._siftDown(),H}replace(H){let L=this.peek();return this._heap[0]=H,this._siftDown(),L}_parent(H){return(H+1>>>1)-1}_left(H){return 1+(H<<1)}_right(H){return H+1<<1}_greater(H,L){return this._comparator(this._heap[H],this._heap[L])}_swap(H,L){let Y=this._heap[H];this._heap[H]=this._heap[L],this._heap[L]=Y}_siftUp(){this._siftUpFrom(this.size-1)}_siftUpFrom(H){for(;H>0&&this._greater(H,this._parent(H));)this._swap(H,this._parent(H)),H=this._parent(H)}_siftDown(){let H=0;for(;this._left(H)[]),this.endNodes=Array.from({length:this.len+1},()=>[]);let S=new J(this.bosTokenId,0,0,0,0),X=new J(this.eosTokenId,1,this.len,0,0);this.nodes.push(S.clone()),this.nodes.push(X.clone()),this.beginNodes[this.len].push(X),this.endNodes[0].push(S)}insert(H,L,Y,S){let X=this.nodes.length,D=new J(S,X,H,L,Y);this.beginNodes[H].push(D),this.endNodes[H+L].push(D),this.nodes.push(D)}viterbi(){let H=this.len,L=0;for(;L<=H;){if(this.beginNodes[L].length==0)return[];for(let D of this.beginNodes[L]){D.prev=null;let I=0,k=null;for(let z of this.endNodes[L]){let w=z.backtraceScore+D.score;(k===null||w>I)&&(k=z.clone(),I=w)}if(k===null)return[];D.prev=k,D.backtraceScore=I}++L}let Y=[],S=this.beginNodes[H][0].prev;if(S===null)return[];let X=S.clone();for(;X.prev!==null;)Y.push(X.clone()),X=X.clone().prev.clone();return Y.reverse(),Y}piece(H){return this.chars.slice(H.pos,H.pos+H.length).join("")}tokens(){return this.viterbi().map((H)=>this.piece(H))}tokenIds(){return this.viterbi().map((H)=>H.tokenId)}}class J{constructor(H,L,Y,S,X){this.tokenId=H,this.nodeId=L,this.pos=Y,this.length=S,this.score=X,this.prev=null,this.backtraceScore=0}clone(){let H=new J(this.tokenId,this.nodeId,this.pos,this.length,this.score);return H.prev=this.prev,H.backtraceScore=this.backtraceScore,H}}class R{constructor(H){this.trie=this._buildTrie(H)}_buildTrie(H){let L=Object.create(null);for(let Y of H){let S=L;for(let X=0;XS&&L.push(H.slice(S,X)),L.push(I),X+=I.length,S=X):++X}return Sthis.capacity&&this.cache.delete(this.cache.keys().next().value)}clear(){this.cache.clear()}}},"./src/utils/devices.js":($,j,O)=>{/*!******************************!*\ + !*** ./src/utils/devices.js ***! + \******************************/O.r(j),O.d(j,{DEVICE_TYPES:()=>G});let G=Object.freeze({auto:"auto",gpu:"gpu",cpu:"cpu",wasm:"wasm",webgpu:"webgpu",cuda:"cuda",dml:"dml",webnn:"webnn","webnn-npu":"webnn-npu","webnn-gpu":"webnn-gpu","webnn-cpu":"webnn-cpu"})},"./src/utils/dtypes.js":($,j,O)=>{/*!*****************************!*\ + !*** ./src/utils/dtypes.js ***! + \*****************************/O.r(j),O.d(j,{DATA_TYPES:()=>N,DEFAULT_DEVICE_DTYPE_MAPPING:()=>J,DEFAULT_DTYPE_SUFFIX_MAPPING:()=>R,isWebGpuFp16Supported:()=>V});var G=O("./src/env.js"),Z=O("./src/utils/devices.js");/*! ../env.js *//*! ./devices.js */let V=function(){let U;return async function(){if(U===void 0)if(G.apis.IS_WEBGPU_AVAILABLE)try{U=(await navigator.gpu.requestAdapter()).features.has("shader-f16")}catch(H){U=!1}else U=!1;return U}}(),N=Object.freeze({auto:"auto",fp32:"fp32",fp16:"fp16",q8:"q8",int8:"int8",uint8:"uint8",q4:"q4",bnb4:"bnb4",q4f16:"q4f16"}),J=Object.freeze({[Z.DEVICE_TYPES.wasm]:N.q8}),R=Object.freeze({[N.fp32]:"",[N.fp16]:"_fp16",[N.int8]:"_int8",[N.uint8]:"_uint8",[N.q8]:"_quantized",[N.q4]:"_q4",[N.q4f16]:"_q4f16",[N.bnb4]:"_bnb4"})},"./src/utils/generic.js":($,j,O)=>{/*!******************************!*\ + !*** ./src/utils/generic.js ***! + \******************************/O.r(j),O.d(j,{Callable:()=>G});let G=class{constructor(){let Z=function(...V){return Z._call(...V)};return Object.setPrototypeOf(Z,new.target.prototype)}_call(...Z){throw Error("Must implement _call method in subclass")}}},"./src/utils/hub.js":($,j,O)=>{/*!**************************!*\ + !*** ./src/utils/hub.js ***! + \**************************/O.r(j),O.d(j,{MAX_EXTERNAL_DATA_CHUNKS:()=>J,getFile:()=>Y,getModelFile:()=>D,getModelJSON:()=>I});var G=O("?7a2c"),Z=O("?a42a"),V=O("./src/env.js"),N=O("./src/utils/core.js");/*! fs *//*! path *//*! ../env.js *//*! ./core.js */let J=100,R={txt:"text/plain",html:"text/html",css:"text/css",js:"text/javascript",json:"application/json",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif"};class U{constructor(z){if(this.filePath=z,this.headers=new Headers,this.exists=G.existsSync(z),this.exists){this.status=200,this.statusText="OK";let w=G.statSync(z);this.headers.set("content-length",w.size.toString()),this.updateContentType();let T=G.createReadStream(z);this.body=new ReadableStream({start(W){T.on("data",(E)=>W.enqueue(E)),T.on("end",()=>W.close()),T.on("error",(E)=>W.error(E))},cancel(){T.destroy()}})}else this.status=404,this.statusText="Not Found",this.body=null}updateContentType(){let z=this.filePath.toString().split(".").pop().toLowerCase();this.headers.set("content-type",R[z]??"application/octet-stream")}clone(){let z=new U(this.filePath);return z.exists=this.exists,z.status=this.status,z.statusText=this.statusText,z.headers=new Headers(this.headers),z}async arrayBuffer(){return(await G.promises.readFile(this.filePath)).buffer}async blob(){let z=await G.promises.readFile(this.filePath);return new Blob([z],{type:this.headers.get("content-type")})}async text(){return await G.promises.readFile(this.filePath,"utf8")}async json(){return JSON.parse(await this.text())}}function H(z,w=null,T=null){let W;try{W=new URL(z)}catch(E){return!1}return!(w&&!w.includes(W.protocol))&&!(T&&!T.includes(W.hostname))}let L=/^(\b[\w\-.]+\b\/)?\b[\w\-.]{1,96}\b$/;async function Y(z){if(V.env.useFS&&!H(z,["http:","https:","blob:"]))return new U(z instanceof URL?z.protocol==="file:"?z.pathname:z.toString():z);if(typeof process<"u"&&process?.release?.name==="node"){let w=!!process.env?.TESTING_REMOTELY,T=V.env.version,W=new Headers;if(W.set("User-Agent",`transformers.js/${T}; is_ci/${w};`),H(z,["http:","https:"],["huggingface.co","hf.co"])){let E=process.env?.HF_TOKEN??process.env?.HF_ACCESS_TOKEN;E&&W.set("Authorization",`Bearer ${E}`)}return fetch(z,{headers:W})}return fetch(z)}let S={400:"Bad request error occurred while trying to load file",401:"Unauthorized access to file",403:"Forbidden access to file",404:"Could not locate file",408:"Request timeout error occurred while trying to load file",500:"Internal server error error occurred while trying to load file",502:"Bad gateway error occurred while trying to load file",503:"Service unavailable error occurred while trying to load file",504:"Gateway timeout error occurred while trying to load file"};class X{constructor(z){this.path=z}async match(z){let w=Z.join(this.path,z),T=new U(w);return T.exists?T:void 0}async put(z,w,T=void 0){let W=Z.join(this.path,z);try{let E=w.headers.get("Content-Length"),Q=parseInt(E??"0"),A=0;await G.promises.mkdir(Z.dirname(W),{recursive:!0});let l=G.createWriteStream(W),r=w.body.getReader();for(;;){let{done:e,value:V0}=await r.read();if(e)break;await new Promise(($0,i)=>{l.write(V0,(G0)=>{G0?i(G0):$0()})}),A+=V0.length;let v0=Q?A/Q*100:0;T?.({progress:v0,loaded:A,total:Q})}l.close()}catch(E){try{await G.promises.unlink(W)}catch{}throw E}}}async function D(z,w,T=!0,W={},E=!1){if(!V.env.allowLocalModels){if(W.local_files_only)throw Error("Invalid configuration detected: local models are disabled (`env.allowLocalModels=false`) but you have requested to only use local models (`local_files_only=true`).");if(!V.env.allowRemoteModels)throw Error("Invalid configuration detected: both local and remote models are disabled. Fix by setting `env.allowLocalModels` or `env.allowRemoteModels` to `true`.")}let Q;if((0,N.dispatchCallback)(W.progress_callback,{status:"initiate",name:z,file:w}),!Q&&V.env.useCustomCache){if(!V.env.customCache)throw Error("`env.useCustomCache=true`, but `env.customCache` is not defined.");if(!V.env.customCache.match||!V.env.customCache.put)throw Error("`env.customCache` must be an object which implements the `match` and `put` functions of the Web Cache API. For more information, see https://developer.mozilla.org/en-US/docs/Web/API/Cache");Q=V.env.customCache}if(!Q&&V.env.useBrowserCache){if(typeof caches>"u")throw Error("Browser cache is not available in this environment.");try{Q=await caches.open("transformers-cache")}catch(R0){console.warn("An error occurred while opening the browser cache:",R0)}}if(!Q&&V.env.useFSCache){if(!V.apis.IS_FS_AVAILABLE)throw Error("File System Cache is not available in this environment.");Q=new X(W.cache_dir??V.env.cacheDir)}let A=W.revision??"main",l=k(z,w),r=(e=z,!(!L.test(e)||e.includes("..")||e.includes("--")||e.endsWith(".git")||e.endsWith(".ipynb")));var e;let V0=r?k(V.env.localModelPath,l):l,v0=k(V.env.remoteHost,V.env.remotePathTemplate.replaceAll("{model}",z).replaceAll("{revision}",encodeURIComponent(A)),w),$0,i=Q instanceof X?A==="main"?l:k(z,A,w):v0,G0,S0=!1;Q&&(G0=await async function(R0,...q0){for(let p0 of q0)try{let Z0=await R0.match(p0);if(Z0)return Z0}catch(Z0){continue}}(Q,V0,i));let F0=G0!==void 0;if(G0===void 0){if(V.env.allowLocalModels)if(H(l,["http:","https:"])){if(W.local_files_only)throw Error(`\`local_files_only=true\`, but attempted to load a remote file from: ${l}.`);if(!V.env.allowRemoteModels)throw Error(`\`env.allowRemoteModels=false\`, but attempted to load a remote file from: ${l}.`)}else try{G0=await Y(V0),$0=V0}catch(R0){console.warn(`Unable to load from local path "${V0}": "${R0}"`)}if(G0===void 0||G0.status===404){if(W.local_files_only||!V.env.allowRemoteModels){if(T)throw Error(`\`local_files_only=true\` or \`env.allowRemoteModels=false\` and file was not found locally at "${V0}".`);return null}if(!r)throw Error(`Local file missing at "${V0}" and download aborted due to invalid model ID "${z}".`);if(G0=await Y(v0),G0.status!==200)return function(R0,q0,p0){if(!p0)return null;let Z0=S[R0]??`Error (${R0}) occurred while trying to load file`;throw Error(`${Z0}: "${q0}".`)}(G0.status,v0,T);$0=i}S0=Q&&typeof Response<"u"&&G0 instanceof Response&&G0.status===200}let s;if((0,N.dispatchCallback)(W.progress_callback,{status:"download",name:z,file:w}),!V.apis.IS_NODE_ENV||!E){let R0;W.progress_callback?F0&&typeof navigator<"u"&&/firefox/i.test(navigator.userAgent)?(R0=new Uint8Array(await G0.arrayBuffer()),(0,N.dispatchCallback)(W.progress_callback,{status:"progress",name:z,file:w,progress:100,loaded:R0.length,total:R0.length})):R0=await async function(q0,p0){let Z0=q0.headers.get("Content-Length");Z0===null&&console.warn("Unable to determine content-length from response headers. Will expand buffer when needed.");let M0=parseInt(Z0??"0"),q5=new Uint8Array(M0),E0=0,e0=q0.body.getReader();async function N0(){let{done:P0,value:Q0}=await e0.read();if(P0)return;let a0=E0+Q0.length;if(a0>M0){M0=a0;let r0=new Uint8Array(M0);r0.set(q5),q5=r0}return q5.set(Q0,E0),E0=a0,p0({progress:E0/M0*100,loaded:E0,total:M0}),N0()}return await N0(),q5}(G0,(q0)=>{(0,N.dispatchCallback)(W.progress_callback,{status:"progress",name:z,file:w,...q0})}):R0=new Uint8Array(await G0.arrayBuffer()),s=R0}if(S0&&$0&&await Q.match($0)===void 0&&(s?await Q.put($0,new Response(s,{headers:G0.headers})).catch((R0)=>{console.warn(`Unable to add response to browser cache: ${R0}.`)}):await Q.put($0,G0,W.progress_callback)),(0,N.dispatchCallback)(W.progress_callback,{status:"done",name:z,file:w}),s){if(!V.apis.IS_NODE_ENV&&E)throw Error("Cannot return path in a browser environment.");return s}if(G0 instanceof U)return G0.filePath;let n=await Q?.match($0);if(n instanceof U)return n.filePath;if(n instanceof Response)return new Uint8Array(await n.arrayBuffer());if(typeof n=="string")return n;throw Error("Unable to get model file path or buffer.")}async function I(z,w,T=!0,W={}){let E=await D(z,w,T,W,!1);if(E===null)return{};let Q=new TextDecoder("utf-8").decode(E);return JSON.parse(Q)}function k(...z){return(z=z.map((w,T)=>(T&&(w=w.replace(new RegExp("^/"),"")),T!==z.length-1&&(w=w.replace(new RegExp("/$"),"")),w))).join("/")}},"./src/utils/image.js":($,j,O)=>{/*!****************************!*\ + !*** ./src/utils/image.js ***! + \****************************/O.r(j),O.d(j,{RawImage:()=>X,load_image:()=>D});var G=O("./src/utils/core.js"),Z=O("./src/utils/hub.js"),V=O("./src/env.js"),N=O("./src/utils/tensor.js"),J=O("?2b25");/*! ./core.js *//*! ./hub.js *//*! ../env.js *//*! ./tensor.js *//*! sharp */let R,U,H,L=V.apis.IS_BROWSER_ENV||V.apis.IS_WEBWORKER_ENV;if(L)R=(I,k)=>{if(!self.OffscreenCanvas)throw Error("OffscreenCanvas not supported by this browser.");return new self.OffscreenCanvas(I,k)},H=self.createImageBitmap,U=self.ImageData;else{if(!J)throw Error("Unable to load image processing library.");H=async(I)=>{let k=(await I.metadata()).channels,{data:z,info:w}=await I.rotate().raw().toBuffer({resolveWithObject:!0}),T=new X(new Uint8ClampedArray(z),w.width,w.height,w.channels);return k!==void 0&&k!==w.channels&&T.convert(k),T}}let Y={0:"nearest",1:"lanczos",2:"bilinear",3:"bicubic",4:"box",5:"hamming"},S=new Map([["png","image/png"],["jpg","image/jpeg"],["jpeg","image/jpeg"],["gif","image/gif"]]);class X{constructor(I,k,z,w){this.data=I,this.width=k,this.height=z,this.channels=w}get size(){return[this.width,this.height]}static async read(I){if(I instanceof X)return I;if(typeof I=="string"||I instanceof URL)return await this.fromURL(I);if(I instanceof Blob)return await this.fromBlob(I);if(typeof HTMLCanvasElement<"u"&&I instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&I instanceof OffscreenCanvas)return this.fromCanvas(I);throw Error("Unsupported input type: "+typeof I)}static fromCanvas(I){if(!L)throw Error("fromCanvas() is only supported in browser environments.");let k=I.getContext("2d").getImageData(0,0,I.width,I.height).data;return new X(k,I.width,I.height,4)}static async fromURL(I){let k=await(0,Z.getFile)(I);if(k.status!==200)throw Error(`Unable to read image from "${I}" (${k.status} ${k.statusText})`);let z=await k.blob();return this.fromBlob(z)}static async fromBlob(I){if(L){let k=await H(I),z=R(k.width,k.height).getContext("2d");return z.drawImage(k,0,0),new this(z.getImageData(0,0,k.width,k.height).data,k.width,k.height,4)}{let k=J(await I.arrayBuffer());return await H(k)}}static fromTensor(I,k="CHW"){if(I.dims.length!==3)throw Error(`Tensor should have 3 dimensions, but has ${I.dims.length} dimensions.`);if(k==="CHW")I=I.transpose(1,2,0);else if(k!=="HWC")throw Error(`Unsupported channel format: ${k}`);if(!(I.data instanceof Uint8ClampedArray||I.data instanceof Uint8Array))throw Error(`Unsupported tensor type: ${I.type}`);switch(I.dims[2]){case 1:case 2:case 3:case 4:return new X(I.data,I.dims[1],I.dims[0],I.dims[2]);default:throw Error(`Unsupported number of channels: ${I.dims[2]}`)}}grayscale(){if(this.channels===1)return this;let I=new Uint8ClampedArray(this.width*this.height*1);switch(this.channels){case 3:case 4:for(let k=0,z=0;k=0?Q=z:l=-z,w>=0?A=w:r=-w,E.drawImage(W,Q,A,I,k,l,r,I,k),new X(E.getImageData(0,0,I,k).data,I,k,4).convert(T)}{let T=this.toSharp();if(z>=0&&w>=0)T=T.extract({left:Math.floor(z),top:Math.floor(w),width:I,height:k});else if(z<=0&&w<=0){let W=Math.floor(-w),E=Math.floor(-z);T=T.extend({top:W,left:E,right:I-this.width-E,bottom:k-this.height-W})}else{let W=[0,0],E=0;w<0?(W[0]=Math.floor(-w),W[1]=k-this.height-W[0]):E=Math.floor(w);let Q=[0,0],A=0;z<0?(Q[0]=Math.floor(-z),Q[1]=I-this.width-Q[0]):A=Math.floor(z),T=T.extend({top:W[0],bottom:W[1],left:Q[0],right:Q[1]}).extract({left:A,top:E,width:I,height:k})}return await H(T)}}async toBlob(I="image/png",k=1){if(!L)throw Error("toBlob() is only supported in browser environments.");return await this.toCanvas().convertToBlob({type:I,quality:k})}toTensor(I="CHW"){let k=new N.Tensor("uint8",new Uint8Array(this.data),[this.height,this.width,this.channels]);if(I==="HWC");else{if(I!=="CHW")throw Error(`Unsupported channel format: ${I}`);k=k.permute(2,0,1)}return k}toCanvas(){if(!L)throw Error("toCanvas() is only supported in browser environments.");let I=this.clone().rgba(),k=R(I.width,I.height),z=new U(I.data,I.width,I.height);return k.getContext("2d").putImageData(z,0,0),k}split(){let{data:I,width:k,height:z,channels:w}=this,T=I.constructor,W=I.length/w,E=Array.from({length:w},()=>new T(W));for(let Q=0;Qnew X(Q,k,z,1))}_update(I,k,z,w=null){return this.data=I,this.width=k,this.height=z,w!==null&&(this.channels=w),this}clone(){return new X(this.data.slice(),this.width,this.height,this.channels)}convert(I){if(this.channels===I)return this;switch(I){case 1:this.grayscale();break;case 3:this.rgb();break;case 4:this.rgba();break;default:throw Error(`Conversion failed due to unsupported number of channels: ${this.channels}`)}return this}async save(I){if(!L){if(V.apis.IS_FS_AVAILABLE)return await this.toSharp().toFile(I);throw Error("Unable to save the image because filesystem is disabled in this environment.")}{if(V.apis.IS_WEBWORKER_ENV)throw Error("Unable to save an image from a Web Worker.");let k=I.split(".").pop().toLowerCase(),z=S.get(k)??"image/png",w=await this.toBlob(z);(0,G.saveBlob)(I,w)}}toSharp(){if(L)throw Error("toSharp() is only supported in server-side environments.");return J(this.data,{raw:{width:this.width,height:this.height,channels:this.channels}})}}let D=X.read.bind(X)},"./src/utils/maths.js":($,j,O)=>{/*!****************************!*\ + !*** ./src/utils/maths.js ***! + \****************************/function G(T,[W,E,Q],[A,l],r="bilinear",e=!1){let V0=l/Q,v0=A/E,$0=new T.constructor(A*l*W),i=E*Q,G0=A*l;for(let S0=0;S0=0;--e)A[e]=V0,Q[e]=W[E[e]],V0*=Q[e];let l=E.map((e,V0)=>A[E.indexOf(V0)]),r=new T.constructor(T.length);for(let e=0;e=0;--v0)V0+=$0%W[v0]*l[v0],$0=Math.floor($0/W[v0]);r[V0]=T[e]}return[r,Q]}function V(T){let W=L(T)[0],E=T.map((A)=>Math.exp(A-W)),Q=E.reduce((A,l)=>A+l,0);return E.map((A)=>A/Q)}function N(T){let W=L(T)[0],E=0;for(let A=0;AA-W-Q)}function J(T,W){let E=0;for(let Q=0;QW+E*E,0))}function H(T){if(T.length===0)throw Error("Array must not be empty");let W=T[0],E=0;for(let Q=1;QW&&(W=T[Q],E=Q);return[W,E]}function Y(T){return T>0&&!(T&T-1)}O.r(j),O.d(j,{FFT:()=>D,bankers_round:()=>z,cos_sim:()=>R,dot:()=>J,dynamic_time_warping:()=>w,interpolate_data:()=>G,log_softmax:()=>N,magnitude:()=>U,max:()=>L,medianFilter:()=>I,min:()=>H,permute_data:()=>Z,round:()=>k,softmax:()=>V});class S{constructor(T){if(this.size=0|T,this.size<=1||!Y(this.size))throw Error("FFT size must be a power of two larger than 1");this._csize=T<<1,this.table=new Float64Array(2*this.size);for(let E=0;EE;E<<=1)++W;this._width=W%2==0?W-1:W,this._bitrev=new Int32Array(1<>>Q&3)<>>1);for(let Q=0;Q>>1]=T[Q];return E}toComplexArray(T,W){let E=W||this.createComplexArray();for(let Q=0;Q>>1],E[Q+1]=0;return E}transform(T,W){if(T===W)throw Error("Input and output buffers must be different");this._transform4(T,W,1)}realTransform(T,W){if(T===W)throw Error("Input and output buffers must be different");this._realTransform4(T,W,1)}inverseTransform(T,W){if(T===W)throw Error("Input and output buffers must be different");this._transform4(T,W,-1);for(let E=0;E>=2;r>=2;r>>=2){e=Q/r<<1;let $0=e>>>2;for(A=0;A>>1,r>>>1)}else for(A=0,l=0;A>>1,r>>>1,E)}let v0=this.table;for(r>>=2;r>=2;r>>=2){e=Q/r<<1;let i=e>>>1,G0=i>>>1,S0=G0>>>1;for(A=0;A>>1;for(let i=2;i<$0;i+=2)T[Q-i]=T[i],T[Q-i+1]=-T[i+1]}_singleRealTransform2(T,W,E,Q,A){let l=T[Q],r=T[Q+A];W[E]=l+r,W[E+1]=0,W[E+2]=l-r,W[E+3]=0}_singleRealTransform4(T,W,E,Q,A,l){let r=2*A,e=3*A,V0=T[Q],v0=T[Q+A],$0=T[Q+r],i=T[Q+e],G0=V0+$0,S0=V0-$0,F0=v0+i,s=l*(v0-i);W[E]=G0+F0,W[E+1]=0,W[E+2]=S0,W[E+3]=-s,W[E+4]=G0-F0,W[E+5]=0,W[E+6]=S0,W[E+7]=s}}class X{constructor(T){let W=2*(T-1),E=2*(2*T-1),Q=2**Math.ceil(Math.log2(E));this.bufferSize=Q,this._a=W;let A=new Float64Array(E),l=new Float64Array(Q);this._chirpBuffer=new Float64Array(Q),this._buffer1=new Float64Array(Q),this._buffer2=new Float64Array(Q),this._outBuffer1=new Float64Array(Q),this._outBuffer2=new Float64Array(Q);let r=-2*Math.PI/T,e=Math.cos(r),V0=Math.sin(r);for(let v0=0;v0>1;++v0){let $0=(v0+1-T)**2/2,i=Math.sqrt(e**2+V0**2)**$0,G0=$0*Math.atan2(V0,e),S0=2*v0;A[S0]=i*Math.cos(G0),A[S0+1]=i*Math.sin(G0),l[S0]=A[S0],l[S0+1]=-A[S0+1]}this._slicedChirpBuffer=A.subarray(W,E),this._f=new S(Q>>1),this._f.transform(this._chirpBuffer,l)}_transform(T,W,E){let Q=this._buffer1,A=this._buffer2,l=this._outBuffer1,r=this._outBuffer2,e=this._chirpBuffer,V0=this._slicedChirpBuffer,v0=this._a;if(E)for(let $0=0;$0>1];Q[$0]=G0*V0[$0],Q[i]=G0*V0[i]}else for(let $0=0;$0=T.length&&(V0=2*(T.length-1)-V0),Q[r++]=T[V0]}Q.sort(),E[l]=Q[A]}return E}function k(T,W){let E=Math.pow(10,W);return Math.round(T*E)/E}function z(T){let W=Math.round(T);return Math.abs(T)%1==0.5?W%2==0?W:W-1:W}function w(T){let W=T.length,E=T[0].length,Q=[W+1,E+1],A=Array.from({length:Q[0]},()=>Array(Q[1]).fill(1/0));A[0][0]=0;let l=Array.from({length:Q[0]},()=>Array(Q[1]).fill(-1));for(let $0=1;$00||e>0;)switch(V0.push(r-1),v0.push(e-1),l[r][e]){case 0:--r,--e;break;case 1:--r;break;case 2:--e;break;default:throw Error(`Internal error in dynamic time warping. Unexpected trace[${r}, ${e}]. Please file a bug report.`)}return V0.reverse(),v0.reverse(),[V0,v0]}},"./src/utils/tensor.js":($,j,O)=>{/*!*****************************!*\ + !*** ./src/utils/tensor.js ***! + \*****************************/O.r(j),O.d(j,{DataTypeMap:()=>N,Tensor:()=>J,cat:()=>W,full:()=>e,full_like:()=>V0,interpolate:()=>U,interpolate_4d:()=>H,layer_norm:()=>k,matmul:()=>L,mean:()=>l,mean_pooling:()=>I,ones:()=>v0,ones_like:()=>$0,permute:()=>R,quantize_embeddings:()=>F0,rand:()=>S0,rfft:()=>Y,slice:()=>D,stack:()=>E,std_mean:()=>A,topk:()=>S,zeros:()=>i,zeros_like:()=>G0});var G=O("./src/utils/maths.js"),Z=O("./src/backends/onnx.js"),V=O("./src/ops/registry.js");/*! ./maths.js *//*! ../backends/onnx.js *//*! ../ops/registry.js */let N=Object.freeze({float32:Float32Array,float16:typeof Float16Array<"u"?Float16Array:Uint16Array,float64:Float64Array,string:Array,int8:Int8Array,uint8:Uint8Array,int16:Int16Array,uint16:Uint16Array,int32:Int32Array,uint32:Uint32Array,int64:BigInt64Array,uint64:BigUint64Array,bool:Uint8Array,uint4:Uint8Array,int4:Int8Array});class J{get dims(){return this.ort_tensor.dims}set dims(s){this.ort_tensor.dims=s}get type(){return this.ort_tensor.type}get data(){return this.ort_tensor.data}get size(){return this.ort_tensor.size}get location(){return this.ort_tensor.location}ort_tensor;constructor(...s){return(0,Z.isONNXTensor)(s[0])?this.ort_tensor=s[0]:this.ort_tensor=new Z.Tensor(s[0],s[1],s[2]),new Proxy(this,{get:(n,R0)=>{if(typeof R0=="string"){let q0=Number(R0);if(Number.isInteger(q0))return n._getitem(q0)}return n[R0]},set:(n,R0,q0)=>n[R0]=q0})}dispose(){this.ort_tensor.dispose()}*[Symbol.iterator](){let[s,...n]=this.dims;if(n.length>0){let R0=n.reduce((q0,p0)=>q0*p0);for(let q0=0;q00){let q0=R0.reduce((p0,Z0)=>p0*Z0);return this._subarray(s,q0,R0)}return new J(this.type,[this.data[s]],R0)}indexOf(s){let n=this.data;for(let R0=0;R0Z0*M0);if(R0!==q0)throw Error(`cannot reshape array of size ${R0} into shape (${n})`);let p0=s;for(let Z0=n.length-1;Z0>=0;Z0--)p0=p0.reduce((M0,q5)=>{let E0=M0[M0.length-1];return E0.lengthP0)throw Error(`Invalid slice: ${e0}`);let Q0=[Math.max(N0,0),Math.min(P0,this.dims[E0])];R0.push(Q0),n.push(Q0[1]-Q0[0])}}}let q0=R0.map(([E0,e0])=>e0-E0),p0=q0.reduce((E0,e0)=>E0*e0),Z0=this.data,M0=new Z0.constructor(p0),q5=this.stride();for(let E0=0;E0=0;--N0){let Q0=q0[N0];e0+=(P0%Q0+R0[N0][0])*q5[N0],P0=Math.floor(P0/Q0)}M0[E0]=Z0[e0]}return new J(this.type,M0,n)}permute(...s){return R(this,s)}transpose(...s){return this.permute(...s)}sum(s=null,n=!1){return this.norm(1,s,n)}norm(s="fro",n=null,R0=!1){if(s==="fro")s=2;else if(typeof s=="string")throw Error(`Unsupported norm: ${s}`);let q0=this.data,p0=(E0,e0)=>E0+e0**s;if(n===null){let E0=q0.reduce(p0,0)**(1/s);return new J(this.type,[E0],[])}let[Z0,M0,q5]=Q(p0,this,n,R0);if(s!==1)for(let E0=0;E0=0;--q5){let N0=this.dims[q5];if(q5!==n)M0+=E0%N0*e0,e0*=this.dims[q5];E0=Math.floor(E0/N0)}q0[Z0]/=p0[M0]}return this}normalize(s=2,n=1){return this.clone().normalize_(s,n)}stride(){return function(s){let n=Array(s.length);for(let R0=s.length-1,q0=1;R0>=0;--R0)n[R0]=q0,q0*=s[R0];return n}(this.dims)}squeeze(s=null){return new J(this.type,this.data,z(this.dims,s))}squeeze_(s=null){return this.dims=z(this.dims,s),this}unsqueeze(s=null){return new J(this.type,this.data,w(this.dims,s))}unsqueeze_(s=null){return this.dims=w(this.dims,s),this}flatten_(s=0,n=-1){n=(n+this.dims.length)%this.dims.length;let R0=this.dims.slice(0,s),q0=this.dims.slice(s,n+1),p0=this.dims.slice(n+1);return this.dims=[...R0,q0.reduce((Z0,M0)=>Z0*M0,1),...p0],this}flatten(s=0,n=-1){return this.clone().flatten_(s,n)}view(...s){let n=-1;for(let q0=0;q0M0!==n?p0*Z0:p0,1);s[n]=R0.length/q0}return new J(this.type,R0,s)}neg_(){let s=this.data;for(let n=0;ns?1:0;return new J("bool",n,this.dims)}lt(s){let n=new Uint8Array(this.data.length),R0=this.data;for(let q0=0;q0Math.min(Z0,M0),this,s,n,1/0);return new J(R0,q0,p0)}max(s=null,n=!1){if(s===null){let Z0=(0,G.max)(this.data)[0];return new J(this.type,[Z0],[])}let[R0,q0,p0]=Q((Z0,M0)=>Math.max(Z0,M0),this,s,n,-1/0);return new J(R0,q0,p0)}argmin(s=null,n=!1){if(s!==null)throw Error("`dim !== null` not yet implemented.");let R0=(0,G.min)(this.data)[1];return new J("int64",[BigInt(R0)],[])}argmax(s=null,n=!1){if(s!==null)throw Error("`dim !== null` not yet implemented.");let R0=(0,G.max)(this.data)[1];return new J("int64",[BigInt(R0)],[])}to(s){if(this.type===s)return this;if(!N.hasOwnProperty(s))throw Error(`Unsupported type: ${s}`);let n,R0=["int64","uint64"].includes(this.type),q0=["int64","uint64"].includes(s);return R0&&!q0?n=Number:!R0&&q0&&(n=BigInt),new J(s,N[s].from(this.data,n),this.dims)}}function R(s,n){let[R0,q0]=(0,G.permute_data)(s.data,s.dims,n);return new J(s.type,R0,q0)}function U(s,[n,R0],q0="bilinear",p0=!1){let Z0=s.dims.at(-3)??1,M0=s.dims.at(-2),q5=s.dims.at(-1),E0=(0,G.interpolate_data)(s.data,[Z0,M0,q5],[n,R0],q0,p0);return new J(s.type,E0,[Z0,n,R0])}async function H(s,{size:n=null,mode:R0="bilinear"}={}){if(s.dims.length!==4)throw Error("`interpolate_4d` currently only supports 4D input.");if(!n)throw Error("`interpolate_4d` requires a `size` argument.");let q0,p0;if(n.length===2)q0=[...s.dims.slice(0,2),...n];else if(n.length===3)q0=[s.dims[0],...n];else{if(n.length!==4)throw Error("`size` must be of length 2, 3, or 4.");q0=n}if(R0==="nearest")p0=await V.TensorOpRegistry.nearest_interpolate_4d;else if(R0==="bilinear")p0=await V.TensorOpRegistry.bilinear_interpolate_4d;else{if(R0!=="bicubic")throw Error(`Unsupported mode: ${R0}`);p0=await V.TensorOpRegistry.bicubic_interpolate_4d}let Z0=new J("int64",new BigInt64Array(q0.map(BigInt)),[q0.length]);return await p0({x:s,s:Z0})}async function L(s,n){return await(await V.TensorOpRegistry.matmul)({a:s,b:n})}async function Y(s,n){return await(await V.TensorOpRegistry.rfft)({x:s,a:n})}async function S(s,n){let R0=await V.TensorOpRegistry.top_k;return n=n==null?s.dims.at(-1):Math.min(n,s.dims.at(-1)),await R0({x:s,k:new J("int64",[BigInt(n)],[1])})}let X=(s)=>new J("int64",s,[s.length]);async function D(s,n,R0,q0,p0){return await(await V.TensorOpRegistry.slice)({x:s,s:X(n),e:X(R0),a:X(q0),t:X(p0??Array(q0.length).fill(1))})}function I(s,n){let R0=s.data,q0=n.data,p0=[s.dims[0],s.dims[2]],Z0=new R0.constructor(p0[0]*p0[1]),[M0,q5,E0]=s.dims,e0=0;for(let N0=0;N0R0!==1):typeof n=="number"?s[n]===1&&s.splice(n,1):Array.isArray(n)&&(s=s.filter((R0,q0)=>R0!==1||!n.includes(q0))),s}function w(s,n){return n=T(n,s.length+1),(s=s.slice()).splice(n,0,1),s}function T(s,n,R0=null,q0=!0){if(s<-n||s>=n){if(q0)throw Error(`IndexError: index ${s} is out of bounds for dimension${R0===null?"":" "+R0} with size ${n}`);return s<-n?0:n}return s<0&&(s=(s%n+n)%n),s}function W(s,n=0){n=T(n,s[0].dims.length);let R0=s[0].dims.slice();R0[n]=s.reduce((M0,q5)=>M0+q5.dims[n],0);let q0=R0.reduce((M0,q5)=>M0*q5,1),p0=new s[0].data.constructor(q0),Z0=s[0].type;if(n===0){let M0=0;for(let q5 of s){let E0=q5.data;p0.set(E0,M0),M0+=E0.length}}else{let M0=0;for(let q5=0;q5=0;--Q0){let g0=e0[Q0],J5=a0%g0;Q0===n&&(J5+=M0),P0+=J5*r0,r0*=R0[Q0],a0=Math.floor(a0/g0)}p0[P0]=E0[N0]}M0+=e0[n]}}return new J(Z0,p0,R0)}function E(s,n=0){return W(s.map((R0)=>R0.unsqueeze(n)),n)}function Q(s,n,R0=null,q0=!1,p0=null){let{data:Z0,dims:M0}=n;R0=T(R0,M0.length);let q5=M0.slice();q5[R0]=1;let E0=new Z0.constructor(Z0.length/M0[R0]);p0!==null&&E0.fill(p0);for(let e0=0;e0=0;--P0){let r0=M0[P0];if(P0!==R0)N0+=Q0%r0*a0,a0*=q5[P0];Q0=Math.floor(Q0/r0)}E0[N0]=s(E0[N0],Z0[e0],e0,N0)}return q0||q5.splice(R0,1),[n.type,E0,q5]}function A(s,n=null,R0=1,q0=!1){let{data:p0,dims:Z0}=s;if(n===null){let P0=p0.reduce((r0,g0)=>r0+g0,0)/p0.length,Q0=Math.sqrt(p0.reduce((r0,g0)=>r0+(g0-P0)**2,0)/(p0.length-R0)),a0=new J(s.type,[P0],[]);return[new J(s.type,[Q0],[]),a0]}let M0=l(s,n=T(n,Z0.length),q0),q5=M0.data,[E0,e0,N0]=Q((P0,Q0,a0,r0)=>P0+(Q0-q5[r0])**2,s,n,q0);for(let P0=0;P0e0+N0,0);return new J(s.type,[E0/p0.length],[])}n=T(n,q0.length);let[Z0,M0,q5]=Q((E0,e0)=>E0+e0,s,n,R0);if(q0[n]!==1)for(let E0=0;E0Z0*M0,1);return new J(R0,new q0(p0).fill(n),s)}function e(s,n){let R0,q0;if(typeof n=="number")R0="float32",q0=Float32Array;else if(typeof n=="bigint")R0="int64",q0=BigInt64Array;else{if(typeof n!="boolean")throw Error("Unsupported data type: "+typeof n);R0="bool",q0=Uint8Array}return r(s,n,R0,q0)}function V0(s,n){return e(s.dims,n)}function v0(s){return r(s,1n,"int64",BigInt64Array)}function $0(s){return v0(s.dims)}function i(s){return r(s,0n,"int64",BigInt64Array)}function G0(s){return i(s.dims)}function S0(s){let n=s.reduce((R0,q0)=>R0*q0,1);return new J("float32",Float32Array.from({length:n},()=>Math.random()),s)}function F0(s,n){if(s.dims.length!==2)throw Error("The tensor must have 2 dimensions");if(s.dims.at(-1)%8!=0)throw Error("The last dimension of the tensor must be a multiple of 8");if(!["binary","ubinary"].includes(n))throw Error("The precision must be either 'binary' or 'ubinary'");let R0=n==="binary",q0=R0?"int8":"uint8",p0=R0?Int8Array:Uint8Array,Z0=s.data,M0=new p0(Z0.length/8);for(let q5=0;q50?1:0,e0=Math.floor(q5/8),N0=q5%8;M0[e0]|=E0<<7-N0,R0&&N0===0&&(M0[e0]-=128)}return new J(q0,M0,[s.dims[0],s.dims[1]/8])}},"./src/utils/video.js":($,j,O)=>{/*!****************************!*\ + !*** ./src/utils/video.js ***! + \****************************/O.r(j),O.d(j,{RawVideo:()=>N,RawVideoFrame:()=>V,load_video:()=>J});var G=O("./src/utils/image.js"),Z=O("./src/env.js");/*! ./image.js *//*! ../env.js */class V{constructor(R,U){this.image=R,this.timestamp=U}}class N{constructor(R,U){R.length>0&&R[0]instanceof G.RawImage&&(R=R.map((H,L)=>new V(H,(L+1)/(R.length+1)*U))),this.frames=R,this.duration=U}get width(){return this.frames[0].image.width}get height(){return this.frames[0].image.height}get fps(){return this.frames.length/this.duration}}async function J(R,{num_frames:U=null,fps:H=null}={}){if(!Z.apis.IS_BROWSER_ENV)throw Error("`load_video` is currently only supported in browser environments.");if(U==null&&H==null)throw Error("Either num_frames or fps must be provided.");let L=[],Y=document.createElement("video");if(Y.crossOrigin="anonymous",Y.muted=!0,typeof R=="string")Y.src=R;else if(R instanceof Blob)Y.src=URL.createObjectURL(R);else{if(!(R instanceof HTMLVideoElement))throw Error("Invalid URL or video element provided.");Y.src=R.src}if(await new Promise((w)=>Y.onloadedmetadata=w),Y.seekable.start(0)===Y.seekable.end(0)){let w=await fetch(Y.src),T=await w.blob();Y.src=URL.createObjectURL(T),await new Promise((W)=>Y.onloadedmetadata=W)}let S=Y.duration,X,D;U!=null?(X=U,D=U===1?0:S/(U-1)):(D=1/H,X=Math.floor(S/D));let I=[];for(let w=0;w{Y.onseeked=Q}),z.drawImage(Y,0,0,k.width,k.height);let T=z.getImageData(0,0,k.width,k.height),W=new G.RawImage(T.data,k.width,k.height,4),E=new V(W,w);L.push(E)}return Y.remove(),new N(L,S)}}},MP={};function e6($){var j=MP[$];if(j!==void 0)return j.exports;var O=MP[$]={exports:{}};return FK[$](O,O.exports,e6),O.exports}SG=Object.getPrototypeOf?($)=>Object.getPrototypeOf($):($)=>$.__proto__,e6.t=function($,j){if(1&j&&($=this($)),8&j)return $;if(typeof $=="object"&&$){if(4&j&&$.__esModule)return $;if(16&j&&typeof $.then=="function")return $}var O=Object.create(null);e6.r(O);var G={};AJ=AJ||[null,SG({}),SG([]),SG(SG)];for(var Z=2&j&&$;typeof Z=="object"&&!~AJ.indexOf(Z);Z=SG(Z))Object.getOwnPropertyNames(Z).forEach((V)=>G[V]=()=>$[V]);return G.default=()=>$,e6.d(O,G),O},e6.d=($,j)=>{for(var O in j)e6.o(j,O)&&!e6.o($,O)&&Object.defineProperty($,O,{enumerable:!0,get:j[O]})},e6.o=($,j)=>Object.prototype.hasOwnProperty.call($,j),e6.r=($)=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty($,Symbol.toStringTag,{value:"Module"}),Object.defineProperty($,"__esModule",{value:!0})};var kv={};(()=>{/*!*****************************!*\ + !*** ./src/transformers.js ***! + \*****************************/e6.r(kv),e6.d(kv,{ASTFeatureExtractor:()=>L.ASTFeatureExtractor,ASTForAudioClassification:()=>O.ASTForAudioClassification,ASTModel:()=>O.ASTModel,ASTPreTrainedModel:()=>O.ASTPreTrainedModel,AlbertForMaskedLM:()=>O.AlbertForMaskedLM,AlbertForQuestionAnswering:()=>O.AlbertForQuestionAnswering,AlbertForSequenceClassification:()=>O.AlbertForSequenceClassification,AlbertModel:()=>O.AlbertModel,AlbertPreTrainedModel:()=>O.AlbertPreTrainedModel,AlbertTokenizer:()=>G.AlbertTokenizer,AudioClassificationPipeline:()=>j.AudioClassificationPipeline,AutoConfig:()=>Z.AutoConfig,AutoFeatureExtractor:()=>Y.AutoFeatureExtractor,AutoImageProcessor:()=>D.AutoImageProcessor,AutoModel:()=>O.AutoModel,AutoModelForAudioClassification:()=>O.AutoModelForAudioClassification,AutoModelForAudioFrameClassification:()=>O.AutoModelForAudioFrameClassification,AutoModelForAudioTextToText:()=>O.AutoModelForAudioTextToText,AutoModelForCTC:()=>O.AutoModelForCTC,AutoModelForCausalLM:()=>O.AutoModelForCausalLM,AutoModelForDepthEstimation:()=>O.AutoModelForDepthEstimation,AutoModelForDocumentQuestionAnswering:()=>O.AutoModelForDocumentQuestionAnswering,AutoModelForImageClassification:()=>O.AutoModelForImageClassification,AutoModelForImageFeatureExtraction:()=>O.AutoModelForImageFeatureExtraction,AutoModelForImageMatting:()=>O.AutoModelForImageMatting,AutoModelForImageSegmentation:()=>O.AutoModelForImageSegmentation,AutoModelForImageTextToText:()=>O.AutoModelForImageTextToText,AutoModelForImageToImage:()=>O.AutoModelForImageToImage,AutoModelForMaskGeneration:()=>O.AutoModelForMaskGeneration,AutoModelForMaskedLM:()=>O.AutoModelForMaskedLM,AutoModelForNormalEstimation:()=>O.AutoModelForNormalEstimation,AutoModelForObjectDetection:()=>O.AutoModelForObjectDetection,AutoModelForPoseEstimation:()=>O.AutoModelForPoseEstimation,AutoModelForQuestionAnswering:()=>O.AutoModelForQuestionAnswering,AutoModelForSemanticSegmentation:()=>O.AutoModelForSemanticSegmentation,AutoModelForSeq2SeqLM:()=>O.AutoModelForSeq2SeqLM,AutoModelForSequenceClassification:()=>O.AutoModelForSequenceClassification,AutoModelForSpeechSeq2Seq:()=>O.AutoModelForSpeechSeq2Seq,AutoModelForTextToSpectrogram:()=>O.AutoModelForTextToSpectrogram,AutoModelForTextToWaveform:()=>O.AutoModelForTextToWaveform,AutoModelForTokenClassification:()=>O.AutoModelForTokenClassification,AutoModelForUniversalSegmentation:()=>O.AutoModelForUniversalSegmentation,AutoModelForVision2Seq:()=>O.AutoModelForVision2Seq,AutoModelForXVector:()=>O.AutoModelForXVector,AutoModelForZeroShotObjectDetection:()=>O.AutoModelForZeroShotObjectDetection,AutoProcessor:()=>z.AutoProcessor,AutoTokenizer:()=>G.AutoTokenizer,AutomaticSpeechRecognitionPipeline:()=>j.AutomaticSpeechRecognitionPipeline,BackgroundRemovalPipeline:()=>j.BackgroundRemovalPipeline,BartForConditionalGeneration:()=>O.BartForConditionalGeneration,BartForSequenceClassification:()=>O.BartForSequenceClassification,BartModel:()=>O.BartModel,BartPretrainedModel:()=>O.BartPretrainedModel,BartTokenizer:()=>G.BartTokenizer,BaseModelOutput:()=>O.BaseModelOutput,BaseStreamer:()=>w.BaseStreamer,BeitFeatureExtractor:()=>X.BeitFeatureExtractor,BeitForImageClassification:()=>O.BeitForImageClassification,BeitModel:()=>O.BeitModel,BeitPreTrainedModel:()=>O.BeitPreTrainedModel,BertForMaskedLM:()=>O.BertForMaskedLM,BertForQuestionAnswering:()=>O.BertForQuestionAnswering,BertForSequenceClassification:()=>O.BertForSequenceClassification,BertForTokenClassification:()=>O.BertForTokenClassification,BertModel:()=>O.BertModel,BertPreTrainedModel:()=>O.BertPreTrainedModel,BertTokenizer:()=>G.BertTokenizer,BitImageProcessor:()=>X.BitImageProcessor,BlenderbotForConditionalGeneration:()=>O.BlenderbotForConditionalGeneration,BlenderbotModel:()=>O.BlenderbotModel,BlenderbotPreTrainedModel:()=>O.BlenderbotPreTrainedModel,BlenderbotSmallForConditionalGeneration:()=>O.BlenderbotSmallForConditionalGeneration,BlenderbotSmallModel:()=>O.BlenderbotSmallModel,BlenderbotSmallPreTrainedModel:()=>O.BlenderbotSmallPreTrainedModel,BlenderbotSmallTokenizer:()=>G.BlenderbotSmallTokenizer,BlenderbotTokenizer:()=>G.BlenderbotTokenizer,BloomForCausalLM:()=>O.BloomForCausalLM,BloomModel:()=>O.BloomModel,BloomPreTrainedModel:()=>O.BloomPreTrainedModel,BloomTokenizer:()=>G.BloomTokenizer,CLIPFeatureExtractor:()=>X.CLIPFeatureExtractor,CLIPImageProcessor:()=>X.CLIPImageProcessor,CLIPModel:()=>O.CLIPModel,CLIPPreTrainedModel:()=>O.CLIPPreTrainedModel,CLIPSegForImageSegmentation:()=>O.CLIPSegForImageSegmentation,CLIPSegModel:()=>O.CLIPSegModel,CLIPSegPreTrainedModel:()=>O.CLIPSegPreTrainedModel,CLIPTextModel:()=>O.CLIPTextModel,CLIPTextModelWithProjection:()=>O.CLIPTextModelWithProjection,CLIPTokenizer:()=>G.CLIPTokenizer,CLIPVisionModel:()=>O.CLIPVisionModel,CLIPVisionModelWithProjection:()=>O.CLIPVisionModelWithProjection,CamembertForMaskedLM:()=>O.CamembertForMaskedLM,CamembertForQuestionAnswering:()=>O.CamembertForQuestionAnswering,CamembertForSequenceClassification:()=>O.CamembertForSequenceClassification,CamembertForTokenClassification:()=>O.CamembertForTokenClassification,CamembertModel:()=>O.CamembertModel,CamembertPreTrainedModel:()=>O.CamembertPreTrainedModel,CamembertTokenizer:()=>G.CamembertTokenizer,CausalLMOutput:()=>O.CausalLMOutput,CausalLMOutputWithPast:()=>O.CausalLMOutputWithPast,ChineseCLIPFeatureExtractor:()=>X.ChineseCLIPFeatureExtractor,ChineseCLIPModel:()=>O.ChineseCLIPModel,ChineseCLIPPreTrainedModel:()=>O.ChineseCLIPPreTrainedModel,ClapAudioModelWithProjection:()=>O.ClapAudioModelWithProjection,ClapFeatureExtractor:()=>L.ClapFeatureExtractor,ClapModel:()=>O.ClapModel,ClapPreTrainedModel:()=>O.ClapPreTrainedModel,ClapTextModelWithProjection:()=>O.ClapTextModelWithProjection,ClassifierFreeGuidanceLogitsProcessor:()=>W.ClassifierFreeGuidanceLogitsProcessor,CodeGenForCausalLM:()=>O.CodeGenForCausalLM,CodeGenModel:()=>O.CodeGenModel,CodeGenPreTrainedModel:()=>O.CodeGenPreTrainedModel,CodeGenTokenizer:()=>G.CodeGenTokenizer,CodeLlamaTokenizer:()=>G.CodeLlamaTokenizer,CohereForCausalLM:()=>O.CohereForCausalLM,CohereModel:()=>O.CohereModel,CoherePreTrainedModel:()=>O.CoherePreTrainedModel,CohereTokenizer:()=>G.CohereTokenizer,ConvBertForMaskedLM:()=>O.ConvBertForMaskedLM,ConvBertForQuestionAnswering:()=>O.ConvBertForQuestionAnswering,ConvBertForSequenceClassification:()=>O.ConvBertForSequenceClassification,ConvBertForTokenClassification:()=>O.ConvBertForTokenClassification,ConvBertModel:()=>O.ConvBertModel,ConvBertPreTrainedModel:()=>O.ConvBertPreTrainedModel,ConvBertTokenizer:()=>G.ConvBertTokenizer,ConvNextFeatureExtractor:()=>X.ConvNextFeatureExtractor,ConvNextForImageClassification:()=>O.ConvNextForImageClassification,ConvNextImageProcessor:()=>X.ConvNextImageProcessor,ConvNextModel:()=>O.ConvNextModel,ConvNextPreTrainedModel:()=>O.ConvNextPreTrainedModel,ConvNextV2ForImageClassification:()=>O.ConvNextV2ForImageClassification,ConvNextV2Model:()=>O.ConvNextV2Model,ConvNextV2PreTrainedModel:()=>O.ConvNextV2PreTrainedModel,DFineForObjectDetection:()=>O.DFineForObjectDetection,DFineModel:()=>O.DFineModel,DFinePreTrainedModel:()=>O.DFinePreTrainedModel,DPTFeatureExtractor:()=>X.DPTFeatureExtractor,DPTForDepthEstimation:()=>O.DPTForDepthEstimation,DPTImageProcessor:()=>X.DPTImageProcessor,DPTModel:()=>O.DPTModel,DPTPreTrainedModel:()=>O.DPTPreTrainedModel,DacDecoderModel:()=>O.DacDecoderModel,DacDecoderOutput:()=>O.DacDecoderOutput,DacEncoderModel:()=>O.DacEncoderModel,DacEncoderOutput:()=>O.DacEncoderOutput,DacFeatureExtractor:()=>L.DacFeatureExtractor,DacModel:()=>O.DacModel,DacPreTrainedModel:()=>O.DacPreTrainedModel,DataTypeMap:()=>R.DataTypeMap,DebertaForMaskedLM:()=>O.DebertaForMaskedLM,DebertaForQuestionAnswering:()=>O.DebertaForQuestionAnswering,DebertaForSequenceClassification:()=>O.DebertaForSequenceClassification,DebertaForTokenClassification:()=>O.DebertaForTokenClassification,DebertaModel:()=>O.DebertaModel,DebertaPreTrainedModel:()=>O.DebertaPreTrainedModel,DebertaTokenizer:()=>G.DebertaTokenizer,DebertaV2ForMaskedLM:()=>O.DebertaV2ForMaskedLM,DebertaV2ForQuestionAnswering:()=>O.DebertaV2ForQuestionAnswering,DebertaV2ForSequenceClassification:()=>O.DebertaV2ForSequenceClassification,DebertaV2ForTokenClassification:()=>O.DebertaV2ForTokenClassification,DebertaV2Model:()=>O.DebertaV2Model,DebertaV2PreTrainedModel:()=>O.DebertaV2PreTrainedModel,DebertaV2Tokenizer:()=>G.DebertaV2Tokenizer,DecisionTransformerModel:()=>O.DecisionTransformerModel,DecisionTransformerPreTrainedModel:()=>O.DecisionTransformerPreTrainedModel,DeiTFeatureExtractor:()=>X.DeiTFeatureExtractor,DeiTForImageClassification:()=>O.DeiTForImageClassification,DeiTImageProcessor:()=>X.DeiTImageProcessor,DeiTModel:()=>O.DeiTModel,DeiTPreTrainedModel:()=>O.DeiTPreTrainedModel,DepthAnythingForDepthEstimation:()=>O.DepthAnythingForDepthEstimation,DepthAnythingPreTrainedModel:()=>O.DepthAnythingPreTrainedModel,DepthEstimationPipeline:()=>j.DepthEstimationPipeline,DepthProForDepthEstimation:()=>O.DepthProForDepthEstimation,DepthProPreTrainedModel:()=>O.DepthProPreTrainedModel,DetrFeatureExtractor:()=>X.DetrFeatureExtractor,DetrForObjectDetection:()=>O.DetrForObjectDetection,DetrForSegmentation:()=>O.DetrForSegmentation,DetrImageProcessor:()=>X.DetrImageProcessor,DetrModel:()=>O.DetrModel,DetrObjectDetectionOutput:()=>O.DetrObjectDetectionOutput,DetrPreTrainedModel:()=>O.DetrPreTrainedModel,DetrSegmentationOutput:()=>O.DetrSegmentationOutput,Dinov2ForImageClassification:()=>O.Dinov2ForImageClassification,Dinov2Model:()=>O.Dinov2Model,Dinov2PreTrainedModel:()=>O.Dinov2PreTrainedModel,Dinov2WithRegistersForImageClassification:()=>O.Dinov2WithRegistersForImageClassification,Dinov2WithRegistersModel:()=>O.Dinov2WithRegistersModel,Dinov2WithRegistersPreTrainedModel:()=>O.Dinov2WithRegistersPreTrainedModel,DistilBertForMaskedLM:()=>O.DistilBertForMaskedLM,DistilBertForQuestionAnswering:()=>O.DistilBertForQuestionAnswering,DistilBertForSequenceClassification:()=>O.DistilBertForSequenceClassification,DistilBertForTokenClassification:()=>O.DistilBertForTokenClassification,DistilBertModel:()=>O.DistilBertModel,DistilBertPreTrainedModel:()=>O.DistilBertPreTrainedModel,DistilBertTokenizer:()=>G.DistilBertTokenizer,DocumentQuestionAnsweringPipeline:()=>j.DocumentQuestionAnsweringPipeline,DonutFeatureExtractor:()=>X.DonutFeatureExtractor,DonutImageProcessor:()=>X.DonutImageProcessor,DonutSwinModel:()=>O.DonutSwinModel,DonutSwinPreTrainedModel:()=>O.DonutSwinPreTrainedModel,EfficientNetForImageClassification:()=>O.EfficientNetForImageClassification,EfficientNetImageProcessor:()=>X.EfficientNetImageProcessor,EfficientNetModel:()=>O.EfficientNetModel,EfficientNetPreTrainedModel:()=>O.EfficientNetPreTrainedModel,ElectraForMaskedLM:()=>O.ElectraForMaskedLM,ElectraForQuestionAnswering:()=>O.ElectraForQuestionAnswering,ElectraForSequenceClassification:()=>O.ElectraForSequenceClassification,ElectraForTokenClassification:()=>O.ElectraForTokenClassification,ElectraModel:()=>O.ElectraModel,ElectraPreTrainedModel:()=>O.ElectraPreTrainedModel,ElectraTokenizer:()=>G.ElectraTokenizer,EncodecFeatureExtractor:()=>L.EncodecFeatureExtractor,EosTokenCriteria:()=>T.EosTokenCriteria,EsmForMaskedLM:()=>O.EsmForMaskedLM,EsmForSequenceClassification:()=>O.EsmForSequenceClassification,EsmForTokenClassification:()=>O.EsmForTokenClassification,EsmModel:()=>O.EsmModel,EsmPreTrainedModel:()=>O.EsmPreTrainedModel,EsmTokenizer:()=>G.EsmTokenizer,ExaoneForCausalLM:()=>O.ExaoneForCausalLM,ExaoneModel:()=>O.ExaoneModel,ExaonePreTrainedModel:()=>O.ExaonePreTrainedModel,FFT:()=>U.FFT,FalconForCausalLM:()=>O.FalconForCausalLM,FalconModel:()=>O.FalconModel,FalconPreTrainedModel:()=>O.FalconPreTrainedModel,FalconTokenizer:()=>G.FalconTokenizer,FastViTForImageClassification:()=>O.FastViTForImageClassification,FastViTModel:()=>O.FastViTModel,FastViTPreTrainedModel:()=>O.FastViTPreTrainedModel,FeatureExtractionPipeline:()=>j.FeatureExtractionPipeline,FeatureExtractor:()=>H.FeatureExtractor,FillMaskPipeline:()=>j.FillMaskPipeline,Florence2ForConditionalGeneration:()=>O.Florence2ForConditionalGeneration,Florence2PreTrainedModel:()=>O.Florence2PreTrainedModel,Florence2Processor:()=>k.Florence2Processor,ForcedBOSTokenLogitsProcessor:()=>W.ForcedBOSTokenLogitsProcessor,ForcedEOSTokenLogitsProcessor:()=>W.ForcedEOSTokenLogitsProcessor,GLPNFeatureExtractor:()=>X.GLPNFeatureExtractor,GLPNForDepthEstimation:()=>O.GLPNForDepthEstimation,GLPNModel:()=>O.GLPNModel,GLPNPreTrainedModel:()=>O.GLPNPreTrainedModel,GPT2LMHeadModel:()=>O.GPT2LMHeadModel,GPT2Model:()=>O.GPT2Model,GPT2PreTrainedModel:()=>O.GPT2PreTrainedModel,GPT2Tokenizer:()=>G.GPT2Tokenizer,GPTBigCodeForCausalLM:()=>O.GPTBigCodeForCausalLM,GPTBigCodeModel:()=>O.GPTBigCodeModel,GPTBigCodePreTrainedModel:()=>O.GPTBigCodePreTrainedModel,GPTJForCausalLM:()=>O.GPTJForCausalLM,GPTJModel:()=>O.GPTJModel,GPTJPreTrainedModel:()=>O.GPTJPreTrainedModel,GPTNeoForCausalLM:()=>O.GPTNeoForCausalLM,GPTNeoModel:()=>O.GPTNeoModel,GPTNeoPreTrainedModel:()=>O.GPTNeoPreTrainedModel,GPTNeoXForCausalLM:()=>O.GPTNeoXForCausalLM,GPTNeoXModel:()=>O.GPTNeoXModel,GPTNeoXPreTrainedModel:()=>O.GPTNeoXPreTrainedModel,GPTNeoXTokenizer:()=>G.GPTNeoXTokenizer,Gemma2ForCausalLM:()=>O.Gemma2ForCausalLM,Gemma2Model:()=>O.Gemma2Model,Gemma2PreTrainedModel:()=>O.Gemma2PreTrainedModel,Gemma3ForCausalLM:()=>O.Gemma3ForCausalLM,Gemma3Model:()=>O.Gemma3Model,Gemma3PreTrainedModel:()=>O.Gemma3PreTrainedModel,GemmaForCausalLM:()=>O.GemmaForCausalLM,GemmaModel:()=>O.GemmaModel,GemmaPreTrainedModel:()=>O.GemmaPreTrainedModel,GemmaTokenizer:()=>G.GemmaTokenizer,GlmForCausalLM:()=>O.GlmForCausalLM,GlmModel:()=>O.GlmModel,GlmPreTrainedModel:()=>O.GlmPreTrainedModel,GraniteForCausalLM:()=>O.GraniteForCausalLM,GraniteModel:()=>O.GraniteModel,GranitePreTrainedModel:()=>O.GranitePreTrainedModel,Grok1Tokenizer:()=>G.Grok1Tokenizer,GroundingDinoForObjectDetection:()=>O.GroundingDinoForObjectDetection,GroundingDinoImageProcessor:()=>X.GroundingDinoImageProcessor,GroundingDinoPreTrainedModel:()=>O.GroundingDinoPreTrainedModel,GroundingDinoProcessor:()=>k.GroundingDinoProcessor,GroupViTModel:()=>O.GroupViTModel,GroupViTPreTrainedModel:()=>O.GroupViTPreTrainedModel,HeliumForCausalLM:()=>O.HeliumForCausalLM,HeliumModel:()=>O.HeliumModel,HeliumPreTrainedModel:()=>O.HeliumPreTrainedModel,HerbertTokenizer:()=>G.HerbertTokenizer,HieraForImageClassification:()=>O.HieraForImageClassification,HieraModel:()=>O.HieraModel,HieraPreTrainedModel:()=>O.HieraPreTrainedModel,HubertForCTC:()=>O.HubertForCTC,HubertForSequenceClassification:()=>O.HubertForSequenceClassification,HubertModel:()=>O.HubertModel,HubertPreTrainedModel:()=>O.HubertPreTrainedModel,IJepaForImageClassification:()=>O.IJepaForImageClassification,IJepaModel:()=>O.IJepaModel,IJepaPreTrainedModel:()=>O.IJepaPreTrainedModel,Idefics3ForConditionalGeneration:()=>O.Idefics3ForConditionalGeneration,Idefics3ImageProcessor:()=>X.Idefics3ImageProcessor,Idefics3PreTrainedModel:()=>O.Idefics3PreTrainedModel,Idefics3Processor:()=>k.Idefics3Processor,ImageClassificationPipeline:()=>j.ImageClassificationPipeline,ImageFeatureExtractionPipeline:()=>j.ImageFeatureExtractionPipeline,ImageFeatureExtractor:()=>L.ImageFeatureExtractor,ImageMattingOutput:()=>O.ImageMattingOutput,ImageProcessor:()=>S.ImageProcessor,ImageSegmentationPipeline:()=>j.ImageSegmentationPipeline,ImageToImagePipeline:()=>j.ImageToImagePipeline,ImageToTextPipeline:()=>j.ImageToTextPipeline,InterruptableStoppingCriteria:()=>T.InterruptableStoppingCriteria,JAISLMHeadModel:()=>O.JAISLMHeadModel,JAISModel:()=>O.JAISModel,JAISPreTrainedModel:()=>O.JAISPreTrainedModel,JinaCLIPImageProcessor:()=>X.JinaCLIPImageProcessor,JinaCLIPModel:()=>O.JinaCLIPModel,JinaCLIPPreTrainedModel:()=>O.JinaCLIPPreTrainedModel,JinaCLIPProcessor:()=>k.JinaCLIPProcessor,JinaCLIPTextModel:()=>O.JinaCLIPTextModel,JinaCLIPVisionModel:()=>O.JinaCLIPVisionModel,LiteWhisperForConditionalGeneration:()=>O.LiteWhisperForConditionalGeneration,LlamaForCausalLM:()=>O.LlamaForCausalLM,LlamaModel:()=>O.LlamaModel,LlamaPreTrainedModel:()=>O.LlamaPreTrainedModel,LlamaTokenizer:()=>G.LlamaTokenizer,LlavaForConditionalGeneration:()=>O.LlavaForConditionalGeneration,LlavaOnevisionForConditionalGeneration:()=>O.LlavaOnevisionForConditionalGeneration,LlavaOnevisionImageProcessor:()=>X.LlavaOnevisionImageProcessor,LlavaPreTrainedModel:()=>O.LlavaPreTrainedModel,LogitsProcessor:()=>W.LogitsProcessor,LogitsProcessorList:()=>W.LogitsProcessorList,LogitsWarper:()=>W.LogitsWarper,LongT5ForConditionalGeneration:()=>O.LongT5ForConditionalGeneration,LongT5Model:()=>O.LongT5Model,LongT5PreTrainedModel:()=>O.LongT5PreTrainedModel,M2M100ForConditionalGeneration:()=>O.M2M100ForConditionalGeneration,M2M100Model:()=>O.M2M100Model,M2M100PreTrainedModel:()=>O.M2M100PreTrainedModel,M2M100Tokenizer:()=>G.M2M100Tokenizer,MBart50Tokenizer:()=>G.MBart50Tokenizer,MBartForCausalLM:()=>O.MBartForCausalLM,MBartForConditionalGeneration:()=>O.MBartForConditionalGeneration,MBartForSequenceClassification:()=>O.MBartForSequenceClassification,MBartModel:()=>O.MBartModel,MBartPreTrainedModel:()=>O.MBartPreTrainedModel,MBartTokenizer:()=>G.MBartTokenizer,MPNetForMaskedLM:()=>O.MPNetForMaskedLM,MPNetForQuestionAnswering:()=>O.MPNetForQuestionAnswering,MPNetForSequenceClassification:()=>O.MPNetForSequenceClassification,MPNetForTokenClassification:()=>O.MPNetForTokenClassification,MPNetModel:()=>O.MPNetModel,MPNetPreTrainedModel:()=>O.MPNetPreTrainedModel,MPNetTokenizer:()=>G.MPNetTokenizer,MT5ForConditionalGeneration:()=>O.MT5ForConditionalGeneration,MT5Model:()=>O.MT5Model,MT5PreTrainedModel:()=>O.MT5PreTrainedModel,MarianMTModel:()=>O.MarianMTModel,MarianModel:()=>O.MarianModel,MarianPreTrainedModel:()=>O.MarianPreTrainedModel,MarianTokenizer:()=>G.MarianTokenizer,Mask2FormerImageProcessor:()=>X.Mask2FormerImageProcessor,MaskFormerFeatureExtractor:()=>X.MaskFormerFeatureExtractor,MaskFormerForInstanceSegmentation:()=>O.MaskFormerForInstanceSegmentation,MaskFormerImageProcessor:()=>X.MaskFormerImageProcessor,MaskFormerModel:()=>O.MaskFormerModel,MaskFormerPreTrainedModel:()=>O.MaskFormerPreTrainedModel,MaskedLMOutput:()=>O.MaskedLMOutput,MaxLengthCriteria:()=>T.MaxLengthCriteria,Metric3DForDepthEstimation:()=>O.Metric3DForDepthEstimation,Metric3DPreTrainedModel:()=>O.Metric3DPreTrainedModel,Metric3Dv2ForDepthEstimation:()=>O.Metric3Dv2ForDepthEstimation,Metric3Dv2PreTrainedModel:()=>O.Metric3Dv2PreTrainedModel,MgpstrForSceneTextRecognition:()=>O.MgpstrForSceneTextRecognition,MgpstrModelOutput:()=>O.MgpstrModelOutput,MgpstrPreTrainedModel:()=>O.MgpstrPreTrainedModel,MgpstrProcessor:()=>k.MgpstrProcessor,MgpstrTokenizer:()=>G.MgpstrTokenizer,MimiDecoderModel:()=>O.MimiDecoderModel,MimiDecoderOutput:()=>O.MimiDecoderOutput,MimiEncoderModel:()=>O.MimiEncoderModel,MimiEncoderOutput:()=>O.MimiEncoderOutput,MimiModel:()=>O.MimiModel,MimiPreTrainedModel:()=>O.MimiPreTrainedModel,MinLengthLogitsProcessor:()=>W.MinLengthLogitsProcessor,MinNewTokensLengthLogitsProcessor:()=>W.MinNewTokensLengthLogitsProcessor,MistralForCausalLM:()=>O.MistralForCausalLM,MistralModel:()=>O.MistralModel,MistralPreTrainedModel:()=>O.MistralPreTrainedModel,MobileBertForMaskedLM:()=>O.MobileBertForMaskedLM,MobileBertForQuestionAnswering:()=>O.MobileBertForQuestionAnswering,MobileBertForSequenceClassification:()=>O.MobileBertForSequenceClassification,MobileBertModel:()=>O.MobileBertModel,MobileBertPreTrainedModel:()=>O.MobileBertPreTrainedModel,MobileBertTokenizer:()=>G.MobileBertTokenizer,MobileLLMForCausalLM:()=>O.MobileLLMForCausalLM,MobileLLMModel:()=>O.MobileLLMModel,MobileLLMPreTrainedModel:()=>O.MobileLLMPreTrainedModel,MobileNetV1FeatureExtractor:()=>X.MobileNetV1FeatureExtractor,MobileNetV1ForImageClassification:()=>O.MobileNetV1ForImageClassification,MobileNetV1ForSemanticSegmentation:()=>O.MobileNetV1ForSemanticSegmentation,MobileNetV1ImageProcessor:()=>X.MobileNetV1ImageProcessor,MobileNetV1Model:()=>O.MobileNetV1Model,MobileNetV1PreTrainedModel:()=>O.MobileNetV1PreTrainedModel,MobileNetV2FeatureExtractor:()=>X.MobileNetV2FeatureExtractor,MobileNetV2ForImageClassification:()=>O.MobileNetV2ForImageClassification,MobileNetV2ForSemanticSegmentation:()=>O.MobileNetV2ForSemanticSegmentation,MobileNetV2ImageProcessor:()=>X.MobileNetV2ImageProcessor,MobileNetV2Model:()=>O.MobileNetV2Model,MobileNetV2PreTrainedModel:()=>O.MobileNetV2PreTrainedModel,MobileNetV3FeatureExtractor:()=>X.MobileNetV3FeatureExtractor,MobileNetV3ForImageClassification:()=>O.MobileNetV3ForImageClassification,MobileNetV3ForSemanticSegmentation:()=>O.MobileNetV3ForSemanticSegmentation,MobileNetV3ImageProcessor:()=>X.MobileNetV3ImageProcessor,MobileNetV3Model:()=>O.MobileNetV3Model,MobileNetV3PreTrainedModel:()=>O.MobileNetV3PreTrainedModel,MobileNetV4FeatureExtractor:()=>X.MobileNetV4FeatureExtractor,MobileNetV4ForImageClassification:()=>O.MobileNetV4ForImageClassification,MobileNetV4ForSemanticSegmentation:()=>O.MobileNetV4ForSemanticSegmentation,MobileNetV4ImageProcessor:()=>X.MobileNetV4ImageProcessor,MobileNetV4Model:()=>O.MobileNetV4Model,MobileNetV4PreTrainedModel:()=>O.MobileNetV4PreTrainedModel,MobileViTFeatureExtractor:()=>X.MobileViTFeatureExtractor,MobileViTForImageClassification:()=>O.MobileViTForImageClassification,MobileViTImageProcessor:()=>X.MobileViTImageProcessor,MobileViTModel:()=>O.MobileViTModel,MobileViTPreTrainedModel:()=>O.MobileViTPreTrainedModel,MobileViTV2ForImageClassification:()=>O.MobileViTV2ForImageClassification,MobileViTV2Model:()=>O.MobileViTV2Model,MobileViTV2PreTrainedModel:()=>O.MobileViTV2PreTrainedModel,ModelOutput:()=>O.ModelOutput,ModernBertForMaskedLM:()=>O.ModernBertForMaskedLM,ModernBertForSequenceClassification:()=>O.ModernBertForSequenceClassification,ModernBertForTokenClassification:()=>O.ModernBertForTokenClassification,ModernBertModel:()=>O.ModernBertModel,ModernBertPreTrainedModel:()=>O.ModernBertPreTrainedModel,Moondream1ForConditionalGeneration:()=>O.Moondream1ForConditionalGeneration,MoonshineFeatureExtractor:()=>L.MoonshineFeatureExtractor,MoonshineForConditionalGeneration:()=>O.MoonshineForConditionalGeneration,MoonshineModel:()=>O.MoonshineModel,MoonshinePreTrainedModel:()=>O.MoonshinePreTrainedModel,MoonshineProcessor:()=>k.MoonshineProcessor,MptForCausalLM:()=>O.MptForCausalLM,MptModel:()=>O.MptModel,MptPreTrainedModel:()=>O.MptPreTrainedModel,MultiModalityCausalLM:()=>O.MultiModalityCausalLM,MultiModalityPreTrainedModel:()=>O.MultiModalityPreTrainedModel,MusicgenForCausalLM:()=>O.MusicgenForCausalLM,MusicgenForConditionalGeneration:()=>O.MusicgenForConditionalGeneration,MusicgenModel:()=>O.MusicgenModel,MusicgenPreTrainedModel:()=>O.MusicgenPreTrainedModel,NllbTokenizer:()=>G.NllbTokenizer,NoBadWordsLogitsProcessor:()=>W.NoBadWordsLogitsProcessor,NoRepeatNGramLogitsProcessor:()=>W.NoRepeatNGramLogitsProcessor,NomicBertModel:()=>O.NomicBertModel,NomicBertPreTrainedModel:()=>O.NomicBertPreTrainedModel,NougatImageProcessor:()=>X.NougatImageProcessor,NougatTokenizer:()=>G.NougatTokenizer,OPTForCausalLM:()=>O.OPTForCausalLM,OPTModel:()=>O.OPTModel,OPTPreTrainedModel:()=>O.OPTPreTrainedModel,ObjectDetectionPipeline:()=>j.ObjectDetectionPipeline,Olmo2ForCausalLM:()=>O.Olmo2ForCausalLM,Olmo2Model:()=>O.Olmo2Model,Olmo2PreTrainedModel:()=>O.Olmo2PreTrainedModel,OlmoForCausalLM:()=>O.OlmoForCausalLM,OlmoModel:()=>O.OlmoModel,OlmoPreTrainedModel:()=>O.OlmoPreTrainedModel,OpenELMForCausalLM:()=>O.OpenELMForCausalLM,OpenELMModel:()=>O.OpenELMModel,OpenELMPreTrainedModel:()=>O.OpenELMPreTrainedModel,OwlViTFeatureExtractor:()=>X.OwlViTFeatureExtractor,OwlViTForObjectDetection:()=>O.OwlViTForObjectDetection,OwlViTImageProcessor:()=>X.OwlViTImageProcessor,OwlViTModel:()=>O.OwlViTModel,OwlViTPreTrainedModel:()=>O.OwlViTPreTrainedModel,OwlViTProcessor:()=>k.OwlViTProcessor,Owlv2ForObjectDetection:()=>O.Owlv2ForObjectDetection,Owlv2ImageProcessor:()=>X.Owlv2ImageProcessor,Owlv2Model:()=>O.Owlv2Model,Owlv2PreTrainedModel:()=>O.Owlv2PreTrainedModel,PaliGemmaForConditionalGeneration:()=>O.PaliGemmaForConditionalGeneration,PaliGemmaPreTrainedModel:()=>O.PaliGemmaPreTrainedModel,PaliGemmaProcessor:()=>k.PaliGemmaProcessor,PatchTSMixerForPrediction:()=>O.PatchTSMixerForPrediction,PatchTSMixerModel:()=>O.PatchTSMixerModel,PatchTSMixerPreTrainedModel:()=>O.PatchTSMixerPreTrainedModel,PatchTSTForPrediction:()=>O.PatchTSTForPrediction,PatchTSTModel:()=>O.PatchTSTModel,PatchTSTPreTrainedModel:()=>O.PatchTSTPreTrainedModel,Phi3ForCausalLM:()=>O.Phi3ForCausalLM,Phi3Model:()=>O.Phi3Model,Phi3PreTrainedModel:()=>O.Phi3PreTrainedModel,Phi3VForCausalLM:()=>O.Phi3VForCausalLM,Phi3VImageProcessor:()=>X.Phi3VImageProcessor,Phi3VPreTrainedModel:()=>O.Phi3VPreTrainedModel,Phi3VProcessor:()=>k.Phi3VProcessor,PhiForCausalLM:()=>O.PhiForCausalLM,PhiModel:()=>O.PhiModel,PhiPreTrainedModel:()=>O.PhiPreTrainedModel,Pipeline:()=>j.Pipeline,PreTrainedModel:()=>O.PreTrainedModel,PreTrainedTokenizer:()=>G.PreTrainedTokenizer,PretrainedConfig:()=>Z.PretrainedConfig,PretrainedMixin:()=>O.PretrainedMixin,Processor:()=>I.Processor,PvtForImageClassification:()=>O.PvtForImageClassification,PvtImageProcessor:()=>X.PvtImageProcessor,PvtModel:()=>O.PvtModel,PvtPreTrainedModel:()=>O.PvtPreTrainedModel,PyAnnoteFeatureExtractor:()=>L.PyAnnoteFeatureExtractor,PyAnnoteForAudioFrameClassification:()=>O.PyAnnoteForAudioFrameClassification,PyAnnoteModel:()=>O.PyAnnoteModel,PyAnnotePreTrainedModel:()=>O.PyAnnotePreTrainedModel,PyAnnoteProcessor:()=>k.PyAnnoteProcessor,QuestionAnsweringModelOutput:()=>O.QuestionAnsweringModelOutput,QuestionAnsweringPipeline:()=>j.QuestionAnsweringPipeline,Qwen2ForCausalLM:()=>O.Qwen2ForCausalLM,Qwen2Model:()=>O.Qwen2Model,Qwen2PreTrainedModel:()=>O.Qwen2PreTrainedModel,Qwen2Tokenizer:()=>G.Qwen2Tokenizer,Qwen2VLForConditionalGeneration:()=>O.Qwen2VLForConditionalGeneration,Qwen2VLImageProcessor:()=>X.Qwen2VLImageProcessor,Qwen2VLPreTrainedModel:()=>O.Qwen2VLPreTrainedModel,Qwen2VLProcessor:()=>k.Qwen2VLProcessor,Qwen3ForCausalLM:()=>O.Qwen3ForCausalLM,Qwen3Model:()=>O.Qwen3Model,Qwen3PreTrainedModel:()=>O.Qwen3PreTrainedModel,RFDetrForObjectDetection:()=>O.RFDetrForObjectDetection,RFDetrModel:()=>O.RFDetrModel,RFDetrObjectDetectionOutput:()=>O.RFDetrObjectDetectionOutput,RFDetrPreTrainedModel:()=>O.RFDetrPreTrainedModel,RTDetrForObjectDetection:()=>O.RTDetrForObjectDetection,RTDetrImageProcessor:()=>X.RTDetrImageProcessor,RTDetrModel:()=>O.RTDetrModel,RTDetrObjectDetectionOutput:()=>O.RTDetrObjectDetectionOutput,RTDetrPreTrainedModel:()=>O.RTDetrPreTrainedModel,RTDetrV2ForObjectDetection:()=>O.RTDetrV2ForObjectDetection,RTDetrV2Model:()=>O.RTDetrV2Model,RTDetrV2ObjectDetectionOutput:()=>O.RTDetrV2ObjectDetectionOutput,RTDetrV2PreTrainedModel:()=>O.RTDetrV2PreTrainedModel,RawAudio:()=>V.RawAudio,RawImage:()=>N.RawImage,RawVideo:()=>J.RawVideo,RawVideoFrame:()=>J.RawVideoFrame,RepetitionPenaltyLogitsProcessor:()=>W.RepetitionPenaltyLogitsProcessor,ResNetForImageClassification:()=>O.ResNetForImageClassification,ResNetModel:()=>O.ResNetModel,ResNetPreTrainedModel:()=>O.ResNetPreTrainedModel,RoFormerForMaskedLM:()=>O.RoFormerForMaskedLM,RoFormerForQuestionAnswering:()=>O.RoFormerForQuestionAnswering,RoFormerForSequenceClassification:()=>O.RoFormerForSequenceClassification,RoFormerForTokenClassification:()=>O.RoFormerForTokenClassification,RoFormerModel:()=>O.RoFormerModel,RoFormerPreTrainedModel:()=>O.RoFormerPreTrainedModel,RoFormerTokenizer:()=>G.RoFormerTokenizer,RobertaForMaskedLM:()=>O.RobertaForMaskedLM,RobertaForQuestionAnswering:()=>O.RobertaForQuestionAnswering,RobertaForSequenceClassification:()=>O.RobertaForSequenceClassification,RobertaForTokenClassification:()=>O.RobertaForTokenClassification,RobertaModel:()=>O.RobertaModel,RobertaPreTrainedModel:()=>O.RobertaPreTrainedModel,RobertaTokenizer:()=>G.RobertaTokenizer,SamImageProcessor:()=>X.SamImageProcessor,SamImageSegmentationOutput:()=>O.SamImageSegmentationOutput,SamModel:()=>O.SamModel,SamPreTrainedModel:()=>O.SamPreTrainedModel,SamProcessor:()=>k.SamProcessor,SapiensForDepthEstimation:()=>O.SapiensForDepthEstimation,SapiensForNormalEstimation:()=>O.SapiensForNormalEstimation,SapiensForSemanticSegmentation:()=>O.SapiensForSemanticSegmentation,SapiensPreTrainedModel:()=>O.SapiensPreTrainedModel,SeamlessM4TFeatureExtractor:()=>L.SeamlessM4TFeatureExtractor,SegformerFeatureExtractor:()=>X.SegformerFeatureExtractor,SegformerForImageClassification:()=>O.SegformerForImageClassification,SegformerForSemanticSegmentation:()=>O.SegformerForSemanticSegmentation,SegformerImageProcessor:()=>X.SegformerImageProcessor,SegformerModel:()=>O.SegformerModel,SegformerPreTrainedModel:()=>O.SegformerPreTrainedModel,Seq2SeqLMOutput:()=>O.Seq2SeqLMOutput,SequenceClassifierOutput:()=>O.SequenceClassifierOutput,SiglipImageProcessor:()=>X.SiglipImageProcessor,SiglipModel:()=>O.SiglipModel,SiglipPreTrainedModel:()=>O.SiglipPreTrainedModel,SiglipTextModel:()=>O.SiglipTextModel,SiglipTokenizer:()=>G.SiglipTokenizer,SiglipVisionModel:()=>O.SiglipVisionModel,SmolVLMForConditionalGeneration:()=>O.SmolVLMForConditionalGeneration,SmolVLMImageProcessor:()=>X.SmolVLMImageProcessor,SmolVLMProcessor:()=>k.SmolVLMProcessor,SnacDecoderModel:()=>O.SnacDecoderModel,SnacEncoderModel:()=>O.SnacEncoderModel,SnacFeatureExtractor:()=>L.SnacFeatureExtractor,SnacModel:()=>O.SnacModel,SnacPreTrainedModel:()=>O.SnacPreTrainedModel,SpeechT5FeatureExtractor:()=>L.SpeechT5FeatureExtractor,SpeechT5ForSpeechToText:()=>O.SpeechT5ForSpeechToText,SpeechT5ForTextToSpeech:()=>O.SpeechT5ForTextToSpeech,SpeechT5HifiGan:()=>O.SpeechT5HifiGan,SpeechT5Model:()=>O.SpeechT5Model,SpeechT5PreTrainedModel:()=>O.SpeechT5PreTrainedModel,SpeechT5Processor:()=>k.SpeechT5Processor,SpeechT5Tokenizer:()=>G.SpeechT5Tokenizer,SqueezeBertForMaskedLM:()=>O.SqueezeBertForMaskedLM,SqueezeBertForQuestionAnswering:()=>O.SqueezeBertForQuestionAnswering,SqueezeBertForSequenceClassification:()=>O.SqueezeBertForSequenceClassification,SqueezeBertModel:()=>O.SqueezeBertModel,SqueezeBertPreTrainedModel:()=>O.SqueezeBertPreTrainedModel,SqueezeBertTokenizer:()=>G.SqueezeBertTokenizer,StableLmForCausalLM:()=>O.StableLmForCausalLM,StableLmModel:()=>O.StableLmModel,StableLmPreTrainedModel:()=>O.StableLmPreTrainedModel,Starcoder2ForCausalLM:()=>O.Starcoder2ForCausalLM,Starcoder2Model:()=>O.Starcoder2Model,Starcoder2PreTrainedModel:()=>O.Starcoder2PreTrainedModel,StoppingCriteria:()=>T.StoppingCriteria,StoppingCriteriaList:()=>T.StoppingCriteriaList,StyleTextToSpeech2Model:()=>O.StyleTextToSpeech2Model,StyleTextToSpeech2PreTrainedModel:()=>O.StyleTextToSpeech2PreTrainedModel,SummarizationPipeline:()=>j.SummarizationPipeline,SuppressTokensAtBeginLogitsProcessor:()=>W.SuppressTokensAtBeginLogitsProcessor,Swin2SRForImageSuperResolution:()=>O.Swin2SRForImageSuperResolution,Swin2SRImageProcessor:()=>X.Swin2SRImageProcessor,Swin2SRModel:()=>O.Swin2SRModel,Swin2SRPreTrainedModel:()=>O.Swin2SRPreTrainedModel,SwinForImageClassification:()=>O.SwinForImageClassification,SwinForSemanticSegmentation:()=>O.SwinForSemanticSegmentation,SwinModel:()=>O.SwinModel,SwinPreTrainedModel:()=>O.SwinPreTrainedModel,T5ForConditionalGeneration:()=>O.T5ForConditionalGeneration,T5Model:()=>O.T5Model,T5PreTrainedModel:()=>O.T5PreTrainedModel,T5Tokenizer:()=>G.T5Tokenizer,TableTransformerForObjectDetection:()=>O.TableTransformerForObjectDetection,TableTransformerModel:()=>O.TableTransformerModel,TableTransformerObjectDetectionOutput:()=>O.TableTransformerObjectDetectionOutput,TableTransformerPreTrainedModel:()=>O.TableTransformerPreTrainedModel,TemperatureLogitsWarper:()=>W.TemperatureLogitsWarper,Tensor:()=>R.Tensor,Text2TextGenerationPipeline:()=>j.Text2TextGenerationPipeline,TextClassificationPipeline:()=>j.TextClassificationPipeline,TextGenerationPipeline:()=>j.TextGenerationPipeline,TextStreamer:()=>w.TextStreamer,TextToAudioPipeline:()=>j.TextToAudioPipeline,TokenClassificationPipeline:()=>j.TokenClassificationPipeline,TokenClassifierOutput:()=>O.TokenClassifierOutput,TokenizerModel:()=>G.TokenizerModel,TopKLogitsWarper:()=>W.TopKLogitsWarper,TopPLogitsWarper:()=>W.TopPLogitsWarper,TrOCRForCausalLM:()=>O.TrOCRForCausalLM,TrOCRPreTrainedModel:()=>O.TrOCRPreTrainedModel,TranslationPipeline:()=>j.TranslationPipeline,UltravoxModel:()=>O.UltravoxModel,UltravoxPreTrainedModel:()=>O.UltravoxPreTrainedModel,UltravoxProcessor:()=>k.UltravoxProcessor,UniSpeechForCTC:()=>O.UniSpeechForCTC,UniSpeechForSequenceClassification:()=>O.UniSpeechForSequenceClassification,UniSpeechModel:()=>O.UniSpeechModel,UniSpeechPreTrainedModel:()=>O.UniSpeechPreTrainedModel,UniSpeechSatForAudioFrameClassification:()=>O.UniSpeechSatForAudioFrameClassification,UniSpeechSatForCTC:()=>O.UniSpeechSatForCTC,UniSpeechSatForSequenceClassification:()=>O.UniSpeechSatForSequenceClassification,UniSpeechSatModel:()=>O.UniSpeechSatModel,UniSpeechSatPreTrainedModel:()=>O.UniSpeechSatPreTrainedModel,VLChatProcessor:()=>k.VLChatProcessor,VLMImageProcessor:()=>X.VLMImageProcessor,ViTFeatureExtractor:()=>X.ViTFeatureExtractor,ViTForImageClassification:()=>O.ViTForImageClassification,ViTImageProcessor:()=>X.ViTImageProcessor,ViTMAEModel:()=>O.ViTMAEModel,ViTMAEPreTrainedModel:()=>O.ViTMAEPreTrainedModel,ViTMSNForImageClassification:()=>O.ViTMSNForImageClassification,ViTMSNModel:()=>O.ViTMSNModel,ViTMSNPreTrainedModel:()=>O.ViTMSNPreTrainedModel,ViTModel:()=>O.ViTModel,ViTPreTrainedModel:()=>O.ViTPreTrainedModel,VisionEncoderDecoderModel:()=>O.VisionEncoderDecoderModel,VitMatteForImageMatting:()=>O.VitMatteForImageMatting,VitMatteImageProcessor:()=>X.VitMatteImageProcessor,VitMattePreTrainedModel:()=>O.VitMattePreTrainedModel,VitPoseForPoseEstimation:()=>O.VitPoseForPoseEstimation,VitPoseImageProcessor:()=>X.VitPoseImageProcessor,VitPosePreTrainedModel:()=>O.VitPosePreTrainedModel,VitsModel:()=>O.VitsModel,VitsModelOutput:()=>O.VitsModelOutput,VitsPreTrainedModel:()=>O.VitsPreTrainedModel,VitsTokenizer:()=>G.VitsTokenizer,Wav2Vec2BertForCTC:()=>O.Wav2Vec2BertForCTC,Wav2Vec2BertForSequenceClassification:()=>O.Wav2Vec2BertForSequenceClassification,Wav2Vec2BertModel:()=>O.Wav2Vec2BertModel,Wav2Vec2BertPreTrainedModel:()=>O.Wav2Vec2BertPreTrainedModel,Wav2Vec2CTCTokenizer:()=>G.Wav2Vec2CTCTokenizer,Wav2Vec2FeatureExtractor:()=>L.Wav2Vec2FeatureExtractor,Wav2Vec2ForAudioFrameClassification:()=>O.Wav2Vec2ForAudioFrameClassification,Wav2Vec2ForCTC:()=>O.Wav2Vec2ForCTC,Wav2Vec2ForSequenceClassification:()=>O.Wav2Vec2ForSequenceClassification,Wav2Vec2Model:()=>O.Wav2Vec2Model,Wav2Vec2PreTrainedModel:()=>O.Wav2Vec2PreTrainedModel,Wav2Vec2Processor:()=>k.Wav2Vec2Processor,Wav2Vec2ProcessorWithLM:()=>k.Wav2Vec2ProcessorWithLM,WavLMForAudioFrameClassification:()=>O.WavLMForAudioFrameClassification,WavLMForCTC:()=>O.WavLMForCTC,WavLMForSequenceClassification:()=>O.WavLMForSequenceClassification,WavLMForXVector:()=>O.WavLMForXVector,WavLMModel:()=>O.WavLMModel,WavLMPreTrainedModel:()=>O.WavLMPreTrainedModel,WeSpeakerFeatureExtractor:()=>L.WeSpeakerFeatureExtractor,WeSpeakerResNetModel:()=>O.WeSpeakerResNetModel,WeSpeakerResNetPreTrainedModel:()=>O.WeSpeakerResNetPreTrainedModel,WhisperFeatureExtractor:()=>L.WhisperFeatureExtractor,WhisperForConditionalGeneration:()=>O.WhisperForConditionalGeneration,WhisperModel:()=>O.WhisperModel,WhisperPreTrainedModel:()=>O.WhisperPreTrainedModel,WhisperProcessor:()=>k.WhisperProcessor,WhisperTextStreamer:()=>w.WhisperTextStreamer,WhisperTimeStampLogitsProcessor:()=>W.WhisperTimeStampLogitsProcessor,WhisperTokenizer:()=>G.WhisperTokenizer,XLMForQuestionAnswering:()=>O.XLMForQuestionAnswering,XLMForSequenceClassification:()=>O.XLMForSequenceClassification,XLMForTokenClassification:()=>O.XLMForTokenClassification,XLMModel:()=>O.XLMModel,XLMPreTrainedModel:()=>O.XLMPreTrainedModel,XLMRobertaForMaskedLM:()=>O.XLMRobertaForMaskedLM,XLMRobertaForQuestionAnswering:()=>O.XLMRobertaForQuestionAnswering,XLMRobertaForSequenceClassification:()=>O.XLMRobertaForSequenceClassification,XLMRobertaForTokenClassification:()=>O.XLMRobertaForTokenClassification,XLMRobertaModel:()=>O.XLMRobertaModel,XLMRobertaPreTrainedModel:()=>O.XLMRobertaPreTrainedModel,XLMRobertaTokenizer:()=>G.XLMRobertaTokenizer,XLMTokenizer:()=>G.XLMTokenizer,XLMWithLMHeadModel:()=>O.XLMWithLMHeadModel,XVectorOutput:()=>O.XVectorOutput,YolosFeatureExtractor:()=>X.YolosFeatureExtractor,YolosForObjectDetection:()=>O.YolosForObjectDetection,YolosImageProcessor:()=>X.YolosImageProcessor,YolosModel:()=>O.YolosModel,YolosObjectDetectionOutput:()=>O.YolosObjectDetectionOutput,YolosPreTrainedModel:()=>O.YolosPreTrainedModel,ZeroShotAudioClassificationPipeline:()=>j.ZeroShotAudioClassificationPipeline,ZeroShotClassificationPipeline:()=>j.ZeroShotClassificationPipeline,ZeroShotImageClassificationPipeline:()=>j.ZeroShotImageClassificationPipeline,ZeroShotObjectDetectionPipeline:()=>j.ZeroShotObjectDetectionPipeline,bankers_round:()=>U.bankers_round,cat:()=>R.cat,cos_sim:()=>U.cos_sim,dot:()=>U.dot,dynamic_time_warping:()=>U.dynamic_time_warping,env:()=>$.env,full:()=>R.full,full_like:()=>R.full_like,getKeyValueShapes:()=>Z.getKeyValueShapes,hamming:()=>V.hamming,hanning:()=>V.hanning,interpolate:()=>R.interpolate,interpolate_4d:()=>R.interpolate_4d,interpolate_data:()=>U.interpolate_data,is_chinese_char:()=>G.is_chinese_char,layer_norm:()=>R.layer_norm,load_image:()=>N.load_image,load_video:()=>J.load_video,log_softmax:()=>U.log_softmax,magnitude:()=>U.magnitude,matmul:()=>R.matmul,max:()=>U.max,mean:()=>R.mean,mean_pooling:()=>R.mean_pooling,medianFilter:()=>U.medianFilter,mel_filter_bank:()=>V.mel_filter_bank,min:()=>U.min,ones:()=>R.ones,ones_like:()=>R.ones_like,permute:()=>R.permute,permute_data:()=>U.permute_data,pipeline:()=>j.pipeline,quantize_embeddings:()=>R.quantize_embeddings,rand:()=>R.rand,read_audio:()=>V.read_audio,rfft:()=>R.rfft,round:()=>U.round,slice:()=>R.slice,softmax:()=>U.softmax,spectrogram:()=>V.spectrogram,stack:()=>R.stack,std_mean:()=>R.std_mean,topk:()=>R.topk,window_function:()=>V.window_function,zeros:()=>R.zeros,zeros_like:()=>R.zeros_like});var $=e6("./src/env.js"),j=e6("./src/pipelines.js"),O=e6("./src/models.js"),G=e6("./src/tokenizers.js"),Z=e6("./src/configs.js"),V=e6("./src/utils/audio.js"),N=e6("./src/utils/image.js"),J=e6("./src/utils/video.js"),R=e6("./src/utils/tensor.js"),U=e6("./src/utils/maths.js"),H=e6("./src/base/feature_extraction_utils.js"),L=e6("./src/models/feature_extractors.js"),Y=e6("./src/models/auto/feature_extraction_auto.js"),S=e6("./src/base/image_processors_utils.js"),X=e6("./src/models/image_processors.js"),D=e6("./src/models/auto/image_processing_auto.js"),I=e6("./src/base/processing_utils.js"),k=e6("./src/models/processors.js"),z=e6("./src/models/auto/processing_auto.js"),w=e6("./src/generation/streamers.js"),T=e6("./src/generation/stopping_criteria.js"),W=e6("./src/generation/logits_process.js");/*! ./env.js *//*! ./pipelines.js *//*! ./models.js *//*! ./tokenizers.js *//*! ./configs.js *//*! ./utils/audio.js *//*! ./utils/image.js *//*! ./utils/video.js *//*! ./utils/tensor.js *//*! ./utils/maths.js *//*! ./base/feature_extraction_utils.js *//*! ./models/feature_extractors.js *//*! ./models/auto/feature_extraction_auto.js *//*! ./base/image_processors_utils.js *//*! ./models/image_processors.js *//*! ./models/auto/image_processing_auto.js *//*! ./base/processing_utils.js *//*! ./models/processors.js *//*! ./models/auto/processing_auto.js *//*! ./generation/streamers.js *//*! ./generation/stopping_criteria.js *//*! ./generation/logits_process.js */})();var yK=kv.pipeline,XV=function(){function $(j,O){var G,Z,V,N,J,R,U,H,L,Y;O===void 0&&(O={}),this.commandHandlers=j,this.onPermissionsRequested=(G=O.onPermissionsRequested)!==null&&G!==void 0?G:function(){h6.log("VoiceController.onPermissionsRequested()")},this.onError=(Z=O.onError)!==null&&Z!==void 0?Z:function(S){h6.error("VoiceController.onError("+S+")")},this.onModelLoadStarted=(V=O.onModelLoadStarted)!==null&&V!==void 0?V:function(){h6.log("VoiceController.onModelLoadStarted()")},this.onModelLoaded=(N=O.onModelLoaded)!==null&&N!==void 0?N:function(){h6.log("VoiceController.onModelLoaded()")},this.onTranscribeStarted=(J=O.onTranscribeStarted)!==null&&J!==void 0?J:function(){h6.log("VoiceController.onTranscribeStarted()")},this.onTranscribeStopped=(R=O.onTranscribeStopped)!==null&&R!==void 0?R:function(){h6.log("VoiceController.onTranscribeStopped()")},this.onTranscriptionCommitted=(U=O.onTranscriptionCommitted)!==null&&U!==void 0?U:function(){h6.log("VoiceController.onTranscriptionCommitted()")},this.onFrame=(H=O.onFrame)!==null&&H!==void 0?H:function(){h6.log("VoiceController.onFrame()")},this.onSpeechStart=(L=O.onSpeechStart)!==null&&L!==void 0?L:function(){h6.log("VoiceController.onSpeechStart()")},this.onSpeechEnd=(Y=O.onSpeechEnd)!==null&&Y!==void 0?Y:function(){h6.log("VoiceController.onSpeechEnd()")}}return $.normalizeText=function(j){return j.toLowerCase().replace(/[^\w\s]|_/g,"")},$}(),mK=function($){function j(){var O=$!==null&&$.apply(this,arguments)||this;return O.onTranscriptionUpdated=function(G){G&&(h6.log("KeywordSpotter.onTranscriptionUpdated("+G+")"),G=XV.normalizeText(G),O.commandHandlers[G]!==void 0&&O.commandHandlers[G]())},O}return uZ(j,$),j}(XV),pK=function($){function j(O,G,Z,V){G===void 0&&(G={}),Z===void 0&&(Z="Xenova/all-MiniLM-L6-v2"),V===void 0&&(V=void 0);var N=$.call(this,O,G)||this;return N.onTranscriptionUpdated=function(J){J&&N.getIntent(J).then(function(R){N.commandHandlers[R](XV.normalizeText(J),N)})},yK("feature-extraction",Z).then(function(J){N.featureExtractor=J,V===void 0?N.getAllEmbeddings(Object.keys(O)).then(function(R){N.preComputedEmbeddings=R}):N.preComputedEmbeddings=V}),N}return uZ(j,$),j.cosineSimilarity=function(O,G){for(var Z=0,V=0,N=0,J=0;JG&&(Z=V,G=O[V]);return Z},j.prototype.getEmbeddings=function(O){return l2(this,void 0,void 0,function(){return S2(this,function(G){switch(G.label){case 0:return[4,this.featureExtractor(O,{pooling:"mean",normalize:!0})];case 1:return[2,G.sent().ort_tensor.cpuData]}})})},j.prototype.getAllEmbeddings=function(O){return l2(this,void 0,void 0,function(){var G,Z,V;return S2(this,function(N){switch(N.label){case 0:G=[],Z=0,N.label=1;case 1:return Z "+O+" "+Z),[2,Object.keys(this.commandHandlers)[j.maxIndex(Z)]]}})})},j}(XV);var dZ=1000,$D=30000,kK=262144,IK=10,DK=8192,MR="\uD83D\uDD14",nI="model/medium-streaming-en",tI=48,KR=null;async function WK(){if(!KR){let $=KK();console.log("[webterm] Loading shared Ghostty WASM:",$),KR=await HG.load($)}return KR}var jD='ui-monospace, "SFMono-Regular", "FiraCode Nerd Font", "FiraMono Nerd Font", "Fira Code", "Roboto Mono", Menlo, Monaco, Consolas, "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace',yV={tango:{background:"#000000",foreground:"#d3d7cf",cursor:"#d3d7cf",cursorAccent:"#000000",selectionBackground:"#d3d7cf",selectionForeground:"#000000",black:"#2e3436",red:"#cc0000",green:"#4e9a06",yellow:"#c4a000",blue:"#3465a4",magenta:"#75507b",cyan:"#06989a",white:"#d3d7cf",brightBlack:"#555753",brightRed:"#ef2929",brightGreen:"#8ae234",brightYellow:"#fce94f",brightBlue:"#729fcf",brightMagenta:"#ad7fa8",brightCyan:"#34e2e2",brightWhite:"#eeeeec"},xterm:{background:"#000000",foreground:"#e5e5e5",cursor:"#e5e5e5",cursorAccent:"#000000",selectionBackground:"#e5e5e5",selectionForeground:"#000000",black:"#000000",red:"#cd0000",green:"#00cd00",yellow:"#cdcd00",blue:"#0000cd",magenta:"#cd00cd",cyan:"#00cdcd",white:"#e5e5e5",brightBlack:"#4d4d4d",brightRed:"#ff0000",brightGreen:"#00ff00",brightYellow:"#ffff00",brightBlue:"#0000ff",brightMagenta:"#ff00ff",brightCyan:"#00ffff",brightWhite:"#ffffff"},monokai:{background:"#272822",foreground:"#fdfff1",cursor:"#fdfff1",cursorAccent:"#272822",selectionBackground:"#fdfff1",selectionForeground:"#272822",black:"#272822",red:"#f92672",green:"#a6e22e",yellow:"#e6db74",blue:"#fd971f",magenta:"#ae81ff",cyan:"#66d9ef",white:"#fdfff1",brightBlack:"#6e7066",brightRed:"#f92672",brightGreen:"#a6e22e",brightYellow:"#e6db74",brightBlue:"#fd971f",brightMagenta:"#ae81ff",brightCyan:"#66d9ef",brightWhite:"#fdfff1"},"monokai-pro":{background:"#2d2a2e",foreground:"#fcfcfa",cursor:"#fcfcfa",cursorAccent:"#2d2a2e",selectionBackground:"#fcfcfa",selectionForeground:"#2d2a2e",black:"#403e41",red:"#ff6188",green:"#a9dc76",yellow:"#ffd866",blue:"#fc9867",magenta:"#ab9df2",cyan:"#78dce8",white:"#fcfcfa",brightBlack:"#727072",brightRed:"#ff6188",brightGreen:"#a9dc76",brightYellow:"#ffd866",brightBlue:"#fc9867",brightMagenta:"#ab9df2",brightCyan:"#78dce8",brightWhite:"#fcfcfa"},ristretto:{background:"#2d2525",foreground:"#fff1f3",cursor:"#fff1f3",cursorAccent:"#2d2525",selectionBackground:"#fff1f3",selectionForeground:"#2d2525",black:"#2c2525",red:"#fd6883",green:"#adda78",yellow:"#f9cc6c",blue:"#f38d70",magenta:"#a8a9eb",cyan:"#85dacc",white:"#f9f8f5",brightBlack:"#655761",brightRed:"#fd6883",brightGreen:"#adda78",brightYellow:"#f9cc6c",brightBlue:"#f38d70",brightMagenta:"#a8a9eb",brightCyan:"#85dacc",brightWhite:"#f9f8f5"},dark:{background:"#1e1e1e",foreground:"#d4d4d4",cursor:"#aeafad",cursorAccent:"#1e1e1e",selectionBackground:"#d4d4d4",selectionForeground:"#1e1e1e",black:"#000000",red:"#cd3131",green:"#0dbc79",yellow:"#e5e510",blue:"#2472c8",magenta:"#bc3fbc",cyan:"#11a8cd",white:"#e5e5e5",brightBlack:"#666666",brightRed:"#f14c4c",brightGreen:"#23d18b",brightYellow:"#f5f543",brightBlue:"#3b8eea",brightMagenta:"#d670d6",brightCyan:"#29b8db",brightWhite:"#ffffff"},light:{background:"#ffffff",foreground:"#383a42",cursor:"#526eff",cursorAccent:"#ffffff",selectionBackground:"#383a42",selectionForeground:"#ffffff",black:"#000000",red:"#e45649",green:"#50a14f",yellow:"#c18401",blue:"#4078f2",magenta:"#a626a4",cyan:"#0184bc",white:"#a0a1a7",brightBlack:"#5c6370",brightRed:"#e06c75",brightGreen:"#98c379",brightYellow:"#d19a66",brightBlue:"#61afef",brightMagenta:"#c678dd",brightCyan:"#56b6c2",brightWhite:"#ffffff"},dracula:{background:"#282a36",foreground:"#f8f8f2",cursor:"#f8f8f2",cursorAccent:"#282a36",selectionBackground:"#f8f8f2",selectionForeground:"#282a36",black:"#21222c",red:"#ff5555",green:"#50fa7b",yellow:"#f1fa8c",blue:"#bd93f9",magenta:"#ff79c6",cyan:"#8be9fd",white:"#f8f8f2",brightBlack:"#6272a4",brightRed:"#ff6e6e",brightGreen:"#69ff94",brightYellow:"#ffffa5",brightBlue:"#d6acff",brightMagenta:"#ff92df",brightCyan:"#a4ffff",brightWhite:"#ffffff"},catppuccin:{background:"#1e1e2e",foreground:"#cdd6f4",cursor:"#f5e0dc",cursorAccent:"#1e1e2e",selectionBackground:"#cdd6f4",selectionForeground:"#1e1e2e",black:"#45475a",red:"#f38ba8",green:"#a6e3a1",yellow:"#f9e2af",blue:"#89b4fa",magenta:"#f5c2e7",cyan:"#94e2d5",white:"#bac2de",brightBlack:"#585b70",brightRed:"#f38ba8",brightGreen:"#a6e3a1",brightYellow:"#f9e2af",brightBlue:"#89b4fa",brightMagenta:"#f5c2e7",brightCyan:"#94e2d5",brightWhite:"#a6adc8"},nord:{background:"#2e3440",foreground:"#d8dee9",cursor:"#d8dee9",cursorAccent:"#2e3440",selectionBackground:"#d8dee9",selectionForeground:"#2e3440",black:"#3b4252",red:"#bf616a",green:"#a3be8c",yellow:"#ebcb8b",blue:"#81a1c1",magenta:"#b48ead",cyan:"#88c0d0",white:"#e5e9f0",brightBlack:"#4c566a",brightRed:"#bf616a",brightGreen:"#a3be8c",brightYellow:"#ebcb8b",brightBlue:"#81a1c1",brightMagenta:"#b48ead",brightCyan:"#8fbcbb",brightWhite:"#eceff4"},gruvbox:{background:"#282828",foreground:"#ebdbb2",cursor:"#ebdbb2",cursorAccent:"#282828",selectionBackground:"#ebdbb2",selectionForeground:"#282828",black:"#282828",red:"#cc241d",green:"#98971a",yellow:"#d79921",blue:"#458588",magenta:"#b16286",cyan:"#689d6a",white:"#a89984",brightBlack:"#928374",brightRed:"#fb4934",brightGreen:"#b8bb26",brightYellow:"#fabd2f",brightBlue:"#83a598",brightMagenta:"#d3869b",brightCyan:"#8ec07c",brightWhite:"#ebdbb2"},solarized:{background:"#002b36",foreground:"#839496",cursor:"#839496",cursorAccent:"#002b36",selectionBackground:"#839496",selectionForeground:"#002b36",black:"#073642",red:"#dc322f",green:"#859900",yellow:"#b58900",blue:"#268bd2",magenta:"#d33682",cyan:"#2aa198",white:"#eee8d5",brightBlack:"#586e75",brightRed:"#cb4b16",brightGreen:"#586e75",brightYellow:"#657b83",brightBlue:"#839496",brightMagenta:"#6c71c4",brightCyan:"#93a1a1",brightWhite:"#fdf6e3"},tokyo:{background:"#1a1b26",foreground:"#a9b1d6",cursor:"#c0caf5",cursorAccent:"#1a1b26",selectionBackground:"#a9b1d6",selectionForeground:"#1a1b26",black:"#15161e",red:"#f7768e",green:"#9ece6a",yellow:"#e0af68",blue:"#7aa2f7",magenta:"#bb9af7",cyan:"#7dcfff",white:"#a9b1d6",brightBlack:"#414868",brightRed:"#f7768e",brightGreen:"#9ece6a",brightYellow:"#e0af68",brightBlue:"#7aa2f7",brightMagenta:"#bb9af7",brightCyan:"#7dcfff",brightWhite:"#c0caf5"},miasma:{background:"#222222",foreground:"#c2c2b0",cursor:"#c2c2b0",cursorAccent:"#222222",selectionBackground:"#c2c2b0",selectionForeground:"#222222",black:"#000000",red:"#685742",green:"#5f875f",yellow:"#b36d43",blue:"#78824b",magenta:"#bb7744",cyan:"#c9a554",white:"#d7c483",brightBlack:"#666666",brightRed:"#685742",brightGreen:"#5f875f",brightYellow:"#b36d43",brightBlue:"#78824b",brightMagenta:"#bb7744",brightCyan:"#c9a554",brightWhite:"#d7c483"},github:{background:"#1c2128",foreground:"#adbac7",cursor:"#adbac7",cursorAccent:"#1c2128",selectionBackground:"#adbac7",selectionForeground:"#1c2128",black:"#545d68",red:"#f47067",green:"#57ab5a",yellow:"#c69026",blue:"#539bf5",magenta:"#b083f0",cyan:"#39c5cf",white:"#909dab",brightBlack:"#636e7b",brightRed:"#ff938a",brightGreen:"#6bc46d",brightYellow:"#daaa3f",brightBlue:"#6cb6ff",brightMagenta:"#dcbdfb",brightCyan:"#56d4dd",brightWhite:"#cdd9e5"},gotham:{background:"#0c1014",foreground:"#99d1ce",cursor:"#99d1ce",cursorAccent:"#0c1014",selectionBackground:"#99d1ce",selectionForeground:"#0c1014",black:"#0c1014",red:"#c23127",green:"#2aa889",yellow:"#edb443",blue:"#195466",magenta:"#4e5166",cyan:"#33859e",white:"#99d1ce",brightBlack:"#0c1014",brightRed:"#c23127",brightGreen:"#2aa889",brightYellow:"#edb443",brightBlue:"#195466",brightMagenta:"#4e5166",brightCyan:"#33859e",brightWhite:"#99d1ce"}};function MK($){let j={};if($.dataset.fontFamily){let O=$.dataset.fontFamily;if(O.startsWith("var(")){let G=O.match(/var\(([^)]+)\)/);if(G){let Z=G[1].trim(),V=getComputedStyle(document.documentElement).getPropertyValue(Z).trim();if(V)O=V;else console.warn(`[webterm] CSS variable ${Z} not found, using default font`),O=jD}}j.fontFamily=O}if($.dataset.fontSize)j.fontSize=parseInt($.dataset.fontSize,10);if($.dataset.scrollback)j.scrollback=parseInt($.dataset.scrollback,10);if($.dataset.theme){let O=$.dataset.theme.toLowerCase();if(O in yV)j.theme=yV[O];else try{j.theme=JSON.parse($.dataset.theme)}catch(G){console.warn(`[webterm] Unknown theme "${$.dataset.theme}"`,G)}}return j}function KK(){let $=document.querySelectorAll('script[src*="terminal.js"]');if($.length>0){let j=$[0].src;return j.substring(0,j.lastIndexOf("/")+1)+"ghostty-vt.wasm"}return"/static/js/ghostty-vt.wasm"}function FV(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||"ontouchstart"in window&&navigator.maxTouchPoints>0}var bK={"`":"~","1":"!","2":"@","3":"#","4":"$","5":"%","6":"^","7":"&","8":"*","9":"(","0":")","-":"_","=":"+","[":"{","]":"}","\\":"|",";":":","'":'"',",":"<",".":">","/":"?"},fK={"2":"@","3":"[","4":"\\","5":"]","6":"^","7":"_","8":"?"},wK=["\x1BOP","\x1BOQ","\x1BOR","\x1BOS","\x1B[15~","\x1B[17~","\x1B[18~","\x1B[19~","\x1B[20~","\x1B[21~"],EK=["\x1B[23~","\x1B[24~","\x1B[25~","\x1B[26~","\x1B[28~","\x1B[29~","\x1B[31~","\x1B[32~","\x1B[33~","\x1B[34~"];function QK($){if($.length!==1)return $;if($>="a"&&$<="z")return $.toUpperCase();return bK[$]??$}function OD($){if($.length!==1)return $;let j=fK[$]??$;if(j==="?")return"";let O=j.toUpperCase().charCodeAt(0);if(O>=64&&O<=95)return String.fromCharCode(O-64);return $}function fR($,j){if($.length!==1)return null;let O="1234567890".indexOf($);if(O<0)return null;return j?EK[O]:wK[O]}function R7($){if(!$||$.startsWith("\x1B"))return $;return`\x1B${$}`}function bR($,j,O,G,Z){if($.length!==1)return $;if(Z){let V=fR($,j);if(V)return G?R7(V):V}if(O){let V=OD($);if(V!==$)return G?R7(V):V}if(j){let V=QK($);return G?R7(V):V}return G?R7($):$}class zV{terminal;fitAddon;socket=null;socketGeneration=0;element;wsUrl;reconnectAttempts=0;maxReconnectAttempts=5;reconnectDelay=1000;heartbeatIntervalMs=15000;stallTimeoutMs=45000;heartbeatTimer;lastMessageAt=0;lastPongAt=0;messageQueue=[];pendingStdin="";pendingStdinTimer;lastValidSize=null;mobileInput=null;mobileKeybar=null;ctrlActive=!1;altActive=!1;shiftActive=!1;fnActive=!1;pendingCtrl=!1;pendingAlt=!1;pendingShift=!1;pendingFn=!1;fontFamily;fontSize;cleanupTimer;resizeObserver=null;mobileKeybarStyle=null;boundHandlers=[];isTabHidden=!1;hiddenBuffer=[];hiddenBufferBytes=0;baseTitle;bellActive=!1;routeKey;voiceControls=null;voiceButton=null;voiceStatus=null;voiceTranscriber=null;voiceModelURL=nI;isVoiceStarting=!1;voiceStartupErrorCleanup=null;static sharedTextEncoder=new TextEncoder;constructor($,j,O,G,Z,V,N,J){this.element=$,this.wsUrl=j,this.terminal=O,this.fitAddon=G,this.fontFamily=Z,this.fontSize=V,this.routeKey=N,this.baseTitle=J}addTrackedListener($,j,O,G){$.addEventListener(j,O,G),this.boundHandlers.push({target:$,type:j,handler:O,options:G})}bellStorageKey(){if(!this.routeKey)return null;return`webterm:bell:${this.routeKey}`}bellSuppressUntil=0;setBellActive(){if(Date.now(){if(typeof this.terminal.loadFonts==="function")this.terminal.loadFonts();this.fit()}),this.setupResizeObserver(),this.addTrackedListener(window,"resize",()=>{this.fit()}),this.terminal.onData((j)=>{this.clearBellState(),this.sendStdin(j)}),this.terminal.onBell(()=>{this.setBellActive()}),this.addTrackedListener(this.element,"mousedown",()=>{if(this.bellActive)this.clearBellState()}),this.terminal.onResize((j)=>{if(this.isValidSize(j.cols,j.rows))this.lastValidSize={cols:j.cols,rows:j.rows},this.send(["resize",{width:j.cols,height:j.rows}])}),this.setupMobileKeyboard(),this.setupTouchSelection(),this.setupVoiceInput(),FV())this.setupMobileKeybar();if(this.isTabHidden=document.hidden,this.startResourceCleanup(),this.connect(),document.hasFocus())this.clearBellState();let $=()=>{if(this.clearBellState(),FV())this.focusMobileInput();else this.terminal.focus()};this.addTrackedListener(document,"visibilitychange",()=>{if(document.hidden)this.isTabHidden=!0,this.stopHeartbeatWatchdog();else this.isTabHidden=!1,this.refreshConnection(),$()}),this.addTrackedListener(window,"focus",()=>{$()}),this.addTrackedListener(window,"pageshow",()=>{$()})}setupMobileKeyboard(){let $=document.createElement("textarea");$.setAttribute("autocapitalize","off"),$.setAttribute("autocomplete","off"),$.setAttribute("autocorrect","off"),$.setAttribute("spellcheck","false"),$.setAttribute("inputmode","text"),$.setAttribute("enterkeyhint","send"),$.style.cssText=` position: absolute; left: 0; top: 0; @@ -26,7 +8694,12 @@ For tests, pass a Ghostty instance directly: font-size: 16px; caret-color: transparent; pointer-events: none; - `,this.element.style.position="relative",this.element.appendChild(j),this.mobileInput=j;let $=(J)=>s(J,this.shiftActive||this.pendingShift,this.ctrlActive||this.pendingCtrl,this.altActive||this.pendingAlt,this.fnActive||this.pendingFn),V=(J,X)=>{if(X)X.preventDefault(),X.stopPropagation();if(!J)return;this.sendStdin($(J)),j.value="",this.deactivateModifiers(),this.pendingCtrl=!1,this.pendingAlt=!1,this.pendingShift=!1,this.pendingFn=!1};j.addEventListener("beforeinput",(J)=>{if(J.inputType==="insertText"&&J.data){V(J.data,J);return}let X=null;switch(J.inputType){case"insertLineBreak":X="\r";break;case"deleteContentBackward":X="";break;case"deleteContentForward":X="\x1B[3~";break}if(X)V(X,J)}),j.addEventListener("input",()=>{V(j.value)}),j.addEventListener("keydown",(J)=>{let X=J.ctrlKey||this.ctrlActive,K=J.shiftKey||this.shiftActive,z=J.altKey||this.altActive,O=this.fnActive;if(X&&J.key.length===1&&!J.altKey&&!J.metaKey){let R=R0(J.key);if(R!==J.key){J.preventDefault(),J.stopPropagation();let U=z?f(R):R;this.sendStdin(U),this.deactivateModifiers();return}}if(O&&J.key.length===1&&!J.ctrlKey&&!J.metaKey){let R=E(J.key,K);if(R){J.preventDefault(),J.stopPropagation(),this.sendStdin(R),this.deactivateModifiers();return}}let W=null;switch(J.key){case"Escape":W="\x1B";break;case"ArrowUp":case"ArrowDown":case"ArrowRight":case"ArrowLeft":{let R=J.key==="ArrowUp"?"A":J.key==="ArrowDown"?"B":J.key==="ArrowRight"?"C":"D";if(X&&K)W=`\x1B[1;6${R}`;else if(X)W=`\x1B[1;5${R}`;else if(K)W=`\x1B[1;2${R}`;else W=`\x1B[${R}`;break}case"Tab":if(K)W="\x1B[Z";else W="\t";J.preventDefault();break}if(W)J.preventDefault(),J.stopPropagation(),this.sendStdin(z?f(W):W),this.deactivateModifiers()}),this.addTrackedListener(document,"keydown",(J)=>{if(!this.ctrlActive&&!this.shiftActive&&!this.altActive&&!this.fnActive)return;if(J.target===this.mobileInput)return;let X=this.ctrlActive,K=this.shiftActive,z=this.altActive,O=this.fnActive,W=!1;if(J.key.length===1&&!J.altKey&&!J.metaKey){let R=s(J.key,K,X,z,O);J.preventDefault(),J.stopPropagation(),this.sendStdin(R),W=!0}else{let R=null;switch(J.key){case"Escape":R="\x1B";break;case"ArrowUp":case"ArrowDown":case"ArrowRight":case"ArrowLeft":{let U=J.key==="ArrowUp"?"A":J.key==="ArrowDown"?"B":J.key==="ArrowRight"?"C":"D";if(X&&K)R=`\x1B[1;6${U}`;else if(X)R=`\x1B[1;5${U}`;else if(K)R=`\x1B[1;2${U}`;else R=`\x1B[${U}`;break}case"Tab":if(K)R="\x1B[Z";else R="\t";break}if(R)J.preventDefault(),J.stopPropagation(),this.sendStdin(z?f(R):R),W=!0}if(W)this.deactivateModifiers()},{capture:!0});let Z=()=>{this.mobileInput?.focus()};this.addTrackedListener(this.element,"touchend",Z,{passive:!0}),this.addTrackedListener(this.element,"click",Z)}setupTouchSelection(){let j=this.element.querySelector("canvas");if(!j)return;let $=300,V=10,Z=1.5,J="undecided",X=0,K=0,z=0,O=null,W=0,R=0,U=0,H=null,L=(q,P)=>{let _=new MouseEvent(q,{bubbles:!0,cancelable:!0,clientX:P.clientX,clientY:P.clientY,button:0,buttons:q==="mouseup"?0:1});j.dispatchEvent(_)},Y=()=>{if(O!==null)clearTimeout(O),O=null},T=()=>{if(H!==null)cancelAnimationFrame(H),H=null;R=0},x=()=>{let q=j.getBoundingClientRect(),P=this.terminal.rows;return P>0?q.height/P:16},N=()=>{if(R*=0.92,Math.abs(R)<0.5){H=null;return}let _=x();W+=R*Z/_;let F=Math.trunc(W);if(F!==0)W-=F,this.terminal.scrollLines(F);H=requestAnimationFrame(N)};this.addTrackedListener(j,"touchstart",(q)=>{if(q.touches.length!==1)return;q.preventDefault(),T();let P=q.touches[0];X=P.clientX,K=P.clientY,z=P.clientY,U=performance.now(),R=0,W=0,J="undecided",O=setTimeout(()=>{if(O=null,J==="undecided")J="select",L("mousedown",P)},$)},{passive:!1}),this.addTrackedListener(j,"touchmove",(q)=>{if(q.touches.length!==1)return;q.preventDefault();let P=q.touches[0],_=performance.now();if(J==="undecided"){let F=P.clientX-X,u=P.clientY-K;if(Math.abs(u)>V||Math.abs(F)>V)Y(),J="scroll";else return}if(J==="scroll"){let F=z-P.clientY,u=_-U;if(u>0)R=F/u*16;z=P.clientY,U=_;let q0=x();W+=F*Z/q0;let y=Math.trunc(W);if(y!==0)W-=y,this.terminal.scrollLines(y)}else if(J==="select")L("mousemove",P)},{passive:!1}),this.addTrackedListener(j,"touchend",(q)=>{let P=q.changedTouches[0];if(!P)return;if(q.preventDefault(),Y(),J==="select")L("mouseup",P);else if(J==="scroll"){if(Math.abs(R)>0.5)H=requestAnimationFrame(N)}J="undecided"},{passive:!1})}keybarButtonHeight=44;setupMobileKeybar(){let j=document.createElement("div");j.className="mobile-keybar";let $=document.createElement("div");$.className="keybar-panel keybar-keys",$.innerHTML=` + `,this.element.style.position="relative",this.element.appendChild($),this.mobileInput=$;let j=(Z)=>bR(Z,this.shiftActive||this.pendingShift,this.ctrlActive||this.pendingCtrl,this.altActive||this.pendingAlt,this.fnActive||this.pendingFn),O=(Z,V)=>{if(V)V.preventDefault(),V.stopPropagation();if(!Z)return;this.sendStdin(j(Z)),$.value="",this.deactivateModifiers(),this.pendingCtrl=!1,this.pendingAlt=!1,this.pendingShift=!1,this.pendingFn=!1};$.addEventListener("beforeinput",(Z)=>{if(Z.inputType==="insertText"&&Z.data){O(Z.data,Z);return}let V=null;switch(Z.inputType){case"insertLineBreak":V="\r";break;case"deleteContentBackward":V="";break;case"deleteContentForward":V="\x1B[3~";break}if(V)O(V,Z)}),$.addEventListener("input",()=>{O($.value)}),$.addEventListener("keydown",(Z)=>{let V=Z.ctrlKey||this.ctrlActive,N=Z.shiftKey||this.shiftActive,J=Z.altKey||this.altActive,R=this.fnActive;if(V&&Z.key.length===1&&!Z.altKey&&!Z.metaKey){let H=OD(Z.key);if(H!==Z.key){Z.preventDefault(),Z.stopPropagation();let L=J?R7(H):H;this.sendStdin(L),this.deactivateModifiers();return}}if(R&&Z.key.length===1&&!Z.ctrlKey&&!Z.metaKey){let H=fR(Z.key,N);if(H){Z.preventDefault(),Z.stopPropagation(),this.sendStdin(H),this.deactivateModifiers();return}}let U=null;switch(Z.key){case"Escape":U="\x1B";break;case"ArrowUp":case"ArrowDown":case"ArrowRight":case"ArrowLeft":{let H=Z.key==="ArrowUp"?"A":Z.key==="ArrowDown"?"B":Z.key==="ArrowRight"?"C":"D";if(V&&N)U=`\x1B[1;6${H}`;else if(V)U=`\x1B[1;5${H}`;else if(N)U=`\x1B[1;2${H}`;else U=`\x1B[${H}`;break}case"Tab":if(N)U="\x1B[Z";else U="\t";Z.preventDefault();break}if(U)Z.preventDefault(),Z.stopPropagation(),this.sendStdin(J?R7(U):U),this.deactivateModifiers()}),this.addTrackedListener(document,"keydown",(Z)=>{if(!this.ctrlActive&&!this.shiftActive&&!this.altActive&&!this.fnActive)return;if(Z.target===this.mobileInput)return;let V=this.ctrlActive,N=this.shiftActive,J=this.altActive,R=this.fnActive,U=!1;if(Z.key.length===1&&!Z.altKey&&!Z.metaKey){let H=bR(Z.key,N,V,J,R);Z.preventDefault(),Z.stopPropagation(),this.sendStdin(H),U=!0}else{let H=null;switch(Z.key){case"Escape":H="\x1B";break;case"ArrowUp":case"ArrowDown":case"ArrowRight":case"ArrowLeft":{let L=Z.key==="ArrowUp"?"A":Z.key==="ArrowDown"?"B":Z.key==="ArrowRight"?"C":"D";if(V&&N)H=`\x1B[1;6${L}`;else if(V)H=`\x1B[1;5${L}`;else if(N)H=`\x1B[1;2${L}`;else H=`\x1B[${L}`;break}case"Tab":if(N)H="\x1B[Z";else H="\t";break}if(H)Z.preventDefault(),Z.stopPropagation(),this.sendStdin(J?R7(H):H),U=!0}if(U)this.deactivateModifiers()},{capture:!0});let G=()=>{this.mobileInput?.focus()};this.addTrackedListener(this.element,"touchend",G,{passive:!0}),this.addTrackedListener(this.element,"click",G)}setupTouchSelection(){let $=this.element.querySelector("canvas");if(!$)return;let j=300,O=10,G=1.5,Z="undecided",V=0,N=0,J=0,R=null,U=0,H=0,L=0,Y=null,S=(z,w)=>{let T=new MouseEvent(z,{bubbles:!0,cancelable:!0,clientX:w.clientX,clientY:w.clientY,button:0,buttons:z==="mouseup"?0:1});$.dispatchEvent(T)},X=()=>{if(R!==null)clearTimeout(R),R=null},D=()=>{if(Y!==null)cancelAnimationFrame(Y),Y=null;H=0},I=()=>{let z=$.getBoundingClientRect(),w=this.terminal.rows;return w>0?z.height/w:16},k=()=>{if(H*=0.92,Math.abs(H)<0.5){Y=null;return}let T=I();U+=H*G/T;let W=Math.trunc(U);if(W!==0)U-=W,this.terminal.scrollLines(W);Y=requestAnimationFrame(k)};this.addTrackedListener($,"touchstart",(z)=>{if(z.touches.length!==1)return;z.preventDefault(),D();let w=z.touches[0];V=w.clientX,N=w.clientY,J=w.clientY,L=performance.now(),H=0,U=0,Z="undecided",R=setTimeout(()=>{if(R=null,Z==="undecided")Z="select",S("mousedown",w)},j)},{passive:!1}),this.addTrackedListener($,"touchmove",(z)=>{if(z.touches.length!==1)return;z.preventDefault();let w=z.touches[0],T=performance.now();if(Z==="undecided"){let W=w.clientX-V,E=w.clientY-N;if(Math.abs(E)>O||Math.abs(W)>O)X(),Z="scroll";else return}if(Z==="scroll"){let W=J-w.clientY,E=T-L;if(E>0)H=W/E*16;J=w.clientY,L=T;let Q=I();U+=W*G/Q;let A=Math.trunc(U);if(A!==0)U-=A,this.terminal.scrollLines(A)}else if(Z==="select")S("mousemove",w)},{passive:!1}),this.addTrackedListener($,"touchend",(z)=>{let w=z.changedTouches[0];if(!w)return;if(z.preventDefault(),X(),Z==="select")S("mouseup",w);else if(Z==="scroll"){if(Math.abs(H)>0.5)Y=requestAnimationFrame(k)}Z="undecided"},{passive:!1})}setupVoiceInput(){if(this.voiceModelURL=this.element.dataset.moonshineModelUrl?.trim()||nI,window.getComputedStyle(this.element).position==="static")this.element.style.position="relative";let $=document.createElement("div");if($.className="webterm-voice-controls",$.innerHTML=` + + Ready + `,this.element.appendChild($),this.voiceControls=$,this.voiceButton=$.querySelector(".webterm-voice-button"),this.voiceStatus=$.querySelector(".webterm-voice-status"),!this.voiceButton||!this.voiceStatus)return;if(Object.assign($.style,{position:"absolute",top:"12px",right:"12px",zIndex:"4",display:"flex",alignItems:"center",gap:"8px",padding:"8px 10px",borderRadius:"999px",background:"rgba(9, 14, 19, 0.78)",backdropFilter:"blur(8px)",boxShadow:"0 8px 30px rgba(0, 0, 0, 0.28)",pointerEvents:"auto"}),Object.assign(this.voiceButton.style,{border:"1px solid rgba(255, 255, 255, 0.18)",borderRadius:"999px",background:"#12202b",color:"#f3f6fa",font:'600 12px "Fira Code", "FiraCode Nerd Font", monospace',padding:"7px 12px",cursor:"pointer"}),Object.assign(this.voiceStatus.style,{color:"#c9d5e0",font:'500 11px "Fira Code", "FiraCode Nerd Font", monospace',whiteSpace:"normal",lineHeight:"1.35",maxWidth:"44ch",overflowWrap:"anywhere"}),this.voiceButton.addEventListener("click",()=>{this.toggleVoiceInput()}),typeof navigator>"u"||!navigator.mediaDevices?.getUserMedia||typeof AudioContext>"u"){this.setVoiceState("unsupported","Voice unavailable");return}this.setVoiceState("idle","Ready")}async toggleVoiceInput(){if(this.isVoiceStarting)return;if(this.voiceTranscriber?.isActive){this.stopVoiceInput();return}this.isVoiceStarting=!0,this.armVoiceStartupErrorCapture(),this.setVoiceState("loading","Starting...");try{await this.getVoiceTranscriber().start(),this.setVoiceState("listening","Listening..."),this.focusTerminalInput()}catch($){console.error("[webterm] Failed to start Moonshine microphone transcriber:",$),this.setVoiceState("error",this.describeVoiceError($))}finally{this.isVoiceStarting=!1}}getVoiceTranscriber(){if(this.voiceTranscriber)return this.voiceTranscriber;return this.voiceTranscriber=new tv(this.voiceModelURL,{onPermissionsRequested:()=>{this.setVoiceState("loading","Allow microphone...")},onModelLoadStarted:()=>{this.setVoiceState("loading","Loading model...")},onModelLoaded:()=>{this.setVoiceState("loading","Model ready")},onTranscribeStarted:()=>{this.setVoiceState("listening","Listening...")},onTranscribeStopped:()=>{this.setVoiceState("idle","Ready")},onTranscriptionUpdated:($)=>{let j=$.trim();this.setVoiceState("listening",j?`Heard: ${j}`:"Listening...")},onTranscriptionCommitted:($)=>{let j=$.trim();if(!j)return;this.sendStdin(j),this.setVoiceState("listening",`Sent: ${j}`),this.focusTerminalInput()},onError:($)=>{console.error("[webterm] Moonshine error:",$);let j=this.describeVoiceError($);this.setVoiceState("error",j==="PlatformUnsupported"?"PlatformUnsupported. Waiting for underlying browser error...":j)}},!1),this.voiceTranscriber}stopVoiceInput(){if(this.clearVoiceStartupErrorCapture(),!this.voiceTranscriber){this.setVoiceState("idle","Ready");return}this.voiceTranscriber.stop(),this.stopVoiceTracks(),this.setVoiceState("idle","Ready"),this.focusTerminalInput()}stopVoiceTracks(){this.voiceTranscriber.mediaStream?.getTracks().forEach((j)=>{j.stop()})}describeVoiceError($){if(typeof $==="string"&&$.trim())return $.trim();if($ instanceof Error&&$.message.trim()){let j="cause"in $&&$.cause?` Cause: ${this.describeVoiceError($.cause)}`:"";return`${$.name}: ${$.message.trim()}${j}`}if(typeof $==="object"&&$!==null)try{return JSON.stringify($)}catch{return String($)}return"Voice error"}armVoiceStartupErrorCapture(){this.clearVoiceStartupErrorCapture();let $=Date.now(),j=15000,O=(N)=>{if(Date.now()-$>j)return;let J=this.describeVoiceError(N);if(!J||J==="PlatformUnsupported"||J==="Voice error")return;console.error("[webterm] Captured Moonshine startup failure:",N),this.setVoiceState("error",J)},G=(N)=>{O(N.reason)},Z=(N)=>{O(N.error??N.message)};window.addEventListener("unhandledrejection",G),window.addEventListener("error",Z);let V=window.setTimeout(()=>{this.clearVoiceStartupErrorCapture()},j);this.voiceStartupErrorCleanup=()=>{window.removeEventListener("unhandledrejection",G),window.removeEventListener("error",Z),clearTimeout(V),this.voiceStartupErrorCleanup=null}}clearVoiceStartupErrorCapture(){this.voiceStartupErrorCleanup?.()}setVoiceState($,j){if(!this.voiceButton||!this.voiceStatus)return;let O=j.length>tI?`${j.slice(0,tI-1)}…`:j,G=$==="error"?j:O;if(this.voiceStatus.textContent=G,this.voiceStatus.title=j,this.voiceButton.disabled=$==="loading"||$==="unsupported",this.voiceButton.textContent=$==="listening"?"Stop":"Voice",this.voiceButton.setAttribute("aria-pressed",$==="listening"?"true":"false"),this.voiceButton.title=$==="error"?j:$==="listening"?"Stop voice input":"Start voice input",$==="listening"){if(this.voiceButton.style.background="#7c1d1d",this.voiceButton.style.borderColor="rgba(255, 120, 120, 0.5)",this.voiceControls)this.voiceControls.style.background="rgba(45, 10, 10, 0.78)"}else if($==="error"){if(this.voiceButton.style.background="#3d2a12",this.voiceButton.style.borderColor="rgba(255, 187, 92, 0.55)",this.voiceControls)this.voiceControls.style.background="rgba(46, 29, 8, 0.82)"}else if(this.voiceButton.style.background="#12202b",this.voiceButton.style.borderColor="rgba(255, 255, 255, 0.18)",this.voiceControls)this.voiceControls.style.background="rgba(9, 14, 19, 0.78)"}focusTerminalInput(){if(FV())this.focusMobileInput();else this.terminal.focus()}keybarButtonHeight=44;setupMobileKeybar(){let $=document.createElement("div");$.className="mobile-keybar";let j=document.createElement("div");j.className="keybar-panel keybar-keys",j.innerHTML=` @@ -38,7 +8711,7 @@ For tests, pass a Ghostty instance directly: - `;let V=document.createElement("div");V.className="keybar-panel keybar-settings-panel",V.style.display="none",V.innerHTML=` + `;let O=document.createElement("div");O.className="keybar-panel keybar-settings-panel",O.style.display="none",O.innerHTML=` Bar @@ -46,7 +8719,7 @@ For tests, pass a Ghostty instance directly: Font - `,j.appendChild($),j.appendChild(V);let Z=document.createElement("style");Z.textContent=` + `,$.appendChild(j),$.appendChild(O);let G=document.createElement("style");G.textContent=` .mobile-keybar { flex-shrink: 0; background: rgba(40, 40, 40, 0.95); @@ -89,4 +8762,4 @@ For tests, pass a Ghostty instance directly: font-family: system-ui, sans-serif; padding: 0 4px; } - `,document.head.appendChild(Z),this.mobileKeybarStyle=Z,document.body.appendChild(j),this.mobileKeybar=j;let J=(K)=>{$.style.display=K==="keys"?"":"none",V.style.display=K==="settings"?"":"none"};$.querySelector(".keybar-settings").addEventListener("touchstart",(K)=>{K.preventDefault(),J("settings")}),V.querySelector(".keybar-back").addEventListener("touchstart",(K)=>{K.preventDefault(),J("keys")});let X=(K)=>{this.keybarButtonHeight=Math.max(28,Math.min(72,this.keybarButtonHeight+K)),j.querySelectorAll("button").forEach((z)=>{z.style.height=`${this.keybarButtonHeight}px`}),this.fit()};V.querySelector(".keybar-bar-shrink").addEventListener("touchstart",(K)=>{K.preventDefault(),X(-4)}),V.querySelector(".keybar-bar-grow").addEventListener("touchstart",(K)=>{K.preventDefault(),X(4)}),V.querySelector(".keybar-font-shrink").addEventListener("touchstart",(K)=>{K.preventDefault(),this.fontSize=Math.max(8,this.fontSize-1),this.terminal.options.fontSize=this.fontSize,this.fit()}),V.querySelector(".keybar-font-grow").addEventListener("touchstart",(K)=>{K.preventDefault(),this.fontSize=Math.max(8,this.fontSize+1),this.terminal.options.fontSize=this.fontSize,this.fit()}),$.querySelectorAll("button[data-key]").forEach((K)=>{K.addEventListener("touchstart",(z)=>{z.preventDefault();let O=K.dataset.key||"";O=O.replace(/\\x([0-9a-fA-F]{2})/g,(Y,T)=>String.fromCharCode(parseInt(T,16))),O=O.replace(/\\x1b/g,"\x1B");let W=this.shiftActive,R=this.ctrlActive,U=this.altActive,H=this.fnActive,L=W||this.pendingShift;if(W&&O==="\t")O="\x1B[Z";else if(R&&W&&O.startsWith("\x1B[")&&O.length===3)O=`\x1B[1;6${O[2]}`;else if(W&&O.startsWith("\x1B[")&&O.length===3)O=`\x1B[1;2${O[2]}`;else if(R&&O.startsWith("\x1B[")&&O.length===3)O=`\x1B[1;5${O[2]}`;if(H&&O.length===1){let Y=E(O,L);if(Y)O=Y}if(O.length===1)O=s(O,W,R,U,H);else if(U)O=f(O);this.sendStdin(O),this.deactivateModifiers()})}),$.querySelectorAll("button[data-modifier]").forEach((K)=>{K.addEventListener("touchstart",(z)=>{z.preventDefault();let O=K.dataset.modifier;if(O==="ctrl")this.ctrlActive=!this.ctrlActive,this.pendingCtrl=this.ctrlActive,K.classList.toggle("active",this.ctrlActive);else if(O==="alt")this.altActive=!this.altActive,this.pendingAlt=this.altActive,K.classList.toggle("active",this.altActive);else if(O==="shift")this.shiftActive=!this.shiftActive,this.pendingShift=this.shiftActive,K.classList.toggle("active",this.shiftActive);else if(O==="fn")this.fnActive=!this.fnActive,this.pendingFn=this.fnActive,K.classList.toggle("active",this.fnActive);this.focusMobileInput()})})}deactivateModifiers(){this.ctrlActive=!1,this.altActive=!1,this.shiftActive=!1,this.fnActive=!1,this.pendingCtrl=!1,this.pendingAlt=!1,this.pendingShift=!1,this.pendingFn=!1,this.mobileKeybar?.querySelectorAll("button[data-modifier]").forEach((j)=>{j.classList.remove("active")})}focusMobileInput(){this.mobileInput?.focus()}async waitForFonts(){if(!("fonts"in document))return;try{await document.fonts.ready}catch{}}fit(){let $=this.terminal.renderer,V,Z;if($?.getMetrics){let L=$.getMetrics();if(L&&L.width>0&&L.height>0)V=L.width,Z=L.height;else{let Y=this.measureCellSize();if(!Y){this.fitAddon.fit();return}V=Y.width,Z=Y.height}}else{let L=this.measureCellSize();if(!L){this.fitAddon.fit();return}V=L.width,Z=L.height}let J=window.getComputedStyle(this.element),X=parseInt(J.paddingTop)||0,K=parseInt(J.paddingBottom)||0,z=parseInt(J.paddingLeft)||0,O=parseInt(J.paddingRight)||0,W=this.element.clientWidth-z-O,R=this.element.clientHeight-X-K;if(W<=0||R<=0)return;let U=Math.max(2,Math.floor(W/V)),H=Math.max(1,Math.floor(R/Z));if(U!==this.terminal.cols||H!==this.terminal.rows)this.terminal.resize(U,H)}measureCellSize(){let j=document.createElement("span");j.style.visibility="hidden",j.style.position="absolute",j.style.fontFamily=this.fontFamily,j.style.fontSize=`${this.fontSize}px`,j.style.lineHeight="normal",j.textContent="W",document.body.appendChild(j);let{offsetWidth:$,offsetHeight:V}=j;if(document.body.removeChild(j),$>0&&V>0)return{width:$,height:V};return null}setupResizeObserver(){this.resizeObserver=new ResizeObserver(()=>{if(this.resizeDebounceTimer)clearTimeout(this.resizeDebounceTimer);this.resizeDebounceTimer=window.setTimeout(()=>{this.fit()},100)}),this.resizeObserver.observe(this.element)}resizeDebounceTimer;isValidSize(j,$){return j>=2&&j<=500&&$>=1&&$<=500}connect(){if(this.socket?.readyState===WebSocket.OPEN)return;let j=++this.socketGeneration;this.socket=new WebSocket(this.wsUrl),this.socket.binaryType="arraybuffer",this.socket.addEventListener("open",()=>{if(j!==this.socketGeneration)return;if(this.reconnectAttempts=0,!this.isTabHidden)this.startHeartbeatWatchdog();this.element.classList.add("-connected"),this.element.classList.remove("-disconnected"),this.flushStdin(),this.processMessageQueue();let $=this.terminal.cols,V=this.terminal.rows;if(this.isValidSize($,V))this.lastValidSize={cols:$,rows:V},this.send(["resize",{width:$,height:V}]);this.terminal.focus()}),this.socket.addEventListener("close",()=>{if(j!==this.socketGeneration)return;this.stopHeartbeatWatchdog(),this.element.classList.remove("-connected"),this.element.classList.add("-disconnected"),this.scheduleReconnect()}),this.socket.addEventListener("error",()=>{}),this.socket.addEventListener("message",($)=>{if(j!==this.socketGeneration)return;this.handleMessage($.data)})}handleTextMessage(j){try{let $=JSON.parse(j),[V,Z]=$;switch(V){case"stdout":if(this.isTabHidden)this.bufferWhileHidden(Z);else this.terminal.write(Z);break;case"pong":this.lastPongAt=Date.now();break;default:console.debug("Unknown message type:",V)}}catch{if(this.isTabHidden)this.bufferWhileHidden(j);else this.terminal.write(j)}}handleMessage(j){if(this.lastMessageAt=Date.now(),j instanceof ArrayBuffer){let $=new Uint8Array(j);if(this.isTabHidden)this.bufferWhileHidden($);else this.terminal.write($);return}if(j instanceof Blob){j.text().then(($)=>{this.lastMessageAt=Date.now(),this.handleTextMessage($)}).catch(()=>{});return}this.handleTextMessage(j)}startHeartbeatWatchdog(){this.stopHeartbeatWatchdog();let j=Date.now();this.lastMessageAt=j,this.lastPongAt=j,this.heartbeatTimer=window.setInterval(()=>{if(this.socket?.readyState!==WebSocket.OPEN)return;let $=Date.now(),V=Math.max(this.lastMessageAt,this.lastPongAt);if($-V>this.stallTimeoutMs){console.warn("WebSocket inbound stream stalled; reconnecting"),this.socket.close();return}this.send(["ping",String($)])},this.heartbeatIntervalMs)}stopHeartbeatWatchdog(){if(this.heartbeatTimer)clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0}startResourceCleanup(){this.cleanupTimer=window.setInterval(()=>{this.trimMessageQueue()},W0)}stopResourceCleanup(){if(this.cleanupTimer)clearInterval(this.cleanupTimer),this.cleanupTimer=void 0}trimMessageQueue(){if(this.messageQueue.length>k){let j=this.messageQueue.length-k;this.messageQueue=this.messageQueue.slice(-k),console.warn(`[webterm] Trimmed ${j} stale messages from queue`)}}bufferWhileHidden(j){let $=typeof j==="string"?c.sharedTextEncoder.encode(j):j;while(this.hiddenBufferBytes+$.byteLength>k0&&this.hiddenBuffer.length>0){let V=this.hiddenBuffer.shift();this.hiddenBufferBytes-=V.byteLength}this.hiddenBuffer.push($),this.hiddenBufferBytes+=$.byteLength}refreshConnection(){if(this.hiddenBuffer.length=0,this.hiddenBufferBytes=0,this.reconnectAttempts=0,this.stopHeartbeatWatchdog(),this.socket)this.socket.close(),this.socket=null;this.connect()}sendStdin(j){if(!j)return;if(this.pendingStdin+=j,this.pendingStdin.length>=w0){this.flushStdin();return}if(this.pendingStdinTimer)return;this.pendingStdinTimer=window.setTimeout(()=>{this.pendingStdinTimer=void 0,this.flushStdin()},p0)}flushStdin(){if(this.pendingStdinTimer)clearTimeout(this.pendingStdinTimer),this.pendingStdinTimer=void 0;if(!this.pendingStdin)return;let j=this.pendingStdin;this.pendingStdin="",this.send(["stdin",j])}send(j){if(j[0]!=="stdin"&&this.pendingStdin)this.flushStdin();if(this.messageQueue.length>=k)this.messageQueue=this.messageQueue.slice(-Math.floor(k/2)),console.warn("[webterm] Message queue overflow; trimmed old messages");this.messageQueue.push(j),this.processMessageQueue()}processMessageQueue(){if(this.socket?.readyState!==WebSocket.OPEN)return;while(this.messageQueue.length>0){let j=this.messageQueue.shift();try{if(j)this.socket.send(JSON.stringify(j))}catch($){if(console.error("Failed to send message:",$,j),j)this.messageQueue.unshift(j);break}}}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){console.error("Max reconnection attempts reached");return}this.reconnectAttempts++;let j=this.reconnectDelay*Math.pow(2,this.reconnectAttempts-1);setTimeout(()=>{console.log(`[webterm] Reconnecting (attempt ${this.reconnectAttempts})...`),this.connect()},j)}dispose(){if(this.stopResourceCleanup(),this.stopHeartbeatWatchdog(),this.pendingStdinTimer)clearTimeout(this.pendingStdinTimer),this.pendingStdinTimer=void 0;if(this.pendingStdin="",this.resizeDebounceTimer)clearTimeout(this.resizeDebounceTimer),this.resizeDebounceTimer=void 0;this.socket?.close(),this.socket=null,this.messageQueue.length=0,this.hiddenBuffer.length=0,this.hiddenBufferBytes=0;for(let{target:j,type:$,handler:V,options:Z}of this.boundHandlers)j.removeEventListener($,V,Z);if(this.boundHandlers.length=0,this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null;if(this.mobileInput)this.mobileInput.remove(),this.mobileInput=null;if(this.mobileKeybar)this.mobileKeybar.remove(),this.mobileKeybar=null;if(this.mobileKeybarStyle)this.mobileKeybarStyle.remove(),this.mobileKeybarStyle=null;this.fitAddon.dispose(),this.terminal.dispose()}setTheme(j){this.terminal.options.theme=j}static getTheme(j){return D[j.toLowerCase()]}}var i=new Map;setInterval(()=>{for(let[j,$]of i)if(!j.isConnected)$.dispose(),i.delete(j),console.log("[webterm] Cleaned up stale terminal instance")},W0);async function O0(){let j=document.querySelectorAll(".webterm-terminal");for(let $ of j){let V=$.dataset.sessionWebsocketUrl;if(!V){console.error("[webterm] Missing data-session-websocket-url on terminal container");continue}let Z=c0($);try{let J=await c.create($,V,Z);i.set($,J)}catch(J){console.error("[webterm] Failed to create terminal:",J)}}}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>O0());else O0();export{i as instances,O0 as initTerminals,c as WebTerminal,D as THEMES}; + `,document.head.appendChild(G),this.mobileKeybarStyle=G,document.body.appendChild($),this.mobileKeybar=$;let Z=(N)=>{j.style.display=N==="keys"?"":"none",O.style.display=N==="settings"?"":"none"};j.querySelector(".keybar-settings").addEventListener("touchstart",(N)=>{N.preventDefault(),Z("settings")}),O.querySelector(".keybar-back").addEventListener("touchstart",(N)=>{N.preventDefault(),Z("keys")});let V=(N)=>{this.keybarButtonHeight=Math.max(28,Math.min(72,this.keybarButtonHeight+N)),$.querySelectorAll("button").forEach((J)=>{J.style.height=`${this.keybarButtonHeight}px`}),this.fit()};O.querySelector(".keybar-bar-shrink").addEventListener("touchstart",(N)=>{N.preventDefault(),V(-4)}),O.querySelector(".keybar-bar-grow").addEventListener("touchstart",(N)=>{N.preventDefault(),V(4)}),O.querySelector(".keybar-font-shrink").addEventListener("touchstart",(N)=>{N.preventDefault(),this.fontSize=Math.max(8,this.fontSize-1),this.terminal.options.fontSize=this.fontSize,this.fit()}),O.querySelector(".keybar-font-grow").addEventListener("touchstart",(N)=>{N.preventDefault(),this.fontSize=Math.max(8,this.fontSize+1),this.terminal.options.fontSize=this.fontSize,this.fit()}),j.querySelectorAll("button[data-key]").forEach((N)=>{N.addEventListener("touchstart",(J)=>{J.preventDefault();let R=N.dataset.key||"";R=R.replace(/\\x([0-9a-fA-F]{2})/g,(X,D)=>String.fromCharCode(parseInt(D,16))),R=R.replace(/\\x1b/g,"\x1B");let U=this.shiftActive,H=this.ctrlActive,L=this.altActive,Y=this.fnActive,S=U||this.pendingShift;if(U&&R==="\t")R="\x1B[Z";else if(H&&U&&R.startsWith("\x1B[")&&R.length===3)R=`\x1B[1;6${R[2]}`;else if(U&&R.startsWith("\x1B[")&&R.length===3)R=`\x1B[1;2${R[2]}`;else if(H&&R.startsWith("\x1B[")&&R.length===3)R=`\x1B[1;5${R[2]}`;if(Y&&R.length===1){let X=fR(R,S);if(X)R=X}if(R.length===1)R=bR(R,U,H,L,Y);else if(L)R=R7(R);this.sendStdin(R),this.deactivateModifiers()})}),j.querySelectorAll("button[data-modifier]").forEach((N)=>{N.addEventListener("touchstart",(J)=>{J.preventDefault();let R=N.dataset.modifier;if(R==="ctrl")this.ctrlActive=!this.ctrlActive,this.pendingCtrl=this.ctrlActive,N.classList.toggle("active",this.ctrlActive);else if(R==="alt")this.altActive=!this.altActive,this.pendingAlt=this.altActive,N.classList.toggle("active",this.altActive);else if(R==="shift")this.shiftActive=!this.shiftActive,this.pendingShift=this.shiftActive,N.classList.toggle("active",this.shiftActive);else if(R==="fn")this.fnActive=!this.fnActive,this.pendingFn=this.fnActive,N.classList.toggle("active",this.fnActive);this.focusMobileInput()})})}deactivateModifiers(){this.ctrlActive=!1,this.altActive=!1,this.shiftActive=!1,this.fnActive=!1,this.pendingCtrl=!1,this.pendingAlt=!1,this.pendingShift=!1,this.pendingFn=!1,this.mobileKeybar?.querySelectorAll("button[data-modifier]").forEach(($)=>{$.classList.remove("active")})}focusMobileInput(){this.mobileInput?.focus()}async waitForFonts(){if(!("fonts"in document))return;try{await document.fonts.ready}catch{}}fit(){let j=this.terminal.renderer,O,G;if(j?.getMetrics){let S=j.getMetrics();if(S&&S.width>0&&S.height>0)O=S.width,G=S.height;else{let X=this.measureCellSize();if(!X){this.fitAddon.fit();return}O=X.width,G=X.height}}else{let S=this.measureCellSize();if(!S){this.fitAddon.fit();return}O=S.width,G=S.height}let Z=window.getComputedStyle(this.element),V=parseInt(Z.paddingTop)||0,N=parseInt(Z.paddingBottom)||0,J=parseInt(Z.paddingLeft)||0,R=parseInt(Z.paddingRight)||0,U=this.element.clientWidth-J-R,H=this.element.clientHeight-V-N;if(U<=0||H<=0)return;let L=Math.max(2,Math.floor(U/O)),Y=Math.max(1,Math.floor(H/G));if(L!==this.terminal.cols||Y!==this.terminal.rows)this.terminal.resize(L,Y)}measureCellSize(){let $=document.createElement("span");$.style.visibility="hidden",$.style.position="absolute",$.style.fontFamily=this.fontFamily,$.style.fontSize=`${this.fontSize}px`,$.style.lineHeight="normal",$.textContent="W",document.body.appendChild($);let{offsetWidth:j,offsetHeight:O}=$;if(document.body.removeChild($),j>0&&O>0)return{width:j,height:O};return null}setupResizeObserver(){this.resizeObserver=new ResizeObserver(()=>{if(this.resizeDebounceTimer)clearTimeout(this.resizeDebounceTimer);this.resizeDebounceTimer=window.setTimeout(()=>{this.fit()},100)}),this.resizeObserver.observe(this.element)}resizeDebounceTimer;isValidSize($,j){return $>=2&&$<=500&&j>=1&&j<=500}connect(){if(this.socket?.readyState===WebSocket.OPEN)return;let $=++this.socketGeneration;this.socket=new WebSocket(this.wsUrl),this.socket.binaryType="arraybuffer",this.socket.addEventListener("open",()=>{if($!==this.socketGeneration)return;if(this.reconnectAttempts=0,!this.isTabHidden)this.startHeartbeatWatchdog();this.element.classList.add("-connected"),this.element.classList.remove("-disconnected"),this.flushStdin(),this.processMessageQueue();let j=this.terminal.cols,O=this.terminal.rows;if(this.isValidSize(j,O))this.lastValidSize={cols:j,rows:O},this.send(["resize",{width:j,height:O}]);this.terminal.focus()}),this.socket.addEventListener("close",()=>{if($!==this.socketGeneration)return;this.stopHeartbeatWatchdog(),this.element.classList.remove("-connected"),this.element.classList.add("-disconnected"),this.scheduleReconnect()}),this.socket.addEventListener("error",()=>{}),this.socket.addEventListener("message",(j)=>{if($!==this.socketGeneration)return;this.handleMessage(j.data)})}handleTextMessage($){try{let j=JSON.parse($),[O,G]=j;switch(O){case"stdout":if(this.isTabHidden)this.bufferWhileHidden(G);else this.terminal.write(G);break;case"pong":this.lastPongAt=Date.now();break;default:console.debug("Unknown message type:",O)}}catch{if(this.isTabHidden)this.bufferWhileHidden($);else this.terminal.write($)}}handleMessage($){if(this.lastMessageAt=Date.now(),$ instanceof ArrayBuffer){let j=new Uint8Array($);if(this.isTabHidden)this.bufferWhileHidden(j);else this.terminal.write(j);return}if($ instanceof Blob){$.text().then((j)=>{this.lastMessageAt=Date.now(),this.handleTextMessage(j)}).catch(()=>{});return}this.handleTextMessage($)}startHeartbeatWatchdog(){this.stopHeartbeatWatchdog();let $=Date.now();this.lastMessageAt=$,this.lastPongAt=$,this.heartbeatTimer=window.setInterval(()=>{if(this.socket?.readyState!==WebSocket.OPEN)return;let j=Date.now(),O=Math.max(this.lastMessageAt,this.lastPongAt);if(j-O>this.stallTimeoutMs){console.warn("WebSocket inbound stream stalled; reconnecting"),this.socket.close();return}this.send(["ping",String(j)])},this.heartbeatIntervalMs)}stopHeartbeatWatchdog(){if(this.heartbeatTimer)clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0}startResourceCleanup(){this.cleanupTimer=window.setInterval(()=>{this.trimMessageQueue()},$D)}stopResourceCleanup(){if(this.cleanupTimer)clearInterval(this.cleanupTimer),this.cleanupTimer=void 0}trimMessageQueue(){if(this.messageQueue.length>dZ){let $=this.messageQueue.length-dZ;this.messageQueue=this.messageQueue.slice(-dZ),console.warn(`[webterm] Trimmed ${$} stale messages from queue`)}}bufferWhileHidden($){let j=typeof $==="string"?zV.sharedTextEncoder.encode($):$;while(this.hiddenBufferBytes+j.byteLength>kK&&this.hiddenBuffer.length>0){let O=this.hiddenBuffer.shift();this.hiddenBufferBytes-=O.byteLength}this.hiddenBuffer.push(j),this.hiddenBufferBytes+=j.byteLength}refreshConnection(){if(this.hiddenBuffer.length=0,this.hiddenBufferBytes=0,this.reconnectAttempts=0,this.stopHeartbeatWatchdog(),this.socket)this.socket.close(),this.socket=null;this.connect()}sendStdin($){if(!$)return;if(this.pendingStdin+=$,this.pendingStdin.length>=DK){this.flushStdin();return}if(this.pendingStdinTimer)return;this.pendingStdinTimer=window.setTimeout(()=>{this.pendingStdinTimer=void 0,this.flushStdin()},IK)}flushStdin(){if(this.pendingStdinTimer)clearTimeout(this.pendingStdinTimer),this.pendingStdinTimer=void 0;if(!this.pendingStdin)return;let $=this.pendingStdin;this.pendingStdin="",this.send(["stdin",$])}send($){if($[0]!=="stdin"&&this.pendingStdin)this.flushStdin();if(this.messageQueue.length>=dZ)this.messageQueue=this.messageQueue.slice(-Math.floor(dZ/2)),console.warn("[webterm] Message queue overflow; trimmed old messages");this.messageQueue.push($),this.processMessageQueue()}processMessageQueue(){if(this.socket?.readyState!==WebSocket.OPEN)return;while(this.messageQueue.length>0){let $=this.messageQueue.shift();try{if($)this.socket.send(JSON.stringify($))}catch(j){if(console.error("Failed to send message:",j,$),$)this.messageQueue.unshift($);break}}}scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts){console.error("Max reconnection attempts reached");return}this.reconnectAttempts++;let $=this.reconnectDelay*Math.pow(2,this.reconnectAttempts-1);setTimeout(()=>{console.log(`[webterm] Reconnecting (attempt ${this.reconnectAttempts})...`),this.connect()},$)}dispose(){if(this.stopVoiceInput(),this.stopResourceCleanup(),this.stopHeartbeatWatchdog(),this.pendingStdinTimer)clearTimeout(this.pendingStdinTimer),this.pendingStdinTimer=void 0;if(this.pendingStdin="",this.resizeDebounceTimer)clearTimeout(this.resizeDebounceTimer),this.resizeDebounceTimer=void 0;this.socket?.close(),this.socket=null,this.messageQueue.length=0,this.hiddenBuffer.length=0,this.hiddenBufferBytes=0;for(let{target:$,type:j,handler:O,options:G}of this.boundHandlers)$.removeEventListener(j,O,G);if(this.boundHandlers.length=0,this.resizeObserver)this.resizeObserver.disconnect(),this.resizeObserver=null;if(this.mobileInput)this.mobileInput.remove(),this.mobileInput=null;if(this.mobileKeybar)this.mobileKeybar.remove(),this.mobileKeybar=null;if(this.mobileKeybarStyle)this.mobileKeybarStyle.remove(),this.mobileKeybarStyle=null;if(this.voiceControls)this.voiceControls.remove(),this.voiceControls=null;this.voiceButton=null,this.voiceStatus=null,this.voiceTranscriber=null,this.fitAddon.dispose(),this.terminal.dispose()}setTheme($){this.terminal.options.theme=$}static getTheme($){return yV[$.toLowerCase()]}}var wR=new Map;setInterval(()=>{for(let[$,j]of wR)if(!$.isConnected)j.dispose(),wR.delete($),console.log("[webterm] Cleaned up stale terminal instance")},$D);async function eI(){let $=document.querySelectorAll(".webterm-terminal");for(let j of $){let O=j.dataset.sessionWebsocketUrl;if(!O){console.error("[webterm] Missing data-session-websocket-url on terminal container");continue}let G=MK(j);try{let Z=await zV.create(j,O,G);wR.set(j,Z)}catch(Z){console.error("[webterm] Failed to create terminal:",Z)}}}if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>eI());else eI();export{wR as instances,eI as initTerminals,zV as WebTerminal,yV as THEMES}; diff --git a/webterm/static/js/terminal.ts b/webterm/static/js/terminal.ts index b26c52c..607136f 100644 --- a/webterm/static/js/terminal.ts +++ b/webterm/static/js/terminal.ts @@ -7,6 +7,7 @@ */ import { Terminal, FitAddon, Ghostty, type ITerminalOptions, type ITheme } from "ghostty-web"; +import * as Moonshine from "@moonshine-ai/moonshine-js"; /** Maximum queued messages before oldest are dropped */ const MAX_MESSAGE_QUEUE_SIZE = 1000; @@ -21,6 +22,8 @@ const STDIN_BATCH_DELAY_MS = 10; const STDIN_BATCH_MAX_CHARS = 8192; const BELL_EMOJI = "🔔"; +const DEFAULT_MOONSHINE_MODEL_URL = "model/medium-streaming-en"; +const VOICE_STATUS_MAX_LENGTH = 48; /** Shared Ghostty WASM instance (loaded once, reused across all terminals) */ let sharedGhostty: Ghostty | null = null; @@ -697,6 +700,13 @@ class WebTerminal { private baseTitle: string; private bellActive = false; private routeKey: string; + private voiceControls: HTMLElement | null = null; + private voiceButton: HTMLButtonElement | null = null; + private voiceStatus: HTMLElement | null = null; + private voiceTranscriber: Moonshine.MicrophoneTranscriber | null = null; + private voiceModelURL = DEFAULT_MOONSHINE_MODEL_URL; + private isVoiceStarting = false; + private voiceStartupErrorCleanup: (() => void) | null = null; private static sharedTextEncoder = new TextEncoder(); private constructor( @@ -873,6 +883,7 @@ class WebTerminal { // Setup mobile keyboard support this.setupMobileKeyboard(); this.setupTouchSelection(); + this.setupVoiceInput(); // Setup mobile extended keybar (only on mobile devices) if (isMobileDevice()) { @@ -1338,6 +1349,304 @@ class WebTerminal { ); } + private setupVoiceInput(): void { + this.voiceModelURL = + this.element.dataset.moonshineModelUrl?.trim() || DEFAULT_MOONSHINE_MODEL_URL; + + if (window.getComputedStyle(this.element).position === "static") { + this.element.style.position = "relative"; + } + + const controls = document.createElement("div"); + controls.className = "webterm-voice-controls"; + controls.innerHTML = ` + + Ready + `; + this.element.appendChild(controls); + this.voiceControls = controls; + this.voiceButton = controls.querySelector(".webterm-voice-button"); + this.voiceStatus = controls.querySelector(".webterm-voice-status"); + + if (!this.voiceButton || !this.voiceStatus) { + return; + } + + Object.assign(controls.style, { + position: "absolute", + top: "12px", + right: "12px", + zIndex: "4", + display: "flex", + alignItems: "center", + gap: "8px", + padding: "8px 10px", + borderRadius: "999px", + background: "rgba(9, 14, 19, 0.78)", + backdropFilter: "blur(8px)", + boxShadow: "0 8px 30px rgba(0, 0, 0, 0.28)", + pointerEvents: "auto", + } satisfies Partial); + + Object.assign(this.voiceButton.style, { + border: "1px solid rgba(255, 255, 255, 0.18)", + borderRadius: "999px", + background: "#12202b", + color: "#f3f6fa", + font: '600 12px "Fira Code", "FiraCode Nerd Font", monospace', + padding: "7px 12px", + cursor: "pointer", + } satisfies Partial); + + Object.assign(this.voiceStatus.style, { + color: "#c9d5e0", + font: '500 11px "Fira Code", "FiraCode Nerd Font", monospace', + whiteSpace: "normal", + lineHeight: "1.35", + maxWidth: "44ch", + overflowWrap: "anywhere", + } satisfies Partial); + + this.voiceButton.addEventListener("click", () => { + void this.toggleVoiceInput(); + }); + if ( + typeof navigator === "undefined" || + !navigator.mediaDevices?.getUserMedia || + typeof AudioContext === "undefined" + ) { + this.setVoiceState("unsupported", "Voice unavailable"); + return; + } + + this.setVoiceState("idle", "Ready"); + } + + private async toggleVoiceInput(): Promise { + if (this.isVoiceStarting) { + return; + } + if (this.voiceTranscriber?.isActive) { + this.stopVoiceInput(); + return; + } + + this.isVoiceStarting = true; + this.armVoiceStartupErrorCapture(); + this.setVoiceState("loading", "Starting..."); + + try { + const transcriber = this.getVoiceTranscriber(); + await transcriber.start(); + this.setVoiceState("listening", "Listening..."); + this.focusTerminalInput(); + } catch (error) { + console.error("[webterm] Failed to start Moonshine microphone transcriber:", error); + this.setVoiceState("error", this.describeVoiceError(error)); + } finally { + this.isVoiceStarting = false; + } + } + + private getVoiceTranscriber(): Moonshine.MicrophoneTranscriber { + if (this.voiceTranscriber) { + return this.voiceTranscriber; + } + + this.voiceTranscriber = new Moonshine.MicrophoneTranscriber( + this.voiceModelURL, + { + onPermissionsRequested: () => { + this.setVoiceState("loading", "Allow microphone..."); + }, + onModelLoadStarted: () => { + this.setVoiceState("loading", "Loading model..."); + }, + onModelLoaded: () => { + this.setVoiceState("loading", "Model ready"); + }, + onTranscribeStarted: () => { + this.setVoiceState("listening", "Listening..."); + }, + onTranscribeStopped: () => { + this.setVoiceState("idle", "Ready"); + }, + onTranscriptionUpdated: (text: string) => { + const preview = text.trim(); + this.setVoiceState("listening", preview ? `Heard: ${preview}` : "Listening..."); + }, + onTranscriptionCommitted: (text: string) => { + const transcript = text.trim(); + if (!transcript) { + return; + } + this.sendStdin(transcript); + this.setVoiceState("listening", `Sent: ${transcript}`); + this.focusTerminalInput(); + }, + onError: (error: unknown) => { + console.error("[webterm] Moonshine error:", error); + const message = this.describeVoiceError(error); + this.setVoiceState( + "error", + message === "PlatformUnsupported" + ? "PlatformUnsupported. Waiting for underlying browser error..." + : message + ); + }, + }, + false + ); + + return this.voiceTranscriber; + } + + private stopVoiceInput(): void { + this.clearVoiceStartupErrorCapture(); + if (!this.voiceTranscriber) { + this.setVoiceState("idle", "Ready"); + return; + } + this.voiceTranscriber.stop(); + this.stopVoiceTracks(); + this.setVoiceState("idle", "Ready"); + this.focusTerminalInput(); + } + + private stopVoiceTracks(): void { + const maybeStream = this.voiceTranscriber as unknown as { mediaStream?: MediaStream }; + maybeStream.mediaStream?.getTracks().forEach((track) => { + track.stop(); + }); + } + + private describeVoiceError(error: unknown): string { + if (typeof error === "string" && error.trim()) { + return error.trim(); + } + if (error instanceof Error && error.message.trim()) { + const cause = + "cause" in error && error.cause + ? ` Cause: ${this.describeVoiceError(error.cause)}` + : ""; + return `${error.name}: ${error.message.trim()}${cause}`; + } + if (typeof error === "object" && error !== null) { + try { + return JSON.stringify(error); + } catch { + return String(error); + } + } + return "Voice error"; + } + + private armVoiceStartupErrorCapture(): void { + this.clearVoiceStartupErrorCapture(); + + const startedAt = Date.now(); + const captureWindowMs = 15_000; + + const handleFailure = (error: unknown): void => { + if (Date.now() - startedAt > captureWindowMs) { + return; + } + const message = this.describeVoiceError(error); + if ( + !message || + message === "PlatformUnsupported" || + message === "Voice error" + ) { + return; + } + console.error("[webterm] Captured Moonshine startup failure:", error); + this.setVoiceState("error", message); + }; + + const rejectionHandler = (event: PromiseRejectionEvent) => { + handleFailure(event.reason); + }; + const errorHandler = (event: ErrorEvent) => { + handleFailure(event.error ?? event.message); + }; + + window.addEventListener("unhandledrejection", rejectionHandler); + window.addEventListener("error", errorHandler); + + const timeoutId = window.setTimeout(() => { + this.clearVoiceStartupErrorCapture(); + }, captureWindowMs); + + this.voiceStartupErrorCleanup = () => { + window.removeEventListener("unhandledrejection", rejectionHandler); + window.removeEventListener("error", errorHandler); + clearTimeout(timeoutId); + this.voiceStartupErrorCleanup = null; + }; + } + + private clearVoiceStartupErrorCapture(): void { + this.voiceStartupErrorCleanup?.(); + } + + private setVoiceState( + state: "idle" | "loading" | "listening" | "error" | "unsupported", + message: string + ): void { + if (!this.voiceButton || !this.voiceStatus) { + return; + } + + const clippedMessage = + message.length > VOICE_STATUS_MAX_LENGTH + ? `${message.slice(0, VOICE_STATUS_MAX_LENGTH - 1)}…` + : message; + + const displayMessage = state === "error" ? message : clippedMessage; + + this.voiceStatus.textContent = displayMessage; + this.voiceStatus.title = message; + this.voiceButton.disabled = state === "loading" || state === "unsupported"; + this.voiceButton.textContent = state === "listening" ? "Stop" : "Voice"; + this.voiceButton.setAttribute("aria-pressed", state === "listening" ? "true" : "false"); + this.voiceButton.title = + state === "error" + ? message + : state === "listening" + ? "Stop voice input" + : "Start voice input"; + + if (state === "listening") { + this.voiceButton.style.background = "#7c1d1d"; + this.voiceButton.style.borderColor = "rgba(255, 120, 120, 0.5)"; + if (this.voiceControls) { + this.voiceControls.style.background = "rgba(45, 10, 10, 0.78)"; + } + } else if (state === "error") { + this.voiceButton.style.background = "#3d2a12"; + this.voiceButton.style.borderColor = "rgba(255, 187, 92, 0.55)"; + if (this.voiceControls) { + this.voiceControls.style.background = "rgba(46, 29, 8, 0.82)"; + } + } else { + this.voiceButton.style.background = "#12202b"; + this.voiceButton.style.borderColor = "rgba(255, 255, 255, 0.18)"; + if (this.voiceControls) { + this.voiceControls.style.background = "rgba(9, 14, 19, 0.78)"; + } + } + } + + private focusTerminalInput(): void { + if (isMobileDevice()) { + this.focusMobileInput(); + } else { + this.terminal.focus(); + } + } + private keybarButtonHeight = 44; /** Setup bottom-docked mobile extended keyboard bar */ @@ -1971,6 +2280,7 @@ class WebTerminal { /** Clean up resources */ dispose(): void { + this.stopVoiceInput(); this.stopResourceCleanup(); this.stopHeartbeatWatchdog(); if (this.pendingStdinTimer) { @@ -2009,6 +2319,13 @@ class WebTerminal { this.mobileKeybarStyle.remove(); this.mobileKeybarStyle = null; } + if (this.voiceControls) { + this.voiceControls.remove(); + this.voiceControls = null; + } + this.voiceButton = null; + this.voiceStatus = null; + this.voiceTranscriber = null; this.fitAddon.dispose(); this.terminal.dispose(); }