@cartanova/qgrid-cli 2.4.3 → 2.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/application/qgrid/qgrid.frame.js +13 -17
- package/bundle/dist/application/qgrid/token-subscriber.js +23 -9
- package/bundle/dist/application/qgrid/token-trigger-setup.js +4 -4
- package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +5 -3
- package/bundle/dist/application/sonamu.generated.sso.js +3 -2
- package/bundle/dist/application/token/token.model.js +8 -3
- package/bundle/dist/application/token/token.types.js +8 -3
- package/bundle/dist/i18n/sd.generated.js +2 -1
- package/bundle/dist/index.js +3 -6
- package/bundle/dist/migrations/20260521134025_alter_request_log_steps_alter1.js +3 -9
- package/bundle/dist/migrations/20260706120000_alter_request_logs_add_image_cost.js +1 -1
- package/bundle/dist/migrations/20260710090000_alter_tokens_add_weight.js +41 -0
- package/bundle/dist/server-bootstrap.js +17 -0
- package/bundle/dist/sonamu.config.js +1 -10
- package/bundle/dist/startup-migrations.js +21 -0
- package/bundle/dist/testing/global.js +93 -5
- package/bundle/dist/testing/test-database-name.js +22 -0
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +24 -27
- package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +43 -0
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +53 -40
- package/bundle/src/application/qgrid/qgrid.frame.test.ts +36 -14
- package/bundle/src/application/qgrid/qgrid.frame.ts +22 -25
- package/bundle/src/application/qgrid/token-subscriber.test.ts +102 -0
- package/bundle/src/application/qgrid/token-subscriber.ts +37 -6
- package/bundle/src/application/qgrid/token-trigger-setup.test.ts +9 -0
- package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -2
- package/bundle/src/application/qgrid/token-weight-migration.test.ts +42 -0
- package/bundle/src/application/qgrid/tool-emulation.ts +6 -1
- package/bundle/src/application/sonamu.generated.http +4 -2
- package/bundle/src/application/sonamu.generated.sso.ts +1 -0
- package/bundle/src/application/sonamu.generated.ts +10 -1
- package/bundle/src/application/token/token.entity.json +17 -1
- package/bundle/src/application/token/token.model.test.ts +43 -0
- package/bundle/src/application/token/token.model.ts +18 -2
- package/bundle/src/application/token/token.types.test.ts +11 -0
- package/bundle/src/application/token/token.types.ts +3 -0
- package/bundle/src/i18n/sd.generated.ts +1 -0
- package/bundle/src/index.ts +2 -5
- package/bundle/src/migrations/20260521134025_alter_request_log_steps_alter1.ts +4 -8
- package/bundle/src/migrations/20260706120000_alter_request_logs_add_image_cost.ts +1 -1
- package/bundle/src/migrations/20260710090000_alter_tokens_add_weight.ts +38 -0
- package/bundle/src/server-bootstrap.test.ts +39 -0
- package/bundle/src/server-bootstrap.ts +21 -0
- package/bundle/src/sonamu.config.ts +0 -12
- package/bundle/src/startup-migrations.test.ts +25 -0
- package/bundle/src/startup-migrations.ts +20 -0
- package/bundle/src/testing/global.test.ts +130 -0
- package/bundle/src/testing/global.ts +143 -13
- package/bundle/src/testing/test-database-name.test.ts +38 -0
- package/bundle/src/testing/test-database-name.ts +21 -0
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +75 -45
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +23 -29
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +1 -1
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.test.ts +73 -0
- package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +48 -0
- package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +109 -6
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +72 -55
- package/bundle/web-dist/client/assets/{index-DsGDBrrH.js → index-D1ExP77_.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-C6EMtwDn.js → logs-vuI-Zgnq.js} +1 -1
- package/bundle/web-dist/client/assets/routes-0Fki0JEi.js +5 -0
- package/bundle/web-dist/client/assets/{sd.generated-BrUnRt0B.js → sd.generated-WA5SGJYZ.js} +1 -1
- package/bundle/web-dist/client/assets/{services.generated-AsEvHbJ7.js → services.generated-DzZLnb7S.js} +1 -1
- package/bundle/web-dist/client/assets/{show-BSW3PE7Z.js → show-BreAgaFH.js} +1 -1
- package/bundle/web-dist/client/assets/tokens-4VgHQtXd.js +1 -0
- package/bundle/web-dist/client/assets/use-update-token-mutation-BV6msjuy.js +1 -0
- package/bundle/web-dist/client/index.html +2 -2
- package/bundle/web-dist/server/assets/{lazyRouteComponent-BswulcOx.js → lazyRouteComponent-BrPAFtBA.js} +1 -1
- package/bundle/web-dist/server/assets/{logs-Bk9C0ELo.js → logs-CKM6W3W6.js} +3 -3
- package/bundle/web-dist/server/assets/{routes-D9OiKoqa.js → routes-DhIpPgXz.js} +130 -7
- package/bundle/web-dist/server/assets/{sd.generated-DRuQSIKo.js → sd.generated-Cwg2f53z.js} +1 -0
- package/bundle/web-dist/server/assets/{services.generated-Dp0uKgpV.js → services.generated-CsotZP44.js} +5 -5
- package/bundle/web-dist/server/assets/{show-3GokIDEJ.js → show-CV2UFjaH.js} +3 -3
- package/bundle/web-dist/server/assets/{tokens-Cjw6cQxZ.js → tokens-DfGj1y2v.js} +5 -5
- package/bundle/web-dist/server/assets/use-update-token-mutation-BL96w-Pg.js +7 -0
- package/bundle/web-dist/server/entry-server.generated.js +7 -7
- package/package.json +1 -1
- package/skills/qgrid/SKILL.md +1 -1
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +2 -2
- package/skills/qgrid/references/cli-env-and-server-boot.md +9 -9
- package/skills/qgrid/references/decision-rationale.md +23 -0
- package/skills/qgrid/references/openai-codex-runtime.md +4 -3
- package/skills/qgrid/references/prompt-cache-and-usage.md +2 -0
- package/skills/qgrid/references/provider-runtime-differences.md +2 -1
- package/skills/qgrid/references/repo-map.md +2 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +8 -3
- package/skills/qgrid/references/verification-and-debugging.md +3 -0
- package/bundle/web-dist/client/assets/routes-De9iuL80.js +0 -5
- package/bundle/web-dist/client/assets/tokens-BMsL6vk9.js +0 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import "./_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { QgridDispatcher } from "./application/qgrid/qgrid.dispatcher.js";
|
|
3
|
-
import { TokenModel } from "./application/token/token.model.js";
|
|
4
3
|
import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
|
|
5
4
|
import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
|
|
6
5
|
import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
|
|
@@ -144,14 +143,6 @@ var sonamu_config_default = defineConfig({
|
|
|
144
143
|
lifecycle: {
|
|
145
144
|
onStart: async () => {
|
|
146
145
|
const log = getLogger(["qgrid", "startup"]);
|
|
147
|
-
try {
|
|
148
|
-
const knex = TokenModel.getDB("w");
|
|
149
|
-
const migrationsDir = path.join(import.meta.dirname, "../src/migrations");
|
|
150
|
-
const [batch, migrations] = await knex.migrate.latest({ directory: migrationsDir });
|
|
151
|
-
if (migrations.length > 0) log.info(`migration: ${migrations.length} applied (batch ${batch})`);
|
|
152
|
-
} catch (e) {
|
|
153
|
-
log.warn(`migration skipped: ${e.message}`);
|
|
154
|
-
}
|
|
155
146
|
let triggerReady = true;
|
|
156
147
|
try {
|
|
157
148
|
await ensureTokensTrigger(connConfig);
|
|
@@ -204,4 +195,4 @@ var sonamu_config_default = defineConfig({
|
|
|
204
195
|
//#endregion
|
|
205
196
|
export { sonamu_config_default as default };
|
|
206
197
|
|
|
207
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuXG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IEFudGhyb3BpY0Rpc3BhdGNoZXIgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBPcGVuQUlEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuXG5kb3RlbnYuY29uZmlnKHsgcGF0aDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi4vLmVudlwiKSB9KTtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlFHUklEX0RCX0hPU1QgPz8gXCJsb2NhbGhvc3RcIixcbiAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlFHUklEX0RCX1BPUlQgPz8gNTQzMiksXG4gIHVzZXI6IHByb2Nlc3MuZW52LlFHUklEX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuUUdSSURfREJfUEFTU1dPUkQgPz8gXCJwb3N0Z3Jlc1wiLFxuICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSA/PyBcInFncmlkXCIsXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICBwcm9qZWN0TmFtZTogcHJvY2Vzcy5lbnYuUFJPSkVDVF9OQU1FID8/IFwiUWdyaWRcIixcbiAgZGF0YWJhc2U6IHtcbiAgICBuYW1lOiBcInFncmlkXCIsXG4gICAgZGVmYXVsdE9wdGlvbnM6IHtcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAga2VlcEFsaXZlOiB0cnVlLFxuICAgICAgICBrZWVwQWxpdmVJbml0aWFsRGVsYXlNaWxsaXM6IDEwMDAwLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVudmlyb25tZW50czoge1xuICAgICAgZml4dHVyZToge1xuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0ZXN0OiB7XG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICAuLi5jb25uQ29uZmlnLFxuICAgICAgICAgIGRhdGFiYXNlOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9OQU1FLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBhcGk6IHtcbiAgICBkaXI6IFwiYXBpXCIsXG4gICAgdGltZXpvbmU6IFwiQXNpYS9TZW91bFwiLFxuICAgIHJvdXRlOiB7XG4gICAgICBwcmVmaXg6IFwiL2FwaVwiLFxuICAgIH0sXG4gIH0sXG4gIGkxOG46IHtcbiAgICBkZWZhdWx0TG9jYWxlOiBcImtvXCIsXG4gICAgc3VwcG9ydGVkTG9jYWxlczogW1wia29cIiwgXCJlblwiXSxcbiAgfSxcbiAgc3luYzoge1xuICAgIHRhcmdldHM6IFtcIndlYlwiXSxcbiAgfSxcbiAgdGVzdDoge1xuICAgIHBhcmFsbGVsOiB0cnVlLFxuICAgIG1heFdvcmtlcnM6IDQsXG4gICAgZGV2UnVubmVyOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgfSxcbiAgbG9nZ2luZzoge1xuICAgIHNpbmtzOiB7XG4gICAgICBjb25zb2xlOiBnZXRDb25zb2xlU2luayh7XG4gICAgICAgIGZvcm1hdHRlcjogZ2V0UHJldHR5Rm9ybWF0dGVyKHtcbiAgICAgICAgICB0aW1lc3RhbXA6IFwidGltZVwiLFxuICAgICAgICAgIGNhdGVnb3J5V2lkdGg6IDIwLFxuICAgICAgICAgIGNhdGVnb3J5VHJ1bmNhdGU6IFwibWlkZGxlXCIsXG4gICAgICAgIH0pLFxuICAgICAgfSksXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiXSwgbG93ZXN0TGV2ZWw6IFwiaW5mb1wiIH0sXG4gICAgICAvLyBzb25hbXUg66Gc6re464qUIHdhcm5pbmcg7J207IOB66eMXG4gICAgICB7IGNhdGVnb3J5OiBbXCJzb25hbXVcIl0sIHNpbmtzOiBbXCJjb25zb2xlXCJdLCBsb3dlc3RMZXZlbDogXCJ3YXJuaW5nXCIgfSxcbiAgICAgIC8vIGZhc3RpZnkg66Gc6re4IOywqOuLqFxuICAgICAgeyBjYXRlZ29yeTogW1wiZmFzdGlmeVwiXSwgc2lua3M6IFtdLCBsb3dlc3RMZXZlbDogXCJmYXRhbFwiIH0sXG4gICAgXSxcbiAgfSxcbiAgc2VydmVyOiB7XG4gICAgbGlzdGVuOiB7IHBvcnQsIGhvc3QgfSxcbiAgICBmYXN0aWZ5OiB7XG4gICAgICBib2R5TGltaXQ6IDEwICogMTAyNCAqIDEwMjQsXG4gICAgfSxcbiAgICBwbHVnaW5zOiB7XG4gICAgICBmb3JtYm9keTogdHJ1ZSxcbiAgICAgIHFzOiB0cnVlLFxuICAgICAgc3NlOiB0cnVlLFxuICAgICAgbXVsdGlwYXJ0OiB7IGxpbWl0czogeyBmaWxlU2l6ZTogMTAyNCAqIDEwMjQgKiAzMCB9IH0sXG4gICAgICBzdGF0aWM6IHtcbiAgICAgICAgcm9vdDogcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLy4uL1wiLCBcInB1YmxpY1wiKSxcbiAgICAgICAgcHJlZml4OiBcIi9hcGkvcHVibGljXCIsXG4gICAgICB9LFxuICAgICAgY3VzdG9tOiAoc2VydmVyKSA9PiB7XG4gICAgICAgIC8vIE9BdXRoIOy9nOuwsSDigJQgQW50aHJvcGlj7J20IC9jYWxsYmFja+ycvOuhnCDrpqzri6TsnbTroIntirhcbiAgICAgICAgc2VydmVyLmdldChcIi9jYWxsYmFja1wiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGNvZGUsIHN0YXRlIH0gPSByZXF1ZXN0LnF1ZXJ5IGFzIHsgY29kZT86IHN0cmluZzsgc3RhdGU/OiBzdHJpbmcgfTtcbiAgICAgICAgICBpZiAoIWNvZGUgfHwgIXN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1taXNzaW5nX3BhcmFtc1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBRZ3JpZEZyYW1lLmhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZSwgc3RhdGUsIHJlcGx5KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXG4gICAgICAgICAgICAgIGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBPcGVuQUkgT0F1dGgg64qUIGNvZGV4IGFwcC1zZXJ2ZXIg6rCAIOyekOyytCBjYWxsYmFjayDshJzrsoTrpbwg7Jis66a8XG4gICAgICAgIC8vIGhhbmRsZU9wZW5BSUNhbGxiYWNrIOu2iO2VhOyalCDigJQgb2F1dGhDb21wbGV0ZU9wZW5BSSBBUEkg66GcIOyZhOujjCDtmZXsnbhcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcGlDb25maWc6IHtcbiAgICAgIGNvbnRleHRQcm92aWRlcjogKGRlZmF1bHRDb250ZXh0LCByZXF1ZXN0KSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbnRleHQsXG4gICAgICAgICAgaXA6IHJlcXVlc3QuaXAsXG4gICAgICAgICAgYm9keTogcmVxdWVzdC5ib2R5LFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIGd1YXJkSGFuZGxlcjogKCkgPT4ge30sXG4gICAgICBjYWNoZUNvbnRyb2xIYW5kbGVyOiAocmVxKSA9PiB7XG4gICAgICAgIHN3aXRjaCAocmVxLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiYXNzZXRzXCI6XG4gICAgICAgICAgICAvLyBIYXNoIO2PrO2VqOuQnCDtjIzsnbw6IOyYgeq1rCDsupDsi5xcbiAgICAgICAgICAgIGlmIChyZXEucGF0aC5tYXRjaCgvLVthLWYwLTldK1xcLi8pKSB7XG4gICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuaW1tdXRhYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5sb25nTGl2ZWQ7XG5cbiAgICAgICAgICBjYXNlIFwiYXBpXCI6XG4gICAgICAgICAgICAvLyBHRVQg7JqU7LKt66eMIOy6kOyLsSDqs6DroKRcbiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSBcIkdFVFwiKSB7XG4gICAgICAgICAgICAgIC8vIO2KueyglSDqsr3roZzripQg7Ken7J2AIOy6kOyLnFxuICAgICAgICAgICAgICBpZiAocmVxLnBhdGguc3RhcnRzV2l0aChcIi9hcGkvc3RhdGljLWRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3Rlcm1zXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5tZWRpdW1MaXZlZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g6riw67O4OiDsupDsi5wg7JeG7J2MXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG5cbiAgICAgICAgICBjYXNlIFwic3NyXCI6XG4gICAgICAgICAgICAvLyBTU1Ig7Y6Y7J207KeAOiAxMOy0iCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc3NyO1xuXG4gICAgICAgICAgY2FzZSBcImNzclwiOlxuICAgICAgICAgICAgLy8gQ1NSIGZhbGxiYWNrIChpbmRleC5odG1sKTogMeu2hCDsupDsi5xcbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMuc2hvcnRMaXZlZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLm5vQ2FjaGU7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FjaGU6IHtcbiAgICAgIGRlZmF1bHQ6IFwibWFpblwiLFxuICAgICAgc3RvcmVzOiB7XG4gICAgICAgIG1haW46IHN0b3JlKCkudXNlTDFMYXllcihjYWNoZURyaXZlcnMubWVtb3J5KHsgbWF4U2l6ZTogXCI1MG1iXCIgfSkpLFxuICAgICAgfSxcbiAgICAgIHR0bDogXCI1bVwiLFxuICAgICAgcHJlZml4OiBcIlwiLFxuICAgIH0sXG4gICAgbGlmZWN5Y2xlOiB7XG4gICAgICBvblN0YXJ0OiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qga25leCA9IFRva2VuTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgICAgICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKTtcbiAgICAgICAgICBjb25zdCBbYmF0Y2gsIG1pZ3JhdGlvbnNdID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7IGRpcmVjdG9yeTogbWlncmF0aW9uc0RpciB9KTtcbiAgICAgICAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2cuaW5mbyhgbWlncmF0aW9uOiAke21pZ3JhdGlvbnMubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cud2FybihgbWlncmF0aW9uIHNraXBwZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYW50aHJvcGljRGlzcGF0Y2hlciA9IG5ldyBBbnRocm9waWNEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgYW50aHJvcGljRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyID0gYW50aHJvcGljRGlzcGF0Y2hlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbnRocm9waWNDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVJlYWR5ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpVG90YWwgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpUmVhZHl9LyR7b3BlbmFpVG90YWx9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImdyYWNlZnVsIHNodXRkb3duXCIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlcnJvciwgX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGdldExvZ2dlcihbXCJxZ3JpZFwiXSkuZXJyb3IoYCR7ZXJyb3J9YCk7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg1MDApLnNlbmQoe1xuICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBaUJBLE9BQU8sT0FBTyxFQUFFLE1BQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxTQUFTLFVBQVUsRUFBRSxDQUFDO0FBRWxFLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxNQUFNO0FBRTlDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxpQkFBaUI7Q0FDbkMsTUFBTSxPQUFPLFFBQVEsSUFBSSxpQkFBaUIsS0FBSztDQUMvQyxN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
|
|
198
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENhY2hlUHJlc2V0cywgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInNvbmFtdVwiO1xuaW1wb3J0IHsgZHJpdmVycyBhcyBjYWNoZURyaXZlcnMsIHN0b3JlIH0gZnJvbSBcInNvbmFtdS9jYWNoZVwiO1xuXG5pbXBvcnQgeyBRZ3JpZERpc3BhdGNoZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBRZ3JpZEZyYW1lIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIjtcbmltcG9ydCB7IFRva2VuU3Vic2NyaWJlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXN1YnNjcmliZXJcIjtcbmltcG9ydCB7IGVuc3VyZVRva2Vuc1RyaWdnZXIgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi10cmlnZ2VyLXNldHVwXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuZG90ZW52LmNvbmZpZyh7IHBhdGg6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi4uLy5lbnZcIikgfSk7XG5cbmNvbnN0IGhvc3QgPSBwcm9jZXNzLmVudi5IT1NUID8/IFwibG9jYWxob3N0XCI7XG5jb25zdCBwb3J0ID0gTnVtYmVyKHByb2Nlc3MuZW52LlBPUlQgPz8gNDQ5MDApO1xuXG5jb25zdCBjb25uQ29uZmlnID0ge1xuICBob3N0OiBwcm9jZXNzLmVudi5RR1JJRF9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5RR1JJRF9EQl9QT1JUID8/IDU0MzIpLFxuICB1c2VyOiBwcm9jZXNzLmVudi5RR1JJRF9EQl9VU0VSID8/IFwicG9zdGdyZXNcIixcbiAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlFHUklEX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlFHUklEX0RCX05BTUUgPz8gXCJxZ3JpZFwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lQ29uZmlnKHtcbiAgcHJvamVjdE5hbWU6IHByb2Nlc3MuZW52LlBST0pFQ1RfTkFNRSA/PyBcIlFncmlkXCIsXG4gIGRhdGFiYXNlOiB7XG4gICAgbmFtZTogXCJxZ3JpZFwiLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlbnZpcm9ubWVudHM6IHtcbiAgICAgIGZpeHR1cmU6IHtcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgICAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlFHUklEX0RCX05BTUUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGVzdDoge1xuICAgICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgICAgLi4uY29ubkNvbmZpZyxcbiAgICAgICAgICBkYXRhYmFzZTogcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgbG9nZ2VyczogW1xuICAgICAgLy8gcWdyaWQg66Gc6re4ICjsmpTssq0g67aE67CwLCBvYXV0aC91c2FnZSBBUEkpXG4gICAgICB7IGNhdGVnb3J5OiBbXCJxZ3JpZFwiXSwgc2lua3M6IFtcImNvbnNvbGVcIl0sIGxvd2VzdExldmVsOiBcImluZm9cIiB9LFxuICAgICAgLy8gc29uYW11IOuhnOq3uOuKlCB3YXJuaW5nIOydtOyDgeunjFxuICAgICAgeyBjYXRlZ29yeTogW1wic29uYW11XCJdLCBzaW5rczogW1wiY29uc29sZVwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICAvLyBPQXV0aCDsvZzrsLEg4oCUIEFudGhyb3BpY+ydtCAvY2FsbGJhY2vsnLzroZwg66as64uk7J2066CJ7Yq4XG4gICAgICAgIHNlcnZlci5nZXQoXCIvY2FsbGJhY2tcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFxuICAgICAgICAgICAgICBgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gT3BlbkFJIE9BdXRoIOuKlCBjb2RleCBhcHAtc2VydmVyIOqwgCDsnpDssrQgY2FsbGJhY2sg7ISc67KE66W8IOyYrOumvFxuICAgICAgICAvLyBoYW5kbGVPcGVuQUlDYWxsYmFjayDrtojtlYTsmpQg4oCUIG9hdXRoQ29tcGxldGVPcGVuQUkgQVBJIOuhnCDsmYTro4wg7ZmV7J24XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICBsZXQgdHJpZ2dlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVUb2tlbnNUcmlnZ2VyKGNvbm5Db25maWcpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlclJlYWR5ID0gZmFsc2U7XG4gICAgICAgICAgbG9nLndhcm4oYHRyaWdnZXIgc2V0dXAgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBUb2tlblN1YnNjcmliZXIoY29ubkNvbmZpZywgUWdyaWREaXNwYXRjaGVyKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBhd2FpdCBzdWJzY3JpYmVyLnN0YXJ0KCk7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvcGVuYWlEaXNwYXRjaGVyID0gbmV3IE9wZW5BSURpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBvcGVuYWlEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIgPSBvcGVuYWlEaXNwYXRjaGVyO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLndhcm4oYG9wZW5haSBkaXNwYXRjaGVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYW50aHJvcGljRGlzcGF0Y2hlciA9IG5ldyBBbnRocm9waWNEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgYW50aHJvcGljRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyID0gYW50aHJvcGljRGlzcGF0Y2hlcjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbnRocm9waWNDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG4gICAgICAgIGNvbnN0IG9wZW5haVJlYWR5ID0gUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXI/LnJlYWR5V29ya2VyQ291bnQgPz8gMDtcbiAgICAgICAgY29uc3Qgb3BlbmFpVG90YWwgPSBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8ud29ya2VyQ291bnQgPz8gMDtcblxuICAgICAgICBsb2cuaW5mbyhgbGlzdGVuaW5nIG9uIGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgbG9nLmluZm8oYGFudGhyb3BpYzogJHthbnRocm9waWNDb3VudH0gdG9rZW5zIHJlYWR5YCk7XG4gICAgICAgIGxvZy5pbmZvKGBvcGVuYWk6ICR7b3BlbmFpUmVhZHl9LyR7b3BlbmFpVG90YWx9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhcbiAgICAgICAgICBgc3Vic2NyaWJlcjogJHtzdGFydGVkID8gXCJMSVNURU4gYWN0aXZlXCIgOiBcImRlZ3JhZGVkXCJ9JHt0cmlnZ2VyUmVhZHkgPyBcIlwiIDogXCIsIHRyaWdnZXIgZmFpbGVkXCJ9YCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBvblNodXRkb3duOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxvZyA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInN0YXJ0dXBcIl0pO1xuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5zdWJzY3JpYmVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuaW5mbyhcImdyYWNlZnVsIHNodXRkb3duXCIpO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChlcnJvciwgX3JlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGdldExvZ2dlcihbXCJxZ3JpZFwiXSkuZXJyb3IoYCR7ZXJyb3J9YCk7XG4gICAgICAgIHJlcGx5LnN0YXR1cyg1MDApLnNlbmQoe1xuICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsT0FBTyxPQUFPLEVBQUUsTUFBTSxLQUFLLEtBQUssT0FBTyxLQUFLLFNBQVMsVUFBVSxFQUFFLENBQUM7QUFFbEUsTUFBTSxPQUFPLFFBQVEsSUFBSSxRQUFRO0FBQ2pDLE1BQU0sT0FBTyxPQUFPLFFBQVEsSUFBSSxRQUFRLE1BQU07QUFFOUMsTUFBTSxhQUFhO0NBQ2pCLE1BQU0sUUFBUSxJQUFJLGlCQUFpQjtDQUNuQyxNQUFNLE9BQU8sUUFBUSxJQUFJLGlCQUFpQixLQUFLO0NBQy9DLE1BQU0sUUFBUSxJQUFJLGlCQUFpQjtDQUNuQyxVQUFVLFFBQVEsSUFBSSxxQkFBcUI7Q0FDM0MsVUFBVSxRQUFRLElBQUksaUJBQWlCO0NBQ3hDO0FBRUQsSUFBQSx3QkFBZSxhQUFhO0NBQzFCLGFBQWEsUUFBUSxJQUFJLGdCQUFnQjtDQUN6QyxVQUFVO0VBQ1IsTUFBTTtFQUNOLGdCQUFnQixFQUNkLFlBQVk7R0FDVixHQUFHO0dBQ0gsV0FBVztHQUNYLDZCQUE2QjtHQUM5QixFQUNGO0VBQ0QsY0FBYztHQUNaLFNBQVMsRUFDUCxZQUFZO0lBQ1YsR0FBRztJQUNILFVBQVUsUUFBUSxJQUFJO0lBQ3ZCLEVBQ0Y7R0FDRCxNQUFNLEVBQ0osWUFBWTtJQUNWLEdBQUc7SUFDSCxVQUFVLFFBQVEsSUFBSTtJQUN2QixFQUNGO0dBQ0Y7RUFDRjtDQUNELEtBQUs7RUFDSCxLQUFLO0VBQ0wsVUFBVTtFQUNWLE9BQU8sRUFDTCxRQUFRLFFBQ1Q7RUFDRjtDQUNELE1BQU07RUFDSixlQUFlO0VBQ2Ysa0JBQWtCLENBQUMsTUFBTSxLQUFLO0VBQy9CO0NBQ0QsTUFBTSxFQUNKLFNBQVMsQ0FBQyxNQUFNLEVBQ2pCO0NBQ0QsTUFBTTtFQUNKLFVBQVU7RUFDVixZQUFZO0VBQ1osV0FBVyxFQUFFLFNBQVMsTUFBTTtFQUM3QjtDQUNELFNBQVM7RUFDUCxPQUFPLEVBQ0wsU0FBUyxlQUFlLEVBQ3RCLFdBQVcsbUJBQW1CO0dBQzVCLFdBQVc7R0FDWCxlQUFlO0dBQ2Ysa0JBQWtCO0dBQ25CLENBQUMsRUFDSCxDQUFDLEVBQ0g7RUFDRCxTQUFTO0dBRVA7SUFBRSxVQUFVLENBQUMsUUFBUTtJQUFFLE9BQU8sQ0FBQyxVQUFVO0lBQUUsYUFBYTtJQUFRO0dBRWhFO0lBQUUsVUFBVSxDQUFDLFNBQVM7SUFBRSxPQUFPLENBQUMsVUFBVTtJQUFFLGFBQWE7SUFBVztHQUVwRTtJQUFFLFVBQVUsQ0FBQyxVQUFVO0lBQUUsT0FBTyxFQUFFO0lBQUUsYUFBYTtJQUFTO0dBQzNEO0VBQ0Y7Q0FDRCxRQUFRO0VBQ04sUUFBUTtHQUFFO0dBQU07R0FBTTtFQUN0QixTQUFTLEVBQ1AsV0FBVyxLQUFLLE9BQU8sTUFDeEI7RUFDRCxTQUFTO0dBQ1AsVUFBVTtHQUNWLElBQUk7R0FDSixLQUFLO0dBQ0wsV0FBVyxFQUFFLFFBQVEsRUFBRSxVQUFVLE9BQU8sT0FBTyxJQUFJLEVBQUU7R0FDckQsUUFBUTtJQUNOLE1BQU0sS0FBSyxLQUFLLE9BQU8sS0FBSyxTQUFTLFFBQVEsU0FBUztJQUN0RCxRQUFRO0lBQ1Q7R0FDRCxTQUFTLFdBQVc7QUFFbEIsV0FBTyxJQUFJLGFBQWEsT0FBTyxTQUFTLFVBQVU7S0FDaEQsTUFBTSxFQUFFLE1BQU0sVUFBVSxRQUFRO0FBQ2hDLFNBQUksQ0FBQyxRQUFRLENBQUMsTUFDWixRQUFPLE1BQU0sU0FBUyxzQ0FBc0M7QUFFOUQsU0FBSTtBQUNGLGFBQU8sV0FBVyxvQkFBb0IsTUFBTSxPQUFPLE1BQU07Y0FDbEQsR0FBRztBQUNWLGFBQU8sTUFBTSxTQUNYLHdCQUF3QixtQkFBb0IsRUFBWSxRQUFRLEdBQ2pFOztNQUVIOztHQUtMO0VBQ0QsV0FBVztHQUNULGtCQUFrQixnQkFBZ0IsWUFBWTtBQUM1QyxXQUFPO0tBQ0wsR0FBRztLQUNILElBQUksUUFBUTtLQUNaLE1BQU0sUUFBUTtLQUNmOztHQUVILG9CQUFvQjtHQUNwQixzQkFBc0IsUUFBUTtBQUM1QixZQUFRLElBQUksTUFBWjtLQUNFLEtBQUs7QUFFSCxVQUFJLElBQUksS0FBSyxNQUFNLGVBQWUsQ0FDaEMsUUFBTyxhQUFhO0FBRXRCLGFBQU8sYUFBYTtLQUV0QixLQUFLO0FBRUgsVUFBSSxJQUFJLFdBQVcsT0FBTztBQUV4QixXQUFJLElBQUksS0FBSyxXQUFXLG1CQUFtQixDQUN6QyxRQUFPLGFBQWE7QUFFdEIsV0FBSSxJQUFJLEtBQUssV0FBVyxhQUFhLENBQ25DLFFBQU8sYUFBYTs7QUFJeEIsYUFBTyxhQUFhO0tBRXRCLEtBQUssTUFFSCxRQUFPLGFBQWE7S0FFdEIsS0FBSyxNQUVILFFBQU8sYUFBYTs7QUFFeEIsV0FBTyxhQUFhOztHQUV2QjtFQUNELE9BQU87R0FDTCxTQUFTO0dBQ1QsUUFBUSxFQUNOLE1BQU0sT0FBTyxDQUFDLFdBQVdBLFFBQWEsT0FBTyxFQUFFLFNBQVMsUUFBUSxDQUFDLENBQUMsRUFDbkU7R0FDRCxLQUFLO0dBQ0wsUUFBUTtHQUNUO0VBQ0QsV0FBVztHQUNULFNBQVMsWUFBWTtJQUNuQixNQUFNLE1BQU0sVUFBVSxDQUFDLFNBQVMsVUFBVSxDQUFDO0lBRTNDLElBQUksZUFBZTtBQUNuQixRQUFJO0FBQ0YsV0FBTSxvQkFBb0IsV0FBVzthQUM5QixHQUFHO0FBQ1Ysb0JBQWU7QUFDZixTQUFJLEtBQUsseUJBQTBCLEVBQVksVUFBVTs7SUFHM0QsTUFBTSxhQUFhLElBQUksZ0JBQWdCLFlBQVksZ0JBQWdCO0FBQ25FLG9CQUFnQixhQUFhO0lBRTdCLE1BQU0sVUFBVSxNQUFNLFdBQVcsT0FBTztBQUV4QyxRQUFJO0tBQ0YsTUFBTSxtQkFBbUIsSUFBSSxrQkFBa0I7QUFDL0MsV0FBTSxpQkFBaUIsT0FBTztBQUM5QixxQkFBZ0IsbUJBQW1CO2FBQzVCLEdBQUc7QUFDVixTQUFJLEtBQUssNkJBQThCLEVBQVksVUFBVTs7QUFHL0QsUUFBSTtLQUNGLE1BQU0sc0JBQXNCLElBQUkscUJBQXFCO0FBQ3JELFdBQU0sb0JBQW9CLE9BQU87QUFDakMscUJBQWdCLHNCQUFzQjthQUMvQixHQUFHO0FBQ1YsU0FBSSxLQUFLLGdDQUFpQyxFQUFZLFVBQVU7O0lBR2xFLE1BQU0saUJBQWlCLGdCQUFnQixxQkFBcUIsY0FBYztJQUMxRSxNQUFNLGNBQWMsZ0JBQWdCLGtCQUFrQixvQkFBb0I7SUFDMUUsTUFBTSxjQUFjLGdCQUFnQixrQkFBa0IsZUFBZTtBQUVyRSxRQUFJLEtBQUssdUJBQXVCLEtBQUssR0FBRyxPQUFPO0FBQy9DLFFBQUksS0FBSyxjQUFjLGVBQWUsZUFBZTtBQUNyRCxRQUFJLEtBQUssV0FBVyxZQUFZLEdBQUcsWUFBWSxlQUFlO0FBQzlELFFBQUksS0FDRixlQUFlLFVBQVUsa0JBQWtCLGFBQWEsZUFBZSxLQUFLLHFCQUM3RTs7R0FFSCxZQUFZLFlBQVk7SUFDdEIsTUFBTSxNQUFNLFVBQVUsQ0FBQyxTQUFTLFVBQVUsQ0FBQztBQUMzQyxRQUFJLGdCQUFnQixpQkFDbEIsT0FBTSxnQkFBZ0IsaUJBQWlCLE1BQU07QUFFL0MsUUFBSSxnQkFBZ0Isb0JBQ2xCLE9BQU0sZ0JBQWdCLG9CQUFvQixNQUFNO0FBRWxELFFBQUksZ0JBQWdCLFdBQ2xCLE9BQU0sZ0JBQWdCLFdBQVcsTUFBTTtBQUV6QyxRQUFJLEtBQUssb0JBQW9COztHQUUvQixVQUFVLE9BQU8sVUFBVSxVQUFVO0FBQ25DLGNBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEdBQUcsUUFBUTtBQUN0QyxVQUFNLE9BQU8sSUFBSSxDQUFDLEtBQUs7S0FDckIsTUFBTSxNQUFNO0tBQ1osU0FBUyxNQUFNO0tBQ2hCLENBQUM7O0dBRUw7RUFDRjtDQUNGLENBQUMifQ==
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import "./_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { TokenModel } from "./application/token/token.model.js";
|
|
3
|
+
import { getLogger } from "@logtape/logtape";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
//#region src/startup-migrations.ts
|
|
6
|
+
async function runRequiredMigrations() {
|
|
7
|
+
const log = getLogger(["qgrid", "startup"]);
|
|
8
|
+
try {
|
|
9
|
+
const knex = TokenModel.getDB("w");
|
|
10
|
+
const migrationsDir = path.join(import.meta.dirname, "../src/migrations");
|
|
11
|
+
const [batch, migrations] = await knex.migrate.latest({ directory: migrationsDir });
|
|
12
|
+
if (migrations.length > 0) log.info(`migration: ${migrations.length} applied (batch ${batch})`);
|
|
13
|
+
} catch (error) {
|
|
14
|
+
log.error(`migration failed: ${error.message}`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { runRequiredMigrations };
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnR1cC1taWdyYXRpb25zLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFydHVwLW1pZ3JhdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blJlcXVpcmVkTWlncmF0aW9ucygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbG9nID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwic3RhcnR1cFwiXSk7XG4gIHRyeSB7XG4gICAgY29uc3Qga25leCA9IFRva2VuTW9kZWwuZ2V0REIoXCJ3XCIpO1xuICAgIGNvbnN0IG1pZ3JhdGlvbnNEaXIgPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLi9zcmMvbWlncmF0aW9uc1wiKTtcbiAgICBjb25zdCBbYmF0Y2gsIG1pZ3JhdGlvbnNdID0gYXdhaXQga25leC5taWdyYXRlLmxhdGVzdCh7IGRpcmVjdG9yeTogbWlncmF0aW9uc0RpciB9KTtcbiAgICBpZiAobWlncmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBsb2cuaW5mbyhgbWlncmF0aW9uOiAke21pZ3JhdGlvbnMubGVuZ3RofSBhcHBsaWVkIChiYXRjaCAke2JhdGNofSlgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgbG9nLmVycm9yKGBtaWdyYXRpb24gZmFpbGVkOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFNQSxlQUFzQix3QkFBdUM7Q0FDM0QsTUFBTSxNQUFNLFVBQVUsQ0FBQyxTQUFTLFVBQVUsQ0FBQztBQUMzQyxLQUFJO0VBQ0YsTUFBTSxPQUFPLFdBQVcsTUFBTSxJQUFJO0VBQ2xDLE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxPQUFPLEtBQUssU0FBUyxvQkFBb0I7RUFDekUsTUFBTSxDQUFDLE9BQU8sY0FBYyxNQUFNLEtBQUssUUFBUSxPQUFPLEVBQUUsV0FBVyxlQUFlLENBQUM7QUFDbkYsTUFBSSxXQUFXLFNBQVMsRUFDdEIsS0FBSSxLQUFLLGNBQWMsV0FBVyxPQUFPLGtCQUFrQixNQUFNLEdBQUc7VUFFL0QsT0FBTztBQUNkLE1BQUksTUFBTSxxQkFBc0IsTUFBZ0IsVUFBVTtBQUMxRCxVQUFRLEtBQUssRUFBRSJ9
|
|
@@ -1,12 +1,100 @@
|
|
|
1
1
|
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { Client } from "pg";
|
|
2
3
|
import dotenv from "dotenv";
|
|
3
4
|
//#region src/testing/global.ts
|
|
4
5
|
dotenv.config();
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const MAX_WORKERS = 4;
|
|
7
|
+
const TEMPLATE_DB = process.env.QGRID_TEST_DB_NAME ?? "qgrid_test";
|
|
8
|
+
function quoteIdentifier(value) {
|
|
9
|
+
if (!/^[A-Za-z0-9_]+$/.test(value)) throw new Error(`invalid database identifier: ${value}`);
|
|
10
|
+
return `"${value}"`;
|
|
11
|
+
}
|
|
12
|
+
function workerDatabaseNames(templateDb, maxWorkers) {
|
|
13
|
+
return Array.from({ length: maxWorkers }, (_, index) => `${templateDb}_${index + 1}`);
|
|
14
|
+
}
|
|
15
|
+
async function terminateConnections(client, database) {
|
|
16
|
+
await client.query(`
|
|
17
|
+
SELECT pg_terminate_backend(pid)
|
|
18
|
+
FROM pg_stat_activity
|
|
19
|
+
WHERE datname = $1
|
|
20
|
+
AND pid <> pg_backend_pid()
|
|
21
|
+
`, [database]);
|
|
22
|
+
}
|
|
23
|
+
async function recreateWorkerDatabases(client, templateDb, runDatabase, maxWorkers) {
|
|
24
|
+
const workers = workerDatabaseNames(runDatabase, maxWorkers);
|
|
25
|
+
for (const database of [...workers, templateDb]) await terminateConnections(client, database);
|
|
26
|
+
for (const database of workers) {
|
|
27
|
+
await client.query(`DROP DATABASE IF EXISTS ${quoteIdentifier(database)}`);
|
|
28
|
+
await client.query(`CREATE DATABASE ${quoteIdentifier(database)} TEMPLATE ${quoteIdentifier(templateDb)} STRATEGY FILE_COPY`);
|
|
29
|
+
}
|
|
30
|
+
return workers;
|
|
31
|
+
}
|
|
32
|
+
async function dropWorkerDatabases(client, templateDb, maxWorkers) {
|
|
33
|
+
const errors = [];
|
|
34
|
+
for (const database of workerDatabaseNames(templateDb, maxWorkers)) {
|
|
35
|
+
await terminateConnections(client, database).catch((error) => {
|
|
36
|
+
errors.push(error);
|
|
37
|
+
});
|
|
38
|
+
await client.query(`DROP DATABASE IF EXISTS ${quoteIdentifier(database)}`).catch((error) => {
|
|
39
|
+
errors.push(error);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (errors.length > 0) throw new AggregateError(errors, "failed to clean one or more test databases", { cause: errors[0] });
|
|
43
|
+
}
|
|
44
|
+
function createAdminClient() {
|
|
45
|
+
return new Client({
|
|
46
|
+
host: process.env.QGRID_DB_HOST ?? "localhost",
|
|
47
|
+
port: Number(process.env.QGRID_DB_PORT ?? 5432),
|
|
48
|
+
user: process.env.QGRID_DB_USER ?? "postgres",
|
|
49
|
+
password: process.env.QGRID_DB_PASSWORD ?? "postgres",
|
|
50
|
+
database: "postgres",
|
|
51
|
+
application_name: "qgrid-vitest-global-setup"
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function resolveMaxWorkers(project) {
|
|
55
|
+
const maxWorkers = project?.config?.maxWorkers;
|
|
56
|
+
return Number.isInteger(maxWorkers) && maxWorkers !== void 0 && maxWorkers > 0 ? maxWorkers : MAX_WORKERS;
|
|
57
|
+
}
|
|
58
|
+
async function provisionWorkerDatabases(createClient, templateDb, runDatabase, maxWorkers) {
|
|
59
|
+
const client = createClient();
|
|
60
|
+
await client.connect();
|
|
61
|
+
try {
|
|
62
|
+
await recreateWorkerDatabases(client, templateDb, runDatabase, maxWorkers);
|
|
63
|
+
} catch (setupError) {
|
|
64
|
+
await client.end().catch(() => {});
|
|
65
|
+
const cleanupClient = createClient();
|
|
66
|
+
let cleanupError;
|
|
67
|
+
try {
|
|
68
|
+
await cleanupClient.connect();
|
|
69
|
+
await dropWorkerDatabases(cleanupClient, runDatabase, maxWorkers);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
cleanupError = error;
|
|
72
|
+
} finally {
|
|
73
|
+
await cleanupClient.end().catch((error) => {
|
|
74
|
+
cleanupError ??= error;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (cleanupError) throw new AggregateError([setupError, cleanupError], "test database setup and cleanup both failed", { cause: setupError });
|
|
78
|
+
throw setupError;
|
|
79
|
+
}
|
|
80
|
+
await client.end();
|
|
81
|
+
}
|
|
82
|
+
async function setup(project) {
|
|
83
|
+
const runDatabase = process.env.QGRID_TEST_RUN_DB;
|
|
84
|
+
if (!runDatabase || process.env.QGRID_DB_NAME !== runDatabase) throw new Error("Vitest test database name was not configured consistently");
|
|
85
|
+
const maxWorkers = resolveMaxWorkers(project);
|
|
86
|
+
await provisionWorkerDatabases(createAdminClient, TEMPLATE_DB, runDatabase, maxWorkers);
|
|
87
|
+
return async () => {
|
|
88
|
+
const teardownClient = createAdminClient();
|
|
89
|
+
await teardownClient.connect();
|
|
90
|
+
try {
|
|
91
|
+
await dropWorkerDatabases(teardownClient, runDatabase, maxWorkers);
|
|
92
|
+
} finally {
|
|
93
|
+
await teardownClient.end();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
8
96
|
}
|
|
9
97
|
//#endregion
|
|
10
|
-
export { setup };
|
|
98
|
+
export { dropWorkerDatabases, provisionWorkerDatabases, recreateWorkerDatabases, resolveMaxWorkers, setup };
|
|
11
99
|
|
|
12
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2dsb2JhbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCB7IENsaWVudCB9IGZyb20gXCJwZ1wiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmNvbnN0IE1BWF9XT1JLRVJTID0gNDtcbmNvbnN0IFRFTVBMQVRFX0RCID0gcHJvY2Vzcy5lbnYuUUdSSURfVEVTVF9EQl9OQU1FID8/IFwicWdyaWRfdGVzdFwiO1xuXG50eXBlIFF1ZXJ5Q2xpZW50ID0gUGljazxDbGllbnQsIFwicXVlcnlcIj47XG50eXBlIEFkbWluQ2xpZW50ID0gUGljazxDbGllbnQsIFwiY29ubmVjdFwiIHwgXCJlbmRcIiB8IFwicXVlcnlcIj47XG50eXBlIEFkbWluQ2xpZW50RmFjdG9yeSA9ICgpID0+IEFkbWluQ2xpZW50O1xudHlwZSBWaXRlc3RQcm9qZWN0ID0geyBjb25maWc/OiB7IG1heFdvcmtlcnM/OiBudW1iZXIgfSB9O1xuXG5mdW5jdGlvbiBxdW90ZUlkZW50aWZpZXIodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghL15bQS1aYS16MC05X10rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgZGF0YWJhc2UgaWRlbnRpZmllcjogJHt2YWx1ZX1gKTtcbiAgfVxuICByZXR1cm4gYFwiJHt2YWx1ZX1cImA7XG59XG5cbmZ1bmN0aW9uIHdvcmtlckRhdGFiYXNlTmFtZXModGVtcGxhdGVEYjogc3RyaW5nLCBtYXhXb3JrZXJzOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBtYXhXb3JrZXJzIH0sIChfLCBpbmRleCkgPT4gYCR7dGVtcGxhdGVEYn1fJHtpbmRleCArIDF9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHRlcm1pbmF0ZUNvbm5lY3Rpb25zKGNsaWVudDogUXVlcnlDbGllbnQsIGRhdGFiYXNlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY2xpZW50LnF1ZXJ5KFxuICAgIGBcbiAgICAgIFNFTEVDVCBwZ190ZXJtaW5hdGVfYmFja2VuZChwaWQpXG4gICAgICBGUk9NIHBnX3N0YXRfYWN0aXZpdHlcbiAgICAgIFdIRVJFIGRhdG5hbWUgPSAkMVxuICAgICAgICBBTkQgcGlkIDw+IHBnX2JhY2tlbmRfcGlkKClcbiAgICBgLFxuICAgIFtkYXRhYmFzZV0sXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNyZWF0ZVdvcmtlckRhdGFiYXNlcyhcbiAgY2xpZW50OiBRdWVyeUNsaWVudCxcbiAgdGVtcGxhdGVEYjogc3RyaW5nLFxuICBydW5EYXRhYmFzZTogc3RyaW5nLFxuICBtYXhXb3JrZXJzOiBudW1iZXIsXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGNvbnN0IHdvcmtlcnMgPSB3b3JrZXJEYXRhYmFzZU5hbWVzKHJ1bkRhdGFiYXNlLCBtYXhXb3JrZXJzKTtcbiAgZm9yIChjb25zdCBkYXRhYmFzZSBvZiBbLi4ud29ya2VycywgdGVtcGxhdGVEYl0pIHtcbiAgICBhd2FpdCB0ZXJtaW5hdGVDb25uZWN0aW9ucyhjbGllbnQsIGRhdGFiYXNlKTtcbiAgfVxuICBmb3IgKGNvbnN0IGRhdGFiYXNlIG9mIHdvcmtlcnMpIHtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoYERST1AgREFUQUJBU0UgSUYgRVhJU1RTICR7cXVvdGVJZGVudGlmaWVyKGRhdGFiYXNlKX1gKTtcbiAgICBhd2FpdCBjbGllbnQucXVlcnkoXG4gICAgICBgQ1JFQVRFIERBVEFCQVNFICR7cXVvdGVJZGVudGlmaWVyKGRhdGFiYXNlKX0gVEVNUExBVEUgJHtxdW90ZUlkZW50aWZpZXIodGVtcGxhdGVEYil9IFNUUkFURUdZIEZJTEVfQ09QWWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gd29ya2Vycztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyb3BXb3JrZXJEYXRhYmFzZXMoXG4gIGNsaWVudDogUXVlcnlDbGllbnQsXG4gIHRlbXBsYXRlRGI6IHN0cmluZyxcbiAgbWF4V29ya2VyczogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gIGZvciAoY29uc3QgZGF0YWJhc2Ugb2Ygd29ya2VyRGF0YWJhc2VOYW1lcyh0ZW1wbGF0ZURiLCBtYXhXb3JrZXJzKSkge1xuICAgIGF3YWl0IHRlcm1pbmF0ZUNvbm5lY3Rpb25zKGNsaWVudCwgZGF0YWJhc2UpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH0pO1xuICAgIGF3YWl0IGNsaWVudC5xdWVyeShgRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgJHtxdW90ZUlkZW50aWZpZXIoZGF0YWJhc2UpfWApLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNsZWFudXBFcnJvciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMsIFwiZmFpbGVkIHRvIGNsZWFuIG9uZSBvciBtb3JlIHRlc3QgZGF0YWJhc2VzXCIsIHtcbiAgICAgIGNhdXNlOiBlcnJvcnNbMF0sXG4gICAgfSk7XG4gICAgdGhyb3cgY2xlYW51cEVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFkbWluQ2xpZW50KCk6IENsaWVudCB7XG4gIHJldHVybiBuZXcgQ2xpZW50KHtcbiAgICBob3N0OiBwcm9jZXNzLmVudi5RR1JJRF9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gICAgcG9ydDogTnVtYmVyKHByb2Nlc3MuZW52LlFHUklEX0RCX1BPUlQgPz8gNTQzMiksXG4gICAgdXNlcjogcHJvY2Vzcy5lbnYuUUdSSURfREJfVVNFUiA/PyBcInBvc3RncmVzXCIsXG4gICAgcGFzc3dvcmQ6IHByb2Nlc3MuZW52LlFHUklEX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgICBkYXRhYmFzZTogXCJwb3N0Z3Jlc1wiLFxuICAgIGFwcGxpY2F0aW9uX25hbWU6IFwicWdyaWQtdml0ZXN0LWdsb2JhbC1zZXR1cFwiLFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVNYXhXb3JrZXJzKHByb2plY3Q/OiBWaXRlc3RQcm9qZWN0KTogbnVtYmVyIHtcbiAgY29uc3QgbWF4V29ya2VycyA9IHByb2plY3Q/LmNvbmZpZz8ubWF4V29ya2VycztcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIobWF4V29ya2VycykgJiYgbWF4V29ya2VycyAhPT0gdW5kZWZpbmVkICYmIG1heFdvcmtlcnMgPiAwXG4gICAgPyBtYXhXb3JrZXJzXG4gICAgOiBNQVhfV09SS0VSUztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbldvcmtlckRhdGFiYXNlcyhcbiAgY3JlYXRlQ2xpZW50OiBBZG1pbkNsaWVudEZhY3RvcnksXG4gIHRlbXBsYXRlRGI6IHN0cmluZyxcbiAgcnVuRGF0YWJhc2U6IHN0cmluZyxcbiAgbWF4V29ya2VyczogbnVtYmVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNsaWVudCA9IGNyZWF0ZUNsaWVudCgpO1xuICBhd2FpdCBjbGllbnQuY29ubmVjdCgpO1xuICB0cnkge1xuICAgIGF3YWl0IHJlY3JlYXRlV29ya2VyRGF0YWJhc2VzKGNsaWVudCwgdGVtcGxhdGVEYiwgcnVuRGF0YWJhc2UsIG1heFdvcmtlcnMpO1xuICB9IGNhdGNoIChzZXR1cEVycm9yKSB7XG4gICAgYXdhaXQgY2xpZW50LmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICBjb25zdCBjbGVhbnVwQ2xpZW50ID0gY3JlYXRlQ2xpZW50KCk7XG4gICAgbGV0IGNsZWFudXBFcnJvcjogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2xlYW51cENsaWVudC5jb25uZWN0KCk7XG4gICAgICBhd2FpdCBkcm9wV29ya2VyRGF0YWJhc2VzKGNsZWFudXBDbGllbnQsIHJ1bkRhdGFiYXNlLCBtYXhXb3JrZXJzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2xlYW51cEVycm9yID0gZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFudXBDbGllbnQuZW5kKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIGNsZWFudXBFcnJvciA/Pz0gZXJyb3I7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGNsZWFudXBFcnJvcikge1xuICAgICAgY29uc3QgY29tYmluZWRFcnJvciA9IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgW3NldHVwRXJyb3IsIGNsZWFudXBFcnJvcl0sXG4gICAgICAgIFwidGVzdCBkYXRhYmFzZSBzZXR1cCBhbmQgY2xlYW51cCBib3RoIGZhaWxlZFwiLFxuICAgICAgICB7IGNhdXNlOiBzZXR1cEVycm9yIH0sXG4gICAgICApO1xuICAgICAgdGhyb3cgY29tYmluZWRFcnJvcjtcbiAgICB9XG4gICAgdGhyb3cgc2V0dXBFcnJvcjtcbiAgfVxuICBhd2FpdCBjbGllbnQuZW5kKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXR1cChwcm9qZWN0PzogVml0ZXN0UHJvamVjdCk6IFByb21pc2U8KCkgPT4gUHJvbWlzZTx2b2lkPj4ge1xuICBjb25zdCBydW5EYXRhYmFzZSA9IHByb2Nlc3MuZW52LlFHUklEX1RFU1RfUlVOX0RCO1xuICBpZiAoIXJ1bkRhdGFiYXNlIHx8IHByb2Nlc3MuZW52LlFHUklEX0RCX05BTUUgIT09IHJ1bkRhdGFiYXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVml0ZXN0IHRlc3QgZGF0YWJhc2UgbmFtZSB3YXMgbm90IGNvbmZpZ3VyZWQgY29uc2lzdGVudGx5XCIpO1xuICB9XG4gIGNvbnN0IG1heFdvcmtlcnMgPSByZXNvbHZlTWF4V29ya2Vycyhwcm9qZWN0KTtcbiAgYXdhaXQgcHJvdmlzaW9uV29ya2VyRGF0YWJhc2VzKGNyZWF0ZUFkbWluQ2xpZW50LCBURU1QTEFURV9EQiwgcnVuRGF0YWJhc2UsIG1heFdvcmtlcnMpO1xuXG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGVhcmRvd25DbGllbnQgPSBjcmVhdGVBZG1pbkNsaWVudCgpO1xuICAgIGF3YWl0IHRlYXJkb3duQ2xpZW50LmNvbm5lY3QoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZHJvcFdvcmtlckRhdGFiYXNlcyh0ZWFyZG93bkNsaWVudCwgcnVuRGF0YWJhc2UsIG1heFdvcmtlcnMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0ZWFyZG93bkNsaWVudC5lbmQoKTtcbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSxPQUFPLFFBQVE7QUFFZixNQUFNLGNBQWM7QUFDcEIsTUFBTSxjQUFjLFFBQVEsSUFBSSxzQkFBc0I7QUFPdEQsU0FBUyxnQkFBZ0IsT0FBdUI7QUFDOUMsS0FBSSxDQUFDLGtCQUFrQixLQUFLLE1BQU0sQ0FDaEMsT0FBTSxJQUFJLE1BQU0sZ0NBQWdDLFFBQVE7QUFFMUQsUUFBTyxJQUFJLE1BQU07O0FBR25CLFNBQVMsb0JBQW9CLFlBQW9CLFlBQThCO0FBQzdFLFFBQU8sTUFBTSxLQUFLLEVBQUUsUUFBUSxZQUFZLEdBQUcsR0FBRyxVQUFVLEdBQUcsV0FBVyxHQUFHLFFBQVEsSUFBSTs7QUFHdkYsZUFBZSxxQkFBcUIsUUFBcUIsVUFBaUM7QUFDeEYsT0FBTSxPQUFPLE1BQ1g7Ozs7O09BTUEsQ0FBQyxTQUFTLENBQ1g7O0FBR0gsZUFBc0Isd0JBQ3BCLFFBQ0EsWUFDQSxhQUNBLFlBQ21CO0NBQ25CLE1BQU0sVUFBVSxvQkFBb0IsYUFBYSxXQUFXO0FBQzVELE1BQUssTUFBTSxZQUFZLENBQUMsR0FBRyxTQUFTLFdBQVcsQ0FDN0MsT0FBTSxxQkFBcUIs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
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
//#region src/testing/test-database-name.ts
|
|
4
|
+
let configuredRunDatabase;
|
|
5
|
+
function createTestRunDatabaseName(prefix, entropy) {
|
|
6
|
+
const safePrefix = prefix.replaceAll(/[^A-Za-z0-9_]/g, "_");
|
|
7
|
+
const safeEntropy = entropy.replaceAll(/[^A-Za-z0-9_]/g, "_");
|
|
8
|
+
const maxPrefixLength = 63 - safeEntropy.length - 1;
|
|
9
|
+
return `${safePrefix.slice(0, maxPrefixLength)}_${safeEntropy}`;
|
|
10
|
+
}
|
|
11
|
+
function configureTestRunDatabaseName() {
|
|
12
|
+
if (configuredRunDatabase) return configuredRunDatabase;
|
|
13
|
+
const runDatabase = createTestRunDatabaseName(process.env.QGRID_TEST_RUN_DB ?? "qgrid_test", `${process.pid}_${Date.now().toString(36)}_${randomUUID().slice(0, 8)}`);
|
|
14
|
+
configuredRunDatabase = runDatabase;
|
|
15
|
+
process.env.QGRID_TEST_RUN_DB = runDatabase;
|
|
16
|
+
process.env.QGRID_DB_NAME = runDatabase;
|
|
17
|
+
return runDatabase;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { configureTestRunDatabaseName, createTestRunDatabaseName };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhYmFzZS1uYW1lLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL3Rlc3QtZGF0YWJhc2UtbmFtZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmxldCBjb25maWd1cmVkUnVuRGF0YWJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlc3RSdW5EYXRhYmFzZU5hbWUocHJlZml4OiBzdHJpbmcsIGVudHJvcHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNhZmVQcmVmaXggPSBwcmVmaXgucmVwbGFjZUFsbCgvW15BLVphLXowLTlfXS9nLCBcIl9cIik7XG4gIGNvbnN0IHNhZmVFbnRyb3B5ID0gZW50cm9weS5yZXBsYWNlQWxsKC9bXkEtWmEtejAtOV9dL2csIFwiX1wiKTtcbiAgY29uc3QgbWF4UHJlZml4TGVuZ3RoID0gNjMgLSBzYWZlRW50cm9weS5sZW5ndGggLSAxO1xuICByZXR1cm4gYCR7c2FmZVByZWZpeC5zbGljZSgwLCBtYXhQcmVmaXhMZW5ndGgpfV8ke3NhZmVFbnRyb3B5fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVUZXN0UnVuRGF0YWJhc2VOYW1lKCk6IHN0cmluZyB7XG4gIGlmIChjb25maWd1cmVkUnVuRGF0YWJhc2UpIHJldHVybiBjb25maWd1cmVkUnVuRGF0YWJhc2U7XG4gIGNvbnN0IHByZWZpeCA9IHByb2Nlc3MuZW52LlFHUklEX1RFU1RfUlVOX0RCID8/IFwicWdyaWRfdGVzdFwiO1xuICBjb25zdCBlbnRyb3B5ID0gYCR7cHJvY2Vzcy5waWR9XyR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9XyR7cmFuZG9tVVVJRCgpLnNsaWNlKDAsIDgpfWA7XG4gIGNvbnN0IHJ1bkRhdGFiYXNlID0gY3JlYXRlVGVzdFJ1bkRhdGFiYXNlTmFtZShwcmVmaXgsIGVudHJvcHkpO1xuICBjb25maWd1cmVkUnVuRGF0YWJhc2UgPSBydW5EYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUUdSSURfVEVTVF9SVU5fREIgPSBydW5EYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUUdSSURfREJfTkFNRSA9IHJ1bkRhdGFiYXNlO1xuICByZXR1cm4gcnVuRGF0YWJhc2U7XG59XG4iXSwibWFwcGluZ3MiOiI7OztBQUVBLElBQUk7QUFFSixTQUFnQiwwQkFBMEIsUUFBZ0IsU0FBeUI7Q0FDakYsTUFBTSxhQUFhLE9BQU8sV0FBVyxrQkFBa0IsSUFBSTtDQUMzRCxNQUFNLGNBQWMsUUFBUSxXQUFXLGtCQUFrQixJQUFJO0NBQzdELE1BQU0sa0JBQWtCLEtBQUssWUFBWSxTQUFTO0FBQ2xELFFBQU8sR0FBRyxXQUFXLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHOztBQUdwRCxTQUFnQiwrQkFBdUM7QUFDckQsS0FBSSxzQkFBdUIsUUFBTztDQUdsQyxNQUFNLGNBQWMsMEJBRkwsUUFBUSxJQUFJLHFCQUFxQixjQUNoQyxHQUFHLFFBQVEsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQ3ZCO0FBQzlELHlCQUF3QjtBQUN4QixTQUFRLElBQUksb0JBQW9CO0FBQ2hDLFNBQVEsSUFBSSxnQkFBZ0I7QUFDNUIsUUFBTyJ9
|
|
@@ -2,6 +2,7 @@ import "../../../_virtual/_rolldown/runtime.js";
|
|
|
2
2
|
import { getExpiresAt, getRefreshToken } from "../common/credentials.js";
|
|
3
3
|
import { QuotaThresholdExceededError } from "../../../application/qgrid/qgrid.types.js";
|
|
4
4
|
import { TokenModel } from "../../../application/token/token.model.js";
|
|
5
|
+
import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
|
|
5
6
|
import { assertSupportedOneMillionSuffix, canonicalAnthropicModel } from "./anthropic-constants.js";
|
|
6
7
|
import { readAnthropicQuotaUsage } from "./anthropic-quota.js";
|
|
7
8
|
import { makeAnthropicWorkerId, runClaudeSession } from "./claude-session.js";
|
|
@@ -11,7 +12,7 @@ import { getLogger } from "@logtape/logtape";
|
|
|
11
12
|
* AnthropicDispatcher
|
|
12
13
|
*
|
|
13
14
|
* OpenAIDispatcher와 달리, worker pool을 두는 대신 요청별 fresh spawn
|
|
14
|
-
* 토큰은 인메모리(MAP)으로 관리하고
|
|
15
|
+
* 토큰은 인메모리(MAP)으로 관리하고 smooth weighted round-robin 으로 고른다
|
|
15
16
|
*
|
|
16
17
|
* - 모든 요청은 fresh `--session-id` 로 실행
|
|
17
18
|
* - 멀티턴 문맥은 클라이언트가 매 호출 보내는 full history 를 평탄화해 전달한다.
|
|
@@ -28,8 +29,7 @@ function quotaThresholdExceededMessage(provider, tokens) {
|
|
|
28
29
|
}
|
|
29
30
|
var AnthropicDispatcher = class {
|
|
30
31
|
tokenPool = /* @__PURE__ */ new Map();
|
|
31
|
-
|
|
32
|
-
rrIndex = 0;
|
|
32
|
+
weightedSelector = new SmoothWeightedRoundRobin();
|
|
33
33
|
async start() {
|
|
34
34
|
const tokens = await TokenModel.findActiveByProvider("A", "anthropic");
|
|
35
35
|
for (const t of tokens) {
|
|
@@ -37,15 +37,18 @@ var AnthropicDispatcher = class {
|
|
|
37
37
|
id: t.id,
|
|
38
38
|
name: t.name,
|
|
39
39
|
credentials: t.credentials,
|
|
40
|
-
quotaThreshold: t.quota_threshold
|
|
40
|
+
quotaThreshold: t.quota_threshold,
|
|
41
|
+
weight: t.weight
|
|
41
42
|
});
|
|
43
|
+
this.weightedSelector.setToken(t.id, t.weight);
|
|
42
44
|
logger.info(`worker spawned: ${t.name}`);
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
47
|
async stop() {
|
|
48
|
+
const tokenIds = [...this.tokenPool.keys()];
|
|
49
|
+
for (const id of tokenIds) this.weightedSelector.removeToken(id);
|
|
46
50
|
this.tokenPool.clear();
|
|
47
|
-
this.
|
|
48
|
-
this.rrIndex = 0;
|
|
51
|
+
this.weightedSelector.resetScores();
|
|
49
52
|
}
|
|
50
53
|
get tokenCount() {
|
|
51
54
|
return this.tokenPool.size;
|
|
@@ -54,31 +57,32 @@ var AnthropicDispatcher = class {
|
|
|
54
57
|
const next = new Set(rows.map((r) => r.id));
|
|
55
58
|
const currentIds = Array.from(this.tokenPool.keys());
|
|
56
59
|
for (const id of currentIds) if (!next.has(id)) this.onTokenRemoved(id);
|
|
57
|
-
for (const r of rows) if (this.tokenPool.has(r.id)) this.onTokenUpdated(r.id, r.name, r.credentials, r.quotaThreshold);
|
|
58
|
-
else this.onTokenAdded(r.id, r.name, r.credentials, r.quotaThreshold);
|
|
60
|
+
for (const r of rows) if (this.tokenPool.has(r.id)) this.onTokenUpdated(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
|
|
61
|
+
else this.onTokenAdded(r.id, r.name, r.credentials, r.quotaThreshold, r.weight);
|
|
59
62
|
}
|
|
60
|
-
onTokenAdded(id, name, credentials, quotaThreshold) {
|
|
63
|
+
onTokenAdded(id, name, credentials, quotaThreshold, weight = 1) {
|
|
61
64
|
this.tokenPool.set(id, {
|
|
62
65
|
id,
|
|
63
66
|
name,
|
|
64
67
|
credentials,
|
|
65
|
-
quotaThreshold
|
|
68
|
+
quotaThreshold,
|
|
69
|
+
weight
|
|
66
70
|
});
|
|
71
|
+
this.weightedSelector.setToken(id, weight);
|
|
67
72
|
}
|
|
68
|
-
onTokenUpdated(id, name, credentials, quotaThreshold) {
|
|
73
|
+
onTokenUpdated(id, name, credentials, quotaThreshold, weight = 1) {
|
|
69
74
|
this.tokenPool.set(id, {
|
|
70
75
|
id,
|
|
71
76
|
name,
|
|
72
77
|
credentials,
|
|
73
|
-
quotaThreshold
|
|
78
|
+
quotaThreshold,
|
|
79
|
+
weight
|
|
74
80
|
});
|
|
81
|
+
this.weightedSelector.setToken(id, weight);
|
|
75
82
|
}
|
|
76
83
|
onTokenRemoved(id) {
|
|
77
84
|
this.tokenPool.delete(id);
|
|
78
|
-
this.
|
|
79
|
-
}
|
|
80
|
-
countOf(id) {
|
|
81
|
-
return this.requestCounts.get(id) ?? 0;
|
|
85
|
+
this.weightedSelector.removeToken(id);
|
|
82
86
|
}
|
|
83
87
|
async selectToken() {
|
|
84
88
|
const rows = [...this.tokenPool.values()];
|
|
@@ -94,12 +98,9 @@ var AnthropicDispatcher = class {
|
|
|
94
98
|
});
|
|
95
99
|
throw new QuotaThresholdExceededError(quotaThresholdExceededMessage("anthropic", overThresholdTokens));
|
|
96
100
|
}
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (!picked) return null;
|
|
101
|
-
this.rrIndex++;
|
|
102
|
-
return this.charge(picked);
|
|
101
|
+
const selectedId = this.weightedSelector.select(new Set(eligible.map((token) => token.id)));
|
|
102
|
+
if (selectedId === null) return null;
|
|
103
|
+
return this.tokenPool.get(selectedId) ?? null;
|
|
103
104
|
}
|
|
104
105
|
async filterEligibleTokens(rows) {
|
|
105
106
|
const thresholded = rows.filter((token) => this.hasQuotaThreshold(token));
|
|
@@ -166,10 +167,6 @@ var AnthropicDispatcher = class {
|
|
|
166
167
|
lookupReason: reason
|
|
167
168
|
});
|
|
168
169
|
}
|
|
169
|
-
charge(token) {
|
|
170
|
-
this.requestCounts.set(token.id, this.countOf(token.id) + 1);
|
|
171
|
-
return token;
|
|
172
|
-
}
|
|
173
170
|
async generate(req) {
|
|
174
171
|
return this.run(req, () => {});
|
|
175
172
|
}
|
|
@@ -244,4 +241,4 @@ var AnthropicDispatcher = class {
|
|
|
244
241
|
//#endregion
|
|
245
242
|
export { AnthropicDispatcher };
|
|
246
243
|
|
|
247
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIGxlYXN0LXVzZWQsIHJvdW5kLXJvYmluIOycvOuhnCDqs6Drpbjri6RcbiAqXG4gKiAtIOuqqOuToCDsmpTssq3snYAgZnJlc2ggYC0tc2Vzc2lvbi1pZGAg66GcIOyLpO2WiVxuICogLSDrqYDti7DthLQg66y466el7J2AIO2BtOudvOydtOyWuO2KuOqwgCDrp6Qg7Zi47LacIOuztOuCtOuKlCBmdWxsIGhpc3Rvcnkg66W8IO2Pie2DhO2ZlO2VtCDsoITri6ztlZzri6QuXG4gKiAtIOuwnOq4ie2VnCBzZXNzaW9uLWlkIOulvCBHZW5lcmF0ZVJlc3VsdC50aHJlYWRDb29yZCh0aHJlYWRJZD1zZXNzaW9uLWlkLCB3b3JrZXJJZD10b2tlbklkLFxuICogICBlcG9jaD0wKeuhnCDsmKzroKQsIOyDgeychChpc3N1ZUNvbnZDb250ZXh0KeqwgCDtgbTrnbzsl5Ag7ZqM7Iah7ZWgIOyijO2RnOulvCDrp4zrk6Dri6QuIOuLpOydjCB0dXJuIOydtCDsooztkZzrpbxcbiAqICAg7ZqM7Iah7ZW064+EIEFudGhyb3BpYyDrnbzsmrDtjIXsl5DripQg7JOw7KeAIOyViuuKlOuLpC5cbiAqL1xuXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcbmltcG9ydCB7IGdldEV4cGlyZXNBdCwgZ2V0UmVmcmVzaFRva2VuIH0gZnJvbSBcIi4uL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlcXVlc3QsXG4gIHR5cGUgR2VuZXJhdGVSZXN1bHQsXG4gIHR5cGUgR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MsXG4gIHR5cGUgUHJvdmlkZXJEaXNwYXRjaGVyLFxufSBmcm9tIFwiLi4vY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIH0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHsgcmVhZEFudGhyb3BpY1F1b3RhVXNhZ2UsIHR5cGUgQW50aHJvcGljUXVvdGFVc2FnZVJlc3VsdCB9IGZyb20gXCIuL2FudGhyb3BpYy1xdW90YVwiO1xuaW1wb3J0IHsgbWFrZUFudGhyb3BpY1dvcmtlcklkLCBydW5DbGF1ZGVTZXNzaW9uIH0gZnJvbSBcIi4vY2xhdWRlLXNlc3Npb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwiYW50aHJvcGljLWRpc3BhdGNoZXJcIl0pO1xuXG4vLyAxTSBjb250ZXh0IOygleyDgSDsg53shLHsnYAg7Iuk7Lih7IOBIDEwMHMr6rmM7KeAIOqwhOuLpC4gMjQwc+uKlCDsmYTstqkg7J6l7LmY7J28IOu/kCxcbi8vIOqxsOu2gCvqsbDrjIAgc3lzdGVtIOyerOyDneyEsSDsp4Dsl7DsnYQg7JmE7KCE7Z6IIO2VtOqysO2VmOuKlCDqsJLsnYAg7JWE64uI64ukLlxuY29uc3QgREVGQVVMVF9USU1FT1VUX01TID0gMjQwXzAwMDtcbi8vIGFjY2VzcyB0b2tlbiDrp4zro4wg7J6E67CVIOyehOqzhCDigJQg6riw7KG0IHN0YW5kYWxvbmUg6rK966GcKHFncmlkLmRpc3BhdGNoZXIudHMp7JmAIOuPmeydvCg2MHMpLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmludGVyZmFjZSBQb29sZWRUb2tlbiB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbmV4cG9ydCBjbGFzcyBBbnRocm9waWNEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgLy8gdG9rZW5JZCDihpIg7ZKAIO2VreuqqS4gc3RhcnQoKS90b2tlbiDsnbTrsqTtirjroZwg7LGE7JuAXG4gIHByaXZhdGUgdG9rZW5Qb29sID0gbmV3IE1hcDxudW1iZXIsIFBvb2xlZFRva2VuPigpO1xuICAvLyB0b2tlbklkIOuzhCDsgqzsmqkg7Lm07Jq07YSwKGxlYXN0LXVzZWQgUlIpLiBuYW1lIOydtCDslYTri4jrnbwgaWQg6riw7KSAIOKAlCDsnbTrpoQg7Lap64+MIOyViOyghFxuICBwcml2YXRlIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIHJySW5kZXggPSAwO1xuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE9wZW5BSURpc3BhdGNoZXIuc3RhcnQoKSDsmYAg64+Z7J287ZWY6rKMIERCIOyXkOyEnCDquLDsobQgYW50aHJvcGljIO2GoO2BsOydhCBzZWxmLWJvb3RzdHJhcCDtlZzri6QuXG4gICAgLy8gKOyEnOuyhCDsnqzsi5zsnpEg7IucIE5PVElGWSDqsIAg7JWIIOyYpOuvgOuhnCDrtoDtirjsiqTtirjrnqnsnbQg7JeG7Jy866m0IO2SgOydtCDruYgg7LGE66GcIOuCqOuKlOuLpC4pXG4gICAgLy8g7J207ZuEIOuzgOqyveu2hOydgCB0b2tlbi1zdWJzY3JpYmVyIOqwgCBvblRva2VuQWRkZWQvVXBkYXRlZC9SZW1vdmVkIOuhnCDsoITri6ztlZzri6QuXG4gICAgLy8gZmluZEFjdGl2ZUJ5UHJvdmlkZXIg6rCAIGFjdGl2ZT10cnVlICsgcHJvdmlkZXIg7ZWE7YSw66W8IERCIOyXkOyEnCDsspjrpqwg4oaSIGluYWN0aXZlIOuKlCDslaDstIjsl5Ag7JWIIOyYqOuLpC5cbiAgICBjb25zdCB0b2tlbnMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRBY3RpdmVCeVByb3ZpZGVyKFwiQVwiLCBcImFudGhyb3BpY1wiKTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdG9rZW5zKSB7XG4gICAgICB0aGlzLnRva2VuUG9vbC5zZXQodC5pZCwge1xuICAgICAgICBpZDogdC5pZCxcbiAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICBjcmVkZW50aWFsczogdC5jcmVkZW50aWFscyBhcyBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQ6IHQucXVvdGFfdGhyZXNob2xkLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VyIHNwYXduZWQ6ICR7dC5uYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy50b2tlblBvb2wuY2xlYXIoKTtcbiAgICAvLyBsaWZlY3ljbGUg7KCV7ZWpOiBSUiDsubTsmrTthLAv7J24642x7Iqk64+EIOu5hOybjCBzdG9w4oaSc3RhcnQg7J6s65Ox66GdIOyLnCDsnbTsoIQg7Lm07Jq07Yq46rCAIOyViCDrgqjqsowg7ZWc64ukLlxuICAgIHRoaXMucmVxdWVzdENvdW50cy5jbGVhcigpO1xuICAgIHRoaXMucnJJbmRleCA9IDA7XG4gIH1cblxuICAvLyDtmITsnqwg7ZKA7J2YIO2GoO2BsCDsiJgoc3RhcnR1cCDroZzqt7gvaGVhbHRoIOyaqSkuXG4gIGdldCB0b2tlbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLnNpemU7XG4gIH1cblxuICAvLyBEQiBhY3RpdmUgYW50aHJvcGljIO2GoO2BsCDrqqnroZ3snLzroZwg7ZKA7J2EIOyerOuPmeq4sO2ZlO2VnOuLpChwZXJpb2RpYyByZWNvbmNpbGUv7J6s7Jew6rKw7JqpKS5cbiAgLy8gTElTVEVOL05PVElGWSDqsIAg64GK6ri0IOuPmeyViCDsnKDsi6TrkJwg7LaU6rCAL+yCreygnC/ruYTtmZzshLHtmZTrpbwgREIg6riw7KSA7Jy866GcIOuLpOyLnCDrp57stpjri6QuXG4gIC8vIOydtOuypO2KuCDtlbjrk6Trn6zrpbwg7J6s7IKs7Jqp7ZW0IO2SgCDqsLHsi6DsnbQg7J286rSA65CY6rKMIOyggeyaqeuQmOuPhOuhnSDtlZzri6Q6XG4gIC8vICAtIERCIOyXkCDsl4bripTrjbAg7ZKA7JeQIOyeiOuKlCDthqDtgbAg4oaSIG9uVG9rZW5SZW1vdmVkXG4gIC8vICAtIERCIOyXkCDsnojripQg7Yag7YGwIOKGkiDsi6Dqt5zrqbQgb25Ub2tlbkFkZGVkLCDquLDsobTsnbTrqbQgb25Ub2tlblVwZGF0ZWRcbiAgcmVwbGFjZVRva2VucyhcbiAgICByb3dzOiBBcnJheTx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICAgICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIH0+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldChyb3dzLm1hcCgocikgPT4gci5pZCkpO1xuICAgIC8vIG9uVG9rZW5SZW1vdmVkIOqwgCB0b2tlblBvb2wg7J2EIGRlbGV0ZSDtlZjrr4DroZwg7Iic7ZqMIOykkSDsiJjsoJXsnYQg7ZS87ZWY66CkIO2CpOulvCDrqLzsoIAg7Iqk64OF7IO37ZWc64ukLlxuICAgIGNvbnN0IGN1cnJlbnRJZHMgPSBBcnJheS5mcm9tKHRoaXMudG9rZW5Qb29sLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjdXJyZW50SWRzKSB7XG4gICAgICBpZiAoIW5leHQuaGFzKGlkKSkgdGhpcy5vblRva2VuUmVtb3ZlZChpZCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiByb3dzKSB7XG4gICAgICBpZiAodGhpcy50b2tlblBvb2wuaGFzKHIuaWQpKSB7XG4gICAgICAgIHRoaXMub25Ub2tlblVwZGF0ZWQoci5pZCwgci5uYW1lLCByLmNyZWRlbnRpYWxzLCByLnF1b3RhVGhyZXNob2xkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25Ub2tlbkFkZGVkKHIuaWQsIHIubmFtZSwgci5jcmVkZW50aWFscywgci5xdW90YVRocmVzaG9sZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gdG9rZW4gZXZlbnRzICh0b2tlbi1zdWJzY3JpYmVyIOqwgCDtmLjstpwpXG4gIG9uVG9rZW5BZGRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuUG9vbC5zZXQoaWQsIHsgaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCB9KTtcbiAgfVxuXG4gIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLnNldChpZCwgeyBpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkIH0pO1xuICB9XG5cbiAgb25Ub2tlblJlbW92ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudG9rZW5Qb29sLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLmRlbGV0ZShpZCk7XG4gIH1cblxuICBwcml2YXRlIGNvdW50T2YoaWQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQoaWQpID8/IDA7XG4gIH1cblxuICAvLyDsmpTssq3rp4jri6QgbGVhc3QtdXNlZCBSUiDroZwg7Yag7YGw7J2EIOqzoOuluOuLpCjrj5nsoJDsnbTrqbQgcnJJbmRleCDroZwg7ZqM7KCEKS5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUb2tlbigpOiBQcm9taXNlPFBvb2xlZFRva2VuIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy50b2tlblBvb2wudmFsdWVzKCldO1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyBlbGlnaWJsZSwgb3ZlclRocmVzaG9sZFRva2VucyB9ID0gYXdhaXQgdGhpcy5maWx0ZXJFbGlnaWJsZVRva2Vucyhyb3dzKTtcbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgdG9rZW5Db3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudDogcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQocikpLmxlbmd0aCxcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2VucyxcbiAgICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKFxuICAgICAgICBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcImFudGhyb3BpY1wiLCBvdmVyVGhyZXNob2xkVG9rZW5zKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWluQ291bnQgPSBNYXRoLm1pbiguLi5lbGlnaWJsZS5tYXAoKHIpID0+IHRoaXMuY291bnRPZihyLmlkKSkpO1xuICAgIGNvbnN0IGlkbGUgPSBlbGlnaWJsZS5maWx0ZXIoKHIpID0+IHRoaXMuY291bnRPZihyLmlkKSA9PT0gbWluQ291bnQpO1xuICAgIGNvbnN0IHBpY2tlZCA9IGlkbGVbdGhpcy5yckluZGV4ICUgaWRsZS5sZW5ndGhdO1xuICAgIGlmICghcGlja2VkKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLnJySW5kZXgrKztcbiAgICByZXR1cm4gdGhpcy5jaGFyZ2UocGlja2VkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmlsdGVyRWxpZ2libGVUb2tlbnMocm93czogUG9vbGVkVG9rZW5bXSk6IFByb21pc2U8e1xuICAgIGVsaWdpYmxlOiBQb29sZWRUb2tlbltdO1xuICAgIG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+O1xuICB9PiB7XG4gICAgY29uc3QgdGhyZXNob2xkZWQgPSByb3dzLmZpbHRlcigodG9rZW4pID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW4pKTtcbiAgICBpZiAodGhyZXNob2xkZWQubGVuZ3RoID09PSAwKSByZXR1cm4geyBlbGlnaWJsZTogcm93cywgb3ZlclRocmVzaG9sZFRva2VuczogW10gfTtcblxuICAgIGNvbnN0IGVsaWdpYmxlSWRzID0gbmV3IFNldChcbiAgICAgIHJvd3MuZmlsdGVyKCh0b2tlbikgPT4gIXRoaXMuaGFzUXVvdGFUaHJlc2hvbGQodG9rZW4pKS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCksXG4gICAgKTtcbiAgICBjb25zdCBvdmVyVGhyZXNob2xkVG9rZW5zOiBBcnJheTx7IHRva2VuTmFtZTogc3RyaW5nOyB0aHJlc2hvbGQ6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRocmVzaG9sZGVkLm1hcChhc3luYyAodG9rZW4pID0+ICh7XG4gICAgICAgIHRva2VuLFxuICAgICAgICByZXN1bHQ6IGF3YWl0IHJlYWRBbnRocm9waWNRdW90YVVzYWdlKHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSxcbiAgICAgIH0pKSxcbiAgICApO1xuXG4gICAgY2hlY2tzLmZvckVhY2goKGNoZWNrLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGNoZWNrLnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdGhyZXNob2xkZWRbaW5kZXhdO1xuICAgICAgICBpZiAoIXRva2VuKSByZXR1cm47XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbiwgU3RyaW5nKGNoZWNrLnJlYXNvbikpO1xuICAgICAgICBlbGlnaWJsZUlkcy5hZGQodG9rZW4uaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRva2VuID0gY2hlY2sudmFsdWUudG9rZW47XG4gICAgICBjb25zdCByZXN1bHQgPSBjaGVjay52YWx1ZS5yZXN1bHQ7XG4gICAgICBpZiAocmVzdWx0LmtpbmQgPT09IFwibG9va3VwX2ZhaWxlZFwiKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFMb29rdXBGYWlsT3Blbih0b2tlbiwgcmVzdWx0LnJlYXNvbik7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgICB0aGlzLmxvZ1F1b3RhT3ZlclRocmVzaG9sZCh0b2tlbiwgcmVzdWx0KTtcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vucy5wdXNoKHsgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLCB0aHJlc2hvbGQ6IHRva2VuLnF1b3RhVGhyZXNob2xkIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBlbGlnaWJsZTogcm93cy5maWx0ZXIoKHRva2VuKSA9PiBlbGlnaWJsZUlkcy5oYXModG9rZW4uaWQpKSwgb3ZlclRocmVzaG9sZFRva2VucyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNRdW90YVRocmVzaG9sZCh0b2tlbjogUG9vbGVkVG9rZW4pOiB0b2tlbiBpcyBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9IHtcbiAgICByZXR1cm4gdG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFPdmVyVGhyZXNob2xkKFxuICAgIHRva2VuOiBQb29sZWRUb2tlbiAmIHsgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB9LFxuICAgIHJlc3VsdDogRXh0cmFjdDxBbnRocm9waWNRdW90YVVzYWdlUmVzdWx0LCB7IGtpbmQ6IFwib2tcIiB9PixcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLmluZm8oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGRcIiwge1xuICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICBjYWNoZWRVdGlsaXphdGlvbjogcmVzdWx0LnV0aWxpemF0aW9uUGN0LFxuICAgICAgY2FjaGVBZ2U6IHJlc3VsdC5jYWNoZUFnZU1zLFxuICAgICAgcmVhc29uOiBcIm92ZXJfdGhyZXNob2xkXCIsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvZ1F1b3RhTG9va3VwRmFpbE9wZW4oXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVhc29uOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgdG9rZW5JZDogdG9rZW4uaWQsXG4gICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQsXG4gICAgICByZWFzb246IFwibG9va3VwX2ZhaWxfb3BlblwiLFxuICAgICAgbG9va3VwUmVhc29uOiByZWFzb24sXG4gICAgfSk7XG4gIH1cblxuICAvLyDshKDtg53rkJwg7Yag7YGw7J2YIOyCrOyaqSDsubTsmrTtirjrpbwgYXdhaXQg7KCE7JeQIOyEoOuwmOyYgSjrj5nsi5wg7JqU7LKt7J20IOuLpOuluCDthqDtgbDsnYQg6rOg66W064+E66GdKS5cbiAgcHJpdmF0ZSBjaGFyZ2UodG9rZW46IFBvb2xlZFRva2VuKTogUG9vbGVkVG9rZW4ge1xuICAgIHRoaXMucmVxdWVzdENvdW50cy5zZXQodG9rZW4uaWQsIHRoaXMuY291bnRPZih0b2tlbi5pZCkgKyAxKTtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxLCAoKSA9PiB7fSk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZVN0cmVhbShyZXE6IEdlbmVyYXRlUmVxdWVzdCwgY2I6IEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuKHJlcSwgY2Iub25EZWx0YSwgeyBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiB0cnVlIH0pO1xuICAgICAgY2Iub25UaHJlYWRJZD8uKHJlc3VsdC50aHJlYWRDb29yZC50aHJlYWRJZCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY2Iub25FcnJvcihlIGFzIEVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvLyBnZW5lcmF0ZS9nZW5lcmF0ZVN0cmVhbSDqs7XthrUg7Iuk7ZaJLiBvbkRlbHRhIOuKlCDsiqTtirjrprzsnbTrqbQg7KCQ7KeEIOuwqey2nCwg67mE7Iqk7Yq466a87J2066m0IG5vLW9wLlxuICBwcml2YXRlIGFzeW5jIHJ1bihcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBvbkRlbHRhOiAodDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIG9wdHM/OiB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM/OiBib29sZWFuIH0sXG4gICk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICAvLyDsnbTrr7jsp4Ag7IOd7ISx7J2AIE9wZW5BSShjb2RleCkg6rK966GcIOyghOyaqS4gQW50aHJvcGljIOudvOyasO2MheyXkCDsnbTrr7jsp4Ag7ZSM656Y6re46rCAXG4gICAgLy8g64+E64us7ZWY66m0IOyhsOyaqe2eiCDthY3siqTtirjroZwg7Y+067Cx7ZWY7KeAIOyViuqzoCDrqoXsi5zsoIHsnLzroZwg6rGw67aA7ZWc64ukLlxuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIEFudGhyb3BpYyByb3V0ZVwiKTtcbiAgICB9XG4gICAgLy8gbW9kZWwg7KCV6rec7ZmU66W8IGRpc3BhdGNoZXIg7KeE7J6F7KCQ7JeQ7IScIO2VnCDrsogg7ZWc64ukOiByZXN1bHQubW9kZWwgLyBydW5DbGF1ZGVTZXNzaW9uIOyghOu2gFxuICAgIC8vIGNhbm9uaWNhbChwcmVmaXgg7JeG64qUIGNvc3Qg7YKkKSDsnYQg7JOw6rKMIO2GteydvC4g66+47KeA7KCV7J2066m0IEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOKAlCBxZ3JpZC5kaXNwYXRjaGVyXG4gICAgLy8g7J2YIFwic29ubmV0XCIg67OE7LmtIOyasO2ajCDssKjri6guIOygleq3nO2ZlCDqt5zsuZnsnYAgZmFsbGJhY2sg6rK966Gc7JmAIOqzteycoChjYW5vbmljYWxBbnRocm9waWNNb2RlbCkuXG4gICAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsQW50aHJvcGljTW9kZWwocmVxLm1vZGVsKTtcbiAgICBjb25zdCBqc29uU2NoZW1hID1cbiAgICAgIHJlcS5vdXRwdXRTY2hlbWEgIT09IHVuZGVmaW5lZCA/IEpTT04uc3RyaW5naWZ5KHJlcS5vdXRwdXRTY2hlbWEpIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKFwiTm8gYW50aHJvcGljIHRva2VucyBhdmFpbGFibGVcIik7XG5cbiAgICBjb25zdCBleGVjID0gYXN5bmMgKCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+ID0+IHtcbiAgICAgIC8vIOunjOujjCDsnoTrsJUg7Yag7YGwIHByZWVtcHRpdmUgcmVmcmVzaCjquLDsobQgc3RhbmRhbG9uZSDqsr3roZzsmYAg64+Z7J28KS4g7Iuk7Yyo7ZW064+EIOynhO2WiS5cbiAgICAgIGxldCBhY2Nlc3NUb2tlbiA9IHRva2VuLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuO1xuICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZ2V0RXhwaXJlc0F0KHRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAgIGlmIChcbiAgICAgICAgZXhwaXJlc0F0ICYmXG4gICAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgICBnZXRSZWZyZXNoVG9rZW4odG9rZW4uY3JlZGVudGlhbHMpXG4gICAgICApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB7IFFncmlkRnJhbWUgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lXCIpO1xuICAgICAgICAgIC8vIHByb3ZpZGVyIOulvCDrsJjrk5zsi5wg7LGE7JuM7JW8IHJlZnJlc2hUb2tlbiDrgrTrtoAgVG9rZW5Nb2RlbC5zYXZlIOqwgCDshLHqs7XtlZzri6QuXG4gICAgICAgICAgLy8gcmVmcmVzaFRva2VuKFRva2VuU3Vic2V0QSkg64qUIGlkL3Byb3ZpZGVyL2NyZWRlbnRpYWxzL25hbWUg66eMIOyCrOyaqe2VmOuvgOuhnCDqt7ggNOqwnOunjCDrhJjquLTri6QuXG4gICAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbih7XG4gICAgICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogdG9rZW4uY3JlZGVudGlhbHMsXG4gICAgICAgICAgfSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbj5bMF0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke3Rva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKGDihpIgJHt0b2tlbi5uYW1lfSAobW9kZWw6ICR7bW9kZWx9KWApO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHJ1bkNsYXVkZVNlc3Npb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgICAgICB0b2tlbjogYWNjZXNzVG9rZW4sXG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgc3lzdGVtOiByZXEuc3lzdGVtUHJvbXB0LFxuICAgICAgICAgIGpzb25TY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiByZXEuZWZmb3J0LFxuICAgICAgICAgIHRpbWVvdXRNczogREVGQVVMVF9USU1FT1VUX01TLFxuICAgICAgICAgIGNvbGRIaXN0b3J5OiByZXEuY29sZEhpc3RvcnksXG4gICAgICAgICAgaW5wdXQ6IHJlcS5jb2xkSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWw6IHJlcS5hYm9ydFNpZ25hbCxcbiAgICAgICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiBvcHRzPy5pbmNsdWRlUGFydGlhbE1lc3NhZ2VzLFxuICAgICAgICB9LFxuICAgICAgICBvbkRlbHRhLFxuICAgICAgKTtcblxuICAgICAgaWYgKHNlc3Npb24ucXVvdGFFeGhhdXN0ZWQpIHRocm93IG5ldyBFcnJvcihgcXVvdGEgZXhoYXVzdGVkICgke3Rva2VuLm5hbWV9KWApO1xuICAgICAgaWYgKHNlc3Npb24uaXNFcnJvcikge1xuICAgICAgICAvLyDsp4Tri6goU09OLTQ5NSk6IGlzRXJyb3Ig7YyQ7KCVIOyCrOycoChzdWJ0eXBlL3Rlcm1pbmFsX3JlYXNvbinrpbwg66mU7Iuc7KeAIOyVnuyXkCDrk5zrn6zrgrjri6QuXG4gICAgICAgIC8vIOq3uOuPmeyViCBkZXRhaWwg7J20IHNlc3Npb24udGV4dCjsmYTsoITtlZwgSlNPTiDrs7jrrLgp67+Q7J206528IFwic2NoZW1hIOychOuwmOyduOyngCAvIG1heCByZXRyaWVzIOyduOyngCAvXG4gICAgICAgIC8vIG1heCB0dXJucyDsnbjsp4BcIuulvCDqtazrtoTtlaAg7IiYIOyXhuyXiOuLpC4gdGV4dCDripQg7KeE64uo7JeQIO2VhOyalO2VnCDrp4ztgbzrp4wg7J6Y6528IOuNp+u2meyduOuLpC5cbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICBzZXNzaW9uLnN1YnR5cGUgPz8gc2Vzc2lvbi50ZXJtaW5hbFJlYXNvbiA/PyAoc2Vzc2lvbi5pc0Vycm9yID8gXCJpc19lcnJvclwiIDogXCJ1bmtub3duXCIpO1xuICAgICAgICBjb25zdCBib2R5ID0gc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgPyBzZXNzaW9uLnRleHQubGVuZ3RoID4gNTAwXG4gICAgICAgICAgICA/IGAke3Nlc3Npb24udGV4dC5zbGljZSgwLCA1MDApfeKApigke3Nlc3Npb24udGV4dC5sZW5ndGh9IGNoYXJzKWBcbiAgICAgICAgICAgIDogc2Vzc2lvbi50ZXh0XG4gICAgICAgICAgOiBgZW1wdHkgdGV4dCwgb3V0cHV0VG9rZW5zPSR7c2Vzc2lvbi51c2FnZS5vdXRwdXRUb2tlbnN9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjbGF1ZGUgZXJyb3IgKCR7dG9rZW4ubmFtZX0pIFske3JlYXNvbn1dOiAke2JvZHl9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRleHQ6IHNlc3Npb24udGV4dCxcbiAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICB1c2FnZTogc2Vzc2lvbi51c2FnZSxcbiAgICAgICAgZHVyYXRpb25Nczogc2Vzc2lvbi5kdXJhdGlvbk1zLFxuICAgICAgICB0dGZ0TXM6IHNlc3Npb24udHRmdE1zLFxuICAgICAgICBjb3N0VXNkOiBzZXNzaW9uLmNvc3RVc2QsXG4gICAgICAgIG1vZGVsLFxuICAgICAgICAvLyBzeXN0ZW1IYXNoIOuKlCDsg4HsnIQgaXNzdWVDb252Q29udGV4dCDqsIAg7LGE7Jq064ukKOyXrOq4sOyEoCDruYTsmrTri6QpLlxuICAgICAgICB0aHJlYWRDb29yZDoge1xuICAgICAgICAgIHdvcmtlcklkOiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW4uaWQpLFxuICAgICAgICAgIHRocmVhZElkOiBzZXNzaW9uLnNlc3Npb25JZCxcbiAgICAgICAgICBlcG9jaDogMCxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHJldHVybiBleGVjKCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyx1QkFBdUIsQ0FBQztBQUkzRCxNQUFNLHFCQUFxQjtBQUUzQixNQUFNLG9CQUFvQjtBQVMxQixTQUFTLDhCQUNQLFVBQ0EsUUFDUTtDQUNSLE1BQU0sVUFB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
|
|
244
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW50aHJvcGljLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvYW50aHJvcGljLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbnRocm9waWNEaXNwYXRjaGVyXG4gKlxuICogT3BlbkFJRGlzcGF0Y2hlcuyZgCDri6zrpqwsIHdvcmtlciBwb29s7J2EIOuRkOuKlCDrjIDsi6Ag7JqU7LKt67OEIGZyZXNoIHNwYXduXG4gKiDthqDtgbDsnYAg7J2466mU66qo66asKE1BUCnsnLzroZwg6rSA66as7ZWY6rOgIHNtb290aCB3ZWlnaHRlZCByb3VuZC1yb2JpbiDsnLzroZwg6rOg66W464ukXG4gKlxuICogLSDrqqjrk6Ag7JqU7LKt7J2AIGZyZXNoIGAtLXNlc3Npb24taWRgIOuhnCDsi6TtlolcbiAqIC0g66mA7Yuw7YS0IOusuOunpeydgCDtgbTrnbzsnbTslrjtirjqsIAg66ekIO2YuOy2nCDrs7TrgrTripQgZnVsbCBoaXN0b3J5IOulvCDtj4ntg4TtmZTtlbQg7KCE64us7ZWc64ukLlxuICogLSDrsJzquIntlZwgc2Vzc2lvbi1pZCDrpbwgR2VuZXJhdGVSZXN1bHQudGhyZWFkQ29vcmQodGhyZWFkSWQ9c2Vzc2lvbi1pZCwgd29ya2VySWQ9dG9rZW5JZCxcbiAqICAgZXBvY2g9MCnroZwg7Jis66CkLCDsg4HsnIQoaXNzdWVDb252Q29udGV4dCnqsIAg7YG065287JeQIO2ajOyGoe2VoCDsooztkZzrpbwg66eM65Og64ukLiDri6TsnYwgdHVybiDsnbQg7KKM7ZGc66W8XG4gKiAgIO2ajOyGoe2VtOuPhCBBbnRocm9waWMg65287Jqw7YyF7JeQ64qUIOyTsOyngCDslYrripTri6QuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIEFudGhyb3BpY0NyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyBnZXRFeHBpcmVzQXQsIGdldFJlZnJlc2hUb2tlbiB9IGZyb20gXCIuLi9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeCwgY2Fub25pY2FsQW50aHJvcGljTW9kZWwgfSBmcm9tIFwiLi9hbnRocm9waWMtY29uc3RhbnRzXCI7XG5pbXBvcnQgeyByZWFkQW50aHJvcGljUXVvdGFVc2FnZSwgdHlwZSBBbnRocm9waWNRdW90YVVzYWdlUmVzdWx0IH0gZnJvbSBcIi4vYW50aHJvcGljLXF1b3RhXCI7XG5pbXBvcnQgeyBtYWtlQW50aHJvcGljV29ya2VySWQsIHJ1bkNsYXVkZVNlc3Npb24gfSBmcm9tIFwiLi9jbGF1ZGUtc2Vzc2lvblwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJhbnRocm9waWMtZGlzcGF0Y2hlclwiXSk7XG5cbi8vIDFNIGNvbnRleHQg7KCV7IOBIOyDneyEseydgCDsi6TsuKHsg4EgMTAwcyvquYzsp4Ag6rCE64ukLiAyNDBz64qUIOyZhOy2qSDsnqXsuZjsnbwg67+QLFxuLy8g6rGw67aAK+qxsOuMgCBzeXN0ZW0g7J6s7IOd7ISxIOyngOyXsOydhCDsmYTsoITtnogg7ZW06rKw7ZWY64qUIOqwkuydgCDslYTri4jri6QuXG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSAyNDBfMDAwO1xuLy8gYWNjZXNzIHRva2VuIOunjOujjCDsnoTrsJUg7J6E6rOEIOKAlCDquLDsobQgc3RhbmRhbG9uZSDqsr3roZwocWdyaWQuZGlzcGF0Y2hlci50cynsmYAg64+Z7J28KDYwcykuXG5jb25zdCBSRUZSRVNIX1NBRkVUWV9NUyA9IDYwXzAwMDtcblxuaW50ZXJmYWNlIFBvb2xlZFRva2VuIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICBjcmVkZW50aWFsczogQW50aHJvcGljQ3JlZGVudGlhbHM7XG4gIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIHF1b3RhVGhyZXNob2xkRXhjZWVkZWRNZXNzYWdlKFxuICBwcm92aWRlcjogc3RyaW5nLFxuICB0b2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlscyA9IHRva2Vuc1xuICAgIC5tYXAoKHRva2VuKSA9PiBgJHt0b2tlbi50b2tlbk5hbWV9ICh0aHJlc2hvbGQgJHt0b2tlbi50aHJlc2hvbGR9JSlgKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxzLmxlbmd0aCA+IDBcbiAgICA/IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZDogJHtkZXRhaWxzfWBcbiAgICA6IGBBbGwgJHtwcm92aWRlcn0gdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZGA7XG59XG5cbmV4cG9ydCBjbGFzcyBBbnRocm9waWNEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgLy8gdG9rZW5JZCDihpIg7ZKAIO2VreuqqS4gc3RhcnQoKS90b2tlbiDsnbTrsqTtirjroZwg7LGE7JuAXG4gIHByaXZhdGUgdG9rZW5Qb29sID0gbmV3IE1hcDxudW1iZXIsIFBvb2xlZFRva2VuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlaWdodGVkU2VsZWN0b3IgPSBuZXcgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluKCk7XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gT3BlbkFJRGlzcGF0Y2hlci5zdGFydCgpIOyZgCDrj5nsnbztlZjqsowgREIg7JeQ7IScIOq4sOyhtCBhbnRocm9waWMg7Yag7YGw7J2EIHNlbGYtYm9vdHN0cmFwIO2VnOuLpC5cbiAgICAvLyAo7ISc67KEIOyerOyLnOyekSDsi5wgTk9USUZZIOqwgCDslYgg7Jik66+A66GcIOu2gO2KuOyKpO2KuOueqeydtCDsl4bsnLzrqbQg7ZKA7J20IOu5iCDssYTroZwg64Ko64qU64ukLilcbiAgICAvLyDsnbTtm4Qg67OA6rK967aE7J2AIHRva2VuLXN1YnNjcmliZXIg6rCAIG9uVG9rZW5BZGRlZC9VcGRhdGVkL1JlbW92ZWQg66GcIOyghOuLrO2VnOuLpC5cbiAgICAvLyBmaW5kQWN0aXZlQnlQcm92aWRlciDqsIAgYWN0aXZlPXRydWUgKyBwcm92aWRlciDtlYTthLDrpbwgREIg7JeQ7IScIOyymOumrCDihpIgaW5hY3RpdmUg64qUIOyVoOy0iOyXkCDslYgg7Jio64ukLlxuICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEFjdGl2ZUJ5UHJvdmlkZXIoXCJBXCIsIFwiYW50aHJvcGljXCIpO1xuICAgIGZvciAoY29uc3QgdCBvZiB0b2tlbnMpIHtcbiAgICAgIHRoaXMudG9rZW5Qb29sLnNldCh0LmlkLCB7XG4gICAgICAgIGlkOiB0LmlkLFxuICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzOiB0LmNyZWRlbnRpYWxzIGFzIEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZDogdC5xdW90YV90aHJlc2hvbGQsXG4gICAgICAgIHdlaWdodDogdC53ZWlnaHQsXG4gICAgICB9KTtcbiAgICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbih0LmlkLCB0LndlaWdodCk7XG4gICAgICBsb2dnZXIuaW5mbyhgd29ya2VyIHNwYXduZWQ6ICR7dC5uYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG9rZW5JZHMgPSBbLi4udGhpcy50b2tlblBvb2wua2V5cygpXTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRva2VuSWRzKSB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMudG9rZW5Qb29sLmNsZWFyKCk7XG4gICAgdGhpcy53ZWlnaHRlZFNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICAvLyDtmITsnqwg7ZKA7J2YIO2GoO2BsCDsiJgoc3RhcnR1cCDroZzqt7gvaGVhbHRoIOyaqSkuXG4gIGdldCB0b2tlbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLnNpemU7XG4gIH1cblxuICAvLyBEQiBhY3RpdmUgYW50aHJvcGljIO2GoO2BsCDrqqnroZ3snLzroZwg7ZKA7J2EIOyerOuPmeq4sO2ZlO2VnOuLpChwZXJpb2RpYyByZWNvbmNpbGUv7J6s7Jew6rKw7JqpKS5cbiAgLy8gTElTVEVOL05PVElGWSDqsIAg64GK6ri0IOuPmeyViCDsnKDsi6TrkJwg7LaU6rCAL+yCreygnC/ruYTtmZzshLHtmZTrpbwgREIg6riw7KSA7Jy866GcIOuLpOyLnCDrp57stpjri6QuXG4gIC8vIOydtOuypO2KuCDtlbjrk6Trn6zrpbwg7J6s7IKs7Jqp7ZW0IO2SgCDqsLHsi6DsnbQg7J286rSA65CY6rKMIOyggeyaqeuQmOuPhOuhnSDtlZzri6Q6XG4gIC8vICAtIERCIOyXkCDsl4bripTrjbAg7ZKA7JeQIOyeiOuKlCDthqDtgbAg4oaSIG9uVG9rZW5SZW1vdmVkXG4gIC8vICAtIERCIOyXkCDsnojripQg7Yag7YGwIOKGkiDsi6Dqt5zrqbQgb25Ub2tlbkFkZGVkLCDquLDsobTsnbTrqbQgb25Ub2tlblVwZGF0ZWRcbiAgcmVwbGFjZVRva2VucyhcbiAgICByb3dzOiBBcnJheTx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzO1xuICAgICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgd2VpZ2h0OiBudW1iZXI7XG4gICAgfT4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBuZXcgU2V0KHJvd3MubWFwKChyKSA9PiByLmlkKSk7XG4gICAgLy8gb25Ub2tlblJlbW92ZWQg6rCAIHRva2VuUG9vbCDsnYQgZGVsZXRlIO2VmOuvgOuhnCDsiJztmowg7KSRIOyImOygleydhCDtlLztlZjroKQg7YKk66W8IOuovOyggCDsiqTrg4Xsg7ftlZzri6QuXG4gICAgY29uc3QgY3VycmVudElkcyA9IEFycmF5LmZyb20odGhpcy50b2tlblBvb2wua2V5cygpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGN1cnJlbnRJZHMpIHtcbiAgICAgIGlmICghbmV4dC5oYXMoaWQpKSB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHJvd3MpIHtcbiAgICAgIGlmICh0aGlzLnRva2VuUG9vbC5oYXMoci5pZCkpIHtcbiAgICAgICAgdGhpcy5vblRva2VuVXBkYXRlZChyLmlkLCByLm5hbWUsIHIuY3JlZGVudGlhbHMsIHIucXVvdGFUaHJlc2hvbGQsIHIud2VpZ2h0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25Ub2tlbkFkZGVkKHIuaWQsIHIubmFtZSwgci5jcmVkZW50aWFscywgci5xdW90YVRocmVzaG9sZCwgci53ZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHRva2VuIGV2ZW50cyAodG9rZW4tc3Vic2NyaWJlciDqsIAg7Zi47LacKVxuICBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IEFudGhyb3BpY0NyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRva2VuUG9vbC5zZXQoaWQsIHsgaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0IH0pO1xuICAgIHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgfVxuXG4gIG9uVG9rZW5VcGRhdGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBBbnRocm9waWNDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuc2V0KGlkLCB7IGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCB9KTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gIH1cblxuICBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlblBvb2wuZGVsZXRlKGlkKTtcbiAgICB0aGlzLndlaWdodGVkU2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICB9XG5cbiAgLy8gcXVvdGEg7Ya16rO8IO2bhOuztOunjOycvOuhnCDsmpTssq3rp4jri6Qgc21vb3RoIHdlaWdodGVkIHJvdW5kLXJvYmluIOyEoO2Dne2VnOuLpC5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUb2tlbigpOiBQcm9taXNlPFBvb2xlZFRva2VuIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvd3MgPSBbLi4udGhpcy50b2tlblBvb2wudmFsdWVzKCldO1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgeyBlbGlnaWJsZSwgb3ZlclRocmVzaG9sZFRva2VucyB9ID0gYXdhaXQgdGhpcy5maWx0ZXJFbGlnaWJsZVRva2Vucyhyb3dzKTtcbiAgICBpZiAoZWxpZ2libGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBhbGxfZXhjZWVkZWRcIiwge1xuICAgICAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICAgICAgdG9rZW5Db3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgIHRocmVzaG9sZGVkVG9rZW5Db3VudDogcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuaGFzUXVvdGFUaHJlc2hvbGQocikpLmxlbmd0aCxcbiAgICAgICAgb3ZlclRocmVzaG9sZFRva2VucyxcbiAgICAgICAgcmVhc29uOiBcImFsbF9leGNlZWRlZFwiLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yKFxuICAgICAgICBxdW90YVRocmVzaG9sZEV4Y2VlZGVkTWVzc2FnZShcImFudGhyb3BpY1wiLCBvdmVyVGhyZXNob2xkVG9rZW5zKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMud2VpZ2h0ZWRTZWxlY3Rvci5zZWxlY3QobmV3IFNldChlbGlnaWJsZS5tYXAoKHRva2VuKSA9PiB0b2tlbi5pZCkpKTtcbiAgICBpZiAoc2VsZWN0ZWRJZCA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Qb29sLmdldChzZWxlY3RlZElkKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaWx0ZXJFbGlnaWJsZVRva2Vucyhyb3dzOiBQb29sZWRUb2tlbltdKTogUHJvbWlzZTx7XG4gICAgZWxpZ2libGU6IFBvb2xlZFRva2VuW107XG4gICAgb3ZlclRocmVzaG9sZFRva2VuczogQXJyYXk8eyB0b2tlbk5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT47XG4gIH0+IHtcbiAgICBjb25zdCB0aHJlc2hvbGRlZCA9IHJvd3MuZmlsdGVyKCh0b2tlbikgPT4gdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbikpO1xuICAgIGlmICh0aHJlc2hvbGRlZC5sZW5ndGggPT09IDApIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLCBvdmVyVGhyZXNob2xkVG9rZW5zOiBbXSB9O1xuXG4gICAgY29uc3QgZWxpZ2libGVJZHMgPSBuZXcgU2V0KFxuICAgICAgcm93cy5maWx0ZXIoKHRva2VuKSA9PiAhdGhpcy5oYXNRdW90YVRocmVzaG9sZCh0b2tlbikpLm1hcCgodG9rZW4pID0+IHRva2VuLmlkKSxcbiAgICApO1xuICAgIGNvbnN0IG92ZXJUaHJlc2hvbGRUb2tlbnM6IEFycmF5PHsgdG9rZW5OYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+ID0gW107XG4gICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdGhyZXNob2xkZWQubWFwKGFzeW5jICh0b2tlbikgPT4gKHtcbiAgICAgICAgdG9rZW4sXG4gICAgICAgIHJlc3VsdDogYXdhaXQgcmVhZEFudGhyb3BpY1F1b3RhVXNhZ2UodG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4pLFxuICAgICAgfSkpLFxuICAgICk7XG5cbiAgICBjaGVja3MuZm9yRWFjaCgoY2hlY2ssIGluZGV4KSA9PiB7XG4gICAgICBpZiAoY2hlY2suc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aHJlc2hvbGRlZFtpbmRleF07XG4gICAgICAgIGlmICghdG9rZW4pIHJldHVybjtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCBTdHJpbmcoY2hlY2sucmVhc29uKSk7XG4gICAgICAgIGVsaWdpYmxlSWRzLmFkZCh0b2tlbi5pZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdG9rZW4gPSBjaGVjay52YWx1ZS50b2tlbjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrLnZhbHVlLnJlc3VsdDtcbiAgICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHtcbiAgICAgICAgdGhpcy5sb2dRdW90YUxvb2t1cEZhaWxPcGVuKHRva2VuLCByZXN1bHQucmVhc29uKTtcbiAgICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRva2VuLnF1b3RhVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMubG9nUXVvdGFPdmVyVGhyZXNob2xkKHRva2VuLCByZXN1bHQpO1xuICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zLnB1c2goeyB0b2tlbk5hbWU6IHRva2VuLm5hbWUsIHRocmVzaG9sZDogdG9rZW4ucXVvdGFUaHJlc2hvbGQgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZWxpZ2libGVJZHMuYWRkKHRva2VuLmlkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IGVsaWdpYmxlOiByb3dzLmZpbHRlcigodG9rZW4pID0+IGVsaWdpYmxlSWRzLmhhcyh0b2tlbi5pZCkpLCBvdmVyVGhyZXNob2xkVG9rZW5zIH07XG4gIH1cblxuICBwcml2YXRlIGhhc1F1b3RhVGhyZXNob2xkKHRva2VuOiBQb29sZWRUb2tlbik6IHRva2VuIGlzIFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0ge1xuICAgIHJldHVybiB0b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkICYmIHRva2VuLnF1b3RhVGhyZXNob2xkICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dRdW90YU92ZXJUaHJlc2hvbGQoXG4gICAgdG9rZW46IFBvb2xlZFRva2VuICYgeyBxdW90YVRocmVzaG9sZDogbnVtYmVyIH0sXG4gICAgcmVzdWx0OiBFeHRyYWN0PEFudGhyb3BpY1F1b3RhVXNhZ2VSZXN1bHQsIHsga2luZDogXCJva1wiIH0+LFxuICApOiB2b2lkIHtcbiAgICBsb2dnZXIuaW5mbyhcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBvdmVyX3RocmVzaG9sZFwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIGNhY2hlZFV0aWxpemF0aW9uOiByZXN1bHQudXRpbGl6YXRpb25QY3QsXG4gICAgICBjYWNoZUFnZTogcmVzdWx0LmNhY2hlQWdlTXMsXG4gICAgICByZWFzb246IFwib3Zlcl90aHJlc2hvbGRcIixcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nUXVvdGFMb29rdXBGYWlsT3BlbihcbiAgICB0b2tlbjogUG9vbGVkVG9rZW4gJiB7IHF1b3RhVGhyZXNob2xkOiBudW1iZXIgfSxcbiAgICByZWFzb246IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogbG9va3VwX2ZhaWxfb3BlblwiLCB7XG4gICAgICB0b2tlbklkOiB0b2tlbi5pZCxcbiAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgdGhyZXNob2xkOiB0b2tlbi5xdW90YVRocmVzaG9sZCxcbiAgICAgIHJlYXNvbjogXCJsb29rdXBfZmFpbF9vcGVuXCIsXG4gICAgICBsb29rdXBSZWFzb246IHJlYXNvbixcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEsICgpID0+IHt9KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4ocmVxLCBjYi5vbkRlbHRhLCB7IGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IHRydWUgfSk7XG4gICAgICBjYi5vblRocmVhZElkPy4ocmVzdWx0LnRocmVhZENvb3JkLnRocmVhZElkKTtcbiAgICAgIGNiLm9uQ29tcGxldGUocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjYi5vbkVycm9yKGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGdlbmVyYXRlL2dlbmVyYXRlU3RyZWFtIOqzte2GtSDsi6TtlokuIG9uRGVsdGEg64qUIOyKpO2KuOumvOydtOuptCDsoJDsp4Qg67Cp7LacLCDruYTsiqTtirjrprzsnbTrqbQgbm8tb3AuXG4gIHByaXZhdGUgYXN5bmMgcnVuKFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIG9uRGVsdGE6ICh0OiBzdHJpbmcpID0+IHZvaWQsXG4gICAgb3B0cz86IHsgaW5jbHVkZVBhcnRpYWxNZXNzYWdlcz86IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIC8vIOydtOuvuOyngCDsg53shLHsnYAgT3BlbkFJKGNvZGV4KSDqsr3roZwg7KCE7JqpLiBBbnRocm9waWMg65287Jqw7YyF7JeQIOydtOuvuOyngCDtlIzrnpjqt7jqsIBcbiAgICAvLyDrj4Tri6ztlZjrqbQg7KGw7Jqp7Z6IIO2FjeyKpO2KuOuhnCDtj7TrsLHtlZjsp4Ag7JWK6rOgIOuqheyLnOyggeycvOuhnCDqsbDrtoDtlZzri6QuXG4gICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImltYWdlIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgQW50aHJvcGljIHJvdXRlXCIpO1xuICAgIH1cbiAgICAvLyBtb2RlbCDsoJXqt5ztmZTrpbwgZGlzcGF0Y2hlciDsp4TsnoXsoJDsl5DshJwg7ZWcIOuyiCDtlZzri6Q6IHJlc3VsdC5tb2RlbCAvIHJ1bkNsYXVkZVNlc3Npb24g7KCE67aAXG4gICAgLy8gY2Fub25pY2FsKHByZWZpeCDsl4bripQgY29zdCDtgqQpIOydhCDsk7Dqsowg7Ya17J28LiDrr7jsp4DsoJXsnbTrqbQgQU5USFJPUElDX0RFRkFVTFRfTU9ERUwg4oCUIHFncmlkLmRpc3BhdGNoZXJcbiAgICAvLyDsnZggXCJzb25uZXRcIiDrs4Tsua0g7Jqw7ZqMIOywqOuLqC4g7KCV6rec7ZmUIOq3nOy5meydgCBmYWxsYmFjayDqsr3roZzsmYAg6rO17JygKGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKS5cbiAgICBhc3NlcnRTdXBwb3J0ZWRPbmVNaWxsaW9uU3VmZml4KHJlcS5tb2RlbCk7XG4gICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChyZXEubW9kZWwpO1xuICAgIGNvbnN0IGpzb25TY2hlbWEgPVxuICAgICAgcmVxLm91dHB1dFNjaGVtYSAhPT0gdW5kZWZpbmVkID8gSlNPTi5zdHJpbmdpZnkocmVxLm91dHB1dFNjaGVtYSkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuc2VsZWN0VG9rZW4oKTtcbiAgICBpZiAoIXRva2VuKSB0aHJvdyBuZXcgRXJyb3IoXCJObyBhbnRocm9waWMgdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIGNvbnN0IGV4ZWMgPSBhc3luYyAoKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4gPT4ge1xuICAgICAgLy8g66eM66OMIOyehOuwlSDthqDtgbAgcHJlZW1wdGl2ZSByZWZyZXNoKOq4sOyhtCBzdGFuZGFsb25lIOqyveuhnOyZgCDrj5nsnbwpLiDsi6TtjKjtlbTrj4Qg7KeE7ZaJLlxuICAgICAgbGV0IGFjY2Vzc1Rva2VuID0gdG9rZW4uY3JlZGVudGlhbHMuYWNjZXNzVG9rZW47XG4gICAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQodG9rZW4uY3JlZGVudGlhbHMpO1xuICAgICAgaWYgKFxuICAgICAgICBleHBpcmVzQXQgJiZcbiAgICAgICAgZXhwaXJlc0F0IC0gRGF0ZS5ub3coKSA8IFJFRlJFU0hfU0FGRVRZX01TICYmXG4gICAgICAgIGdldFJlZnJlc2hUb2tlbih0b2tlbi5jcmVkZW50aWFscylcbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZnJhbWVcIik7XG4gICAgICAgICAgLy8gcHJvdmlkZXIg66W8IOuwmOuTnOyLnCDssYTsm4zslbwgcmVmcmVzaFRva2VuIOuCtOu2gCBUb2tlbk1vZGVsLnNhdmUg6rCAIOyEseqzte2VnOuLpC5cbiAgICAgICAgICAvLyByZWZyZXNoVG9rZW4oVG9rZW5TdWJzZXRBKSDripQgaWQvcHJvdmlkZXIvY3JlZGVudGlhbHMvbmFtZSDrp4wg7IKs7Jqp7ZWY66+A66GcIOq3uCA06rCc66eMIOuEmOq4tOuLpC5cbiAgICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IFFncmlkRnJhbWUucmVmcmVzaFRva2VuKHtcbiAgICAgICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0b2tlbi5jcmVkZW50aWFscyxcbiAgICAgICAgICB9IGFzIFBhcmFtZXRlcnM8dHlwZW9mIFFncmlkRnJhbWUucmVmcmVzaFRva2VuPlswXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7dG9rZW4ubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbG9nZ2VyLmluZm8oYOKGkiAke3Rva2VuLm5hbWV9IChtb2RlbDogJHttb2RlbH0pYCk7XG4gICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgcnVuQ2xhdWRlU2Vzc2lvbihcbiAgICAgICAge1xuICAgICAgICAgIHRva2VuSWQ6IHRva2VuLmlkLFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NUb2tlbixcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBzeXN0ZW06IHJlcS5zeXN0ZW1Qcm9tcHQsXG4gICAgICAgICAganNvblNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IHJlcS5lZmZvcnQsXG4gICAgICAgICAgdGltZW91dE1zOiBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IHJlcS5jb2xkSGlzdG9yeSxcbiAgICAgICAgICBpbnB1dDogcmVxLmNvbGRJbnB1dCxcbiAgICAgICAgICBhYm9ydFNpZ25hbDogcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGluY2x1ZGVQYXJ0aWFsTWVzc2FnZXM6IG9wdHM/LmluY2x1ZGVQYXJ0aWFsTWVzc2FnZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG9uRGVsdGEsXG4gICAgICApO1xuXG4gICAgICBpZiAoc2Vzc2lvbi5xdW90YUV4aGF1c3RlZCkgdGhyb3cgbmV3IEVycm9yKGBxdW90YSBleGhhdXN0ZWQgKCR7dG9rZW4ubmFtZX0pYCk7XG4gICAgICBpZiAoc2Vzc2lvbi5pc0Vycm9yKSB7XG4gICAgICAgIC8vIOynhOuLqChTT04tNDk1KTogaXNFcnJvciDtjJDsoJUg7IKs7JygKHN1YnR5cGUvdGVybWluYWxfcmVhc29uKeulvCDrqZTsi5zsp4Ag7JWe7JeQIOuTnOufrOuCuOuLpC5cbiAgICAgICAgLy8g6re464+Z7JWIIGRldGFpbCDsnbQgc2Vzc2lvbi50ZXh0KOyZhOyghO2VnCBKU09OIOuzuOusuCnrv5DsnbTrnbwgXCJzY2hlbWEg7JyE67CY7J247KeAIC8gbWF4IHJldHJpZXMg7J247KeAIC9cbiAgICAgICAgLy8gbWF4IHR1cm5zIOyduOyngFwi66W8IOq1rOu2hO2VoCDsiJgg7JeG7JeI64ukLiB0ZXh0IOuKlCDsp4Tri6jsl5Ag7ZWE7JqU7ZWcIOunjO2BvOunjCDsnpjrnbwg642n67aZ7J2464ukLlxuICAgICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICAgIHNlc3Npb24uc3VidHlwZSA/PyBzZXNzaW9uLnRlcm1pbmFsUmVhc29uID8/IChzZXNzaW9uLmlzRXJyb3IgPyBcImlzX2Vycm9yXCIgOiBcInVua25vd25cIik7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBzZXNzaW9uLnRleHRcbiAgICAgICAgICA/IHNlc3Npb24udGV4dC5sZW5ndGggPiA1MDBcbiAgICAgICAgICAgID8gYCR7c2Vzc2lvbi50ZXh0LnNsaWNlKDAsIDUwMCl94oCmKCR7c2Vzc2lvbi50ZXh0Lmxlbmd0aH0gY2hhcnMpYFxuICAgICAgICAgICAgOiBzZXNzaW9uLnRleHRcbiAgICAgICAgICA6IGBlbXB0eSB0ZXh0LCBvdXRwdXRUb2tlbnM9JHtzZXNzaW9uLnVzYWdlLm91dHB1dFRva2Vuc31gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNsYXVkZSBlcnJvciAoJHt0b2tlbi5uYW1lfSkgWyR7cmVhc29ufV06ICR7Ym9keX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGV4dDogc2Vzc2lvbi50ZXh0LFxuICAgICAgICB0b2tlbk5hbWU6IHRva2VuLm5hbWUsXG4gICAgICAgIHVzYWdlOiBzZXNzaW9uLnVzYWdlLFxuICAgICAgICBkdXJhdGlvbk1zOiBzZXNzaW9uLmR1cmF0aW9uTXMsXG4gICAgICAgIHR0ZnRNczogc2Vzc2lvbi50dGZ0TXMsXG4gICAgICAgIGNvc3RVc2Q6IHNlc3Npb24uY29zdFVzZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIC8vIHN5c3RlbUhhc2gg64qUIOyDgeychCBpc3N1ZUNvbnZDb250ZXh0IOqwgCDssYTsmrTri6Qo7Jes6riw7ISgIOu5hOyatOuLpCkuXG4gICAgICAgIHRocmVhZENvb3JkOiB7XG4gICAgICAgICAgd29ya2VySWQ6IG1ha2VBbnRocm9waWNXb3JrZXJJZCh0b2tlbi5pZCksXG4gICAgICAgICAgdGhyZWFkSWQ6IHNlc3Npb24uc2Vzc2lvbklkLFxuICAgICAgICAgIGVwb2NoOiAwLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGV4ZWMoKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyx1QkFBdUIsQ0FBQztBQUkzRCxNQUFNLHFCQUFxQjtBQUUzQixNQUFNLG9CQUFvQjtBQVUxQixTQUFTLDhCQUNQLFVBQ0EsUUFDUTtDQUNSLE1BQU0sVUFBVSxPQUNiLEtBQUssVUFBVSxHQUFHLE1BQU0sVUFBVSxjQUFjLE1BQU0sVUFBVSxJQUFJLENBQ3BFLEtBQUssS0FBSztBQUNiLFFBQU8sUUFBUSxTQUFTLElBQ3BCLE9BQU8sU0FBUyxvQ0FBb0MsWUFDcEQsT0FBTyxTQUFTOztBQUd0QixJQUFhLHNCQUFiLE1BQStEO0NBRTdELDRCQUFvQixJQUFJLEtBQTBCO0NBQ2xELG1CQUFvQyxJQUFJLDBCQUEwQjtDQUVsRSxNQUFNLFFBQXVCO0VBSzNCLE1BQU0sU0FBUyxNQUFNLFdBQVcscUJBQXFCLEtBQUssWUFBWTtBQUN0RSxPQUFLLE1BQU0sS0FBSyxRQUFRO0FBQ3RCLFFBQUssVUFBVSxJQUFJLEVBQUUsSUFBSTtJQUN2QixJQUFJLEVBQUU7SUFDTixNQUFNLEVBQUU7SUFDUixhQUFhLEVBQUU7SUFDZixnQkFBZ0IsRUFBRTtJQUNsQixRQUFRLEVBQUU7SUFDWCxDQUFDO0FBQ0YsUUFBSyxpQkFBaUIsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPO0FBQzlDLFVBQU8sS0FBSyxtQkFBbUIsRUFBRSxPQUFPOzs7Q0FJNUMsTUFBTSxPQUFzQjtFQUMxQixNQUFNLFdBQVcsQ0FBQyxHQUFHLEtBQUssVUFBVSxNQUFNLENBQUM7QUFDM0MsT0FBSyxNQUFNLE1BQU0sU0FBVSxNQUFLLGlCQUFpQixZQUFZLEdBQUc7QUFDaEUsT0FBSyxVQUFVLE9BQU87QUFDdEIsT0FBSyxpQkFBaUIsYUFBYTs7Q0FJckMsSUFBSSxhQUFxQjtBQUN2QixTQUFPLEtBQUssVUFBVTs7Q0FReEIsY0FDRSxNQU9NO0VBQ04sTUFBTSxPQUFPLElBQUksSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQztFQUUzQyxNQUFNLGFBQWEsTUFBTSxLQUFLLEtBQUssVUFBVSxNQUFNLENBQUM7QUFDcEQsT0FBSyxNQUFNLE1BQU0sV0FDZixLQUFJLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBRSxNQUFLLGVBQWUsR0FBRztBQUU1QyxPQUFLLE1BQU0sS0FBSyxLQUNkLEtBQUksS0FBSyxVQUFVLElBQUksRUFBRSxHQUFHLENBQzFCLE1BQUssZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLE9BQU87TUFFNUUsTUFBSyxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTzs7Q0FNaEYsYUFDRSxJQUNBLE1BQ0EsYUFDQSxnQkFDQSxTQUFTLEdBQ0g7QUFDTixPQUFLLFVBQVUsSUFBSSxJQUFJO0dBQUU7R0FBSTtHQUFNO0dBQWE7R0FBZ0I7R0FBUSxDQUFDO0FBQ3pFLE9BQUssaUJBQWlCLFNBQVMsSUFBSSxPQUFPOztDQUc1QyxlQUNFLElBQ0EsTUFDQSxhQUNBLGdCQUNBLFNBQVMsR0FDSDtBQUNOLE9BQUssVUFBVSxJQUFJLElBQUk7R0FBRTtHQUFJO0dBQU07R0FBYTtHQUFnQjtHQUFRLENBQUM7QUFDekUsT0FBSyxpQkFBaUIsU0FBUyxJQUFJLE9BQU87O0NBRzVDLGVBQWUsSUFBa0I7QUFDL0IsT0FBSyxVQUFVLE9BQU8sR0FBRztBQUN6QixPQUFLLGlCQUFpQixZQUFZLEdBQUc7O0NBSXZDLE1BQWMsY0FBMkM7RUFDdkQsTUFBTSxPQUFPLENBQUMsR0FBRyxLQUFLLFVBQVUsUUFBUSxDQUFDO0FBQ3pDLE1BQUksS0FBSyxXQUFXLEVBQUcsUUFBTztFQUM5QixNQUFNLEVBQUUsVUFBVSx3QkFBd0IsTUFBTSxLQUFLLHFCQUFxQixLQUFLO0FBQy9FLE1BQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsVUFBTyxLQUFLLHNDQUFzQztJQUNoRCxVQUFVO0lBQ1YsWUFBWSxLQUFLO0lBQ2pCLHVCQUF1QixLQUFLLFFBQVEsTUFBTSxLQUFLLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNyRTtJQUNBLFFBQVE7SUFDVCxDQUFDO0FBQ0YsU0FBTSxJQUFJLDRCQUNSLDhCQUE4QixhQUFhLG9CQUFvQixDQUNoRTs7RUFHSCxNQUFNLGFBQWEsS0FBSyxpQkFBaUIsT0FBTyxJQUFJLElBQUksU0FBUyxLQUFLLFVBQVUsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUMzRixNQUFJLGVBQWUsS0FBTSxRQUFPO0FBQ2hDLFNBQU8sS0FBSyxVQUFVLElBQUksV0FBVyxJQUFJOztDQUczQyxNQUFjLHFCQUFxQixNQUdoQztFQUNELE1BQU0sY0FBYyxLQUFLLFFBQVEsVUFBVSxLQUFLLGtCQUFrQixNQUFNLENBQUM7QUFDekUsTUFBSSxZQUFZLFdBQVcsRUFBRyxRQUFPO0dBQUUsVUFBVTtHQUFNLHFCQUFxQixFQUFFO0dBQUU7RUFFaEYsTUFBTSxjQUFjLElBQUksSUFDdEIsS0FBSyxRQUFRLFVBQVUsQ0FBQyxLQUFLLGtCQUFrQixNQUFNLENBQUMsQ0FBQyxLQUFLLFVBQVUsTUFBTSxHQUFHLENBQ2hGO0VBQ0QsTUFBTSxzQkFBdUUsRUFBRTtBQVEvRSxHQVBlLE1BQU0sUUFBUSxXQUMzQixZQUFZLElBQUksT0FBTyxXQUFXO0dBQ2hDO0dBQ0EsUUFBUSxNQUFNLHdCQUF3QixNQUFNLFlBQVksWUFBWTtHQUNyRSxFQUFFLENBQ0osRUFFTSxTQUFTLE9BQU8sVUFBVTtBQUMvQixPQUFJLE1BQU0sV0FBVyxZQUFZO0lBQy9CLE1BQU0sUUFBUSxZQUFZO0FBQzFCLFFBQUksQ0FBQyxNQUFPO0FBQ1osU0FBSyx1QkFBdUIsT0FBTyxPQUFPLE1BQU0sT0FBTyxDQUFDO0FBQ3hELGdCQUFZLElBQUksTUFBTSxHQUFHO0FBQ3pCOztHQUdGLE1BQU0sUUFBUSxNQUFNLE1BQU07R0FDMUIsTUFBTSxTQUFTLE1BQU0sTUFBTTtBQUMzQixPQUFJLE9BQU8sU0FBUyxpQkFBaUI7QUFDbkMsU0FBSyx1QkFBdUIsT0FBTyxPQUFPLE9BQU87QUFDakQsZ0JBQVksSUFBSSxNQUFNLEdBQUc7QUFDekI7O0FBR0YsT0FBSSxPQUFPLGtCQUFrQixNQUFNLGdCQUFnQjtBQUNqRCxTQUFLLHNCQUFzQixPQUFPLE9BQU87QUFDekMsd0JBQW9CLEtBQUs7S0FBRSxXQUFXLE1BQU07S0FBTSxXQUFXLE1BQU07S0FBZ0IsQ0FBQztBQUNwRjs7QUFHRixlQUFZLElBQUksTUFBTSxHQUFHO0lBQ3pCO0FBRUYsU0FBTztHQUFFLFVBQVUsS0FBSyxRQUFRLFVBQVUsWUFBWSxJQUFJLE1BQU0sR0FBRyxDQUFDO0dBQUU7R0FBcUI7O0NBRzdGLGtCQUEwQixPQUF1RTtBQUMvRixTQUFPLE1BQU0sbUJBQW1CLFVBQWEsTUFBTSxtQkFBbUI7O0NBR3hFLHNCQUNFLE9BQ0EsUUFDTTtBQUNOLFNBQU8sS0FBSyx3Q0FBd0M7R0FDbEQsU0FBUyxNQUFNO0dBQ2YsV0FBVyxNQUFNO0dBQ2pCLFVBQVU7R0FDVixXQUFXLE1BQU07R0FDakIsbUJBQW1CLE9BQU87R0FDMUIsVUFBVSxPQUFPO0dBQ2pCLFFBQVE7R0FDVCxDQUFDOztDQUdKLHVCQUNFLE9BQ0EsUUFDTTtBQUNOLFNBQU8sS0FBSywwQ0FBMEM7R0FDcEQsU0FBUyxNQUFNO0dBQ2YsV0FBVyxNQUFNO0dBQ2pCLFVBQVU7R0FDVixXQUFXLE1BQU07R0FDakIsUUFBUTtHQUNSLGNBQWM7R0FDZixDQUFDOztDQUdKLE1BQU0sU0FBUyxLQUErQztBQUM1RCxTQUFPLEtBQUssSUFBSSxXQUFXLEdBQUc7O0NBR2hDLE1BQU0sZUFBZSxLQUFzQixJQUE0QztBQUNyRixNQUFJO0dBQ0YsTUFBTSxTQUFTLE1BQU0sS0FBSyxJQUFJLEtBQUssR0FBRyxTQUFTLEVBQUUsd0JBQXdCLE1BQU0sQ0FBQztBQUNoRixNQUFHLGFBQWEsT0FBTyxZQUFZLFNBQVM7QUFDNUMsTUFBRyxXQUFXLE9BQU87V0FDZCxHQUFHO0FBQ1YsTUFBRyxRQUFRLEVBQVc7OztDQUsxQixNQUFjLElBQ1osS0FDQSxTQUNBLE1BQ3lCO0FBR3pCLE1BQUksSUFBSSxnQkFDTixPQUFNLElBQUksTUFBTSwyREFBMkQ7QUFLN0Usa0NBQWdDLElBQUksTUFBTTtFQUMxQyxNQUFNLFFBQVEsd0JBQXdCLElBQUksTUFBTTtFQUNoRCxNQUFNLGFBQ0osSUFBSSxpQkFBaUIsU0FBWSxLQUFLLFVBQVUsSUFBSSxhQUFhLEdBQUc7RUFFdEUsTUFBTSxRQUFRLE1BQU0sS0FBSyxhQUFhO0FBQ3RDLE1BQUksQ0FBQyxNQUFPLE9BQU0sSUFBSSxNQUFNLGdDQUFnQztFQUU1RCxNQUFNLE9BQU8sWUFBcUM7R0FFaEQsSUFBSSxjQUFjLE1BQU0sWUFBWTtHQUNwQyxNQUFNLFlBQVksYUFBYSxNQUFNLFlBQVk7QUFDakQsT0FDRSxhQUNBLFlBQVksS0FBSyxLQUFLLEdBQUcscUJBQ3pCLGdCQUFnQixNQUFNLFlBQVksQ0FFbEMsS0FBSTtJQUNGLE1BQU0sRUFBRSxlQUFlLE1BQU0sT0FBTztBQUdwQyxrQkFBYyxNQUFNLFdBQVcsYUFBYTtLQUMxQyxJQUFJLE1BQU07S0FDVixVQUFVO0tBQ1YsTUFBTSxNQUFNO0tBQ1osYUFBYSxNQUFNO0tBQ3BCLENBQWtEO1lBQzVDLEdBQUc7QUFDVixXQUFPLEtBQUssc0JBQXNCLE1BQU0sS0FBSyxJQUFLLEVBQVksVUFBVTs7QUFJNUUsVUFBTyxLQUFLLEtBQUssTUFBTSxLQUFLLFdBQVcsTUFBTSxHQUFHO0dBQ2hELE1BQU0sVUFBVSxNQUFNLGlCQUNwQjtJQUNFLFNBQVMsTUFBTTtJQUNmLE9BQU87SUFDUDtJQUNBLFFBQVEsSUFBSTtJQUNaO0lBQ0EsUUFBUSxJQUFJO0lBQ1osV0FBVztJQUNYLGFBQWEsSUFBSTtJQUNqQixPQUFPLElBQUk7SUFDWCxhQUFhLElBQUk7SUFDakIsd0JBQXdCLE1BQU07SUFDL0IsRUFDRCxRQUNEO0FBRUQsT0FBSSxRQUFRLGVBQWdCLE9BQU0sSUFBSSxNQUFNLG9CQUFvQixNQUFNLEtBQUssR0FBRztBQUM5RSxPQUFJLFFBQVEsU0FBUztJQUluQixNQUFNLFNBQ0osUUFBUSxXQUFXLFFBQVEsbUJBQW1CLFFBQVEsVUFBVSxhQUFhO0lBQy9FLE1BQU0sT0FBTyxRQUFRLE9BQ2pCLFFBQVEsS0FBSyxTQUFTLE1BQ3BCLEdBQUcsUUFBUSxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxRQUFRLEtBQUssT0FBTyxXQUN0RCxRQUFRLE9BQ1YsNEJBQTRCLFFBQVEsTUFBTTtBQUM5QyxVQUFNLElBQUksTUFBTSxpQkFBaUIsTUFBTSxLQUFLLEtBQUssT0FBTyxLQUFLLE9BQU87O0FBR3RFLFVBQU87SUFDTCxNQUFNLFFBQVE7SUFDZCxXQUFXLE1BQU07SUFDakIsT0FBTyxRQUFRO0lBQ2YsWUFBWSxRQUFRO0lBQ3BCLFFBQVEsUUFBUTtJQUNoQixTQUFTLFFBQVE7SUFDakI7SUFFQSxhQUFhO0tBQ1gsVUFBVSxzQkFBc0IsTUFBTSxHQUFHO0tBQ3pDLFVBQVUsUUFBUTtLQUNsQixPQUFPO0tBQ1I7SUFDRjs7QUFHSCxTQUFPLE1BQU0ifQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
//#region src/utils/providers/common/smooth-weighted-round-robin.ts
|
|
3
|
+
var SmoothWeightedRoundRobin = class {
|
|
4
|
+
weights = /* @__PURE__ */ new Map();
|
|
5
|
+
currentScores = /* @__PURE__ */ new Map();
|
|
6
|
+
setToken(tokenId, weight) {
|
|
7
|
+
if (!Number.isInteger(weight) || weight < 1 || weight > 100) throw new RangeError("weight must be an integer between 1 and 100");
|
|
8
|
+
if (this.weights.get(tokenId) === weight) return;
|
|
9
|
+
this.weights.set(tokenId, weight);
|
|
10
|
+
this.resetScores();
|
|
11
|
+
}
|
|
12
|
+
removeToken(tokenId) {
|
|
13
|
+
if (!this.weights.delete(tokenId)) return;
|
|
14
|
+
this.currentScores.delete(tokenId);
|
|
15
|
+
this.resetScores();
|
|
16
|
+
}
|
|
17
|
+
resetScores() {
|
|
18
|
+
this.currentScores.clear();
|
|
19
|
+
}
|
|
20
|
+
select(eligibleTokenIds) {
|
|
21
|
+
const candidates = [...eligibleTokenIds].filter((tokenId) => this.weights.has(tokenId)).toSorted((a, b) => a - b);
|
|
22
|
+
if (candidates.length === 0) return null;
|
|
23
|
+
let selected = candidates[0];
|
|
24
|
+
let selectedScore = Number.NEGATIVE_INFINITY;
|
|
25
|
+
let totalWeight = 0;
|
|
26
|
+
for (const tokenId of candidates) {
|
|
27
|
+
const weight = this.weights.get(tokenId);
|
|
28
|
+
totalWeight += weight;
|
|
29
|
+
const score = (this.currentScores.get(tokenId) ?? 0) + weight;
|
|
30
|
+
this.currentScores.set(tokenId, score);
|
|
31
|
+
if (score > selectedScore) {
|
|
32
|
+
selected = tokenId;
|
|
33
|
+
selectedScore = score;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
this.currentScores.set(selected, selectedScore - totalWeight);
|
|
37
|
+
return selected;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
export { SmoothWeightedRoundRobin };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2Jpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIHtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50U2NvcmVzID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICBzZXRUb2tlbih0b2tlbklkOiBudW1iZXIsIHdlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHdlaWdodCkgfHwgd2VpZ2h0IDwgMSB8fCB3ZWlnaHQgPiAxMDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiKTtcbiAgICB9XG4gICAgaWYgKHRoaXMud2VpZ2h0cy5nZXQodG9rZW5JZCkgPT09IHdlaWdodCkgcmV0dXJuO1xuICAgIHRoaXMud2VpZ2h0cy5zZXQodG9rZW5JZCwgd2VpZ2h0KTtcbiAgICB0aGlzLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICByZW1vdmVUb2tlbih0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2VpZ2h0cy5kZWxldGUodG9rZW5JZCkpIHJldHVybjtcbiAgICB0aGlzLmN1cnJlbnRTY29yZXMuZGVsZXRlKHRva2VuSWQpO1xuICAgIHRoaXMucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIHJlc2V0U2NvcmVzKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFNjb3Jlcy5jbGVhcigpO1xuICB9XG5cbiAgc2VsZWN0KGVsaWdpYmxlVG9rZW5JZHM6IFJlYWRvbmx5U2V0PG51bWJlcj4pOiBudW1iZXIgfCBudWxsIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gWy4uLmVsaWdpYmxlVG9rZW5JZHNdXG4gICAgICAuZmlsdGVyKCh0b2tlbklkKSA9PiB0aGlzLndlaWdodHMuaGFzKHRva2VuSWQpKVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhIC0gYik7XG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbMF0hO1xuICAgIGxldCBzZWxlY3RlZFNjb3JlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGxldCB0b3RhbFdlaWdodCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IHRva2VuSWQgb2YgY2FuZGlkYXRlcykge1xuICAgICAgY29uc3Qgd2VpZ2h0ID0gdGhpcy53ZWlnaHRzLmdldCh0b2tlbklkKSE7XG4gICAgICB0b3RhbFdlaWdodCArPSB3ZWlnaHQ7XG4gICAgICBjb25zdCBzY29yZSA9ICh0aGlzLmN1cnJlbnRTY29yZXMuZ2V0KHRva2VuSWQpID8/IDApICsgd2VpZ2h0O1xuICAgICAgdGhpcy5jdXJyZW50U2NvcmVzLnNldCh0b2tlbklkLCBzY29yZSk7XG4gICAgICBpZiAoc2NvcmUgPiBzZWxlY3RlZFNjb3JlKSB7XG4gICAgICAgIHNlbGVjdGVkID0gdG9rZW5JZDtcbiAgICAgICAgc2VsZWN0ZWRTY29yZSA9IHNjb3JlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY3VycmVudFNjb3Jlcy5zZXQoc2VsZWN0ZWQsIHNlbGVjdGVkU2NvcmUgLSB0b3RhbFdlaWdodCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsSUFBYSwyQkFBYixNQUFzQztDQUNwQywwQkFBMkIsSUFBSSxLQUFxQjtDQUNwRCxnQ0FBaUMsSUFBSSxLQUFxQjtDQUUxRCxTQUFTLFNBQWlCLFFBQXNCO0FBQzlDLE1BQUksQ0FBQyxPQUFPLFVBQVUsT0FBTyxJQUFJLFNBQVMsS0FBSyxTQUFTLElBQ3RELE9BQU0sSUFBSSxXQUFXLDhDQUE4QztBQUVyRSxNQUFJLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxPQUFRO0FBQzFDLE9BQUssUUFBUSxJQUFJLFNBQVMsT0FBTztBQUNqQyxPQUFLLGFBQWE7O0NBR3BCLFlBQVksU0FBdUI7QUFDakMsTUFBSSxDQUFDLEtBQUssUUFBUSxPQUFPLFFBQVEsQ0FBRTtBQUNuQyxPQUFLLGNBQWMsT0FBTyxRQUFRO0FBQ2xDLE9BQUssYUFBYTs7Q0FHcEIsY0FBb0I7QUFDbEIsT0FBSyxjQUFjLE9BQU87O0NBRzVCLE9BQU8sa0JBQXNEO0VBQzNELE1BQU0sYUFBYSxDQUFDLEdBQUcsaUJBQWlCLENBQ3JDLFFBQVEsWUFBWSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsQ0FDOUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxFQUFFO0FBQzVCLE1BQUksV0FBVyxXQUFXLEVBQUcsUUFBTztFQUVwQyxJQUFJLFdBQVcsV0FBVztFQUMxQixJQUFJLGdCQUFnQixPQUFPO0VBQzNCLElBQUksY0FBYztBQUVsQixPQUFLLE1BQU0sV0FBVyxZQUFZO0dBQ2hDLE1BQU0sU0FBUyxLQUFLLFFBQVEsSUFBSSxRQUFRO0FBQ3hDLGtCQUFlO0dBQ2YsTUFBTSxTQUFTLEtBQUssY0FBYyxJQUFJLFFBQVEsSUFBSSxLQUFLO0FBQ3ZELFFBQUssY0FBYyxJQUFJLFNBQVMsTUFBTTtBQUN0QyxPQUFJLFFBQVEsZUFBZTtBQUN6QixlQUFXO0FBQ1gsb0JBQWdCOzs7QUFJcEIsT0FBSyxjQUFjLElBQUksVUFBVSxnQkFBZ0IsWUFBWTtBQUM3RCxTQUFPIn0=
|